第 4 章 指令系统

104
第 4 第 第第第第第第第第第第第第第第第第第第第第第第第第 第第第第 ,。 第第第 第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第第 第第第第第第 第第第第第第第第第第 ,。 第第第第 第第第第第第 第第第第第第第 ,。 4.1 第第

Upload: donat

Post on 14-Jan-2016

95 views

Category:

Documents


0 download

DESCRIPTION

第 4 章 指令系统. 4.1 概述. 指令系统 计算机所能执行的命令的集合。 包括操作码,操作数。 操作码 计算机完成何种操作。 操作数 参加操作的对象或其所在的地址。 机器指令 由二进制表示,计算机能识别的代码。 汇编指令 用助记符表示,能看懂的代码。. 一、指令系统概念和指令组成 1 、指令系统概念 计算机通过执行指令序列来解决问题 , 每种计算机都有一组指令集提供用户使用 , 这组指令集就称为计算机的指令系统。 2 、指令组成 计算机中指令由操作码字段和操作数字段两部分组成。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 4 章 指令系统

第 4 章 指令系统

指令系统计算机所能执行的命令的集合。包括操作码,操作数。

操作码计算机完成何种操作。

操作数参加操作的对象或其所在的地址。

机器指令由二进制表示,计算机能识别的代码。

汇编指令用助记符表示,能看懂的代码。

4.1 概述

Page 2: 第 4 章 指令系统

一、指令系统概念和指令组成

1 、指令系统概念 计算机通过执行指令序列来解决问题 , 每种计算机都有一组 指令集提供用户使用 , 这组指令集就称为计算机的指令系统。

2 、指令组成 计算机中指令由操作码字段和操作数字段两部分组成。

一条可以由 1 ~ 7 个字节组成。 操作码字段:指示计算机要执行的操作, 操作数字段:指出在指令执行操作过程中所需要的操作数;

可以是操作数本身; 可以是操作数地址或是地址的一部分; 可以是指向操作数地址的指针或其他有关 操作数的信息。

Page 3: 第 4 章 指令系统

3 、指令的一般格式 :

操作码字段:在机器里只需对某种操作指定确定的二进制代码。通常用指令的第一个字节表示,不够可以占第二个字节中的 3 位。

操作数字段 :操作数字段可以有一个 , 二个或三个地址指令。

例: INC CX ADD AX , BX

操作码 操作数 . . . . . . 操作数

Page 4: 第 4 章 指令系统

4 、操作数的存放

操作数的存放不外乎三种情况:

(1) 操作数包含在指令中 即指令的操作数字段包含操作数本身。这种操作数为立即数。

例: MOV AL , 08H

(2)操作数包含在CPU的一个内部寄存器中

例: INC CX

指令中的操作数字段是 C PU内部寄存器的一个编码。这种寻址方式称为寄存器寻址。

Page 5: 第 4 章 指令系统

(3)操作数在内存数据区

操作数在内存数据区,操作数字段包含着此操作数地址。

在80 x 8 6 中,任何内存地址是由两部分组成:

段的基地址:单元所在段的基地址(大部分情况是数据段寄存器DS中);

段内偏移量:此单元与段基地址的距离。

有效地址EA( Effective Address ) :

段内偏移量为适应各种数据结构的需要,可以有几个部分组成,所以也把它称为有效地址EA。

Page 6: 第 4 章 指令系统

(一)立即寻址( Immediate addressing )

操作数直接存放在指令中,紧跟在操作码之后,作为指令

的一部分,存放在代码段里,这种操作数称为立即数。

立即数可以是8位或 16 位的。 16 位的立即数是高位字节放在高

地 址 , 低位字节放在低地址。

使用场合:经常用于给寄存器赋初值。

注意:

只能用于源操作数字段,不能用于目的操作数字段。

4.2 80486 的寻址方式

Page 7: 第 4 章 指令系统

例: MOV AL,05H

指令执行后 : (AL)=05H

例: MOV AX,3064H指令执行后 : (AX)=3064H

立即寻址方式

. . .

操作码

64H

30H

代码段

64H

.. .

30H

ALAH

指令

. . .

操作码

05H

代码段

05H

.. .

AL

指令

Page 8: 第 4 章 指令系统

