87
献献献献献献献献献献献献献献献献献献献献献献献献献 献献 献献献献献献献献献 ” ,一。 献献献献献 献献 献献献献献献献献献 ” ,一。 献献献 献献献 ……

献给正为信息化建设事业作出杰出贡献的人们。

Embed Size (px)

DESCRIPTION

献给正为信息化建设事业作出杰出贡献的人们。. 计算机组成原理与汇编语言. “ 四个现代化,哪一化也离不开信息化。”. ……. 江泽民. Part 1 8086/8088 指令系统. 汇编语言部分 目 录. 1 、 8086/ 8088 的 CPU. 2 、 主存储器. 3 、 堆栈. 4 、 指令系统 5 、 提高性能的新技术. 第四章 8086/88CPU 与指令系统. 4.1 8086/8088 CPU - PowerPoint PPT Presentation

Citation preview

Page 1: 献给正为信息化建设事业作出杰出贡献的人们。

献给正为信息化建设事业作出杰出贡献的人们。

计算机组成原理与汇编语

计算机组成原理与汇编语

言言

““ 四个现代化,哪一化也离不开信息化。”四个现代化,哪一化也离不开信息化。”

江泽民江泽民……

Page 2: 献给正为信息化建设事业作出杰出贡献的人们。

Part 1 8086/8088 指令系统

1 、 8086/8088的CPU2、主存储器3、堆栈4、指令系统5、提高性能的新技术

汇编语言部分

汇编语言部分

录录

Page 3: 献给正为信息化建设事业作出杰出贡献的人们。

第四章 8086/88CPU 与指令系统

• 4.1 8086/8088 CPU

• 8086 是 16 位微处理器,即 CPU 的内外数据总线为 16 位,一个总线周期可以传送一个字( 16 位)数据。

• 而 8088 是准 16 位微处理器,其 CPU 的内部总线为 16位,外部数据总线为 8 位,因此一个总线周期只能传送一个

• 字节。但是两者的内部结构基本上是相同的,其地址引脚均为 20 位,可寻址 1M 字节( Byte )主存空间。

• 8086/8088 的指令系统完全相同,在软件上是完全兼容的。

Page 4: 献给正为信息化建设事业作出杰出贡献的人们。

4.1.1 8086/8088CPU 的结构• 1. 内部结构• 8086/8088 的内部结构如图 4-2 所示。下面分别讨论 EU 与 BIU 部件。• ( 1 )执行部件 EU

– 包括一个 16 位算术逻辑运算部件 ALU ( arithmetic logic unit) 、一组通用寄存器、暂存器、标志寄存器,以及 EU 控制器。各寄存器和内部数据通路都是 16 位。 EU 的主要任务是执行指令 . 其功能为:

– . 从指令队列中取出指令代码,由 EU 控制器进行译码后产生对应的控制信号到各部件以完成指令规定的操作。

– . 对操作数进行算术和逻辑运算,并将运算结果的特征状态存放在标志寄存器中。– . 由于 EU 不直接与系统总线连接,因此当需要与主存储器或 I/O 端口传送数据时, EU 向 BIU 发出命

令 , 并提供给 BIU16 位有效地址与传送的数据。

Page 5: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )总线接口部件 BIU .

• 包括-组段寄存器、指令指针、 6 字节的指令队列( 8088 是 4 字节)、 20 位总线地址形成部件,以及总线控制逻辑。 BIU 的主要任务是完成 CPU 与主存储器或 I/O 端口之间的信息传送,其功能为:

• . 从主存取出指令送到指令队列中排队。• . 从主存或 I/O 端口取操作数或存放运算结果。• . 计算并形成访问主存的 20 位物理地址。

Page 6: 献给正为信息化建设事业作出杰出贡献的人们。

2. 8086/8088 主存地址的形成

• 将 1M 字节主存空间划分为若干段,每个段的最大长度为 64K字节。相应地在 BIU 中设置段寄存器,用以存放 20 位段起始地址的高 16 位,称为段基值( segment base value )。由 EU 或指令指针 lP 提供段内的偏移量,即一个主存单无与所在段的段基址之间的字节距离。当 CPU 访问某个主存单元时,必须指明由哪个段寄存器提供段基值,同时又给出偏移量。然后由 BIU 将 16 位段基值左移 4 位后与 16 位偏移量相加,形成 20 位主存单元的物理地址,如图 4 - 3 所示。段基值左移 4 位后,得到一个 20位的物理地址称为段基址( segment base address )。显然,段基址为 xxxx0H ,其低 4 位二进制数为 0 ,即能被 16 整除的主存物理地址才可作为段基址。

Page 7: 献给正为信息化建设事业作出杰出贡献的人们。

4.1.2 8086/8088 寄存器

• 8086/8088CPU 中的寄存器包括段寄存器、通用寄存器以及用于控制的寄存器,如图 4 - 4 所示。下面介绍它们的功能。

• 1. 段寄存器( Segment Register )• CS (代码段寄存器)——代码段( code segment )用来存放程序的

指令代码序列。 CS 用来存放当前代码段段首址的高 16 位,即段基值。• DS (数据段寄存器)——数据段( data segment )中存放程序的有

关数据。 DS 用于存放当前数据段的段基值。• SS (堆栈段寄存器)——堆栈段( stack segment )用于存放按后进

先出顺序存取的信息。 SS 中存放当前堆栈段的段基值。• ES (附加段寄存器)——附加段( extra segment )中常存放运算结

果或辅助数据。 ES 中存放当前附加段的段基值。

Page 8: 献给正为信息化建设事业作出杰出贡献的人们。

2. 通用寄存器( General Register )

• EU 中设置有 8 个 16 位通用寄存器,如图 4 一 4 所示,按使用情况可分为二种。

• ( 1 )地址指针寄存器( Address Pointer Register )• 8086/8088 访问主存单元的 20 位物理地址是由两个 16 位地址合

成的:由 16 位的段寄存器给出段基址的高 16 位;由 EU 或指令指针给出相对该段基址的偏移量。执行部件 EU 中的 4 个 16 位地址指针寄存器通常用来提供全部或部分偏移量。

Page 9: 献给正为信息化建设事业作出杰出贡献的人们。

堆栈指针 SP 和基址指针 BP 通常用来作地址指针。

• SP 是特定用于存放堆栈段中栈顶字单元相对堆栈段基址的偏移量。在执行堆栈指令操作时,隐含使用的就是堆栈指针 SP 。在指令中用 BP作地址指针时,如果未另外说明,它也是用于指向堆栈段内某一主存单元(字或字节)。 BP 除了作地址指针外,还可以用来存放参加运算的16 位操作数或运算结果。

• 源变址寄存器 SI 和目的变址寄存器 DI 通常也用来作地址指针。在变址寻址中, SI 和 DI 的内容作为段内偏移量的组成部分。在多数情况下,源变址寄存器和目的变址寄存器可互换使用。但是在串操作指令中,SI 和 DI 的使用是不同的。源串操作数必须用 SI 提供偏移量,目的操作数则必须用 DI 提供偏移量。对于串操作指令, SI 和 DI 的作用不能互换,并且隐含规定使用哪一个或两个。与 BP类似, SI 和 DI 除了作地址指针外,也可用于存放 16 位操作数和运算结果。

Page 10: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )数据寄存器( Data Register )

• EU 中设置有 4 个 16 位的寄存器 AX , BX , CX , DX ,用以存放 16 位数据;也可以将每个寄存器的高 8 位和低 8 位分开,变成 8 个 8 位寄存器 AH , AL , BH , BL , CH , CL , DH , DL ( H表示高字节, L表示低字节),以便于处理字节数据。

• (3). 用于控制的寄存器– 8086/8088 中用于控制的 16 位寄存器有两个:指令指针 IP 和标志寄存器 FR 。– A 指令指针 IP ( Instruction Pointer )– IP 作为指令的地址指针,其作用类似于其它汁算机中的程序计数器 PC ,当

现行指令执行完毕,由 IP 提供下一条指令地址。在指令按顺序执行时,每当CPU 按 CS : IP 内容合成的指令地址从主存读取一条指令后,就自动修改 IP中的值,使 IP 内容为下一条指令起始字节所在主存单元的偏移量。如图 4 - 6所示, CS 的内容左移 4 位后(即得代码段段基址)与 IP 中的偏移量相加,将形成下一条指令首字节的主存单元地址。

Page 11: 献给正为信息化建设事业作出杰出贡献的人们。

B 标志寄存器 FR ( Flag Register )• 在 EU 中设有一个 16 位的标志寄存器 FR ,用来记录程序执行时的状态。 FR 中共有 9 个

标志位 , 如图 4-7 所示。其中状态标志位 6 位包括 CF 、 PF 、 AF 、 ZF 、 ZF 、 OF ,用于记录EU 执行算术逻辑运算指令后的结果特征,它们将影响某些指令(如条件转移指令)的执行。另外,控制标志位有 3 位为 TF 、 IF 、 DF ,它们在执行某些指令时起控制作用。

• . 进位标志位 CF ( Carry Flag )• .奇偶标志位 PF ( Parity Flag )• . 辅助进位标志位 AF ( Auxiliary Carry Flag )• .零值标志位 ZF ( Zero Flag )• .符号标志位 SF ( Sign Flag )• .溢出标志位 OF ( Overflow Flag )• . 单步(或跟踪)标志位 TF ( Trace Flag )• . 中断标志位 IF ( Interrupt-enable Flag )• .方向标志位 DF ( Direction Flag )

Page 12: 献给正为信息化建设事业作出杰出贡献的人们。

