【发布时间】:2012-11-13 10:28:07
【问题描述】:
我目前正在尝试通过分析简单的 C 代码 sn-ps 来学习汇编语言(以及不同编译器选项的效果)。现在我偶然发现了以下说明:
mov %edx,-0x80(%rbp,%rax,4)
我不明白的是目标地址-0x80(%rbp,%rax,4) 的表达式。
该指令在循环中为本地数组赋值。
【问题讨论】:
我目前正在尝试通过分析简单的 C 代码 sn-ps 来学习汇编语言(以及不同编译器选项的效果)。现在我偶然发现了以下说明:
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 是基地址。
查看here 以更好地了解 AT&T 语法。
【讨论】: