我知道我明白了
movzbl (%rdi, %rcx, 1) , %ecx
表示“将零扩展字节移动到长”并且说将ecx扩展为32位,但我不完全确定语法(%rdi,%rcx,1)是指什么。
我在某处看到该语法指的是
(Base, Index, Scale)
但我找不到任何能说出这意味着什么的资源。我猜这意味着将(%rdi,%rcx,1)的任何信息移动到%ecx以便
(long) %ecx = (%rdi, %rcx, 1)
但我怎么弄清楚它是什么位置?是否有某种算术来查找地址或什么?
也不是ecx隐含32位吗?为什么需要扩展到32位?
编辑以澄清:
我理解语法(%rdi,%rcx,1)意味着我必须将这三个东西加在一起,但我不明白这是如何产生答案的。
我要添加什么,寄存器的内容?寄存器的地址?如果是地址,我该如何确定地址是什么并将它们加在一起?
我在网上找到的只是告诉我语法的含义,而不是如何在示例中使用它。
答案 0 :(得分:1)
引用intel基础架构手册:
3.7.5 指定偏移内存地址的偏移部分可以直接指定为静态值(称为置换)或通过组成的地址计算一个或多个以下组件:
- 位移 - 8位,16位或32位值。
- Base - 通用寄存器中的值。
- 索引 - 通用寄存器中的值。
- 比例因子 - 值为2,4或8乘以索引 值。
添加这些组件所产生的偏移称为有效地址。
请注意,它表示“通用寄存器中的值”。由于寄存器不是x86上内存地址空间的一部分,因此它们甚至没有地址,因此您唯一可以使用的是它们中的值。
对于movzbl
:它指示cpu从内存中获取一个字节,并将其扩展为32位。