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

Leo*_*ard 2 assembly x86-64 att

movsd   (%rdx,%rsi,8), %xmm0    ## xmm0 = mem[0],zero
Run Code Online (Sandbox Code Playgroud)

这条线有什么作用?特别是(%rdx,%rsi,8)? (x86-64架构计算机)我从C代码生成了一个汇编文件,该文件执行矩阵乘法,涉及3个循环。我找到了一堆手册,但没有任何真正可靠的信息,即使是看起来“官方”的手册。

我的 Mac OS X 是用 GAS 语法生成的,因此mov其变体的指令按以下顺序排列:

mov source dest

(%rdx,%rsi,8)但没有人解释当类似的东西突然加入队伍时会发生什么 。

请帮助我了解更多相关信息。谢谢。

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

cyc*_*130 6

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

segment:displacement(base register, index register, scale factor)
Run Code Online (Sandbox Code Playgroud)

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

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

movsd   xmm0, [rdx+rsi*8]
Run Code Online (Sandbox Code Playgroud)

这更直观一些(至少对我来说)。

  • @Leonard 这个问题在这里有 100% 的重复(但我懒得去搜索它......也因为你不搜索而对你投反对票......我只是这么产生了这个评论 JFYI,我想知道你为什么不这样做在搜索时找到它......顺便说一句,我只是尝试有趣的谷歌“x86 at&t内存操作数语法” - >第一个链接https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax - 它就在那里,点“4地址”操作数语法”...)(所以我猜你只是无法猜出正确的单词,因为否则你应该检查适用于你的审查类型,如果你的搜索引擎找不到它) (2认同)
  • @Ped7g 平心而论,在不知道它是 AT&T 语法的情况下很难找到任何信息。 (2认同)
  • @cyco130可能是这样,而且即使您知道您正在搜索“AT&T”和“GAS”语法,您仍然可能不知道诸如“内存操作数”之类的词和类似的词......基本上,对于汇编完全陌生的人需要好书或导师(或两者),或一些高质量的“教程”,但这只是阅读一些好书之前的一个开始,大多数教程可能不会太在意技术术语以保持简短......这可能是很难找到好的资源。这就是 https://stackoverflow.com/tags/x86/info 可能有很大帮助的地方,它充满了经过验证的资源。 (2认同)