Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何正确使用推送和弹出_Visual Studio_Assembly_Stack_Masm_Irvine32 - Fatal编程技术网

Visual studio 如何正确使用推送和弹出

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

我有一个代码,它有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过程,将输入放入堆栈,然后在主过程中的每次调用后弹出它,并且可能对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有一个非常明确的目的和方向,这是为了解决非常具体的问题,而不是针对广泛的主题(如堆栈使用)进行教育。所以,恐怕你需要学习。