__asm__ __volatile__ (
"movl 0x4(%ebp), %eax \n"
"addl $15, %eax \n"
"movl %eax, 0x4(%ebp)"
);
我知道%eax
存储返回值,但是%ebp
在这里有什么用呢?
发布于 2011-03-25 07:32:32
假设您的函数的prolog如下所示:
pushl %ebp
movl %esp, %ebp
...
%ebp将是存储基指针(也称为帧指针)的寄存器。基指针是当前堆栈帧在堆栈中的起始位置。与在x86中一样,堆栈向下增长,局部变量被引用为%ebp的负偏移量。参数和返回地址由%ebp的正偏移量引用。%ebp中的值指向堆栈上调用方的%ebp值(由prolog推送)。这有效地形成了可用于“遍历”堆栈的基指针的链表。注意:这假设每个堆栈帧都有一个基指针;有一种称为帧指针省略(FPO)的优化,可以释放%ebp用于其他用途。
因此,给定一个带有该prolog的函数,并且如果使用call指令调用它(即,调用者的返回地址被压入堆栈),则0x4(%ebp)将存储返回地址,因为它是被调用者的prolog执行之前被压入堆栈的最后一件事。因此,您的代码片段将导致在被调用者返回后执行的下一条指令距调用方的call指令的末尾15个字节,而不是调用之后的下一条指令。
编辑:到目前为止,我的多次编辑都是为了更好地解释我的答案。
发布于 2011-03-25 07:19:01
ebp
是帧指针。ebp和esp一起标记当前进程的堆栈框架。
0x4(%ebp)实际上是返回地址,此调用结束后函数要返回的地址。
检查这张图片中的栈帧。
发布于 2011-03-25 07:11:58
%ebp
寄存器指向存储函数参数和局部变量的当前堆栈帧。该代码正在从%ebp访问偏移量为0x4的值(未显示该值所代表的内容)。
https://stackoverflow.com/questions/5429514
复制相似问题