关于子函数的问题?

发布于 2022-09-22 13:10:31 字数 81 浏览 25 评论 0

1,父函数中的自动变量是存储在堆栈中的,从汇编的角度看,子函数可以通过ebp访问堆栈中的内容,比如8(%ebp),那么,在子函数中应该能访问父函数中的自动变量阿?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

多情癖 2022-09-29 13:10:31

原则上都可以访问.

最偏执的依靠 2022-09-29 13:10:31

x86实模式汇编可以,保护就不知道了。
编译角度来看,符号表有作用域的,不是一个作用域的是不可见的。如果一个编译器实现的符号表那么糟糕的话,还是算了吧。

拥有 2022-09-29 13:10:31

这么做有意义吗?想改变,可以传地址啊

最笨的告白 2022-09-29 13:10:31

当然可以,可是你觉得有意义吗?

百变从容 2022-09-29 13:10:31

访问父函数的栈内存也是通过栈指针。
那么你想没想过如果是不同的函数都调用了这个函数又怎么办呢?

夏九 2022-09-29 13:10:31

因为这些都是典型的不走大门而偏要翻窗户的行为,非奸即盗

昨迟人 2022-09-29 13:10:31

谢谢各位,不是为了应用,所以没想过有什么意义,只是想知道自己的想法对不对

提笔落墨 2022-09-29 13:10:31

原帖由 xdshting 于 2008-10-30 11:11 发表
1,父函数中的自动变量是存储在堆栈中的,从汇编的角度看,子函数可以通过ebp访问堆栈中的内容,比如8(%ebp),那么,在子函数中应该能访问父函数中的自动变量阿?

自然可以,有些语言(比如PASCAL)支持嵌套的函数定义:
用类C语言写:
  int father() {
      int auto1, auto2;
   
     ...
      int child() {
          int j;

          j=auto1;
       ....
      }
      ....
      auto2 = child();
      ...
}

在某个函数内部定义的函数可以访问父函数的局部变量,甚至父函数的父函数的局部变量。
这些语言的编译器在具体实现时就是通过传递ebp来实现子函数访问父函数局部变量的,一般叫做(static link)。在父函数调用子函数时,父函数将自己的栈帧指针(ebp)作为附加参数push到堆栈中,当子函数希望访问父函数的局部变量时,通过刚才的参数(它一般都在子函数栈帧ebp的固定偏移处)可以得到父函数的栈帧,接着就像访问自己的局部变量一样访问父函数的局部变量。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文