4

我正在参加组装课程,但我遇到了堆栈框架的问题。要求之一是通过使用堆栈而不是寄存器来传递参数。我试图通过引用传递一个变量,然后在过程中更改该变量的值。这是我到目前为止所拥有的。WriteString并且ReadDec来自随书一起提供的(尔湾)图书馆。

.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。这是作业,我试图将其标记为这样,但它不允许我这样做。

聚苯乙烯。这也是我第一次在溢出上发帖,我非常感谢任何建设性的批评,以改善发帖、礼仪等。

4

1 回答 1

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

我不会推 edx - 至少不是你所做的 - 但它“应该”工作。未经测试!

于 2013-11-03T00:55:39.753 回答