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]

这更直观一点(至少对我而言)。