109
第第第 8086/8088 第第第 第 第第第第第第第第第 第第第 第第 第第第 第第第 第第第第第第 第第第 第第第第第第 第第第 第第第第第第 第第第 第第第第第

第五章 8086/8088 指令系统

  • Upload
    tovi

  • View
    66

  • Download
    10

Embed Size (px)

DESCRIPTION

第五章 8086/8088 指令系统. 第一节 指令格式和寻址方式 第二节 数据传送指令 第三节 算术运算指令 第四节 逻辑运算指令 第五节 控制转移指令 第六节 字符串指令. 第一节 指令格式和寻址方式. 一、指令格式 二、指令助记符 三、寻址方式 (一)指令地址的寻址方式 (二)操作数地址寻地方式. 一、指令格式. 指令是计算机用以控制各部件协调动作的命令 指令字是一种二进制代码,它包括两个基本部分:操作码和地址码。操作码提供的是操作控制信息,指明计算机应执行什么性质的操作,如进行+、-、×、÷等;地址码提供参加运算操作数据的存放地址(即操作数地址)。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第五章 8086/8088 指令系统

第五章  8086/8088 指令系统

第一节 指令格式和寻址方式 第二节 数据传送指令 第三节 算术运算指令 第四节 逻辑运算指令 第五节 控制转移指令 第六节 字符串指令

Page 2: 第五章 8086/8088 指令系统

第一节 指令格式和寻址方式

一、指令格式 二、指令助记符 三、寻址方式

(一)指令地址的寻址方式 (二)操作数地址寻地方式

Page 3: 第五章 8086/8088 指令系统

一、指令格式

指令是计算机用以控制各部件协调动作的命令指令字是一种二进制代码,它包括两个基本部分:操作码

和地址码。操作码提供的是操作控制信息,指明计算机应执行什么性质的操作,如进行 + 、 - 、 × 、 ÷ 等;地址码提供参加运算操作数据的存放地址(即操作数地址)。

只提供一个操作数地址的指令,称为单操作数指令;提供二个操作数地址的指令,称为双操作数指令;不提供操作数地址的指令,称为无操作数指令。

无操作数指令只有操作码部分,它的格式为

其中 θ 为操作码。 θ

Page 4: 第五章 8086/8088 指令系统

这种指令表示只进行某种操作,无需操作数,如控制机器的运行状态,暂停( HALT )等,就属于无操作数指令。

单操作数指令格式为 其中 θ 为操作码; D 为目标操作数地址,简称目标地

址。这种指令表示对目标地址 D 中的内容,按操作码 θ 规

定进行操作,结果送目标地址。双操作数指令格式为 其中, θ 为操作码, D 为目标地址, S 为源地址(即

作数地址)。这种指令表示对源地址和目标地址中的内容,按操作码

规定的操作进行操作,结果送目标地址,即 D←DθS。

θ D

θ D S

Page 5: 第五章 8086/8088 指令系统

在微型机中,一般采用可变字长指令。也就是说,不同的指令用不同长度来表示,但都是字节的整倍数。如一字节、二字节、三字节和四字节指令等。它们在存储器中分别占有1~4 个存储单元,其格式如下:

单字节指令:

操作码 7 6 5 4 3 2 1 0

Page 6: 第五章 8086/8088 指令系统

双字节指令:

第一字节: 操作码

第二字节: 操作数或地址

Page 7: 第五章 8086/8088 指令系统

三字节指令: 第一字节: 操作码

第二字节: 操作数或地址低位

第三字节: 操作数或地址高位 或: 第一字节: 操作码

第二字节: 操作码

第三字节: 操作数或地址

Page 8: 第五章 8086/8088 指令系统

四字节指令: 第一字节: 操作码

第二字节: 操作码

第三字节: 操作数或地址地位

第四字节: 操作数或地址高位

Page 9: 第五章 8086/8088 指令系统

二、指令助记符

机器指令是二进制代码,二进制代码不易辨识和记忆。因此,在介绍机器指令时,除非必要情况下用二进制代码,一般情况下使用指令助记符。指令助记符由操作码和操作数的助记符号表示。通常操作码用英文单词或英文缩写单词来表示如: ADD, JP( Jump )等。操作数用表示寄存器存储器地址的符号来表示。我们首先来学习操作数部分的符号,然后结合指令来学习表示操作码的符号。用助记符来表示的指令又称为指令的汇编格式。

Page 10: 第五章 8086/8088 指令系统

指令中要出现的符号介绍如下:AX, BX, CX, DX 16 位通用寄存器AH, BH, CH, DH, AL, BL, CL, DL 8 位通用寄存器CS, DS, ES, SS 段寄存器SP, BP , IP 堆栈指针,基址指针,指令指针DI, SI 目的,源变址寄存器Flags 标志寄存r r=AX 、 BX 、 CX 、 DX r=AL、 BL、 CL、 DL

a ( acc ) a=AX AL

Page 11: 第五章 8086/8088 指令系统

Seg seg=CS、 DS、 ES、 SS

Src ( source)、 dst ( dest )源操作数、目的操作数Count 计数器Oprd 操作数Im 立即数 n 8 位 nn 16 位nnnn 32 位EA 有效地址

Page 12: 第五章 8086/8088 指令系统

三、寻址方式

数据和程序在存储器中的位置,称为地址。存放指令的地址,称为指令地址;存放数据的地址,称为操作数地址,简称操作地址。

寻找指令地址和操作数地址的方式,统称为寻址方式。形成指令地址和操作数地址的过程,称为寻址过程。

(一)指令地址的寻址方式(二)操作数地址寻地方式

Page 13: 第五章 8086/8088 指令系统

(一)指令地址的寻址方式

在微机中,指令地址的寻址方式比较简单,通常是在CPU 中设置程序计数器 PC, PC 中的内容就是指令地址。

在一般情况下,程序是顺序执行的,程序在存储器中也是按顺序存放的。这时,只要将程序计数器中的内容自动递增,就可以形成下一条指令地址。

当需要改变程序的执行顺序时,要使用转移指令,由转移指令给出转移后指令字的起始地址。将此地址送到程序计数器,就形成了转移后的地址。然后,程序计数器中的内容又自动递增,直到再次发生转移为止。

Page 14: 第五章 8086/8088 指令系统

(二)操作数地址寻地方式

微机在工作时,指令地址在程序执行过程中时自动形成的,但指令所需的操作数地址是随机的,要根据指令的规定求得,获得操作数地址的方式,称为操作数寻址方式,有时也把它称为寻址方式。

在操作数寻址方式中,除了涉及 BP 的寻址方式外,一般寻址均在数据段内(段地址由 DS 提供),在涉及 BP 时,则使用堆栈段(段地址由 SS 提供),在执行串操作时,使用附加段 ES 。在各种寻址方式中,以立即数和存储器直接寻址方式,速度最快,因为此时 8086/8088 的执行单元 EU可以立即从寄存器中或指令队列中取出操作数,而无须再由总线执行单元计算出有效的 20 位地址,然后再去取操作数。

Page 15: 第五章 8086/8088 指令系统

1.立即数寻址

在指令中直接给出一个常数作为操作数,如: MOV AX, 200

表示将常数 200 送到存储器 AX 中,要注意的是在 16位操作中,直接数的取值范围为 32767 ( 7FFFH )到 -32768 ( 8000H),当为无符号数时则为 0-65535 ( 0FFFFH),对 8 位数应为 0-255( OFFH),符号数为 127 ( 7FH )到 -128 ( 80H)。

Page 16: 第五章 8086/8088 指令系统

2. 寄存器直接寻址

