記憶體運算元的定址方式有:直接定址、暫存器間接定址、暫存器相對尋址、基址變址定址、基址變址相對尋址。
記憶體運算元的定址方式
TIPS:
♥指令操作的物件在記憶體中,表現形式為[ ]
♥ 指令給出運算物件在記憶體某個邏輯段中的偏移位址:[偏移位址]
♥邏輯段的段基位址透過預設或重設方式給出
♥記憶體運算元的字長本身並不確定,其字長取決於另一個暫存器運算元,或透過其他方式指定字長
1. 直接定址
※ 指令直接給出運算元的偏移位址
eg:MOV AX,[1200H] ;將資料段1200H位置的內容存放給AL中,1201H的內容存放給AH中
※ 直接尋址方式下,操作數預設在資料段,但允許段重設,即由指令給出所在邏輯段
eg:MOV AX,ES:[1200H] ;將附加段落1200 H位置的內容存放給AL中,1201H的內容存放給AH中
※#個人理解:
加上[ ]就表示需要到暫存器以外的地方尋找位址了,此時應先考慮在記憶體的哪個段,然後直接找這個段所給的位置。一般來說預設在資料段。
2. 暫存器間接定址
#※ 運算元存放在記憶體中,資料在記憶體中的偏移位址為方括號[ ]中通用暫存器的內容。
※ 常用四個通用暫存器(這四個暫存器又叫做間址暫存器,分別是BX、BP、SI、DI),可用來存放資料的偏移位址。 (間址暫存器又分為基址暫存器BX、BP與變址暫存器SI、DI)
※ 間接定址的一般格式:
eg:MOV BX,1200H ;這裡是立即定址,即將操作數直接送給BX,此時BX=1200H
MOV AX,[BX] ;這裡是[BX] =[1200H],所以就轉換成了直接尋址,只是多了BX這個中間代理,此時將代碼段中的偏移地址為1200H的單元內容賦值給AL,1201H單元的內容賦值為AH
※間接定址就是由暫存器間接給予運算元的偏移位址
#※運算元的段位址(運算元處於哪一個區段)取決於選擇哪一個間址暫存器(可以段重設)
※ BX、SI、DI預設在資料段;BP預設在堆疊段
※ 個人理解:
我們可以透過選擇的間址暫存器找到對應段,然後透過段的偏移量找到物理位置。當間接定址時,我們就可以找到來源運算元的實體位置。
物理位置=段基底位址*16 偏移位址。
3. 暫存器相對尋址
#※ 運算元的偏移位址為暫存器的內容加上一個位移量
※eg:MOV AX,2000H ;立即定址,2000H賦給AX
MOV DS,AX ;DS從AX這裡取得段首位址
MOV BX,1200H ;立即定址,將1200H賦給BX
MOV AL,[BX]5 ;相對尋址,將位於段基位址為2000H,偏斜移量為1200H 5的內容賦給AL
※ 相對尋址主要用於一維數組的操作
※ 常將位移量作為表頭位址,間址暫存器的值作為表內相對位址(使用間會有常數,會有不便)
#※ 個人理解:
相對尋址就是在間接尋址的基礎上增加了一個位移常數,因此判別是間接尋址還是相對尋址的方法就是:看間址寄存器前後有沒有常數,有常數的就是相對尋址
4. 基址變址定址
#※ 運算元的偏移位址為:
一個基址暫存器(BX、BP)的內容一個變址暫存器(SI、DI)的內容
※ 其中BX預設在資料段BP預設在堆疊段
※ 操作數的段位址由選擇的基址暫存器決定
#※ 同相對尋址一樣,主要用於一維數組的操作
※eg:MOV SI,1100H ;立即尋址,1100H賦值給SI
MOV BX,SI ;將1100H賦值給BX
MOV AX,[SI BX] ;來源運算元的實體位址=資料段段基底位址*16 1100H 1100H
※ 個人理解:
基址變址尋址就是先找到基址暫存器所在的段首位址,再加上基址暫存器偏移量和變址暫存器的偏移量。它所存在的特徵是[BX][BP]兩者必有其一,[SI][DI]兩者必有其一
##5. 基底地址變址相對定址
※運算元的偏移位址為:
基址暫存器變址暫存器位移量※運算元的段位址由選取的基址暫存器決定
※基址變址相對定址方式主要用於二維數組的運算
※eg:MOV DI,1100H ;立即定址,將1100H賦給DI
MOV BP,DI ;將1100H賦給BPMOV AL,[BP][DI]5 ;BP說明操作數在堆疊段,其物理位址=堆疊段段段位址*16 1100H 1100H 5#※個人理解:
基址變址相對定址只是在基址變址的基礎上增加了一個常數偏移量,其來源操作數的物理位址便可以由此把握。
更多相關知識,請造訪:PHP中文網!
以上是記憶體運算元的定址方式有哪幾種的詳細內容。更多資訊請關注PHP中文網其他相關文章!