【发布时间】:2013-11-01 10:38:16
【问题描述】:
__declspec(naked) void printfive() {
int i = 5;
printf("%i\n", i);
}
由于某种原因,这段代码有效,但我不明白i 的存储位置?在调用函数的框架中?它成为全局变量?如果它存储在调用者的框架中,那么编译器如何知道位移,因为您可以从具有不同框架大小和局部变量的不同函数中调用printfive()。如果它是全局的,或者类似static 的东西,我尝试过递归,我可以看到变量没有改变,它确实不是真正的本地变量。但这很明显,没有入口代码(序言)。好的,我明白了,没有序言,没有框架,没有寄存器更改,但这是值,但是 范围 会发生什么?此说明符的行为是否在任何参考中定义?这还是 C++ 标准的一部分吗?如果您主要在其中使用asm {}(或使用 asm 调用它们并希望确保该函数没有过度优化),则此类函数非常棒,但您可以与 C++ 混合使用。但这是一种脑筋急转弯。
【问题讨论】:
-
你用的是什么编译器?
-
"这还是 C++ 标准的一部分吗?"不。你实际上想要达到什么目的?你的目标是什么?你为什么要写一个没有序言/结语的函数?
-
我正在实现一种类似第四种线程的代码语言,每个原语都是一个汇编程序或 C 函数。主要是 asm,但有时 C 代码更容易阅读,裸函数不是搞砸寄存器。
标签: c++ assembly visual-c++