【微机原理与接口 4】—— 寻址方法与指令系统 1(16位寻址方式解析)

在之前的 B l o g Blog 中,我们学习了 8088/8086 CPU 内存管理的方式,也知道了逻辑地址的计算方法。既然我们知道了一个数据在内存里面的地址,那么下一步就是如何去找到它。因此,本文重点介绍 16 位 CPU的寻址方式。我们开始吧!

一、立即数寻址

【立即数寻址】:这里比较简单,就是我们把一个数直接在指令里面给出来,然后把这个数赋值给目标操作数。我们举个例子: M O V A X , 1234 H MOV AX, 1234H 这句话里面,1234H 就是我们的源操作数,这里它就仅仅只代表数,没有地址的意思。那么完成的就是把 1234H 赋值给 AX,其中:12H 放在 AH,34H 放在 AL

但是,一般这种寻址方式我们只会在赋初值的时候才会用。

二、寄存器寻址

寄存器寻址,就是我们不直接在指令里面给出源操作数,而是把这个源操作数放在一个寄存器里面,通过寄存器来赋值。

例如: M O V A X , B X MOV AX, BX 就是把通用寄存器 BX 里面存放的数据赋值给 AX。这里就需要注意 (源寄存器和目标寄存器的大小一定要相同)

在这里插入图片描述

三、存储器寻址

3.1 直接寻址

直接寻址的意思是,我们直接在指令里面给出源操作数的偏移地址,例如: M O V A X , [ 3000 H ] MOV AX, [3000H]
这里,我们就给出了源操作数的偏移地址是 3000H,那么段地址去哪了?

在没有特殊声明时,默认数据都在数据段 DS,如果数据是在其他段,例如附加段 ES,那么需要通过段超越的方式: M O V A X , E S : [ 3000 H ] MOV AX, ES:[3000H]

下图所示过程执行的是指令: M O V A L , [ 2000 H ] MOV AL, [2000H]

在这里插入图片描述

直接寻址看起来简单易懂,但是有一个大问题:假设我们要计算1+2+ \cdots +100,假设 1 位于存储器的第100个单元,如果采用直接寻址的方式,我们首先:要写出第一个地址,赋值、再写第二个地址,赋值、再相加、继续写地址,赋值、、、、这样一来,这个简单的问题都快需要几百行指令了,这显然十分麻烦,因此也有了下面的寄存器间接寻址。

3.2 寄存器间接寻址

这里是通过把偏移地址放在寄存器中的寻址方式。用于存放数据在内存中的偏移地址的,只能有 4 个通用寄存器:BX, BP, SI, DI。
如果存放偏移地址的是寄存器:BX, SI, DI, 那么默认的段就是数据段 DS;
如果存放偏移地址的是寄存器:BP,那么默认的段就是 堆栈段 SS

例子: M O V A X , [ B X ] MOV AX ,[BX] 这就说明数据的偏移地址存放在 BX 里面,由于没有使用段超越,所以段默认是数据段 DS。但是这个例子里面取完数据赋值是有讲究的:

因为我们知道:16位 CPU 它这个内存单元一个就是 8位的,我们通过 [BX] 所访问到的就是一个存储单元,也就是说,我们只取出了1个数,这个数是 8 位的。但是想要赋值的寄存器 AX 是 16位的,因此这时,我们还需要再往下多取一个8位二进制数,作为高位,存放在 AH。

下图所示的过程执行的是指令: M O V A X , [ B X ] MOV AX ,[BX]

在这里插入图片描述
通过寄存器间接寻址,我们通过使寄存器自增,那么就可以构成循环,完成上面一节的问题

3.3 基址寻址

采用基址寻址时,我们的偏移地址是这样表示的:[基址寄存器] + 偏移量

这里,偏移量是一个常数,而能够存放基址的,只有 BP 和 BX。在使用 BX 时,默认的段就是数据段DS;在使用 BP 时,默认的段就是堆栈段 SS

例子: M O V A L , [ B X + 5 ] MOV AL, [BX+5]

下图所示过程展示的是指令: M O V A L , [ B X + 5 ] MOV AL, [BX+5]
在这里插入图片描述

3.4 变址寻址

上面我们采用的偏移地址表示是 [基址寄存器] + 偏移量,而在变址寻址中,我们偏移地址的表示就是:[变址寄存器] + 偏移量。

在16位变址寻址中,变址寄存器只能是 SI 、 DI,且它们都是默认段是 DS

变址寻址主要的目的是为了一维数组的操作,因为我们知道,要想访问一维数组,需要有表头,还要有数组内数据和表头的距离。那么我们常常用那个常数偏移量代表表头,有寄存器的变化代表数组内元素距表头的距离。

例子: M O V A H , [ S I + 5 ] MOV AH, [SI+5]

3.5 基址变址寻址

类似的,在这种寻址方式下,我们的偏移地址就表示成:[基址寄存器] + [变址寄存器]

基址+变址的目的是为了用于二重循环和对二维数组的操作。例如: M O V A X , [ B X + S I ] MOV AX, [BX+SI]
说明:在这种寻址模式下,哪个段主要取决于基址寄存器

下图展示的是指令: M O V A X , [ B X + S I ] MOV AX, [BX+SI]
在这里插入图片描述

3.6 带位移的基址加变址寻址方式

一样地,这里偏移地址的表示方式是:[基址寄存器]+[变址寄存器]+偏移量]
例如: M O V A X [ B X + S I + 0002 H ] MOV AX [BX+SI+0002H]

说明一下:上述的有一些寻址方式,例如: M O V [ D I ] , A L MOV [DI], AL 这样写也是OK的,他的意思就是将 A L AL 内部的值传送给 D I DI 里面存的地址所指向的内存单元。

发布了140 篇原创文章 · 获赞 411 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_44586473/article/details/104818317