引用没有美元符号的常量是不是有不同的含义?
Posted
技术标签:
【中文标题】引用没有美元符号的常量是不是有不同的含义?【英文标题】:Does referencing constants without a dollar sign have a distinct meaning?引用没有美元符号的常量是否有不同的含义? 【发布时间】:2017-03-10 21:02:00 【问题描述】:我写道:
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 语法...
【参考方案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。
【讨论】:
以上是关于引用没有美元符号的常量是不是有不同的含义?的主要内容,如果未能解决你的问题,请参考以下文章
当我们将命令放在美元符号和括号内时,shell 中的含义是啥: $(command)