movzbl(%rdi,%rcx,1),%ecx在x86-64程序集中的含义是什么?

时间:2015-10-31 15:24:41

标签: assembly x86 64-bit x86-64

我知道我明白了

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

我要添加什么,寄存器的内容?寄存器的地址?如果是地址,我该如何确定地址是什么并将它们加在一起?

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

1 个答案:

答案 0 :(得分:1)

引用intel基础架构手册:

  

3.7.5 指定偏移内存地址的偏移部分可以直接指定为静态值(称为置换)或通过组成的地址计算一个或多个以下组件:

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

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

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

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