movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

2024-05-19

我想我明白

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) 意味着我必须将这三件事添加在一起,但我不明白这如何产生答案。

我要添加什么,寄存器的内容?寄存器的地址?如果是地址,我如何找出地址并将其加在一起?

我在网上找到的只是告诉我语法的含义,而不是如何通过示例使用它。


引用一下intel基础架构手册:

3.7.5 指定偏移量内存地址的偏移部分可以直接指定为静态值(称为位移),也可以通过由以下一个或多个组成部分组成的地址计算来指定:

  • 位移——8、16 或 32 位值。
  • 基址——通用寄存器中的值。
  • 索引——通用寄存器中的值。
  • 比例因子 -- 值 2、4 或 8,乘以索引 价值。

添加这些组件所产生的偏移量称为有效地址。

请注意,它说“value在通用寄存器中”。由于寄存器不是 x86 上内存地址空间的一部分,它们甚至没有地址,因此您唯一可以使用的就是它们中的值。

至于movzbl:它指示CPU从内存中获取一个字节,并将其零扩展为32位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么? 的相关文章

随机推荐