3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址

文章目录

  • 指令格式
  • 指令中的(目标 / 源)操作数来源
  • 一、立即数寻址
  • 二、寄存器寻址
  • 三、存储器寻址
    • 3.1 直接寻址
    • 3.2 寄存器间接寻址
    • 3.3 基址寻址 (寄存器相对寻址?)
    • 3.4 变址寻址(寄存器相对寻址?)
    • 3.5 基址变址寻址
    • 3.6 带位移的基址加变址寻址方式
    • 3.7 小结
  • ---------------------------------------------------------------------------------
  • 寻址方式中容易出现的错误
  • 另类写法
  • 练习题
    • 第1题
    • 第2题

指令格式

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第1张图片

指令中的(目标 / 源)操作数来源

立即数:四位十六进制,如1234H
寄存器:操作手在寄存器中
存储器:操作数有“[ ]”

七种叫法:

  1. 立即寻址方式
  2. 寄存器寻址方式
  3. 直接寻址方式
  4. 寄存器间接寻址方式
  5. 寄存器相对寻址方式
  6. 基址加变址寻址方式
  7. 相对基址加变址寻址方式

一、立即数寻址

把一个数直接在指令里面给出来,然后把这个数赋值给目标操作数。如:把 1234H 这个数赋值给DX【数据寄存器】
在这里插入图片描述

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



二、寄存器寻址

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

例如:把通用寄存器 BX 里面存放的数据赋值给 AX。(源寄存器和目标寄存器的大小一定要相同)
在这里插入图片描述



三、存储器寻址

3.1 直接寻址

直接寻址的意思是,我们直接在指令里面给出源操作数的偏移地址,例如:
在这里插入图片描述

这里,我们就给出了源操作数的偏移地址是 3000H,那么段地址去哪了?

在没有特殊声明时,默认数据都在数据段 DS,如果数据是在其他段,例如附加段 ES,那么需要通过段超越的方式:
在这里插入图片描述

下图所示过程执行的是指令: MOV AL , [2000H]
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第2张图片
直接寻址看起来简单易懂,但是有一个大问题:假设我们要计算1+2+⋯+100,假设 1 位于存储器的第100个单元,如果采用直接寻址的方式,我们首先:要写出第一个地址,赋值、再写第二个地址,赋值、再相加、继续写地址,赋值、、、、这样一来,这个简单的问题都快需要几百行指令了,这显然十分麻烦,因此也有了下面的寄存器间接寻址。



3.2 寄存器间接寻址

这里是通过把偏移地址放在寄存器中的寻址方式。用于存放数据在内存中的偏移地址的,只能有 4 个通用寄存器:BX, BP, SI, DI

BX:基址寄存器
BP:基址指针
SI:源变址寄存器
DI:目的变址寄存器

如果存放偏移地址的是寄存器:BX, SI, DI, 那么默认的段就是数据段 DS;
如果存放偏移地址的是寄存器:BP,那么默认的段就是堆栈段 SS


例子:
在这里插入图片描述
这就说明数据的偏移地址存放在 BX 里面,由于没有使用段超越,所以段默认是数据段 DS。但是这个例子里面取完数据赋值是有讲究的:

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

下图所示的过程执行的是指令: MOV AX , [ BX]
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第3张图片



3.3 基址寻址 (寄存器相对寻址?)

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

这里,偏移量是一个常数,而能够存放基址的,只有 BP 和 BX

  • 在使用 BX【基址寄存器】 时,默认的段就是数据段DS;
  • 在使用 BP 【基址指针】时,默认的段就是堆栈段 SS

例子:
在这里插入图片描述

下图所示过程展示的是指令:MOV AL , [ BX + 5]
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第4张图片



3.4 变址寻址(寄存器相对寻址?)

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

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

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

例子:
在这里插入图片描述



3.5 基址变址寻址

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

基址+变址的目的是为了用于二重循环和对二维数组的操作。例如:
在这里插入图片描述

说明:在这种寻址模式下,哪个段主要取决于基址寄存器

下图展示的是指令: MOV AX , [ BX + SI ]
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第5张图片



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

一样地,这里偏移地址的表示方式是:[基址寄存器]+[变址寄存器]+偏移量]
例如:
在这里插入图片描述



3.7 小结

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第6张图片



---------------------------------------------------------------------------------

寻址方式中容易出现的错误

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第7张图片



另类写法

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第8张图片
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第9张图片



练习题

第1题

在这里插入图片描述

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第10张图片
3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第11张图片

第2题

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址_第12张图片

你可能感兴趣的:(#,微机原理与接口技术,寻址方式,微机原理与接口技术)