索引寻址的语法(以及通常领先的逗号)[重复]
Posted
技术标签:
【中文标题】索引寻址的语法(以及通常领先的逗号)[重复]【英文标题】:Syntax of indexed addressing (and the often leading comma) [duplicate] 【发布时间】:2020-08-23 05:18:05 【问题描述】:我已经看到以下关于在汇编中通常如何使用索引地址的定义(来自 Group Up 编程一书):
movl BEGINNINGADDRESS(,%INDEXREGISTER,WORDSIZE)
我在数组上使用了类似的东西(我最近的问题)来做类似的事情:
movl my_array(,%rdi,4), %r10 # move the int at the start of my_array into %r10
第一个逗号之前的第一个元素是什么,或者通常留空? “起始地址”总是一个变量名,还是经常是别的名字?不是%INDEXREGISTER
,是使用绝对内存地址还是立即值?
此外,这里有一个与此相关的好答案:Referencing the contents of a memory location. (x86 addressing modes)。我想我的主要问题是关于 base
项目的目的(在上面的解释/示例中留空)。
【问题讨论】:
就像我在Referencing the contents of a memory location. (x86 addressing modes) 中解释的那样,它是一个简单地添加到有效地址而不移位的寄存器。通常你可以只使用它而不是缩放索引,有时你甚至需要两者,即使位移部分是一个绝对地址(一个符号)而不是一个小整数。 汇编语言对于汇编器和工具来说是非常特殊的。不是目标,将来指定此类信息,以便可以创建正确的答案(如果尚未回答)。 【参考方案1】:实际语法是offset(base, index, scale),其中offset 和 base 是可选的,index,scale 也是可选的(但如果存在,则两者都必须存在)。
offset 是 8 位或 32 位常量,而 base 和 index 是寄存器,scale 是 1、2、4 或 8
这些都非常灵活,因此可以以多种不同的方式使用。
base 可以是任何寄存器,因此它可能是某个段的基址(偏移量是数组在段中的位置),也可能是数组的地址(因此偏移量将为 0,或数组的某个固定索引) index 可以是任何寄存器除了 rsp(堆栈指针),并在添加到 base 和 之前乘以比例因子>偏移。所以它可能是数组的索引,也可能是数组地址计算的一部分(在偏移量中有一个固定的索引)【讨论】:
谢谢,我想我明白scale
是什么——它是数组元素的大小。您能否补充一下其他三个项目是什么(offset
和 base
对我来说有点不清楚)。
@carl.hiass: scale 只是一个乘数(编码为索引的 2 位移位计数)。如果您碰巧有一个计数器由于某种原因每次迭代都增加 2,您可以使用 mov array(,%rcx,2), %eax
加载每个 4 字节的 dword。您在 asm 中使用的地址计算无需匹配或从任何特定的高级语义音译,或匹配操作数大小。以上是关于索引寻址的语法(以及通常领先的逗号)[重复]的主要内容,如果未能解决你的问题,请参考以下文章