我需要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发布于 2014-06-12 22:20:09
回答我自己的问题:
这种变化总是产生完全相同的指令:
__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相对,还需要两条指令,但我在二进制翻译程序中工作,这在内部更容易实现。
https://stackoverflow.com/questions/24191034
复制相似问题