Visual studio 如何正确使用推送和弹出
我有一个代码,它有3个过程,一个是从用户那里获取输入,一个是显示乘法结果,最后一个是错误消息。我正在尝试实现PUSH和POP操作,并将代码放入堆栈中。它看起来很长,但对我来说很有意义,在这里Visual studio 如何正确使用推送和弹出,visual-studio,assembly,stack,masm,irvine32,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
.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过程,将输入放入堆栈,然后在主过程中的每次调用后弹出它,并且可能对display过程也这样做
我只是努力想弄明白,所以任何帮助都会很好
另外,此代码是visual studio 2010中的asm文件您对
GetValue
的第一次调用将其结果存储在intVal
中。但是,您对GetValue
的第二次调用也将其结果存储在intVal
中,因此第一个结果将永远丢失
MultiplyAndDisplay
函数需要intVal
中的一个操作数,以及eax
中的另一个操作数。因此,您需要做的是在第一次调用GetValue
后按[intVal],在第二次调用GetValue
后按pop eax
请注意,
push[intVal]
中的方括号在某种符号中实际上是有意义的,但是如果我没有记错的话,microsoft汇编程序不支持这种有意义的符号,因此您可能需要编写push intVal
,或者push dword ptr intVal
,或者像这样荒谬的事情来让它工作。因为你的问题被标记为MASM,这是一个MASM答案:可以使用带参数的MASM指令
PROC
,以及用于参数传递的指令来重新构造代码:
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
因此,我理解整个push intVal部分,但您能否详细介绍一下pop eax以及它的具体功能?这就是我要做的所有事情,来关注这个代码和堆栈?实际上,您并没有将push或pop放入过程中,而是将先前推送的值放入给定的操作数中,在本例中为eax。您选择“用堆栈关注此代码”的方式告诉我,您还不了解堆栈是如何工作的,您的代码需要用它做什么,甚至不知道为什么您的代码需要用它做任何事情。不幸的是,stackoverflow有一个非常明确的目的和方向,这是为了解决非常具体的问题,而不是针对广泛的主题(如堆栈使用)进行教育。所以,恐怕你需要学习。