《8086寻址方式》
寻址主要可以分为3类:
数据寻址
程序转移地址寻址(即查找下一条指令的地址)
端口寻址
解释一下端口:
端口也要编址,其编址方式有两种:
1.集中编址
即端口在内存中,占内存的空间进行编址
2.独立编址
端口独立与内存之外
这样有个好处是内存的空间更大了
但是在寻址的时候为了区分是端口的地址还是内存地址
我们要单独地再添加两条指令(在8086中就是IN与OUT)
其作用就是访问端口
与访问内存的指令区分开来
《寻址方式的划分》
根据数据的位置可以分为:
立即寻址(数据在指令中)
寄存器寻址(数据在寄存器中)
内存寻址(数据在内存中)
如果用寄存器进行间接寻址,那么能够使用的寄存器只有
SI 源变址寄存器
DI 目的变址寄存器
BX 基址寄存器
BP 基址指针寄存器
计算物理地址时,如果使用的是BX,SI,DI,则段基值隐含由DS提供
BP,由SS提供
《基址变址寻址》
操作数的偏移地址EA 为指令中基址寄存器 BR 内容 和 变址寄存器 IR 内容 之和
即[BR][IR]
注意 基址寄存器只有 BX BP
变址寄存器只有 SI DI
然后两两组合
《程序转移地址的寻址方式》
首先回顾一下 指令指针寄存器IP,用于存放下一条执行指令
这里直接寻址是指直接给出数据,
这里间接寻址是指用了寄存器来给出数据
在汇编语言上会看到这样的代码:
JMP WORD PTR [BX]
这里说明一下 PTR 与 WORD:
具体看此博客<-------
《段内寻址》
段内直接寻址 JMP SHORT NEXT(NEXT 为变量或者是标注,名字可变)
....
....
NEXT:ADDAL,[BX]
这个就是直接跳转到了 这里
段内间接寻址 JMP WORD PTR TABLE[BX] (TABLE 也是变量)
比如
TABLE[BX] 计算出的 物理地址为232F8H
其中的数据为3280H 这个数据直接给 IP
《段间寻址》
用指令中提供的转向段地址 和 偏移地址 取代原先的CS 和 IP
即运用在不同两段代码之间的跳转
由于需要 新的CS和IP (均为16位的数据,即要两个16位的数据),而寄存器只有一个16位
所以到寄存器中寻找数据是不行的
一定是在内存中找数据
如段间间接寻址:
JMP DWORD PTR [INTERS+BX]
这里DWORD是双字,低位字给IP,高位字给CS
具体看书P25
《8086的指令系统》
《数据传送类指令》
具体看书P26
偏移地址(Offset Address)或有效地址(EA,Effective Address) 段地址 PA 逻辑地址:PA:EA 物理地址:PA*16+EA 知道了上面这些来看下如下几个指令: MOV BP 3[BX+SI] 这个指令的含义为:将 DS:[BX+SI+3] 这个逻辑地址转化为物理地址后 将其保存的数据copy到寄存器BP中
地址传送指令
(1)传送偏移地址指令 LEA
LEA OPD OPS
指令含义为将偏移地址送入指定寄存器
如:
MOV BX, 0100H
MOV SI, 0210H
LEA BX,1234[BX+SI]
本来我们是要将 DS:[BX+SI+1234]这个逻辑地址转化为物理地址后,将其中保存的数放到BX中
但是这里这条指令LEA (注意后面EA,即偏移地址)
就是要将偏移地址放到指定寄存器中(这里即为BX)
所以我们不要转化 直接将 (BX+SI+1234)算出的结果放到 BX中
输入/输出指令
输入指令IN,输出指令OUT
IN AL, PORT
这条指令的含义为将端口号为PORT的这个端口中的内容交给AL这个寄存器
需要注意的是:
端口地址在0000h~00FFh范围内时,用8位地址值直接寻址即可;
只有端口地址在0100h~FFFFh范围内时,才必须通过DX寄存器间接寻址。
如:
MOV DX , 383H
IN AX,DX
383H 是16位的(其实他省略了前面的0,其实是0383H)
其要先将值交给DX,再用DX当做端口号,将端口的值输入到AX中
在0000h~00FFh范围内,端口地址使用8位地址值直接寻址即可,因为这个范围是I/O端口的常用地址范围。
这种直接寻址方式又被称为“端口地址空间”。
由于端口地址不属于内存地址空间,不能像访问内存一样直接寻址。
相反,需要通过DX寄存器来进行间接寻址。
具体来说,在执行IN或OUT指令时,DX寄存器中存储的值会被用作端口地址,从而实现对I/O端口的读写操作。
标签:8086,指令系统,端口,地址,指令,寄存器,寻址,BX From: https://www.cnblogs.com/cilinmengye/p/17296960.html