如何正确使用PUSH和POP

How to properly use PUSH and POP

我有一个包含 3 个过程的代码,一个用于获取用户的输入,一个用于显示乘法结果,最后一个用于错误消息。我正在尝试实现 PUSH 和 POP 操作并将我的代码放入堆栈。看起来很长,但对我来说很有意义,在这里...

.data
    line  BYTE "The answer is ",0
    line2 BYTE "Enter a number",0
    kline3 BYTE Wrong.",0
    int SWORD ?

.code

Val PROC
    call ReadInt
    mov int,edx    
    cmp int, 10000
    jl 1
    jmp end 
    L1: cmp intVal1, -10000
    jg 2        
    call error
    jmp end 
    2: ret
Val ENDP

main PROC
    call Val
    call Val
    imul val, val
    exit
main ENDP
END main

所有这些只是调用两次获取 2 个输入,然后调用以显示相乘结果。我的问题是你如何实现推送和弹出到这里才有意义?

我假设您需要推入 GetValue 过程以将输入放入堆栈,然后在主过程中每次调用后弹出它,也许对显示过程做同样的事情?

我只是在努力弄清楚所以任何帮助都会很棒!

PS。此代码是 visual studio 2010

中的 asm 文件

您对 GetValue 的第一次调用将其结果存储在 intVal 中。但随后您对 GetValue 的第二次调用也将其结果存储在 intVal 中,因此第一个结果将永远丢失。

您的 MultiplyAndDisplay 函数需要 intVal 中的一个操作数,以及 eax 中的另一个操作数。因此,您需要做的是在第一次调用 GetValue 之后 push [intVal] 和在第二次调用 GetValue.

之后 pop eax

请注意,push [intVal] 中的方括号是某种实际有意义的符号,但如果我没记错的话,Microsoft 汇编器不支持实际上有意义的符号,所以你可能必须改为编码 push intVal,或 push dword ptr intVal,或类似的无意义的代码才能使其正常工作。

因为你的问题被标记为 MASM,所以这是 MASM 的回答:
您的代码可以通过使用带有参数的 MASM 指令 PROC 和用于参数传递的 INVOKE 指令的方式进行重组:

MultiplyAndDisplay PROC val1: SDWORD, val2: SDWORD
    mov  eax, val1
    imul eax, val2                          ; signed multiply of val1 by val2 
    mov  edx, OFFSET prompt
    call WriteString                        ; Writes the prompt in edx
    call WriteDec                           ; Writes the value in eax
    ret
MultiplyAndDisplay ENDP

main PROC
    call GetValue
    push [intVal]                           ; PUSH firstParam to the stack
    call GetValue
    pop eax                                 ; POP previous param/intVal to EAX
    invoke MultiplyAndDisplay, eax, intVal  ; MultiplyAndDisplay, firstParam(EAX), secondParam(intVal)
    exit
main ENDP