x86-64汇编:括号中有两个寄存器? movsd(%rdx,%rsi,8),%xmm0

时间:2018-07-20 14:35:46

标签: assembly x86-64 att

movsd   (%rdx,%rsi,8), %xmm0    ## xmm0 = mem[0],zero

这行是做什么的?特别是(%rdx,%rsi,8)? (x86-64架构计算机) 我用C代码制作了一个Assembly文件,该文件执行矩阵乘法,涉及3个循环。我发现了很多手册,但没有真正可靠的信息,甚至是看起来“官方”的信息。

我的Mac OS X使用GAS语法生成此代码,因此mov对其变化的说明按以下顺序进行:

mov source dest

但是没有人解释类似的事情会发生什么 (%rdx,%rsi,8)突然加入了聚会。

请帮助我进一步了解此内容。谢谢。

下面的链接,幻灯片7 是我能找到的最相关的信息(但可能是Intel语法中的源代码和目标代码已翻转) https://www.bowdoin.edu/~sbarker/teaching/courses/spring16/its/lectures/lec15.pdf

1 个答案:

答案 0 :(得分:3)

这就是所谓的AT&T (or GAS) syntax。它是更流行的Intel语法的替代方法。在AT&T语法中,地址操作数语法为:

segment:displacement(base register, index register, scale factor)

其中大多数部分是可选的。在您的示例中,%rdx是基址寄存器,%rsi是索引寄存器,8是比例因子。

它的作用是从地址xmm0加载rdx + rsi * 8寄存器的低64位部分。用Intel语法是:

movsd   xmm0, [rdx+rsi*8]

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