1、堆棧相關指令
push:把一個32位的操作數壓入堆棧中。這個操作導致esp被減4。esp被形象地稱為棧頂。我們認為頂部是地址小的區域,那么,壓入堆棧的數據越多,這個堆棧也就越堆越高,esp也就越來越小。在32位平台上,esp每次減少4(字節)。
pop:相反,esp被加4,一個數據出棧。pop的參數一般是一個寄存器,棧頂的數據被彈出到這個寄存器中。
sub:減法。第一個參數是被減數所在的寄存器;第二個參數是減數。(對應的還有add指令。)
add:加法。
ret:返回。相當於跳轉回調用函數的地方。(對應的call指令來調用函數,返回到call之后的下一條指令。)(本質相當於pop+jmp)
call:調用函數。(本質相當於push+jmp)
2、數據傳送指令
mov:數據移動。第一個參數是目的,第二個參數是來源。在C語言中相當於賦值號。
xor:異或。這雖然是邏輯運算的指令,但是有趣的是,xor eax,eax這樣的操作常常用來代替mov eax,0。好處是速度更快,占用字節數更少。(見到xor eax,eax,應該馬上明白這是清零操作。)
lea:取得地址(第二個參數)后放入到前面的寄存器(第一個參數)中。(mov不支持后一個操作數寫成寄存器減去數字,但是lea支持,所以可以用lea來代替它。)
stos:看如下例子
mov ecx,30h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
stos是串存儲指令,它的功能是將eax中的數據放入edi所指的地址中,同時,edi會增加4(字節數)。rep使指令重復執行中填寫的次數。方括弧表示存儲器,這個地址實際上就是edi的內容所指向的地址。
3、跳轉與比較指令
jmp:無條件跳轉。
jg:大於的時候跳轉。
jl:小於的時候跳轉。
jge:大於等於的時候跳轉。
cmp:比較。往往是jg、jl、jge、之類的條件跳轉指令的執行條件。