x64汇编文字与vs没有$

时间:2014-01-10 04:47:51

标签: linux gcc assembly 64-bit

我刚刚开始学习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会收集它而不是抱怨?

1 个答案:

答案 0 :(得分:2)

在类似C语言的伪语言中,您的第一个例子是:

rax = 0xffffffffffffffff;

你的第二个是:

rax = *(uint64_t *)0xffffffffffffffff;

第二个例子几乎肯定是段错误,正如你所看到的那样。但它仍然是一个有效的指令,所以你的工具没有理由不组装它。