在wikibook x86 Disassembly
中,有人写道,有时有些子程序不设置标准堆栈框架。一个这样的例子是当我们在C中声明一个静态函数时。书中已经写了以下几行。
CCD_ 2。
关于上述声明,我有以下问题:
- 外部函数是否可以使用函数指针引用静态函数?如果是,如何?为什么允许?(我之所以这么问,是因为据我所知,静态函数具有本地作用域,任何外部函数都无法访问)
- 拥有非标准堆栈框架意味着什么?非标准堆栈框架与标准堆栈框架有何不同?欢迎使用程序集代码进行解释:)
编辑:我想回答的另一个问题是:为什么在上面提到的情况下,编译器设置了非标准堆栈帧而不是标准堆栈帧?
- 当然,只要它是同一个翻译单元中的另一个函数,就可以将指针指向静态函数,并将其提供给不同翻译单元的代码。毕竟,函数在的某个地方。使其成为
static
可以防止其他对象找到它,但这并不妨碍它们被递给它 - 例如,没有参数推送或弹出,或者返回值存储在编译器喜欢的任何地方。基本上,介于标准调用约定和内联函数体之间。尽管内联函数体是最有可能的结果