8086的尋址方式數組
以 MOV 指令爲例oop
當即尋址 | MOV AX , 3069H | |
寄存器尋址 | MOV AL , BH | |
存儲器尋址post |
直接尋址 | MOV AX , [ 2000H ] |
寄存器間接尋址 | MOV AX , [ BX ] | |
寄存器相對尋址 | MOV AX , COUNT [ SI ] | |
基址變址尋址 | MOV AX , [ BP ] [ DI ] | |
相對基址變址尋址 | MOV AX , MASK [ BX ] [ SI ] |
—— 操做數在指令中給出spa
指令格式:code
MOV AL, 5
MOV AX, 3064H
MOV AL, ‘A’blog
* 只能用於 SRC 字段 MOV 40H, AL //F字符串
* SRC 和 DST 的字長一致 MOV AH, 3064H //Fget
— 操做數在指定的寄存器中string
MOV AX, BX
MOV AL, BH
MOV AX, 3064Hit
* 字節寄存器只有 AH AL BH BL CH CL DH DL
* SRC 和 DST 的字長一致 MOV AH, BX //F
* CS 不能用 MOV 指令改變 MOV CS, AX //F
操做數的偏移地址:有效地址EA(effective address)
*有效地址計算
EA = 基址 + (變址*比例因子)+ 位移量
16位尋址 | 32位尋址 | |
位移量 | 0,8,16位 | 0,8,32位 |
基址寄存器 | BX,BP | 任何32位通用寄存器包括ESP |
變址寄存器 | SI,DI | 任何32位通用寄存器除ESP |
比例因子 | 無 | 1,2,4,8 |
不容許跨段前綴:
串處理指令的目的串必須用ES段
PUSH和POP指令的源必須用SS段
指令必須放在CS段
物理地址:PA
— 有效地址EA由指令直接給出
例:MOV AX, [ 2000H ]
EA=2000H, 假設(DS)=3000H, 那麼PA=32000H
* 隱含的段爲數據段 DS
* 可以使用段跨越前綴 MOV AX, ES: [2000H]
* 操做數地址可由變量(符號地址)表示, 但要注意變量的屬性
VALUE DB 10
MOV AH, VALUE
MOV AX, VALUE //F
MOV AX, WORD PTR VALUE //T
— EA 在基址寄存器(BX/BP)或變址寄存器(SI/DI) 中
MOV AX, [BX] PA = 16d × (DS) + (BX)
MOV AX, ES:[BX] PA = 16d × (ES) + (BX)
MOV AX, [BP] PA = 16d × (SS) + (BP)
* 不容許使用AX、CX、DX 存放 EA
MOV AX, [CX] //F
* SRC 和 DST 的字長一致
MOV DL, [ BX ] ; [BX]指示一個字節單元
MOV DX, [ BX ] ; [BX]指示一個字單元
* 適於數組、字符串、表格的處理
指令格式: MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI]
假設 (DS)=3000H, (SI)=2000H, COUNT=3000H,
則: PA = 35000H
假設(35000H)=1234H, 那麼 (AX)=1234H
* 適於數組、字符串、表格的處理
指令格式:
MOV AX, [BX] [DI]
MOV AX, [BX+DI]
MOV AX, ES:[BX] [SI]
* 適於數組、字符串、表格的處理
* 必須是一個基址寄存器和一個變址寄存器的組合
MOV AX, [BX] [BP] //F
MOV AX, [SI] [DI] //F
MOV AX, MASK [BX] [SI]
或 MOV AX, MASK [BX+SI]
或 MOV AX, [MASK+BX+SI]
例:編寫一段顯示字符串STRING的程序
DATA SEGMENT
STRING DB ‘ HAPPY NEW YEAR! ’, 0DH , 0AH , ‘ $ ’
COUNT DW 17
DATA ENDS
( 1 ) 直接尋址
mov dl, string mov ah, 2 int 21h ; 顯示字符‘H’ mov dl, string+1 mov ah, 2 int 21h ; 顯示字符‘A’ : :
( 2 ) 寄存器間接尋址
mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 給 bx Next : mov dl, [bx] mov ah, 2 int 21h ; 顯示一個字符 inc bx loop next ; 循環指令
( 3 ) 寄存器相對尋址
mov cx, count ; mov cx, 17 mov si, 0 Next : mov dl, string[si] ; mov dl, [string+si] mov ah, 2 int 21h ; 顯示一個字符 inc si loop next ; 循環指令
( 4 ) 基址變址尋址
mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 bx mov si, 0 Next : mov dl, [bx] [si] ; mov dl, [bx+si] mov ah, 2 int 21h ; 顯示一個字符 inc si loop next ; 循環指令
( 5 ) DOS 顯示字符串功能
mov dx, offset string ; string的偏址 dx ; lea dx, string mov ah, 9 int 21h ; 顯示一串字符
EA= (基址寄存器) + (變址寄存器) × 比例因子 + 位移量
( 1 ) 比例變址尋址方式
例:MOV EAX, COUNT [ ESI * 4 ]
(2) 基址比例變址尋址方式
例:MOV ECX, [ EAX ][ EDI * 4 ]
(3) 相對基址比例變址尋址方式
例:MOV EAX, TABLE [ EBP ][ EDI * 4 ]
用來肯定轉移指令及轉子指令的轉向地址
段內尋址 |
段內直接尋址 | JMP NEAR PTR NEXT |
段內間接尋址 | JMP TABLE [ BX ] |
|
段間尋址 |
段間直接尋址 | JMP FAR PTR NEXT |
段間間接尋址 | JMP DWORD PTR [ BX ] |
例:
JMP NEAR PTR NEXT 近轉移 -32768 ~ +32767
JMP SHORT NEXT 短轉移 -128 ~ +127
轉向的有效地址是一個寄存器或存儲單元的內容。
(可用除當即數之外的任何一種數據尋址方式獲得)
例: TABLE = 20A2H (BX) = 1256H (SI) = 528EH
(DS) = 2000H (232F8H) = 3280H (264E4H) = 2450H
JMP BX ; (IP)=1256H JMP TABLE[BX] JMP WORD PTR TABLE[BX] ; (IP)=3280H ;20A2+1256=32f8 + 20000 = 232F8
JMP [BX][SI] JMP WORD PTR [BX][SI] ; (IP)=2450H
用指令中提供的轉向段地址和偏移地址取代CS 和 IP
例:
用存儲器中的兩個相繼字的內容取代CS 和 IP
(存儲單元的地址可用存儲器尋址方式獲得)
例: