《Intel 8086CPU的内部结构》
通用寄存器AX,BX,CX,DX
AX:累加器
BX:基址寄存器
CX:计数寄存器
DX:数据寄存器
具体师大书P12
专用寄存器BP,SP,DI,SI
BP:基址寄存器
SP:堆栈指针寄存器
DI:目的变址寄存器
SI: 源变址寄存器
段寄存器CS,DS,SS,ES
段寄存器主要是存放段基址,决定数据放哪一大块,
再通过偏移地址(通常是在其他寄存器中),来决定具体地址
CS:代码段寄存器
一般是不允许(用户无权限)进行对CS的更改,因为
一旦存放代码的地址变动会引起严重后果
DS:数据段寄存器
SS:堆栈段寄存器
ES:附加段寄存器
指令指针寄存器IP
用于存放下一条执行指令的偏移地址
CPU取指令总是以CS为段基址,IP为段内偏移地址
具体地址计算为CS*16+IP
即首先CS内保存的地址左移4位,再加上IP保存的地址
用户不能直接访问IP
标志寄存器FR
其为16位寄存器,使用9位
6位状态标志位,3位控制标志位
具体看P13
值得注意的是在DEBUG调试软件中
标志位显示的形式特殊,以字符形式显示:具体P14
上述寄存器都是16位的
《Intel 8086的存储器》
8086系统中按照字节编址
其可寻址的存储器空间为 1MB(2^20B),20根地址线,范围为00000H~FFFFFH
同时其存储器的组织方式为:交叉编址
所谓偶地址存储器即编下来的地址为偶数(在十进制下,如E为14,即是偶数)
每一次访存,都可以一次性地读取一行,如:
8086中数据的存放规则是:
如果存放的是一个字节,则按照顺序存放
如果存放的是一个字,将字的低位放在低地址中,高位字节放在高地址中
如果存放的是一个双字,低位字是被寻址地址的偏移量,高位字是被寻址地址所在的段地址
当我们要读取一个字节(8位)时,只需要访问该字节所在的存储体
当我们要读取一个字(16位)时,要分数据是放在奇地址还是偶地址
如图:
当要读取数据19E4时,数据是从偶地址20020H开始的
则我们一个周期读取一行
像这样:
就可以将要的数据全部读出
叫做规则存放
但当要读取数据27F8,则数据从奇地址20023H开始的
则要访问两次内存才内读出想要的数据
叫做不规则存放
《物理地址的形成》
我们知道8086的寄存器都是16位的,所以要一个寄存器来保存某一个内存中的地址是不现实的
所以我们如何得出内存中的真实地址呢?
可以通过两个寄存器联合得到
使用分段技术,每一个逻辑地址都由段基址和偏移地址组成
第一个16位寄存器确定要访问的逻辑段的段基址
每一段的容量<=64KB
1MB的存储器空间至少可分成16个逻辑段
第二个16位寄存器确定该段内要访问的存储单元
最大可以访问64KB的空间
物理地址=段基址*16(左移4位,16进制下就移动1位)+偏移地址
如:CS=3000H,IP=0200H
指令所在地址为30000+0200=30200H
《辨析MOV AX,BX 与 MOV AX,[BX]》
MOV AX,BX
表示将BX寄存器中存放的数据移动到AX寄存器中
MOV AX,[BX]
[BX]表示内存中的地址
其实其是省略了段基址
在默认情况下,段基址为DS
[BX]==DS:BX==DS*16+BX
表示将DS*16+BX中保存的数据放到AX中
如图用DEBUG查看的地址信息
其中段基址为073FH
一行中有16个字节单元,所以可以看到相邻行的偏移地址相差16(在16进制下就是相差1)
其中的00表示 0000 0000 (在2进制下)(其总共有8位)
标签:8086,16,微处理器,基址,地址,寄存器,AX,BX From: https://www.cnblogs.com/cilinmengye/p/17204769.html