LEA指令


轉載至: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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM