8086寻址方式

8086寻址方式详解

数据允许传输的方式

​ MOV指令只能在这些有箭头的流向使用,比如通用寄存器到通用寄存器,而不能立即数到立即数

寻址方式分类

​ 8086有三种基本的寻址方式:

  • 立即寻址(源操作数在指令中)MOV AL 26H
  • 寄存器寻址(源操作数在寄存器中)(执行速度最快)MOV DX AX
  • 存储器寻址(源操作书在存储器中)(执行速度最慢)

其中,存储器寻址(操作数一般存放在数据段,所以操作数的段地址默认为DS)还可以分为:

  • 直接寻址
  • 寄存器间接寻址
  • 寄存器相对寻址
  • 基址变址寻址
  • 相对基址变址寻址

存储器寻址:

约定与记忆方法:

​ 操作数的偏移地址称为有效地址,有效地址要加上方括号,以便与立即数区别(方括号代表着相对地址或者加法

  • “相对”与“直接”代表着用一个数值偏移量(立即数)
  • “寄存器”代表着基址或者变址寄存器,基址与变址寄存器不同时使用
  • “变址”代表着在使用基址寄存器的基础上,进一步使用了变址寄存器

直接寻址方法:

  • 直接寻址:MOV AX,[2000H] 省略掉段地址,使用默认的DS
  • 超越段前缀:使用冒号修改段前缀 MOV AX,ES:[500H]
  • 符号地址:使用一个符号代替数值,汇编之后本质与直接寻址一样

寄存器间接寻址:

​ 指令中使用寄存器的值为操作数的有效地址,例如 MOV BX,DS:[BP]

寄存器相对寻址:

​ 在间接寻址的基础上再加上一个位移量(偏移量是数值)。此时没有冒号的方括号可以理解为加法:MOV AX,COUNT[SI](基地址默认使用了DS)

基址变址寻址:

​ 使用基址寄存器和变址寄存器,类似于寄存器相对寻址将数值变为寄存器内数值:MOV AX,[BX][SI](段地址使用了DS,两个方括号就是加法)

相对基址变址:

​ 在基址变址的基础上再加入一个数值偏移量(因此加上一个“相对”):MOV AX,MASK[BX][SI]

其他寻址方式(I/O端口寻址):

​ 由于8086端口有64k个(共计 2162^{16} 个地址),I/O 端口寻址默认使用立即数为8位,因此两种寻址方式为使用8位的直接寻址和使用16位的相对寻址

  • 直接寻址方式:IN AL,63H
  • 相对寻址方式:MOV DX,213H IN AL,DX