4.2 主存储器• 4.2.1 8086/8088 主存储器的特点• 8086/8088CPU 有 20条地址引出线,因此具有 lM 字节的寻址能力,即可以在 1

M 个字节单元中寻找出所需的一个存储单元。在机器内部是用 20 位二进制无符导数表示存储单元地址,为了方便书写和编程,在汇编语言程序中常用 5 位十六进制数或符号地址表示存储单元地址,十六进制的存储单元地址范围为 0000H~ FFFFH ,如 P122 图 48 所示。

• 在 8086/8088 主存中,一个字节数据占用一个存储单元。一个字数据( 16 位)则占用二个相邻的存储单元,数的低 8 位(低字节)存放在低地址单元;高 8 位(高字节)存放在高地址单元,并以此数低字节所在存储单元地址作为字数据的单元地址。例如 . 图 4-9 中 10000H 字节单元存放数据 56H , 10001H 字节单元内容为 34H ,10002H 字节单元内容为 12H ;如把相邻单元字节组成一个字,则 10000H 字单元存放内容为 3456H , 10001H 字单元内容为 1234H 。显然同一个主存单元地址既可看作字节单元地址,又可看作字单元地址,这要根据访主存指令中指明的是访问字节单元还是访问字单元决定。

Page 13: 献给正为信息化建设事业作出杰出贡献的人们。

8086/8088 的访问主存指令中,将表示出是字节访问还是字访问。

• 程序中常使用符号地址,在定义符号地址(也称为变量名)时,就规定了它具有字节或字的类型属性。如在某指令中需临时修改其符号地址的字节或字的类型属性,可以选用适当的运算符或伪指令来说明。

• 在书写时,如果用 X表示某存储单无的地址,则 X单元的内容可以表示为( X ), X 也可用来表示寄存器地址。例如:

• ( 10000H )= 56H ;字节单元内容• ( 10000H )= 3456H ;字单元内容• ( AX )= 1234H ; AX 寄存器内容

Page 14: 献给正为信息化建设事业作出杰出贡献的人们。

4.2.2 主存储器的段结构

• 8086/8088把 1MB 主存空间按需要划分为若干段( Segment )。每个段都由连续的字 节单元组成,最大长度为 64K(即 65526 ),可作为独立寻址的逻辑单位。在程序中,段的个数、段的长度以及段的用途完全由编程者确定。并且一个段中的代码或数据,可以存放在该段内的任意单元中。

• 一个段起始单元的地址,称为对应段的段基址( 20 位)。 8086/8088 对段基址是有所限制的,不能起始于任意地址,要求其低 4 位必须为 0 (可被 16 整除)。在 1M 字节的地址空间中,可作为段基址的共有 64K ( 65536 )个,可表示如下:

• 00000H , 00010H , 00020H ,… 512AOH , 512B0H ,…, FFFE0H , FFFF0H

• 在程序中设置的段称为逻辑段。

Page 15: 献给正为信息化建设事业作出杰出贡献的人们。

4.2.3 逻辑地址与物理地址• 在 8086/8088 系列微机中,每个主存单元对应二种地址:

物理地址( Physical Address )与逻辑地址( Logical Address )。

• 1. 逻辑地址• 2. 物理地址• 由于允许逻辑段的重叠,因此一个存储单元可能对应若

干个逻辑地址。如图 4 - 12 所示,物理地址为 2201OH 的存储单元可以对应两个逻辑地址,它们分别为 2000H : 201OH 、2100H : 1010H 。经过逻辑地址到物理地址的转换,均转换为同一物理地址。

• 这说明,存储单元 22010H既可对应在段基值为 2000H 的逻辑段中,也可对应在段基值为 2100H 的逻辑段中。

Page 16: 献给正为信息化建设事业作出杰出贡献的人们。

3. 逻辑地址的来源

• CPU 在执行指令时,是按指令所需的操作类型从不同的来源获得存储单元的逻辑地址,然后形成对应的物理地址以访问主存。 P124表 4 - 2 给出了不同操作类型获得段基值和偏移量的不同来源。

• 当 CPU 执行从存储器取指令的操作时,段基值必须由代码段寄存器 CS 提供,而偏移量从指令指针 IP 中获得。如指令执行的是堆栈操作 ,则必须由 SS 提供当前段段基值,而堆栈指针 SP 给出栈顶单元的偏移量。如指令执行时,需要存取存储器中的操作数,操作数通常存放在当前数据段中,则隐含由 DS 提供段基燎(即指令中不给出段寄存器名);如操作数在其它当前段中,则用其它段寄存器(如 CS , SS , ES )来提供操作数所在段的段基值(即允许替代或超越),这时指令中必须要给出对应的段寄存器名,而存放操作数单元的偏移量是由 EU根据指令提供的寻址方式计算得到的。按寻址方式计算出来的偏移量又称为有效地址( Eeffective Address )。

Page 17: 献给正为信息化建设事业作出杰出贡献的人们。

4.3 8086/8088 堆栈

• 4.3.1 堆栈组织• 8086/8088 的堆栈是由 SS 指定的一段存储区(≤ 64K

B )构成,并采用向上(地址码减小)生成方式,由堆栈指针 SP 指向栈项,如图 4 - 13 所示。 SS 提供堆栈段的段基值, SP 的内容为栈顶单元相对堆栈段段基址的字节距离(偏移量)。当 SP初始化时,其值为堆栈的长度(这时 SP指向栈底+ 2电元)。由于 SP 是 16 位的寄存器,所以堆栈的最大深度是 64K 个字节(一个段的长度),最多存放 32个字数据。

• 8086/8088 堆栈规定以字( 2 个字节)为单位进行存取,字数据在堆栈中的存放格式是低字节在低地址单元,高字节在高地址单元,如图 4-13 中栈顶单元的内容为 1234H 。

Page 18: 献给正为信息化建设事业作出杰出贡献的人们。

4.3.2 堆栈操炸

• 首先要设置堆栈,主要是对堆栈段寄存器 SS 和堆栈指针 SP赋初值。具体实现是在程序中安排 G 一个段作为堆栈段。如:

• …

• STACK1 SEGMENT PARA STACK

• DB 40H DUP ( 0 )• STACK1 ENDS

• …

• 对堆栈的操作都是在栈顶进行的

Page 19: 献给正为信息化建设事业作出杰出贡献的人们。

其基本操作有两个:压栈操作与出栈操作。

• 1. 压栈• 用压栈指令 PUSH 可以将通用寄存器、段寄存器或字存储单元

内容压入堆栈。• 执行压栈指令 PUSH 的操作过程分二步进行:• ①( SP ) -2→SP ;首先修改栈顶指针, SP减 2 以指向空字

单元(即新栈顶)• ② 数据→( SP ) ;将寄存器或存储单元内容送入 SP 指向的

空字单元中。• 压栈指令“ PUSH AX” 的操作执行过程如图 4---15

Page 20: 献给正为信息化建设事业作出杰出贡献的人们。

2. 出栈

• 用弹出指令 POP 可以将当前栈顶字单元内容取出送到通用寄存器、段寄存器或字存储单元中。

• 执行出栈指令 POP 的操作过程分二步进行:• ①(( SP ))→寄存器 / 字单元 ;将栈顶宇单元内容送到指

定寄存器或字单元中• ②( SP )+ 2→SP ;修改栈顶指针, SP 加 2 以指向新

栈顶• 出栈指今“ POP” 的操柞执行过程如图 4--16 所示。

Page 21: 献给正为信息化建设事业作出杰出贡献的人们。

4.4 8086/8088 指令系统

• 8086/8088 的指令采用变字长格式,指令由 1~6 个字节组成。第 1 个字节包含操作码,大多数指令的第 2 个字节表示寻址方式,第 3~ 6 个字节表示存储器操作数地址的位移量、立即操作数。

• 4 .4.1 8086/8088 寻址方式• 8086/8088 各指令中的操作数有 4 种:寄存器操作数,立即数操作数,存储器操作数, I/0 端口操作数。对不同的操作数, 8086/80888 有不同的寻址方式对它们进行存取。

Page 22: 献给正为信息化建设事业作出杰出贡献的人们。

1. 寄存器寻址方式( Register Addressing )

• 寄存器寻址方式是指:指令所需的操作数存放在 CPU 的寄存器(通用寄存器或段寄存器)中,通过指令中给出寄存器地址去找到操作数。其寻址过程如图 4 - 17 所示,“ REG” 是指令代码中的寻址字段,它表示操作数的寄存器地址。

• 在汇编指令中,寄存器地址直接用寄存器名表示,如用 AX , BX ,AL , BH , DS , ES等,这些寄存器可以是 8 位的,也可以是 I6 位的。

• 例如有一条传送指令: MOV AX , BX• 这是一条采用寄存器寻址的传送指令,它有两个操作数地址: BX 是源操作数地址(即源操作数存放在其中); AX 是目的地址。该指令完成把 BX 中的源操作数传送到目的地址 AX 中;

• 若( BX )= I234H ,则执行该指令后( AX )= 1234H 。

Page 23: 献给正为信息化建设事业作出杰出贡献的人们。

又如;

– MOV BL , AL ;将 AL 中的内容送到 BL中

– MOY CH , DL– MOV DX , CX– MOV DS , AX– 寄存器寻址方式表示寻找的操作数就在 CPU 内部

的寄存器中不需要执行总线周期,因此,执行速度快。

Page 24: 献给正为信息化建设事业作出杰出贡献的人们。

2.立即数寻址方式( Immediate Addressing )

• 立即数寻址方式是指:指令所需的操作数直接在指令代码中,随着取指令一起取到 BIU 的指令队列中。在指令执行时立即数作为指令的一部分直接从指令队列取出,不需另外占用总线周期,因此执行速度快。立即数可以是 8 位,也可以是 16 位如图 4--18 所示。

• 在汇编指令中,立即数如是数值常数可直接书写,如是字符常数则应加上引号。指令中的立即数经常用于给寄存器或存储单元赋初值,并且只能作为源操作数,不能作目的操作数。例如:

• MOV CX , 0B3CAH

• MOV AL , 25

• MOV BX ,“ AB”

• MOV AH , `C`

• 在汇编指令中,立即数若是以 A~ F 开始的十六进制数则必须在数前面加上 0 ,如上述的 第一条指令,否则汇编程序会将立即数当作符号处理。

Page 25: 献给正为信息化建设事业作出杰出贡献的人们。

3. 存储器导址方式• 上述两种寻址方式,操作数在寄存器或指令中。而以下几种寻址方式,操作数

都是在主存储器中。在汇编语言程序中,一个存储单元的地址采用逻辑地址来表示,其形式为:

• 段基值:偏移量• 段基值由某个段寄存器提供, P124表 4--2 给出了存储器操作数逻辑地址中的段

基值的隐含来源和替代来源。通常指令中不明显给出逻辑地址中段基值的来源(即段寄存器名),而是在执

• 行指令时使用隐含来源作为段基值。既然段基值是由指令隐含给出,因此 J 又下寻址方式讨论

• 的重点是如何确定操作数逻辑地址的偏移量。• 偏移量是指存放操作数的存储单元与段起始地址(段基址)之间的字节距离,

它由 CPU 的• 则按指令中操作数的寻址方式计算而得到 . 又称为有效地址 EA 。

Page 26: 献给正为信息化建设事业作出杰出贡献的人们。

EA 是由三个地址分量的某种组合求得的,它们分别是;

• . 位移量:它是指令代码中的一个 8 位或 16 位二进制数。通常在源程序中 , 位移量以符号地址(变量名或标号)的形式出现,也可以是常数,经汇编后,这些符号地址的偏移量或常数就转换为指令代码中的位移量。

• . 基地址:即基址寄存器 BX 或基址指针 BP 的内容。• .变址量:即变址寄存器 SI 或 DI 的内容。• 这三个地址分量的组合不同,使形成有效地址 EA

的方法不同,相应有几种不同的存储器操作数的寻址方式。

Page 27: 献给正为信息化建设事业作出杰出贡献的人们。

( 1 )直接寻址方式( Direct Addressing )• 直接寻址方式是指:指令所需的操作数存放在存储单元中,操作数的有效地址 EA 直

接由指令代码中的位移量提供,其寻址过程如 P130 图 4 - 19 所示。在源程序中,直接寻址方式可以用数值地址或符号地址来表示。

• . 用数值地址表示• 在采用直接寻址方式的汇编指令中,如用数值表示操作数的有效地址,则操作数所在

段的段寄存器必须指明,不能缺省。• 例如,传送指令源操作数的有效地址用数值地址表示:• MOV BX , DS :[ 1000H]• 这条指令完成将当前数据段偏移 1000H 个字节的字单元内容 I234H 送入BX 中,如

图 4-20 所示,其中源操作数的有效地址 EA 是 1000H 。

Page 28: 献给正为信息化建设事业作出杰出贡献的人们。

. 用符号地址表示• 在源程序中,常用符号地址表示存放操作数的存储单元,因此在汇编指令中,可

用符号地址表示的直接寻址方式来存取操作数。操作数知果存放在数据段中,则指令中不必给出数据段寄存器名(即隐含使用 DS );如果操作数不是存放在数据段中,则必须给出段寄存器名。例如:

• MOV BX , VAR ;将 VAR 指向的字单元内容送到 BX 中,如图 4-21 所示

• MOV DA_BYTE , 0FH ;将立即数 0FH 置入DA_BYTE 指向的字节单元• MOV CL , DA+ 3 ;把由 DA 地址偏移 3 个字节的字节单元内容送到 C

L 中• 上述 3条指令分别等价于:• M○V BX , DS : VAR• MOV DS : DA_BYTE , 0FH• MOV CL , DS : DA+3

Page 29: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )寄存器间接寻址方式( Register Indirect Addressing )

• 寄存器间接寻址是指:指令所需的操作数在存储单元中,操作数的有效地址 EA 直接从基址寄存器( BP 或 BX )或变址寄存器( SI 或 DI )中获得。这种寻址方式实际上是将有效地址事先存放在一个寄存器中,因此这个寄存器就如同一个地址指针。如P131 图 4-22 所示,“ MOD R/M” 是指令代码中的寻址字段。若以 BX , SI 或 DI 间接寻址时,隐含使用的段寄存器是 DS ;以BP 间接寻址,则隐含使用的段寄存器是 SS 。

Page 30: 献给正为信息化建设事业作出杰出贡献的人们。

由于用寄存器作地址指针 .

• 因此在程序中只要修改间址寄存器的内容,就可以用同一条指令访问不同的存储单元。这种寻址方式的所用格式如下:

• MOV CH ,[ SI]• MOV「 DI], BX

• MOV AL ,[ BX]• MOV CX ,[ BP]• 上述指令分别等价于:• MOV CH , DS :「 SI]• MOV DS :[DI], BX

• MOV AL , DS :「 BX] • MOV CX , SS :[ BP]

Page 31: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )变址寻址( Indexed Addressing )和基址( Based Addressing )寻址方式

• 指令所需的操作数在存储单元中,操作数的有效地址 EA 是基址寄存器( BP 或 BX )或变址寄存器( SI 或 DI )的内容与指令中给出的位移量( 8 位或 16 位)两个地址分量之和。使用 SI 或 DI称为变址寻址,使用 BX 或 BP则称为基址寻址。其寻址过程如 P131 图 4 - 23 所示。

• 如寻址所用寄存器是 SI 、 DI 或 BX ,则隐含使用的段寄存器是 DS ;如是 BP ,则隐含使用的段寄存器是 SS 。在汇编指令中,位移量部分可用数值表示,也可用符号地址表示(此时用符号地址的偏移量作为位移量),其寻址方式的使用格式为:

• MOV AX , 10H「 SI]• MOV TABLE「DI], 12H • MOV AX , ARRY[ BX]• MOV TAB1「 BP], CL• 上述指令分别等价于:• MOV AX , 10H[ SI]• MOV DS : TABLE[DI], 12H• MOV AX , DS : ARRY「 BX]• MOV SS : TABI[ BP], CL

Page 32: 献给正为信息化建设事业作出杰出贡献的人们。

变址或基址寻址方式• 常用来访问顺序存放在主存中的一维数组、表格,字符串等。其典型的用法是将指今中不能修改的位移量作为基准地址,而变址或基址寄存器内容作为修改量。例如数组的起始单元位置是固定的,因此由指令中的位移量给出;而被访问的数组元素相对其起始单元的距离由变址或基址寄存器提供,通过修改寄存器的内容就可以访问数组中不同的元素。

• P132 例 4 - 1 如图 4 - 24 所示,一维数组 ARY 存放在主存的数据段中,数组的每个元素长度相同且占 2 个字节单元。从数组的首址起依次存放各数组元素ARY ( 0 ), ARY ( I ), ARY ( 2 ),

• …ARY(I) 。指令: MOV AX , ARY[ SI]可用来访问数组中的元素,指令中的符号地址 ARY 指向该数组的首址;变址寄存器 SI 内容表示所访问元素与数组首址之间的字节距离,则所访问元素的有效地址: EA=ARY 的偏移量+( SI )。当 SI 内容为 0 时,将访问 ARY ( 0 )元素; SI 内容为 1*2 时,访问 ARY ( 1 )元素; SI 内容为 I*2 时,访问 ARY ( I ),即通过修改SI 的内容可以访问数组中任何一个元素。图 4 - 24 给出了访问数组元素ARY ( 2 )的寻址过程。

• 从上例可以看出,这种寻址方式中的位移量表示基准量,如数组首址,而变址寄存器的内容表示相对基准量的一个值,如某数组元素相对首址的字节数,因此这种寻址方式也称为寄存器相对寻址方式。

Page 33: 献给正为信息化建设事业作出杰出贡献的人们。

( 4 )基址变址寻址( Based Indexed Addressing )

• 指令所需的操作数在主存单元中,操作数的有效地址 EA 是三个地址分量之和,即基址寄存器( BX 或 BP )内容、变址寄存器( SI 或 DI )内容与指令中的位移量( 8 位或 16 位)之和,称为基址变址寻址方式,如图 4 - 25 所示。若基址寄存器选用 BP 时,隐含使用的段寄存器是 SS ;若选用 BX 时,则隐含使用的段寄存器是 DS 。

• 这种寻址方式的位移量可用数值或符号地址表示,其使用格式为:• MOV AX , 200H「 BX]「 SI]• MOV TABLE「 BX]「DI] , 0FFH• MOV AX , ARRAY「 BP ] [ SI ]• MOV TAB1[ BP]「DI], DL• k述指令分别等价于:• MOV AX , DS : 200H「 BX]「 SI]• MOV DS : TABLE「 BX][ SI], 0FFH• MOV AX , SS : ARRAY「 BP][ SI]• MOV SS : TAB1「 BP]「DI], DL

Page 34: 献给正为信息化建设事业作出杰出贡献的人们。

