常见寻址方式
文章目录
1. 立即数寻址
最简单的寻址方式,直接将立即数传送给目的操作数。
MOV AX,9099H ;将立即数送给AX
2.寄存器寻址(寄存器直接寻址)
操作数存放在对应寄存器中。指令编码短,无需从存储器取操作数,执行快
MOV EDX,EBX
INC CL
MOV DS,AX
3. 直接寻址(存储器直接寻址)
操作数存放在存储器中,但有效地址由指令直接给出。EA和操作码一起存放在存储器代码段中
MOV AX,BUFFER ;将地址BUFFER处两个连续的字节地址中的操作数送给AX,BUFFER:存储器中存放单元的符号地址。
//假设BUFFER偏移地址为3000H,(DS)=5000H
MOV AX,DS:[3000H] ;将物理地址53000H中的内容送给AL,53001H送给AH
等价于:
MOV AX,[3000H];
若为其他段寄存器,需要加段超越前缀。
MOV AX,ES:[3000H];
4. 寄存器间接寻址
利用寄存器保存存储单元的地址,可以通过间接寻址访问所有存储单元。即操作数存放在存储器中,但其EA存放在寄存器中,即从EA读取地址,再到对应地址单元寻找对应内容。
E
A
=
[
寄
存
器
]
EA=[寄存器]
EA=[寄存器]
#16位寻址时,偏移地址存放在SI,DI,BP和BX
#1.以SI、DI、BX间接寻址,默认操作数在DS段
MOV AX,[DI]
#2.以BP间接寻址,默认操作数在SS(stack segment)段
MOV DX,[BP]
#如果操作数在其他段,需要在指令操作数前加段超越前缀。
5. 基址寻址
E A = [ 基 址 寄 存 器 ] + 位 移 量 EA=[基址寄存器]+位移量 EA=[基址寄存器]+位移量
16位寻址时默认:BX以DS作为段寄存器;BP以SS作为段寄存器
MOV AX,[BP+24] ;等价于 MOV AX,24[BP]
适用于对一维数组的数组元素进行检索
6. 变址寻址
E A = [ 基 址 寄 存 器 ] + 位 移 量 EA=[基址寄存器]+位移量 EA=[基址寄存器]+位移量
16位寻址时默认:仅SI、DI作为变址寄存器,并且默认以DS作为段寄存器
MOV AX,BUFFER[DI] ;BUFFER是偏移量等价于 MOV AX,[DI+BUFFER]
适用于对一维数组的数组元素进行检索
7.比例变址寻址
E A = [ 变 址 寄 存 器 ] × 比 例 因 子 + 位 移 量 EA=[变址寄存器]\times比例因子+位移量 EA=[变址寄存器]×比例因子+位移量
MOV AX,TABLE[EBP*4]
只适用于32位寻址。
8.基址加变址寄存器寻址
E A = [ 基 址 寄 存 器 ] + [ 变 址 寄 存 器 ] EA=[基址寄存器]+[变址寄存器] EA=[基址寄存器]+[变址寄存器]
一般规定由基址寄存器决定哪一个段寄存器作为基址指针。
MOV AX,[BP][SI] ;由SI决定默认为DS作为段基址寄存器
常用于二维数组的检索和二重循环
9.基址加比例变址寻址
E A = [ 变 址 寄 存 器 ] × 比 例 因 子 + [ 基 址 寄 存 器 ] EA=[变址寄存器] \times 比例因子+[基址寄存器] EA=[变址寄存器]×比例因子+[基址寄存器]
只有32位一种情况。
10.带位移的基址加变址寻址
E A = [ 变 址 寄 存 器 ] + [ 基 址 寄 存 器 ] + 位 移 量 EA=[变址寄存器]+[基址寄存器]+位移量 EA=[变址寄存器]+[基址寄存器]+位移量
MOV AX,[BX+DI+MASK]
这种寻址操作主要用于二维数组操作,位移量即为数组起始地址。
11.带位移的基址加比例变址寻址
E A = [ 变 址 寄 存 器 ] × 比 例 因 子 + [ 基 址 寄 存 器 ] + 位 移 量 EA=[变址寄存器]\times 比例因子+[基址寄存器]+位移量 EA=[变址寄存器]×比例因子+[基址寄存器]+位移量
$
MOV AX,[BX+DI+MASK]
这种寻址操作主要用于二维数组操作,位移量即为数组起始地址。
11.带位移的基址加比例变址寻址
E A = [ 变 址 寄 存 器 ] × 比 例 因 子 + [ 基 址 寄 存 器 ] + 位 移 量 EA=[变址寄存器]\times 比例因子+[基址寄存器]+位移量 EA=[变址寄存器]×比例因子+[基址寄存器]+位移量