指令中的寄存器存放了操作数,如: ADD CX, BX

表示将 BX 中的值直接相加,然后送到 CX 中去。

Page 17: 第五章 8086/8088 指令系统

3. 寄存器间接寻址

在指令中,有操作数的地址,将该地址同左移 4 位后的DS值相加,即可得到 20 位物理地址,从该地址中取出操作数进行指令所要求的操作,这种寻址方法称为直接寻址,通常该类指令中,操作数的地址用标号表示,例如:

ADD AX、 TABLE

表示将 AX 中的值和 TABLE 表示的地址中的内容相加,和放在 AX 中。

8086/8088 按字存放内容时,低字节方在低地址中,高字节跟随其后,方在高地址中。

Page 18: 第五章 8086/8088 指令系统

5. 变址寻址

将指令中指令的变址寄存器的内容加上偏移值,即成为操作的地址,例如:

MOV DI, 4

MOV AX, TABLE[DI]

表示偏移值 TABLE 加 4( DI 的内容)作为操作数地址,取出操作数送 AX。

这种寻址方式通常用于读写表中的元素,如 TABLE偏移值表示的首址,加 4 表示将表中的第三个量( 16 位)送AX ,读写数组元素也采用此法。

Page 19: 第五章 8086/8088 指令系统

6. 基址寻址同变址类似,不过这种寻址中使用基址寄存器 BX、 BP 代替变址

寄存器 DI和 SI 。它是将基址寄存器的内容加上偏移量而作为操作数地址的,例如:

MOV AX, [BX+6]

表示 BX 作为基址,距其偏移 6 字节的地址便是操作数地址,在这种寻址中 BX 基址对应的段地址在当前数据段中,若基址是 BP ,则操做数在堆栈段内。

IBM 汇编允许用三种形式指定基址寻址,它们的效果是一样的,如:

MOV AX, [BX]+6 ;标准格式MOV AX, 6[BX] ;先写偏移值MOV AX, [BX+6] ;偏移值写在括号内

Page 20: 第五章 8086/8088 指令系统

7. 基址变址寻址

基址变址寻址时,操作数地址是由一个基址寄存器的内容,一个变址寄存器的内容及偏移值(是任选项,也可不用)相加和,例如:

MOV AX, 6[BP][SI]

表示距栈顶 6 个字节处作为基址,然后以 SI 内容为相对基址的偏移作为操作地址,这种寻址方式在访问堆栈数组时很有用,如基址为栈顶,则变址寄存器中的值表示堆栈中的相应元素。

这种寻址方式也多用于对二维数组的访问,如用 BX 作为数组的首地址,变址寄存器及偏移值作为数组行和列的值,依次寻址,,就可找到某个二维数组元素。

Page 21: 第五章 8086/8088 指令系统

第二节 数据传送指令

8086/8088 有 92 条指令,按其功能可分为 6 个功能组:

1. 数据才传送 2. 算术运算 3.逻辑运算 4. 串操作 5. 控制传送 6.处理器控制

Page 22: 第五章 8086/8088 指令系统

数据传送指令又可分为以下七种: (1) 通用数据传送指令 MOV (2) 堆栈操作指令 (3)交换指令 (4) 标志寄存器传送指令 (5)输入输出指令 (6) 地址目的传送指令 (7)查表转换指令 这类指令用来在寄存器和存储单元或输入 /输出端口传送数据或地址,表 5.2.1 列出这 7 种指令 :

Page 23: 第五章 8086/8088 指令系统

汇编格式 操作MOV dest,source 传送一个字节或字PUSH source 压一个字进栈POP dest 弹一个字进栈PUSHF 压标志寄存器进栈POPF 弹标志寄存器出栈XCHG op1,op2 交换两个字节或字LAHF 将标志寄存器内容装入 AH 中(装右字节) SAHF 将 AH 寄存器内容存到标志寄存器(右字节)IN acc,port 从端口输入字节或字到累加器OUT port,acc 从累加器输出一个字节或字到端口LEA dest,source 装入有效地址,即将存储器操作数偏

移地址送目的寄存器LDS dest,source 将段地址装入 DS 中,偏移地址装入 目的寄存器LES dest,source 将段地址装入 ES 中,偏移地址装入目 的寄存器 XLAT 查表转换

Page 24: 第五章 8086/8088 指令系统

1、 MOV 指令

MOV 指令是最基本的通用传送指令,它把一个字节或一个字从源传送到目的。这条指令可实现下述操作:

MOV nn,a ;(nn) ←a

MOV a,nn ;a←( nn)MOV seg,src ;seg←src

MOV dst,seg ;dst←seg

MOV r,src ;r←src

MOV dst,r ;dst←r

MOV dst,im ;dst←im

Page 25: 第五章 8086/8088 指令系统

MOV 指令可以在寄存器与存储单元之间,寄存器和寄存器之间传送字节或字,也可以将一个立即数送寄存器或存储单元,例如:

MOV AX, TABLE ; TABLE 存储地址传送到AX

MOV TABLE, DX ;从 DX传送到存储地址MOV ES; [BX], AX ;指定段寄存器到 ES ,

而不用 DS

MOV DS, AX ;寄存器间 16 位数传送MOV DL, AL ; 8 位寄存器间传送MOV CL, 30 ;常数送寄存器MOV TABLE, 05H ;常数送存储单元

Page 26: 第五章 8086/8088 指令系统

2 、堆栈操作指令

目前,微计算机一般都是把内存的一个区域作为堆栈。这个堆栈按照后进先出的原则组织一段内存区域,由堆栈指针指出它在存储器中的位置。 8086/8088 用段寄存器 SS和堆栈指针 SP 指示堆栈在内存的位置,这个堆栈长度为64KB ,因此 SP 为 16 位指针的单元。 8086/8088 规定SP 始终指向堆栈的顶部,即始终指向最后压入堆栈的信息所在的单元。 8086/8088 的堆栈是下推式,即随着压入堆栈的内容的增加, SP 的值减小。 SP 的初值可由 MOV SP, im 指令来设定。

堆栈操作指令包括入栈指令和出栈指令。

Page 27: 第五章 8086/8088 指令系统

( 1 )入栈指令 PUSH oprd

入栈指令完成将 16 位的数据送入堆栈的操作,具体入栈指令如下:

PUSH r ;(SP) ←r,SP←SP-2

PUSH seg ;(SP) ←seg,SP←SP-2

PUSH src ;(SP) ←src,SP←SP-2

Page 28: 第五章 8086/8088 指令系统

(2) 出栈指令 POP oprd

出栈指令完成将 16 位的数据从堆栈弹出的操作,具体出栈指令如下:

POP r ;r←(SP),SP←SP+2

POP seg ;seg←(SP),SP←SP+2

POP dst ;dst←(DP),SP←SP+2

Page 29: 第五章 8086/8088 指令系统

入栈时,把一个字从上述操作数传送到已由 SP 指向的堆栈顶部,同时修改 SP 的值,使 SP 指向新的栈项单元。

出栈时,把堆栈顶部的一个字,传送到指定的目标操作数,同时修改 SP 的值,使 SP 指向新的栈顶单元。

PUSH和 POP 指令提供一个先进后出的堆栈结构,它们用 SS 栈寄存器来指向栈的段地址,用 SP 堆栈指针来指向栈顶位置,当执行 PUSH 指令时, SP减 2 后,将源操作数(一个字)压入栈内,相反 POP 指令则将当时 SP 所指定的堆栈中的字取出到目的操作数,然后 SP 加 2 。

Page 30: 第五章 8086/8088 指令系统