4.2.2 寄存器寻址方式 (Register addressing)

操作数在寄存器中,指令指定寄存器号。

对于16位操作数,寄存器可以是 :

AX,BX,CX,DX,SI,DI , SP,BP。

以及段寄存器。

对于8位操作数,寄存器可以是 :

AL,AH,BL,BH,CL,CH,DL,DH。

这种寻址方式因为操作数在寄存器中

不需要访问存储器的运算速度较高。

Page 9: 第 4 章 指令系统

1. 直接寻址( Direct addressing )

操作数地址的16位偏移量,直接包含在指令中,

存放在代码段中指令操作码之后,

但操作数一般存放在数据段中,

必须先求出操作数的物理地址,

然后再访问存储器才能取得操作数。

或( 10H )

物理地址 : PA = 16d×(DS)+EA

IBM PC 机允许数据存放在数据段以外的其它段中。此时应在指令中指定段跨越(可以是 CS , SS , ES )。

4.2.3 存储器操作数的寻址方式

Page 10: 第 4 章 指令系统

例: MOV AX , [3100H]

( DS ) =6000H , (63100H)=3050H

则 : ( AX ) =3050H

又如:用符号地址代替数值地址。

MOV AX , VALUE

或 MOV AX , [VALUE]

VALUE—— 有效操作数单元的

符号地址。

如: VALUE 在附加段中,

则应指定段跨越。

MOV AX , ES : VALUE

或 MOV AX , ES : [VALUE]

直接寻址方式

6000H .. .

操作码

00

31

.. .

50H

30H

.. .

6 0 0 0 0

3 1 0 0+

6 3 1 0 0

63100H

30H 50H

AH AL

代码段

数据段

DS

Page 11: 第 4 章 指令系统

2. 寄存器间接寻址方式( Register indirect addressing ) 操作数在存储器中 ,

操作数地址的 16 位偏移量包含在:

BP 、 BX 、 SI 、 DI 寄存器中。

(1) 若选择 SI 、 DI 、 BX 作为间接寻址

操作数一般在现行数据段区域中,用 (DS) 作为段地址。

即操作数物理地址为:

物理地址 PA=16 d × ( DS ) + ( BX )

物理地址 PA=16 d × ( DS ) + ( SI )

物理地址 PA=16 d × ( DS ) + ( DI )

Page 12: 第 4 章 指令系统

例: MOV BX , [DI]

( DS ) =6000H

( DI ) =2000H

PA=62000H

( 62000H ) =50A0H

(BX)=50A0H

寄存器间接寻址方式 MOV BX , [DI]

6000H 2000H

DS DI

6 0 0 0 0

2 0 0 0+

6 2 0 0 0

. . .

AOH

50H

.. .

62000H

50H A0H

BLBH 数据段

Page 13: 第 4 章 指令系统

(2) 若选择 BP 寄存器作为间接寻址

操作数在堆栈段区域中,用 SS 寄存器的内容作为段地址。

操作数物理地址 :

PA=16d × ( SS ) + ( BP )

例: MOV [BP], AX

执行前: (SS)=1000H ,

(BP)=3000H ,

(AX)=1234H

执行后: PA=13000H

(13000H)=1234H

1000H 3000H

SS BP

1 0 0 0 0

3 0 0 0+

1 3 0 0 0

. . .

34H

12H

.. .

13000H

12H 34H

ALAH 堆栈段

寄存器间接寻址方式 MOV [BP], AX

Page 14: 第 4 章 指令系统

(3) 用 SI 、 DI 、 BX 、 BP 作为间接寻址允许段跨越

指令中可以指定段跨越前缀来取得其他段中的数据。

例: MOV ES:[DI], AX

MOV DX, DS:[BP]

这种寻址方法可以用于表格处理。

(4) 可以使用 EBP , ESP 间接寻址或者 EAX ~ EDX , EDI这 8 个 32 位的寄存器做间接寻址寄存器,规定: ESP , EBP 访问堆栈段,其他为数据段。

3. 基址寻址

在这种方式中,存储单元的有效地址为规定的基址寄存器的内容与一个常量之和。在指令中,地址表达式写成:

段寄存器: [ 基址寄存器+位移量 ]

段寄存器:位移量 [ 基址寄存器 ]

