当前课程知识点:微机原理与接口技术 > 第2周 8088微处理器 > 第9讲 8088 CPU主要引线及机构 > 8088 CPU内部寄存器
大家好 这一讲我们来介绍
8088的内部寄存器
我们已经知道8088是一个 16位体系结构的这样的CPU
所以呢 它的16位的体系结构就意味着
它能够同时处理16位的二进制码
意味着它内部的总线是16位宽
还意味着 它内部的寄存器都是16位的
8088的内部一共有14个 16位的寄存器
这14个寄存器可以分为三种类型
一个是通用寄存器 有8个
还有段寄存器 有4个
以及两个控制寄存器
段寄存器和控制寄存器 我们都可以称为
专用寄存器 就相对于通用寄存器来讲的话
这14个内部的寄存器 它们的作用各有不同
大家学习它的时候
首先肯定要知道它们的名字
它们的含义
更重要的是一定要理解
这14个内部寄存器
它们里边的16位二进制码 的含义是什么含义
对于这四个段寄存器以及 两个控制寄存器
它们因为作为专用 所以
它们内部的16位二进制码 的含义非常清楚
你只要需要记住就行了
其实更加复杂的是通用寄存器
所以下边我们会花多一点的时间
来学习通用寄存器
有关段寄存器呢 因为要真正地理解大家必须要
把实地址模式下的存储器寻址 要学习清楚了
我们才能反过来去学习清楚
这四个段寄存器
但是今天这一讲里头 我们还是把这四个段寄存器
给大家先展示一下
然后在下一讲学习完了以后 我们再做一个回顾
8个通用寄存器又可以分成这样子的
三个小类或者说两大类
一大类就是数据寄存器
它们分别是 AX BX CX和DX
还有两类呢
可以简单地说是地址寄存器
这里边有两个地址指针寄存器
SP和BP
还有两位叫变址
还有两个叫变址寄存器
DI和SI
我们这一次首先强调一下
作为通用寄存器
不管这里边
叫哪个名字 不管这8个寄存器什么名字
不管它们下边我们要讲的 它们的专用的用法或者
特殊用法是什么用法
首先它们的
大名叫通用寄存器 也就是说它们的一级作用
是暂存中间运算结果
这一点请大家千万要记住
不要学了它们的一些特殊用法 就把专用
这个它们的通用用法就忘了
因此这8个通用寄存器 不管什么情况下
它们里边都可以放运算结果
或者说中间运算结果 也就是用来存放数据用的
其中这四个数据寄存器呢
是非常特殊的
4个16位寄存器
因为这四个数据寄存器
它们分别都是由两个
8位寄存器都在一起来构成的
也就是说它们合在一起 可以是一个16位寄存器
拆开来可以是两个独立的8位寄存器
这样设计的目的
也就是能够提高它们的应用的灵活度
或者说它们的效率
比如AX
它实际上是
可以拆分为AH跟AL两个寄存器的
它们一旦拆开来
两个作为8位寄存器用
AH跟AL就是两个独立的寄存器
虽然这里的H是High的缩写
L是Low的缩写
但是一旦拆开来作为8位寄存器
它们不存在High和Low这样的之分
就是存放8位数的寄存器
但是如果把这两个寄存器合在一起的话
它们一定AH在高8位
AL在低8位
这个是不能改的
同样的BX也是可以被这样子
分开为两个8位寄存器
CX DX是一样的
所以呢这四个数据寄存器
它们都是可以
被分别拆分为两个8位寄存器
所以合起来可以是一个
8个8位寄存器
然后又可以合在一起
构成4个16位寄存器
这4个寄存器呢
它们通用的叫数据寄存器
因此这4个寄存器
更常用的是用来存放中间运算结果
好了
现在就这4个寄存器我们来总结一下
它的第一级大名叫通用寄存器
用暂存中间运算结果
第二级大名
第二级的名字叫数据寄存器
那么更确定地
说明他们经常用来暂存中间运算结果
下边我们来说一下他们的一些
专用法
AX又叫累加器
因为它的性能要略微高一些
所以它更多更多的时候是被用来做
中间运算结果的存放
AX中的16位数没有任何的二义性
它里边都是运算的数据
BX呢
它的最小一级名字叫
基址寄存器
意思它里面有个址的意思
就是地址的意思
因此呢
意味着BX里的16位数
可能是运算数据
也可能是数据存放的地址
到底里边是地址还是数据?
那在我们下一章指令的时候
我们可以根据它在指令中的表现形式
来说明它的含义
这个因此BX这个寄存器
在使用的时候
是非常灵活的
这也是大家作为初学者
觉得比较困难的一个寄存器
CX呢
它叫计数寄存器
我们说它的最小名字是计数寄存器
也就是说这个寄存器也有一些
专用的做法
虽然它的里边的都是数据
但是它的数据的意思不一样
当然它很多很多的时候
它里边是中间运算结果
但是在有些时候
比如在循环指令中间
循环的次数要求一定要在CX里
在串操作指令里头
串的长度值一定要在CX里
所以在这些指令里头CX
实际上也是作为专用寄存器
来使用的
DX呢
不论是它的二级名字还是三级名字
都叫数据寄存器
听上去好像它里边的数据
更经常的是数据了
实际上它还在一个地方
它里边代表着数据的含义
它只有在输入输出指令中
DX值一定代表的是端口地址
这个毫无问题
那么除了在输入输出指令之外
其他指令中DX的值一定都是
运算的数据
而且作为一个特殊的寄存器
它经常在需要32位运算的时候
它用来存放高8位的内容
高16位的内容
因为我们现在学的是8088/8086
指令集
所以我们的指令只能直接
处理16位数
当你需要处理32位的时候
没有寄存器能够放
所以必须要借助
DX来存放高16位数
好了这是4个数据寄存器
请大家注意他们内部
16位数的含义
地址指针寄存器呢
一个叫BP一个叫SP
SP呢我们称为
堆栈指针寄存器
请大家注意这个寄存器
虽然它的一级大名叫通用寄存器
实际上这个寄存器经常作为
专用寄存器来用的
当你的程序中间如果设置了
堆栈的时候
那么当然堆栈什么概念我们后面来讲
只要有堆栈存在
SP一定被专用
它用来指向栈顶
也就是说它是作为栈顶指针来使用的
另外一个和堆栈操作相关的就是叫BP
我们后边学堆栈的时候
我们会知道
SP所指向的永远是栈顶的那个位置
而BP可以指向堆栈里边的
任何一个区域
这两个寄存器再次强调
在有堆栈操作的时候
SP肯定被专用
但是BP不一定
BP里边的16位数
可能是一个堆栈区域的某个单元的地址
也有可能就是一般运算的中间结果
这些是它们作为通用寄存器的特性
当然在没有堆栈的操作的这样的程序中
SP也可以作为通用寄存器
存放中间运算结果
BP和BX的区别在哪里?
它们的共同点都是可以用来存放
某个单元的地址
但是它们的不同点是
BX一般来讲指向的是数据区
而BP指向的是堆栈区
这一点后面我们随着指令的学习
再逐渐地帮助大家理解
还有两个
用来表示地址的通用寄存器
一个叫
源变址寄存器SI
一个叫目标变址寄存器
叫DI
这个名字具体是怎么回事
我们随着后边内容的解释
我们再逐渐地来解释给大家
首先大家就记住这有两个
这样的通用寄存器SI和DI
而且这两个寄存器的里边的16位数
也可以是运算的数据
也可以是存放数据的地址
到底它们是地址还是数据
那么要取决于它们在指令中间的
表现形式
那么从这个角度来讲
它们跟BX没有什么区别
都是可以放数据可以放地址
而且它们都通常指向的是数据区
但是它们也有一些不同
不同的地方在哪里?
我们后面学习的时候
再来逐渐解释给大家
这是8个通用寄存器
总之这8个通用寄存器里头
这8个通用寄存器都是16位寄存器
作为16位寄存器
它们里边的16位数
可以是运算的数据
可以是
存放数据的地址
除了AX和CX之外
其他的
6个通用寄存器里头都可能是地址
但是呢作为
8位寄存器的AH AL
BH BL等等这些
这个8位寄存器里的值
一定是运算的数据
绝不可能是地址
请大家一定要注意
我们16位体系结构的CPU
它的地址最短也是16位的
它哪怕是零
也是16位的
控制寄存器我们有两个
一个我们叫指令指针
这个实际上就是程序计数器
只不过Inter公司给它另外起了个名字
叫指令指针
指令指针寄存器呢
它里边的16位数的含义非常明确
就是下一条要取的那条指令
的偏移地址
这里什么叫偏移地址?
我们也先放着
到后边我们再来学习它
我们看一下这个图
这个图我们见了好几次了
我们说我们的程序一旦经过编译
就开始运行之前我们要放到内存里
好到了内存里以后就变成了
一条一条的机器指令
这样子排列着放到里头
那么我们为什么系统就能找到
第一条指令
因为我们的指令指针
或者说我们的程序计数器
指向了程序的第一条指令上
那么
跟一维这个程序计数器指向的这条指令
所以CPU取指令的时候就会到这里取
所以说程序计数器实际上是一个
指挥棒
也就是说我们归结到我们的8088
就说BI有取指令的时候
到哪里去取呢?到哪个单元里去取呢?
完全取决于程序计数器指向的位置
在我们这里就完全取决于
IP指向的位置
所以IP我们叫指令指针
Instruction Pointer
就是指到这个地方
那么所以它就取到这里
所以简单地讲
BI有取指令就看IP
IP指向哪里它就取向哪里
那么另外一个专用寄存器或者说
控制寄存器我们叫FLAGS
我们前面已经讲了
FLAGS是标志寄存器
它里边保存的是运算结果的特征
那么这个寄存器作为一个整体来讲
它是一个16位寄存器
但是它里边实际上只有9位
是有意义的
它是按位来说的
其他的
7位都是空闲位
那么这9位呢又分成两种类型
一种叫状态标志位
一共有6个
还有一类有3个呢
叫控制标志位
状态标志位是真的表示运算结果的特征
而控制标志位表示的是
处理器当前的工作状态
我们下边把这9个标志位的含义
一一介绍给大家
首先我们来看6个状态标志位
CF表示进位标志位
也就是说当加减运算最高位
向前有借位或着进位的时候
那么CF会等于1
OF表示溢出标志位
也就是说当你的两个符号数运算
次高位
和最高位向前的进位
或者借位状态不一样的时候
OF会等于1
也就说反过来讲
OF等于1
表示两个有符号数运算
它结果溢出
CF等于1
表示两个无符号数运算
有溢出
这个请大家注意它们的含义
ZF叫零标志位
请大家注意
就是运算结果为零的时候
ZF等于1
不为零
ZF等于零
它虽然很好记
但是容易记反
SF是符号标志位
就说最高位是1的时候
它就是1
最高位零就表示零
也就是说
当你是有符号数运算的时候
SF表示你运算结果的性质
到底是正数还是负数
这4个状态标志位呢
都针对8位 16位都是有意义的
它们是一样的
对于16位数
比如它就是第15位是1
SF等于1
对于8位数呢
就第7位是1 SF等于1
那么对于16位数的最高位
向第15位向前有进位 SF等于1
8位数呢 就是第7位向最高位有进位
SF等于1 等等
但是下面这两个状态标志位呢
它只针对8位有效
也就是说在16位数运算的时候
它只针对低8位
PF呢表示低8位中
1的个数如果是偶数个的话
PF为1
否则就为零
AF呢叫半加标志位
也叫辅助进位标志位
也就是说第3位向第4位
有进位或者有借位的时候
AF会等于1
我们做一个练习
把这6个状态标志位帮助大家
理解一下或者说记忆一下
比如我们现在就做这两个二进制求和
我们也不知道这两个数是
有符号还是无符号
我说过有符号还是无符号
实际上是程序员自己定的
就说从硬件这个层面上它是不能理解的
那么这两个数
做加法
那么计算机的硬件
也就是说CPU
它就会按部就班地去求和
也就是说 零加零等于零 零加1等于1
1加1等于零 有进位
所以总而言之就得到了这么一个结果
好了 我们现在来看一下
这样运算完了以后6个
状态标志位会有什么反应
首先 现在作为两个8位数相加
最高位向前有进位 对吧
这个红颜色方框框里的
所以SF会等于1
最高位向前有进位
次高位向前
向最高位有进位没有呢?
也有
所以OF等于零
两个进位状态相同
所以如果它是有符号数运算
表示没有溢出 所以OF等于零
第三位到第四位有进位没有呢?
没有
所以AF等于零
最后这个1的个数
这运算结果中8位
不算那个进掉那一位
这8位中1的个数有4个
所以是偶数个
所以PF等于1
最高位现在是1
所以SF等于1
运算结果显然不为零
所以ZF等于零
这就是运算结果的特征
我们通过这些特
我们就能知道我们运算的结果
到底是有没有溢出
最高位是正数还是负数
等等这样的一些信息就可以得到了
好 控制标志位呢有3个
它是用来表示处理器目前的控制状态的
TF叫陷井标志位
它通常表示现在
它等于1的时候表示CPU在响应中
处于一种单步工作状态
也就是说它实际上是
一种中断的一种性质
IF表示外部可屏蔽的中断
请求允许信号
也就是说它等于1的时候
表示可以响应外部的可屏蔽中断请求
为零就不可以
可屏蔽中断请求的含义
我们在上一讲已经
有过介绍
DF表示操作方向的一个标志位
它主要在后边我们学习
串操作指令的时候会用到它
这是3个控制标志位
请大家对这9个标志位
要能够熟悉 知道它们的含义
第三类寄存器呢我们称为段寄存器
段寄存器的这个学习现在
我们在这一会大家只能去
就事论事记住它
因为有关
什么是段
为什么要有段
或者什么是逻辑段等等这些概念
我们都还没有讲
段寄存器是用来存放
相应逻辑段的段地址
所以这里第一个名词
就是逻辑段
那么8088也好8086也好
它的内存都是按段
按逻辑段来分段管理的
这个我们在
开篇讲8088/8086特点的时候
曾经说过它的第二大特点
就是利用了16位体系结构
只能直接产生16位地址码的
这样一个条件下
能够通过内存分段管理
能够管理到一兆个单元
这么大的内存空间
那么怎么个分段?
那么段的段地址在哪里呢?
段地址就在段寄存器里
这个段的含义
大家今天暂时可以理解为
像一层楼一层楼
我们前面讲过每一栋大楼里的每一
每一个房间
一栋大楼里的每个房间
它的门牌号码的编码都是有规律的
它的前面第一位十进制或者
前两位十进制
通常来表示楼层号
那么
这个楼层号我们也可以在这里
就当于在这里是个段地址一样
所以这个楼层号放在哪里呢?
在这里就放在段地址里
段寄存器里
当然这个大楼和我们现在这个
还不能完全一一对应
我们下一讲
来给大家介绍
在8088中这个逻辑段的
个数可以很多
但是类型只有4种
一种我们称为代码段
用来放指令代码的
就说我们所有的程序
它经过翻译成机器语言以后
都由机器指令
和运算的数据
这些指令码都是放在
代码段里
而运算的数据
可以放在数据段或者附加数据段里头
另外
我们提了好几次的这个名词堆栈
堆栈 那么也是一个段
所以这一共是4种类型的段
这4种类型的段呢
就要对应着4种类型的段地址
这4种类型地段地址呢
就放在了这样4个段寄存器里
那么显然这只有4个段寄存器
只能放4个段地址
那么你又说有那么多个逻辑段
你怎么放呢?
我们所以说
我们不管有多少个逻辑段
但是只有4种类型
而且就对应只有4个段地址
因此在一个程序模块里
一种逻辑段只能有一个
也就是说在一个
程序模块里
最多只能有4个逻辑段
结论先放在这里
所以段寄存器一共有4个
它们里边都是16位的段地址
这16位的段地址的含义非常明确
代码段的段地址一定放在CS里
数据段的段地址一定放在DS里
因为段地址刚才我们用了那个楼层号
来区分
所以段地址相当于那个
可以对应到我们大楼的楼层号
所以楼层号就
就决定了这一层楼上所有房间
在这一栋楼中间的位置
比如五楼
那么你这个五
就决定了五楼上所有的房间
在这栋楼里都处于五楼这个区域
所以段地址
也就决定了
一个段在内存中的区域是在哪里
好 讲了这么多
那么我们要知道为什么
什么是逻辑段
为什么要分段
这些概念
我们必须要理解了
我们才能理解段寄存器
因此我们渴望下一讲来给大家介绍
就是实地址模式下的
存储器管理
这一讲
学习完了
大家就真正能够理解段寄存器
它的作用
好了 我们这一讲我们就到这里
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语