CALL指令
CALL是子程序調用指令。
CALL指令的基本格式如下:
CALL 地址1
功能:調用地址1處的子程序
CALL指令分爲兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似於JMP指令的相對跳轉和絕對跳轉(只不過相對跳轉的JMP指令會有short標識)。
在CALL指令進行的是段內轉移的情況時,跟在CALL後面的地址1爲一個相對位移;而CALL指令進行的是段間轉移的情況時,跟在CALL後面的地址1爲一個絕對內存地址。
段內轉移的CALL指令等價於兩條指令:
push eip
jmp 目的位置
也就是說,執行段內轉移的CALL指令時,相當於先後執行以上兩條指令。
段間轉移的CALL指令等價於三條指令:
push CS
push eip
jmp 目的位置
CALL指令的基本格式如下:
CALL 地址1
功能:調用地址1處的子程序
CALL指令分爲兩種情況,一種是段內轉移;另一種是段間轉移。這兩種情況類似於JMP指令的相對跳轉和絕對跳轉(只不過相對跳轉的JMP指令會有short標識)。
在CALL指令進行的是段內轉移的情況時,跟在CALL後面的地址1爲一個相對位移;而CALL指令進行的是段間轉移的情況時,跟在CALL後面的地址1爲一個絕對內存地址。
段內轉移的CALL指令等價於兩條指令:
push eip
jmp 目的位置
也就是說,執行段內轉移的CALL指令時,相當於先後執行以上兩條指令。
段間轉移的CALL指令等價於三條指令:
push CS
push eip
jmp 目的位置
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。