mov和lea指令的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/counsellor/article/details/81096278

0x00 指令概念

lea 指令(Load Effective Address)只能用于 memory addressing calculations, 不能用于 address memory 的计算。lea 接受标准的memory addressing operand,除了计算特定的寄存器(可能是任意用于一般目的的寄存器)的内存偏移,其他什么都做不了。

这个指令能干啥?两件add 指令做不到的事情:

1. 2-3个操作数的加法
2. 可以在任意寄存器存储结果,不仅仅是在源操作数上(。。这是在讽刺`add`指令吗) 

同时,lea指令不会修改flags。

需要注意的是:lea 指令的第二个操作数是寄存器必须要加[],不然报错。

LEA EBX,EAX
编译器报错: error A2070: invalid instruction operands

mov 指令用于Load value。通俗的说,如果源操作数是常量,有没有[]括号都代表常量。如果源操作数是寄存器,有[]表示取地址(eax存的地址指向的值)操作,无[]表示取值操作。

0x01 应用举例

lea 计算

  • 列表内容

  • 计算(EAX + EBX + 1234567)的值,注意这里有3个操作数,是add指令无法做到的:

LEA EAX, [ EAX + EBX + 1234567 ]
  • 不覆盖目的寄存器值的情况下,计算(EBX + ECX)的结果,这也是add指令无法做到的:
LEA EAX, [ EBX + ECX ]
  • 常数乘法(倍数N为2,3,5或者9等),当然N也可以是1,2,4,8:
LEA EAX, [ EBX + N * EBX ]
  • lea 的其他用法,比如在loop循环中,

    LEA EAX, [ EAX + 1 ]

    INC EAX

    的不同之处在于inc会修改EFLAGS标志位,lea不会修改标志位。

mov 和 lea 同时使用[]操作的区别

mov 读取在内存地址(123 + 4*EBX + ESI)位置的数据:

; Reads from memory at (123 + 4*EBX + ESI)
MOV EAX, [123 + 4*EBX + ESI]

lea 计算一个表达式(123 + 4*EBX + ESI)结果:

; Computes 123 + 4*EBX + ESI and puts this value in EAX
 LEA EAX, [123 + 4*EBX + ESI]

0x02 小结

话说回来了,lea 指令更像是升级版的 add 指令,而跟 mov 关系不大。

0x03 参考文献

https://www.cnblogs.com/codechild/p/6638861.html
https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction
https://stackoverflow.com/questions/1699748/what-is-the-difference-between-mov-and-lea
https://www.quora.com/What-is-the-difference-between-LEA-and-MOV-offset-instruction-in-assembly-level-programming

猜你喜欢

转载自blog.csdn.net/counsellor/article/details/81096278
lea