问题描述
对于组装中通常如何使用索引地址,我已经看到了以下定义(来自《 Group Up编程》一书):
search_column
我在数组(我最近的问题)上使用了类似的方法来做类似的事情:
movl BEGINNINGADDRESS(,%INDEXREGISTER,WORDSIZE)
第一个逗号之前的第一个元素是什么,或者通常留空? “开始地址”是否始终是变量名,还是经常使用其他名称?是否使用了绝对内存地址或立即值而不是movl my_array(,%rdi,4),%r10 # move the int at the start of my_array into %r10
?
此外,这是一个与此相关的好答案:Referencing the contents of a memory location. (x86 addressing modes)。我想我的主要问题是出于%INDEXREGISTER
项的目的(在上面的说明/示例中留为空白)。
解决方法
实际语法为 offset ( base , index , scale ),其中 offset 和 base 是可选的,并且 index , scale 也是可选的(但是如果存在,则两个都必须存在)。
offset 是8或32位常量,而 base 和 index 是寄存器,而 scale 是1、2、4或8
这些都很灵活,因此可以使用许多不同的方式。
- base 可以是任何寄存器,因此它可以是某个段的基址(偏移量是该数组在该段中的位置),也可以是该数组的地址(因此offset将为0,或数组的某个固定索引)
- index 可以是除 rsp(堆栈指针)之外的任何寄存器,并在将其添加到 base 之前与比例因子相乘。和偏移量。因此它可能是数组的索引,或者可能是数组地址计算的一部分(在 offset 中具有固定索引)