PUSH和 POP 指令提供了一种存储的技巧,例如可用于数据交换,将 DS 的值传给 ES ,使数据段和附加段指向同一个段地址:

PUSH DS

POP ES

又如在程序中要用到某一寄存器,它的值在程序中某一段将被改变,而后面又要用到它,且需要它的原先值,可采用如下方法:

PUSH AX ;将 AX值存入堆栈… … ; AX 的值被改变的程序段POP AX ;再取回 AX 的原先值

Page 31: 第五章 8086/8088 指令系统

( 3) PUSHF和 POPF 指令PUSHF和 POPF 是将标志寄存器内容入栈和出栈,这两种指令

在调用子程序,保存标志寄存器内容时常用到,即在调用前标志寄存器入栈,返回主程序时,恢复其值。另外,当标志寄存器 TF位为 1 时, 8086/8088 在每执行一条指令后,便执行一条 1 型中断指令,即指令执行变成单步方式,这在调试程序时可用到,以便跟踪每条指令执行情况。由于没有任何一条指令能使 TF 变成 1 ,但这可用下面的方法实现:

PUSHF ;标志进栈POP AX ;标志值送 AX

OR AX , 0100H ;使 TF 位置 1

PUSH AX ; AX 进栈 POPF ;将 AX值送到标志寄存器若要恢复 TF=0 , 则 可 将 OR AX , 0100H 换成 AND

AX, 0FEFFH 来清除 TF。

Page 32: 第五章 8086/8088 指令系统

3 、交换指令

具体的指令如下: XCHG AX, r ;AX r XCHG r,src ;r src XCHG 指令用于交换源操作数和目的操作数的内容,源和目的操作数可以在寄存器或单元中,但不能同为存储单元,段寄存器也不能用作操作数。下面是寄存器交换例如: MOV AX , 50 MOV BX, 10 XCHG AX, BX ;现在 AX=10, BX=50

Page 33: 第五章 8086/8088 指令系统

4 .标志寄存器传送指令 LAHF和SAHF

LAHF 指令是将标志寄存其中标志 CF.PF.AF.ZF.和SF 分别送到 AH 的 0.2.4.6.7 位 ,而 SAHF 指令却相反,它 是 将 AH 的 相 应 位 内 容 送 到 标 志 寄 存 器 的CF、 PF、 AF、 ZF和 SF 位。

Page 34: 第五章 8086/8088 指令系统

5. 输入输出指令 IN和 OUT

IN和 OUT 指令用来读写 I/O口 ,8086/8088 可寻址的口地址可达 64K 个 ,口地址可用 DX 或立即数表示 , 如用立即数 , 则仅能寻址 0-FFH,读写的数据必须从 AX 中接收或传送 ,例如 :

IN AL,2FH ; 从 2FH口输入一个字节到 AL

OUT 5,AL ; 将 AL 中的数送到 5口中去MOV DX,3FCH ;3FCH口地址送 DX

IN AX,DX ; 从 3FCH口读一个字到 AX 中这类指令在接口技术中使用较多 , 当读写一个字时 , 先是低

字节 , 然后是高字节 ( 因为数据总线是 8 位 , 所以必须分两次读写 ), 如从 3FCH口读一个字时 ,实际上从 3FCH口读一个字节到 AL 中去 . 然后从 3FCH口再读一个字节到 AH 中去。

Page 35: 第五章 8086/8088 指令系统

6. 地址 - 目标传送指令

8086/8088 有三条地址 - 目标传送指令 :

LEA r,src

LDS r,src

LES r,src

LEA 指令将一个储储器中数据的偏移地址送到任一个通用寄存器 . 指针寄存器或变址寄存器 ,例如 :

LEA BX,TABLE[DI]

将把 TABLE+[DI] 的偏移地址送到 BX 中 .

LDS 指令将从指定的存储器地址中取出一个 32 位的双倍字 ,将其低 16 位送到指定的字寄存器 , 而将高 16 位送到 DS,例如 :

Page 36: 第五章 8086/8088 指令系统

LDS BX,ARRAY

ARRAY假如为一个双倍字长的字 , 比如是代表一个物理地址的变量 , 执行此指令后将 ARRAY 高二字节表示的段地址送入 DS 中 , 而将其低二字节表示的偏移地址送入 BX 中 ,这相当执行了三条指令 :

MOV BX,ARRAY

MOV AX,ARRAY+2

MOV DS,AX

LES 指令将段地址送入 ES 中 , 其别的功能同 LDS.

Page 37: 第五章 8086/8088 指令系统

7. 查表转换指令 XLAT

XLAT 指令可进行查表操作此表可达 256 个字节 . 使用该指令时 , 将表的起始地址送入 BX 中 , 将表的位移值 ( 即要查表的位置 ) 送入 AL 中 . 。然后执行 XLAT 指令 , 则将查到的值存入 AL 中 .

Page 38: 第五章 8086/8088 指令系统

第三节 算术运算指令

8086/8088 有加、减、乘、除四种基本的运算指令,这些指令可用于字节或字运算,可用于带字号数与无符号数的运算。如果是符号数,则用补码表示。大部分指令操作影响标志寄存器响应位。算术运算指令如表 5.3.1 所示

8086/8088 提供各种矫正操作指令,这些矫枉正操令与二进制算术运算指令配合使用,使得 8086/8088 也能进行十进 制 算术运 算 。十进 制 数 不带符 号 , 可 用压缩十进 制 数( BCD),或非压缩型十进制表示,前者每个字可包含两个用场 4 位二进制码表示的十进制数,即十进制数的范围为 00~99 ;对非压缩型的数,则一个字节仅表示一个十进制数即 0~9 ,字节的高 4 位在作乘除运算时必须为 0 ,加减时可任意。

Page 39: 第五章 8086/8088 指令系统

1 、加减法运算指令 ADD、ADC、SUB、SBB

2 、比较指令CMP 3 、 INC、 DNC、 NEC指令 4 、乘法与除法指令 MUL、 IMUL、 DIV、 IDIV 5 、 CBW与 CWD指令 6 .十进调整指令

Page 40: 第五章 8086/8088 指令系统

汇 编 格 式 操 作A D D d e s t , s o u r c eA D C d e s t , s o u r c eS U B d e s t , s o u r c eS B B d e s t , s o u r c eI N C d e s tD E C d e s tN E G d e s tC M P d e s t , s o u r c eM U L s o u r c eI M U L s o u r c eD I V s o u r c eI D I V s o u r c eC B WC W D

加 字 或 字 节带 进 位 的 字 节 或 字 的 加 法字 节 或 字 的 减 法带 借 位 的 字 节 字 的 减 法字 节 或 字 加 1字 节 或 字 减 1对 目 的 操 作 数 取 补目 的 操 作 数 与 源 操 作 数 比 较无 符 号 数 字 节 或 字 乘 法整 数 ( 带 符 号 ) 乘 法无 符 号 数 字 节 或 字 乘 法整 数 ( 带 符 号 ) 除 法把 字 节 转 换 为 字把 字 转 换 为 双 字

Page 41: 第五章 8086/8088 指令系统

汇 编 格 式 操 作D A AD A SA A AA A SA A MA A D

加 法 十 进 制 调 整减 法 十 进 制 调 整

加 法 A S C I I 码 调 整减 法 A S C I I 码 调 整乘 法 A S C I I 码 调 整除 法 A S C I I 码 调 整

Page 42: 第五章 8086/8088 指令系统

1 、加减法运算指令 ADD、ADC、SUB、SBB

加法指令 带进位加法指令 减法指令 带借位减法指令

Page 43: 第五章 8086/8088 指令系统

