複製鏈接
請複製以下鏈接發送給好友

lea

(微機8086/8088系列的一條指令)

鎖定
LEA是微機8086/8088系列的一條指令,取自英語Load effective address——取有效地址,也就是取偏移地址。在微機8086/8088中有20位物理地址,由16位段基址向左偏移4位再與偏移地址之和得到。地址傳送指令之一。
中文名
取有效地址
外文名
Load effective address
縮    寫
lea

lea簡介

lea指令用於把源操作數的地址偏移量傳送目的操作數。源操作數一定要是一個存貯器操作數,而目的操作數可以是任何的16位的通用寄存器,包括指針寄存器/變址寄存器。lea指令允許源操作數被下標標出,但是不允許使用帶有OFFSET操作符的MOV指令。另外,後面的操作一定要使用被定義的段中的變量偏移量。然而,如果這組僅僅能夠通過最後的ASSUME偽指令操作存取的話,lea指令將把它當作一組偏移量。 [1] 

lea指令格式

如下:
LEA reg16,mem
LEA指令將存儲器操作數mem的4位16進制偏移地址送到指定的寄存器。這裏,源操作數必須是存儲器操作數,目標操作數必須是16位通用寄存器。因該寄存器常用來作為地址指針,故在此最好選用四個間址寄存器BX,BP,SI,DI之一。
LEA 取有效地址指令 (Load Effective Address )
指令格式:LEA 目的,源
解釋:指定的寄存器的內容被標出的變量偏移量取代,也可以用標號,或地址表達式所取代。 [2] 
指令功能:取源操作數地址的偏移量,並把它傳送到目的操作數所在的單元。如:
LEA BX ,BUFFER
LEA AX,[BX][DI](j基址加變址尋址)
LEA DX,DATA [BX][SI](相對基址加變址尋址) [3] 
LEA 指令要求源操作數必須是存儲單元,而且目的操作數必須是一個除段寄存器之外的16位或32位寄存器。當目的操作數是16位通用寄存器時,那麼只裝入有效地址的低16位。使用時要注意它與MOV指令的區別,MOV指令傳送的一般是源操作數中的內容而不是地址。

lea舉例

例1 假設:SI=1000H , DS=5000H, (51000H)=1234H
執行指令 LEA BX , [SI]後,BX=1000H
執行指令 MOV BX , [SI]後,BX=1234H
有時,LEA指令也可用取偏移地址的MOV指令替代。
例2 下面兩條指令就是等價的,他們都取TABLE的偏移地址,然後送到BX中,即
LEA BX,TABLE
MOV BX,OFFSET TABLE
但有些時候,必須使用LEA指令來完成某些功能,不能用MOV指令來實現,必須使用下面指令:
LEA BX, 6[DI]
解釋:某數組含20個元素,每個元素佔一個字節,序號為0~19。設DI指向數組開頭處,如果把序號為6的元素的偏移地址送到BX中

leaLEA與MOV指令

LEA指令和MOV指令一樣是移動數據,但是與MOV不同的是,它移動的是“[ ]”裏面的內容,例如:LEA EAX,[ECX]中,執行這條指令相當於MOV EAX,ECX。而MOV EAX,[ECX]是把“[ ]”裏面的數據當成是內存地址編號,取地址裏面的內容。
注意LEA指令與MOV指令的區別,比較下面兩條指令:
LEA BX, BUFFER
MOV BX, BUFFER
前者將存儲器變量BUFFER的偏移地址送到BX,而後者將存儲器變量BUFFER的內容(兩個字節)傳送到BX。當然也可以用MOV指令來得到存儲器的偏移地址,例如以下兩條指令的效果相同:
LEA BX, BUFFER
MOV BX, OFFSET BUFFER
其中,OFFSET BUFFER表示存儲器變量BUFFER的偏移地址。 [4] 
參考資料
  • 1.    趙平福.IBM PC使用手冊 下:中國科學院成都計算機應用研究所計算技術服務公司,1985 :366
  • 2.    王旭.IBM 宏彙編:《小型微型計算機系統》編輯部,1990:89
  • 3.    何小海.微機原理與接口技術:科學出版社,2006:102-103
  • 4.    王忠民.微型計算機原理:西安電子科技大學出版社,2015.12:105