我花了2个小时谷歌搜索,但无济于事 - 没有很多初学者级别的装配指南,而我现在正在采取的课程并没有很好地解释一些东西。< / p>
反正;我一直在尝试使用SSE并尝试使用double
指令比较两个comisd
。我花了很多时间来理解如何硬编码非整数常量(让我们称之为example
,它被声明为
example:
.long 3794832442
.long 1044740494
);但是在我完成之后,我无法让它工作 - “操作数类型不匹配”。我转向了C-to-assembly翻译,发现用comisd $example, %xmm0
而不是comisd example(%rip), %xmm0
代替setUserId(String id)
,结果证明它有效。现在我不明白,它是如何工作的以及它们有何不同?
答案 0 :(得分:2)
$example
只是该变量的绝对地址 - 它并不代表内存访问。
你得到&#34;操作数类型不匹配&#34;因为comisd
不支持立即操作数。 <{1}}(没有comisd example, %xmm0
)会有效,因为这是一个记忆参考。
$
正在使用x86-64中引入的PC相对寻址模式,这使得代码位置无关,因为它使用了当前指令指针的偏移量而不是使用绝对地址。
根据Jonathon Reinhart的回答。