寻址模式
-处理器提供多种寻址模式,以有效地访问指令执行中使用的数据。
§寄存器模式(Register Addressing Mode) 和 立即数模式(Immediate mode)
-当有一个操作数是寄存器的时候就是寄存器寻址,
-当有一个操作数是立即数的时候就是立即数寻址例如:
MOV AX,BX ; 寄存器模式
ADD BYT,BL ; 寄存器模式
MOV DX,0 ; 立即数模式, DX里存储常数0
§直接模式(Direct Addressing Mode)和 间接模式(Indirect Addressing Mode)
-直接模式在操作数是内存变量时使用
-间接模式是寄存器具有内存变量地址的模式,用于数组地址的索引增加或减少
-间接模式以[寄存器]的形式呈现,只有BX、SI、DI和BP可用 例如:
MOV WRD,BX ; 直接寻址
MOV AX,[BX] ; (DS:BX)的内存存储到 AX里(间接寻址)
MOV [SI],BX ; BX的存储到 (DS:SI)里(间接寻址)
例:编写汇编代码,使100个字节数组ArrayW中的每个元素都为零;间接寻址模式
MOV CX,100 ;循环次数100次
LEA BX,ArrayW ;取ArrayW的偏移地址存储到BX里
@TOP:
MOV [BX],0 ;数组元素ArrayW[i]里存储0
INC BX ;地址寄存器BX加1
LOOP @TOP ;循环
§基址寻址(Base Pointer Addressing Mode)和 变址寻址(Indexed Addressing Mode)
-操作数的偏移地址是通过在寄存器中的内容加上位移获得的。
-位移包括变量的偏移地址、常数、(变量的偏移地址±常数)
基址寻址模式(使用BX和BP寄存器)
- [寄存器+位移]: MOV AX,[BX+ArrayW]
- [位移+寄存器]: MOV AX,[ArrayW+BX]
- [寄存器]+位移: MOV AX,[BX]+ArrayW
- 位移[寄存器]: MOVAX,ArrayW[BX]
变址寻址模式(使用SI,DI寄存器)
- [寄存器+位移]: MOVAX,[SI+ArrayW]
- [位移+寄存器]: MOV AX,[ArrayW+SI]
- [寄存器]+位移:MOV AX,[SI]+ArrayW
- 位移+[寄存器]: MOVAX,ArrayW+[SI]
- 位移[寄存器]:MOV AX,ArrayW[SI]
例:使用基址寻址模式编写代码,使100个字数组ArrayW中的每个元素都为零。
MOV CX,100
XOR BX,BX
@TOP:
MOV ArrayW[BX],0
ADD BX,2
LOOP @TOP
例:分别使用 寄存器间接模式 和 变址寻址模式 编写;将50个字数组ArrayW中的每个元素复制到数组ArrayP
寄存器间接寻址模式 | 基址寻址模式/变址寻址模式 | |
ArrayW | 地址值 | 位移 |
(1)初始化 | 存储数组ArrayW的基地址 | 0 |
(2)数组个数 | 1个 : 方便使用 多个 : 每个数组都需要地址寄存器 | 具有相同元素大小的数组使用相同的地址寄存器 |
示例 | [BX], [SI] | ArrayW[SI], ArrayP[SI] |
例:使用INDECM程序;用寄存器间接模式;输入5个字元素,存到数组ArrayA,并生成输出数组的总和的程序。
.MODEL SMALL
.STACK 100H
.DATA
ArrayA DW 5 DUP (?) ;未初始化5个元素的ArrayA
.CODE
MAIN PROC
MOV AX,@DATA ;取DATA地址
MOV DS,AX ;再传到DS里
MOV AH,2
MOV DL,'?'
INT 21H ;输出问号
MOV CX,5 ;CX存5用于循环
XOR BX,BX ;BX初始化0
LEA SI,ArrayA ;取ArrayA的地址到SI
@IN_SUM:
CALL INDECM ;调用程序INDECM
MOV [SI],AX ;把输入的存储到ArrayA[i]里
ADD BX,AX ;BX用于存储总和,把AX的值到BX里
ADD SI,2 ;因为是DW类型所以地址寄存器增加2
LOOP @IN_SUM ;循环IN_SUM,CX减1
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;输出回车
MOV AX,BX ;把存储总和的BX存到AX里
CALL OUTDECM ;调用OUTDECM
MOV AH,4CH
INT 21H
MAIN ENDP
INCLUDE INDECM.ASM
INCLUDE OUTDECM.ASM
END MAIN