x86与lea指令混淆

REA*_*EE 0 x86 assembly

所以lea指令 - 加载有效地址 - 假设用于加载地址,但我有点混淆这个例子,

lea (%edx, %ecx, 1), %eax
Run Code Online (Sandbox Code Playgroud)

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

Ira*_*ter 5

我不能说准确的语法; 我习惯了MASM,它会向后或向下写入相同的信息.

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

     LEA  target_register, offset[base_register*k+index_register] ; MASM syntax, read from right to left
Run Code Online (Sandbox Code Playgroud)

的确是:

      target_register:=content(base_register)*k+content(index_register)+offset
Run Code Online (Sandbox Code Playgroud)

其中k为0,1,2或4(如果k为零,我们不打扰写"base register*k").

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