为什么汇编程序员想要从这个位置减去ebp而不是esp?

时间:2018-02-22 05:13:58

标签: assembly x86 fasm

我对ebp和esp在x86汇编语言中设置堆栈帧的使用方面略有不集。在以下代码中:

section '.code' code readable executable        ; define the code section of the file
main:                ;main label is where execution begins
push ebp
mov ebp,esp          ;set up the base ptr
sub ebp,4            ;subtract 4 from ebp
mov dword [esp],msg
call [printf]
mov dword [esp],p   ; pass pause>nul cmd to system to hold the box open
call [system]
mov dword [esp],0              ;pass NULL to exit
call [exit]   

程序员从ebp减去了4,但我不确定原因。通常,我在这里看到ESP减去而不是EBP。在这里从EBP中减去的目的是什么?

2 个答案:

答案 0 :(得分:5)

肯定是个错误

mytesttntity

因为指令2和3仅修改push ebp ; 1 mov ebp,esp ; 2 sub ebp,4 ; 3 mov dword [esp],msg ; 4 寄存器(但不是ebp)指令4将覆盖指令1中推送的值。

我怀疑程序员是否打算这样做。

答案 1 :(得分:2)

您的代码似乎来自FASM tutorial,其中完整代码如下所示:

{{1}}

在作者对代码的描述中写道:

  

从我们的入口点开始   标签main,我设置一个堆栈帧并在堆栈上分配4个字节    esp 的值减去4 。现在在4字节范围内,我将msg的地址放在那里并调用printf,

这让我相信作者想要的实际指示是:<​​/ p>

{{1}}

该代码实际上有一个错字。描述是正确的,代码是错误的。