(1)、加法指令

ADD r,src ;r←r+srcADD a,im ;a←a+imADD dst,im ;dst←dst+imADD dst,r ;dst←dst+r

Page 44: 第五章 8086/8088 指令系统

(2)带进位加法指令

ADC r,src ; r←r+src+cADC a,im ;a←a+im+cA D C dst,im ;dst←dst+im+cA D C dst,r ;dst←dst+r+c其中C为进位标志的现行值。

Page 45: 第五章 8086/8088 指令系统

(3)减法指令

SUB r,src ;r←r-srcSUB a,im ;a←a-imSUB dst,im ; dst←dst-imSUB dst,r ; dst←dst-r

Page 46: 第五章 8086/8088 指令系统

(4) 带借位减法指令

SBB r , src ; r r src c

SBB a, im ; a a im —c

SBB dst, im ; dst dst—im—c

SBB dst, r ; dst dst—r—c

其中 c 为借位标志的现行值

Page 47: 第五章 8086/8088 指令系统

ADD、ADC、SUB、SBB均是作加减运算的指令,其功能是源操作数与目的操作数进行相加或相减,而ADC与ADD的差别是ADC为带进位的加,同样SBB是带借位的减,源操作数可以在寄存器、存储器中或立即数,目的操作数可以在寄存器、存储器中。这些指令运算的结突目的操作数中。上述指令可完成8位(字节)或16位运算超过16位则需多条指令。

比如操作数长度大于16位的加法,用下面的指令ADD AX,CX ;低16位相加ADC BX,DX ;带低16位进位的高位相加这两条指令将把CX和DX中的32位数加到AX和B

X中的32位数中,县后面的一条指令,还将低16位的进位也一起加上,结果在AX和BX中。又比如操作数长度大于16位的减法,可用下面的指令

Page 48: 第五章 8086/8088 指令系统

SUB AX,CX ;低16位相减SBB BX,DX ;带低16位借位的高位相减SBB作减法时,不仅BX和DX相减,还要减去上条

指令执行相减后的借位,最后的结果低16位将在AX中,高16位将在BX中。

这类指令不能用于存储单元容的加减,也不能用立即数作为目的操作数。它们的运算结果均将影响标志寄存器的CF、OF、PF、SF、ZF和AF。

Page 49: 第五章 8086/8088 指令系统

2、比较指令CMP

比较指令完成两个操作数加减,使结果反映到标志位上,并不送回相减的差值。指令格式如下:

CMP r,src ;r-srcCMP a,im ; a-imCMP dst,im ;dst-imCMP dst,r ;dst-rCMP指令是比较指令,用于目的操用数 与源操用数 进

行比较,即相减,类似于SUB指令,但不同的是,该指令不保存相减的结果,因而不变操作数 ,它仅影响标志寄存器,表5 .3 .2示出了比较指令影响标志位的情况。

Page 50: 第五章 8086/8088 指令系统

目 的 操 作 数 与 源 操 作 数 比 较 C F Z F S F O F

源 < 目 的 - - 0 0 / 1 0 / 1源 = 目 的 0 1 0 0带 符 号 操 作 数源 < 目 的 - - 0 0 / 1 0 / 1

源 < 目 的 0 0 - - - -源 = 目 的 0 1 - - - -无 符 号 操 作 数源 > 目 的 1 0 - - - -

Page 51: 第五章 8086/8088 指令系统

一般在使用CMP指令时,后面总是跟着一条条件转移命令,跟据比较结果标志位的情况决定程序的执行方向,由表5 .3 . 2可看出:

两位比较要等用零标志位 ZF ,若 ZF= 1 则表示相等。不带符号数比较大小时,当借位标志 CF= 1 时,说明

源>目的,否则目的>源。带符号数比较大小时,用符号标志 SF与溢出 OF半加

(异或)来判断,若 SF⊕OF= 1 ,则源>目的,否则源<目的。例如:

CMP AX, 8000H ; AX 与 8000H 相比较JL AGAIN ;如 AX 小于 8000H 则 转

AGAIN当 CMP 执 行 后 ,若 SF≠OF 时 , ( 即 SF⊕CF =

1),即源>目的,则转移。

Page 52: 第五章 8086/8088 指令系统

3、 INC、 DNC、 NEC 指令

INC和 DEC 指令仅有一个操作数,其操作可以是8位或16位的通用寄存器值,也可以是存储单元中的数,INC将执行操作数加1的操作,DEC指令将执行操作数减1的操作,结果仍送回操作的位置中去。这两条指令操作结果均不影响 CF 标 .。

NEC 指令为求补指令,它是从零中减去操作数,形成 2 的补 ,操作数仅有一个,可以是寄存器的破除储存单元的数。例如: NEC DATA

DATA 存储单元内设有数为 00000101 ,则执行该指令后,其内容就变为 11111011 。

Page 53: 第五章 8086/8088 指令系统

当从一个立却数中减去寄存器或存储器中的数时,不能用 SUB 指令,但可以减数变补,然后再和其相加得到减的果,如立即数为 100 ,则可用如下命令:

NEG ALADD AL,100

Page 54: 第五章 8086/8088 指令系统

4 、乘法与除法指令MUL、 IMUL、 DIV、 IDIV

8088提供乘法与除法指令,具体指令格式如下:MUL src ; AX←AL*src( 无符号数 )MUL src ; DX、 AX←AX*src (无符号数)IMUL src ; AX←AL*src (符号数)IMUL src ; DX 、 AX←AX*src (符号数)DIV src ; AL←AX/src,AH←余数DIV src ; AX←DX. AX/src, DX←余数IDIV src ;AL←AX/src, AH←余数(符号数)IDIV src ; AX←DX 、 AX/src,DX←余数(符号

数)

Page 55: 第五章 8086/8088 指令系统

MUL 是无符号数乘法指令, IMUL 是带符号数的乘法指令(整数乘法),它们都可以完成字节与字节相乘,字与字的相乘,这些乘法指令均认为目的操作数在 AL和 AX 中,源操作数由指令指出,当 16 位乘法时, 32 位的乘积规定高 16 位在 DX 中,低 16 位在 AX 中。

在 8 位 或 16 乘法若扩展部 分 AH 或 DX 为 0 则CF=0,OF=0 ,反之 CF=1。OF=1。

IMUL 是带符号数乘法 ,执行情况同 MUL ,不过在 16 位或 31 位乘积中,包括一位符号位。

DIV 是 无 符 号 除法指 令 , 它 可 以 进 行 字 节 或 字 除法, DIV 规定:对于 8位除法,被除数在 AX 中,对于 16 位除法,被除数则在 DX与 AX 中,而除数在指令中指出。除完的结果,对 8位数除法,商与余数分别放在 AX与DX中。

Page 56: 第五章 8086/8088 指令系统

IDIV 是带符号 数除法,情况同 DIV ,除后余数符号和被除数相同 。这两条除法指令都不能用立即数作源操作,但若需要时,可用如下指令来实现,例如:

MOV BX, 10 DIV BX ;用 10去除 DX: AX

Page 57: 第五章 8086/8088 指令系统

5、 CBW与 CWD 指令

上述的除法,被除数均是除数的双倍字长,若要进行相同字长的除法,则需将被除数扩展为双倍字长,这就要用下面两条指令:

CBW 是将字节扩展为字指令,它是将 AL 中的符号扩展到 AH 的所有位去, CWD 是扩展为双字指令,它是将 AX 的符号(第 15 )扩展到 DX 的所有位去,例如 AL 中的内容为 -2 ,执行 CBW 后

AH AL

11111111←- 11111110=-2

