位移量:數組首地址
基址寄存器:數組元素行址 BP、BX
變址寄存器:數組元素列址 SI、DI
設ARRAY是10行、10列二維數組,按行存放在主存的堆棧段中,每個元素占一個字節單元。
MOV AL,ARRAY[BP] [SI]
ARRAY(i,j)等價于:(BP)=i×10 (SI)=j
所以:EA=ARRAY的偏移量+(BP)+(SI),段基址隱含由SS提供
下面介紹一下基址變址尋址方式:
變址尋址:EA是SI、DI和位移量提供 基址尋址:EA是BX、BP和位移量提供
MOV CH,10H[SI] == MOV DS:CH,10H[SI]
MOV TAB[DI],AX == MOV DS:TAB[DI],AX
MOV AL,ARY[BX] == MOV DS:AL,ARY[BX]
MOV STR[BP],DX == MOV SS:STR[BP],DX
例如:用變址尋址方式訪問一維數組,一維數組ARY存放在主存的數據段中,每個元素占兩個字節單元。從數組首地址起依次存放:ARY(0)、ARY(1)、……、ARY(i)、……
可以通過下列指令來訪問數組中的任意元素:
MOV AX, ARY[SI]
訪問ARY(i),則(SI)=i×2
所訪問元素的邏輯地址:EA=ARY的偏移量(數組首址)+(SI)
段基址隱含由DS提供
從上邊的兩個小例子,基址變址尋址方式訪問二維數組&&變址尋址方式訪問一維數組,總結一下8086/8088的尋址方式。
概括的說尋址方式就是尋找操作數的地址的方式,一共有8種方式:
寄存器尋址方式
立即數尋址方式
存儲器尋址方式
串操作尋址方式
I/O端口尋址方式
其中存儲器尋址方式包含4種:
直接尋址方式
寄存器間尋址方式
變址基址尋址方式
基址變址尋址方式
這是視頻教程中的分類方法,不同的教程分類方式不一樣,重點是理解尋址過程。下面舉一些例子來說明各種尋址的具體方式。上面得8種方式前3大類(6小類)是重點,而后邊的串操作尋址方式、I/O端口尋址方式這里先不做討論。
寄存器尋址方式:
指令所需的操作數在寄存器中,按指令給出的寄存器地址去獲得操作數。
指令代碼 操作碼 REG(操作數)
當然此處的操作數可能不是一個,但要求是REG,也就是操作數存儲在寄存器中,根據操作碼定義的操作在REG中取操作數。
MOV AX,BX
MOV BL,AL
MOV BP,DX
MOV DS,AX
很顯然操作碼后邊的操作數都是REG,有通用寄存器,也有段寄存器,至于專用寄存器教程中沒有涉及到,不知道能不能用。CPU內的寄存器有三類14種,分類如下:
通用寄存器
|
專用寄存器
|
段寄存器
|
|||||||||||
數據寄存器
|
指針寄存器
|
變址寄存器
|
指令指針
IP
|
狀態指針
FLAG
|
代碼段
CS
|
數據段
DS
|
堆棧段
SS
|
附加段
ES
|
|||||
AX
|
BX
|
CX
|
DX
|
堆棧指針SP
|
基址指針BP
|
源變址
SI
|
目的變址
DI
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
指令所需的操作數直接在指令代碼中,隨著取指令(代碼段中)一起取到BIU的指令隊列中,常用來提供常數,且立即數只能做源操作數。
MOV CX,1000H
MOV AL,0AH
MOV AH,'A'
MOV DX,"AB"
以下4種尋址方式為存儲器尋址方式,操作數在內存儲器中,在匯編語言程序中,根據存儲器按段劃分(不連續)的思想,存儲單元地址使用邏輯地址:
段基址:偏移量
存儲器尋址方式重點是形成操作數邏輯地址的偏移量。這個偏移量是相對而言的,分偏移量組合形成最終偏移量也就是有效地址EA,雖然有效地址也不是物理地址,而是相對于段基址的邏輯地址。物理地址的算法:
物理地址=段基址×16+偏移量
有效地址EA是三個地址分量的某種組合:
(1)位移量:指令代碼中的一個8/16位二進制數
(2)基地址:BX或BP得內容
(3)變址量:SI或DI的內容
正是上邊三種分量的組合形成了下面四種尋址方式(內存儲器尋址方式):
直接尋址方式:
指令所需要的操作數在存儲器中,操作數的有效地址EA直接由指令代碼中的位移量提供。匯編指令中,直接尋址方式可用數值地址或符號(事先有宏定義)地址來表示。
指令代碼 操作碼 | …… | 位移量(8/16位)
MOV BX,[1000H]
MOV BX,VAR
很顯然呀,后邊的操作數不加前綴有默認的段基址,加前綴的就用那個段基址,因此操作數地址是完全確定的,這就是直接尋址方式。
寄存器間尋址方式:
指令所需要的操作數存在存儲器中,操作數的有效地址EA直接從寄存器SI/DI/BX/BP中獲得。當然有效地址需要配合段基址形成實際地址。
指令代碼 操作碼|MOD REG R/M
注意兩點:
①以SI、DI、BX間接尋址時,隱含使用DS;
②以BP間接尋址時,隱含使用SS;
MOV CH,[SI]
MOV [DI],AX
MOV AL,[BX]
MOV [BP],DX
MOV CH,DS:[SI]
MOV DS:[DI],AX
MOV AL,DS:[BX]
MOV SS:[BP],DX
變址尋址或基址尋址方式:
指令所需要的操作數在存儲器中,操作數的有效地址EA是兩個地址分量之和。從下面的代碼格式可以看出它和上邊尋址方式的主要區別就是分量的增加。
指令代碼 操作碼 | MOD REG R/M | 位移量
基址尋址:操作數的EA是SI或DI內容與位移量之和。
變址尋址:操作數的EA是BX或BP內容與位移量之和。