索引寻址的语法(以及通常领先的逗号)[重复]

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 位常量,而 baseindex 是寄存器,scale 是 1、2、4 或 8

这些都非常灵活,因此可以以多种不同的方式使用。

base 可以是任何寄存器,因此它可能是某个段的基址(偏移量是数组在段中的位置),也可能是数组的地址(因此偏移量将为 0,或数组的某个固定索引) index 可以是任何寄存器除了 rsp(堆栈指针),并在添加到 base 之前乘以比例因子>偏移。所以它可能是数组的索引,也可能是数组地址计算的一部分(在偏移量中有一个固定的索引)

【讨论】:

谢谢,我想我明白scale 是什么——它是数组元素的大小。您能否补充一下其他三个项目是什么(offsetbase 对我来说有点不清楚)。 @carl.hiass: scale 只是一个乘数(编码为索引的 2 位移位计数)。如果您碰巧有一个计数器由于某种原因每次迭代都增加 2,您可以使用 mov array(,%rcx,2), %eax 加载每个 4 字节的 dword。您在 asm 中使用的地址计算无需匹配或从任何特定的高级语义音译,或匹配操作数大小。

以上是关于索引寻址的语法(以及通常领先的逗号)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

字典

Python数据类型

将用逗号分隔的所有单词放在新行上[重复]

删除重复的单词、逗号和空格

检查字符串是不是有两个或多个逗号并删除额外的逗号 [重复]

numpy