Page 15: 第 4 章 指令系统

80486 规定可以作为基址寄存器的有:

( 1 ) BP , BX 。使用 BP 进行基址寄存器寻址,约定访问的是堆栈段;使用 BX 进行基址寻址,约定访问的是数据段。

( 2 ) EBP , ESP , EAX~EDX , ESI , EDI 这 8 个 32 位的寄存器作基址寄存器。若使用 EBP , ESP 进行基址寻址,约定访问的是堆栈段;若使用 EAX~EDX , ESI , EDI 进行基址寻址,约定访问的是数据段。

4. 变址寻址

变址寻址有两种方式:

( 1 )有比例因子的变址寻址。

形式为:段寄存器: [ 比例因子 × 变址寄存器+位移量 ]

规定 EBP 访问的是堆栈段,其他为数据段。

( 2 )没有比例因子的变址寻址(变址寄存器只能为 SI , DI )。

Page 16: 第 4 章 指令系统

5. 基址加变址寻址方式

( Based indexed addressing ) 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均有指令指定。

( 1 )有比例因子的基址加变址寻址。格式如下:

段寄存器: [ 基址寄存器+比例因子 × 变址寄存器+位移量 ]

或段寄存器:位移量 [ 基址寄存器+比例因子 × 变址寄存器 ]

或段寄存器:位移量 [ 基址寄存器 ][ 比例因子 × 变址寄存器 ]

注意:基址寄存器和变址寄存器都必须是规定的 32 位寄存器

Page 17: 第 4 章 指令系统

( 2 )没有比例因子的基址加变址寻址。格式如下:

段寄存器: [ 基址寄存器+变址寄存器+位移量 ]

或段寄存器:位移量 [ 基址寄存器+变址寄存器 ]

或段寄存器:位移量 [ 基址寄存器 ][ 变址寄存器 ]

注意:基址寄存器和变址寄存器都必须是规定的 16 位寄存器

(BP) +

(DI)

(SI)

EA=

(BX) +

(DI)

(SI)

EA=

Page 18: 第 4 章 指令系统

除有段跨越前缀之外,形成物理地址有二种方式:

PA=16d×(DS)+ (BX) +

(DI)

(SI)

PA=16d× (SS)+ (BP) +

(DI)

(SI)

Page 19: 第 4 章 指令系统

4.2.4 80486 寻址方式的段约定和段超越

间接寻址寄存器

基址寻址寄存器

变址寄存器 约定访问的逻辑段

BP BP  堆栈段

BX,SI,DI BX SI,DI 数据段

EBP,ESP EBP,ESP EBP 堆栈段

EAX,EBXECX,EDXESI,EDI

EAX,EBXECX,EDXESI,EDI

EAX,EBXECX,EDXESI,EDI

数据段

Page 20: 第 4 章 指令系统

4.3 80486 的标志寄存器(六)标志寄存器 程序有时需根据上次指令执行的结果, ��判断以决定执行的方向,为此 80486 微处理器设有一标志寄存器,如下图所示。它是 32 位寄存器,实际使用 15 位,共 14 个标志。

AC VM R NT I OPL O D I T S Z A P C

D31 D19 D18 D0

1 .状态标志 CF 第 0 位,进位标志。如果算术指令执行完后,最高位产生进位或借位, �则 CF = 1 ,否则 CF =0 。 CF还可保存移位或循环移位时移出的一位值,也可给出比较操作的结果,也可作为乘法结果的指示器。

Page 21: 第 4 章 指令系统

PF 第 2 位,校验标志。当操作结果含有偶数个 1 时, PF = 1 ,否则 PF = 0 ,这个标志多用于数据输中。 AF 第 4 位,辅助进位标志。当操作数第 3 位产生进位或借位时, AF = 1 , �否则 AF = 0 ,这个标志多用于压缩的十进制数操作。 ZF 第 6 位,零标志。当运算结果为零时, ZF = 1 ,结果非零,则 ZF = 0 SF 第7位,符号标志。对带符号的数操作时,若产生一个负的结果,则 SF = 1 ,否则为 0 ,当算术、逻辑、移位或循环移位操作时,都将影响此位。 OF 第 11 位,溢出标志。当带符号数算术运算时,商位溢出,则 OF = 1 , �否则为 0 ,它用来作错误指示标志。

