轉載至:http://adam8157.info/blog/2011/01/interesting-opcode-lea/
最近惡補匯編時發現lea指令很有意思, 但大部分書都把它一筆帶過, 同時網上的資料又很少, 所以記一下.
lea, load effective address, 加載有效地址. 指令形式是從存儲器讀數據到寄存器, 效果是將存儲器的有效地址寫入到目的操作數, 簡單說, 就是C語言中的”&”.
例如在32位環境下, 有內存位置標簽foo, 則下面兩行效果相同:
movl $foo, %edi
leal foo, %edi
同時, lea還有個很有用但同時又很難理解的用法, 例如這樣:
leal 5(%edx, %edx, 2), %eax
假設%edx的值為x, 上面這行會將%eax的值設置為”3x+5”.
奇怪吧, 一個取址的指令怎么用來做簡單算術操作了? 其實理解起來也不難, 5(%edx, %edx, 2)是存儲器”3x+5”這個地址中的值, 這個值作為leal的源操作數會被取地址, 地址是什么? 自然就是”3x+5”!
值得注意的是, 不管是AT&T還是Intel語法, lea都是加載有效地址, 所以運算結果需得在地址空間能表示的大小范圍內.
PS: 可能有人會問為什么不把源操作數寫成5(, %edx, 3), 這個嘛, 因為這種尋址模式的比例因子只能是1, 2, 4或者8.