【发布时间】:2015-10-29 17:44:03
【问题描述】:
我试图了解在运行时如何调用此类 sn-ps:
__asm{
PUSH ES
MOV CX,0
//... More x86 assembly
};
调整寄存器不会破坏程序流程的执行吗?
例如:如果上面的 CX 持有某个值,这是否意味着这个寄存器的值将不再有效?
编译器是否会处理这些依赖关系,或者sn-p的执行是否发生在特殊情况下?
在哪些编译器上内联汇编的使用不透明?
【问题讨论】:
-
尝试查看生成的整个函数的汇编代码。
-
在这样的问题中,告诉我们编译器会很漂亮。 GCC(带有扩展程序集)处理这种情况的方式与例如 clang 不同。
-
这取决于编译器。有些编译器希望保留所有寄存器,而有些编译器会尝试为您跟踪代码的寄存器使用情况,而其他编译器则要求您手动标记被破坏的寄存器。内联汇编本质上是特定于编译器的,因此您必须阅读编译器手册中的规则。
标签: c visual-c++ gcc x86 inline-assembly