1. 程式人生 > >mov和lea指令的區別

mov和lea指令的區別

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