由于基址变址寻址方式中• 有两个地址分量可以在程序执行过程中进行修改,因此常用来访问存放在主存中的 1维数组。• P133例4 - 2 如图 4 - 26 所示, ARRAY 数组是 10 行 10 列的二维数组,按行存放在主存堆栈段中。从数组的首址 ARRAY 起依次存

放各数组元素:第 0 行元素为 ARRAY ( 0 , 0 ) ~ARRAY ( 0 , 9 )共10 个,第一行元素为 ARRAY ( 1 , 0 ) ~ARRAY ( 1 , 9 ),依此类推。每个元素占用一个字节单元。可以用指令: MOV AL , ARRAY[BP][SI] 访问数组中的某个元素ARRAY ( i , j ),指令中的位移量 ARRAY 指向数组首址, Bp 存放被访问行的起始位置相对数组首址的距离 ix 10 , SI 存放被访问数组元素相对本行首址的距离 j,则要访问元素的有效地址 EA=ARRAY 的偏移量+( BP )+( SI ),段基值隐含由 SS 给出。

• P134 图 4-26 中给出了访问数组第 1 行第 8 列元素ARRAY ( 1 , 8 )的寻址过程。 ARRAY 指向数组起始位置, BP 内容为 1x10 以指向该数组中第 1 行起始点, SI 内容为 8 以指向该行内第 8 个元素,三者之和即为被访元素ARRAY ( 1 , 8 )的有效地址 EA 。显然,修改BP 就可以访问数组的不同行,而修改SI则可以访问同一行中不同的元素。

Page 35: 献给正为信息化建设事业作出杰出贡献的人们。

存储器操作数,寻址方式地址计算小结:

• P135 图 4 - 27表示了 4 种存储器操作数寻址方式计算有效地址 EA 的过程。图中上半部表示,由 CPU 的执行部件 EU根据寻址方式计算有效地址 EA ;下半部表示,由总线接口部件 BIU 形成操作数的物理地址:将段基值左移 4 位得段基址与有效地址 EA 相加。按操作数的物理地址就可直接访问存放操作数的存储单元。

• 通常存储器操作数存放在隐含指定的段中,因此指令中不必给出段寄存器名。操作数也可以存放在非隐含指定段中,这时就必须用段超越前缀来指出操作数所在的段。在使用段前缀时应遵循 P124表 4 - 2 中有关允许替代段寄存器的约定。例如:

• MOV AX , ES : TAB[ SI] • 段前缀“ ES”表示数组元素在附加段中,而不是在数据段中。应注意,操作数在非隐含段内时,段超越

前缀是不能省去的。

Page 36: 献给正为信息化建设事业作出杰出贡献的人们。

4.串操作寻址方式( String Addressing )

• 8086/8088 提供专门的串操作指令,这些指令所用的操作数也在存储器中,但它们不能使用上述寻址方式,而是隐含使用变址寄存器 SI 与 DI ,如图 4 - 28所示。串操作指令规定,隐含使用 SI 作为在数据段中的源串(即源操作数)的地址指针;隐含使用 DI 作为在附加段中的目的串的地址指针。在完成一次串操作后,指令自动修改 SI , DI 两个地址指针,使 SI , DI 指向下一个串元素的存储单元。由标志寄存器中的方向标志位 DF 的值来确定指针的修改方向,若 DF= 0 ,则 SI , Dl自动增量;否则 SI , DI自动减量。若串操作指令处理的是字节串,增量 /减量均为 1 ,若处理的是字串,则增量 /减量均为 2 。

• 5. I/O 端口寻址

• 有关 I/O 端口寻址的内容将在以后的章节中介绍。

Page 37: 献给正为信息化建设事业作出杰出贡献的人们。

4.4.2 8086/8088 指令

• 8086/8088 指令按操作数地址个数可划分为 3 种类型:• ( 1 )双操作数指令: OPR DEST , SRC• OPR表示指令操作码。指令中给出 2 个操作数地址, SRC表示源操作数

地址,简称源地址; DEST表示目的操作数地址,简称目的地址。• ( 2 )单操作数指令: OPR DEST• 指令中只给出 1 个操作数地址 DEST 。若指令只需 1 个操作数,则该地

址既是源地址又是目的地址。若指令需 2 个操作数,则另一操作数地址由指令隐含指定。

• ( 3 )无操作数指令: OPR• 一种情况是指令未给出操作数地址,但隐含指定了操作数的存放处。另

一种情况是指令本身不需要操作数。• 在 8086/8088 指令系统中,除串操作指令以外,其余所有指令最多只能

有一个操作数存放在存储器中。对于双操作数指令而言,两个操作数不能同时是存储器操作数。

Page 38: 献给正为信息化建设事业作出杰出贡献的人们。

8086/8088 指令按功能可分为 6 大类:

• ( 1 )传送类指令( transfer instructions )• ( 2 )算术运算类指令( arithmetic instructions )• ( 3 )位操作类指令( bit manipulation instructions )• ( 4 )串操作类指令( string instructions )• ( 5 )程序转移类指令( program transfer instruction

s )• ( 6 )处理器控制类指令( processor control instructi

ons )• 下面就分别介绍这几类指令(其中的第 5类指令在以

后的章节中介绍),下述指令均采用汇编指今格式描述。

Page 39: 献给正为信息化建设事业作出杰出贡献的人们。

一、传送类指令

• 这类指令又可以分为 4 种:数据传送指令、交换指令、标志位传送指令、地址传送指令。这类指令除了SAHF , POPF 指令以外,其余指令对标志位均无影响。

• 1. 数据传送指令( Move )• 指令格式: MOV DEST , SRC• 指令功能: DEST← ( SRC ),即将源地址的内容(源操作数)传送到目的地址中。传送指令执行完后源操作数保持不变。• 受影响的状态标志位:无。• MOV 指令中的两个操作数可以同时是字节或字,但两者位数必须一致。源操作数可存放在通用寄存器、段寄存器、存储器中,也可以是立即数;目的操作数则不能为立即数。并且两个操作数不能同时为存储器操作数。在 MOV 指令中数据的传送方向如 P137 图 429 所示。

• 请见P136例• 由于指令中只允许一个操作数在存储器中,因此用一条MOV 指令不能完成两个存储单元之间的数据传送,但可以用两条指令来实现。见P137例4-3 ,例4-4

Page 40: 献给正为信息化建设事业作出杰出贡献的人们。

2.交换指令( Exchange )

• 指令格式: XCHG DEST , SRC

• 指令功能:( DEST ) ←→ ( SRC ),即将源地址的内容(源操作数)与目的地址的内容(目的操作数)相互交换。

• 受影响的状态标志位:无。• XCHG 指令所交换的数据可以是字节或字。数据交换只能在通用寄存器之间或通用寄存器与存储单元之间进行,如 P138 图 4 - 30 所示。交换指令不能使用段寄存器,也不能使用立即数。

• P138 例 4 - 5

Page 41: 献给正为信息化建设事业作出杰出贡献的人们。

3. 标志位传送指令

• 这种指令用于对标志寄存器进行存取操作,共有 4条指令且都是无操作数指令。

• (1) 取标志指令( Load Register AH from Flag )• 指令格式: LAHF

• 指令功能; AH← ( FR ) -7~ 0 ,即将标志寄存器 FR 低 8位内容传送到 AH 寄存器中,也就是把标志位 SF , ZF , AF ,PF , CF 送至 AH 中的第 7 , 6 , 4 、 2 , 0 位,如图 4 - 31 所示。

• 受影响的状态标志位:无。

Page 42: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )存标志指令( Store Register AH into Flag )

• 指令格式: SAHF

• 指令功能: FR-7~ 0←AH ,即将 AH 寄存器的内容传送给标志寄存器 FR 的低 8 位。

• 受影响的状态标志位: SF , ZF , AF , PF , CF 。• SAHF 指令用以设置或恢复 SF , ZF , AF , PF , CF5 个标

志位。它只影响标志寄存器的低 8 位即 OF , DF , IF , TF 标志无影响。

• 例 4 - 6 将标志位 SF , ZF 置 1 ,将 AF , PF , CF 置 0 ,可用以下两条指令实现:

• MOV AH , 11000000B

• SAHF

Page 43: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )标志压栈指令( Push Flag )

• 指令格式: PUSHF

• 指令功能:① SP← ( SP )- 2

• ②栈顶字单元←( FR )• 受影响的状态标志位:无。• PUSHF 指令先将栈顶指针 SP 内容减 2 指向空字单元,然后把

16 位标志寄存器 FR 的所有内容送到 SP 指向的新栈顶字单元中。

Page 44: 献给正为信息化建设事业作出杰出贡献的人们。

( 4 )标志出栈指令( Pop Flag )

• 指令格式 : POPF

• 指令功能:① FR← (栈顶字单元)• ②SP← ( SP )+ 2

• 受影响的标志位:所有标志位。• POPF 指令先将 SP 指向的栈顶字单元的内容弹出到标志寄存器 FR 中,然

后 SP 内容加 2 指向新的栈顶。各标志位的状态由堆栈弹出字的对应位内容决定。

• 标志寄存器中只有 CF , DF , CF3 个标志位有专门的标志位操作指令,而其余标志位则没有专门的指令直接对它们进行没置或修改。例如要修改 ZF ,可先用 LAHF 指令将标志寄存器的低 8 位送入 AH ,然后对 AH 的第 6 位进行修改,再用 SAHF 指令将修改后的内容送回标志寄存器。若要修改 TF ,则必须使用 PUSHF 和 POPF 指令。

Page 45: 献给正为信息化建设事业作出杰出贡献的人们。

4. 地址传递指令( Address Trnsfer )

