详解 指令寻址方式

1、指令的一般格式:

一条指令通常由两个部分组成:

  • 第一部分为操作码(指令码)用于指出指令要进行何种操作;
  • 另一部分是指令操作的对象,称为操作码;

在这里插入图片描述
8086 指令的长度在 1~7个字节之间。操作码占一个字节或两个字节。
指令的长度主要决定于操作数的个数及其采用的寻址方式。

指令在格式上就有以下3种形式:

  • 零操作数指令,指令在形式上只有操作码,操作数是隐含存在的;
  • 单操作数指令,指令中仅给出一个操作数,另一个操作数隐含存在;
  • 双操作数指令,指令中给出一个目标操作数,一个源操作数;

指令中的操作数类型

8086指令中的操作数主要有3种类型:立即数操作数、寄存器操作数、存储器操作数;

  • 立即数操作数:
    具有固定数值的操作数,即常数;在指令中,立即数操作数只能用作源操作数,而不能用作目标操作数;

  • 寄存器操作数:
    8086CPU 的 8个通用寄存器和 4个段寄存器可以作为指令中的寄存器操作数,可作为源操作数和目标操作数;通用寄存器存放参加运算的数据或数据所在存储器单元的偏移地址;段寄存器存放当前操作数的段基地址;

  • 存储器操作数:
    存储器操作数是指参加运算的数据,存放在内存中的,可作为源操作数、目标操作数;

指令的执行时间

一条指令的执行时间应包括 :取指令、取操作数、执行指令、传送结果;

三种类型的操作数中,寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢;


2、寻址方式

寻址方式,是指获得操作数所在的地址的方法。一般将寻址方式分为两种:

  • 寻找操作数的地址;
  • 寻找要执行的下一条指令的地址;

@1 立即寻址

指令格式:
MOV  AX , 1234H

立即数主要是给寄存器赋初始值;

立即寻址方式只针对源操作数,此时源操作数是一个立即数,它作为指令的一部分,紧跟在指令的操作码之后、存放于内存的代码段中;

立即数:通常把在立即寻址方式指令中给出的数称为立即数。立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。


@2 直接寻址

指令格式:
MOV  AX ,[1234H]

直接寻址方式表示参加运算的数据存放在内存中,指令中给出的是数据存放的偏移地址;

注意:
直接寻址指令中的数值是操作数的 16 位偏移地址,而不是数据本身,为了区分,指令系统规定偏移地址必须用方括号括起来;在此,可以理解为 C语言的 指针符号 ‘*’ ——解析指针,将其类比为解析其中的偏移地址;


@3 寄存器寻址

指令格式:
MOV  SI , AX

在寄存器寻址方式下,指令的操作数为 CPU 的内部寄存器,可以是数据寄存器(8位或16位),也可以是地址指针、变址寄存器、段寄存器;

E A = { A X B X C X D X C S D S E S S S B P S P S I D I EA = \begin{cases} 数据寄存器 \quad AX、BX、CX、DX \\ 段寄存器 \qquad CS、DS、ES、SS \\ 基址寄存器 \quad BP、SP \\ 变址寄存器 \quad SI、DI \end{cases}
EA:effective address 偏移地址(有效地址)

采用寄存器寻址方式,虽然指令操作码在代码段中,但操作数在内部寄存器中,指令执行时不必通过访问内存就可以取到操作数,故执行速度较快;


@4 寄存器间接寻址

指令格式:
MOV  AX , [SI]

寄存器间接寻址是用寄存器的内容表示操作数的偏移地址。

寄存器间接寻址方式中存放操作数偏移地址的寄存器只允许是 SI、DI、BX、BP;
选择不同的间接寻址寄存器涉及的段寄存器不同。在默认情况下:

  • 选择SI、DI、BX 作间接寻址寄存器时,操作数在数据段,段基地址由 DS决定;
  • 选择 BP 作间接寻址寄存器时,则操作数在堆栈段,段基地址由 SS 决定;


@5 寄存器相对寻址

指令格式:
MOV  BX , [BP - 8]

在寄存器相对寻址方式中,操作数在内存中的偏移地址由间接地址寄存器的内容加上指令中给出的一个 8 位或 16 位的位偏移量组成;

E A = { B X B P S I D I } + { 8 & 16 } EA=\begin{Bmatrix} BX \\ BP \\ SI \\ DI \end{Bmatrix}+ \begin{Bmatrix} 8位 \& 16位 \\位移量 \end{Bmatrix}

寄存器相对寻址常用于存取表格或一维数组中的元素 —— 把表格的起始地址作为作为位移量,元素的下标值放在间接地址寄存器中(反过来也可以);

如果有效地址超过 64KB ,则取64KB 的模;


@6 基址 - 变址 寻址

指令格式:
MOV AX , [BX - SI]

基址 - 变址寻址方式由一个基址寄存器(BX 或 BP)的内容和一个变址寄存器(SI 或 DI)的内容相加而形成操作数的偏移地址;

E A = { B X B P } + { S I D I } EA=\begin{Bmatrix} BX \\ BP \end{Bmatrix}+ \begin{Bmatrix} SI \\ DI \end{Bmatrix}

在默认情况下

  • 指令中若用 BX 作基址寄存器,则段地址在 DS 中;
  • 指令中若用 BP 作基址寄存器,则段地址在 SS 中;


@7 基址 - 变址 - 相对寻址

指令格式:
MOV  AX , [BX + DI +5]

基址 - 变址 - 相对寻址方式是 基址 - 变址寻址方式的扩充;

E A = { B X B P } + { S I D I } + { 8 & 16 } EA=\begin{Bmatrix} BX \\ BP \end{Bmatrix} + \begin{Bmatrix} SI \\ DI \end{Bmatrix} + \begin{Bmatrix} 8位 \& 16位 \\位移量 \end{Bmatrix}

指令中指定一个基址寄存器和一个变址寄存器,还给出一个 8位 或 16位 的位移量,将三者相加就得到操作数的偏移地址;

使用这种寻址方式可以很方便地访问二维数组;
与寄存器间接寻址方式类似,基址 - 变址 - 相对寻址 指令也可以表示成多种形式;
同样地,基址 - 变址 - 相对寻址 也不允许在指令中同时出现两个基址寄存器或两个变址寄存器;


@8 隐含寻址

有些指令的操作码中不仅包含了操作的性质,还隐含了部分操作数的地址;这种将一个操作数隐含在指令码中的寻址方式就是隐含寻址;

猜你喜欢

转载自blog.csdn.net/ViatorSun/article/details/105722439
今日推荐