反彙編的call和retn

2021-06-05 18:58:06 字數 1109 閱讀 8588

call指令

call指令可不是如喚指令,而是子程式呼叫指令。那麼組合語言中的子程式是什麼呢?子程式能被其它程式呼叫,在實現某種功能後能自動返回到呼叫程式去的程式。其最後一條指令一定是返回指令,故能保證得新返回到呼叫它的程式中去。也可呼叫其它子程式,甚至可自身呼叫。

我們可以暫時把子程式理解為乙個**段,是乙個模組化的**面。這個**段可以完成某一特定功能,當程式在執行過程中需要用到這一功能,將會進入這個**段。這塊**段執行完畢後,會跳出這塊**段。而進入**段這一過程就是子程式的呼叫,也就是這裡所說的call指令所要完成的工作。

反彙編經常看到的call指令的基本格式如下:

call   位址1

call指令分為兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似於jmp指令的相對跳轉和絕對跳轉(只不過相對跳轉的jmp指令會有short標識)。

在call指令進行的是段內轉移的情況時,跟在call後面的位址1為乙個相對位移;而call指令進行的是段間轉移的情況時,跟在call後面的位址1為乙個絕對記憶體位址。

段內轉移的call指令等價於兩條指令:

push eip

jmp   目的位置

也就是說,執行段內轉移的call指令時,相當於先後執行以上兩條指令。

段間轉移的call指令等價於三條指令:

push cs

push eip

jmp   目的位置

10.2、retn/retf指令

按照前面講call指令舉的那個例子,call指令是進入子程式的指令,而例子中所說的跳出子程式這一過程也需要2條指令,它們是retn/retf。

retn/retf是跳出子程式的指令,被稱為返回指令。retn指令用於從段內轉移call進的子程式中返回;retf指令用於從段間轉移call進的子程式中返回。

retn/retf在反彙編**中呈現的形式如下:

retn

retn   運算元1

retf

retf   運算元1

retn等價於一條指令:pop   eip

retf等價於兩條指令:

pop   eip

pop   cs

而帶有運算元的retn/retf指令則是在pop之後,執行esp=esp+運算元1。

遊戲反彙編 武林走路call

0046627d d81d 98098800 fcomp dword ptr ds 880998 00466283 dfe0 fstsw ax 00466285 f6c4 41 test ah,41 00466288 0f85 3c040000 jnz elementc.004666ca 00466...

彙編 JMP和CALL的區別

jmp jmp test1 test1 jmp test2 test2 jmp test3 call call test1 test1 proc near call test2 rettest1 endp test2 proc near call test3 rettest2 endp 其實還沒學子...

機器彙編和反彙編 指標 結構的尺寸(對齊)

呼叫編譯器產生組合語言mstore.s gcc og s mstore.c 呼叫彙編器產生二進位制檔案mstore.o gcc og c mstore.c 反彙編 objdump d mstore.o 編譯生成二進位制可執行檔案prog gcc og o prog main.c mstore.c 反...