$ example与example(%rip)有何不同?

时间:2017-02-09 12:49:42

标签: assembly att

我花了2个小时谷歌搜索,但无济于事 - 没有很多初学者级别的装配指南,而我现在正在采取的课程并没有很好地解释一些东西。< / p>

反正;我一直在尝试使用SSE并尝试使用double指令比较两个comisd。我花了很多时间来理解如何硬编码非整数常量(让我们称之为example,它被声明为

example:
    .long   3794832442
    .long   1044740494

);但是在我完成之后,我无法让它工作 - “操作数类型不匹配”。我转向了C-to-assembly翻译,发现用comisd $example, %xmm0而不是comisd example(%rip), %xmm0代替setUserId(String id),结果证明它有效。现在我不明白,它是如何工作的以及它们有何不同?

1 个答案:

答案 0 :(得分:2)

$example只是该变量的绝对地址 - 它并不代表内存访问。

你得到&#34;操作数类型不匹配&#34;因为comisd不支持立即操作数。 <{1}}(没有comisd example, %xmm0)会有效,因为这是一个记忆参考。

$正在使用x86-64中引入的PC相对寻址模式,这使得代码位置无关,因为它使用了当前指令指针的偏移量而不是使用绝对地址。

根据Jonathon Reinhart的回答。