Assembly CALL和RET指令

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


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


mov       ebx, input1

call        get_int

mov       ebx, input2

call        get_int


同時(shí)把子程序get int改成:


get_int:
        call read_int
        mov [ebx], eax
        ret



CALL和RET指令


CALL和RET指令有幾個(gè)優(yōu)點(diǎn):


1、它們很簡(jiǎn)單!

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


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


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

這個(gè)代碼將不會(huì)正確返回!



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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)