Page 22: 第 4 章 指令系统

2 控制标志位 DF 第 10 位,方向标志。可用指令预置。当DF = 0 时,执行串操作指令后,变址寄存器自动递增,当DF = 1 时,则动递减。即该标志可控制地址朝增加的方向或减少的方向改变。3 系统标志 TF 第 8 位,陷阱标志。当置为 1 时,则 8088 处于单步执行指令方式,每执行一条指令,自产动产生陷阱。 IF 第 9位,中断允许标志。当用指令置为 1 时,则允许8088响应中为请求,若为 0 时,则禁止响应中断请求。 IOPL 第 12 , 13 位, I/O 特权级标志。表示 0级~ 3级4 个 I/O 特权级, 0级为最高级, 3 为最低级,该标志用于保护模式下的输入 /输出操作。

Page 23: 第 4 章 指令系统

NT 第 14 位,任务嵌套标志。该标志仅用于保护模式。在保护模式下,如果当前执行的 A任务是嵌套于 B任务之中的,则 NT标志置 1 。 R 第 16 位,恢复标志。当 CPU响应“断点异常中断”时,R标志置 1 。 VM 第 17位,虚拟标志。如果 CPU工作在保护模式而VM又被置成 1 ,则 CPU就转换成虚拟 86 操作模式。 AC 第 18 位,对准检查标志。若 AC 标志为 1 ,且 CR0寄存器的 AM位也为 1 ,则进行字、双字或 4 字的对准检查。

Page 24: 第 4 章 指令系统

4.4.1 传送类指令1. 通用传送指令

( 1 )数据传送指令MOV 指令是最基本的通用传送指令,它把一个字节

或一个字从源传送到目的。这条指令可实现下述操作:MOV nn,a ;(nn) ←aMOV a,nn ;a← ( nn )MOV seg,src ;seg←srcMOV dst,seg ;dst←segMOV r,src ;r←srcMOV dst,r ;dst←rMOV dst,im ;dst←im

4.4 80486的基本指令集

Page 25: 第 4 章 指令系统

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: 第 4 章 指令系统

( 2 )符号扩展传送指令格式: MOVSX 目标寄存器,源操作数( 3 )零扩展传送指令格式: MOVZX 目标寄存器,源操作数( 4 )有效地址传送指令格式: LEA 目标寄存器,源操作数( 5 )指针传送指令格式: LDS,LES,LFS,LGS,LSS 目标寄存器,源操作

数( 6 )标志寄存器传送指令格式: LAHF

SAHF

( 7 )交换指令格式: XCHG 目标操作数,源操作数

Page 27: 第 4 章 指令系统

( 8 )字节交换指令格式: BSWAP 32 位寄存器( 9 )查表指令格式: XLAT 表头变量名

Page 28: 第 4 章 指令系统

2 堆栈操作指令

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

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

Page 29: 第 4 章 指令系统

( 1 )入栈指令 PUSH oprd

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

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

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

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

Page 30: 第 4 章 指令系统

(2) 出栈指令 POP oprd

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

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

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

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

Page 31: 第 4 章 指令系统

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

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

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

Page 32: 第 4 章 指令系统

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

PUSH DSPOP ES又如在程序中要用到某一寄存器,它的值在程序中某一

段将被改变,而后面又要用到它,且需要它的原先值,可采用如下方法:

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

Page 33: 第 4 章 指令系统

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

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

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

AX , 0FEFFH 来清除 TF 。

Page 34: 第 4 章 指令系统

( 4 ) 32 位标志寄存器进栈 / 出栈指令格式:PUSHFD ;标志进栈POPFD ;将栈顶 4 个字节送到标志寄存器( 5 ) 16 位通用寄存器进栈 / 出栈指令格式:PUSHAPOPA( 6 ) 32 位通用寄存器进栈 / 出栈指令格式:PUSHAD POPAD

Page 35: 第 4 章 指令系统

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

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

4.4.2  算术运算指令1. 基本四则运算

Page 36: 第 4 章 指令系统

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

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

Page 37: 第 4 章 指令系统

(1)、加法指令

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

Page 38: 第 4 章 指令系统