Page 58: 第五章 8086/8088 指令系统

下面是一个四则运算的例子: 设 BH=FB (即 -5 ) BL=FE( -2) CH=( -20 ) CL=05

计算( BH*BL) +( CH/CL) AX MOV AL, BH ; AX= FBⅹⅹ IMUL BL ; AX=000A=-5 (-2)ⅹ MOV DX,AX ; 暂时保存结果 MOV AL,CH ; AX=00EC(-20)

CBW ;AX=FFEC,扩展为双 字节 IDIV CL ; AX=00FC(-4)

CBW ; AX=FFFC

ADD AX、 DX ; AX=0006=+6

Page 59: 第五章 8086/8088 指令系统

6 .十进调整指令

( 1)DAA 指令( 2) AAA 指令( 3)DAS和 AAS 指令( 4) AAM与 AAD 指令

Page 60: 第五章 8086/8088 指令系统

( 1) DAA 指令

当 BCD 码的十进制运算用二进制进行时,有两种情况需要进行调整: 1 、运算的结果出现非法的 BCD 码(即大于的数) ;2 、运算产生半字节间的进位。调整的方法是加6 进行修正。

DAA 指令就是按上述原则进行十进制调整的,它是一条无操作数指令,与 ADD 指令配合实现压缩型十进制加法。

Page 61: 第五章 8086/8088 指令系统

( 2) AAA 指令AAA 是非压缩型十进制加法调整指令,它的作用是将 AL 中

的数换成一个非压缩型十进制数,即 AAA 指令执行时,检查AL的低 4 位,若是一个合法的 BCD 码,则清除 AL 的高 4 位,否则按上述修正原则进行低 4 位修正,并将 AL 的高 4 位清零。例如AL 中的内容为 00001001=9, CL 的内容为 00001000=8,执行如下指令:

ADD AL,CLAAA执行 ADD 后, AL 中的内容为 00010001 ,因 AF=1 ,故

AAA 指令进行调整,将 AL 中的低 4 位加 6 ,即变成 00010111 ,然后高 4 位清零成为 00000111 ,并且AH 加 1 ,因此 AH 中为00000001, AL 中为 00000111 ,得到两个非压缩型十进制数。

Page 62: 第五章 8086/8088 指令系统

(3)DAS和 AAS 指令DAS 是压缩型十进制数减法调整指令, AAS 是非压缩型十进

制数减法调整指令,它们同 ADD和 AAA 指令一样,不要操作数,且假定要调整的数在 AL 中。

DAS 的调整过程是:若 AL 的低 4 位大于 9或 AF=1 ,则从AF 中减去 6 ,并置 AF=1 ,若 AL 的 高 4 位大于 9 , 或CF=1 ,则从 AL 中高 4 位减去 6 ,并置 CF=1 ,如用下述指令:

SUB AL, BL ; AL 中的数(压缩的 BCD 码)减去BL (压缩的 BCD 码)

DAS ;调整结果, AL 中为正确的码。 AAS 指令将 AL 中的内容调整成非压缩型十进制码,即如果

AL 低 4 位大于 9 , 或 AF=1 , 则减去 6 , AH 减 1 ,并置AF=1, CF=1 ,并清除 AL 高 4 位。

Page 63: 第五章 8086/8088 指令系统

( 4) AAM与 AAD 指令

AAM 是非压缩型十进制乘法调整指令,它与指令配合使用,把中的两个非压缩型十进制数相乘所得结果加以校正。 AAM 指令必须跟在 MUL 指令后。

AAD 是非压缩型十进制除法调整指令,它要在执行除法之前使用,它是将非压缩十进制表示的被除数换成第二进制值送到 AL 中,即 AAD 将被除数高位( AH )乘 10 ,然后加到低位( AL )上,并将 AH清零, ADD 用法如下所示:

AAD ;将非压缩型十进制数调整 DIV BL ; 完成除法。

Page 64: 第五章 8086/8088 指令系统

第四节 逻辑运算指令

8086/8088 逻辑运算指令组包括逻辑运算指令、移位指令和循环移位指令。它们是对寄存器或存储单元进行位操作的指令,也称位操作指令。逻辑运算指令如表 5.4.1 所示 .

一、逻辑运算指令二、移位指令三、循环指令

Page 65: 第五章 8086/8088 指令系统

汇 编 格 式 操 作

逻辑指令

N O T d e s tA N D d e s t , s o u r c eO R d e s t , s o u r c eX O R d e s t , s o u r c eT E S T d e s t , s o u r c e

对 字 节 或 字 求 反对 字 节 或 字 按 位 与 运 算对 字 节 或 字 按 位 或 运 算对 字 节 或 字 按 位 异 或 运 算同 与 运 算 , 但 只 影 响 标 志 位 ,不 回 送 结 果

移位指令

S H R d e s t , c o u n tS A R d e s t , c o u n tS A L / S H L d e s t , c o u n t

逻 辑 右 移算 术 右 移算 术 / 逻 辑 右 移

循环移位

R O R d e s t , c o u n tR C R d e s t , c o u n tR O L d e s t , c o u n tR C L d e s t , c o u n t

循 环 右 移带 进 位 循 环 右 移循 环 左 移带 进 位 循 环 左 移

Page 66: 第五章 8086/8088 指令系统

一、逻辑运算指令

1、NOT 指令 这条指令对原操作数求反,然后再送回原操作数。指令格式为: NOT src ; src<—src ,这条指令对标志位无影响。

Page 67: 第五章 8086/8088 指令系统

2、 AND 指令

这条指令对两个操作数按位进行逻辑“与”运算。与运算通常用符号“ X” 或“ ^”或“ .”来表示,它

的运算规则为:0^0=0 0^1=0 1^0=0 1^1=1 AND 指令可以进行字节操作,也可以进行字操作。指

令的一般格式为:AND dst, src; dst<—dst^src 其中目的操作数可以用累加器,也可以是任意一通用寄

存器,也可以是各种寻址方式的存储器操作数。原操作数可以是立即数,寄存器和各种寻址方式的存储器操作数。例如:

Page 68: 第五章 8086/8088 指令系统

AND AX, BX AND AL, F0H AND SI, BP AND DATA—WORD, AX AND AX, AX某个操作数与本身进行“与”运算,操作数不变,但可

以是进位标志位 CF清“ 0”。AND 指令常用与屏蔽(清除)操作数的指定位。例如: AND AX, OFFH结果 AH被清“ 0”,而 AL值不变。

Page 69: 第五章 8086/8088 指令系统

3、 OR 指令这条指令对两个操作数控位进行逻辑“或”运算,结果送回

目的操作数。或运算通常用符号“+”或“^”表示,它的运算规则为:

0v0=0 0v1=1 1v0=1 1v1=1 OR 指令可以进行字节操作,也可以进行字操作。指令的一般格式为

OR dst ,src ; dst<—dst∨src其中的目的操作数河源操作数, 与AND 指令相同。某个操作数本身进行或运算,操作数不变,但可以是进位标

志位 CF清“ 0”。例如:OR AX , AX操作的结果是:操作数不变,但使 CF清“ 0”。

Page 70: 第五章 8086/8088 指令系统

4、 XOR 指令

XOR 指令用于异或操作,将源操作数与目的操作数做异或运算,然后送目的操作数。异或运算通常用符号⊕表示 ,它的运算规则为:

0 0=0 0 1=1⊕ ⊕1 0=1 1 1=0⊕ ⊕运算的结果相当于二个一位的二进制数做加法的结果

(进位丢掉),所以又把异或运算称为“按位加”。 XOR dst , src ; dst ←dst src⊕ 其中,目的操作数和原操作数与 AND 指令相同。

