循環執行的過程數組
分支執行過程ide
stos=storagestring函數
4.c規範(函數堆棧操做)編碼
push ebpspa
mov ebp,esp3d
sub esp,0C0h指針
push ebxcode
push esiblog
push ediip
...
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
5.帶參函數(個數1),調用前:
push ecx
使用參數:
mov eax,[ebp+8]
爲何是+8?這是由於call 會致使一條指令進棧,在加上函數開始時的push ebp,因此+8才能取到函數的參數
函數結束:
add esp,4
6.變長指令的問題,系統並非一次讀入整條指令,而是先取指令的前面幾位,再決定該次取指操做怎麼進行
7.switch語句 基本上會出現cmp xxx je xxx 全部的分支判斷都放在最前,後面是各分支要執行的內容
8.彙編裏面沒有枚舉體和共用體,有的只是結構體和基礎類型
9.數組的訪問,一般你會碰到這樣的代碼
mov eax,<我要取得數組元素的下標>
imul eax,eax,<結構大小>
mov ecx,<結構數組開始的地址>
mov eax,dword ptr[ecx+eax];取數組元素內容放到eax
Or 訪問結構內部元素
mov ecx,dword ptr[ecx+eax+0Ch]
這些彙編碼都是解讀時應該注意的標誌性的代碼
二維數組轉成彙編其實是一個結構體數組
10.閱讀彙編碼時,能夠將代碼進行分類,F(函數調用相關) C(流程控制代碼) D(數據操做,四則運算)
11.發行版本的彙編代碼,會盡可能去掉循環
12.若是返回值指向了在堆棧中開闢的內存,那麼對該返回值的使用將會致使錯誤,由於堆棧中開闢的內存只在當前函數中有效
13.複雜類型(結構體,類)做爲返回值時,先在函數外開闢內存,再將指針(eax)傳入函數,函數返回時根據eax再在當前函數
堆棧內存中作一份拷貝(也就是說當前堆棧中有兩份一樣的結構體實例)。
14.彙編指令的中括號表示偏移量,而且支持在中括號內的四則運算
15.遠跳轉是跨段跳轉JMP or CALL
16.stos = store string
17.arpl=adjust prl
18.scas=search character among string
Compares the byte, word, or double word specified with the memory operand with the value in the AL, AX, or EAX register, and sets the status flags in the EFLAGS register according to the results. The memory operand address is read from either the ES:EDI or the ES:DI registers (depending on the address-size attribute of the instruction, 32 or 16, respectively). The ES segment cannot be overridden with a segment override prefix.
19. shr邏輯右移,左側補0 sar算術右移左側補符號位
20.test instructdent equal to and but it don't save the result only effect some bits of the flag register
21.IF中斷標記位,響應中斷時IF置爲0,表示中斷處理過程當中不響應可屏蔽中斷(除非中斷處理程序又將IF置爲1(sti or cli)),而不可屏蔽中斷只要發生cpu不會理睬IF標記位直接轉到中斷處理程序,不可屏蔽中斷的中斷類型碼始終是2
22.彙編語句的結構必定程度上反映了cpu進行數據操做的方式,這也是理解和記憶彙編語句的簡便方法。
23.有時候你須要顯性的指出要訪問的內存單元的長度,相似於mov ax,[0]這種語句,由於第一個操做數ax是一個字長,因此會從內存中取兩個字節的數據放到ax中,for the mov al,[bx] cause the operand al represent only one byte's size, so the [bx] represent one byte data to be got from the memory, for some special conditions, you must indicate the size of the memory unit obviously, e.g. add byte ptr [bx],2, if we don't specify the size of memory data to be added, cpu will unknow the actual data to be added value 2. Such as inc byte ptr ds:[0] is the same.
24.關於進位和借位,cpu在作加法和減法會牽扯到這兩種狀況,固然若是運算結果在寄存器容量範圍以內,則不會影響CF標誌位,但若是一旦影響到CF標誌位,咱們獲得的結果是一個不徹底的結果,好比mov al,98H add al,al最後結果是130H顯然超出了al的容量,但因爲進位信息保存在了標誌寄存器中,因此咱們能夠根據CF位的值連同al部分的值組合在一塊兒來獲得最終結果。此外cpu還直接提供了可以處理進位的加法指令adc和可以處理借位的減法指令sbb,實際上就是把進位標誌帶入到運算中,好比,adc ax,ax 等同於ax+ax+cf 原理相似於咱們作豎式運算的時候進位規則。
簡記CF(C,醋,無,無符號運算) OF(O,有,有符號運算),兩者互不影響,像add指令它既有無符號加法的含義又有有符號加法的含義,因此會同時影響這兩個標誌位。
25. pushf,popf讓咱們有機會讀取和修改標誌寄存器中的內容。
26.那些個跳轉指令i.e.那些影響CS IP寄存器的指令
27.直接定址法
assume cs:code ds:data
data segment
a dw 2,3,5,89,29,2
b db 'sdsddsdsdsd'
table dw a,b
data ends
code segment
start:
code ends
end start
注意上面幾個標號,a b table它們後面沒有冒號,這些標籤直接表明了地址,使用的時候很像數組,a[bx],table[si]倒不是什麼新的指令,只是以爲彙編編譯器逐漸向高級語言特性靠攏了,能夠這麼理解,a、b就是一些普通數組,table就是一個指針數組
28.mul指令 若是是8位相乘則結果放在ax中,16位相乘則結果放在dx和ax中,所以乘法不會產生溢出
div防溢出的辦法,其實也很簡單ffffffff/1結果是ffffffff確定要溢出的,由於一個16位的寄存器是放不下一個dword型數據的,那麼咱們能夠作下轉化變爲(ffff*ffff+ffff)/1=(ffff/1)*ffff+ffff/1分紅兩個不會溢出的除法,而後再求和。
29.jmpi指令 可同時改變cs and ip 格式:jmpi xxx(ip),xxx(cs) retn=ret near 格式 retn 0x0ch至關於pop ip;add esp,0x0ch
30.lea 指令 lea 寄存器,內存單元 意爲load effective address 也就是內存單元的相對偏移地址。lea dx [ax+bx+5];dx=ax+bx+5其實至關於mov指令,但mov不支持操做數中.的四則運算,而lea能夠,更省時,更有效率,有時還能夠代替簡單的加法。
31.算術加減乘除指令 or xor and 指令 以及shift指令都能影響標誌位,進過實際操做證實, cmp以及test指令也能影響標誌位,cmp主要是令兩個操做數相減 而後設置一些標誌位,set指令和jxx指令就是根據這些標誌位的信息完成對應的操做。