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