8086CPU的寻址方式

基本概念

1、寻址
根据指令内容确定操作数地址的过程,称为寻址。

2、在计算机中操作数地址的形成就是寻址方式。
8086系统中的操作数:

  1. 立即操作数:操作数包含在指令中。
  2. 寄存器操作数:操作数包含在 CPU 的某个内部寄存器中。
  3. 储存器操作数:约定操作数放在储存器中存放数据的某个单元。
  4. I/O操作数

3、寻址具体分类
8086CPU的寻址方式_第1张图片

一、立即数寻址(Immediate Addressing)

定义:操作数是由指令直接提供,用于对寄存器赋初值
特点

  1. 不需要执行总线周期,执行速度快
  2. 立即数只能是整数,不能是小数、变量或其它类型的数据
  3. 立即数只能所谓源操作数,不能作为目的操作数

例如

MOV AL, 06H
MOV AX, 3306H

格式:指令 数据,第一个是把06H赋值给AL(一个字节),第二个是把3306H赋值给AX(一个字,两个字节)

二、寄存器寻址(Register Addressing)

定义:操作数在CPU内部的寄存器中,指令给出寄存器名。
特点

  1. 不需要使用总线周期,执行速快
  2. 可采用 8 个寄存器:AX,BX,CX,DX,BP,SP,SI,DI
  3. 源操作数和目的操作数均可采用寄存器寻址

例如

MOV AH, BL
MOV AX, BX
MOV CX, AX

就是把后面寄存器中的内容赋值给前面寄存器

三、存储器寻址

8086CPU的寻址方式_第2张图片

理解存储器寻址之前,首先要说明下有效地址物理地址
(1)有效地址(Effective Address)
根据寻址方式计算所得的地址叫做有效地址(EA),也就是段内偏移地址。有效地址还需要与相应的端基址地址组合才是20位的物理地址,该工作由CPU完成。
(2)物理地址(Physical Address)

物理地址	= 段地址×16D + 偏移地址
		= 段地址×10H + 偏移地址
		= 段地址左移4位 + 偏移地址

1、直接寻址
定义:操作数在存储器中,其有效地址由指令直接提供。直接寻址中,指令的操作码后面直接给出了操作数的16位偏移地址(有效地址 EA)。
8086CPU的寻址方式_第3张图片
例如:MOV AX, [1070 H]
[ ]表示存储器地址,里面存放偏移量
段地址:因为是在代码段中,所以代码段段地址DS = 2000H
偏移地址:直接给出了,所以EA = 1070H
物理地址:段地址偏移4位,加上偏移地址

PA  = 16*DS + EA
	= 20000H + 1070H
	= 21070H

2、寄存器间接寻址(Register Index Addressing)
定义:操作数在存储器中,寻址方式同直接寻址相似,但偏移地址由指针寄存器提供。

指针寄存器
基址寄存器:BP 和 BX
变址寄存器:SI 和 DI

8086CPU的寻址方式_第4张图片8086CPU的寻址方式_第5张图片

(1)在默认的情况下,当使用BX,SI,DI寄存器时,表示操作数在当前数据段(DS给出段基址)
操作数物理地址:

PA=16*DS+EA
EA=(BX 或 SI 或 DI)

(2)当使用 BP 时,表示操作数在当前堆栈段(SS 给出段基址)
操作数物理地址:

PA=16*DS+EA
EA=BP

8086CPU的寻址方式_第6张图片
例如:MOV AX, [BX]
段基址:DS=2000H
偏移地址:EA=1000H
物理地址:PA=16*DS+EA=21000H

3、寄存器相对寻址(Register Relative Addressing)
定义:操作数在存储器中,并且一般指定BX、BP、SI、DI的内容进行间接寻址,但是操作数的有效地址EA(即偏移量)还要加上指令中指定的8位或16位位移量(Displacement)
8086CPU的寻址方式_第7张图片

使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS

8086CPU的寻址方式_第8张图片
例如: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)的内容。
8086CPU的寻址方式_第9张图片
使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS

8086CPU的寻址方式_第10张图片
例如:MOV AX, [BX+SI]
段基址:DS=5000H
偏移地址:EA=BX+SI=2006H
物理地址:PA=16*DS+EA=52006H

5、相对基址变址寻址(Relative Based Indexed Addressing)
定义:操作数的有效地址是一个基址寄存器内容、一个变址寄存器内容和8位或16位位移量这三者之和。
8086CPU的寻址方式_第11张图片
使用BX,SI,DI寄存器时,默认的段寄存器为DS
使用BP时,默认的段寄存器为SS

8086CPU的寻址方式_第12张图片
例如:MOV AX, [BX+SI]
段基址:DS=4000H
偏移地址:EA=BX+DI+1234H=1444H
物理地址:PA=16*DS+EA=41444H

四、I/O端口寻址

I/O端口:独立编址,用专门的IN和OUT指令对I/O端口进行操作。

  1. 当端口地址小于等于255(FFH)时,直接寻址
  2. 当端口地址大于255(FFH),只能用DX作为间接寻址

因此可以寻址的端口可达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指令的间接寻址

你可能感兴趣的:(微机原理)