第二章 80x86计算机组织 § 2.1 80x86微处理器 § 2.2 基于微处理器的计算机系统构成 § 2.3 中央处理机 § 2.2 基于微处理器的计算机系统构成 § 2.3 中央处理机 § 2.4 存储器 § 2.5 外部设备
CPU是计算机的心脏,是控制程序的核心。只有真正了解CPU的结构和运行机理,才能真正编出优秀的程序。
§ 2.2 基于微处理器的计算机系统构成 系统资源:CPU、存储器、I/O端口
微处理器的地址与数据总线宽度 微处理器 DB宽度 AB宽度 最大物理 存储空间 8086/8088 16 20 1MB 80386/80486 32 4GB Pentium 64 PentiumII 36 64GB PentiumIII PentiumIV
§ 2.3 中央处理机 一、Intel 8088/8086微处理器的功能结构 1.编程结构 二、8086/8088的寄存器组 1.通用寄存器 § 2.3 中央处理机 一、Intel 8088/8086微处理器的功能结构 1.编程结构 2.工作过程 二、8086/8088的寄存器组 1.通用寄存器 2.段寄存器 3.控制寄存器
8086编程结构 ∑ ALU 内部暂存器 IP ES SS DS CS 输入/输出控制电路 外部总线 执行部分控制电路 1 2 3 4 5 6 ∑ ALU 标志寄存器 AH AL BH BL CH CL DH DL SP BP SI DI 通用寄存器 地址加法器 指令队列缓冲器 执行部件 (EU) 总线接口部件 (BIU) 16位 20位 8位 8086编程结构
编程结构 BIU(总线接口部件) 负责与存储器及I/O设备交换信息 指令 数据 EU(执行部件) 负责指令的执行
工作过程 两部分并行工作,提高了工作效率 每当指令队列中有两个空字节,BIU自动把内存中的指令送入指令队列中 EU从指令队列中取出指令代码去执行(此时,BIU可继续取指)。如在指令执行过程中需要访问存储器或I/O设备,则EU会请求BIU进入总线周期,去完成访问存储器或I/O端口的操作 BIU处于空闲状态,则立即响应EU的总线请求 BIU正在取指,完成当前取指操作后响应EU的请求 当指令队列已满,且EU没有总线请求时, BIU进入空闲状态 在执行转移、调用和返回指令时,BIU指令队列的原有内容会被自动清除,而装入转移目标处的指令。
二、8086/8088的寄存器组 是基本资源,亦是操作对象。对内部寄存器的使用尤为重要: 可实现的操作多 速度快 是基本资源,亦是操作对象。对内部寄存器的使用尤为重要: 可实现的操作多 速度快 1.通用寄存器 2.段寄存器 3.控制寄存器
1.通用寄存器 8个16位寄存器位于EU中 数据寄存器(共4个16位) 指针及变址寄存器(共4个16位)
∑ ALU 内部暂存器 IP ES SS DS CS 输入/输出控制电路 外部总线 执行部分控制电路 1 2 3 4 5 6 标志寄存器 1 2 3 4 5 6 ∑ ALU 标志寄存器 AH AL BH BL CH CL DH DL SP BP SI DI 通用寄存器 地址加法器 指令队列缓冲器 执行部件 (EU) 总线接口部件 (BIU) 16位 20位 8位
1.通用寄存器—数据寄存器 AX(Accumulator)累加器:算术运算的主要R ,所有的I/O指令都用此R BX(Base)基址寄存器:除通用外,计算存储器地址做基址用 CX(Count)计数器:通用,作循环计数器 DX(Data)数据寄存器:常用来存放双字长数据的高16位,或存放外设端口地址 特点: 可作16位R使用,也可将每个拆成2个8位寄存器使用,对其中某8位的操作,并不影响另外对应8位的数据 具有良好的通用性:在程序中即可存放操作数,也可存放操作结果
1.通用寄存器—指针及变址寄存器 变址寄存器 SI(Source Index)源变址寄存器 DI(Destination Index)目的变址寄存器 指针寄存器 SP(Stack Point)堆栈指针寄存器—栈顶的偏移地址 BP(Base Point)基址指针寄存器—默认SS段 特点: 可用于存放操作数,但只能作为16位R使用
2.段寄存器 4个16 bits Segment Registers 在8086/8088系统中,存储器是按段进行组织的,段寄存器就是用来存放段基值的(段起始地址的高16位) 运行程序时所必要的指令、数据等存放于内存的不同段内,根据其用途的不同,又不同的段寄存器指示,并称其为当前段
∑ ALU 内部暂存器 IP ES SS DS CS 输入/输出控制电路 外部总线 执行部分控制电路 1 2 3 4 5 6 标志寄存器 1 2 3 4 5 6 ∑ ALU 标志寄存器 AH AL BH BL CH CL DH DL SP BP SI DI 通用寄存器 地址加法器 指令队列缓冲器 执行部件 (EU) 总线接口部件 (BIU) 16位 20位 8位
2.段寄存器 CS:代码段寄存器—对应的段存放指令代码 DS:数据段寄存器—对应的段存放数据或变量 SS:堆栈段寄存器—对应的段存放栈操作的数据 ES:附加段寄存器—对应的段一般存放数据或变量 整个内存可划分为多个段,但当前段最多只能有4个,如果需要改变当前段,则可通过程序修改段寄存器的内容
3.控制寄存器 ∑ ALU 内部暂存器 IP ES SS DS CS 输入/输出控制电路 外部总线 执行部分控制电路 1 2 3 4 5 6 1 2 3 4 5 6 ∑ ALU 标志寄存器 AH AL BH BL CH CL DH DL SP BP SI DI 通用寄存器 地址加法器 指令队列缓冲器 执行部件 (EU) 总线接口部件 (BIU) 16位 20位 8位
3.控制寄存器—IP IP(Instruction Pointer)指令指针寄存器IP (16bits) 程序顺序执行 指示代码段中指令的偏移地址 它与代码段寄存器CS联用,确定下一条指令的物理地址 计算机通过CS : IP寄存器来控制指令序列的执行流程 IP寄存器是一个专用寄存器 不能对IP指针直接进行访问 程序顺序执行 修改 转移指令的执行 调用、返回指令的执行
XX CS 16 bits 偏移量 正在执行的指令 IP 下一条将要执行的指令
3.控制寄存器—FLAGS 标志(Flag)用于反映指令执行结果或控制指令执行形式 8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器) OF 11 15 12 DF 10 IF 9 TF 8 SF 7 ZF 6 5 AF 4 3 PF 2 1 CF
标志位的分类 状态标志(6):表示前面的操作执行后,ALU所处的状态,将影响后面的操作 控制标志(3):用专门的指令进行设置,用于控制处理器执行指令的方式 OF 11 15 12 DF 10 IF 9 TF 8 SF 7 ZF 6 5 AF 4 3 PF 2 1 CF
标志位的功能—进位标志CF(Carry Flag) 记录运算时从最高有效位产生的进/借位值 0 NC 没有产生进/借位 1 CY 有进/借位产生 CF= 3AH + 7CH=B6H,没有进位:CF = 0 AAH + 7CH=(1)26H,有进位:CF = 1
标志位的功能—零标志ZF(Zero Flag) 0 NZ 结果非零 1 ZR 结果为零 ZF= 注意:ZF为1表示的结果是0 3AH + 7CH=B6H,结果不是零:ZF = 0 84H + 7CH=(1)00H,结果是零:ZF = 1
标志位的功能—符号标志SF(Sign Flag) 表明有符号数运算结果的正负 0 PL 结果为正 1 NG 结果为负 SF= 有符号数据用最高有效位表示数据的符号 所以,最高有效位就是符号标志的状态 3AH + 7CH=B6H,最高位D7=1:SF = 1 84H + 7CH=(1)00H,最高位D7=0:SF = 0
标志位的功能—奇偶标志PF(Parity Flag) 表明运算结果最低字节中“1”的个数的奇偶 0 PO “1”的个数为奇数 1 PE “1”的个数为偶数 PF= PF标志仅反映最低8位中“1”的个数是 偶或奇,即使是进行16位字操作 3AH + 7CH=B6H=10110110B 结果中有5个1,是奇数:PF = 0
标志位的功能—溢出标志OF(Overflow Flag) 表明补码的运算结果是否有溢出 0 NV 没有溢出 1 OV 溢出 OF= 3AH + 7CH=B6H,产生溢出:OF = 1 AAH + 7CH=(1)26H,没有溢出:OF = 0
关于溢出 处理器内部以补码表示有符号数 8位表达的整数范围是: -128 ~ +127 16位表达的范围是: -32768 ~ +32767 如果运算结果超出这个范围,就产生了溢出 有溢出,说明有符号数的运算结果不正确 3AH+7CH=B6H,就是58+124=182, 已经超出-128~+127范围,产生溢出,故OF=1; 另一方面,补码B6H表达真值是-74, 显然运算结果也不正确
溢出和进位 溢出标志OF和进位标志CF是两个意义不同的标志 进位标志表示无符号数运算结果是否超出范围,运算结果不正确; 溢出标志表示有符号数运算结果是否超出范围,如溢出,运算结果已经不正确。
溢出和进位的对比 例1:3AH + 7CH=B6H 例2:AAH + 7CH=(1)26H 无符号数运算: 58+124=182 无符号数运算: 58+124=182 范围内,无进位 有符号数运算: 58+124=182 范围外,有溢出 CF=0 OF=1 例2:AAH + 7CH=(1)26H 无符号数运算: 170+124=294 范围外,有进位 有符号数运算: -86+124=28 范围内,无溢出 CF=1 OF=0
如何运用溢出和进位 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
标志位的功能— 辅助进位标志AF(Auxiliary Carry Flag) 记录运算时D3位(低半字节)有无进位或借位 0 NA D3未产生进/借位 1 AC D3产生进/借位 AF= 这个标志主要由处理器内部使用,用于十进制算术运算调整指令中,用户一般不必关心 3AH + 7CH=B6H,D3有进位:AF = 1
标志位的功能—方向标志DF(Direction Flag) 用于串操作指令中,控制地址的变化方向 0 UP 存储器地址自动增量修改 1 DN 存储器地址自动减量修改 DF= CLD指令复位方向标志:DF=0 STD指令置位方向标志:DF=1
标志位的功能—中断允许标志IF(Interrupt-enable Flag) 用于开中断或屏蔽中断 0 DI 关中断,禁止响应中断 1 EI 开中断,允许响应中断 IF= CLI指令复位中断标志:IF=0 STI指令置位中断标志:IF=1
标志位的功能—陷阱标志TF(Trap Flag) 用于控制处理器进入单步操作方式 0 处理器正常工作 1 处理器单步执行指令 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断 这种内部中断称为单步中断 所以TF也称为单步标志 利用单步中断可对程序进行逐条指令的调试 这种逐条指令调试程序的方法就是单步调试
§ 2.4 存储器 一、存储器的组成 二、存储器的段结构 三、逻辑地址与物理地址 四、堆栈
一、存储器的组成 存储器的编址 数据的存储 8086/8088对内存的访问 由若干个存储单元组成,存储单元的多少代表存储器的容量 每个存储单元存储8个2进制位—容量用Byte数来衡量 存储器的编址 数据的存储 8086/8088对内存的访问
1.存储器的编址 8086 CPU 有20条地址线 存储单元连续编号,被称为存储器地址 最大可寻址空间为 220=1MB 物理地址范围 00000H~0FFFFFH 存储单元连续编号,被称为存储器地址 00000H 00001H 00002H 00003H 0FFFFDH 0FFFFEH 0FFFFFH
字单元的地址可为奇数也可为偶数,但由于机器中对字单元的访问是以偶地址进行的,故若设字地址为奇地址,则需进行两次存储器访问 78H 56H 34H 12H 09234H 09235H 09236H 09237H 2.数据的存储 字节(Byte) 每个字节占据1个存储单元 (09234H)=78H 字(Word) 任何两个相邻的字节构成1个Word 存放形式:高地址单元对应高位字节,低地址单元对应低位字节 字的地址:用地址较小的字节单元的地址作为该字单元的地址 (09235H)=3456H (09236H)=1234H 双字(DWord) 两个相邻的字单元构成1个双字(09234H)=12345678H 字单元的地址可为奇数也可为偶数,但由于机器中对字单元的访问是以偶地址进行的,故若设字地址为奇地址,则需进行两次存储器访问
3.对内存的访问 8086 字节 字 80386 双字 由指令明确规定或由指令中所使用的变量名(存储单元的符号地址)的类型决定,变量名的类型是事先定义的。
二、存储器的段结构 8086 CPU 有20条地址线,存储器地址是20位的 8086 的内部寄存器(包括IP)都是16位的 无法用寄存器直接对1MB的内存空间直接进行寻址 引入分段的概念—实模式存储器寻址
1MB的存储空间可由用户根据需要划分成若干个逻辑段(Segment) 每个段的容量≦ 64KB,连续的存储单元。(段内是16位的寻址,0000H—0FFFFH) 每段地址最小的字节单元的地址为该段的段基址(首地址),要求其最低4位为0(如:00000H, 00010H, 000F0H,等) 段与段之间的关系:邻接、间隔、部分重叠、完全重叠。(一个物理存储单元可以映象到一个或多个逻辑段中 某一时刻,系统只允许访问4个段中的内容(由4个段寄存器指示,其中存放段首址的高16位—段基值) 如果程序/数据较大(〉64KB)可修改段寄存器的内容来访问其他段
段 1 邻接 部分重叠 段 2 段 3 段 4 段 5 完全重叠 间隔
三、逻辑地址与物理地址 1. 物理地址 2. 逻辑地址 即20位的地址编码,每个存储单元有唯一的物理地址 信息的传送是通过它来寻址存储单元并进行传送 2. 逻辑地址 程序设计中使用的是逻辑地址 由于段可重叠,同一个存储单元可以有多个逻辑地址 段基值:段起始单元地址的高16位,其值存放于段寄存器中 偏移量:某存储单元与它所在起始单元之间的距离,以字节数计 偏移量为0:该单元就是段的起始单元 偏移量的最大值:0FFFFH(0—0FFFFH共64K个) 逻辑地址的表示方式 段基值:偏移量
∑ ALU 内部暂存器 IP ES SS DS CS 输入/输出控制电路 外部总线 执行部分控制电路 1 2 3 4 5 6 标志寄存器 1 2 3 4 5 6 ∑ ALU 标志寄存器 AH AL BH BL CH CL DH DL SP BP SI DI 通用寄存器 地址加法器 指令队列缓冲器 执行部件 (EU) 总线接口部件 (BIU) 16位 20位 8位
三、逻辑地址与物理地址 3. 逻辑地址与物理地址的逻辑关系 + 当CPU访问存储器时,BIU将逻辑地址转换为物理地址 物理地址=段基值× 16+偏移量 16位段基值 16位偏移量 0000 15 0 + 20位物理地址 20 0
16位段基值 15 0 0000 16位偏移量 15 0 所选段 所选存储单元 ⊕ 20位物理地址 20 0
3. 逻辑地址与物理地址的逻辑关系 逻辑地址 1460H:0100H、1380H:0F00H 14600H + 100H 14700H 段地址左移4位 加上偏移地址 得到物理地址 14600H + 100H 14700H 13800H + F00H 14700H 物理地址 14700H
段的分配 例:如代码段程序占用8KB(2000H)存储区,数据段占用2KB(800H)存储区,堆栈段占用256B存储区。内存应如何分配。 每段均小于64KB,且总占用量小于1MB 可有多种分配方案
每段占用64KB,且段间间隔,所占用空间远多于实际需要。 代码段 堆栈段 数据段 附加段 01500H 1CD00H 0150H CS 4200H DS 1CD0H SS 42000H B000H ES B0000H 每段占用64KB,且段间间隔,所占用空间远多于实际需要。
0200H 0400H 0480H 02000H 8KB代码段 CS 04000H DS 2KB数据段 SS 04800H 256B堆栈段 ES 段间邻接 此例中每段的长度都是16的整数倍,可邻接;若不满足此要求,则下一段将从最近的第一个小段开始,中间有少于16 Bytes 的间隔
4. 逻辑地址的来源 程序运行中所需要的指令、数据根据用途不同存放在内存的不同段中,对内存进行访问时根据操作类型的不同,通过不同的途径给出逻辑地址,以获得物理地址。 取指 CS IP 堆栈 SS SP 数据 DS CS ES SS SI,DI等
四、堆栈(STACK) 堆栈:是按后进先出原则组织的一片存储区域 用途:暂存数据、断点信息或传送信息 堆栈的构造(一般意义) 8086堆栈的组织 堆栈的操作
1.堆栈的构造(一般意义) 一端固定,具有最大地址的单元—栈底(数据由此向上堆积) SS 一端固定,具有最大地址的单元—栈底(数据由此向上堆积) SP 堆 栈 段 一端浮动,指向最后被压入堆栈的数据所在存储单元—栈顶(栈顶的位置虽堆栈中存放数据多少而变化) Top XX XX XX 堆栈指针:用来指示当前栈顶的位置。(压入的数据放入哪个单元或从那个单元弹出数据均由SP决定 XX Bottom 初始 SP
2.8086堆栈的组织 堆栈段:由SS存放堆栈段段基值以决定其起始地址 堆栈段的长度:即该片存储区域所包含存储单元数,其值有由初始时SP的值决定(指向栈底+1单元) 数据在堆栈段内的存放:堆栈是按字组织的,数据的存取均为2字节操作 12H 34H 01954H 01955H 堆栈区域的扩展: 如64KB的堆栈段不能满足需要,可通过修改SS来改变当前的堆栈段,使之指向另一片存储区域,同时SP重新赋值
3.堆栈的操作 三种基本操作 设置堆栈:SS、SP赋值(段的起始位置及长度) 进栈:把数据压入堆栈,在栈顶进行 SP-2→ SP 栈顶向上浮动 数据→(SS:SP) 出栈:从栈顶取出数据送入R/M (SS:SP) → R/M SP+2→ SP数据 栈顶向下回落
SS PUSH AX POP BX SP=SP-2 AL AH AL AH AL AH AX BX SP=SP+2 SP XX XX Bottom
§2.5外部设备 外部设备与主机(CPU)的通信是通过外设接口进行的。每个接口包括一组寄存器。 BIOS、DOS功能调用 数据寄存器 状态寄存器 命令寄存器 BIOS、DOS功能调用
386CPU内部寄存器
386CPU内部寄存器