1、寻址
根据指令内容确定操作数地址的过程,称为寻址。
2、在计算机中操作数地址的形成就是寻址方式。
8086系统中的操作数:
定义:操作数是由指令直接提供,用于对寄存器赋初值
特点
例如
MOV AL, 06H
MOV AX, 3306H
格式:指令 数据
,第一个是把06H赋值给AL(一个字节),第二个是把3306H赋值给AX(一个字,两个字节)
定义:操作数在CPU内部的寄存器中,指令给出寄存器名。
特点
例如
MOV AH, BL
MOV AX, BX
MOV CX, AX
就是把后面寄存器中的内容赋值给前面寄存器
理解存储器寻址之前,首先要说明下有效地址和物理地址。
(1)有效地址(Effective Address)
根据寻址方式计算所得的地址叫做有效地址(EA),也就是段内偏移地址。有效地址还需要与相应的端基址地址组合才是20位的物理地址,该工作由CPU完成。
(2)物理地址(Physical Address)
物理地址 = 段地址×16D + 偏移地址
= 段地址×10H + 偏移地址
= 段地址左移4位 + 偏移地址
1、直接寻址
定义:操作数在存储器中,其有效地址由指令直接提供。直接寻址中,指令的操作码后面直接给出了操作数的16位偏移地址(有效地址 EA)。
例如:MOV AX, [1070 H]
[ ]表示存储器地址,里面存放偏移量
段地址:因为是在代码段中,所以代码段段地址DS = 2000H
偏移地址:直接给出了,所以EA = 1070H
物理地址:段地址偏移4位,加上偏移地址
PA = 16*DS + EA
= 20000H + 1070H
= 21070H
2、寄存器间接寻址(Register Index Addressing)
定义:操作数在存储器中,寻址方式同直接寻址相似,但偏移地址由指针寄存器提供。
指针寄存器
基址寄存器:BP 和 BX
变址寄存器:SI 和 DI
(1)在默认的情况下,当使用BX,SI,DI寄存器时,表示操作数在当前数据段(DS给出段基址)
操作数物理地址:
PA=16*DS+EA
EA=(BX 或 SI 或 DI)
(2)当使用 BP 时,表示操作数在当前堆栈段(SS 给出段基址)
操作数物理地址:
PA=16*DS+EA
EA=BP
例如:MOV AX, [BX]
段基址:DS=2000H
偏移地址:EA=1000H
物理地址:PA=16*DS+EA=21000H
3、寄存器相对寻址(Register Relative Addressing)
定义:操作数在存储器中,并且一般指定BX、BP、SI、DI的内容进行间接寻址,但是操作数的有效地址EA(即偏移量)还要加上指令中指定的8位或16位位移量(Displacement)
使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS
例如:MOV AL, [BX+5]
段基址:DS=6000H
偏移地址:EA=2000H+05H=2005H
物理地址:PA=16*DS+EA=62005H
4、基址变址寻址(Based Index Addressing)
定义:8086指令西铜允许把基址寄存器和变址寄存器组合起来构成一种新的寻址方式,叫做基址变址寻址。操作数一定在存储器中,操作数的有效地址EA是由指令指定的一个基址寄存器(如BX、BP)内容加上一个变址寄存器(如SI、DI)的内容。
使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS
例如:MOV AX, [BX+SI]
段基址:DS=5000H
偏移地址:EA=BX+SI=2006H
物理地址:PA=16*DS+EA=52006H
5、相对基址变址寻址(Relative Based Indexed Addressing)
定义:操作数的有效地址是一个基址寄存器内容、一个变址寄存器内容和8位或16位位移量这三者之和。
使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS
例如:MOV AX, [BX+SI]
段基址:DS=4000H
偏移地址:EA=BX+DI+1234H=1444H
物理地址:PA=16*DS+EA=41444H
I/O端口:独立编址,用专门的IN和OUT指令对I/O端口进行操作。
因此可以寻址的端口可达65536(2^16)个
1、直接端口寻址
定义:IN 与 OUT 指令为二字节指令,指令代码的第二字节为端口的直接地址,直接端口寻址个数为0~255个。
IN AL, 60H; 将60H中的数据送到AL中
IN AX, 80H; 将80H和81H中数据送到AX中
注意:IN和OUT指令不支持立即数寻址,所以指令中出现的数据时直接寻址的端口地址
2、寄存器的间接端口寻址
定义:当端口地址大于255时,必须先把端口地址送到DX寄存器中。
MOV DX, 333H; 将端口地址送入DX
OUT DX, AL; 将AL中的数据输出到DX指定端口
MOV DX, 330H; 将端口地址送入DX
IN AL, DX; 将DX所指端口中的数据送到AL
注意:这里只能用DX作为I/O指令的间接寻址寄存器,不能用其他寄存器作为I/O指令的间接寻址