彙編指令整理

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兩條指令,用在被調用的子函數內,用來平衡堆棧,叫做內平棧。





發佈了41 篇原創文章 · 獲贊 26 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章