为什么静态函数有时会有非标准的堆栈帧?

时间:2014-11-10 15:17:32

标签: x86 function-pointers disassembly stackframe static-functions

在wikibook x86 Disassembly中,有人写道,有时子程序没有设置标准堆栈帧。一个这样的情况是我们在C中声明一个静态函数。本书中已经写了以下几行。

When an optimizing compiler sees a static function that is only referenced by calls (no references through function pointers), it "knows" that external functions cannot possibly interface with the static function (the compiler controls all access to the function), so the compiler doesn't bother making it standard

我对以上陈述有以下问题:

  1. 外部函数是否可以使用函数指针引用静态函数?如果有,怎么样?为什么允许? (我问这个是因为据我所知,静态函数有局部范围,任何外部函数都无法访问)?
  2. 拥有非标准堆栈帧是什么意思?非标准堆栈帧与标准堆栈帧有何不同?欢迎使用汇编代码的解释:)
  3. 编辑:我想回答的另一个问题:为什么上面提到的情况下的编译器设置非标准堆栈帧而不是标准堆栈帧?

1 个答案:

答案 0 :(得分:1)

  1. 当然,只要它是同一个翻译单元中的另一个函数,它指向静态函数并将其赋予不同翻译单元中的代码。毕竟,函数的某处。使它static阻止其他对象找到它,但它不会阻止它们被传递。
  2. 例如,没有参数推送或弹出,或者返回值存储在编译器喜欢的任何位置。基本上,介于标准调用约定和内联函数体之间。虽然内联函数体是最有可能的结果。