我目前正在尝试通过分析简单的 C 代码片段来学习汇编语言(以及不同编译器选项的效果)。现在我偶然发现了以下说明:
mov %edx,-0x80(%rbp,%rax,4)
我不明白的是目标地址的表达式-0x80(%rbp,%rax,4)
。该指令在循环中为本地数组赋值。
-0x80(%rbp,%rax,4) = *(%rbp + %rax * 4 + (-0x80))
所以下面的指令:
mov %edx,-0x80(%rbp,%rax,4)
意味着让 CPU 将寄存器 %edx 的值移动到地址处的内存中(%rbp + %rax * 4 + (-0x80))
,这是 AT&T 风格的汇编。
机器命令会将 的内容复制%edx
到 给定的地址%rbp + 4 * %rax - 0x80
。它似乎%rax
持有该数组的索引并且%rbp - 0x80
是基地址。
查看此处以更好地理解 AT&T 语法。