gpt4 book ai didi

函数调用后栈的内容

转载 作者:行者123 更新时间:2023-11-30 14:44:34 25 4
gpt4 key购买 nike

我正在读一本书,其中解释了调用函数时ebpeip 寄存器如何工作。提供下图:

enter image description here

这里array是一个局部函数变量。函数参数为 ab。实际的 C 代码如下所示:

#include <stdio.h>

void function(int a, int b)
{
int array[8];
}

int main()
{
function(1,2);
return 0;
}

我使用 gcc -m32 -g function.c 进行编译,并在 gdb 中运行该程序。命令 disas main 显示(跳过了一些行):

0x08048474 :    push   $0x20x08048476 :    push   $0x10x08048478 :    call   0x804843b 0x0804847d :    add    $0x10,%esp

function() 的前几条指令和最后几条指令是:

0x0804843b :    push   %ebp0x0804843c :    mov    %esp,%ebp0x0804843e :    sub    $0x38,%esp0x08048441 :    mov    %gs:0x14,%eax0x08048447 :    mov    %eax,-0xc(%ebp)0x0804844a :    xor    %eax,%eax0x0804844c :    nop    ...0x0804845e :    leave  0x0804845f :    ret

当我检查ebp的内容时:

(gdb) x/4xw $ebp0xffffcd48:     0xffffcd68      0x0804847d      0x00000001     0x00000002    

据我了解,在堆栈中,ebp 后面应该跟有返回位置 0x0804847d 以及函数参数 0x000000010x00000002 。但是我不知道0xffffcd68是什么。这是ebp的地址吗?

最佳答案

它是函数开头的ebp的值。
这是 push %ebp 的结果,而且 x86 堆栈是完全降序的。

它是调用者帧指针。

<小时/>

请注意,编译器更新处理堆栈的方式比书籍作者更新书籍的方式要频繁得多。
特别是:对齐、帧指针遗漏、RVO、隐式参数等可能会让您感到困惑。

关于函数调用后栈的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com