(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 39: 第 4 章 指令系统

(3)减法指令

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

Page 40: 第 4 章 指令系统

(4) 带借位减法指令

SBB r , src ; r r src cSBB a , im ; a a im —c SBB dst , im ; dst dst—im—

c

SBB dst , r ; dst dst—r—c其中 c 为借位标志的现行值

Page 41: 第 4 章 指令系统

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 42: 第 4 章 指令系统

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

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

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

Page 43: 第 4 章 指令系统

2、比较指令CMP比较指令完成两个操作数加减,使结果反映到标志位上,

并不送回相减的差值。指令格式如下:CMP r,src ;r-srcCMP a,im ; a-imCMP dst,im ;dst-imCMP dst,r ;dst-rCMP指令是比较指令,用于目的操用数 与源操用数

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

Page 44: 第 4 章 指令系统

目 的 操 作 数 与 源 操 作 数 比 较 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 45: 第 4 章 指令系统

一般在使用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 46: 第 4 章 指令系统

3 、 INC 、 DNC 、 NEC 指令

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

成 2 的补 , 操作数仅有一个,可以是寄存器的破除储存单元的数。例如: NEC DATADATA 存储单元内设有数为 00000101 ,则执行该

指令后,其内容就变为 11111011 。

Page 47: 第 4 章 指令系统

当从一个立却数中减去寄存器或存储器中的数时,不能用 SUB指令,但可以减数变补,然后再和其相加得到减的果,如立即数为 100 ,则可用如下命令:NEG ALADD AL,1004 、交换加法指令格式: XADD 目标操作数,源操作数

Page 48: 第 4 章 指令系统

5 、乘法与除法指令 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 49: 第 4 章 指令系统

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是无符号除法指令,它可以进行字节或字除法, DI

V规定:对于 8 位除法,被除数在 AX 中,对于 16 位除法,被除数则在 DX与 AX中,而除数在指令中指出。除完的结果,对 8 位数除法,商与余数分别放在 AX与 DX中。

Page 50: 第 4 章 指令系统

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

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

Page 51: 第 4 章 指令系统

6 、 CBW 与 CWD 指令

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

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

AH AL

11111111←- 11111110=-2

Page 52: 第 4 章 指令系统

下面是一个四则运算的例子: 设 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 53: 第 4 章 指令系统

CWDE 和 CDQ 指令CWDE将 AX 中的符号位扩展到 DX 中。CDQ将 EAX 中的符号位扩展到 EDX 中。

Page 54: 第 4 章 指令系统

7 .十进调整指令( 1 ) DAA指令( 2 ) AAA指令( 3 ) DAS和 AAS 指令( 4 ) AAM与 AAD指令

例如 : (AL)=28,(BL)=68 ,均为 BCD码 ADD AL,BL

DAA执行 ADD指令后( AL)=90,CF=0,AF=1执行 DAA指令时,因为 AF=1 ,所以(AL)←(AL)+06得( AL)=96,CF=0,AF=1 。

Page 55: 第 4 章 指令系统

( 1 ) DAA 指令

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

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

Page 56: 第 4 章 指令系统

( 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 ,故A

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

Page 57: 第 4 章 指令系统

(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码)减去 B

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

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

Page 58: 第 4 章 指令系统

( 4 ) AAM 与 AAD 指令

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

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

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

Page 59: 第 4 章 指令系统

4.4.3 转移和调用指令转移指令分无条件转移和条件转移指令1.无条件转移指令无条件转移指令格式为: JMP TARGET JMP 转移指令分直接转移和间接转移,直接转移又分短程 (SHORT) ,近程 (NEAR) 和远程 (FAR) 三种形式,当程序中执行到 JMP 指令时,执行就无条件转移到 JMP 所指的目标 (TARGET)去,目标可以是一个标号指出的直接转移地址, 如 : JMP SUM它指出无条件转向 SUM 地址 ( 是段内转移 ) 目标也可以是用 NEAR 或 FAR 进行说明,例如:

Page 60: 第 4 章 指令系统

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 61: 第 4 章 指令系统

例如:设 (DS)=2000H,(BX)=1256H,(SI)=528FH, 位移量= 20A1H,(232F7H)=3280H,(264E5H)=2450H1 JMP BX IP=1256H2 JMP TABLE[BX] IP=3280H3 JMP [BX][SI] IP=2450H

Page 62: 第 4 章 指令系统

2. 条件转移指令8086/8088 有 18条不同的条件转移指令。它是根

据标志寄存器的标志位决定程序是否进行转移,条件转移指令的目的地址必须在现行的代码段内 (CS) 中,并且以下一条指令地址为基准,必须在 +127到 -128 的位移范围内,因此条件转移之零转移的范围是有限的,而不像 JMP 指令。条件转移指令如表 5.5.1 所列。从表种可看出条件转移指令有时根据两数比较结果来

进行转移,有时指明测试某些标志未来决定转移,但有时两条指令时实质上是一致的。如:

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

Page 63: 第 4 章 指令系统

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

对溢出为 OF 或符号为 SF及逆行测试,对无符号数则常测试 CF ,对带符号数由大于等于小于三种情况,无符号数则有高于等于低于三种情况。

Page 64: 第 4 章 指令系统

( 1 )按标志位的当前状态转移操作码助记符 指令功能 等价助记符JC 当前 C 标志为 1转移 JB/JNAEJNC 当前 C 标志为 0转移 JNB/JAEJZ 当前 Z 标志为 1转移 JEJNZ 当前 C 标志为 0转移 JNEJS 当前 S 标志为 1转移 JNS 当前 S 标志为 0转移JP 当前 P 标志为 1转移 JPEJNP 当前 P 标志为 0转移 JPOJO 当前 O 标志为 1转移JNO 当前 O 标志为 0转移

Page 65: 第 4 章 指令系统

( 2 )无符号数条件转移操作码助记符 指令功能 等价助记符JA 被减数大于减数转 JNBEJNA 被减数小于或等于减数转 JBEJNC 被减数大于或等于减数转 JNB/JAEJC 被减数小于减数转 JB/JNAE(3) 有符号数条件转移操作码助记符 指令功能 等价助记符JG 被减数(真值)大于减数(真值)转 JNLEJGE 被减数(真值)大于减数(真值)转 JNLJL 被减数(真值)小于减数(真值)转 JNGEJLE 被减数(真值)小于或等于减数(真值)转 JNG

Page 66: 第 4 章 指令系统

( 4 ) 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 67: 第 4 章 指令系统

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

例如在指定的存储区中,找第一个非零字节 ,设存储区开始单元的偏移地址在 BX 中,最后单元的偏移地址在 DI 中,若找到非零字节,则其偏移地址在 BX 中,若没找到则 BX 与 DI相等,表示已找到最后单元。

Page 68: 第 4 章 指令系统

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 69: 第 4 章 指令系统

3. 调用和返回指令 CALL 、 RET

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

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

Page 70: 第 4 章 指令系统

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

Page 71: 第 4 章 指令系统

4. 中断指令

8088提供三条中断传送操作指令: 中断指令 INT n

中断返回指令 IRET 在 8086/8088 中,程序的执行控制可以采用软中断的方式。当程序中遇到中断指令时,中止现行程序,保护断点和现场后,转去执行。

Page 72: 第 4 章 指令系统

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 73: 第 4 章 指令系统

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

Page 74: 第 4 章 指令系统

4.4.4  逻辑运算指令

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

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

Page 75: 第 4 章 指令系统

汇 编 格 式 操 作

逻辑指令

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 76: 第 4 章 指令系统

1. 逻辑运算指令

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

Page 77: 第 4 章 指令系统

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

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

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

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

Page 78: 第 4 章 指令系统

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 79: 第 4 章 指令系统

( 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 80: 第 4 章 指令系统

( 4 ) XOR 指令 XOR 指令用于异或操作,将源操作数与目的操作数

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

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

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

Page 81: 第 4 章 指令系统

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

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

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

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

Page 82: 第 4 章 指令系统

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

Page 83: 第 4 章 指令系统
Page 84: 第 4 章 指令系统

这些移位指令如下所示。例如: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 85: 第 4 章 指令系统

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

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

Page 86: 第 4 章 指令系统

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

Page 87: 第 4 章 指令系统
Page 88: 第 4 章 指令系统

3. 测试与位测试指令( 1 )测试指令

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

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

( 2 )位测试指令

位测试 BT 目标操作数,源操作数

位测试置 0 BTR 目标操作数,源操作数

位测试置 1 BTS 目标操作数,源操作数

位测试取反 BTC 目标操作数,源操作数格式: BT 目标操作数,源操作数功能: BT测试指定的位并将它拷贝至进位标志位 CF 。

Page 89: 第 4 章 指令系统

格式: BTS 目标操作数,源操作数功能: BTS测试指定的位并将它拷贝至进位标志位 CF ,再将该位置 1 。

格式: BTR 目标操作数,源操作数功能: BTR测试指定的位并将它拷贝至进位标志位 CF ,再将该位清 0 。

格式: BTC 目标操作数,源操作数功能: BTC测试指定的位并将它拷贝至进位标志位 CF ,再将该位取反。

Page 90: 第 4 章 指令系统

格式: BSF 目标操作数,源操作数功能:对源操作数所指定的字或双字从右向左进行扫描,找

出第一个“ 1”的位,把此位的下标放在目标操作数中。( 2 )向后位扫描指令格式: BSR 目标操作数,源操作数功能:对源操作数所指定的字或双字从左向右进行扫描,找

出第一个“ 1”的位,把此位的下标放在目标操作数中。

4. 位扫描指令( 1 )向前位扫描指令

Page 91: 第 4 章 指令系统

4.4.5  字符串指令

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

Page 92: 第 4 章 指令系统

汇 编 格 式 操 作

MOVS/MOVSB/MOV SWCMPS/CMPSB/CMPSW SCAS/SCASB/SCASW LODS/LODSB/LODSW STOS/STOSB/STOSW REP REPE/REPZ REPNE/REPNZ

内存区之间字节串或字串传送 字节串或字节串进行比较 扫描字节串,以查找指定字节串或字串 把内存中的字节或字装入AL或AX中 把字节和字存入内存 字符串操作前缀,表示重复,重复值装CX 重复操作到CX=0或ZF=0为止 重复操作到CX=0或ZF=1为

Page 93: 第 4 章 指令系统

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

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

Page 94: 第 4 章 指令系统

一、串操作指令8086/8088有五种基本的串操作指令:串传

送指令,串比较指令,串扫描指令,串装入指令和串存储指令。MOVS B/MOVS W/MOVS D 是串传送命令。

它将把当前数据串中用SI指出的源串的一个字节或一个字传送到用DI指针指向的附加段目的地址去,当DF=1,则SI、DI作减1或减2。该指令执行过后,也将使SI、DI加减1或2,这

根据DF的值决定。LODS B/LODS W/LOCS D 是字串装入指

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

Page 95: 第 4 章 指令系统

STOS B/STOS W/STOS D 是字串存贮指令。它是将A L (字符串操作)或A X (字串操作)中的字储存到由DI寻址的附加段中去,且根据DF的值来修改DI的值。

CMP SB/CMPS W/CMPS D 是串比较命令。它是将当前数据段由SI指针指出的字节或字减去当前附加段DI指出的字节或字进行比较,把比较结果送标志寄存器,而不影响两个操作数。

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

Page 96: 第 4 章 指令系统

二、字符串指令的重复

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

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

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

Page 97: 第 4 章 指令系统

将 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 98: 第 4 章 指令系统

将当前数据段中的 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 99: 第 4 章 指令系统

比较 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( 仅仅 CX=0转移 ) DEC SI ;找到SI,减 1,恢复到找到时地址 MOV AL,[SI] ;读到AL中MATCH:… … … … ;没找到,由此执行

Page 100: 第 4 章 指令系统

4.4.6  处理器控制指令

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

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

Page 101: 第 4 章 指令系统

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

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

Page 102: 第 4 章 指令系统

汇编格式 操 作

标 志 位 操 作 指 令

STC CLC CMC STD CLD STI CLI

置进位标志,使 CF=1 清进位标志,使 CF=0 进位标志求反 置方向标志,使 DF=1 清除方向标志,使 DF=0 开中断标志,使 IF=1 清中断标志,使 IF=0

外 部 同 步 指 令

HLT WAIT ESC LOCK NOP

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

Page 103: 第 4 章 指令系统

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

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

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

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

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

Page 104: 第 4 章 指令系统

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

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