8086计算机组织
文章目录
一.微机的一般构成
运算器、控制器(中央处理器)、存储器、I/O设备
1.CPU
包括:运算器和控制器
功能:
2.主存储器
功能:存放程序和数据的部件。
- 存储器容量:存储单元的多少;
- 对于每一个存储单元的访问都需要通过:地址
tips:
1.关于存储单元
大多数的计算机的存储器组织都是以字节为基本单位。每一个基本单位就是存储器。
2.习惯上将CPU和主存储器合称为主机。
下图为一个存储器示意图:
这里就不是以字节为基本单位,而是以10为bit为基本单位,那么可以有:
2
10
=
1024
=
1
K
2^{10}=1024=1K
210=1024=1K
tips:主存储器和外村是不一样的东西,外存是为位于主机之外的。
3.输入输出设备
输入设备:将外部数据输入到计算机内部。
输出设备:将计算机内部数据显示给外界。
不同系统的工作速度、工作原理以及要处理的信息格式相差较大。
4.系统总线
系统总线将CPU、存储器和I/O设备连接起来,实现各个部分之间的各种信息传送。
包括:
- 数据总线
- 地址总线
- 控制总线
这三种总线都是属于系统总线,只是传输的内容不同罢了。
二.Intel 8086/8088 CPU的功能结构
汇编程序是由一些列指令(指令序列)组成的。
指令:构成汇编语言的基本单位,就像高级语言中的语句。
CPU执行指令序列的过程就是重复执行:
- 从存储器中取指令;
- 执行指令规定操作。
这两个步骤的执行又可以分为:串行执行和指令流水线方式。
-
串行执行:
特点:
- 取指令时:总线处于忙碌状态,所占的时间较长,cpu的处理指令序列的时间要少很多,因此时间分配不是非常均匀。
- 执行指令时:总线处于闲置状态,cpu花费时间要少很多。
-
指令流水线方式:
这种方式效率更高,最早出现在8086/8088 CPU中。但是要想实现这种方式,需要将CPU划分为两个单元。
左边的为执行单元,右边为总线接口单元。
-
EU主要执行计算和处理。
-
组成:上半部分是通用的寄存器,下方的分别为暂存器、逻辑计算单元、标志寄存器。
-
功能:
1‘.从指令队列取出代码,由控制器译码后产生对应的控制信号,完成各个部件的操作。
这里你可以理解为,EU控制器依次从指令队列取出代码并将代码转换为物理电信号,使得计算机组件发生相应变化。
2’.对操作数执行各种指定的算术或逻辑运算。
这里有通用寄存器,可以完成相应的计算操作。
3‘与BIU交互并发出相应的I/O指令。
-
-
BIU就是起到一个和总线交互的功能。
-
组成:右边的段地址寄存器主要起到的是帮助总线找到存储单元的地址(addresss):
a d d r e s s = a d d r e s s b a s e + o f f s e t address=address_{base}+offset address=addressbase+offset -
功能:
1’取指令:根据指令指针IP和CS寄存器存储内容共同形成的存储单元地址来取得存储单元中的指令,并暂存到指令队列中去,让EU取走。
2’存数据:接受来自EU的指令、数据,结合段地址寄存器进行数据存储。
-
-
可以很明显地看到,将CPU分成两部分后,让两部分”分工合作“,工作四件分配的当,系统总线就不会太极端——忙的时候很忙,闲的时候非常闲。
三.Intel 8086/8088 CPU的寄存器以及功能
通用寄存器:前四个分为AH、AL这种格式(高八位和低八位)。
控制寄存器:IP指令指针表示指向哪一条指令,FLAGS记录状态。
1.通用寄存器
Intel 8086/8088拥有8个16位通用寄存器,具有良好的通用性,同时也有特定功能。
(1)数据寄存器
组成
包括AX、BX、CX、DX四个寄存器,既可以是单独的16位寄存器,也可以将一个寄存器分为2两个8位寄存器使用。
功能
既可以用来存放参加运算的操作数,同时也可以存放运算的结果。
eg:
MOV AX, BX 将BX内容送到AX中
ADD CH, DH 将DH内容与CH相加并送入CH中
tips:
在有些指令中,我们默认使用某些寄存器。
eg:在循环指令LOOP中,CX被隐含作为循环次数计数器。
(2)指针寄存器
组成
指针寄存器有堆栈指针SP和基址指针BP。
功能
- SP指针,进行堆栈操作时候,被隐含使用,用于指向栈顶顶部单元;
- BP指针,用来指向堆栈段内的某一存储单元;
- BP指针同时还可以用于存放参加运算的运算数、输出结果。
(3)变址寄存器
有两个16位变址寄存器SI(source)和DI(destination),一般被用来作地址指针。
组成
SI是源变址寄存器,DI是目的变址寄存器。
功能
- 一般被用来作为地址指针,指向地址;
- 同BP寄存器一样,SI和DI也可以作为通用数据寄存器存放操作数和运算结果。
2.段寄存器
首先需要了解什么是段?段其实就是存储器的一种运行机制,CPU会在程序运行时,将存储器分为多个段,每个段存放不同的内容,eg:程序运行代码、数据等。CPU要从存储器存取信息时,就需要要通过地址,地址的话不是一下子确定的,而是通过:基址(开始地址) + 偏移量实现的。CPU就会使用一个段寄存器去存储基址,再拿一个寄存器去存储偏移量,两个内容相加就得到了存储单元的地址了。
把这张图解释一下:CS(code)、DS(data)、SS(stack)、ES(else)分别存储的是代码段、数据段、堆栈段、附加段的段基址。
理想状态下,存储器是可以分为任意多个段的,但是考虑到只有4个段寄存器,因此我们实际应用只有4个段。
因此,你访问一个存储单元地址:
- 明确基址
- 明确偏移量
3.指令指针
组成
IP指令指针寄存器,FLAGS标志寄存器
功能
-
根据上方说法,CPU从存储器取得指令时,如果我要取得代码段地址,那么就得以寄存器CS作为代码段的基址指针,那么偏移量谁来存储呢?
答案就是专用寄存器的指令指针寄存器IP。
IP存储偏移量,CS存储代码段基址。
-
当CPU从内存中取出一条指令时,IP内容自动修改为指令下一条指令。
tips:IP寄存器的地址不能够被修改,只能偶通过某些操作,系统对IP内容自动修改。
4.标志寄存器
组成
FLAGS
功能
标志寄存器是用来反应CPU在程序运行时候的某些状态,比如说:是否进位、奇偶性、结果符号、结果是否位0等待。
这些标志位的具体用法下面会讲述。我们先看一下这些位的分类:
- 控制标志:TF、DF、IF
- 状态标志:CF、PF、AF、ZF、SF、OF
(1)进位标志位
算术运算时,如果最高位(对于bit是15位,对于byte是第7位)产生进位或者错位时CF自动置为"1",否则置为"0"。
在移位类指令中,CF也被用来存放从最高位或最低为移出的数值(0或1)。
(2)奇偶标志位PF
当指令操作结果的**低8位**中含有1的个数位偶数时,则PF被置为1,否则为0。
(3)辅助进位标志位AF
若低字节的低四位(半个字节)向高四位产生进位或者错位——第三位产生进位或者借位,AF会被置为1,否则置为0。
(4)零值标志位
如果运算结果各个位置都为0,则ZF为1,否则为0
(5)符号标志位
如果为正数则为0,负数为1
(6)溢出标志位
如果运算结果超过机器用补码能够表示的范围,OF为1,否则为0
tips:溢出和进位是两个完全不同的概念。
(7) 单步标志位(Trace Flag,TF)
单步标志位常常用于程序的调试,当TF被设置为1的时候,每执行一条指令,CPU暂停运行。
(8)中断允许标志位(IF)
当IF被置为1时,CPU可以相应可屏蔽中断,否则不允许响应可屏蔽中断。
(9)方向标志位(DF)
DF是控制标志位,用来规定串指令的递减方向。当DF=0时,变址寄存器等的内容递增,否则递减。
四.存储器的组织结构
1.存储器的组成
-
存储器是由多个存储单元构成
存储器容量:存储单元的多少。
-
每个存储单元存放相同长度的二进制数。
一个存储单元的**长度一般为8位的二进制数**,为一个字节。
-
每个存储结构有唯一一个地址:
Intel 8086/8088CPU拥有20根地址线,那么可以找得到的地址个数为:
2 20 2^{20} 220
这叫做寻址能力,为1兆字节空间。当然为了书写方便,经常使用 十六进制数进行表示。 -
任何两个相邻的字节存储单元构成一个字单元。
数据在字单元中的存储遵循**”低对低,高对高“**——也就是说16位的长数据将低8位存储到低字节中,高8位存储在较高地址字节中。
-
在定义一个地址的时候必须指出是字还是字节类型。
2.存储器的段结构
我们已经知道了8086/8088的寻址空间结构位1MB,也就是20位的二进制数,但CPU内部的寄存器长度位16位,也就是实践上能够直接访问的空间。
(1)存储器段结构特点
-
8086/8088 CPU将2^20bit的存储空间分为了若干段,每个段的最大长度位64k,也就是寄存器中可以直接访问地址的最大数量。
-
段基址必须是一个小节的首址,即: 每个小节的首地址必须为0.
tips:每16个字节单元,称为一个小节(Paragraph),所以,1MB可以划分:
2 20 ÷ 2 16 = 2 4 2^{20}\div2^{16}=2^{4} 220÷216=24 -
逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的。
tips:逻辑段指的是汇编语言源程序设计中的段。
-
同一个时刻,由于我们8086/8088 CPU只有四个寄存器,最多只能访问4个当前段中的内容。
(2)逻辑地址和物理地址及其对应关系
-
物理地址
在8086/8088CPU的1MB的存储空间中,每个存储单元的物理地址是唯一确定的,是该存储单元的20位bit地址。
-
逻辑地址
为了程序开发方便对存储器进行的动态管理,使用的是逻辑地址——包括段基址和偏移量。
eg:C语言中,我们的一个指向int变量的指针的值就是类似于逻辑地址,这个值在CPU内存中实实在在存储的地方就是物理地址。
- 段基值:存放在某一个段寄存器中,是**逻辑段起始单元地址(段基址)的高16位**。
- 偏移量:表示某个存储单元与他所在段基址之间的字节距离。(注意区分哦)
- 逻辑地址表示方法:段基值:偏移量
-
逻辑地址转换为物理地址
BIU需要将逻辑地址转换为了物理地址,eg:当CPU需要访问存储器时候。
转换方法:将逻辑地址段基值左移动4位 -> 20位的段基址 ,然后加上16位的偏移量。
tips:同一个物理地址可以被两个逻辑段的段基址映射:
-
逻辑地址来源
在程序执行过程中,CPU根据不同操作类型访问(也就是不同段寄存器存储内容类型)存储器,其访问的**段基值和偏移量**来源不同。
tips:如果允许替代,我们替代来源称为段超越。
五.堆栈及其操作方法
堆栈是一个特定的存储区,主要用于暂存数据以及在过程调用或者处理中断时保存断点信息。
1.堆栈的构造
堆栈一般分为:专用堆栈存储器和软件堆栈。
- 专用堆栈存储器:按堆栈工作方式专门设计的存储器
- 软件堆栈:由程序设计人员在内存中划出的一块存储区为堆栈来使用
这其实就是我们数据结构中的堆栈:Bottom端是固定的,TOP端是浮动的。 为了指示堆栈中存存放数据的位置,使用SP堆栈指针寄存器存储堆栈段基址与栈顶之间的字节距离。
- 当(SP)为最大值(初始值)时,堆栈为空,当(SP)=0时,对堆栈满了(特别注意一下);
- 每增加一个数据,则SP减1;
- 当SP被初始化时,指向栈底+2单元——其值就是堆栈长度,由于SP是16位寄存器,那么堆栈长度最长位64k。
- 数据在堆栈中的存放:以字(2个字节)为单位存放,低八位放入低地质单元,高八位放入较高地址单元。
- 通过改变堆栈段寄存器的内容,可以改变到另一个堆栈段——切换堆栈。
2.设置堆栈
-
建立堆栈:如果要设置堆栈,需要对堆栈段寄存器和堆栈指针进行赋值。
-
进栈:把数据存入堆栈,由指令PUSH或者由机器自动实现,把通用寄存器、段寄存器或者字存储单元的内容压入堆栈顶部。
执行过程:
- 堆栈指针SP-2并将其指向一个空存储单元(之所以要-2是因为以字为单位)
- 将要存储内容送入SP指向字单元中。(SP)<=数据
-
出栈操作:从堆栈顶部弹出一个字到通用寄存器、段寄存器或者是字存储单元。
执行过程:
-
将SP指向字单元的内容送到指定的寄存器或者是存储器;
-
令SP+2
-