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

How is $example different from example(%rip)?

我在谷歌上搜索了 2 个小时,但无济于事 --- 初学者级别的组装指南并不多,而且我现在正在学习的课程在解释某些内容方面做得不是很好.

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

example:
    .long   3794832442
    .long   1044740494

);但是在我完成之后,我无法让它工作 --- "operand type mismatch"。我求助于 C 语言到汇编语言的翻译器,发现它使用的不是我的 comisd $example, %xmm0,而是 comisd example(%rip), %xmm0,结果证明它可以工作。现在我不明白,它是如何工作的,它们有何不同?

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

你得到 "operand type mismatch" 因为 comisd 不支持立即操作数。 comisd example, %xmm0(没有 $)会起作用,因为那是一个内存引用。

example(%rip) 使用的是 x86-64 中引入的 PC-relative 寻址模式,这使得代码 position-independent 因为它没有使用绝对地址,而是使用当前地址的偏移量指令指针。


基于 Jonathon Reinhart 的回答。