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
答案 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]
(至少对我而言)更直观。