【问题标题】:Does referencing constants without a dollar sign have a distinct meaning?引用没有美元符号的常量是否有不同的含义?
【发布时间】:2017-08-01 08:18:35
【问题描述】:

我写道:

mov 60, %rax

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

mov $60, %rax

两个这样的调用有什么区别吗?

【问题讨论】:

  • 在称为“Intel”的人类偏好语法中,可以通过编写mov rax,60(gas 中的$ case)来实现相同的效果(顺便说一句mov eax,60 会做同样的事情)vs mov rax,[60](在 gas 情况下没有 $)...你可能会猜我为什么不喜欢 gas/at&t 语法...

标签: assembly x86 x86-64 att


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试吧……

    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 
    

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

    所以无论有没有美元叹息,你都会得到不同的指示。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多