我刚刚开始学习x86_64程序集我在linux上使用gcc来汇编我的代码。
我发现令人困惑的是文字与$ vs与没有文字之间的区别。
以下代码有效:
.global main
.text
main:
movq $0xffffffffffffffff, %rax
xor %rax, %rax
ret
但如果我从常量中远程$,那么它会段错误,所以死的代码是:
.global main
.text
main:
movq 0xffffffffffffffff, %rax
xor %rax, %rax
ret
有人可以向我解释这个问题吗?如果第二个问题无效,为什么gcc会收集它而不是抱怨?
答案 0 :(得分:2)
在类似C语言的伪语言中,您的第一个例子是:
rax = 0xffffffffffffffff;
你的第二个是:
rax = *(uint64_t *)0xffffffffffffffff;
第二个例子几乎肯定是段错误,正如你所看到的那样。但它仍然是一个有效的指令,所以你的工具没有理由不组装它。