我需要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
答案 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相对,但我正在使用二进制翻译器,这在内部更容易。