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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么汇编程序员想要从这个位置减去ebp而不是esp?相关的知识,希望对你有一定的参考价值。

关于在x86汇编语言中设置堆栈帧的ebp和esp的使用,我有点混淆。在以下代码中:

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中减去的目的是什么?

答案

这肯定是一个bug:

push ebp              ; 1
mov ebp,esp           ; 2
sub ebp,4             ; 3
mov dword [esp],msg   ; 4

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

我怀疑程序员的意图。

另一答案

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

format PE console
entry main

include 'macro/import32.inc'

section '.data' data readable writeable
msg db "hello world!",0
p db "pause>nul",0

section '.code' code readable executable
main:
push ebp
mov ebp,esp
sub ebp,4
mov dword [esp],msg
call [printf]
mov dword [esp],p
call [system]
mov dword [esp],0
call [exit]

section '.idata' import data readable
library msvcrt,'msvcrt.dll'
import msvcrt,\
printf,'printf',\
system,'system',\
exit,'exit'

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

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

这让我相信作者想要的实际指示是:

sub esp, 4

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

以上是关于为什么汇编程序员想要从这个位置减去ebp而不是esp?的主要内容,如果未能解决你的问题,请参考以下文章

GCC 内联汇编错误:表达式后出现垃圾 `(%ebp)+4'

at&t 汇编代码 ebp 注册未定义行为

把汇编代码转化成C代码

c语言中函数调用的本质从汇编角度分析

汇编中浮点数的总和数组

递归工作栈