我想这是个简单的问题,但我什么也找不到。
如果我写信

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中使用volatileasm将保证编译器不会对状态重新排序。但是,不能保证编译器不会在foo:标签和inlineasm语句之间添加额外的代码。当然,这意味着你不能依赖在那一节中保留的寄存器值-我还没有想出一个明显的例子,但是我很确定编译器不能保证这不会发生。

10-07 15:10