Page 71: 第五章 8086/8088 指令系统

XOR 指令可用对数据指定位进行求反。XOR AL, OFFH

则将 AL 中所有位求反。某操作数与其本身进行异或运算可使操作数和进位志位

CF 都清“ 0” 。例如:XOR AX, AX

NOT 、 AND 、 OR 、 XOR 指令都是按位操作的逻辑运算指令,运算结果影响标志寄存器部分标志位。

Page 72: 第五章 8086/8088 指令系统

5、 TEST 指令

TEST 指令是一条测试指令,它执行的操作与 AND相同,不过它不回送结果。

只影响标志位,该指令常与条件转移指令配合使用,以决定程序的转移方向。

Page 73: 第五章 8086/8088 指令系统

二、移位指令

8086/8088 有四条移为指令: 算术左移指令 SAL dst,cout 逻辑左移指令 SHL dst,count 算数右移指令 SAR dst,count 逻辑右移指令 SHR dst,count 其中 SAL与 SHL 指令功能完全相同。这些指令的功能如图 5.4.1 。 移位指令可将通用寄存器或存储单元的 8 位或 16 位的数左移或右移,其移位方向由指令决定,移动位数由指令中的计数值所决定,计数值可以是 1 或存放在 CL 中的无符号数。

Page 74: 第五章 8086/8088 指令系统
Page 75: 第五章 8086/8088 指令系统

这些移位指令如下所示。例如:MOV D, 1将 D 中的数逻辑右移 1 位, D 可以是寄存器或存储器单元。当要移多位时,则可用 CL 作移位计数器,例如:MOV CL, 2SHL BL, CL ;将 BL 中的低 4 位左移到高 4 位,低 4 位变为 0 。常利用移位指令,作快速的乘除法,例如:某数乘 4 或除 4 的运算。MOV CL, 2SHL AX , CL ;AX 中的无符号数乘 4SAL AX , CL ;AX 中带符号数乘 4SHR AX , CL ;无符号数除以 4SAR AX , CL ;带符号数除以 4

Page 76: 第五章 8086/8088 指令系统

使用移位指令作乘除法,要比用乘除指令快得多,比如实现 AX乘 10 :

MOV BX, AX ;保存 AX MOV CL, 2 ;移为两次(乘 4 ) ADD AX, BX ;加上原来的 AX SHL AX, 1 ; AX 移位一次(实现乘 1

0 )

Page 77: 第五章 8086/8088 指令系统

三、循环指令8086/8088有四条循环指令: 循环左移指令 ROL dst,count 循环右移指令 ROR dst,count 带进位位循环左移指令 RCL dst,count 带进位位循环右移指令 RCR dst,count 前两条指令未把标志位 CF 包括在循环的环中,而后两条指令把 CF包括在循环中,作为整循环的一部分。循环指令的功能如图 5.4.2 所示。 循环指令可以对字节操作,也可以对字操作。操作数可以是寄存器操作数,也可以是内存操作数。循环方向由指令决定。循环移动的位数由指令中的计数值决定,计数值可以是 1 或存放在 CL 中的无符号数。

Page 78: 第五章 8086/8088 指令系统
Page 79: 第五章 8086/8088 指令系统

第五节 控制转移指令8086/8088 有四类转移指令: (1) 转移指令,包括无条件转移和条件转移指令。 (2)重复控制指令 (3) 调用和返回指令 (4) 中断指令 8086/8088 使用 CS 段寄存器和 IP 指令指针寄存器的值来寻址,以取指令来执行 ,转移指令则可改变 CS与 IP 的值或仅改变 IP 的值,使得改变指令执行的顺序,转移指令如表 5.5.1 所示指令中的 Target 表示转移的目标。 这些指令都将引起程序执行方向的转移,不过转移又段内转移和段间转移之分,所谓段内转移是指段地址不变,只是 IP 改变,而段间转移则 CS和 IP 均发生改变。

Page 80: 第五章 8086/8088 指令系统

汇 编 格 式 操 作J M P t a r g e tJ G / J N L E t a r g e tJ G E / J N L t a r g e tJ L / J N G E t a r g e tJ L E / J N G t a r g e tJ O t a r g e tJ S t a r g e tJ N O t a r g e tJ N S t a r g e tJ A / J N B E t a r g e tJ A E / J N A E t a r g e tJ B / J N A E t a r g e tJ B E / J N A t a r g e tJ C t a r g e t

无 条 件 转 移 到 指 定 的 地 址大 于 或 不 小 于 等 于 转 移大 于 等 于 或 不 小 于 转 移小 于 或 不 大 于 等 于 转 移小 于 等 于 或 不 大 于 转 移溢 出 转 移结 果 为 负 转 移不 溢 出 转 移结 果 为 正 转 移高 于 或 不 低 于 等 于 转 移高 于 等 于 或 不 低 于 转 移低 于 或 不 高 于 等 于 转 移低 于 等 于 或 不 高 于 转 移进 位 转 移

Page 81: 第五章 8086/8088 指令系统

汇 编 格 式 操 作J E / J Z t a r g e tJ P / J P E t a r g e tJ N C t a r g e tJ N E / J N Z t a r g e tJ N P / J P O t a r g e tJ C X Z t a r g e tL O O P t a r g e t

L O O P E / L O O P Z t a r g e tL O O P N E / L O O P N Z t a r g e t

C A L L t a r g e tR E T o p t i o n a l - v a l u e

I N T t y p e

I N T OI R E T

等 于 或 为 零 转 移奇 偶 校 验 为 偶 转 移无 进 位 转 移不 等 于 或 非 零 转 移奇 偶 校 验 为 奇 转 移C X = 0 时 , 则 转 移循 环 执 行 指 定 地 址 开 始 的 指 令 , C X 进行 循 环 计 数 , 当 C X = 0 时 循 环 停 止如 果 C X ≠ 0 , Z F = 1 时 则 转 移如 果 C X ≠ 0 时 , Z F = 0 时 , 则 转 移调 用 一 个 过 程 或 子 程 序过 程 返 回中 断 , 是 程 序 转 移 到 类 型 码 所 指 中 断 程序溢 出 中 断中 断 返 回

Page 82: 第五章 8086/8088 指令系统

一、转移指令转移指令分无条件转移和条件转移指令1. 无条件转移指令无条件转移指令格式为: JMP TARGET

JMP 转移指令分直接转移和间接转移,直接转移又分短程(SHORT) ,近程 (NEAR) 和远程 (FAR) 三种形式,当程序中执行到 JMP 指令时,执行就无条件转移到 JMP 所指的目标 (TARGET)去,目标可以是一个标号指出的直接转移地址, 如 : JMP SUM

它指出无条件转向 SUM 地址 ( 是段内转移 ) 目标也可以是用NEAR或 FAR 进行说明,例如:

Page 83: 第五章 8086/8088 指令系统

JMP FAR LABEL

说明 LABEL 不在现行段内,则是段间转移。 如果目标与 JMP 指令的距离在 -128 到 +127 个字节之间,则可用 SHORT 来说明 ,表示为短程转移,这种格式,由于目标用位移表示 ( 一个字节 ) ,所以指令节省一个单元,若是目标用地址表示,则需两个字节,当目标前不用 NEAR 说明时,隐含着 NEAR 型的段内转移。例如: JMP SHORT NEXT ;短程转移 JMP LOOPL ;近程转移JMP 指令中的目标也可以是由存储器或寄存器指出的间接转移地址,例如: JMP TARGET [BX] ;转移地址由 BX及 TARGET 变 ;址计算得到 JMP CX ;以 CX 的内容位转移目的地 ;址