• 这种指令完成传送存储器操作数的地址到指定的寄存器,而不是传送操作数。

• (1) 装入有效地址指令( Load Effective Address )• 指令格式: LEA DEST , SRC

• 指令功能; DEST←SRC 的 EA ,即将源操作数的有效地址 EA 传送到目的地址( 16 位通用寄存器)中。

• 受影响的状态标志位:无。• LEA 指令的源操作数必须是存储器操作数(可以是字节或字),

而目的地址只能是 16 位通用寄存器名。• 如 P139 图 4 - 32 所示,设指令“ LEA SI , BUF” 中 BUF 的有

效地址 EA 是 100H ,因此该指令完成将 100H 送入 SI 中,而不是把DS : 100H 所指向字单元的内容 00FFH 送入 SI 中。

Page 46: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )装入地址指针指令• 在前面曾介绍,一个存储单元的逻辑地址是由 16 位段基值和 16 位偏移量组成。因此可用 4 个字节单元来存放这个逻辑地址。用 4

个字节单元构成 32 位的地址指针,段基值 I 存放在 2 个高字节单元中,偏移量则存放在 2 个低字节单元中,如 P140 图 4 - 33 所示。• 指令 LDS ( LES )的功能就是从作地址指针的 4 个存储单元中,同时取出段基值与偏移量(即源操作数),分别送到段寄存器 DS

( ES )和通用寄存器中。 • 指令格式: LDS DEST , SRC ~l

• LES DEST , SRC

• LDS 指令功能: DEST← ( SRC )•    DS← ( SRC+2 )• 受影响的状态标志位:无。• LDS 指令是将 SRC 指定的 32 位地址指针中的偏移量送入DEST 所指定的通用寄存器中,而将地址指针中的段基值送入DS 中。 LES

的功能与 LDS类似,不同的只是用 ES 代替DS 。• 这两条指令中的源操作数必须是存储器操作数,源地址 SRC 给出 32 位地址指针的首字节地址;而目的地址 DEST则只能是 16 位通

用寄存器名。

Page 47: 献给正为信息化建设事业作出杰出贡献的人们。

例 4 - 7

– P140 图 4 - 34 给出了指令“ LDS SI , ADR[BX]”的执行情况。由源地址 ADR[BX]可以计算出源操作数在数据段的有效地址 EA 。这时 EA 及 EA+ 2 指向的字单元作为 32 位地址指针。 EA 指向的字单元存放的是偏移量,应送到指令指定的 SI 中; EA+ 2 字单元存放的是段基值,应送到 DS 中。该指令执行完后, DS 的内容为新的段基值。

– LDS , LES 两条指令常用于处理不在当前数据段和附加段的串操作数。在串操作指令中,隐含使用 DS : SI 指向源串, ES : DI 指向目的串。如程序中需处理的串不在当前数据段或附加段中,就必须修改DS , ES ,这时可用 LDS 与 LES 指令来实现,并且在指令中使用SI , DI 作目的地址,让 SI , DI 分别存放源串与目的串的偏移量。

Page 48: 献给正为信息化建设事业作出杰出贡献的人们。

二 . 算术运算类指令

• 算术运算类指令包括加减乘除 4 种指令。这类指令可以对字节或字数据进行运算,参加运算的数可以是无符号数或带符号数。由于 8086/8088 提供十进制数运算校正指令,因此参加运算的数也可以是 BCD 码表示的十进制数。

Page 49: 献给正为信息化建设事业作出杰出贡献的人们。

1. 加法运算指令

• ( 1 )加法指令( Addition )• 指令格式: ADD DEST , SRC

• 指令功能: DEST← ( SRC )+( DEST ),即源操作数与目的操作数相加,其和送入目的地址中。并根据相加结果设置标志寄存器的 OF , SF , ZF , AF , PF 和 CF 标志位。该指令执行后,源操作数保持不变。

• 该指令的操作数可以是字节或字,源操作数可以存放在通用寄存器或存储单元中,也可以是立即数;而目的操作数只能在通用寄存器或存储单元中,不能是立即数。并且两个操作数不能同时为存储器操作数。

• P141 例 4-8 加法指令的常用格式有:• ADD BX , SI

• ADD DA_WORD , 0F8CH

• ADD DL , TAB[ BX]• 下面以指令“ ADD DL , OA4H” 为例给出该指令的相加及标志位设置过程。设 DL 的

内容为 0E5H :见 P141 。

Page 50: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )带迸位加法指令( AddWi山 C~ )

• 指令格式: ADCDEST , SRC

• 指令功能: DEST← ( SRC )+( DEST )+ CF ,即在完成 2 个操作数相加的同时,将标志位 CF 加上,求出的和数送入目的地址中。并根据相加的结果设置标志位 OF , SF , ZF , AF , PF 和 CF 。

• ADC 指令主要用于大于 16 位数的相加运算。• P141 例 4 - 9 有一个 32 位无符号数存放在 DX (高 16 位)、 AX (低 16

位)中,若要加上常数 76F1A23H ,则用以下指令来实现:• ADD AX , 1A23H

• ADC DX , 76FH

• 其中第一条指令完成把 16 位常数加在 AX 中,若产生进位,则记录在 CF中。由 ADC 指令在完成高 16 位相加的同时,将低 16 位的进位也加上。

Page 51: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )加 1 指令( Increment )

• 指令格式: INC DEST

• 指令功能: DEST← ( DEST )+ 1 ,即目的操作数加 1 后送回目的地址中。并根据执行结果设置标志位 OF , SF , ZF , AF 和 PF ,但不影响 CF 。

• INC 指令只有一个操作数,操作数可以是字节或字,且被当作无符号数。其操作数只能在通用寄存器或存储单元中,不能是立即数。 〃

• INC 指令主要用于计数器的计数或修改地址指针。• P141 例 4 - 10 INC 指今的使用格式如下:• INC CL

• INC DI

• INC COUNT

Page 52: 献给正为信息化建设事业作出杰出贡献的人们。

2. 减法运算指令• ( 1 )减法指令( Subtraction )• 指令格式: SUB DEST , SRC• 指令功能: DEST← ( DEST )-( SRC ),即完成从目的操作数中减去源操作

数,其差值送入目的地址中。并按相减结果设置标志位 OF , SF , ZF , AF , PF和 CF 。

• SUB 指令可以进行字节或字运算。其源和目的操作数可以在通用寄存器或存储单元中,但两者不能同时在存储器中。立即数可以作源操作数,但是不能作目的操作数。

• P142 例 4-11 SUB 指令的常用格式如下:• SUB AL , 3FH• SUB BX , AX• SUB DAW , DX• 下面以指令“ SUB AL , DAB” 为例给出该指令的相减及设置标志位过程。设 AL

内容为 B7H , DAB 字节单元内容为 A8H 。见 P142

Page 53: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )带借位减法指令( Subtract with Borrow )

• 指令格式: SBB DEST , SRC

• 指令功能: DEST← ( DEST )-( SRC )- CF ,即在完成 2 个操作数相减的同时,还要减去借位位 CF ,相减结果送入目的地址中。并设置标志位 OF , SF ,ZF , AF , PF 和 CF 。

• SBB 指令在使用上与 ADC 指令类似,主要用于大于16 位数的相减运算,将低位部分的相减的借位引入高位部分的减法中。

Page 54: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )减 1 指令( Decrement )

• 指令格式: DEC DEST

• 指令功能: DEST← ( DEST )- 1 ,即目的操作数减 1 后送回目的地址中,并根据执行结果设置标志位 OF , SF , ZF , AF 和 PF ,但不影响 CF 。

• DEC 指令属单操作数指令,操作数可以是字节或字,且被当作是无符号数。其操作数只能 在通用寄存器或存储器中,不能是立即数。

• DEC 指令常用于计数或修改地址指针,但它的计数或修改方向与 INC 指令相反。

Page 55: 献给正为信息化建设事业作出杰出贡献的人们。

( 4 )求负数指令( Negative )

• 指令格式; Neg DEST

• 指令功能: DEST← 0 -( DEST ),即用零减去目的操作数,相减结果送回目的地址中。并按结果设置标志位 OF , SF , ZF ,AF , PF 和 CF 。

• NEG 指令属单操作数指令,操作数可以是字节或字,且被当作补码表示的带符号数。其操作数只能在通用寄存器或存储单元中,不能是立即数。

• 如果字节操作数是- 128 、字操作数是- 327768 ,在执行 NEG 指令后,操作数不变,但溢出标志 OF 置 1 。这是由于+ 128或+ 32768超出了 8 位或 16 位带符号数的表示范围,即产生了溢出。如操作数为零,求负的结果仍为零,则标志位 CF 置 0 ;否则 CF 置 1 。

Page 56: 献给正为信息化建设事业作出杰出贡献的人们。

P143 例 4 - 14

• 设 AL 中存放一正数:( AL )= 25H= 00100101B 。 BL 中存放负数- 58H 的补码:( BL )=A8H= 10101000B 。可用以下指令获得 AL , BL 中数的负数:

• NEG AL• NEG BL • 以上指令执行后, AL 中为负数- 25H 的补码,( AL )=DBH= 11011011 。 BL

中则为正数,( BL )= 58H= 01011000B 。• P143 例 4 - 14• 在 DAW+ 2 , DAW 字单元存放有一个 32 位带符号数, DAW 中存放的是低 16• 位。求这个数的负数并存入原单元中。可 I 用以下指令:• NEG DAW• MOV AX , 0• SBB AX , DAW+ 2• MOV DAW+ 2 , AX

