gpt4 book ai didi

c - main函数和其他函数局部变量的区别

转载 作者:太空狗 更新时间:2023-10-29 15:02:13 26 4
gpt4 key购买 nike

我很困惑。我在 main 中声明了一个变量函数,另一个函数中的另一个变量。但是在gdb中,我发现程序访问了main中的变量通过 %esp 发挥作用注册,并通过%ebp访问另一个函数中的变量登记。 %ebp 不应该全部访问吗?功能?或者是%esp访问的潜规则注册main我不知道?

/* source_file.c */
#include <stdio.h>

void localfunc(void)
{
int local_in_func;
local_in_func = 0x21;
printf("local_in_func = %d\n", local_in_func);
}
int main(int argc, char **argv)
{
int local_in_main;
local_in_main = 0x97;
printf("local_in_main = %d\n", local_in_main);
return 0;
}

及其反汇编代码如下:

(gdb) disassemble main
Dump of assembler code for function main:
0x08048407 <+0>: push %ebp
0x08048408 <+1>: mov %esp,%ebp
0x0804840a <+3>: and $0xfffffff0,%esp ; visit local_in_main by esp
0x0804840d <+6>: sub $0x20,%esp
0x08048410 <+9>: movl $0x97,0x1c(%esp)
0x08048418 <+17>: mov $0x8048524,%eax
0x0804841d <+22>: mov 0x1c(%esp),%edx
0x08048421 <+26>: mov %edx,0x4(%esp)
0x08048425 <+30>: mov %eax,(%esp)
0x08048428 <+33>: call 0x8048300 <printf@plt>
0x0804842d <+38>: mov $0x0,%eax
0x08048432 <+43>: leave
0x08048433 <+44>: ret
End of assembler dump.

(gdb) disassemble localfunc
Dump of assembler code for function localfunc:
0x080483e4 <+0>: push %ebp
0x080483e5 <+1>: mov %esp,%ebp
0x080483e7 <+3>: sub $0x28,%esp
0x080483ea <+6>: movl $0x21,-0xc(%ebp) ; visit local_in_func by ebp
0x080483f1 <+13>: mov $0x8048510,%eax
0x080483f6 <+18>: mov -0xc(%ebp),%edx
0x080483f9 <+21>: mov %edx,0x4(%esp)
0x080483fd <+25>: mov %eax,(%esp)
0x08048400 <+28>: call 0x8048300 <printf@plt>
0x08048405 <+33>: leave
0x08048406 <+34>: ret
End of assembler dump.

我的工具是:

  • 操作系统:ubuntu 12.04

  • 编译:gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

  • 调试:GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04

最佳答案

通常,%esp 是堆栈指针,%ebp 是“基”指针,通常设置为堆栈指针在函数开始处的位置.

函数通过使用直接 push 或通过从 %esp 中减去偏移量并访问两者之间的空间的逻辑等效将它们压入堆栈来创建局部变量旧的 %esp(即 %ebp)和新的 %esp

这可以通过 %esp 的正偏移来完成(例如通过 main 中的 0x1c(%esp))或通过%ebp 的负偏移量(例如 `local_function1 中的 -0xc(%ebp))。尽管编译器有许多性能启发式方法可以在多种方法之间进行选择以实现同一目标,但逻辑上没有区别。

由于您的代码未优化,我不会在选择上给予太多重视,这可能是启发式的结果,在其他情况下会产生一些影响,但我不希望它在这里产生太大影响。

关于c - main函数和其他函数局部变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617569/

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