装配中的堆栈框架

时间:2013-11-03 00:16:21

标签: assembly x86 masm

我正在参加装配课程,我遇到了堆栈框架的问题。其中一个要求是通过使用堆栈而不是寄存器来传递参数。我试图通过引用传递变量,然后在过程中更改该变量的值。这是我到目前为止所拥有的。 WriteStringReadDec来自本书附带的(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。这也是我第一次发帖溢出,我不仅对任何改进帖子,礼仪等的建设性批评表示感谢。

1 个答案:

答案 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 - 至少不是你所做的 - 但它“应该”起作用。未经测试!