我有一个包含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文件
答案 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