我正在参加装配课程,我遇到了堆栈框架的问题。其中一个要求是通过使用堆栈而不是寄存器来传递参数。我试图通过引用传递变量,然后在过程中更改该变量的值。这是我到目前为止所拥有的。 WriteString
和ReadDec
来自本书附带的(Irvine)图书馆。
.data
numVal DWORD ?
.code
main PROC
PUSH OFFSET numVal
CALL GetNumber
exit
main ENDP
GetNumber PROC
PUSH edx
PUSH ebp
MOV ebp, esp
CALL ReadDec ; gets what the user inputs and puts in eax
MOV [ebp+12], eax
; MOV numVal, eax ; this works just fine
POP ebp
POP edx
RET 4
GetNumber ENDP
END main
但是,如果我尝试打印或在某个其他位置使用numVal
,则无论用户输入什么,它都会返回0。我假设它正在发送用户输入的任何内容ebp+12
,这是指该地址而不是numVal
。那么,如果这是正确的,有没有办法通过引用或其他方式传递numVal
?或者是我的注释掉的行,MOV numVal, eax
是唯一的方法吗?
PS。这是作业,我试图标记它,但它不允许我。
PPS。这也是我第一次发帖溢出,我不仅对任何改进帖子,礼仪等的建设性批评表示感谢。
答案 0 :(得分:4)
您需要“取消引用”传递的参数。
GetNumber PROC
PUSH edx
PUSH ebp
MOV ebp, esp
CALL ReadDec ; gets what the user inputs and puts in eax
MOV edx, [ebp+12] ; edx now has "offset numVal"
mov [edx], eax ; put result of ReadDec there
; MOV numVal, eax ; this works just fine
POP ebp
POP edx
RET 4
GetNumber ENDP
GetNumber PROC
PUSH edx
PUSH ebp
MOV ebp, esp
CALL ReadDec ; gets what the user inputs and puts in eax
MOV edx, [ebp+12] ; edx now has "offset numVal"
mov [edx], eax ; put result of ReadDec there
; MOV numVal, eax ; this works just fine
POP ebp
POP edx
RET 4
GetNumber ENDP
我不会推edx - 至少不是你所做的 - 但它“应该”起作用。未经测试!