以 MOV 指令为例
1. 立即寻址方式* —— 操作数在指令中给出
MOV AL, 5
MOV AX, 3064H
* 只能用于SRC字段 ? MOV 5, AL
* SRC 和 DST的字长一致 ? MOV AH, 3064H
2. 寄存器寻址方式* —— 操作数在指定的寄存器中
MOV AX, BX
MOV AL, BH
* 字节寄存器只有 AH AL BH BL CH CL DH DL
* SRC 和 DST的字长一致 MOV AH, BX
* CS不能用MOV指令改变 MOV CS, AX
3. 直接寻址方式* —— 有效地址EA由指令直接给出
有效地址EA:操作数的偏移地址
物理地址PA = 16d ? (DS) + EA
例:MOV AX, [2000H]
EA=2000H, 假设(DS)=3000H, 那么(PA)=32000H
例:操作数地址可由变量(符号地址)表示
MOV AH, VALUE ( VALUE DB 10 )
* 隐含的段为数据段 DS
* 可使用段跨越前缀 MOV AX, ES :[2000H]
* 使用变量时,要注意变量的属性
VALUE DB 10
MOV AX, VALUE ;错误
MOV AL, VALUE
MOV AX, WORD PTR VALUE
* 适于处理单个变量
4. 寄存器间接寻址方式
* ——EA在基址寄存器(BX/BP) 或变址寄存器(SI/DI)中
BX, SI, DI ->(DS)
物理地址 = 16d * (DS) + (BX)
物理地址 = 16d * (DS) + (SI)
物理地址 = 16d * (DS) + (DI)
BP ->(SS)
物理地址 = 16d * (SS) + (BP)
MOV AX, [BX]
PA = 16d *(DS) + (BX)
MOV ES:[BX] , AX
PA = 16d *(ES) + (BX)
MOV DX, [BP]
PA = 16d *(SS) + (BP)
寄存器间接寻址方式*
* 不允许使用AX、CX、DX存放EA
MOV AX, [CX];错误
* SRC 和 DST的字长一致
MOV DL, [SI] ; [BX]指示一个字节单元
MOV DX, [DI] ; [BX]指示一个字单元
* 适于对数组、字符串、表格中的数据连续处理
5. 寄存器相对寻址方式*
有效地址 = (BX) + 8位或者16或位移量
有效地址 = (BP) + 8位或者16或位移量
有效地址 = (SI) + 8位或者16或位移量
有效地址 = (DI) + 8位或者16或位移量
例: MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI]
假设(DS)=3000H, (SI)=2000H, COUNT=3000H 那么 PA = 35000H
假设(35000H)=1234H, 那么 (AX)=1234H
* 适于数组、字符串、表格的处理
6. 基址变址寻址方式*
有效地址 = (BX) + (SI)
有效地址 = (BX) + (DI)
有效地址 = (BP) + (SI)
有效地址 = (BP) + (DI)
MOV AX, [BX][DI]
PA=(DS)×16d+(BX)+(DI)
或 MOV AX, [BP+DI]
PA=(SS)×16d+(BX)+(DI)
MOV AX, ES:[BX][SI]
PA=(ES)×16d+(BX)+(SI)
* 适于数组、字符串、表格的处理
* 必须是一个基址寄存器和一个变址寄存器的组合
MOV AX, [BX][BP] ;错误
MOV AX, [SI][DI] ;错误
7. 相对基址变址寻址方式*
有效地址 = (BX) + (SI) + 8位或者16或位移量
有效地址 = (BX) + (DI) + 8位或者16或位移量
有效地址 = (BP) + (SI) + 8位或者16或位移量
有效地址 = (BP) + (DI) + 8位或者16或位移量
MOV AX, MASK[BX][SI]
或 MOV AX, MASK[BX+SI]
或 MOV AX, [MASK+BX+SI]
* 适于堆栈处理和数组处理