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