我有 2 個模塊檔案,一個主檔案和一個輔助檔案。在主檔案中,我從第二個模塊呼叫一個程序(它從鍵盤讀取一個數字并將其存盤在 AX 中)。當我除錯代碼時,我注意到當代碼從輔助程序回傳到主程序時,它進入了一個無限回圈。
main.asm 模塊,主要程序:
EXTRN READNR:FAR
DATE SEGMENT PARA 'DATA'
EMPTY DB ?
DATE ENDS
CODEMAIN SEGMENT PARA 'CODE'
ASSUME CS: CODEMAIN, DS: DATE
MAINPROC PROC FAR
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DATE
MOV DS, AX
CALL READNR
RET
MAINPROC ENDP
CODEMAIN ENDS
END MAINPROC
帶有輔助程式的 aux.asm 模塊:
DATA SEGMENT PARA 'DATA'
NUMBER DB 6, ?, 6 DUP(?)
DATA ENDS
AUX SEGMENT PARA 'CODE'
PUBLIC READNR
ASSUME CS: AUX, DS: DATA
READNR PROC FAR
PUSH AX
XOR AX, AX
PUSH DS
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET NUMBER
MOV AH, 0Ah
INT 21h
MOV BX, 10
MOV AX, 0
MOV CX, 0
MOV SI, 2
MOV CL, NUMBER[1]
LOOP1:
MUL BX
ADD AL, NUMBER[SI]
SUB AL, 30h
INC SI
LOOP LOOP1
RET
READNR ENDP
AUX ENDS
END
我使用這些命令來鏈接 2 個模塊:
tasm main
tasm aux
tlink main aux
td main
你能找出為什么它不能正確回傳嗎?
uj5u.com熱心網友回復:
READNR推了兩次,從來沒有彈出。我不知道它如何可能回傳給呼叫者。
因此,如果我在某個模塊中推入堆疊并且堆疊保持非空,程式將無法正確回傳到主模塊?
是的:呼叫指令將回傳地址壓入堆疊,而這就是 ret 指令查找它的位置——作為堆疊的頂部專案。如果您通過推送來修改堆疊,那么您推送的任何內容現在都是堆疊上的頂部。為了使用 return using ret,函式必須洗掉所有放入堆疊的專案,將堆疊指標恢復到它在進入時的相同值。
如果您在堆疊上留下額外的東西,首先ret將無法按預期作業,但即使以某種方式可以回傳給呼叫者,呼叫者也可能會遇到問題,因為呼叫者希望堆疊處于與他們離開時相同的狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476920.html
上一篇:Thymeleaf不列印物件串列(SpringJPA)
下一篇:如何正確包含.asm檔案?
