GCC内联asm:直接内存引用的约束

时间:2014-06-12 18:02:37

标签: c gcc inline-assembly

我需要GCC为内联asm生成一组一致的指令,但我使用的其中一条指令有时会以两种不同的方式编译:

__asm__ ("mov %1,%%rax;" \
         : \
         : "m"(ref) \
         : "%rax");

编译#1:

mov 0x200894(%rip),%rax

编译#2:

mov 0x200894(%rip),%rdx
mov (%rdx),%rax

我不确定第二个版本的原因是什么,但我不想要它。是否有约束来指定内存引用应该只是直接的,即不通过寄存器?


更新

此变体始终产生完全相同的指令:

    __asm__ ("mov ref@GOTPCREL(%rip),%rax");

编译为:

mov 0x200910(%rip),%rax

1 个答案:

答案 0 :(得分:3)

回答我自己的问题:

此变体始终产生完全相同的指令:

__asm__ ("mov ref@GOTPCREL(%rip),%rax");

编译为:

mov 0x200910(%rip),%rax

对于没有RIP相对的x86,它需要两条指令:

__asm__ ("mov $_GLOBAL_OFFSET_TABLE_,%%eax; \
          add ref@GOT,%%eax;");

编译为:

mov $0x2ff7,%eax
add 0xfffffff0,%eax

需要另外两条指令来使%eax RIP相对,但我正在使用二进制翻译器,这在内部更容易。