Page 57: 献给正为信息化建设事业作出杰出贡献的人们。

( 5 )比较指令( Compare )

• 指令格式: CMP DEST , SRC

• 指令功能:( DEST )一( SRC ),两个操作数相减后,仅按相减结果没置标志位 OF , SF , ZF , AF , PF 和 CF ,而不保留两数相减的差。

• CMP 指令与 SUB 指令的不同之处是,运算结果不送回目的地址中。因此 CMP指令执行后,两个操作数都不变,只影响状态标志位。例如:

• CMP AL , 0

• CMP CX , VAR

• CMP 「 DI], BX

• CMP 指令主要是利用所设标志位的状态来反映两个操作数的大小。 CMP 指令执行后若 ZF= 1表示( DEST )=( SRC )。对于无符号数,若 CF= 0 ,表示( DEST )≥( SRC );若 CF= L则( DEST )≤( SRC )。对于带符号数,若 OF= SF ,表示( DEST )≥( SRC );若 OF≠SF ,表示( DEST )≤( SRC )。

Page 58: 献给正为信息化建设事业作出杰出贡献的人们。

3.乘法指令

• 8086/8088 指令系统中,乘法指令分为无符号数乘法指令和带符号数乘法指令 2 种。

• ( 1 )无符号数乘法指令• 指令格式: MUL OPRD• 其中( OPRD )是乘法运算的一个操作数,它只能在通用寄存器或存储

单元中。另一个操作数隐含在 AL (字节乘法或字乘法)寄存器中。乘法运算所得到的双倍长的乘积隐含地存放在 AX (字节乘法)或 DX : AX(字乘法)中。 MUL 指令的操作如 P144 图 4-35 所示,即:

• . 字节无符号数相乘: AX← ( OPRD ) x ( AL )• . 字无符号数相乘: DX : AX← ( OPRD ) x ( AX )• MUL 指令只影响标志寄存器中 CF , OF 标志位。 MUL 指令执行后,

如果 AH (字节乘法)或 DX (字乘法)为全“ 0” ,则 CF= 0 和 OF=0 ;否则 CF= 1 (表示 AH 或 DX 中有乘积的有效数字)。

Page 59: 献给正为信息化建设事业作出杰出贡献的人们。

P144 例 4 - 15

• 两个字节存储单元 DAB1 、 DAB2 内容(无符号数)相乘,乘积放在 PROC 中,可用以下指令实现:

• MOV AL , DAB2

• MUL DABI

• MOV PROC , AX

• ( 2 )带符号数乘法指令 • 指令格式: IMUL OPRD

• 该指令中的操作数及乘积均带符号且用补码表示,除此之外其余操作与 MUL 指令完全相同。

Page 60: 献给正为信息化建设事业作出杰出贡献的人们。

4. 除法指令• ( 1 )无符号数除法指令• 指令格式: DIV OPRD• 其中( OPRD )是除法运算中的除数,它可以是 8 位(字节或字)但只

能在通用寄存器或存储单元中。 DIV 除法可以进行字节除法或字除法。被除数、商、余数都是隐含使用了相关寄存器,如 P145 图 4 - 36 所示。

• . 字节除法: AL← ( AX ) ÷ ( OPRD )• . 字无符号数相除: AX← ( DX : AX ) ÷ ( OPRD )• DIV 指令对标志寄存器无有效标志结果。但是以下两种情况之一,将

产生 0型中断(除法出错中断),转入除法出错中断处理。• . 除数为 0 ,即( OPRD )=O 。• .商溢出,即( AL )> 0FFH 或( AX )> 0FFFFH 。

Page 61: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )带符号数除法指令

• 指令格式: IDIV OPRD

• 该指令中的操作数、商及余数均带符号,且用补码表示,除此之外,其余操作与 DIV 指令完全相同。带符号数除法的商中,最大的正数商是+ 127 ( 7FH )或+ 32767 ( 7FFFH ),最小的负数商是 -127 ( 81H )或- 32767 ( 8001H )。同 DIV 指令一样,如除数( OPRD )=O 或商超出上述的最大值或最小值时,均产生 0型中断。

Page 62: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )字节 / 字符号扩展指令• 、 指令裕式: CBW• CWD• 这两条指令是无操作数指令,隐含使用 AH 或 DX 。指令功能是:• CBW :扩展AL 中的符号位至AH 中;• CWD :扩展AX 中的符号位至DX 中。• 这两条指令主要用在除法指令前,形成双倍长度的被除数,对标志寄存器均无影响。• P145 例 4 - 16 两个 8 位带符号数分别放在 BYTE1 , BYTE2 字节存储单元中,将

BYTE1 内容除以 BYTE2 内容,商放在 QUOT 字节单元中,可用以下指令实现:• MOV AL , BYTE1• CBW• IDIV BYTE2• MOV QUOT , AL ,

Page 63: 献给正为信息化建设事业作出杰出贡献的人们。

5.BCD 码校正指令

• 8086/8088CPU 对 BCD 码表示的十进制数进行运算所采用的方法是:先用二进制数的加、减、乘和除指令对 BCD 码进行运算,紧接着用 BCD 码校正指令对运算结果进行校正。

• 8086/8088 指令系统把 BCD 码分为 2 种格式:组合型(压缩型、装配型、 PACKED )和非组合型(非压缩型、折散型、 NPACKED )。

• 组合型: 1 个字节表示 2 个 BCD 码,即两位十进制数:见 P146 。• 非组合型: 1 个字节的低 4 位表示一个 BCD 码;高 4 位通常为

“ 0000〃或“ 0011”等,它对这字节所表示的十进制数无影响:见 P146 。

Page 64: 献给正为信息化建设事业作出杰出贡献的人们。

(1)非组合型加法校正指令 AAA ( ASCII Adjust[ for Addition )• 指令格式: AAA• 在执行 AAA 指令前,已用 ADD 或 ADC 指令完成-位非组合型BCD 码加法运算,且加法结果已在 AL 中。 A

AA 指令的执行,即对 AL 中的数据进行校正,其结果在 AL 中,向高位的进位在 AH 和 CF 中。• 指令功能;若 AL 中低 4 位的值< 9 ,且AF= 0 ,那将 AL 中高 4 位清零, AF 和 CF 置“ 0” 。• . 若 AL 中低 4 位的值> 9 ,或 AF= 1 ,那么AL← ( AL ) +6 , AH← ( AH )+ 1,且将 AL 中高 4 位清零, AF 和 CF 置“ 1” 。

• 例如从键盘直接输入 2 个 1 位十进制数,然后相加,其结果在 AH , AL 中,实现这个操作的程序段如下:– MOV AH , 1」 ;从键盘输入 1 位十进制数到 AL 中– INT 21H– MOV BL , AL– MOV AH , 1 ;从键盘输入另一个十进制数到 AL 中– INT 21H– ADD AI , BL– AAA– 在执行 ADD 指令前, AL 和 BL 中都是一位非组合型BCD 码(实际上是 ASCII 码表示的十进制数)。两个非组合型BCD 码相加后,再用 AAA 指令进行校正。这时 AH 和 AL 中分别保存十进制和数的高位和低位,且它们也分别是非组合型BCD 码形式。

Page 65: 献给正为信息化建设事业作出杰出贡献的人们。

8086/8088共有 6条 BCD 码校正指令。

• 其中加减法校正各有 2条,乘除法各有 1条。• 下面分 3 种情况说明执行十进制数校正指令后能获得正确结果:• 情况 1 :设( AI )= `3` ,( BL )= `5` 见 P147

• 情况 2 :设( AL ) =`8` ,( BL )= `6` 见 P147

• 情况 3 :设( AL )= `8` ,( BL )= `9` 见 P147

Page 66: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )组合型加法校正指令 DAA ( Decimal Adjust for Addition )

• 指令格式: DAA

• 假设在执行 DAA 指令前,已用 ADD 或 ADC 指令完成组合型BCD 码加法,且加法结果已在 AL 中。执行DAA 指令 , 对 AL 中的数据进行校正。校正结果在 AL 中,向高位的进位仅在 CF 中。

• 指令功能: . 如果 AL 中低 4 位> 9 或 AF= 1 ,那么AL← ( AL )+ 6 , AF= 1

• . 如果 AL 中高 4 位> 9 或 CF= 1那么AL← ( AL )+ 60H , CF= 1

• 上述校正条件中, AF= 1说明 AL 中低 4 位不大于 9 ,但已向高 4 位进位。所以在执行加法指令时,十进制数的低位结果是大于 9 的。同理, CF= 1 ,表示在执行加法指令时,十进制数的高位结果是大于 9 的。

• 例如实现 2 个 4 位十进制数的加法 4678+ 2556 ,结果存放在 DX 中,可编制如下程序段:– MOV AL , 78H ;低字节 BCD 码相加– ADD AL , 56H

– DAA ;低字节和数校正– MOV DL , AL

– MOV AL , 46H ;高字节 BCD 码相加– ADC AL , 25H

– DAA ;高字节和数校正– MOV DH , AL

Page 67: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )非组合型减法校正指令 AAS ( ASCII Adjust for Subtraction )

• 指令格式: AAS

• 假设执行 AAS 指令前,巳用指令 SUB 或 SBB 完成非组合型BCD 码减法,且结果在 AL 中,执行 AAS 指令对 AL 中数据进行校正。校正结果在 AL 中,向高位的借位在 AH 和 CF 中。

• 指令功能; . 若 AL 中低 4 位的值< 9 ,且 AF= 0 ,那么将AL 中高 4 位清零, AF 和 CF 置“ 0”

