我刚开始学习x86_64汇编,我在linux上使用gcc汇编代码。
我发现令人困惑的是带$的文字与不带$的文字之间的区别。
以下代码有效:
.global main
.text
main:
movq $0xffffffffffffffff, %rax
xor %rax, %rax
ret
但如果我把$从常数中分离出来,那么它就会出错,所以死亡的代码是:
.global main
.text
main:
movq 0xffffffffffffffff, %rax
xor %rax, %rax
ret
请有人向我解释一下,如果第二个是无效的,为什么gcc要组装它而不是抱怨?
最佳答案
在类似于c的伪语言中,第一个例子如下:
rax = 0xffffffffffffffff;
第二个是:
rax = *(uint64_t *)0xffffffffffffffff;
正如你所看到的,第二个例子几乎肯定是segfults。不过,它仍然是一个有效的指令,所以您的工具没有理由不组装它。
关于linux - x64汇编文字,带vs而不带$,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21036403/