【问题标题】:Explain Push and Pop Loop解释 Push 和 Pop 循环
【发布时间】:2014-01-30 22:33:03
【问题描述】:

这些天,我用汇编语言自学,一直在使用MASM32。但是,我对一些代码行不太了解。我需要更好的解释。

mov eax,20
loop1: 
push eax 
invoke StdOut, addr HelloWorld 
pop eax 
dec eax 
jnz loop1

如果没有 push 和 pop,它将打印出 'Hello World' 无限!

我的问题:

为什么我们必须推送和弹出 eax 寄存器?

StdOut 是否会在内部更改该寄存器的值?

【问题讨论】:

    标签: assembly x86 masm callstack masm32


    【解决方案1】:

    因为对STDOUT 例程的调用会更改EAX 寄存器(也许这不是唯一的......)

    是的。

    【讨论】:

      【解决方案2】:

      你完全正确。在调用可能更改一个或多个寄存器的子例程之前,标准做法是在调用子例程之前将它们压入堆栈,它们将被保存在堆栈中。子程序返回后,以相反的顺序将值从堆栈中弹出,并将它们存储回原始寄存器中。

      【讨论】:

        【解决方案3】:

        当您调用一个不能保证保留您感兴趣的寄存器的子程序时,这是一种常见的做法;因此,您将它们保存在堆栈中(推送)并在调用后将它们收回(弹出)。

        在某些情况下,可能会保证函数保留一些寄存器,但“暂存”其他寄存器。当您知道存在此类约定时,您可以选择一个寄存器而不是另一个寄存器以避免push/pop 模式。 (交易只是在被调用者中完成,方法是推送必须保留的寄存器,并在返回给调用者之前将它们弹出)。

        例如当您在 x86 机器上调用 C 标准库的函数(“cdecl” 生效)时,您需要保存“仅”eaxecxedx,如果您需要保留它们价值观。

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 2016-08-16
          • 2018-04-17
          • 2011-06-20
          • 1970-01-01
          相关资源
          最近更新 更多