如何正确使用PUSH和POP

时间:2017-04-06 20:44:11

标签: visual-studio assembly stack masm irvine32

我有一个包含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

所有这一切只是调用两次输入两次,然后调用以显示相乘的结果。我的问题是你如何实现推送和弹出以使这一切都有意义?

我认为您需要推入GetValue过程以将输入放入堆栈中,然后在主过程中的每次调用之后将其弹出,并且可能对显示过程执行相同操作?

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

PS。此代码是visual studio 2010中的asm文件

2 个答案:

答案 0 :(得分:1)

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

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

请注意push [intVal]中的方括号实际上是有意义的,但如果我没记错,微软汇编程序不支持实际有意义的符号,所以你可能需要编码相反,push intVal,或push dword ptr intVal,或类似的无意义的东西,以使其发挥作用。

答案 1 :(得分:1)

因为您的问题被标记为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