【问题标题】:x86 confusion with lea instructionx86 与 lea 指令混淆
【发布时间】:2013-11-27 01:16:42
【问题描述】:

所以lea指令——加载有效地址——假设用于加载地址,但我对这个例子有点困惑,

lea (%edx, %ecx, 1), %eax

该指令是否用于获取地址的字节值(基址%edx 和偏移%ecx)?如果是这样,在这种情况下是否可以使用mov 指令而不是使用lea?

【问题讨论】:

标签: assembly x86


【解决方案1】:

我无法说出确切的语法;我习惯了 MASM,它“向后”写入或多或少相同的信息。

但通常 LEA 指令用于通过将来自基址和索引寄存器的值与各种常量组合来计算地址。一般形式是什么

     LEA  target_register, offset[base_register*k+index_register] ; MASM syntax, read from right to left

确实是:

      target_register:=content(base_register)*k+content(index_register)+offset

其中 k 为 0、1、2 或 4(如果 k 为 0,我们就不必费心编写“基址寄存器*k”)。

这结合了算术和寄存器到寄存器的移动,所以如果您必须在不使用 LEA 的情况下实现它,是的,您可能会使用 MOV 指令(以及 SHL 和 ADD...)。但是 LEA 不会从内存中获取任何东西,而各种形式的 MOV 命令都会这样做,所以我不认为 LEA 是一种 MOV 指令。

【讨论】:

  • 对,实际上 LEA 经常用于简单的算术运算(因为它不会更新标志),它绝对不是负载
  • AT&T 中的 (reg, reg, constant) 与 MASM 中的 offset[base+index] 相同?我对此表示怀疑。但是 LEA 肯定不会从内存中获取任何内容?
  • @Leeor:MOV 也不更新标志;你的意思是什么?
  • @REALFREE:LEA 做了我写的。没有内存访问。如果您将 LEA 替换为 MOV 操作码,则该指令将以完全相同的方式计算目标寄存器的地址,然后使用该地址从内存中获取值。
  • @Ira - 我的意思是与 ADD 相反,例如- 关键是它是算术运算,而不是内存运算
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 2020-08-01
  • 2012-05-20
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多