立即数:四位十六进制,如1234H
寄存器:操作手在寄存器中
存储器:操作数有“[ ]”
七种叫法:
- 立即寻址方式
- 寄存器寻址方式
- 直接寻址方式
- 寄存器间接寻址方式
- 寄存器相对寻址方式
- 基址加变址寻址方式
- 相对基址加变址寻址方式
把一个数直接在指令里面给出来,然后把这个数赋值给目标操作数。如:把 1234H 这个数赋值给DX【数据寄存器】
但是,一般这种寻址方式我们只会在赋初值的时候才会用。
就是我们不直接在指令里面给出源操作数,而是把这个源操作数放在一个寄存器里面,通过寄存器来赋值。
例如:把通用寄存器 BX 里面存放的数据赋值给 AX。(源寄存器和目标寄存器的大小一定要相同)
直接寻址的意思是,我们直接在指令里面给出源操作数的偏移地址,例如:
这里,我们就给出了源操作数的偏移地址是 3000H,那么段地址去哪了?
在没有特殊声明时,默认数据都在数据段 DS,如果数据是在其他段,例如附加段 ES,那么需要通过段超越的方式:
下图所示过程执行的是指令: MOV AL , [2000H]
直接寻址看起来简单易懂,但是有一个大问题:假设我们要计算1+2+⋯+100,假设 1 位于存储器的第100个单元,如果采用直接寻址的方式,我们首先:要写出第一个地址,赋值、再写第二个地址,赋值、再相加、继续写地址,赋值、、、、这样一来,这个简单的问题都快需要几百行指令了,这显然十分麻烦,因此也有了下面的寄存器间接寻址。
这里是通过把偏移地址放在寄存器中的寻址方式。用于存放数据在内存中的偏移地址的,只能有 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。
采用基址寻址时,我们的偏移地址是这样表示的:[基址寄存器] + 偏移量
这里,偏移量是一个常数,而能够存放基址的,只有 BP 和 BX。
下图所示过程展示的是指令:MOV AL , [ BX + 5]
上面我们采用的偏移地址表示是 [基址寄存器] + 偏移量,而在变址寻址中,我们偏移地址的表示就是:[变址寄存器] + 偏移量。
在16位变址寻址中,变址寄存器只能是SI 、 DI,且它们都是默认段是 DS
变址寻址主要的目的是为了一维数组的操作,因为我们知道,要想访问一维数组,需要有表头,还要有数组内数据和表头的距离。那么我们常常用那个常数偏移量代表表头,有寄存器的变化代表数组内元素距表头的距离。
类似的,在这种寻址方式下,我们的偏移地址就表示成:[基址寄存器] + [变址寄存器]
基址+变址的目的是为了用于二重循环和对二维数组的操作。例如:
说明:在这种寻址模式下,哪个段主要取决于基址寄存器
下图展示的是指令: MOV AX , [ BX + SI ]
一样地,这里偏移地址的表示方式是:[基址寄存器]+[变址寄存器]+偏移量]
例如: