如何正确使用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
我有一个包含 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