$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 的回答。
我在谷歌上搜索了 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 的回答。