• . 若 AL 中低 4 位> 9 或 AF= 1 ,那么 AL← ( AL )-6 和 AH← ( AH )- 1且将 AL 中高 4 位清零, CF 和 AF 置“ 1”

Page 68: 献给正为信息化建设事业作出杰出贡献的人们。

( 4 )组合型减法校正指令 DAS ( Decimal Adjust for Subtraction )

• 指令格式: DAS

• 在执行 DAS 指令前,巳用指令 SUB 或 SBB 完成组合型 BCD 码减法,且结果在 AL 中,执行 DAS 指令对 AL 中数据进行校正。校正结果在 AL 中,向高位的借位仅在 CF 中。

• 指令功能: . 若 AL 中低 4 位> 9 或 AF= 1 ,那么AL← ( AL )- 6 , AF 置“ 1”

• . 若 AL 中高 4 位> 9 或 CF= 1 ,那么AL← ( AL )- 60H , CF 置“ 1”

Page 69: 献给正为信息化建设事业作出杰出贡献的人们。

三、位操作类指令

• 这类指令包括逻辑运算指令、测试指令和移位指令。• 1. 逻辑运算指令( Logical)

• 逻辑运算指令共有 4条,其指令格式及功能分别为:• . 逻辑与指令 AND DEST , SRC

• 指令功能: DEST← ( SRC )∧( DEST )• . 逻辑或指令 OR DEST , SRC

• 指令功能: DEST← ( SRC )∨( DEST )• . 逻辑异或指令 XOR DEST , SRC

• 指令功能: DEST← ( SRC )异或( DEST )• . 逻辑非指令 NOT DEST

• 指令功能: DEST←(DEST) 取反

Page 70: 献给正为信息化建设事业作出杰出贡献的人们。

这些指令对操作数都是按位进行逻辑运算的• 操作数可以是字节或字。源操作数可以在通用寄存器或存储单元中,或是立即数,而目的操作数不能是立即数,即源和目的操作数不能同时为存

储器操作数。 NOT 指令对标志寄存器各位无影响,其余3条指令均影响标志寄存器 SF , ZF , PF 。置 CF 和 OF 为 0 , AF 不确定。• P149 的逻辑式表示了这4 种按位逻辑运算的情况。• 这些指令常用于对操作数的某些位进行分离、组合或没置,例如:• AND AL , 0F0H ;分离出 AL 中的高 4 位• OR AL , 80H ;将 AL 中最高位置“ 1”

• XOR AX , AX ;将 AX 内容清零• XOR AL , 01H ;将 AL 中最低位变反• P150 例4~17 可用以下程序段实现将标志寄存器的第 8 位 TF 位置” 1“

• PUSHF

• POP AX

• OR AX , 100H

• PUSH AX

• POPF

• 上述程序段中,前两条指令是通过堆栈将标志寄存器内容传迭到 AX 中。由于 TF 在标志寄存器的第 8 位,因此常数设为 100H ( 100000000B ),用OR 指令将 AX 中第 8 位置“ 1” ,其余位不变。最后两条指令是通过堆栈将修改结果送回标志寄存器中。

Page 71: 献给正为信息化建设事业作出杰出贡献的人们。

2. 测试指令( Test )

• 指令格式: TEST DEST , SRC• 指令功能:( SRC )∧( DEST ),将源操作数与目的操

作数进行按位逻辑与运算,仅按结果设置标志位 SF , ZF ,PF ,相与的结果不保存。标志位 CF 和 OF 置 0 , AF 不确定。

• TEST 指令与 AND 指令的不同之处是,运算结果不送回目的地址中。因此 TEST 指令执行后, 2 个操作数都不变,只影响标志位。

• P150例 4-18 要求测试AL 中第 3 位的状态,因此可用指令“ TEST AL , 08H”实现。若 AL 第 3 位为 0 ,则( AL )∧ 08H 的运算结果为全零,使 ZF= 1 ;若 AL 第 3 位为 1 ,则结果不为零,使 ZF=0 。

Page 72: 献给正为信息化建设事业作出杰出贡献的人们。

3. 移位 /循环移位指今( Shift/Rotate)

• 移位指令共有 8条,它们可以对通用寄存器或存储单元中的操作数进行指定移位,即一次只移 1 位或按 CL 中的内容规定移位次数(位数)。移位指令可分为算术移位指令、逻辑移位指令和循环移位指令。这 8条指令有如下的共同点;

• .具有相同的指令格式: OPR DEST , COUNT• . 每条指令都是单操作数指令,即只需一个操作数 DEST 。• .DEST 只能是 8/16 位通用寄存器或存储器操作数,不能是立即数。

• .COUNT表示移位次数。移位-次, COUNT 可用常数 1替代;移位多次,则必须用 CL替代, CL 中存放移位次数。

Page 73: 献给正为信息化建设事业作出杰出贡献的人们。

( 1 )算术移位指令

• 指令格式:算术左移指令 SAL DEST , COUNT

• 算术右移指令 SAR DEST , COUNT

• 指令功能:算术左移指令将 DEST 指定的操作数左移 COUNT次。最高位移入 CF 中,最低位补 0 。移位操作如 P151 图 4 - 37 ( a )。算术右移指令将 DEST 指定的操作数右移 COUNT次。右移时,最高符号位保持不变,连同符导位依次右移,最低位移入 CF 中,如 P151 图 4-37 ( b )所示。

• 受影响的状态标志位为 OF , SF , ZF , PF 和 CF ,而 AF 不确定。

Page 74: 献给正为信息化建设事业作出杰出贡献的人们。

算术移位指令主要用于对带符号数的移位。

• 左移一位相当于乘 2 ;右移一位相当于除以 2 。算术移位后应保持该数的符号不变。在算术左移后不发生溢出的情况下,左移到符号位的数位值与原符号位值是相同的,从而使符号位不变;如果 SAL 指令只左移一位,且移位前后操作数的符号位发生变化,表明左移后产生了溢出,则置 OF 为 1 。如移位次数大于 1 ,则OF 不确定。

• 例如;( AL )= 11000001B ( -63 的补码), BL 中为( BL )= 10111111B (负数 -65 的补码)。以下指令将 AL 和 BL 中的数左移一位:

• SAL AL ,• SAL BL ,• 以上指令执行后,( AL )= 10000010B ,即 -126 的补码,不溢出 OF= 0 ,结果符合倍增

关系;而( BL )= 01111110B ,左移后发生溢出,则OF= 1 ,因此 BL 内容不再符合倍增关系。

• 例如:( AL ) =10110110B 。指令“ SAR AL , 1” 执行后,( AL ) =11011011B , CF=0 。

• 通常算术移位指令常用于实现带符号数的简单乘除运算,其执行时间比用乘除指令短得多。• 见 P151 例 4-19

Page 75: 献给正为信息化建设事业作出杰出贡献的人们。

( 2 )逻辑移位指令 、• 指令格式;逻辑左移指令 SHL DEST , COUNT• 逻辑右移指令 SHR DEST , COUNT• 指令功能;将 DEST 指定的 8/16 位寄存器或存储器操作数移位 COUNT次 , 移位一次COUNT

可用 1替代,移位多次COUNT 必须用 CL ( CL 中存放移位次数)替代。• SHL实现将操作数左移,最高位移入CF 中,最低位补 0 ,如图 4 - 38 ( a )所示。• SHR实现将操作数右移,最低位移入CF 中,最高位补 0 ,如图 4-38 ( b )所示。• 受影响的状态标志位为 OF , SF , ZF , PF 和 CF ,而 AF 不确定。如果移位指令只移一位,且移位前后操作数的符号位发生变化,则将 OF 置 1 ;否则OF 置 0 。如移位次数大于 1 ,则OF不确定。

• 通常逻辑移位指令可用于无符号数的简单乘除运算,还可以用于进行某些位操作。• P152例 4-20 要求把由 CL 中的数( 0~15 )所指定 AX 中的位分离出来。• MOV BX , 1• SHL BX , CL• AND AX , BX

Page 76: 献给正为信息化建设事业作出杰出贡献的人们。

( 3 )循环移位指令

• 指令格式;循环左移指令 ROL DEST , COUNT

• 循环右移指令 ROR DEST , COUNT

• 带进位循环左移指令 RCL DEST , COUNT

• 带进位循环右移指令 RCR DEST , COUNT

• 指令功能:将 DEST 指定的 8/16 位寄存器或存储器操作数移位 COUNT次,移位-次 COUNT 可用 1替代,移位多次 COUNT 必须用 CL ( CL 中存故移位次数)替代。

• ROL/ROR实现将操作数循环左移 /右移。• RCL/RCR实现将操作数和 CF 一起循环左移 /右移。• 受影响的状态标志位为 CF 和 OF 。 CF 存放每次移出的位。如果移位指令只移,位,且移位前后操作数的符号位发生变化,则将 OF 置 1 ;否则 OF 置 0 。如移位次数大于1 ,则 OF 不确定。

• 上述循环移位指令的移位操作如 P153 图 4-39 所示。• 当多字节或多字数据进行移位时,常用到带进位循环移位指令。

Page 77: 献给正为信息化建设事业作出杰出贡献的人们。

P152例 4 - 21

• 由 3 个字构成的+个无符号数从高位到低位依次存放在 M+ 4 , M+ 2 ,M 字单

• 元中,若要将该数右移一位,则可用以下程序段:• SHR M+ 4 , 1

• RCR M+ 2 , 1

• RCR M , 1

