[英]Using CALL, RET in assembly x86
考慮以下使用push
, pop
和call
簡單匯編代碼
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG
MOV AX,DTSEG
MOV DS,AX
MOV AX,1010H ; (1)
PUSH AX ; (2)
CALL FOO ; (3)
ADD AX,2 ; (7)
MAIN ENDP
FOO PROC
POP AX ; (4)
ADD AX,1 ; (5)
RET ; (6)
FOO ENDP
END MAIN
我所期望的是看到
(1) ax = 1010h, stack=????
(2) ax = 1010h, stack=1010h
(3)
(4) ax = 1010h, stack=????
(5) ax = 1011h
(6)
(7) ax = 1012h
但是,模擬器顯示
(1) ax = 1010h, stack=????
(2) ax = 1010h, stack=1010h
(3)
(4) ax = 000Ch, stack=????
(5) ax = 000Dh
(6) The control never goes back to the main proc
(7) ???
怎么了
CALL
將返回地址壓入堆棧,這使RET
返回該地址。 當您在FOO
彈出POP AX
,您會將返回地址彈出堆棧。 輸入FOO
時,您在CALL
之前PUSH
的值不在堆棧的頂部,而是在[SP+2]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.