8086最小模式原理总结

来源:互联网 发布:小学生数学题库软件 编辑:程序博客网 时间:2024/05/01 17:52

一、8086芯片引脚定义


引脚功能简单描述:

因为本篇文章的目的是理解8086系统的原理,所以只讨论与程序设计相关的功能,其他方面只是简单略过。

AD0-AD15 : 地址/数据复用线

A16/S3-A19/S6:高四位地址线和状态输出复用

ALE:地址锁存使能

bhe:低为读取一个字,高为读取一个字节

rd:总线读操作控制线

wr:总线写操作控制线

M/io:intel平台中,存储器和io分开编址,此控制线来确定访问的是存储器还是io口

DT/dr:在读写操作时,控制数据的流向。

den:数据传输使能


NMI,INTR:前者接不可屏蔽中断源,后者接可屏蔽中断源

inta:中断响应

ready:指示外部设备是否完成指定的操作

MN/max:最小最大模式选择,本文只考虑最小模式

HOLD/HOLDA:向cpu请求总线控制权和cpu响应控制线


CLK:接时钟信号

RESET:复位信号输入

GND: 接地线

VCC:接5v电源

test:暂不考虑

二、最小系统简略概述

2.1、简略图如下:


2.2、8086读存储器时序图如下:

2.3、上图读时序解析

2.3.1、在T1阶段将地址锁存在8282中,为什么要锁存?因为在整个读操作过程中,地址总线上都要保持cpu要访问的地址信息,而20条地址线在T1阶段后要传输状态和数据信息,无法保持地址信息,所以需要将地址信息锁存在8282中,bhe也被锁存在了8282中,也可以认为bhe也是地址信息的一部分。

2.3.2、T2到T4的过程中,地址中的数据被传送到了8086中,若外部设备较慢则需要加入几个Tw以等待外部设备完成读操作。

2.3.3、bhe和内存对齐的问题,bhe为低时表示读取一个字(16bit)为高时读取一个字节,bhe和AD0的不同组合会导致cpu的不同行为。

2.3.3.1、当代码从一个偶地址(假设为100)读取一个字时,cpu可以通过让bhe=0,然后直接读取此地址的值就可以了。bhe=0,addr-100。

2.3.3.2、当代码从一个偶地址(假设为100)读取一个字节时,同上例,bhe=1,addr=100。

2.3.3.3、当代码从一个奇地址(假设为101)读取一个字节时,bhe=1,addr=101

2.3.3.4、当代码从一个奇地址(假设为101)读取一个字时,此时一个总线访问不能满足要求,需要两次操作,第一次 bhe=1,addr=101,第二次bhe=1,addr=102,然后再结合(可能不同cpu组合的方式不同,例如也可以读取两个字进行运算出最后结果)。这也就是变量存储要进行内存对齐的原因。(具体内存对齐有另外文章详解)


三、8086系统中的段

段的概念本身不复杂,可是由于历史原因段被用在不同的场合,导致段的概念模糊容易混淆。

3.1、段的由来

在8086系统中,地址线是20根,所以能访问的地址范围是1MB,而8086cpu的字长是16bit(数据线是16bit,内部寄存器也是16bit),所以地址信息无法直接cpu处理,所以就把一个1MB的物理寻址空间分成段,cpu用段地址和偏移量来访问存储器中的某一地址,段地址存储在段寄存器中,偏移量可以有多种实现(可以是立即数,寄存器中具体间寻址方式)

这种分段机制是由于字长和物理寻址空间的不匹配产生的,只是cpu访问存储器的一种方式,这个段只存在与访问过程中,对于存储器来说是透明的,cpu内部有一个加法器实现把段地址和偏移量来组成实际的20bit的物理地址。

3.2、代码中的段

这也许是一种巧合,代码也需要用段来分割,代码由指令和数据组成,把指令和数据放到不同的段里有很多好处,例如可以赋予不同的段不同的读写权限(代码段可以设置为只读),也可以把不同模块的代码放在不同的段里,方便维护和扩展(静态链接,动态链接),例如资源也可以单独放在一个数据段里供各个模块之间进行共享。

这种分段机制和3.1当中提到的cpu为了用16bit的字长去实现访问1MB的存储空间的分段机制不谋而合(但确实是两种分段机制,不能混淆),我们可以把指令和数据分成若干段,然后用段寄存器去存储这些段的首地址,就可以用各种偏移量的寻址方式去访问这些段了。

3.3、8086中提供的段寄存器有4个,cs,ds,es,ss,cs要存储指令段的地址(因为cpu在reset以后会首先访问cs段里的数据,并把其当成指令执行),ss一般是栈段(也可以为数据段),ds,es为数据段,由此可见,cpu能同时处理的有四个段,如果代码中有超过4个段,则需要在代码中进行切换。

原创粉丝点击