1. PUSH
本質:
sub esp,4
mov dword ptr ds[ESP],數據---------把數據存儲到ESP所指向的地址,也就是棧頂
2. POP
本質:
mov eax,esp地址指向的值,也就是棧頂存的值
add esp,4
3.RET
本質:
POP EIP
把棧頂的值賦給EIP,然後棧頂(ESP)地址+4
4. JMP指令:唯一作用是無條件修改EIP的值,沒有對棧和寄存器產生影響。
JMP 寄存器/立即數
本質是MOV EIP,寄存器/立即數,EIP只能由JMP指令修改
5. CALL指令:
第一個作用和JMP一樣,MOV EIP,寄存器/立即數。
第二個作用,把CALL指令的寫一個指令地址push到棧頂(修改ESP)
CALL指令還沒執行,怎麼知道下一行指令的地址?
根據CALL指令佔用的數據寬度,加偏移量去算,比如CALL這條指令,地址0X004183D7中數據爲E8 21 00 00 00,有5個字節,下一行指令的地址就是地址偏移5
6. RET
本質是POP EIP
RET指令通常和CALL成對出現,把CALL壓棧的地址POP EIP,讓程序迴歸原來的流程
7. CMP指令:該指令是比較兩個操作數是否相同
指令格式:CMP R/M,R/M/IMM
相當於SUB指令,但是隻會用兩個數相減來比較是否相同,相減的結果並不保存在第一個操作數中。
只會根據相減的結果來改變標誌位的,當兩個操作數相等的時候,零標誌位置爲1.
MOV EAX,100
MOV ECX,100
CMP EAX,ECX //只相減比較,判斷並修改零標誌寄存器,不會把EAX修改爲相減結果。
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]
8. TEST指令:
指令格式:TEST R/M,R/M/IMM
該指令和CMP有一定的相似性,兩個數值進行與操作,結果也不保存,但是會改變相應標誌位。
與操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0
常見用法:用這個指令,可以確定某寄存器是否等於0,如果EAX的二進制某些位爲 1 的話,那麼運算的結果就不爲零。
TEST EAX,EAX
9. MOVS //移動數據 內存-內存
MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] //簡寫MOVSB 、MOVSW、MOVSD
10.STOS指令:將AL/AX/EAX的值存儲到[EDI]記錄的內存單元 //移動AL還是AX還是EAX由數據寬度BYTE/WORD/DWORD中選擇哪個而決定的
STOS DOWRD PTR ES:[EDI] //簡寫STOSB、STOSW、STOSD
STOS指令將EAX的數據12345678,存儲到EDI所存儲的地,12FF44,並且EDI所存儲的地址,會自動+4,這是STOS指令帶來的特性,方向由D標誌寄存器決定(STOS只認EAX,這是死知識)
REP:REP STOS這行帶代碼,REP指令會根據ECX存儲的數值,來重複執行STOS指令,每重複一次,ECX自動-1.(REP指令只認ECX,死知識)
11. REP指令:按計數寄存器(ECX)中指定過的次數重複執行字符串指令
MOV ECX,10
REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
12. RET 8:等價於ret和esp+8兩條指令,用在被調用的子函數內,用來平衡堆棧,叫做內平棧。