640 likes | 872 Views
第 2 章 80x86 计算机组织. 教学要求: 1. 掌握 存储器地址 的概念和 分段 概念;掌握 物理地址 和 逻辑地址 之间的转换;掌握 CPU 中 寄存器的分类和作用 。 2. 理解计算机系统的组织结构。 3. 了解 CPU 的内部组织。. 2.1 80x86 微处理器. 奔腾 4 代. 奔腾 3 代. 奔腾 2 代. 奔腾. 80486. 80386. 80286. 8086. 4004. 2.2 计算机系统. 硬件: 三个主要组成部分 ,用系统总线连接。. 内存储器. 大容量 存储器. 中央处理机
E N D
第2章 80x86计算机组织 教学要求: 1. 掌握存储器地址的概念和分段概念;掌握物理地址和逻辑地址之间的转换;掌握CPU中寄存器的分类和作用。 2. 理解计算机系统的组织结构。 3. 了解CPU的内部组织。
2.1 80x86微处理器 奔腾4代 奔腾3代 奔腾2代 奔腾 80486 80386 80286 8086 4004
2.2 计算机系统 • 硬件:三个主要组成部分,用系统总线连接。 内存储器 大容量 存储器 中央处理机 CPU 总线控制 逻辑 接 口 . . . . . . 系统总线 接 口 I/O设备 I/O子系统
软件:系统软件 应用软件 • 系统软件 核心为操作系统,包括: I/O驱动程序、文件管理程序、文本编辑程序等。 应用程序是建立在操作系统之上的,我们采用 • DOS(MS-DOS 6.22 或 Windows 9.x的MS-DOS环境),开发汇编语言程序涉及到 • 文本编辑器 • 汇编程序 • 连接程序 • 调试程序 • 应用软件 微机中的应用软件丰富多彩.
2.3 中央处理机 2.3.1 CPU组成 它包括算术逻辑部件ALU、控制器、寄存器 • ALU:是运算器的核心部件,执行算术运算、逻辑运算、移位、比较等各种数据处理的操作。 • 控制逻辑:处理程序指令,并协调各逻辑部件按一定时序工作。包括:从存储器中读取程序指令、指令译码、从存储器中取得操作数,执行指令,把结果存入存储器,以及对总线和I/O的传送控制等。 • 工作寄存器:每一个寄存器相当于运算器中的一个存储单元,但速度比存储器快,用来存放计算过程中所需要的或得到的各种信息。
8086CPU结构图 20位 AH AL 地址加法器 BH BL 16位 通用寄存器 CH CL CS DH DL DS SP SS BP ES I/O控制电路 IP DI 内部 寄存器 SI 外总线 运算寄存器 1 2 3 4 5 6 执行部分控制电路 8位 指令队列缓冲器 ALU 标志 执行部件 总线接口部件
寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。 寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C++语言)中,也有定义变量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。 另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。 由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 2.3.2 80x86寄存器组 31 16 15 8 7 0 • EAX • EBX • ECX • EDX • ESP • EBP • ESI • EDI • EIP • EFLAGS AH AX AL BH BX BL CH CX CL DH DX DL SP BP SI DI IP FLAGS CS DS SS ES 8086 / 8088 / 80286 寄 存 器 • 80x86的程序可见寄存器组 • 通用寄存器 • 专用寄存器 • 段寄存器 FS GS
16位CPU所含有的寄存器有 4个数据寄存器(AX、BX、CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) 4个段寄存器(ES、CS、SS和DS) 1个指令指针寄存器(IP) 1个标志寄存器(Flags) 16位寄存器组
32位寄存器组 32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了2个16位的段寄存器:FS和GS。
2.3.2.1 通用寄存器组 (1)数据寄存器 • 数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。 • AX(Accumulator)寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。 • BX(Base Register)寄存器称为基址寄存器。常用于存放存储器地址。 • CX(Count Register)寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。在位操作中,当移多位时,要用CL来指明移位的位数; • DX(Data Register)寄存器称为数据寄存器。常用来存放双字数据的高16位,在进行乘、除运算时,它可作为默认的操作数参与运算,亦可存放外设端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
(2) 变址寄存器 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),主要用于存放某个存储单元的偏移地址。 SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。它们主要用于存放存储单元段内的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
(3)指针寄存器 寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。 指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 SP(Stack Pointer)为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP (Base Pointer)为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
2.3.2.2 专用寄存器: IP、SP、FLAGS (1)指令指针寄存器IP( Instruction Pointer ) 指令指针寄存器:8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。 32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。 (2)堆栈指针寄存器SP 用于存放当前堆栈段中栈顶的偏移地址
(3)标志寄存器 ( FLAGS / PSW) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 状态标志: 控制标志: OF溢出标志 DF方向标志 SF符号标志 I F中断标志 ZF零标志 TF陷阱标志 CF进位标志 AF辅助进位标志 PF奇偶标志 注:指令的执行与标志有很大关系。 状态标志 用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。 控制标志 可由程序根据需要用指令设置,用于控制处理器执行指令的方式。
若运算结果为0,则ZF = 1,否则ZF = 0。 例如: 3AH + 7CH=B6H,结果不是零:ZF = 0 86H + 7CH=(1)00H,结果是零:ZF = 1 注意:ZF为1表示的结果是0 零标志ZF(Zero Flag)
运算结果最高位为1,则SF = 1;否则SF = 0。 例如: 3AH + 7CH=B6H,最高位D7=1:SF = 1 86H + 7CH=(1)00H,最高位D7=0:SF = 0 有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。 符号标志SF(Sign Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0。 例如: 3AH + 7CH=B6H=10110110B, 结果中有5个1,是奇数:PF = 0 注意:PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。 奇偶标志PF(Parity Flag)
若算术运算的结果有溢出,则OF=1;否则 OF=0。例如: 3AH + 7CH=B6H,产生溢出:OF = 1 AAH + 7CH=(1)26H,没有溢出:OF = 0 溢出标志OF(Overflow Flag)
运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。 例如: 3AH + 7CH=B6H,D3有进位:AF = 1 这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。 辅助进位标志AF(Auxiliary Carry Flag)
用于串操作指令中,控制地址的变化方向: 设置DF=0,串操作的存储器地址自动增加; 设置DF=1,串操作的存储器地址自动减少。 CLD指令复位方向标志:DF=0 STD指令置位方向标志:DF=1 方向标志DF(Direction Flag)
用于控制外部可屏蔽中断是否可以被处理器响应:用于控制外部可屏蔽中断是否可以被处理器响应: 设置IF=1,则允许中断; 设置IF=0,则禁止中断。 CLI指令复位中断标志:IF=0 STI指令置位中断标志:IF=1 中断允许标志IF(Interrupt-enable Flag)
用于控制处理器是否进入单步操作方式: 设置TF=0,处理器正常工作; 设置TF=1,处理器单步执行指令。 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断。这种内部中断称为单步中断,所以TF也称为单步标志。 利用单步中断可对程序进行逐条指令的调试。 这种逐条指令调试程序的方法就是单步调试。 陷阱标志TF(Trap Flag)
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 TF TF TF TF TF PF PF AF ZF DF ZF IF AF AF DF IF DF PF DF DF IF IF PF ZF AF PF AF ZF IF ZF SF OF RF OF SF OF CF OF CF SF CF RF CF SF OF RF CF SF AC VM VM NT NT NT IOPL IOPL IOPL 8086/8088 80x86的标志寄存器 (P.23) 80286 NT IOPL 80386 VM 80486 AC Pentium ID VIP VIF 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 IOPL: I/O特权级 VIP:虚拟中断未决标志 NT: 嵌套任务标志VIF:虚拟中断标志 RF: 重新启动标志 VM:虚拟8086模式位 AC: 对准检查方式位 ID: 标识标志
2.3.2.3 段寄存器 段寄存器:8086CPU的4个16位的段寄存器分别称为 代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加数据段寄存器ES。段寄存器用来确定该段在内存中的起始地址。段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器: CS——代码段寄存器(Code Segment Register),其值为代码段的段值;代码段用来存放程序的指令序列。CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。 DS——数据段寄存器(Data Segment Register),其值为数据段的段值; ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。 32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下: 实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。 保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。段寄存器的具体作用在此不作进一步介绍了,有兴趣的读者可参阅其它科技资料。
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 寄存器与存储器的比较: 寄 存 器 存 储 器 在CPU内部 在CPU外部 访问速度快 访问速度慢 容量小,成本高 容量大,成本低 用名字表示 用地址表示 没有地址 地址可用各种方式形成
2.4 存储器 2.4.1 存储单元的地址和内容 • 存储单元地址 :8086系统中,为了标识和存取每一个存储单元,给每个存储单元规定一个编号,这就是存储单元地址。 • 存储单元的内容 :一个存储单元中存放的信息称为该存储单元的内容。 • 注意: 存储器以字节(8 bit)为编程单位 每个字节单元都有唯一的地址编码 地址用无符号整数来表示(编程用十六进制表示) 一个字要占用相继的两个字节 低位字节存入低地址,高位字节存入高地址 字单元地址用它的低地址来表示 机器以偶地址访问(读 / 写)存储器
二进制位:存储一位二进制数:0或1。 字节:8个二进制位,D7~D0。 字:16位,2个字节,D15~D0。 双字:32位,4个字节,D31~D0。 最低有效位LSB(Least Significant Bit):指数据的最低位,即D0位; 最高有效位MSB(Most Significant Bit):指数据的最高位,对应字节、字、双字分别指D7、D15、D31位。
存储器 7 6 5 4 3 2 1 0 字节 1 0 0 1 1 1 1 1 0000H (0000H)=9FH 0 0 1 0 0 1 1 0 0001H (0001H)=26H 0 0 0 1 1 1 1 0 0002H (0002H)=1EH 1 1 0 1 0 1 1 1 0003H (0003H)=D7H (0000H)=269FH (0002H)=D71EH (0001H)=1E26H 访问两次存储器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 字 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 高位字节 低位字节
在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。
字节 12340H、12341H的内容分别为:12H和34H等; 字 12340H、12341H的内容分别为:3412H和5634H等; 双字 12340H、12341H的内容分别为:78563412H和90785634H等。 内存单元存放内容示意图
2.4.2 实模式存储器寻址 实模式实际上是为8088/8086而设计的工作方式,目的是解决在16位字长的机器中如何提供20位地址的问题。80286及其后微处理器除可在实模式下工作外,还可在保护模式下工作。 下面,我们将首先介绍一下实模式下的存储器寻址方法 —— 存储器地址的分段。
1、存储器的分段 我们知道:计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。 存储单元的物理地址是一个无符号的二进制数。但为了书写的简化,物理地址通常用十六进制来表示。 16位CPU内部有20根地址线,其编码区间为:00000H~0FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。而16位CPU内部存放存储单元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX等)都是16位,它们的编码范围仅为:00000H~0FFFFH。这样,如果用16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将无法访问。为了能用16位寄存器来有效地访问1M的存储空间,16位CPU采用了内存分段的管理模式,并引用段寄存器的概念。
16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0; 逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。 按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。 图为内存各逻辑段之间的分布情况示意图,其中有相连的段(如:C和D段)、不相连的段(如:A和B段)以及相互重叠的段(如:B和C段)。 16位微机内存分段管理示意图
(1)存储器地址的分段 20 根地址线: 地址范围 00000H ~ FFFFFH (1MB) 机器字长16位:仅能表示地址范围 0000H ~ FFFFH(64KB) 小段:每16个字节为一小段,共有64K个小段 小段的首地址 00000 H ~ 0000F H 00010 H ~ 0001F H 00020 H ~ 0002F H … FFFF0 H ~ FFFFF H 段起始地址:小段首地址 段的大小: 64K 范围内的任意字节
物理地址的形成方式 由于规定段地址必须是16的倍数,所以,其值的一般形式为:XXXX0H,即:前16位二进制位是变化的,后四位是固定为0。鉴于段地址的这种特性,我们可以仅保存其前16位二进制来达到保存整个段地址,其后四位可通过“左移补0”来获得。 在确定了某个存储单元所属的内存段后,我们也只知道其所处内存位置的范围,还不能确定其具体位置。要想确定内存单元的具体位置,还必须知道该单元离该段地址有多远。我们通常把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。有了段地址和偏移量,就能唯一地确定某一内存单元在存储器内的具体位置。
由此可见,存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PA—Physical Address)的计算方法如下: 物理地址PA=段地址×16 + 偏移量 计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。图是物理地址的计算示意图。 段地址 偏移量 物理地址
存储器分段:段起始地址必须是某一小段的首地址,段的大小可以是64K范围内的任意字节。存储器分段:段起始地址必须是某一小段的首地址,段的大小可以是64K范围内的任意字节。 物理地址:每个存储单元的唯一的20位地址 段地址:段起始地址的高16位,低4位为0000B 偏移地址(有效地址EA):段内相对于段起始地址的偏移值(16位) 物理地址 = 16d 段地址 + 偏移地址 16 位 段 地 址 0000 16 位 偏 移 地 址 + 20 位 物 理 地 址
对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。如图所示。对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。如图所示。 物理地址和逻辑地址之间的关系
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 存储器的逻辑地址与物理地址 逻辑地址 物理地址 段地址 : 偏移地址 10000H 1000 : 0000H 10011111 00100110 10001H 1000 : 0001H 01001000 1000 : 0002H 10002H 1000 : 0003H 10000011 10003H 01011100 10004H 1000 : 0004H 10100010 10005H 1000 : 0005H 字节内容(10000H)=9FH;(10001H)=26H 字内容 (10000H)=269FH;(10001H)=4826H 访问两次内存
2 段寄存器 8086有4个16位段寄存器: CS(代码段寄存器)指明代码段的起始地址 SS(堆栈段寄存器)指明堆栈段的起始地址 DS(数据段寄存器)指明数据段的起始地址 ES(附加段寄存器)指明附加段的起始地址 每个段寄存器用来确定一个段的起始地址,每种段均有各自的用途。