没有美元符号的引用常量是否具有明显的含义?

mar*_*trz 1 x86 assembly x86-64 att

我写:

mov 60, %rax
Run Code Online (Sandbox Code Playgroud)

GNU as接受了它,虽然我应该写

mov $60, %rax
Run Code Online (Sandbox Code Playgroud)

这两个电话之间有什么区别吗?

dav*_*mac 7

是; 第一个加载存储在地址60的存储器中的值并存储结果rax,第二个存储立即值60 rax.


old*_*mer 5

就试一试吧...

mov 60,%rax
mov $60,%rax
mov 0x60,%rax


0000000000000000 <.text>:
   0:   48 8b 04 25 3c 00 00    mov    0x3c,%rax
   7:   00 
   8:   48 c7 c0 3c 00 00 00    mov    $0x3c,%rax
   f:   48 8b 04 25 60 00 00    mov    0x60,%rax
  16:   00 
Run Code Online (Sandbox Code Playgroud)

哎哟!从历史上看,美元符号意味着十六进制 $60 = 0x60,但是 gas 也有搞砸汇编语言的历史……而且历史上 x86 汇编语言允许 60h 表示十六进制,但是当我这样做时出现错误。

因此,无论有没有美元叹息,您都会得到不同的指示。

0x8B 是寄存器/内存寄存器,0xC7 是立即寄存器。因此,davmac 回答 mov 60,%rax 是要注册的 mov 内存位置,而 mov $60,%rax 是 mov 立即注册。