第 2 章
80x86系列结构微处理器与 8086
本章讲述:
2.1 80x86系列微处理器是 8086的延伸
2.2 8086的功能结构
2.3 8086微处理器的执行环境本章重点难点本章介绍微型计算机系统中的核心部件微处理器( CPU),通过学习 CPU的功能结构,掌握 CPU中的两个独立单元(执行单元 EU和总线接口单元 BIU的并行执行过程;通过介绍 8086
寄存器结构,学习汇编语言程序设计所需的 14
个寄存器,掌握这些寄存器的正确使用;通过介绍 8086/8088的存储器组织与分段,I/O端口地址空间等基本知识,了解 8086CPU与外围电路的关系。
2.1 x86系列 微处理器是 8086的延伸如上章所述,x86系列结构微处理器的增长基本上按摩尔定律发展,已经经历许多代。但从使用者(包括程序员)
的角度来看,它是以 8086处理器为基础,
是一个兼容的微处理器系列,是 8086在功能上和性能上的延伸。
2.1.1 8086功能的扩展
1,从 16位扩展为 32位
8086是 16位微处理器 。它的内部寄存器的主体是 16位的。它的主要用于存放操作数的数据寄存器是 16位的。它的主要的用作为地址指针的指针寄存器也是 16
位的。依赖 分段 机制,用 20位段基地址加上 16位的偏移量形成了 20位的地址,
以寻址 1MB的物理地址 。
16位,无论作为数的表示,它能表示的数的范围是十分有限的。用 16位作为地址,它只能表示 64KB,更是一个十分小的地址范围,远远不能满足应用的需要。因而,于 1985年,Intel公司推出了第一个 32位的微处理器 -- 80386,开创了微处理器的 32位时代。目前,计算机正从 32位向 64位转移,但主流仍是 32位机。
32位,无论从能表示的数的范围,还是能寻址的物理地址,特别是能寻址的物理地址都极大的扩展了。使得微处理器能取代以前的所谓,大型机,,能应用于各种领域,从而极大地促进了计算机在各行各业中的应用。
32位地址能寻址 4GB物理地址。到目前,仍远大于主流计算机的实际内存配置,仍有广阔的应用余地。
2,从实模式至保护模式当 1981年,IBM公司刚推出 IBM-PC时,
主频是 5MHz,内存是 64KB-128KB,没有硬盘,只有单面单密度的软盘,到了
PC/XT,才有 10MB硬盘。在这样的硬件资源下,采用的操作系统是 PC-DOS
( MS-DOS)。这是单用户、单任务的磁盘操作系统。操作系统本身没有程序隔离、没有保护。这是 DOS遭受病毒泛滥的内因。
随着 PC机的大量普及,随着硬件性能的迅速提高。要求有能保护操作系统核心软件的多任务操作系统。为使这样的操作系统能在微型计算机系统中应用与普及,要求微处理器本身为这样的操作系统提供支持。于是,从 80286
开始,在 80386中真正完善保护模式。在保护模式下,程序运行于四个特权级。这样,可以实现操作系统核心程序与应用程序的严格的隔离。 保护模式支持多任务机制,任务之间完全隔离。
3,片内存储管理单元 - MMU
32位地址,可寻址 4GB物理地址。但大多数 PC机的物理内存配置远小于 4GB。但应用程序却需要庞大的地址空间。因此,在操作系统中提供了虚拟存储器管理机制,而这要求硬件支持。 因而,在 80386中提供了片内的 MMU。
提供了 4K页、页表等支持。
以上三点是 80386相对于 8086的主要功能扩展。
4,浮点支持工程应用、图形处理、科学计算等要求浮点支持(实数运算)。因此,自
80486芯片开始,在 x86系列微处理器中集成了 x87(及其增强)浮点单元。
5,MMX技术为支持多媒体技术的应用,如音乐合成、语音合成。语音识别、音频和视频压缩(编码)和解压缩(译码),2D 和
3D 图形(包括 3D 结构映像)和流视频等等。 x86系列处理器中增加 MMX技术及相应的指令
6,流 SIMD扩展( SSE)
自 Pentium III处理器开始,在 x86系列微处理器中引进了流 SIMD(单指令多数据)扩展( SSE)技术。 SSE扩展把由
Intel MMX引进的 SIMD执行模式扩展为新的 128位 XMM寄存器和能在包装的单精度浮点数上执行 SIMD操作。
奔腾 4处理器又进一步扩展为流 SIMD
扩展 2( SSE2):
— 用 144条新指令扩展 Intel MMX技术和 SSE扩展,它包括支持:
128位 SIMD整数算术操作。
128位 SIMD双精度浮点操作。
128 位指令设计以支持媒体和科学应用。由这些指令所用的向量操作数允许应用程序在多个向量元素上并行操作。
元素能是整数(从字节至四字)或浮点数(单精度或双精度)。算术运算产生有符号的、无符号的和 /或混合的结果。
2.1.2 8086性能的提高
x86系列系列芯片的发展的一个重要方面是提高性能。
1,利用流水线技术提高操作的并行性提高性能的一个重要方面是利用超大规模集成电路的工艺与制造技术提高芯片的主频。
即减少一个时钟周期的时间。提高性能的另一重要方面是缩短执行指令的时钟周期数。在
8086中,利用流水线把取指令与执行指令重叠,
减少了等待取指令的时间,从而使大部分指令的执行为四个时钟周期。
80386利用芯片内由 6个能并行操作的功能部件组成,从而使执行一条指令缩短为两个时钟周期。
80486将 80386处理器的指令译码和执行部件扩展成五级流水线,进一步增强了其并行处理能力,在五级流水线中最多可有五条指令被同时执行,每级都能在一个时钟周期内执行一条指令,80486微处理器最快能够在每个 CPU
时钟周期内执行一条指令。
到了 奔腾处理器增加了第二个执行流水线以达到超标量性能 (两个已知的流水线 u和 v,
一起工作能实现每个时钟执行两条指令)。
Intel Pentium 4处理器是第一个基于 Intel
NetBurst微结构的处理器。 Intel NetBurst微结构是新的 32bit微结构,它允许处理器能在比以前的 X86系列处理器更高的时钟速度和性能等级上进行操作。 Intel Pentium 4处理器有快速的执行引擎,Hyper流水线技术与高级的动态执行。使指令执行的并行性进一步提高,从而做到在一个时钟周期中可以执行多条指令。
2,引入片内缓存 ( CACHE)
随着超大规模集成电路技术的发展,存储器的集成度和工作速度都有了极大的提高。但是,相对于 CPU的工作速度仍然至少差一个数量级。为了减少从存储器中取指令与数据的时间,利用指令执行的局部性原理,把近期可能要用到的指令与数据放在工作速度比主存储器更高(当然,容量更小)的缓存中。这样的思想,进一步在处理器中实现,即在处理器芯片中实现了缓存。目前,
通常在处理器芯片上有指令和数据分开的一级缓存与指令与数据混合的二级缓存。且缓存的容量越来越大。从而进一步提高了处理器的性能。
总之,x86系列系列处理器芯片就是沿着这样的思路发展的。因此,8086是
x86系列系列处理器的基础。而且,任一种 x86系列处理器芯片在上电后,就是处在 8086的实模式 。 根据需要,用指令进入各种操作模式。 所以,学习 x86系列处理器必须学习掌握 8086,也只能从 8086
入手。
从指令,从编程来说,几乎没有用汇编语言来使用浮点指令,MMX指令与
XMM指令的,都是通过高级语言来使用这些指令的。因而,绝大部分程序员,
除了编写操作系统代码的外,面对 x86系列处理器的指令,实际上是面对 8086指令。
因此,本书从 8086入手来学习与掌握
x86系列处理器。
2.2 8086的功能结构
8086的功能结构如图 2-1所示。
图 2- 1 8086的功能结构图从功能结构看,分两部分:
2,执行部件 EU (Execution Unit)
1,总线接口部件 BIU (Bus Interface Unit)
二、总线接口部件 BIU
负责与存储器,I/O接口电路传送信息。
1,BIU的功能:
2,BIU的组成
(1) 四个段地址寄存器
CS ––– 16位代码段寄存器
DS ––– 16位数据段寄存器
ES ––– 16位附加段寄存器
SS ––– 16位堆栈段寄存器
(2) IP ––– 16位指令指针寄存器指向下一条要取出的指令。
(3) 20位地址加法器
16 位内部寄存器提供的信息经地址加法器产生 20位地址信息 。
逻辑地址段 寄存器 0000
加法器物理地址
19 0
15 0
15 0
偏移地址段 地址图 2 - 3 物理地址形成过程逻辑地址段 寄存器加法器物理地址
偏移地址段 地址图 物理地址形成过程例:指令的物理地址 = CS? 16 + IP
若 CS = 1000H,IP = 3050H,则
PA = 10000H + 3050H = 13050H
(4) 六字节的指令队列取指令与执行指令并行工作,即在一条指令的执行过程中,可以取出下一条或多条指令,在指令队列中排队。
二、执行部件 EU
1,EU的功能:
负责指令的执令。译码指令并利用内部寄存器和 ALU来处理数据。
2,结构组成
四个通用寄存器 AX,BX,CX,DX。
四个专用寄存器:
标志寄存器 FR。
算术逻辑单元 ALU。
基数指针寄存器 BP,堆栈指针寄存器 SP,
源变址寄存器 SI,目的变址寄存器 DI。
3,8086 CPU中 EU的特点
四个通用寄存器 AX,BX,CX,DX可以作为 16位寄存器使用,也可以分别作为两个 8位寄存器使用。
AX
BX
CX
DX
AH AL
BH BL
CH CL
DH DL
AX又称累加器,指令系统中许多指令都是利用 AX来实现的。
FR共有 16位,其中 7位未用,各位的定义如下:
15 014 13 12 11 10 9 8 7 6 5 4 3 2 1
OF DF IF TF SF ZF AF PF CF
标志寄存器根据功能,有两类标志状态标志 (6个 )
控制标志 (3个 )
表 2.1 8086 CPU 标志位情况名 称 符 号符号标志 SF
功能与运算结果的最高位相同,当数据用补码表示时,负数的最高位为 1,所以符号标志表示运算执行后的结果是正还是负零标志 ZF 当前的运算结果为零,当前的运算结果为非零奇偶标志 PF 运算结果所含的 1的个数为偶数进位标志 CF 当执行一个加法运算使最高位产生进位时,或者执行一个减法运算引起最高位产生借位时,此外,循环指令也影响这一标志辅助进位标志 AF
加法运算时,如果第 3位往第 4位有进位;减法运算时,如果第 3位往第 4位有借位。辅助进位标志一般在 BCD码运算中作为是否进行十进制调整的判断依据溢出标志 OF 运算过程中产生溢出时,所谓溢出,是指当字节运算的结果超出了范围?128~ +127,或者当字运算的结果超出了范围?32768~ +32767
时称为溢出方向标志 DF 控制串操作指令用的标志。 DF=0,串操作过程中的地址会不断增值; DF=1,串操作过程中的地址会不断减值中断标志 IF 控制可屏蔽中断的标志。 IF=0,CPU不能对可屏蔽中断请求作出响应; IF=1,CPU可以接受可屏蔽中断请求跟踪标志 TF CPU按跟踪方式执行指令三,BIU和 EU的并行工作
BIU 取指 1 取指 2 取指 3 取指 4 取数据 取指 5 …
EU 等待 执行 1 执行 2 执行 3 执行 4 …
大大减少了等待对取指所需的时间,
提高了 CPU的利用率。一方面可以提高整个程序的执行速度,另一方面又降低了与之相配的存储器的存取速度的要求。
这种重叠的操作技术,过去只在大型机中才使用称为流水线,在 X86系列系列微处理器中得到了广泛的使用与提高。
2.3 8086微处理器的执行环境本节描述汇编语言程序员看到的 8086
处理器的执行环境。它描述处理器如何执行指令及如何存储和操作数据。执行环境包括内存(地址空间)、通用数据寄存器、段寄存器、标志寄存器
( EFLAGES)和指令指针寄存器等。
2.3.1 基本执行环境概要在 8086处理器上执行的程序或任务都有一组执行指令的资源用于存储代码、
数据和状态信息。这些资源构成了 8086
处理器的执行环境。
地址空间
8086处理器上运行的任一任务或程序能寻址 1MB( 220)字节的线性地址空间。
基本程序执行寄存器八个通用寄存器、四个段寄存器、标志寄存器 FLAGS和 IP(指令指针)寄存器组成了执行通用指令的基本执行环境。
这些指令执行字节、字整型数的基本整数算术运算,处理程序流程控制,在字节串上操作并寻址存储器。
堆栈( stack)
为支持过程或子程序调用并在过程或子程序之间传递参数,堆栈和堆栈管理资源包含在基本执行环境中。堆栈定位在内存中。
I/O端口
8086结构支持数据在处理器和输入输出( I/O)端口之间的传送。
8086处理器的基本执行环境如图 2-4所示。
2.3.2 基本的程序执行寄存器处理器为了应用程序编程提供了如图 2-4所示的 14个基本程序执行寄存器。
这些寄存器能分组如下:
通用寄存器 这八个寄存器能用于存放操作数和指针。
段寄存器 这些寄存器最多能保存四个段选择子。
FLAGS寄存器 FLAGS寄存器报告正在执行的程序的状态,并允许有限地(应用程序级)控制处理器。
IP寄存器 IP寄存器包合下一条要执行的指令的 16位指针。
1.通用寄存器八个 32位通用寄存器 AX,BX,CX、
DX,SI,DI,BP和 SP用于处理以下项:
逻辑和算术操作的操作数;
用于地址计算的操作数;
内存指针。
虽然所有这些寄存器都可用于存放操作数、结果和指针,但在引用 SP寄存器时要特别小心。 SP寄存器保持堆栈指针,
通常不要用于其它目的 。
这些通用寄存器中的前四个,即 AX、
BX,CX,DX通常称为 数据寄存器,用以存放操作数。后四个,即 SI,DI,BP、
SP通常称为 指针寄存器 。虽然它们也可以存放操作数,但主要用作地址指针。
数据寄存器 AX,BX,CX和 DX又可以分别作为 AH,BH,CH和 DH(高字节)以及
AL,BL,CL和 DL(低字节) 8位寄存器引用,如图 2-5所示。
SP是 堆栈指针,它与段寄存器 SS一起确定在堆栈操作时,堆栈在内存中的位置。用 BP( Base Pointer Register)寻址堆栈操作数时,也是寻址堆栈段。 SI
( Source Index Register)和 DI
( Destination Index Register)常用于 串操作 。
2.段寄存器段寄存器( CS,DS,SS,ES)保存
16位段选择子。一个段选择子是标志内存中一个段的特殊指针。为访问在内存中的具体段,此段的段选择子必须存在于适当的段寄存器中。
当写应用程序代码时,程序用汇编程序的命令和符号建立段选择子。然后汇编程序和别的工具建立与这些命令和符号相关的实际段选择子值。若写系统代码,程序员可能需要直接建立段选择子。
当使用分段存储模式时,初始,每一个段寄存器用不同的段选择子加载,所以每个段寄存器指向线性地址空间中的不同的段。如图 2-6所示。
任何时候,一个程序能访问多至线性地址空间中的四个段。为访问未由一个段寄存器指向的段,程序必须首先把要访问的段的段选择子加载至一个段寄存器。
每个段寄存器与三种存储类型之一相关,代码、数据或堆栈 。例如,CS寄存器包含代码段的段选择子,其中存放正在执行的指令。处理器用在 CS寄存器中的段选择子和 IP寄存器中的内容组成的逻辑地址取下一条要执行的指令。 CS寄存器不能由应用程序直接加载,而是由改变程序控制的指令或内部处理器指令
(例如,过程调用、中断处理)隐含加载。
DS,ES寄存器指向两个数据段。两个数据段的可用性,允许有效而又安全地访问数据结构的不同类型。例如,可只建立两个不同的数据段:一个用于当前模块的数据结构,另一个用于从较高级模块输出的数据。为了访问附加的数据段,应用程序必须按需要把这些段的段选择子加载至 DS,ES寄存器中。
SS寄存器包含堆栈段的段选择子。所有的堆栈操作都用 SS以找到堆栈段。不像 CS寄存器,SS寄存器能显式加载。它允许应用程序设置多个堆栈并在堆栈之间切换。
3,FLAGS寄存器
16位 FLAGS寄存器包含一组状态标志、
一个控制标志一个系统标志。
在处理器初始化(由 RESET脚或 INIT脚有效)之后,FLAGS寄存器是 0002H。此寄存器的位 1,3,5,12-15保留。软件不能用或依赖于这些位中的任一个。 FLAGS寄存器中以下指令能用于标志组与堆栈或 AX寄存器之间的移动:
LAHF,SAHF,PUSHF,POPF。在 FLAGS寄存器的内容已经传送至过程堆栈或 AX寄存器之后,
标志能作修改。
当调用中断或异常处理时,处理器自动保存 FLAGS寄存器的状态至堆栈上。
( 1)状态标志
FLAGS寄存器的状态标志(位 0,2、
4,6,7和 11)指示算术指令,例如 ADD、
SUB,MUL和 DIV指令的结果的一些特征。
状态标志的功能如下:
① 进位标志 CF( Carry Flag)
当结果的最高位(字节操作时的 D7或字操作时的
Dl5、双字操作的 D31)产生一个进位或借位,则 C= 1,
否则为 0。这个标志主要用于多字节数的加、减法运算。
移位和循环指令也能够把存储器或寄存器中的最高位
(左移时)或最低位(右移时)放入标志 CF中。 ② 辅助进位标志 AF( Auxitiary Carry Flag)
在字节操作时,则由低半字节(一个字节的低 4位)
向高半字节有进位或借位,则 AF= 1,否则为 0。这个标志用于十进制算术运算指令中。
③ 溢出标志 OF( Overflow Flag)
在算术运算中,带符号数的运算结果超出了 8位、
16位带符号数能表达的范围,即在字节运算时> +127
或<- 128,在字运算时> +32767或<- 32768此标志置位,否则复位。一个任选的溢出中断指令,在溢出情况下能产生中断。
④ 符号标志 SF( Sign Flag)
它的值与运算结果的最高位相同。即结果的最高位(字操作时为 D15)为 1,则 SF= 1;否则,SF= 0。
由于在 X86系列结构微处理器中,符号数是用补码表示的,所以 S表示了结果的符号,SF=0为正,SF=1
为负。
⑤ 奇偶标志 PF( Parity Flag)
若操作结果中,1”的个数为偶数,则 PF= 1,否则
PF= 0。这个标志可用于检查在数据传送过程中是否发生错误。
⑥ 零标志 ZF( Zero Flag)
若运算的结果为 0,则 ZF= 1,否则 ZF= 0
在这些状态标志中,只有进位标志 CF能用指令 STC
(设置进位位),CLC(清除进位位)和 CMC(进位位取反)直接进行修改。也可以用位操作指令( BT、
BTS,BTR和 BTC)拷贝规定位至 CF标志。
这些状态标志允许算术操作以产生三种不同数据类型的结果:无符号整数、
符号整数和 BCD整数。若算术操作的结果作为无符号整数对待,CF标志指示超出范围(进位或借位);若作为符号整数( 2的补码值)对待,OF标志指示是否超出范围;若作为 BCD数对待,AF标志指示进位或借位。
SF标志指示符号整数的符号。 ZF标志指示符号整数或无符号整数是否为 0。
当执行多精度整数算术运算时,CF用于与带进位加( ADC)和带借位减( SBB)
指令一起产生适当的进位或借位。
例 1:执行以下两数的加法操作,判断各标志位的状态 。
0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1
+ 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1
———————————
0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0
执行以上操作后,各状态标志位的状态应是:
CF= 0,PF= 0,AF= 0,ZF= 0,SF= 0,OF= 0
例 2:执行加法操作。
1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
———————————
1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1
各状态标志位的状态应是:
CF= 1,PF= 1,AF= 0,ZF= 0,SF= 1,OF= 0
例 3:执行加法操作。
0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
———————————
1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
执行以上加法操作后,各状态标志位的状态应是:
CF= 0,PF= 0,AF= 0,ZF= 0,SF= 1,OF= 1
( 2)控制标志
EFLAGS寄存器的控制标志(位 8,9,10)
指示程序和机器运行的状况。控制标志的功能如下:
① 方向标志 D( Direction Flag)
若用指令置 DF= 1,则引起串操作指令为自动减量指令,也就是从高地址到低地址或是
,从右到左,来处理串;若使 DF= 0,则串操作指令就为自动增量指令。
STD和 CLD指令分别地设置和清除 DF 标志。
② 中断允许标志 IF( Interrupt-enable Flag)
若指令中置 IF= 1,则允许 CPU去接收外部的可屏蔽的中断请求;若使 IF= 0,则屏蔽上述的中断请求;对内部产生的中断不起作用。
③ 追踪标志 TF( Trace Flag)
置 IF标志,使处理进入单步方式,以便于调试。在这个方式下,CPU在每条指令执行以后,产生一个内部的中断,允许程序在每条指令执行完以后进行检查。
4.指令指针指令指针( IP)寄存器包含下一条要执行的指令在当前码段中的偏移。通常,
它是顺序增加的,从一条指令边界至下一条指令,但在执行 JMP,Jcc,CALL、
RET和 IRET等指令时,它可以向前或向后移动若干条指令。
IP寄存器不能直接由软件访问;它由控制传送指令(例如,JMP,Jcc,CALL
和 RET)、中断和异常隐含控制。读 IP寄存器的唯一方法是执行一条 CALL指令,
然后从堆栈中读指令指针的返回值。 IP
寄存器能由修改过程堆栈上指令指针的返回值并执行返回指令( RET或 IRET)
来间接修改。
2.3.3 存储器组织处理器在它的总线上寻址的存储器称为物理存储器 。物理存储器按字节序列组织。每个字节赋予一个唯一的地址,
称为 物理地址 。物理地址空间的范围从
0~ 220–1( 1MB)的最大值。事实上设计与 8086处理器一起工作的任何操作系统和执行程序都使用处理器的存储管理设施访问存储器。这些设施提供例如 分段特性 以允许有效地和可靠地管理存储器。
思考:
为什么要分段?
8086有 20条地址引线,它的直接寻址能力为
220= 1M字节。所以,在一个 8086组成的系统中,
可以有多达 1M字节的存储器。这 1M字节逻辑上可以组织成一个线性矩阵。地址从 00000H到
FFFFFH。给定一个 20位的地址,就可以从这 1M
字节中取出所需要的指令或操作数。
在 8088/8086CPU内部能向存贮器提供地址码的地址寄存器有六个,均为 16位,用这六个 16位地址寄存器任意一个给外部存贮器提供地址,只能提供 64K个地址。所以,对 1MB地址寻址不完。
这六个 16位地址寄存器分别为:
整个 1M字节存储器以 64K为范围分为若干段。在寻址一个具体物理单元时,必须要由 一个基地址再加上 由 SP或 IP或 BP或 SI
或 DI等可由 CPU处理的 16位 偏移量 来形成实际的 20位物理地址 。
如何分段?
1MB的存贮空间中,每个存贮单元的实际地址编码称为该单元的物理地址 (用 PA表示 )。
把 1MB的存贮空间划分成若干个逻辑段,每段最多 64KB。
各逻辑段的起始地址必须能被 16整除,即一个段的起始地址 (20位物理地址 )的低 4位二进制码必须是 0。
一个段的起始地址的高 16位自然数为该段的段地址,
显然,在 1MB的存贮空间中,可以有个段地址,每个相邻的两个段地址之间相隔 16个存贮单元。
在一个段内的每个存贮单元,可以用相对于本段的起始地址的偏移量来表示,这个偏移量称为段内偏移地址,
也称为有效地址 (EA)。
段内偏移地址也用 16位二进制编码表示,所以,在一个段内有 =64K个偏移地址 (即一个段最大为 64KB)。
在一个 64KB的段内,每个偏移地址单元的段地址是相同的,所以段地址也称为段基址。
由于相邻两个段地址只相隔 16个单元,所以段与段之间大部分空间互相覆盖 (重叠 )。
存贮器段的划分与段的覆盖示意图如下图所示。
存贮器段的划分与段的覆盖示意图物理地址的形成:
把 1MB的存贮空间分成若干个逻辑段以后,
对一个段内的任意存贮单元,都可以用两部分地址来描述,一部分地址为段地址 (段基址 ),
另一部分为段内偏移地址 (有效地址 EA),段地址和段内偏移地址都是无符号的 16位二进制数,
常用 4位十六进制数表示。这种方法表示的存贮器单元的地址称为逻辑地址。如下图逻辑地址的表示格式为,段地址,偏移地址
物理地址如何形成的?
特别要指出的是,用户用 8086/8088汇编语言编写程序时,要把程序中的不同信息安排在不同的段,也就是说,用户源程序汇编后在存储器中存放是按照不同的信息放在不同的逻辑段。
而程序中的信息包括:
每次在需要产生一个 20位地址的时候,
一个段寄存器会自动被选择,且能自动左移 4位再与一个 16位的地址偏移量相加,
以产生所需要的 20位物理地址。
每当是取指令的时候,则自动选择代码段寄存器 CS,再加上由 IP所决定的 16
位偏移量,计算得到要取的指令的物理地址。
每当是涉及到一个堆栈操作时,则自动选择堆栈段寄存器 SS,再加上由 SP所决定的 16位偏移量,
计算得到堆栈操作所需要的 20位物理地址。
每当涉及到一个操作数,则自动选择数据段寄存器 DS或附加段寄存器 ES,再加上 16位偏移量,
计算得到操作数的 20位物理地址。而 16位偏移量,
可以是包含在指令中的直接地址,也可以是某一个 16位地址寄存器的值,也可以是指令中的位移量加上 16位地址寄存器中的值等等,这取决于指令的寻址方式。
一个段最大空间为 64KB,实际使用时,不一定能用到 64KB。理论上分段时,相邻段之间大部分空间是相互重叠的,但实际上不会重叠。汇编程序对用户源程序汇编时,会将用户程序中不同信息段独立存放。如图所示。
在 8086系统中,存储器的访问,如图 2-9所示。
80x86系列结构微处理器与 8086
本章讲述:
2.1 80x86系列微处理器是 8086的延伸
2.2 8086的功能结构
2.3 8086微处理器的执行环境本章重点难点本章介绍微型计算机系统中的核心部件微处理器( CPU),通过学习 CPU的功能结构,掌握 CPU中的两个独立单元(执行单元 EU和总线接口单元 BIU的并行执行过程;通过介绍 8086
寄存器结构,学习汇编语言程序设计所需的 14
个寄存器,掌握这些寄存器的正确使用;通过介绍 8086/8088的存储器组织与分段,I/O端口地址空间等基本知识,了解 8086CPU与外围电路的关系。
2.1 x86系列 微处理器是 8086的延伸如上章所述,x86系列结构微处理器的增长基本上按摩尔定律发展,已经经历许多代。但从使用者(包括程序员)
的角度来看,它是以 8086处理器为基础,
是一个兼容的微处理器系列,是 8086在功能上和性能上的延伸。
2.1.1 8086功能的扩展
1,从 16位扩展为 32位
8086是 16位微处理器 。它的内部寄存器的主体是 16位的。它的主要用于存放操作数的数据寄存器是 16位的。它的主要的用作为地址指针的指针寄存器也是 16
位的。依赖 分段 机制,用 20位段基地址加上 16位的偏移量形成了 20位的地址,
以寻址 1MB的物理地址 。
16位,无论作为数的表示,它能表示的数的范围是十分有限的。用 16位作为地址,它只能表示 64KB,更是一个十分小的地址范围,远远不能满足应用的需要。因而,于 1985年,Intel公司推出了第一个 32位的微处理器 -- 80386,开创了微处理器的 32位时代。目前,计算机正从 32位向 64位转移,但主流仍是 32位机。
32位,无论从能表示的数的范围,还是能寻址的物理地址,特别是能寻址的物理地址都极大的扩展了。使得微处理器能取代以前的所谓,大型机,,能应用于各种领域,从而极大地促进了计算机在各行各业中的应用。
32位地址能寻址 4GB物理地址。到目前,仍远大于主流计算机的实际内存配置,仍有广阔的应用余地。
2,从实模式至保护模式当 1981年,IBM公司刚推出 IBM-PC时,
主频是 5MHz,内存是 64KB-128KB,没有硬盘,只有单面单密度的软盘,到了
PC/XT,才有 10MB硬盘。在这样的硬件资源下,采用的操作系统是 PC-DOS
( MS-DOS)。这是单用户、单任务的磁盘操作系统。操作系统本身没有程序隔离、没有保护。这是 DOS遭受病毒泛滥的内因。
随着 PC机的大量普及,随着硬件性能的迅速提高。要求有能保护操作系统核心软件的多任务操作系统。为使这样的操作系统能在微型计算机系统中应用与普及,要求微处理器本身为这样的操作系统提供支持。于是,从 80286
开始,在 80386中真正完善保护模式。在保护模式下,程序运行于四个特权级。这样,可以实现操作系统核心程序与应用程序的严格的隔离。 保护模式支持多任务机制,任务之间完全隔离。
3,片内存储管理单元 - MMU
32位地址,可寻址 4GB物理地址。但大多数 PC机的物理内存配置远小于 4GB。但应用程序却需要庞大的地址空间。因此,在操作系统中提供了虚拟存储器管理机制,而这要求硬件支持。 因而,在 80386中提供了片内的 MMU。
提供了 4K页、页表等支持。
以上三点是 80386相对于 8086的主要功能扩展。
4,浮点支持工程应用、图形处理、科学计算等要求浮点支持(实数运算)。因此,自
80486芯片开始,在 x86系列微处理器中集成了 x87(及其增强)浮点单元。
5,MMX技术为支持多媒体技术的应用,如音乐合成、语音合成。语音识别、音频和视频压缩(编码)和解压缩(译码),2D 和
3D 图形(包括 3D 结构映像)和流视频等等。 x86系列处理器中增加 MMX技术及相应的指令
6,流 SIMD扩展( SSE)
自 Pentium III处理器开始,在 x86系列微处理器中引进了流 SIMD(单指令多数据)扩展( SSE)技术。 SSE扩展把由
Intel MMX引进的 SIMD执行模式扩展为新的 128位 XMM寄存器和能在包装的单精度浮点数上执行 SIMD操作。
奔腾 4处理器又进一步扩展为流 SIMD
扩展 2( SSE2):
— 用 144条新指令扩展 Intel MMX技术和 SSE扩展,它包括支持:
128位 SIMD整数算术操作。
128位 SIMD双精度浮点操作。
128 位指令设计以支持媒体和科学应用。由这些指令所用的向量操作数允许应用程序在多个向量元素上并行操作。
元素能是整数(从字节至四字)或浮点数(单精度或双精度)。算术运算产生有符号的、无符号的和 /或混合的结果。
2.1.2 8086性能的提高
x86系列系列芯片的发展的一个重要方面是提高性能。
1,利用流水线技术提高操作的并行性提高性能的一个重要方面是利用超大规模集成电路的工艺与制造技术提高芯片的主频。
即减少一个时钟周期的时间。提高性能的另一重要方面是缩短执行指令的时钟周期数。在
8086中,利用流水线把取指令与执行指令重叠,
减少了等待取指令的时间,从而使大部分指令的执行为四个时钟周期。
80386利用芯片内由 6个能并行操作的功能部件组成,从而使执行一条指令缩短为两个时钟周期。
80486将 80386处理器的指令译码和执行部件扩展成五级流水线,进一步增强了其并行处理能力,在五级流水线中最多可有五条指令被同时执行,每级都能在一个时钟周期内执行一条指令,80486微处理器最快能够在每个 CPU
时钟周期内执行一条指令。
到了 奔腾处理器增加了第二个执行流水线以达到超标量性能 (两个已知的流水线 u和 v,
一起工作能实现每个时钟执行两条指令)。
Intel Pentium 4处理器是第一个基于 Intel
NetBurst微结构的处理器。 Intel NetBurst微结构是新的 32bit微结构,它允许处理器能在比以前的 X86系列处理器更高的时钟速度和性能等级上进行操作。 Intel Pentium 4处理器有快速的执行引擎,Hyper流水线技术与高级的动态执行。使指令执行的并行性进一步提高,从而做到在一个时钟周期中可以执行多条指令。
2,引入片内缓存 ( CACHE)
随着超大规模集成电路技术的发展,存储器的集成度和工作速度都有了极大的提高。但是,相对于 CPU的工作速度仍然至少差一个数量级。为了减少从存储器中取指令与数据的时间,利用指令执行的局部性原理,把近期可能要用到的指令与数据放在工作速度比主存储器更高(当然,容量更小)的缓存中。这样的思想,进一步在处理器中实现,即在处理器芯片中实现了缓存。目前,
通常在处理器芯片上有指令和数据分开的一级缓存与指令与数据混合的二级缓存。且缓存的容量越来越大。从而进一步提高了处理器的性能。
总之,x86系列系列处理器芯片就是沿着这样的思路发展的。因此,8086是
x86系列系列处理器的基础。而且,任一种 x86系列处理器芯片在上电后,就是处在 8086的实模式 。 根据需要,用指令进入各种操作模式。 所以,学习 x86系列处理器必须学习掌握 8086,也只能从 8086
入手。
从指令,从编程来说,几乎没有用汇编语言来使用浮点指令,MMX指令与
XMM指令的,都是通过高级语言来使用这些指令的。因而,绝大部分程序员,
除了编写操作系统代码的外,面对 x86系列处理器的指令,实际上是面对 8086指令。
因此,本书从 8086入手来学习与掌握
x86系列处理器。
2.2 8086的功能结构
8086的功能结构如图 2-1所示。
图 2- 1 8086的功能结构图从功能结构看,分两部分:
2,执行部件 EU (Execution Unit)
1,总线接口部件 BIU (Bus Interface Unit)
二、总线接口部件 BIU
负责与存储器,I/O接口电路传送信息。
1,BIU的功能:
2,BIU的组成
(1) 四个段地址寄存器
CS ––– 16位代码段寄存器
DS ––– 16位数据段寄存器
ES ––– 16位附加段寄存器
SS ––– 16位堆栈段寄存器
(2) IP ––– 16位指令指针寄存器指向下一条要取出的指令。
(3) 20位地址加法器
16 位内部寄存器提供的信息经地址加法器产生 20位地址信息 。
逻辑地址段 寄存器 0000
加法器物理地址
19 0
15 0
15 0
偏移地址段 地址图 2 - 3 物理地址形成过程逻辑地址段 寄存器加法器物理地址
偏移地址段 地址图 物理地址形成过程例:指令的物理地址 = CS? 16 + IP
若 CS = 1000H,IP = 3050H,则
PA = 10000H + 3050H = 13050H
(4) 六字节的指令队列取指令与执行指令并行工作,即在一条指令的执行过程中,可以取出下一条或多条指令,在指令队列中排队。
二、执行部件 EU
1,EU的功能:
负责指令的执令。译码指令并利用内部寄存器和 ALU来处理数据。
2,结构组成
四个通用寄存器 AX,BX,CX,DX。
四个专用寄存器:
标志寄存器 FR。
算术逻辑单元 ALU。
基数指针寄存器 BP,堆栈指针寄存器 SP,
源变址寄存器 SI,目的变址寄存器 DI。
3,8086 CPU中 EU的特点
四个通用寄存器 AX,BX,CX,DX可以作为 16位寄存器使用,也可以分别作为两个 8位寄存器使用。
AX
BX
CX
DX
AH AL
BH BL
CH CL
DH DL
AX又称累加器,指令系统中许多指令都是利用 AX来实现的。
FR共有 16位,其中 7位未用,各位的定义如下:
15 014 13 12 11 10 9 8 7 6 5 4 3 2 1
OF DF IF TF SF ZF AF PF CF
标志寄存器根据功能,有两类标志状态标志 (6个 )
控制标志 (3个 )
表 2.1 8086 CPU 标志位情况名 称 符 号符号标志 SF
功能与运算结果的最高位相同,当数据用补码表示时,负数的最高位为 1,所以符号标志表示运算执行后的结果是正还是负零标志 ZF 当前的运算结果为零,当前的运算结果为非零奇偶标志 PF 运算结果所含的 1的个数为偶数进位标志 CF 当执行一个加法运算使最高位产生进位时,或者执行一个减法运算引起最高位产生借位时,此外,循环指令也影响这一标志辅助进位标志 AF
加法运算时,如果第 3位往第 4位有进位;减法运算时,如果第 3位往第 4位有借位。辅助进位标志一般在 BCD码运算中作为是否进行十进制调整的判断依据溢出标志 OF 运算过程中产生溢出时,所谓溢出,是指当字节运算的结果超出了范围?128~ +127,或者当字运算的结果超出了范围?32768~ +32767
时称为溢出方向标志 DF 控制串操作指令用的标志。 DF=0,串操作过程中的地址会不断增值; DF=1,串操作过程中的地址会不断减值中断标志 IF 控制可屏蔽中断的标志。 IF=0,CPU不能对可屏蔽中断请求作出响应; IF=1,CPU可以接受可屏蔽中断请求跟踪标志 TF CPU按跟踪方式执行指令三,BIU和 EU的并行工作
BIU 取指 1 取指 2 取指 3 取指 4 取数据 取指 5 …
EU 等待 执行 1 执行 2 执行 3 执行 4 …
大大减少了等待对取指所需的时间,
提高了 CPU的利用率。一方面可以提高整个程序的执行速度,另一方面又降低了与之相配的存储器的存取速度的要求。
这种重叠的操作技术,过去只在大型机中才使用称为流水线,在 X86系列系列微处理器中得到了广泛的使用与提高。
2.3 8086微处理器的执行环境本节描述汇编语言程序员看到的 8086
处理器的执行环境。它描述处理器如何执行指令及如何存储和操作数据。执行环境包括内存(地址空间)、通用数据寄存器、段寄存器、标志寄存器
( EFLAGES)和指令指针寄存器等。
2.3.1 基本执行环境概要在 8086处理器上执行的程序或任务都有一组执行指令的资源用于存储代码、
数据和状态信息。这些资源构成了 8086
处理器的执行环境。
地址空间
8086处理器上运行的任一任务或程序能寻址 1MB( 220)字节的线性地址空间。
基本程序执行寄存器八个通用寄存器、四个段寄存器、标志寄存器 FLAGS和 IP(指令指针)寄存器组成了执行通用指令的基本执行环境。
这些指令执行字节、字整型数的基本整数算术运算,处理程序流程控制,在字节串上操作并寻址存储器。
堆栈( stack)
为支持过程或子程序调用并在过程或子程序之间传递参数,堆栈和堆栈管理资源包含在基本执行环境中。堆栈定位在内存中。
I/O端口
8086结构支持数据在处理器和输入输出( I/O)端口之间的传送。
8086处理器的基本执行环境如图 2-4所示。
2.3.2 基本的程序执行寄存器处理器为了应用程序编程提供了如图 2-4所示的 14个基本程序执行寄存器。
这些寄存器能分组如下:
通用寄存器 这八个寄存器能用于存放操作数和指针。
段寄存器 这些寄存器最多能保存四个段选择子。
FLAGS寄存器 FLAGS寄存器报告正在执行的程序的状态,并允许有限地(应用程序级)控制处理器。
IP寄存器 IP寄存器包合下一条要执行的指令的 16位指针。
1.通用寄存器八个 32位通用寄存器 AX,BX,CX、
DX,SI,DI,BP和 SP用于处理以下项:
逻辑和算术操作的操作数;
用于地址计算的操作数;
内存指针。
虽然所有这些寄存器都可用于存放操作数、结果和指针,但在引用 SP寄存器时要特别小心。 SP寄存器保持堆栈指针,
通常不要用于其它目的 。
这些通用寄存器中的前四个,即 AX、
BX,CX,DX通常称为 数据寄存器,用以存放操作数。后四个,即 SI,DI,BP、
SP通常称为 指针寄存器 。虽然它们也可以存放操作数,但主要用作地址指针。
数据寄存器 AX,BX,CX和 DX又可以分别作为 AH,BH,CH和 DH(高字节)以及
AL,BL,CL和 DL(低字节) 8位寄存器引用,如图 2-5所示。
SP是 堆栈指针,它与段寄存器 SS一起确定在堆栈操作时,堆栈在内存中的位置。用 BP( Base Pointer Register)寻址堆栈操作数时,也是寻址堆栈段。 SI
( Source Index Register)和 DI
( Destination Index Register)常用于 串操作 。
2.段寄存器段寄存器( CS,DS,SS,ES)保存
16位段选择子。一个段选择子是标志内存中一个段的特殊指针。为访问在内存中的具体段,此段的段选择子必须存在于适当的段寄存器中。
当写应用程序代码时,程序用汇编程序的命令和符号建立段选择子。然后汇编程序和别的工具建立与这些命令和符号相关的实际段选择子值。若写系统代码,程序员可能需要直接建立段选择子。
当使用分段存储模式时,初始,每一个段寄存器用不同的段选择子加载,所以每个段寄存器指向线性地址空间中的不同的段。如图 2-6所示。
任何时候,一个程序能访问多至线性地址空间中的四个段。为访问未由一个段寄存器指向的段,程序必须首先把要访问的段的段选择子加载至一个段寄存器。
每个段寄存器与三种存储类型之一相关,代码、数据或堆栈 。例如,CS寄存器包含代码段的段选择子,其中存放正在执行的指令。处理器用在 CS寄存器中的段选择子和 IP寄存器中的内容组成的逻辑地址取下一条要执行的指令。 CS寄存器不能由应用程序直接加载,而是由改变程序控制的指令或内部处理器指令
(例如,过程调用、中断处理)隐含加载。
DS,ES寄存器指向两个数据段。两个数据段的可用性,允许有效而又安全地访问数据结构的不同类型。例如,可只建立两个不同的数据段:一个用于当前模块的数据结构,另一个用于从较高级模块输出的数据。为了访问附加的数据段,应用程序必须按需要把这些段的段选择子加载至 DS,ES寄存器中。
SS寄存器包含堆栈段的段选择子。所有的堆栈操作都用 SS以找到堆栈段。不像 CS寄存器,SS寄存器能显式加载。它允许应用程序设置多个堆栈并在堆栈之间切换。
3,FLAGS寄存器
16位 FLAGS寄存器包含一组状态标志、
一个控制标志一个系统标志。
在处理器初始化(由 RESET脚或 INIT脚有效)之后,FLAGS寄存器是 0002H。此寄存器的位 1,3,5,12-15保留。软件不能用或依赖于这些位中的任一个。 FLAGS寄存器中以下指令能用于标志组与堆栈或 AX寄存器之间的移动:
LAHF,SAHF,PUSHF,POPF。在 FLAGS寄存器的内容已经传送至过程堆栈或 AX寄存器之后,
标志能作修改。
当调用中断或异常处理时,处理器自动保存 FLAGS寄存器的状态至堆栈上。
( 1)状态标志
FLAGS寄存器的状态标志(位 0,2、
4,6,7和 11)指示算术指令,例如 ADD、
SUB,MUL和 DIV指令的结果的一些特征。
状态标志的功能如下:
① 进位标志 CF( Carry Flag)
当结果的最高位(字节操作时的 D7或字操作时的
Dl5、双字操作的 D31)产生一个进位或借位,则 C= 1,
否则为 0。这个标志主要用于多字节数的加、减法运算。
移位和循环指令也能够把存储器或寄存器中的最高位
(左移时)或最低位(右移时)放入标志 CF中。 ② 辅助进位标志 AF( Auxitiary Carry Flag)
在字节操作时,则由低半字节(一个字节的低 4位)
向高半字节有进位或借位,则 AF= 1,否则为 0。这个标志用于十进制算术运算指令中。
③ 溢出标志 OF( Overflow Flag)
在算术运算中,带符号数的运算结果超出了 8位、
16位带符号数能表达的范围,即在字节运算时> +127
或<- 128,在字运算时> +32767或<- 32768此标志置位,否则复位。一个任选的溢出中断指令,在溢出情况下能产生中断。
④ 符号标志 SF( Sign Flag)
它的值与运算结果的最高位相同。即结果的最高位(字操作时为 D15)为 1,则 SF= 1;否则,SF= 0。
由于在 X86系列结构微处理器中,符号数是用补码表示的,所以 S表示了结果的符号,SF=0为正,SF=1
为负。
⑤ 奇偶标志 PF( Parity Flag)
若操作结果中,1”的个数为偶数,则 PF= 1,否则
PF= 0。这个标志可用于检查在数据传送过程中是否发生错误。
⑥ 零标志 ZF( Zero Flag)
若运算的结果为 0,则 ZF= 1,否则 ZF= 0
在这些状态标志中,只有进位标志 CF能用指令 STC
(设置进位位),CLC(清除进位位)和 CMC(进位位取反)直接进行修改。也可以用位操作指令( BT、
BTS,BTR和 BTC)拷贝规定位至 CF标志。
这些状态标志允许算术操作以产生三种不同数据类型的结果:无符号整数、
符号整数和 BCD整数。若算术操作的结果作为无符号整数对待,CF标志指示超出范围(进位或借位);若作为符号整数( 2的补码值)对待,OF标志指示是否超出范围;若作为 BCD数对待,AF标志指示进位或借位。
SF标志指示符号整数的符号。 ZF标志指示符号整数或无符号整数是否为 0。
当执行多精度整数算术运算时,CF用于与带进位加( ADC)和带借位减( SBB)
指令一起产生适当的进位或借位。
例 1:执行以下两数的加法操作,判断各标志位的状态 。
0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1
+ 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1
———————————
0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0
执行以上操作后,各状态标志位的状态应是:
CF= 0,PF= 0,AF= 0,ZF= 0,SF= 0,OF= 0
例 2:执行加法操作。
1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
———————————
1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1
各状态标志位的状态应是:
CF= 1,PF= 1,AF= 0,ZF= 0,SF= 1,OF= 0
例 3:执行加法操作。
0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
———————————
1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
执行以上加法操作后,各状态标志位的状态应是:
CF= 0,PF= 0,AF= 0,ZF= 0,SF= 1,OF= 1
( 2)控制标志
EFLAGS寄存器的控制标志(位 8,9,10)
指示程序和机器运行的状况。控制标志的功能如下:
① 方向标志 D( Direction Flag)
若用指令置 DF= 1,则引起串操作指令为自动减量指令,也就是从高地址到低地址或是
,从右到左,来处理串;若使 DF= 0,则串操作指令就为自动增量指令。
STD和 CLD指令分别地设置和清除 DF 标志。
② 中断允许标志 IF( Interrupt-enable Flag)
若指令中置 IF= 1,则允许 CPU去接收外部的可屏蔽的中断请求;若使 IF= 0,则屏蔽上述的中断请求;对内部产生的中断不起作用。
③ 追踪标志 TF( Trace Flag)
置 IF标志,使处理进入单步方式,以便于调试。在这个方式下,CPU在每条指令执行以后,产生一个内部的中断,允许程序在每条指令执行完以后进行检查。
4.指令指针指令指针( IP)寄存器包含下一条要执行的指令在当前码段中的偏移。通常,
它是顺序增加的,从一条指令边界至下一条指令,但在执行 JMP,Jcc,CALL、
RET和 IRET等指令时,它可以向前或向后移动若干条指令。
IP寄存器不能直接由软件访问;它由控制传送指令(例如,JMP,Jcc,CALL
和 RET)、中断和异常隐含控制。读 IP寄存器的唯一方法是执行一条 CALL指令,
然后从堆栈中读指令指针的返回值。 IP
寄存器能由修改过程堆栈上指令指针的返回值并执行返回指令( RET或 IRET)
来间接修改。
2.3.3 存储器组织处理器在它的总线上寻址的存储器称为物理存储器 。物理存储器按字节序列组织。每个字节赋予一个唯一的地址,
称为 物理地址 。物理地址空间的范围从
0~ 220–1( 1MB)的最大值。事实上设计与 8086处理器一起工作的任何操作系统和执行程序都使用处理器的存储管理设施访问存储器。这些设施提供例如 分段特性 以允许有效地和可靠地管理存储器。
思考:
为什么要分段?
8086有 20条地址引线,它的直接寻址能力为
220= 1M字节。所以,在一个 8086组成的系统中,
可以有多达 1M字节的存储器。这 1M字节逻辑上可以组织成一个线性矩阵。地址从 00000H到
FFFFFH。给定一个 20位的地址,就可以从这 1M
字节中取出所需要的指令或操作数。
在 8088/8086CPU内部能向存贮器提供地址码的地址寄存器有六个,均为 16位,用这六个 16位地址寄存器任意一个给外部存贮器提供地址,只能提供 64K个地址。所以,对 1MB地址寻址不完。
这六个 16位地址寄存器分别为:
整个 1M字节存储器以 64K为范围分为若干段。在寻址一个具体物理单元时,必须要由 一个基地址再加上 由 SP或 IP或 BP或 SI
或 DI等可由 CPU处理的 16位 偏移量 来形成实际的 20位物理地址 。
如何分段?
1MB的存贮空间中,每个存贮单元的实际地址编码称为该单元的物理地址 (用 PA表示 )。
把 1MB的存贮空间划分成若干个逻辑段,每段最多 64KB。
各逻辑段的起始地址必须能被 16整除,即一个段的起始地址 (20位物理地址 )的低 4位二进制码必须是 0。
一个段的起始地址的高 16位自然数为该段的段地址,
显然,在 1MB的存贮空间中,可以有个段地址,每个相邻的两个段地址之间相隔 16个存贮单元。
在一个段内的每个存贮单元,可以用相对于本段的起始地址的偏移量来表示,这个偏移量称为段内偏移地址,
也称为有效地址 (EA)。
段内偏移地址也用 16位二进制编码表示,所以,在一个段内有 =64K个偏移地址 (即一个段最大为 64KB)。
在一个 64KB的段内,每个偏移地址单元的段地址是相同的,所以段地址也称为段基址。
由于相邻两个段地址只相隔 16个单元,所以段与段之间大部分空间互相覆盖 (重叠 )。
存贮器段的划分与段的覆盖示意图如下图所示。
存贮器段的划分与段的覆盖示意图物理地址的形成:
把 1MB的存贮空间分成若干个逻辑段以后,
对一个段内的任意存贮单元,都可以用两部分地址来描述,一部分地址为段地址 (段基址 ),
另一部分为段内偏移地址 (有效地址 EA),段地址和段内偏移地址都是无符号的 16位二进制数,
常用 4位十六进制数表示。这种方法表示的存贮器单元的地址称为逻辑地址。如下图逻辑地址的表示格式为,段地址,偏移地址
物理地址如何形成的?
特别要指出的是,用户用 8086/8088汇编语言编写程序时,要把程序中的不同信息安排在不同的段,也就是说,用户源程序汇编后在存储器中存放是按照不同的信息放在不同的逻辑段。
而程序中的信息包括:
每次在需要产生一个 20位地址的时候,
一个段寄存器会自动被选择,且能自动左移 4位再与一个 16位的地址偏移量相加,
以产生所需要的 20位物理地址。
每当是取指令的时候,则自动选择代码段寄存器 CS,再加上由 IP所决定的 16
位偏移量,计算得到要取的指令的物理地址。
每当是涉及到一个堆栈操作时,则自动选择堆栈段寄存器 SS,再加上由 SP所决定的 16位偏移量,
计算得到堆栈操作所需要的 20位物理地址。
每当涉及到一个操作数,则自动选择数据段寄存器 DS或附加段寄存器 ES,再加上 16位偏移量,
计算得到操作数的 20位物理地址。而 16位偏移量,
可以是包含在指令中的直接地址,也可以是某一个 16位地址寄存器的值,也可以是指令中的位移量加上 16位地址寄存器中的值等等,这取决于指令的寻址方式。
一个段最大空间为 64KB,实际使用时,不一定能用到 64KB。理论上分段时,相邻段之间大部分空间是相互重叠的,但实际上不会重叠。汇编程序对用户源程序汇编时,会将用户程序中不同信息段独立存放。如图所示。
在 8086系统中,存储器的访问,如图 2-9所示。