Page 84: 第五章 8086/8088 指令系统

2. 条件转移指令

8086/8088 有 18 条不同的条件转移指令。它是根据标志寄存器的标志位决定程序是否进行转移,条件转移指令的目的地址必须在现行的代码段内 (CS) 中,并且以下一条指令地址为基准,必须在 +127 到 -128 的位移范围内,因此条件转移之零转移的范围是有限的,而不像 JMP 指令。条件转移指令如表 5.5.1 所列。

从表种可看出条件转移指令有时根据两数比较结果来进行转移,有时指明测试某些标志未来决定转移,但有时两条指令时实质上是一致的。如:

JE/JZ SUM; JE 指令的含义若两数相等则转 SUM ,而 JZ 指令的含义是若标志位 ZF=1 则转 SUM。

Page 85: 第五章 8086/8088 指令系统

使用条件转移指令时,经常在该指令之前用一条比较指令或减法指令,以建立标志位,然后由条件转移指令进行判断是否转移。

条件转移指令由对带符号数比较或测试的指令,这常对溢出为 OF 或符号为 SF 及逆行测试,对无符号数则常测试CF ,对带符号数由大于等于小于三种情况,无符号数则有高于等于低于三种情况。

Page 86: 第五章 8086/8088 指令系统

二、重复控制指令

8086/8088 有 三 条控 制 重 复 控 制 指 令 :LOOP 、 LOOPZ(LOOPE)、 LOOPNZ(LOOPNE) ,还有一条通常用于循环控制 的 条 件 转 移 指 令JCXZ。

1、LOOP、LOOPZ、LOOPNZ指令2、JCXZ 指令

Page 87: 第五章 8086/8088 指令系统

1、 LOOP、 LOOPZ、 LOOPNZ 指令

这类指令用于控制程序的循环,其控制转向的目的地址是在以下条指令地址为中心的 +127 到 -128 的范围内,这类指令用CX 作计数器,每执行该指令, CX便减 1 ,直到减为 0 为止。例如用 LOOP 时,规定循环次数放在 CX 中,每 LOOP 指令一

次,则 CX减 1 ,若 CX 不等于 0 ,则转向目的地址执行,如此重复直到 CX减为 0 为止,例如要重复执行某一程序段 100 次,可用下面的程序:

MOV CX, 100 ; 100 次输送 CX

START : ... ... ;要执行 100 次的程序段 LOOP START ; CX≠0 ,转 START 执行 ... ... ; CX=0 ,往下执行

Page 88: 第五章 8086/8088 指令系统

在循环过程中,常根据循环内出现的情况来终止循环,若相等则循环,这可用 LOOP 指令,若不相等则循环,这可用 LOOPNE 指令,前者,是当 CX 不等于零, ZF=1 时则循环,后者是 CX 不等于零 ZF=0 时则循环。当两个中的一个条件满足一个不满足时,则终止循环。例如在指定的存储区中,找第一个非零字节 ,设存储区

开始单元的偏移地址在 BX 中,最后单元的偏移地址在 DI中,若找到非零字节,则其偏移地址在 BX 中,若没找到则BX与 DI相等,表示已找到最后单元。

Page 89: 第五章 8086/8088 指令系统

SUB DI,BX INC DI ;字节数 =(DI)-(BX)+1 MOV CX,DI ;字节数送 CX DEC BX NEXT : INC BX CMP BYTEPTR[BX],0 ;与 0 比较 LOOPE NEXT ;是 0 ,去比较下一个 JNZ NZ_FOUND ;找到否,即 ZF=0? ……... ;没找到NZ_FOUND : ;找到, [BX] 中为非零字节 ……....

Page 90: 第五章 8086/8088 指令系统

2、 JCXZ 指令

这条指令也是一条转移指令,它的转移条件是 CX=0 。这条指令在循环程序的开始处,为了能跳过循环 ( 只要是CX=0) 是有用的。

Page 91: 第五章 8086/8088 指令系统

三、调用和返回指令 CALL、 RET

CALL 指令用来调用一个过程或者程序。当调用的过程或子程序结束后,使用 RET 指令返回,由于过程或子程序由段间调用 ( 即远程 FAR) 和段内调用 ( 及近程 NEAR) 所以 CALL 也有 FAR和 NEAR之分,这由被调用的过程的定义所决定,因此 RET 也有段间和段内返回两种。

当段内调用时,首先将 IP 内容入栈。当返回时,从站内取出一个字并放回到 IP 中,若段间调用时,则先把 CS入栈,在把 IP 如战, RET返回时,在从栈中去回一个字放入 IP 中,然后从栈中取第二个字放入 CS 中,作为段间返回地址。

Page 92: 第五章 8086/8088 指令系统

象 JMP 指令一样 CALL 指令也有两种得到目标地址的办法:直接和间接。直接调用目标地址在 CALL 指令中,间接调用目标地址在由指令指定的寄存器或内存单元中。

Page 93: 第五章 8086/8088 指令系统

四、中断指令

8088 提供三条中断传送操作指令: 中断指令 INT n 溢出中断指令 INTO 中断返回指令 IRET 在 8086/8088 中,程序的执行控制可以采用软中断的方式。当程序中遇到中断指令时,中止现行程序,保护断点和现场后,转去执行。

Page 94: 第五章 8086/8088 指令系统

1、 INT n 指令这条指令启动在指令中的中断类型号 (n)规定的中断过程。 8088

采取向量中断,中断类型号 0~ 255 ,规定了 256 个中断向量。每个中断向量包括了四个字节的中断程序的入口地址。其中,有两个字节是中断程序的代码段值,另两个字节是中断程序入口地址偏移量。这 256个入口地址组成一个表叫中断向量表,存放在存储器绝对地址 00000H到 003FFH中。关于 8088中断系统的介绍请参阅第七章,当程序中遇到中断指令

INT 时,便中断程序的执行,而转向由 256 个中断向量提供的地址之一去执行。例如:

INT 1AH

此时程序将转向 IA型中断服务程序执行,此时中断向量地址为 4×1AH=68H,即从 68H和 69H单元中取出 IP的值,从 6AH和 6BH取出CS的值,然后转向该地址执行中断服务程序。

Page 95: 第五章 8086/8088 指令系统

2、 INTO 指令和 IRET 指令

INTO 指令可以写在一条算数指令的后面,若算数运算指令执行的结果溢出,及溢出标志 OF=1 ,则转向溢出中断处理;否则不进行任何操作,接着执行下一条指令。

IRET 指令的作用是:当执行完中段服务程序后,返回主程序。

Page 96: 第五章 8086/8088 指令系统

第六节 字符串指令

存储器中存放的一串字或字节,它们可以是二进制数,也可以是 BCD 码或 ASCII 代码等相关的一些信息。它们存放在连续区域中,若对它们的每个字或字节均作同样的操作,就称为串操作。我们把能够完成这些功能的指令,称为字符串操作指令或简称为字串指令这些指令如表 5.6.1 所列。

Page 97: 第五章 8086/8088 指令系统

汇 编 格 式 操 作

M O V S / M O V S B / M O VS W C M P S / C M P S B / CM P S WS C A S / S C A S B / S C AS WL O D S / L O D S B / L O DS WS T O S / S T O S B / S T OS WR E P

R E P E / R E P ZR E P N E / R E P N Z

内 存 区 之 间 字 节 串 或 字 串 传 送字 节 串 或 字 节 串 进 行 比 较

扫 描 字 节 串 , 以 查 找 指 定 字 节 串 或 字 串

