为什么我不能在RAX上写字?

时间:2013-06-23 10:54:21

标签: gcc assembly

我正在尝试运行这个简单的程序:

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

然而,当我执行程序时,它会在执行mov 0x7b,%rax时完全出现段错误。如果我使用%eax,也会发生同样的情况。我想知道为什么?

1 个答案:

答案 0 :(得分:2)

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

正确的代码是:

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

经验教训:从不在晚上编码!