英特尔和AT&T语法中内存寻址的一般形式如下:
[base + index*scale + disp]
disp(base, index, scale)
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
base和index任意注册?scale采用什么值,是1,2,4和8(默认值为1)?index和disp可互换的(唯一的区别index是寄存器disp是一个常数)?一直在进行装配任务,而且大部分时间我都很了解装配.或者至少对这项任务来说已经足够了.但这个mov声明让我感到沮丧.如果有人能解释这个mov语句如何操作寄存器值,我真的很感激.
mov(%ebx,%eax,4),%eax
PS我无法通过基本搜索找到这种特定类型的mov语句,所以如果我错过了它并且正在提问,我会道歉.
我现在在gdb上运行一些代码,我不知道这两个指令实际上是做什么的.如果有人能帮助我,我真的很感激.
add -0x2c(%ebp, %ebx, 4), %eax
cmp %eax, -0x28(%ebp, %ebx, 4)
Run Code Online (Sandbox Code Playgroud) 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