我想这是个简单的问题,但我什么也找不到。
如果我写信
void bar()
{
{
void *rax = 0/* ...*/, *rbx = 0/* ... */;
asm volatile ("movq %0, %%rax; movq %1, %%rbx;" : : "m"(rax), "m"(rbx));
goto foo;
}
{
foo:
void* rax, *rbx;
asm volatile ("movq %%rax, %0; movq %%rbx, %1;" : "=m"(rax), "=m"(rbx));
// LOTS OF CODE
}
}
在运行第二个块中的任何其他代码之前,是否保证可以获取rax/rbx的值?
最佳答案
在gcc中使用volatile
和asm
将保证编译器不会对状态重新排序。但是,不能保证编译器不会在foo:
标签和inlineasm
语句之间添加额外的代码。当然,这意味着你不能依赖在那一节中保留的寄存器值-我还没有想出一个明显的例子,但是我很确定编译器不能保证这不会发生。