计算机组成原理与汇编语言程序设计(第2版)第 4 章(2)14.2.1 80x86 CPU的寄存器1.80x86 CPU的寄存器分类 80x86 CPU的内部寄存器可分为以下3大类:§ 基本结构寄存器组 :通用寄存器、指令指针寄存器、标志寄存 器、段寄存器 § 系统级寄存器组 :系统地址寄存器、控制寄存器、测试寄存器、 调试寄存器 § 浮点寄存器组 :数据寄存器、标记字寄存器、指令和数据指针寄 存器、控制字寄存器4.2 80x86 CPU的寄存器和主存储器P14122.基本结构寄存器组基本结构寄存器组如右图 所示:通用寄存器;指令指针寄存器;标志寄存器;段寄存器 P1423(1)通用寄存器图中除阴影区以外的寄存器是8086/8088和80286所具 有的寄存器,它们都是16位寄存器其中4个16位的寄存 器AX、BX、CX、DX可称为数据寄存器这4个寄存器都 是通用寄存器,但它们又可以用于各自的专用目的AX(Accumulator)作为累加器用在乘除等指令中 指定用来存放操作数另外,所有的I/O 指令都使用这一 寄存器与外部设备传送信息BX(Base)可以作为通用寄存器使用。
此外,在计算 存储器地址时,它经常用作基址寄存器CX(Count)可以作为通用寄存器使用此外,它还 常用来保存计数值,如在移位指令、循环(LOOP)和串 处理指令中用作隐含的计数器DX可以作为通用寄存器使用一般在做双字长运算时 把DX和AX组合在一起存放一个双字长数,DX用来存放 高位字此外,对某些I/O 操作,DX可用来存放I/O 的端 口地址 4SP、BP、DI、SI 这4个16位寄存器可以像数据寄存器 一样在运算过程中存放操作数,但它们只能以字(16位) 为单位使用此外,它们更经常的用途是在存储器寻址时 ,提供偏移地址因此,可称它们为指针或变址寄存器2)指令指针寄存器和标志寄存器IP(Instruction Pointer)为指令指针寄存器,它用来 存放代码段中的偏移地址IP作为指令的地址指针,其作 用类似于其他计算机中的程序计数器PC,当现行指令执 行完毕时,由IP提供下一条指令地址FLAGS为标志寄存器,又称PSW(Program Status Word),即程序状态寄存器这是一个存放条件码标志 、控制标志和系统标志的寄存器80386及其后继机型的指令指针寄存器EIP和标志寄存 器EFLAGS是32位的,其作用和相应的16位寄存器相同。
5下图说明了80x86 CPU中标志寄存器的内容:P1446① 条件码标志包括以下6位:OF(Over Flow Flag) 溢出标志将参加算术运算的数 看作带符号数,如运算结果超出补码表示数的范围N,即溢 出时,则OF置1;否则OF置0对于字节运算有 128≤N≤+127;对于字运算有32768≤N≤+32767SF(Sign Flag) 符号标志把指令执行结果看作带符号 数,如结果为负,则SF置1;结果为正,则SF置0ZF(Zero Flag) 零标志如指令执行结果各位全为0时 ,则ZF置1;否则ZF置0CF(Carry Flag) 进位标志在进行算术运算时,如 最高位(对字操作是第15位,对字节操作是第7位)产生进 位或借位时,则CF置1;否则置0在移位类指令中,CF用 来存放移出的代码(0或1)AF(Auxiliary Carry Flag) 辅助进位标志在进行算 术运算时,如低字节中低4位(第3位)产生进位或借位时, 则AF置1;否则AF置0AF可用于十进制运算的校正PF(Parity Flag) 奇偶标志用来为机器中传送信息时 可能产生的代码出错情况提供检验条件。
当运算结果中1的 个数为偶数时置1,否则置07② 控制标志位1位DF(Direction Flag)方向标志,用来在串处理指令 中控制处理信息的方向当DF位为1时,每次操作后使变 址寄存器SI和DI减小,这样就使串处理从高地址向低地址 方向处理当DF位为0时,则使SI和DI增大,使串处理从 低地址向高地址方向处理③ 系统标志位有10位: TF(Trap Flag) 陷阱标志,用于调试时的单步方式 操作IF(Interrupt Flag) 中断标志 IOPL(I/O Privilege Level) I/O特权级标志 NT(Nested Task) 嵌套任务标志,用来表示当前的 任务是否嵌套在另一任务内 8RF(Resume Flag) 恢复标志位,它与调试寄存器的 断点一起使用,以保证不重复处理断点 VM(Virtual-8086 Mode) 虚拟8086模式位 AC(Alignment Check mode) 对准检查方式位 VIF(Virtual Interrupt Flag) 虚拟中断标志VIP(Virtual Interrupt Pending flag) 虚拟中断未决 标志。
ID(IDentification flag) 标识标志,程序有设置和 清除ID标识的能力,以指示处理机对CPU ID指令的支持 9在调试程序DEBUG中提供了测试标志位的手段,它 用符号表示某些标志位的值: 标标志名标标志为为1标标志为为0OF 溢出(是/否) OVNVDF 方向(增量/ 减量)DNUPIF 中断(允许许/关闭闭)EIDISF 符号(正/负负)NGPLZF 零(是/否)ZRNZAF 辅辅助进进位(是/否)ACNAPF 奇偶(偶/奇)PEPOCF 进进位(是/否)CYNC10(3)段寄存器段寄存器用于存储器寻址,用来直接或间接地存放段 地址段寄存器的长度为16位,在80286以前的处理器中 ,只有代码段CS(Code Segment)、数据段DS(Data Segment)、堆栈段SS(Stack Segment)和附加段ES( Extra Segment)4个寄存器从80386起,增加了FS和GS 两个段寄存器,它们也属于附加的数据段。
有关段寄存器 的使用将在下一节中说明114.2.2 80x86的主存储器1.存储单元的地址和内容每8位二进制数组成一个字节,位 编号如图(a)所示8086、80286的 字长为16位,由两个字节组成,位编 号如图(b)所示80386~Pentium机 的字长为32位,由两个字即4个字节组 成,在80x86系列中称其为双字,位编 号如图(c)所示此外,还有一种由 8个字节即字长为64位组成的4字,位 编号如图(d)所示P14612在存储器里以字节为单位存储信息为了正确地存放或取 得信息,每一个字节单元给予一个唯一的编号即存储器地址, 称为物理地址地址从0开始编号,顺序地每次加1,因此存储 器的物理地址空间呈线性增长在机器里,地址也是用二进制 数来表示的当然它是无符号整数,书写格式为十六进制数 · 8086/8088的地址总线20位:可访问的字节单元地址范围为00000H~FFFFFH; · 80286的地址总线24位:可访问的地址范围为000000H~FFFFFFH; · 80386/80486和Pentium地址总线32位:地址范围为00000000H~FFFFFFFFH; · Pentium Pro和PⅡ地址总线36位:地址范围为000000000H~FFFFFFFFFH。
13一个存储单元中存放的信息称为该存储单 元的内容,右图表示了存储器里存放信息的 情况0004H号字节单元中存放的信息为78H, 表示为: (0004H)=78H两个字节单元就构成了一个字单元,字单 元的地址采用它的低地址来表示右图中 0004H字单元的内容为5678H,表示为(0004H)= 5678H双字单元的地址由其最低字节的地址指定, 因此0004H双字单元的内容为:(0004H)=12345678H 142.实模式存储器寻址80x86中除8086/8088只能在实模式下工作外,其他的 CPU均可在实模式或保护模式下工作1)存储器的分段实模式下允许的最大寻址空间为1 MB8086/8088的地 址总线宽度为20位,因而其最大寻址空间正好是1MB在 1MB的存储器里,每个存储单元都有一个唯一的20位地址 ,称为物理地址而对于其他微处理器在实模式下只能访 问前1 MB的存储器地址P14715实模式就是为8086/8088而设计的工作方式,它要解决在16位 字长的机器里怎么提供20位地址的问题,而解决的办法是:将1 MB主存空间划分为若干段,每个段的最大长度为64 KB单元,这 样段内地址可以用16位表示。
如果能再提供段的20位起始地址, 那么通过这两个地址就可以访问段内任何一个存储单元因此, 在CPU中设置的段寄存器只有16位,只能存放20位段起始地址的 高16位,称它为段基值(Segment Base Value),而机器将段起始 地址的低4位设置为0故将段基值左移4位后(即末尾加4位二进 制数0),就得到一个20位的段起始地址,称它为段基地址或段基 址(Segment Base Address)显然,段基址为xxxx0H,其低4位 二进制数为0,即能被16整除的主存物理地址才可作为段基址 段内地址即偏移地址,它是一个主存单元与所在段的段基址 之间的字节距离,通常由CPU按指令的寻址方式计算得到或由指 令指针IP提供,又称为有效地址当CPU访问某个主存单元时, 必须指明由哪个段寄存器提供段基值,同时给出偏移地址然后 将16位段基值左移4位后与16位偏移地址相加,形成20位主存单元 的物理地址,这一过程可以表示如下: 16实模式存储器寻址过程如下图所示:17(2)段寄存器在8086~80286中,有4个专门存放段基值的寄存器,称 为段寄存器它们分别是代码段CS、数据段DS、堆栈段SS和 附加段ES寄存器。
每个段寄存器可以确定一个段的起始地址,而这些段则各 有各的用途代码段存放当前正在运行的程序数据段存放当 前运行程序所用的数据堆栈段定义了堆栈的所在区域附加 段是附加的数据段,它是一个辅助的数据区,也是串处理指令 的目的操作数存放区在80386及其后继的80x86中,除上述4个段寄存器外,又 增加了2个段寄存器FS和GS,它们也是附加的数据段寄存器, 所以8086~80286的程序允许4个存储段,而后继的80x86程序 可允许6个存储段18一般情况下,各段在存储器 中的分配是由操作系统负责的 每个段可以独立地占用小于 或等于64 KB的存储区,如右图所示 19【例】 如果代码段中的程序占有8 KB(2000H )存储区,数据段占有2 KB(800H)存储区 ,堆栈段只占有256 B的存储区,此时段区的 分配如右图所示从图中可以看出,代码段的区域可以是 02000H~03FFFH,但由于程序区只需要8 KB ,所以程序区结束后的第一个小段的首地址就 作为数据段的起始地址也就是说,在这里, 代码段和数据段可以重叠在一起当然每个存 储单元的内容是不允许发生冲突的这里所谓 的重叠只是指每个段区的大小允许根据实际需 要来分配,而不一定要占有64 KB的最大段空 间。
20在80x86中,段寄存器和与其对应存放偏移地址 的寄存器之间有一种默认的组合关系,如下表所示: 8086/8088、80286: 段寄存器 偏移地址CSIP SSSP或BP DSBX、SI、DI或一个16位数 ESDI(用于串指令)80386及其后继机型: 段寄存器 偏移地址CSEIP SSESP或EBP DSEAX、EBX、ECX、EDX、EDI、 ES。