2013-06-23 26 views
0

我试图运行这个简单的程序:为什么我不能在RAX上书写?

int main (void) { 
    __asm__ ("mov 123, %rax"); 
    return 0; 
} 

它编译没有问题,而且objdump确认的结果是什么,我希望:

00000000004004ec <main>: 
    4004ec: 55      push %rbp 
    4004ed: 48 89 e5    mov %rsp,%rbp 
    4004f0: 48 8b 04 25 7b 00 00 mov 0x7b,%rax 
    4004f7: 00 
    4004f8: b8 00 00 00 00   mov $0x0,%eax 
    4004fd: 5d      pop %rbp 
    4004fe: c3      retq 
    4004ff: 90      nop 

然而,当我执行程序就出现segfaults准确执行时mov 0x7b,%rax。如果我使用%eax,也会发生同样的情况。我想知道为什么?

+1

作为一个提示,它实际上很明显的来自操作码:'48 8b 04 25 7b 00 00 00'太长而不能成为'mov imm32,reg64'。很明显,'04 25'为modr/m + sib。 – harold

回答

2

唉,我在发布问题后几秒钟发现它。我忘记了号码前的$(这被视为地址)。

正确的代码是:

int main (void) { 
    __asm__ ("mov $123, %rax"); 
    return 0; 
} 

教训:永远代码晚上!

+0

顺便说一句,这只是运气,这返回'(0)'。编译器可能选择在汇编语句之前将'%rax'设置为零,并且返回值为':xorl%eax,%eax',但没有意识到您已经修改了它。 –

+0

@BrettHale:当然。 return语句只是为了让编译器警告消失。 – user16538

相关问题