有人能告诉我这个汇编指令的意义是什么:
0xb48daed9 <+3479>: lea -0xc(%ebp),%esp
我对装配说明不太满意。实际上我在我的应用程序中得到一个SIGABRT,看起来,罪魁祸首就是这个特殊的汇编指令。
答案 0 :(得分:1)
在机械层面,指令
lea -0xc(%ebp),%esp
将-0xc
(即:-12)添加到%ebp
,并将结果写入%esp
。
在逻辑层面,它分配一个被调用函数的堆栈帧。我希望在类似的背景下看到它:
push %ebp ; save previous base pointer
mov %esp,%ebp ; set %ebp = %esp: old stack pointer is new base pointer
lea -0xc(%ebp),%esp ; allocate 12 bytes for local variables
%ebp
和%esp
是堆栈指针寄存器。 %ebp
指向堆栈框架的底部,%esp
指向其顶部&#34; (实际上是底部,因为堆栈向下增长),因此lea
指令将堆栈指针移动到基数下方12个字节,为局部变量设置了12个字节的声明。在保存旧的基指针并将新的基指针设置为旧的堆栈指针之后执行此操作会将12个字节的新帧推送到调用堆栈。
此指令本身似乎不太可能导致陷阱,但是如果堆栈溢出,分配的堆栈帧将无效并且在尝试使用它时会发生爆炸。我怀疑你有一个失控的递归函数。
@abligh提到的另一种可能性是堆栈指针在该行的某处被破坏。除其他外,如果在堆栈分配的缓冲区中发生缓冲区溢出,则会发生这种情况,以便先前保存的基指针被垃圾覆盖。从函数返回时,垃圾被恢复以代替被覆盖的基指针,并且随后的函数调用将没有任何合理的工作。
答案 1 :(得分:0)
lea -0xc(%ebp),%esp
将:
%ebp - 12
的有效地址[1]和%esp
它已被/用于对内存操作数执行快速算术运算。根据英特尔手册,如果源操作数不是内存位置,它可能会抛出异常。
[1]&#34;有效地址&#34;,在英特尔的说法中,是一个偏移量,以静态值或地址计算形式提供:Offset = Base + (Index * Scale) + Displacement