我需要 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

最佳答案

回答我自己的问题:

这种变化总是产生完全相同的指令:

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

编译为:
mov 0x200910(%rip),%rax

对于 RIP-relative 不可用的 x86,需要两条指令:
__asm__ ("mov $_GLOBAL_OFFSET_TABLE_,%%eax; \
          add ref@GOT,%%eax;");

编译为:
mov $0x2ff7,%eax
add 0xfffffff0,%eax

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

关于c - GCC 内联汇编 : constraint for direct memory reference,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24191034/

10-11 23:11
查看更多