我正在尝试运行这个简单的程序:
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
,也会发生同样的情况。我想知道为什么?
答案 0 :(得分:2)
哎呀,在发布问题后几秒钟我发现了。我忘记了号码前的$
(被视为地址)。
正确的代码是:
int main (void) {
__asm__ ("mov $123, %rax");
return 0;
}
经验教训:从不在晚上编码!