x86-64 程序集:括号中有两个寄存器? movsd (%rdx,%rsi,8),%xmm0
x86-64 Assembly: Two registers in parentheses? movsd (%rdx,%rsi,8), %xmm0
movsd (%rdx,%rsi,8), %xmm0 ## xmm0 = mem[0],zero
这条线是做什么的?特别是(%rdx,%rsi,8)?
(x86-64架构计算机)
我从执行矩阵乘法的 C 代码生成了一个汇编文件,涉及 3 个循环。我找到了一堆手册,但没有真正的可靠信息,即使是看起来 "official" 的手册。
我的 Mac OS X 是用 GAS 语法生成的,因此 mov
其变体的指令顺序为:
mov source dest
但是没有人解释像这样的事情会发生什么
(%rdx,%rsi,8)
突然入党
请帮助我了解更多相关信息。谢谢。
下面 link、幻灯片 7 是我能找到的最相关的信息(但它可能是在 Intel 语法中,源和目标翻转)
https://www.bowdoin.edu/~sbarker/teaching/courses/spring16/its/lectures/lec15.pdf
这就是所谓的AT&T (or GAS) syntax。它是更流行的 Intel 语法的替代方法。在 AT&T 语法中,地址操作数语法为:
segment:displacement(base register, index register, scale factor)
其中大部分是可选的。在您的示例中,%rdx
是基址寄存器,%rsi
是索引寄存器,8
是比例因子。
它的作用是从地址rdx + rsi * 8
加载xmm0
寄存器的低64位部分。在英特尔语法中它将是:
movsd xmm0, [rdx+rsi*8]
这更直观一点(至少对我而言)。
movsd (%rdx,%rsi,8), %xmm0 ## xmm0 = mem[0],zero
这条线是做什么的?特别是(%rdx,%rsi,8)?
(x86-64架构计算机)
我从执行矩阵乘法的 C 代码生成了一个汇编文件,涉及 3 个循环。我找到了一堆手册,但没有真正的可靠信息,即使是看起来 "official" 的手册。
我的 Mac OS X 是用 GAS 语法生成的,因此 mov
其变体的指令顺序为:
mov source dest
但是没有人解释像这样的事情会发生什么
(%rdx,%rsi,8)
突然入党
请帮助我了解更多相关信息。谢谢。
下面 link、幻灯片 7 是我能找到的最相关的信息(但它可能是在 Intel 语法中,源和目标翻转) https://www.bowdoin.edu/~sbarker/teaching/courses/spring16/its/lectures/lec15.pdf
这就是所谓的AT&T (or GAS) syntax。它是更流行的 Intel 语法的替代方法。在 AT&T 语法中,地址操作数语法为:
segment:displacement(base register, index register, scale factor)
其中大部分是可选的。在您的示例中,%rdx
是基址寄存器,%rsi
是索引寄存器,8
是比例因子。
它的作用是从地址rdx + rsi * 8
加载xmm0
寄存器的低64位部分。在英特尔语法中它将是:
movsd xmm0, [rdx+rsi*8]
这更直观一点(至少对我而言)。