我刚开始学习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/

10-11 22:04