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个(共计 个地址),I/O 端口寻址默认使用立即数为8位,因此两种寻址方式为使用8位的直接寻址和使用16位的相对寻址
- 直接寻址方式:
IN AL,63H
- 相对寻址方式:
MOV DX,213H IN AL,DX