• 如 P153 图 4 - 40 所示, SHR 指令将 M+ 4 字单元的最低位移至 CF 中。第二条指令 RCR 将 CF 与 M+ 2 字单元构成一个 17 位的数进行-次循环右移,将 M+ 4 单元右移出的位通过 CF 移至M+ 2 单元的最高位,而 M+ 2中的最低位又移至 CF 。在第三条指令执行后,就完成将 3 个字的数右移 1 位。

Page 78: 献给正为信息化建设事业作出杰出贡献的人们。

四、串操作类指令

• “串”( STRING )是指存储器中一序列字或字节单元、这些单元的内容可能是字符或数据。串操作就是对这一序列字或字单元的内容进行某种操作,如把-个存储区中的串传送到另一个存储区,两个串进行比较,按指定要求在一个串中进行查找等。

• 8086/8088 指令系统中有 8条串操作指令,在指令功能上虽有不同,但在寻址方式上,均使用串操作所独有的寻址方式,即源串操作数地址由 DS :「 SI]表示( DS 可以由其他段寄存器替代),目的串操作数地址由 ES :「 DI]表示( ES 不能由其他段寄存器替代)。每次串操作除对字或字节操作数进行相应操作外,同时自动修改变址寄存器中 SI , DI 的内容,使它们指向下一个字或字节单元。修改 SI , Dl 的规则是:如标志寄存器中 DF=0 ,那么 SI ,DI 加 2 (字串)或加 1 (字节串),否则减 2 (字串)或减 1 (字节串)。为便于对串中多个字或字节单元操作,指令系统还设置有重复前缀指令,重复次数由 CX 中的内容确定。

Page 79: 献给正为信息化建设事业作出杰出贡献的人们。

1. 取串指令( Load String)

• 指令格式: LOADS 源串• 指令功能: ⑴ AX/AL← ( DS :( SI ))•    ( 2 ) SI← ( SI ) ±1 或 2• ( 3 )对标志寄存器无影响• LOADS 指令将源串中的一个字或字节内容送入 AX 或 AL 中,同

时按照 DF修改 SI 。由于源串的字或字节单元是由 SI 所指向,而指令中“源串”主要是指明取的源串是字还是字节。如果在编制程序时,已明确串是字或字节组成,那么可用无操作数指令格式替代:

• LOADSB ...... 取串中的一个字节• LOADSW ...... 取串中的一个字• 同理,后面几条串操作指令( STOS , MOVS , CMPS 和 SCA

S )也可用无操作数指令格式。

Page 80: 献给正为信息化建设事业作出杰出贡献的人们。

2. 存串指令( Store String)

• 指令格式; Store 目的串• 或 STOSB• STOSW• 指令功能: ( 1 ) ES :( DI )←( AX ) / ( AL )• ( 2 ) DI← ( DI )士 1 或 2• ( 3 )对标志寄存器无影响• STOS 指令将 AX 或 AL 内容送人目的串中的一个字或字节单元中,同时按照DF修改DI 。• 3.串传送指令 (Move String)• 指令格式: MOVS 目的串,源串• 或 MOVSB• MOVSW• 指令功能:( I ) ES :( DI )←( DS :( SI ))• ( 2 ) SI← ( SI )土 1 或 2 , DI← ( DI )土 1 或 2• ( 3 )对标志寄存器无影响• MOVS 指令将源串中的一个字或字节内容送到目的串中,同时按照DF修改 SI 和 DI 。

Page 81: 献给正为信息化建设事业作出杰出贡献的人们。

4.串比较指令( Compare String)

• 指令格式; CMPS 目的串,源串• 或 CMPSB / CMPSW• 指令功能:( 1 )( DS :( SI )—( ES :( DI ))• ( 2 ) Sl← ( SI )土 1 或 2 , DI ← ( DI )土 1 或 2• ( 3 )影响标志位 OF , SF , ZF , AF , PF , CF• CMPS 指令比较源串和目的串中的-个字或字节。比较方法是:源串中的一个字或字节减去目的串中的

一个字或字节,不保留相减结果,但在标志寄存器中反映了比较结果。每比较一次,同时按照DF修改 SI和 DI 。

• 5.串搜索指令( Scan String)• 指令格式: SCAS 目的串• 或 SCASB / SCASW• 指令功能:( I )( AX ) / ( AL )- (ES :( DI ))• ( 2 ) DI← ( DI )土 1 或 2• ( 3 )影响标志位 OF , SF , ZF , AF , PF , CF• SCAS 指令在目的串中查找AX 或 AL 指定的内容。查找的方法是:用 AX 或 AL 的内容减去目的串中的

一个字或字节,相减的结果反映在标志寄存器中。每查找一次,按照DF修改DI 。

Page 82: 献给正为信息化建设事业作出杰出贡献的人们。

6.重复前缀指令( Repeat)

• 前面 5条串操作指令,每执行一条指令便对串中一个字或字节进行一次操作,同时修改 SI 、 DI ,使它指向下一个字或字节单元,如果在串操作指令前加上重复前缀指令,那么就可以在一个或两个串中对连续的字或字节单元依次进行某种相同的操作。进行重复操作的次数在寄存器 CX 中。特别指出的是:重复前缀指令只能加在串操作指令前面。

• 重复前缀指令共有 3条:• ( I )指令格式: REP

• 重复执行串操作指令的条件是:( CX )≠ 0

• ( 2 )指令格式: REPE

• 或 REPZ

• 重复执行串操作指令的条件是:( CX )≠ 0 AND ZF= 1

• ( 3 )指令格式; REPNE

• 或 REPNZ

• 重复执行串操作指令的条件是;( CX )≠ 0 AND ZF=0

Page 83: 献给正为信息化建设事业作出杰出贡献的人们。

重复前缀指令是将它后面的串操作指令重复执行• 每执行-次串操作指令,除重复次数计数外,同时按照DF自动修改 SI , DI 。由于取串指令( LOADS )、存串指令

( STOB )和串传送指令( MOVS )的执行不影响标志寄存器各标志位,因此通常选用重复前缀指令 REP 。而重复前缀指令 REPE/REPZ 和 REPNE 和 REPNZ 的重复执行条件除( CX )≠ 0 外,还有标志位 ZF=1 或 ZF=0 ,因此,这两条重复前缀指令后面主要是选用 CMPS 和 SCAS 指令。在每重复执行 CMPS 和 SCAS 指令一次后,除重复次数计数,自动修改 SI , DI 外,根据指令执行结果设置标志位( ZF等),然后再按照当前 CX 内容和现行 ZF 值确定是否继续重复执行。

• 例如: REP MOVSB• 在执行这条指令之前,假没DF= 0 ,( SI ) =0020H ,( DI ) =0100H ,( CX )=( 0030H )那么,这条带有重复前缀的串传送指令,将把数据段从 0020H 开始的 30H 个字节传送给当前附加段以 0100H 为起始地址的存储区中。如果不用串操作指令,上述传送操作就需编制如下程序段:

• MOV SI , 0020H• MOV DI , 0100H• MOV CX , 0030H• LOP : MOV AL ,[ SI]• MOV ES :[DI], AL• INC SI• INC DI• LOOP LOP

Page 84: 献给正为信息化建设事业作出杰出贡献的人们。

五、处理嚣控制指令• 8086/8088指令系统中有3种控制指令。• 1. 标志位操作指令• 这种指令是无操作数指令,指令中未直接给出操作数的地址,但隐含指出操作数在标志寄存器中某些标志位上。能直接操作的标志位有 CF, IF,DF。• (1)清除进位标志指令(Clear carry flags)• CLC ;置CF=0• (2)进位标志置位指令( Set carry flags)• STC ;置CF= I• (3)进位标志取反指令(Complement carry flags )• CMC ;CF取反• (4)清除方向标志指令(Clear direction flags)• CLD ;置DF=O• (5)方向标志置位指令(Set direction flags)• STD ;置DF=1• (6)清除中断标志指令(Clear interrupt-enable flags )• CLI ;置 IF=0• (7)中断标志置位指令(Set interrupt-enable flags)• STI ;置 IF=1• 上述指令只对指定标志位操作,而不改变其余标志位。

Page 85: 献给正为信息化建设事业作出杰出贡献的人们。

2. 与外部事件同步的指令

• ( 1 ) HLT ;停机指令• ( 2 ) WAIT ;等待指令, CPU 用 WAIT 指令等待外部事

件就绪,以达到同步目的。• ( 3 ) ESC 是外部协处理器指令的前缀。• ( 4 ) LOCK 是总线封锁前缀指令。• 3. 空操作指令( No operation )• 指令格式: NOP

• 该指令使 CPU 执行一次空操作,只占 CPU3 个时钟周期,不影响任何寄存器、存储单元及标志位。可用在延时程序中。

Page 86: 献给正为信息化建设事业作出杰出贡献的人们。

4.5 提高 CPU性能的一些措施

• 4.5.1 RISC技术• 4.5.2 80386/80486

• 4.5.3 Pentium

Page 87: 献给正为信息化建设事业作出杰出贡献的人们。

本章小结

• 本章以 8086/8088CPU 为例,使读者较深入地了解一个具体 CPU 的内部结构及指令系统。

• 此外,本章也是学习 8086/8088宏汇编语言的基础。• 读者在学习完本章后,应该深入理解以下内容;• ( 1 ) 8086/8088CPU 的各个寄存器特别是标志寄存器的功能;• ( 2 )主存储器如何分段, CPU怎样形成访问存储器的地址;• ( 3 )堆栈的结构及操作。• 本章的重点和难点是 8086/8088 指令系统的各种寻址方式,要求熟练掌握。对介绍的各条指令,要求掌握其指令格式和功能。