Assembly CALL和RET指令

2018-10-28 14:16 更新
80x86提供了兩條使用堆棧的指令來使子程序調(diào)用變得快速而簡單。CALL指令執(zhí)行一個跳到子程序的無條件跳轉(zhuǎn),同時將下一條指令的地址推入棧中。RET指令彈出一個地址并跳轉(zhuǎn)到這個地址去執(zhí)行。使用這些指令的時候,正確處理堆棧以便RET指令能彈出正確的數(shù)值是非常重要的!


前面的例子可以使用這些新的指令來重寫。把25行到34行改成:


mov       ebx, input1

call        get_int

mov       ebx, input2

call        get_int


同時把子程序get int改成:


get_int:
        call read_int
        mov [ebx], eax
        ret



CALL和RET指令


CALL和RET指令有幾個優(yōu)點:


1、它們很簡單!

2、它們使子程序嵌套變得簡單。注意:子程序get_int調(diào)用了read_int。這個調(diào)用將另一個地址壓入到堆棧中了。在read_int代碼的末尾是一條彈出返回地址的RET指令,通過執(zhí)行指令重新回到get int代碼中去執(zhí)行。然后,當get int的RET指令被執(zhí)行時,它彈出跳回到asm main的返回地址。這個之所以能正確運行,是因此堆棧的LIFO特性。


記住彈出壓入到堆棧的所有數(shù)據(jù)是非常重要的。例如,考慮下面的代碼:


1   get_int:
2            call read_int
3            mov [ebx], eax
4            ret                   ; 彈出EAX的值,沒有返回地址!!

這個代碼將不會正確返回!



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號