把 内 存 中 的 字 节 或 字 装 入 A L 或 A X 中

把 字 节 和 字 存 入 内 存

字 符 串 操 作 前 缀 , 表 示 重 复 , 重 复 值 装C X重 复 操 作 到 C X = 0 或 Z F = 0 为 止重 复 操 作 到 C X = 0 或 Z F = 1 为

Page 98: 第五章 8086/8088 指令系统

此表中每一类指令的第一个均带有操作数,汇编时,汇编程序均将其转换为/后面中的一个(根据是字节还是字操作),因此多使用后面的两种形式.

在字串操作中假定源串在数据中,目的串在附加段中,用SI作指针对源寻址,用DI作指针骒目的串寻址,在每次字串操作后,若是字节操作,则SI和(或)DI的值会自动加1或减1,若是字操作,则SI和(或)DI自动加2或减2,是加还是减由标志寄存器的方向标志位决定,若:DF=0则作加,否则SI,DI作减操作.在串操作前可用STD指令来设置DF,用CLD指令来清DF.

Page 99: 第五章 8086/8088 指令系统

一、串操作指令

8086/8088有五种基本的串操作指令:串传送指令,串比较指令,串扫描指令,串装入指令和串存储指令。MOVS/MOVSB/MOVSW是串传送命令。它将把

当前数据串中用SI指出的源串的一个字节或一个字传送到用DI指针指向的附加段目的地址去,当DF=1,则SI、DI作减1或减2。CMPW/CMPSB/CMPSW是串比较命令。它是将

当前数据段由SI指针指出的字节或字当前附加段DI指出的字节或字进行比较,把比较结果送标志寄存器,而不影响两个操作数。所谓的操作数中减去源操作数,因此两者对标志位的影响将是不同的,因此若该指令后面用条件转移指令,则应和COM的不同

Page 100: 第五章 8086/8088 指令系统

该指令执行过后,也将使SI、DI加减1或2,这根据DF的值决定。SCAS/SCASB/SCASW是字串扫描指令。它是将AL

(字节串操作)或AX(字串操作)的值减去在附加段中由DI寻址的目标串的字节或字,结果将改变标志寄存器的标志位,但不改变操作数的原始值,并将使DI修改指针,修改情况如上所述,,由DF的值决定。LODS/LODSB/LOCSW是字串装入指令。它将由SI

寻址的源串字节或字装入到累加器AL或AX中去,且根据DF的值,修改SI的值,以指向下一个要装入的字节或字。STOS/STOSB/STOSW是字串存贮指令。它是将AF

(字符串操作)或A X(字串操作)中的字储存到由DI寻址的附加段中去,且根据DF的值来修改DI的值。

Page 101: 第五章 8086/8088 指令系统

二、字符串指令的重复

当一条串操作指令要重复执行时,可以指令前加前缀,这些前缀是:REP 重复,使用时将重复次数放在CX中,这样当

指令执行每重复一次,CX值便减1,直到减到目前为止为止,便停止重复。REPE/REPNE是相等时重复/不相等时重复,

即若只要ZF=1和CX不减到 0 ,串指令就重复执行,这两条前缀有两个等价的名字REPZ /REPNZ,效果同前。示例如下:

Page 102: 第五章 8086/8088 指令系统

将 1024 个字符串从 DATA-A 数据区般到 DATA--B 数据区 :

MOV SI,OFFSET DATA-A ;DATA-A偏移地址送 SI

MOV DI,OFFSET DATA-B ;DATA-B 的偏移地址送 DI

MOV CX,1024 ;传送次数送 CX

REP MOVS ;DATA-A, DATA-B 重复搬运

Page 103: 第五章 8086/8088 指令系统

将当前数据段中的 BLOCK1 数据块搬到同一段中 BLOCK2去 :

PUSH DS

POP ES ;使 ES=DS, 即数据段和附加段为同一个。 LEA SI,BLOCK1 ;源串地址送 SI

LEA DI,BLOCK2 ; 目的串地址送 DI

MOV CX,0050H ;重复次数 (80)送 CX

CLD ;使 DF=0,SI.DI 作加 2 操作 REP MOVSW ;重复执行 , 直到 CX=0 为止

Page 104: 第五章 8086/8088 指令系统

比较 DEST和 SOURCE 中的 500 个字节 , 找出第一个不匹配 (不相同 )的字节 ,如果找到 ,则将 SOURCE 中的这个数送到 AL 中 : CLD LEA DI,ES:DEST ;DEST偏移地址送 DI LEA SI,SOURCE ;SOURCE偏移地址送 SI MOV CX,500 ;重复次数送 CX REPE CMPB ;重复比较不相等或 CX=0 停止比较 JCXZ MATCH ;没找到转 MATCH DEC SI ;找到 SI ,减 1, 恢复到找到时地址 MOV AL,[SI] ;读到 AL 中MATCH:… … … … ;没找到,由此执行

Page 105: 第五章 8086/8088 指令系统

第七节 处理器控制指令

8086/8088 处理器控制指令用于修改标志寄存器,或与外部设备同步,以及用来控制处理器与协处理器之间的相互作用。这类指令如表 5.7.1 所列。

一、标志位操作指令二、外部同步指令

Page 106: 第五章 8086/8088 指令系统

一、标志位操作指令

8086/8088 有七条直接对单独的标志进行操作的指令。其中三条是针对进位标志 CF ,有两条是针对标志 DF 的,有两条是针对中断标志 IF 的。

标志位操作指令用于改变档志位的状态,如表 5.7.1中操作说明所示。

Page 107: 第五章 8086/8088 指令系统

汇 编 格 式 操 作标志位操作指令

S T CC L CC M CS T DC L DS T IC L I

置 进 位 标 志 , 使 C F = 1清 进 位 标 志 , 使 C F = 0进 位 标 志 求 反置 方 向 标 志 , 使 D F = 1清 除 方 向 标 志 , 使 D F = 0开 中 断 标 志 , 使 I F = 1清 中 断 标 志 , 使 I F = 0

外部同步指令

H L T

W A I TE S C

L O C K N O P

使 8 0 8 6 / 8 0 8 8 处 理 器 处 于 停 止 状 态 , 不 执行 指 令使 处 理 器 处 于 等 待 状 态使 协 处 理 器 可 从 8 0 8 6 / 8 0 8 8 指 令 流 中 取得 它 们 的 指 令锁 总 线 指 令 , 可 放 在 任 一 指 令 前 作 为 前 缀空 操 作 指 令 , 处 理 器 什 么 操 作 也 不 作

Page 108: 第五章 8086/8088 指令系统

二、外部同步指令

8088 有五条外部同步指令。 HLT 是暂停指令,将使 8088处于暂停状态,只有再重

新启动或有一个外部中断发生时,则退出暂停状态,常用 HLT指令来等待中断的产生。

NOP 是空操作指令,什么也不作,但执行却需 3 个时钟周期,常用于延迟。

WAIT 是等待指令,它也使 8088处于空操作状态,但每隔 5 个时钟周期要检查一下 8088的 TEST线,若该线为人 1 ,则使 8088处于等待,直到 TEST线为 0 止,这主要用于 8088 和协处理器及外部设备实现同步。

LOCK 指令是一个前缀,可放在任何一条指令的前面,

Page 109: 第五章 8086/8088 指令系统

这条指令执行时锁存了总线的控制权,其它的处理器则得不到总线控制权,这个过程一直持续到指令执行完毕为止,它在多机系统中使用。

ESC 指令是处理器交权指令。它可使协处理器从 8088的指令流中取出一部分指令,并在协处理器上执行。