第 一节 8086 指令系统 1

163

Click here to load reader

description

第 一节 8086 指令系统 1. Intel 8086 的寻址方式 重点: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 , 有效地址的计 算 掌握数据传送类指令的使用方法。. 指令的一般格式. 1 、指令格式. 指令:计算机提供给用户的硬件命令。 指令系统 ( 集 ) :指令的集合 。. 操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 - PowerPoint PPT Presentation

Transcript of 第 一节 8086 指令系统 1

Page 1: 第 一节   8086 指令系统 1

第 一节 第 一节 80868086 指令系统指令系统 11

Intel 8086Intel 8086 的寻址方式的寻址方式 重点: 立即寻址、直接寻址、寄存器重点: 立即寻址、直接寻址、寄存器

寻址、寄存器间接寻 址 、变址寻址、寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 基址加变址寻址 ,, 有效地址的计 算 有效地址的计 算

掌握数据传送类指令的使用方法。掌握数据传送类指令的使用方法。

Page 2: 第 一节   8086 指令系统 1

11 、指令格式、指令格式 指令:计算机提供给用户的硬件命令。指令:计算机提供给用户的硬件命令。 指令系统指令系统 (( 集集 )) :指令的集合:指令的集合。。

指令的一般格式指令的一般格式

Page 3: 第 一节   8086 指令系统 1

操作码:指计算机所要执行的操作,即指操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。出操作类型,是一种助记符。

操作数:指在指令执行操作的过程中所需操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其分,还可以是指向操作数地址的指针或其它有关操作数的信息。它有关操作数的信息。

寻址方式:就是指令中用于说明操作数所寻址方式:就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效在地址的方法,或者说是寻找操作数有效地址的方法。地址的方法。

Page 4: 第 一节   8086 指令系统 1

22 、操作数寻址方式、操作数寻址方式1. 立即数寻址

2. 寄存器寻址

3. 直接寻址

4. 寄存器间接寻址

5. 寄存器相对寻址

6. 基址变址寻址

7. 相对基址变址寻址

Page 5: 第 一节   8086 指令系统 1

(( 11 )立即数寻址方式)立即数寻址方式

Page 6: 第 一节   8086 指令系统 1

说明: 立即数可以是8位或 16 位的。如果是 16 位立即数,则高 8 位放在高地址 , 低 8 位放在低地址。 使用场合:由于立即数用来表示常数,所以立即数寻址方式经常用于给寄存器赋初值。 它只能用于源操作数字段 , 不能用于目的操作数字段。 由于立即数可以从指令中直接取得,因此 CPU不需要另外占用总线周期去取操作数,故立即数寻址方式显著的特点就是速度快。

Page 7: 第 一节   8086 指令系统 1

(( 22 )寄存器寻址方式)寄存器寻址方式 源和目的操作数都在寄存器中源和目的操作数都在寄存器中 例:例: MOV DSMOV DS ,, AXAX MOV CLMOV CL ,, ALAL 对于 16 位操作数,可以用字寄存器,比如:AX、BX、CX、DX、SI、DI、SP、BP以及段寄存器;

对于8位操作数,可以用字节寄存器,比如:AH、

BH、CH、DH、AL、BL、CL、DL;

这种寻址方式因为操作数在寄存器中,不需要访问存储器,所以运算速度较高。

Page 8: 第 一节   8086 指令系统 1

(3) 直接寻址在指令中直接给出有效地址,它可能是一个数值地址,也可能是符号地址(变量名)。操作数一般存放在数据段中,因此计算物理地址就应该把 DS 的值作为段基址即:物理地址= 16×(DS)+EAMOV  AL,[2000H]; [DS*10H+2000H] 送 AL ;

MOV  AX,[2000H]; [DS*10H+2000H] 送 AL,

DS*10H+2000H+1] 送 AH ;

MOV  AL,ES:[2000H]; 这里 ES 是段超越前缀,所以源操作数是在 ES*10H+2000H 的内存单元中。

MOV  [3000H],AL; 目的操作数采用直接寻址,将 AL送 [DS*10H+3000H] 的内存单元。

Page 9: 第 一节   8086 指令系统 1

(( 44 )寄存器间接寻址方式)寄存器间接寻址方式 操作数的偏移地址操作数的偏移地址 (( 有效地址有效地址 EA)EA) 放在寄存器中只有放在寄存器中只有SISI 、、 DIDI 、、 BXBX 和和 BPBP 可作间址寄存器 可作间址寄存器 例: 例: MOV AX, [BX] MOV CL, CS:[DI]MOV AX, [BX] MOV CL, CS:[DI] 若选择 BX 或 SI 或 DI 寄存器提供的间址,则操作数一般在数据段区域中,用 DS 提供段基址。若选择 BP 寄存器提供的间址,则操作数在堆栈段区域中,用 SS 提供段基址。 用 SI 、 DI 、 BX 、 BP 作为间接寻址时允许使用段跨越前缀,从而实现对其它段中数据的存取。 用途:这种寻址方法适用于数组、字符串、表格的处理。

Page 10: 第 一节   8086 指令系统 1
Page 11: 第 一节   8086 指令系统 1

(( 55 )寄存器相对寻址)寄存器相对寻址

Page 12: 第 一节   8086 指令系统 1
Page 13: 第 一节   8086 指令系统 1

(( 66 )基址)基址 ++ 变址寻址变址寻址

例:例: MOV AXMOV AX ,, [BX][SI][BX][SI](( DSDS )) =3200H=3200H ,(,( BXBX )) =0456H=0456H(( SISI )) =1094H=1094HEA=0456H+1094H=14EAHEA=0456H+1094H=14EAH物理地址物理地址 =32000H+14EAH=334EAH=32000H+14EAH=334EAH若选择 BP 寄存器提供基地址,则操作数在堆栈段区

域中,用 SS 提供段基址

Page 14: 第 一节   8086 指令系统 1
Page 15: 第 一节   8086 指令系统 1

(( 77 )相对基址)相对基址 ++ 变址寻址变址寻址

Page 16: 第 一节   8086 指令系统 1
Page 17: 第 一节   8086 指令系统 1

8086/8088 8086/8088 指令系指令系统统

80868086 // 80888088 的指令系统可以分为以下的指令系统可以分为以下六个功能组。六个功能组。

11 、数据传送、数据传送 (Data Transfer) (Data Transfer)

22 、算术运算、算术运算 (Arithmetic) (Arithmetic)

33 、逻辑运算、逻辑运算 (Logic) (Logic)

44 、串操作、串操作 (String menipulation) (String menipulation)

55 、程序控制、程序控制 (Program Control) (Program Control)

66 、处理器控制、处理器控制 (Processor Control)(Processor Control)

Page 18: 第 一节   8086 指令系统 1

一、数据传送指令一、数据传送指令主要主要 MOVMOV ,, XCHGXCHG 、堆栈和地址传送指令。、堆栈和地址传送指令。11 、数据传送、数据传送 MOVMOV 指令指令一般格式:一般格式: MOV OPRD1MOV OPRD1 ,, OPRD2OPRD2MOV MOV 是操作码,是操作码, OPRD1OPRD1 目的操作数、目的操作数、 OPRD2OPRD2 源源

操作数。操作数。功能:完成数据传送功能:完成数据传送具体来说,一条数据传送指令能实现:具体来说,一条数据传送指令能实现:⑴⑴CPUCPU 内部寄存器之间数据的任意传送内部寄存器之间数据的任意传送 (( 除了代码段除了代码段

寄存器寄存器 CSCS 和指令指针和指令指针 IPIP 以外以外 )) 。。 MOV ALMOV AL ,, BLBL ;字节传送;字节传送 MOV CXMOV CX ,, BXBX ;字传送;字传送 MOV DSMOV DS ,, BXBX

Page 19: 第 一节   8086 指令系统 1

⑵⑵ 立即数传送至立即数传送至 CPUCPU 内部的通用寄存器组内部的通用寄存器组 (( 即即 AXAX 、、 BXBX 、、 CXCX 、、 DXDX 、、 BPBP 、、 SPSP 、、 SISI 、、 DI )DI ) ,,

MOV CLMOV CL ,, 44MOV AXMOV AX ,, 03FFH03FFHMOV SIMOV SI ,, 057BH057BH⑶⑶CPUCPU 内部寄存器内部寄存器 (( 除了除了 CSCS 和和 IPIP 以外以外 )) 与存储器与存储器

(( 所有寻址方式所有寻址方式 )) 之间的数据传送。之间的数据传送。MOV ALMOV AL ,, BUFFERBUFFERMOV AXMOV AX ,, [SI][SI]MOV [DI]MOV [DI] ,, CXCXMOV SIMOV SI ,, BLOCK[BP]BLOCK[BP]MOV DSMOV DS ,, DATA[SI+BX]DATA[SI+BX]MOV DEST[BP+DI]MOV DEST[BP+DI] ,, ESES

Page 20: 第 一节   8086 指令系统 1

⑷ ⑷ 能实现用立即数给存储单元赋值能实现用立即数给存储单元赋值 例:例: MOV [2000H]MOV [2000H] ,, 25H25H 注意:注意: ①① 存储器传送指令中,不允许对存储器传送指令中,不允许对 CSCS 和和 IPIP 进行操作;进行操作; ②② 两个操作数中,除立即寻址之外必须有一个为寄两个操作数中,除立即寻址之外必须有一个为寄

存器寻址方式,即两个存储器操作数之间不允许直存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;如需要把存储单元接进行信息传送;如需要把存储单元 AREA1AREA1 的内容的内容送至同一段内送至同一段内 AREA2AREA2 中去,传送过程如下:中去,传送过程如下:

MOV ALMOV AL ,, AREA1AREA1 MOV AREA2MOV AREA2 ,, ALAL ③③ 两个段寄存器之间不能直接传送信息,也不允许两个段寄存器之间不能直接传送信息,也不允许

用立即寻址方式为段寄存器赋初值;用立即寻址方式为段寄存器赋初值; 如:如: MOVMOV    AXAX ,, 00 ;; MOVMOV    DSDS ,, AXAX ④④ 目的操作数,不能用立即寻址方式。目的操作数,不能用立即寻址方式。

Page 21: 第 一节   8086 指令系统 1

22 、堆栈指令、堆栈指令 入栈(入栈( PUSHPUSH )、出栈()、出栈( POPPOP ))仅能进行字传送。仅能进行字传送。 ⑴ ⑴ 入栈指令入栈指令 PUSHPUSH 一般格式:一般格式: PUSH OPRD PUSH OPRD 例如:例如: PUSH BXPUSH BX 执行过程为:执行过程为: SP=SP-1SP=SP-1 ,, [SP]=BH[SP]=BH ;; SP=SP-1SP=SP-1 ,, [SP]=BL [SP]=BL

Page 22: 第 一节   8086 指令系统 1

⑵ ⑵ 出栈指令出栈指令 POPPOP 一般格式:一般格式: POP OPRDPOP OPRD 功能:将数据弹出堆栈功能:将数据弹出堆栈 对指令执行的要求同入栈指令。对指令执行的要求同入栈指令。 例如:例如: POP AX POP AX POP [BX] POP [BX] POP DSPOP DS

Page 23: 第 一节   8086 指令系统 1

44 、累加器专用传送指令、累加器专用传送指令 ⑴ ⑴ IN IN 指令指令 一般格式:一般格式: IN ALIN AL ,, n n ; ; B AL←[n]B AL←[n] IN AXIN AX ,, n n ; ; W AX←[n+1][n]W AX←[n+1][n] IN ALIN AL ,, DX DX ; ; B AL←[DX]B AL←[DX] IN AXIN AX ,, DX DX ; ; W AX←[DX+1][DX]W AX←[DX+1][DX] 功能:从功能:从 I/OI/O 端口输入数据至端口输入数据至 ALAL 或或 AXAX 。。 若端口地址超过若端口地址超过 255255 时,须用时,须用 DXDX 作端口寻址,最多可寻作端口寻址,最多可寻

找找 64K64K 个端口。个端口。 ⑵ ⑵ OUT OUT 指令指令 一般格式:一般格式: OUT nOUT n ,, AL AL ; ; B AL→[n]B AL→[n] OUT nOUT n ,, AX AX ; ; W AX→[n+1][n]W AX→[n+1][n] OUT DXOUT DX ,, AL AL ; ; B AL→[DX]B AL→[DX] OUT DXOUT DX ,, AX AX ; ; W AX→[DX+1][DX]W AX→[DX+1][DX] 功能:将功能:将 ALAL 或或 AXAX 的内容输出至的内容输出至 I/OI/O 端口。端口。 该指令将该指令将 ALAL 或或 AXAX 中的内容传送到一个输出端口。中的内容传送到一个输出端口。

Page 24: 第 一节   8086 指令系统 1

⑶ ⑶ XLATXLAT 指令指令 一般格式:一般格式: XLAT XLAT ; ; ( AL)=( AL)= (( DSDS )) ×16×16 ++

(( (( BXBX )) ++ (( ALAL )))) 功能:完成一个字节的查表转换。功能:完成一个字节的查表转换。 寄存器寄存器 ALAL 的内容作为一个表的下标的内容作为一个表的下标 ;; 表的基地址表的基地址

放在放在 BXBX 中;转换后的结果存放在中;转换后的结果存放在 ALAL 中中 . .

例如:例如: MOV BXMOV BX ,, OFFSET TABLE OFFSET TABLE

ININ AL AL ,, 11 XLAT XLAT ;查表 ;查表 OUT 1OUT 1 ,, AL AL ;(;( ALAL )= )= AAH AAH

本指令可用在数制转换、函数表查表、代码转换本指令可用在数制转换、函数表查表、代码转换

等场合。等场合。

Page 25: 第 一节   8086 指令系统 1

55 、地址传送指令、地址传送指令 ⑴ ⑴ LEA (Load Effective Address)LEA (Load Effective Address) 一般格式: 一般格式: LEA OPRD1LEA OPRD1 ,, OPRD2OPRD2 功能:把源操作数功能:把源操作数 OPRD2OPRD2 的地址偏移的地址偏移

量传送至目的操作数量传送至目的操作数 OPRD1OPRD1 。。 要求:①源操作数必须是一个内存操作要求:①源操作数必须是一个内存操作

数②目的操作数必须是一个数②目的操作数必须是一个 1616 位的通用位的通用寄存器。寄存器。例:例: LEA BXLEA BX ,, BUFRBUFR ;把变;把变量量 BUFRBUFR 的地址偏移量送的地址偏移量送 BXBX

Page 26: 第 一节   8086 指令系统 1

⑵ ⑵ LDS (Load pointer into DS)LDS (Load pointer into DS) 一般格式: 一般格式: LDS OPRD1LDS OPRD1 ,, OPRD2OPRD2 功能:功能:完成地址指针的传送。完成地址指针的传送。 将段地址送将段地址送 DSDS ,偏移量部分,偏移量部分 送入一个送入一个 1616 位的指针寄存器位的指针寄存器 或变址寄存器或变址寄存器。。 要求:要求:源操作数是一个内存源操作数是一个内存 操作数,目的操作数是一个通操作数,目的操作数是一个通 用寄存器用寄存器 // 变址寄存器。变址寄存器。 例如:例如: LDS SILDS SI ,, [BX] [BX] ;把;把 BXBX 所指的所指的 3232

位地址指针的段地址送位地址指针的段地址送 DSDS ,偏移量送,偏移量送 SISI 。。

Page 27: 第 一节   8086 指令系统 1

⑶ ⑶ LES (Load pointer into ES) LES (Load pointer into ES)

一般格式: 一般格式: LES OPRD1LES OPRD1 ,, OPRD2OPRD2 这条指令除将地址指针的段地址部分这条指令除将地址指针的段地址部分

送入送入 ESES 外,与外,与 LDSLDS 类似类似 例: 例: LES DILES DI ,, [BX+COUNT][BX+COUNT]

Page 28: 第 一节   8086 指令系统 1

66 、标志寄存器传送、标志寄存器传送 ⑴ ⑴ LAHF LAHF (( LOAD AH WITH FLAGLOAD AH WITH FLAG )) 将标志寄存器中的将标志寄存器中的 SFSF 、、 ZFZF 、、 AFAF 、、 PFPF 和和 CFCF

(即低(即低 88 位)传送至位)传送至 AHAH 寄存器的指定位寄存器的指定位 ⑵ ⑵ SAHF SAHF (( STORESTORE AH WITH FLAG AH WITH FLAG )) 将寄存器将寄存器 AHAH 的指定位,送至标志寄存器的的指定位,送至标志寄存器的 SFSF 、、

ZFZF 、、 AFAF 、、 PFPF 和和 CFCF 位位 ⑶ ⑶ PUSHF PUSHF (( PUSH FLAGPUSH FLAG )) 将标志寄存器压入堆栈,不影响标志位。将标志寄存器压入堆栈,不影响标志位。 ⑷ ⑷ POPF POPF (( POP FLAGPOP FLAG )) 将栈顶的一个字,送标志寄存器,影响标志位。将栈顶的一个字,送标志寄存器,影响标志位。

Page 29: 第 一节   8086 指令系统 1

习题:习题: 设有关寄存器及存储单元的内容如下:设有关寄存器及存储单元的内容如下: (DS)=2000H(DS)=2000H ,, (BX)=0100H(BX)=0100H ,, (AX)=1200H(AX)=1200H ,,

(SI)=0002H(SI)=0002H ,, (20100H)=12H(20100H)=12H ,, (20101H)=34H(20101H)=34H ,,(20102H)=56H(20102H)=56H ,, (20103)=78H(20103)=78H ,, (21200)=2AH(21200)=2AH ,,(21201H)=4CH(21201H)=4CH ,, (21202H)=0B7H(21202H)=0B7H ,, (21203H)(21203H)=65H=65H 。。

说明下列各条指令的寻址方式,单独执行后相关说明下列各条指令的寻址方式,单独执行后相关寄存器或存储单元的内容寄存器或存储单元的内容

(( 11 )) MOV AXMOV AX ,, 1800H 1800H (( 22 )) MOV AXMOV AX ,, BX BX (( 33 )) MOV BXMOV BX ,, [1200H][1200H] (( 44 )) MOV DXMOV DX ,, 1100[BX] 1100[BX] (( 55 )) MOV [BX][SI]MOV [BX][SI] ,, ALAL (( 66 )) MOV AXMOV AX ,, 1100[BX][SI]1100[BX][SI]

Page 30: 第 一节   8086 指令系统 1

第二节 第二节 8086/8088 8086/8088 指令系统指令系统 22

重点:重点:了解指令的功能,掌握算术运算、了解指令的功能,掌握算术运算、逻辑运算和移位指令的功能和应用逻辑运算和移位指令的功能和应用

二、算术运算指令二、算术运算指令

Page 31: 第 一节   8086 指令系统 1

11 、加法指令 、加法指令 (Addition)(Addition) ⑴⑴ADD OPRD1ADD OPRD1 ,, OPRD2 OPRD2 功能:功能: OPRD1←OPRD1+OPRD2OPRD1←OPRD1+OPRD2 例如:例如: ADD ALADD AL ,, 3030 ;累加器与立即数相加;累加器与立即数相加 ADD BXADD BX ,, [3000H][3000H] ;通用寄存器与存储单元内容;通用寄存器与存储单元内容

相加相加 ADD DIADD DI ,, CXCX ;通用寄存器之间;通用寄存器之间 ADD DXADD DX ,, DATA[BX+SI]DATA[BX+SI] ;通用寄存器与存储单元;通用寄存器与存储单元

内容相加内容相加 ADD BETA[SI]ADD BETA[SI] ,, DXDX ;存储器操作数与寄存器相加;存储器操作数与寄存器相加 这些指令对标志位这些指令对标志位 CFCF 、、 OFOF 、、 PFPF 、、 SFSF 、、 ZFZF 和和 AA

FF 有影响。有影响。

Page 32: 第 一节   8086 指令系统 1

⑵⑵ADC OPRD1ADC OPRD1 ,, OPRD2OPRD2 ;带进位的加法;带进位的加法 功能:功能: OPRD1←OPRD1+OPRD2 +CFOPRD1←OPRD1+OPRD2 +CF ADCADC 指令主要用于多字节运算中。若有两个四字指令主要用于多字节运算中。若有两个四字

节的数,分别放在自节的数,分别放在自 FIRSTFIRST 和和 SECONDSECOND 开始的开始的存储区中,每个数占四个存储单元,低字节在低存储区中,每个数占四个存储单元,低字节在低地址,以下程序段可完成相加。地址,以下程序段可完成相加。

MOV AXMOV AX ,, FIRSTFIRST ADD AXADD AX ,, SECONDSECOND ;进行字运算;进行字运算 MOV THIRDMOV THIRD ,, AXAX MOV AXMOV AX ,, FIRST+2FIRST+2 ADC AXADC AX ,, SECOND+2SECOND+2 MOV THIRD+2MOV THIRD+2 ,, AXAX 这条指令对标志位的影响与这条指令对标志位的影响与 ADDADD 相同。相同。

Page 33: 第 一节   8086 指令系统 1

⑶⑶ 一般形式:一般形式: INC OPRD INC OPRD ;; 功能:功能: OPRD←OPRD+1OPRD←OPRD+1 完成对指定的操作数完成对指定的操作数 OPRDOPRD 加加 11 ,然后返,然后返

回此操作数。此指令主要用于在循环程序回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。中修改地址指针和循环次数等。

这条指令执行的结果影响标志位这条指令执行的结果影响标志位 AFAF 、、 OFOF 、、PFPF 、、 SFSF 和和 ZFZF ,而对进位标志没有影响。,而对进位标志没有影响。

如:如: INC AL INC AL INC [BX]INC [BX]

Page 34: 第 一节   8086 指令系统 1

22 、减法指令、减法指令 ⑴⑴SUB OPRD1SUB OPRD1 ,, OPRD2 OPRD2 ;; 功能:功能: OPRD1←OPRD1-OPRD2OPRD1←OPRD1-OPRD2 例: 例: SUB SUB CXCX ,, BXBX SUB SUB [BP][BP] ,, CLCL ⑵⑵SBB OPRD1SBB OPRD1 ,, OPRD2 OPRD2 ;; 功能:功能: OPRD1←OPRD1-OPRD2-CF OPRD1←OPRD1-OPRD2-CF 本指令对标志位本指令对标志位 AFAF 、、 CFCF 、、 OFOF 、、 PFPF 、、 SFSF 和和 ZFZF 都有影都有影

响。响。 ⑶⑶ 一般形式:一般形式: DEC OPRD DEC OPRD ;; 功能:功能: OPRD←OPRD-1OPRD←OPRD-1 指令执行的结果,影响标志指令执行的结果,影响标志 AFAF 、、 OFOF 、、 PFPF 、、 SFSF 和和 ZFZF ..

但对但对 CFCF 标志不影响标志不影响 例如: 例如: DEC [SI]DEC [SI]     DEC CLDEC CL

Page 35: 第 一节   8086 指令系统 1

⑷⑷NEG OPRD NEG OPRD 功能:  取补功能:  取补 例如: 例如: NEG NEG ALAL (( ALAL == 00110011    11001100 )则取补后为)则取补后为 11001100    01000100 即即 00000000    00000000 -- 00110011    11001100 == 11001100    01000100 若在字节操作时对若在字节操作时对 -128-128 ,或在字操作时对,或在字操作时对 -32768-32768 取补,则取补,则

操作数没变化,但标志操作数没变化,但标志 OFOF 置位。置位。 此指令影响标志此指令影响标志 AFAF 、、 CFCF 、、 OFOF 、、 PFPF 、、 SFSF 和和 ZFZF ⑸⑸CMP OPRD1CMP OPRD1 ,, OPRD2 OPRD2 ;; 功能: 功能: OPRD1-OPRD2 OPRD1-OPRD2 结果反映在标志位上,但并不结果反映在标志位上,但并不

送回结果送回结果 例: 例: CMP ALCMP AL ,, 100100 CMP DXCMP DX ,, DIDI CMP CXCMP CX ,, COUHT[BP]COUHT[BP] CMP COUNT[SI]CMP COUNT[SI] ,, AXAX 比较两个数之间的关系。比较后,根据比较两个数之间的关系。比较后,根据 ZFZF 标志可判断两者是标志可判断两者是

否相等。否相等。

Page 36: 第 一节   8086 指令系统 1

相等的比较:相等的比较: ①① 若两者相等,相减以后结果为零,若两者相等,相减以后结果为零, ZFZF

标志为标志为 11 ,否则为,否则为 00 。。 ②② 若两者不相等,则可在比较指令之后利若两者不相等,则可在比较指令之后利

用其它标志位的状态来确定两者的大小。用其它标志位的状态来确定两者的大小。大小的比较:大小的比较: 如果是两个如果是两个无符号数无符号数(如(如 CMPCMP    AXAX ,, BB

XX )进行比较,则可以根据)进行比较,则可以根据 CFCF 标志的状态标志的状态判断两数大小。若结果没有产生借位判断两数大小。若结果没有产生借位 (CF=(CF=0)0) ,显然,显然 AX≥BXAX≥BX ;若产生了借位(即;若产生了借位(即 CFCF== 11 ),则),则 AXAX << BXBX 。。

Page 37: 第 一节   8086 指令系统 1

33 、乘法指令、乘法指令 (1) (1) 无符号乘法指令无符号乘法指令 MULMUL 一般格式: 一般格式: MUL OPRD MUL OPRD 默认的操作数放在默认的操作数放在 ALAL 或或 AXAX 中,中, 88 位数相乘,结位数相乘,结

果为果为 1616 位数,放在位数,放在 AXAX 中;中; 1616 位数相乘结果为位数相乘结果为3232 位数,高位数,高 1616 位放在位放在 DXDX ,低,低 1616 位放在位放在 AXAX 中。中。注意:源操作数不能为立即数注意:源操作数不能为立即数。。

例:例: MOV ALMOV AL ,, FIRSTFIRST ;; MUL SECOND MUL SECOND ;结果为;结果为 AX=FIRST*SECONAX=FIRST*SECON

DD MOV AXMOV AX ,, THIRDTHIRD ;; MUL AX MUL AX ;结果;结果 DXDX :: AX=THIRD*THIRDAX=THIRD*THIRD

Page 38: 第 一节   8086 指令系统 1

(2) (2) 带符号数乘法指令带符号数乘法指令 IMULIMUL 一般格式:一般格式: IMUL OPRD IMUL OPRD 结果放在结果放在 AXAX 或或 DXDX ,, AXAX 中。当结果的高半部分不是低半部中。当结果的高半部分不是低半部

分的符号扩展时,标志位分的符号扩展时,标志位 CFCF 和和 OFOF 将置位。将置位。 例:(例:( ALAL )) =0FEH=0FEH ,(,( CLCL )) =11H=11H ,求相乘结果,求相乘结果 无符号数相乘时,无符号数相乘时, MUL CLMUL CL 具体运算:具体运算: 1111 11101111 1110 * 0001 0001 * 0001 0001 =0001 0000 1101 1110 =0001 0000 1101 1110 (( AXAX )) =10DEH =10DEH 即(即( AHAH )) =10H=10H 不为零,不为零, CF=1CF=1 ,, OF=1OF=1 。。 有符号运算时 有符号运算时 IMUL CLIMUL CL 执行执行 02H02H乘乘 11H11H ,有:,有: (( 0000 00100000 0010 )) ** (( 0001 00010001 0001 )) =0000 0000 0010 0010=0000 0000 0010 0010 取补为:取补为: 1111 1111 1101 11101111 1111 1101 1110 ,即(,即( AXAX )) =FFDEH=FFDEH 。。 (( AHAH )) =FFH=FFH 是(是( ALAL )) =DEH=DEH 的符号扩展,故的符号扩展,故 CF=0CF=0 ,, OO

F=0F=0 。。

Page 39: 第 一节   8086 指令系统 1

44 、除法指令、除法指令 (1) (1) 无符号数除法指令 无符号数除法指令 DIVDIV 一般格式:一般格式: DIV OPRDDIV OPRD (2) (2) 带符号数除法带符号数除法 IDIVIDIV 一般格式:一般格式: IDIV OPRDIDIV OPRD IDIVIDIV 指令认为操作数的最高位为符号位,商的最指令认为操作数的最高位为符号位,商的最高位也为符号位。高位也为符号位。

字节运算时被除数在字节运算时被除数在 AXAX 中;商在中;商在 ALAL 中,余数在中,余数在AHAH 中。字运算时被除数为中。字运算时被除数为 DXDX :: AXAX构成的构成的 3232位数,商在位数,商在 AXAX 中,余数在中,余数在 DXDX 中。中。

例:例: AX=2000HAX=2000H ,, DX=200HDX=200H ,, BX=1000HBX=1000H DIV BXDIV BX 执行后,执行后, AX=2002H AX=2002H ,, DX=0000DX=0000 。。

Page 40: 第 一节   8086 指令系统 1

(3) (3) 字节扩展指令字节扩展指令 CBWCBW 一般格式:一般格式: CBWCBW 将将 ALAL 寄存器的最高位扩展到寄存器的最高位扩展到 AHAH ,即若,即若 DD

7=07=0 ,则,则 AH=0AH=0 ;否则;否则 AH=0FFHAH=0FFH 。。 (4) (4) 字扩展指令字扩展指令 CWDCWD 一般格式:一般格式: CWDCWD 该指令执行时将该指令执行时将 AXAX 寄存器的最高位扩展到寄存器的最高位扩展到

DXDX ,即若,即若 D15=0D15=0 ,则,则 DX=0DX=0 ;否则;否则 DX=0DX=0FFFFHFFFFH 。。

CBWCBW 、、 CWDCWD 指令不影响标志位。指令不影响标志位。

Page 41: 第 一节   8086 指令系统 1

55 、十进制调整指令、十进制调整指令 常用常用 BCDBCD 码表示十进制数,压缩码表示十进制数,压缩 BCDBCD 码:每个码:每个

字节表示两位字节表示两位 BCDBCD 数;非压缩数;非压缩 BCDBCD 码:一个字码:一个字节表示一位节表示一位 BCDBCD 数,高四位为数,高四位为 00 。。

例:例: 25D25D ,压缩,压缩 BCDBCD 数为:数为: 25H25H ;非压缩;非压缩 BCDBCD数为:数为: 0205H0205H ,用两字节表示。,用两字节表示。

DAADAA 压缩的压缩的 BCDBCD 码加法调整码加法调整 DASDAS 压缩的压缩的 BCDBCD 码减法调整码减法调整 AAAAAA非压缩的非压缩的 BCDBCD 码加法调整码加法调整 AASAAS非压缩的非压缩的 BCDBCD 码减法调整码减法调整 AAMAAM乘法后的乘法后的 BCDBCD 码调整码调整 AADAAD 除法前的除法前的 BCDBCD 码调整码调整

Page 42: 第 一节   8086 指令系统 1

例如:例如: ADD ALADD AL ,, BLBL DAADAA 执行前:执行前: AL=28HAL=28H ,, BL=68HBL=68H 执行执行 ADDADD 后:后: AL=90HAL=90H ,, AF=1AF=1 执行执行 DAADAA 指令后,指令后, AL=96HAL=96H ,, CF=0CF=0 ,, AF=1AF=1 。。 MUL BLMUL BL AAMAAM 执行前:执行前: AL=07AL=07 ,, BL=09BL=09 执行执行 MUL BL MUL BL 后,后, AX=003FHAX=003FH 执行执行 AAMAAM 指令后,指令后, AH=06HAH=06H ,, AL=03HAL=03H 。。 注意:注意: BCDBCD 码进行乘除法运算时,一律使用无符码进行乘除法运算时,一律使用无符号数形式,因而号数形式,因而 AAM AAM 和和 AADAAD 应固定地出现在应固定地出现在 MMULUL 之前和之前和 DIVDIV 之后。之后。

Page 43: 第 一节   8086 指令系统 1

三、 逻辑运算和移位指令三、 逻辑运算和移位指令 11 、逻辑运算指令、逻辑运算指令 (1) (1) 一般格式:一般格式: NOT OPRDNOT OPRD 功能:对操作数求反,然后送回原处,操功能:对操作数求反,然后送回原处,操

作数可以是寄存器或存储器内容。此指令作数可以是寄存器或存储器内容。此指令对标志无影响。例如:对标志无影响。例如: NOT ALNOT AL

(2) (2) 一般格式:一般格式: AND OPRD1AND OPRD1 ,, OPRD2OPRD2 功能:对两个操作数进行按位的逻辑功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。“与”运算,结果送回目的操作数。

Page 44: 第 一节   8086 指令系统 1

(3) TEST OPRD1(3) TEST OPRD1 ,, OPRD2 OPRD2 功能:与功能:与 ANDAND 指令的操作相同,结果反映指令的操作相同,结果反映

在标志位上,但不送回结果。通常用它进在标志位上,但不送回结果。通常用它进行测试行测试

例: 要检测 例: 要检测 ALAL 中的最低位是否为中的最低位是否为 11 ,为,为11 则转移。可用以下指令:则转移。可用以下指令:

TEST TEST ALAL ,, 01H01H JNZ THEREJNZ THERE ………… THERETHERE ::

Page 45: 第 一节   8086 指令系统 1

(4) (4) 一般格式:一般格式: OR OPRD1OR OPRD1 ,, OPRD2OPRD2 功能:对指定的两个操作数进行逻辑功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。“或”运算。结果送回目的操作数。

AND ALAND AL ,, 0FH0FH AND AHAND AH ,, F0HF0H OR ALOR AL ,, AH AH ; 完成拼字的动作; 完成拼字的动作 OR AXOR AX ,, 0FFFH 0FFFH ;将;将 AXAX 低低 1212 位置位置 11

Page 46: 第 一节   8086 指令系统 1

(5) XOR OPRD1(5) XOR OPRD1 ,, OPRD2OPRD2 功能:对两个指定的操作数进行“异或”运功能:对两个指定的操作数进行“异或”运

算,结果送回目的操作数。算,结果送回目的操作数。 例:例: XOR ALXOR AL ,, AL AL ;使;使 ALAL清清 00 XOR SIXOR SI ,, SI SI ;使;使 SISI 清清 00 XOR CLXOR CL ,, 0FH 0FH ;使低;使低 44 位取反,高位取反,高 44 位位

不变不变 NOTNOT 的操作数不能为立即数,双操作数逻辑的操作数不能为立即数,双操作数逻辑

指令中,必须有一个操作数为寄存器寻址方指令中,必须有一个操作数为寄存器寻址方式,它们对标志位的影响情况如下:式,它们对标志位的影响情况如下: NOTNOT不影响标志位,其它四种指令使不影响标志位,其它四种指令使 CF=OF=0CF=OF=0 ,,AFAF 无定义,而无定义,而 SFSF 、、 ZFZF 和和 PFPF 则根据运算则根据运算结果而定。结果而定。

Page 47: 第 一节   8086 指令系统 1

22 、移位指令、移位指令 (( 11 )算术)算术 // 逻辑移位指令逻辑移位指令 算术左移或逻辑左移指令 算术左移或逻辑左移指令 SALSAL // SHL OPRDSHL OPRD ,, M M 算术右移指令 算术右移指令 SAR OPRDSAR OPRD ,, M M 逻辑右移指令 逻辑右移指令 SHR OPRDSHR OPRD ,, M M MM 是移位次数,可以是是移位次数,可以是 11 或寄存器或寄存器 CLCL 这些指令可以对寄存器操作数或内存操作数这些指令可以对寄存器操作数或内存操作数

进行指定的移位进行指定的移位

Page 48: 第 一节   8086 指令系统 1

(( 22 )循环移位指令)循环移位指令 ROL OPRDROL OPRD ,, M M ;左循环移位 ;左循环移位 ROR OPRDROR OPRD ,, M M ;右循环移位 ;右循环移位 RCL OPRDRCL OPRD ,, M M ;带进位左循环移位;带进位左循环移位 RCR OPRDRCR OPRD ,, M M ;带进位右循环移位;带进位右循环移位

Page 49: 第 一节   8086 指令系统 1

左移一位,只要左移以后的数未超出一个字节或左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘一倍,相当于原数乘 22 。右移—位相当于除以。右移—位相当于除以 22 。。

经常进行乘经常进行乘 1010 操作。而操作。而 XX**10=X10=X**2+X2+X**88 ,可采,可采用移位和相加的办法来实现乘用移位和相加的办法来实现乘 1010 。为保证结果完。为保证结果完整,先将整,先将 ALAL 中的字节扩展为字。中的字节扩展为字。

MOV AHMOV AH ,, 0 0 SAL AXSAL AX ,, 1 1 ;; XX**2 2 MOV BXMOV BX ,, AX AX ;送;送 BXBX暂存 暂存 SAL AXSAL AX ,, 1 1 ;; XX**4 4 SAL AXSAL AX ,, 1 1 ;; XX**8 8 ADD AXADD AX ,, BX BX ;; XX**10 10

Page 50: 第 一节   8086 指令系统 1

例例 11 BCD BCD 码转换为码转换为 ASCIIASCII 码码内存中放有若干个用组合内存中放有若干个用组合 BCDBCD 码表示的码表示的十进制数。把它们转换为十进制数。把它们转换为 ASCIIASCII 码。高码。高位的位的 BCDBCD 码转换后放在高地址单元。码转换后放在高地址单元。

分析:转换公式:分析:转换公式: ASCIIASCII == BCD+30HBCD+30H 算法:源串和目的串的表首分别设两个指针。算法:源串和目的串的表首分别设两个指针。

取取 BCDBCD 转转 ASCIIASCII 后存入(先低位,后高位)后存入(先低位,后高位) MOV SIMOV SI ,, OFFSET BCDBUFFOFFSET BCDBUFF ;源地址指针;源地址指针 MOV CXMOV CX ,, COUNT COUNT ;设计数初值;设计数初值 MOV DIMOV DI ,, OFFSET ASCBUF OFFSET ASCBUF ;目的指针;目的指针

Page 51: 第 一节   8086 指令系统 1

AGAINAGAIN :: MOV ALMOV AL ,, [SI][SI] MOVMOV BLBL ,, ALAL ANDAND ALAL ,, 0FH 0FH ;取低位;取低位 BCDBCD 码码 OROR ALAL ,, 30H 30H ;转换成;转换成 ASCIIASCII 码码 MOVMOV [DI][DI] ,, AL AL ;存入;存入 INCINC DI DI ;修改指针;修改指针 MOVMOV ALAL ,, BLBL PUSH CXPUSH CX MOVMOV CLCL ,, 44 SHRSHR ALAL ,, CLCL OROR ALAL ,, 30H 30H ;高位转换成;高位转换成 ASCIIASCII 码码 MOVMOV [DI][DI] ,, AL AL ;存入;存入 POPPOP CXCX INCINC DI DI INCINC SI SI ;修改指针;修改指针 LOOPLOOP AGAIN AGAIN ;重复工作;重复工作

Page 52: 第 一节   8086 指令系统 1

习题:习题: 11 、写出实现下列计算的指令序列(、写出实现下列计算的指令序列( XX 、、 YY 、、 ZZ 、、 WW 、、 RR 都都

为字变量)为字变量) (( 11 )) Z=W+Z=W+ (( Y+XY+X ) () ( 22 )) Z=W-Z=W- (( X+6X+6 )) -- (( R+9R+9 )) 22 、若在数据段中从字节变量、若在数据段中从字节变量 TABLETABLE 相应的单元开始存放了相应的单元开始存放了

0~150~15 的平方值,试写出包含有的平方值,试写出包含有 XLATXLAT 指令的指令序列查找指令的指令序列查找 NN(( 0~150~15 )中的某个数的平方。)中的某个数的平方。 (( 设设 NN 的值存放在的值存放在 CLCL 中中 ))

33 、写出实现下列计算的指令序列(、写出实现下列计算的指令序列( XX 、、 YY 、、 ZZ 、、 WW 、、 RR 都都为字变量)为字变量)

(( 11 )) Z=Z= (( W*XW*X )) // (( R+6R+6 ) () ( 22 )) Z=Z= (((( W-XW-X )) /5*/5*YY )) *2*2

44 、假定、假定 DX=1100100110111001BDX=1100100110111001B ,, CL=3CL=3 ,, CF=1CF=1 ,确定,确定下列各条指令单独执行后下列各条指令单独执行后 DXDX 的值。的值。

(( 11 )) SHR DXSHR DX ,, 1 1 (( 22 )) SHLSHL DLDL ,, 11 (( 33 )) SAL DHSAL DH ,, 1 1 (( 44 )) SARSAR DXDX ,, CLCL (( 55 )) ROR DXROR DX ,, CLCL (( 66 )) ROLROL DLDL ,, CLCL (( 77 )) RCR DLRCR DL ,, 1 1 (( 88 )) RCL DLRCL DL ,, 1 1

Page 53: 第 一节   8086 指令系统 1

第三节:第三节: 8086/8088 8086/8088 指令系统指令系统 33 重点:重点:了解串操作指令的功能,掌握控制类指了解串操作指令的功能,掌握控制类指

令的使用方法。令的使用方法。 四、 串操作类指令 四、 串操作类指令 11 、重复指令前缀、重复指令前缀 REPREP :若:若 (CX)(CX) == 00退出;否则退出;否则 CX=CX-1CX=CX-1 继继续续 REPE/REPZREPE/REPZ :若:若 (CX)(CX) == 00 或或 ZF=0ZF=0 退出;退出;否则否则 CX=CX-1CX=CX-1 继续继续

REPNE/REPNZREPNE/REPNZ :若:若 (CX)(CX) == 00 或或 ZF=1ZF=1 退出;退出;否则否则 CX=CX-1CX=CX-1 继续继续

Page 54: 第 一节   8086 指令系统 1

MOVSBMOVSB [(ES[(ES :: DI)]←[(DSDI)]←[(DS :: SI)]SI)] ;; SI=SI±1SI=SI±1 ,, DI=DI±1DI=DI±1 ;; REPREP 控制重复前两步控制重复前两步 MOVSWMOVSW [(ES[(ES :: DI)]←[(DSDI)]←[(DS :: SI)]SI)] ;; SI=SI±2SI=SI±2 ,, DI=DI±2DI=DI±2 ;; REPREP 控制重复前两控制重复前两步步

22 、串指令、串指令

Page 55: 第 一节   8086 指令系统 1

串比较:串比较: CMPSBCMPSB [(ES[(ES :: DI)]DI)] -- [(DS[(DS :: SI)]SI)] ;; SI=SI±1SI=SI±1 ,, DI=DI±1DI=DI±1 ;; 重复前缀控制前两步重复前缀控制前两步 CMPSW CMPSW [(ES[(ES :: DI)]DI)] -- [(DS[(DS :: SI)]SI)] ;; SI=SI±2SI=SI±2 ,, DI=DI±2DI=DI±2 ;; 重复前缀控制前两步重复前缀控制前两步

Page 56: 第 一节   8086 指令系统 1

串搜索:串搜索: SCASBSCASB ALAL -- [(ES[(ES :: DI)]DI)] ;; DI=DI±1DI=DI±1 ;; 重复前缀控制前两步重复前缀控制前两步 SCASWSCASW AXAX -- [(ES[(ES :: DI)]DI)] ;; DI=DI±2DI=DI±2 ;; 重复前缀控制前两步重复前缀控制前两步

Page 57: 第 一节   8086 指令系统 1

存串存串 STOSBSTOSB AL→[(ESAL→[(ES :: DI)]DI)] ;; DI=DI±1DI=DI±1 ;; 重复前缀控制前两步重复前缀控制前两步 STOSWSTOSW AX→[(ESAX→[(ES :: DI)]DI)] ;; DI=DI±2DI=DI±2 ;; 重复前缀控制前两步重复前缀控制前两步

Page 58: 第 一节   8086 指令系统 1

取串:取串: LODSBLODSB [(DS[(DS :: SI)]→ALSI)]→AL ;; SI=SI±1SI=SI±1 ;; 一般不用重复前缀一般不用重复前缀 LODSWLODSW [(DS[(DS :: SI)]→AXSI)]→AX ;; SI=SI±2SI=SI±2 ;; 一般不用重复前缀一般不用重复前缀

Page 59: 第 一节   8086 指令系统 1

注意以下几个问题:注意以下几个问题: (1) SI(1) SI (源串地址),(源串地址), DIDI (目的地址),(目的地址),

CXCX (字串长度),(字串长度), ALAL (存取或搜索的(存取或搜索的默认值)。默认值)。

(2) (2) 源串在数据段源串在数据段 DSDS ,, 目的串在附加段目的串在附加段 ESES 。。 (3) DF(3) DF == 11 ,地址减,地址减 11 修改;修改; DF=0DF=0 时,时,

地址加地址加 11 修改,修改, MOVSMOVS 、、 STOSSTOS 、、 LODSLODS 指令不影响标指令不影响标

志位。志位。

Page 60: 第 一节   8086 指令系统 1

MOVSMOVS 指令的功能:指令的功能: 数据段中由数据段中由 [SI][SI] 寻址的一个字节寻址的一个字节 // 字传送字传送

到附加段中由到附加段中由 [DI][DI] 寻址的一个字节寻址的一个字节 // 字字单元中去,根据单元中去,根据 DFDF 对对 SISI 及及 DIDI 进行修改,进行修改,在重复前缀在重复前缀 REPREP 控制下,可将数据段中控制下,可将数据段中的整串数据传送到附加段中去。的整串数据传送到附加段中去。

例例 11 数据段中有一字符串,长度为数据段中有一字符串,长度为 1717 ,,把它们传送到附加段中,源串在数据段把它们传送到附加段中,源串在数据段中从中从 MESS1MESS1 开始,每个字符占一个字开始,每个字符占一个字节;节; M ESS2M ESS2 为附加段中用以存放字符为附加段中用以存放字符串的首地址。串的首地址。

Page 61: 第 一节   8086 指令系统 1

LEA SILEA SI ,, MESS1 MESS1 ;置源串偏移地址;置源串偏移地址 LEA DILEA DI ,, MESS2 MESS2 ;置目的串;置目的串

偏移地址偏移地址 MOV CXMOV CX ,, 17 17 ;置串长度;置串长度 CLD CLD ;方向标志复位;方向标志复位 REP MOVSB REP MOVSB ;字符串传送;字符串传送 最后一条指令也可写成最后一条指令也可写成 REP MOVS MESS2REP MOVS MESS2 ,, MESS1MESS1

Page 62: 第 一节   8086 指令系统 1

CMPSCMPS 指令的功能:指令的功能: 数据段中由数据段中由 [SI][SI] 寻址的一个字节寻址的一个字节 // 字与字与附加段中由附加段中由 [DI][DI] 寻址的一个字节寻址的一个字节 // 字进字进行比较,比较的结果影响标志位,根据行比较,比较的结果影响标志位,根据DFDF 进行比较的操作数类型(字节或进行比较的操作数类型(字节或字)对字)对 SISI 及及 DIDI 修改,在重复前缀修改,在重复前缀 REREPE/REPZPE/REPZ 或或 REPNE/REPNZREPNE/REPNZ 控制下,控制下,可在两个数据串中寻找第一个不相等的可在两个数据串中寻找第一个不相等的字节字节 // 字,或第一个相等的字节字,或第一个相等的字节 // 字。字。

Page 63: 第 一节   8086 指令系统 1

例 2 数据段中有一字符串,其长度为 17 ,存放在数据段中从 MESS1 开始的区域;附加段中有一长度相等的字符串,从 MESS2 开始的区域,找出两字符串不相等的位置。

Page 64: 第 一节   8086 指令系统 1

LEA SILEA SI ,, MESS1 MESS1 ;装入源串偏移地址;装入源串偏移地址LEA DILEA DI ,, MESS2 MESS2 ;装入目的串偏移地址;装入目的串偏移地址

MOV CXMOV CX ,, 17 17 ;装入字符串长度;装入字符串长度CLD CLD ;方向标志复位;方向标志复位

REPE CMPSBREPE CMPSB 程序执行后,程序执行后, SI/DISI/DI 的内容即为两字符串中的内容即为两字符串中

第一个不相等字符的下一个字符的位置。若第一个不相等字符的下一个字符的位置。若两字符串全同.比较完后,两字符串全同.比较完后, CXCX == 00 ,退出。,退出。

Page 65: 第 一节   8086 指令系统 1

SCASSCAS 指令的功能:指令的功能: 指令指定的关键字节指令指定的关键字节 // 字字 (( 存放在存放在 AL/AXAL/AX

中中 )) ,与附加段中由,与附加段中由 DIDI 间接寻址的字节间接寻址的字节 //字串中的一个字节字串中的一个字节 // 字进行比较,使比较字进行比较,使比较的结果影响标志位,根据的结果影响标志位,根据 DFDF 对对 DIDI 进行进行修改,在修改,在 REPE/REPZREPE/REPZ 或或 REPNE/REPREPNE/REPNZNZ 控制下,可在指定的数据串中搜索第控制下,可在指定的数据串中搜索第一个与关键字节一个与关键字节 // 字不相同的字节字不相同的字节 // 字,字,或者搜索第一个与关键字节或者搜索第一个与关键字节 // 字相同的字字相同的字节节 // 字。字。

Page 66: 第 一节   8086 指令系统 1

例例 33 附加段中一个字符串,放在以附加段中一个字符串,放在以 MEMESS2SS2 开始的区域,长度为开始的区域,长度为 1717 ,在该字,在该字符串中搜索空格符符串中搜索空格符 (ASCII(ASCII 码为码为 20H)20H) 。 。

Page 67: 第 一节   8086 指令系统 1

LEA DILEA DI ,, MESS2 MESS2 ;装入目的串偏移;装入目的串偏移地址地址

MOV ALMOV AL ,, 20H 20H ;装入关键字节;装入关键字节MOV CXMOV CX ,, 17 17 ;装入字符串长度;装入字符串长度REPNE SCASBREPNE SCASB 程序执行后,程序执行后, DIDI 的内容即为相同字符的的内容即为相同字符的

下一个字符的地址,下一个字符的地址, CXCX 中是还未比较的中是还未比较的字符的个数。 若在字符的个数。 若在 (CX)(CX) == 00 时退出,则时退出,则字符串中没有所要搜索的关键字节字符串中没有所要搜索的关键字节 // 字。字。

Page 68: 第 一节   8086 指令系统 1

STOSSTOS 指令的功能,指令的功能, 存放在存放在 AL/AXAL/AX 中的一个字节中的一个字节 // 字,传送到字,传送到附加段由附加段由 DIDI 间接寻址的字节间接寻址的字节 // 字内存单元字内存单元中去,根据中去,根据 DFDF 对对 DIDI 进行修改。在重复前进行修改。在重复前缀控制下,可连续将缀控制下,可连续将 AL/AXAL/AX 的内容存入到的内容存入到附加段中的一段内存区域中去,该指令不附加段中的一段内存区域中去,该指令不影标志位。影标志位。

例例 44 对附加段中从对附加段中从 MESS2MESS2 开始的开始的 5050 个连个连续的字节单元进行清续的字节单元进行清 00 操作 操作

Page 69: 第 一节   8086 指令系统 1

LEA DILEA DI ,, MESS2 MESS2 ;装目的区域偏移地址;装目的区域偏移地址 MOV ALMOV AL ,, 00H 00H ;为清零操作准;为清零操作准备备

MOV CXMOV CX ,, 50 50 ;设置区域长度;设置区域长度 REP STOSBREP STOSB LODSLODS 指令的功能, 实现从指定的字指令的功能, 实现从指定的字

节节 // 字串中读出信息的操作。字串中读出信息的操作。 例例 55 从从 4000H4000H 开始存有开始存有 20H20H 个有符号数,个有符号数,

统计其中负数的个数。统计其中负数的个数。 XOR DIXOR DI , , DIDI MOV SIMOV SI ,, 4000H4000H MOV CXMOV CX ,, 20H20H

Page 70: 第 一节   8086 指令系统 1

CLDCLD AGAINAGAIN :: LODSBLODSB TEST ALTEST AL ,, 80H80H JZ GOON JZ GOON INC DIINC DI GOONGOON :: LOOP AGAINLOOP AGAIN MOV MINUSMOV MINUS ,, DIDI …… ……

Page 71: 第 一节   8086 指令系统 1

五、 程序控制指令五、 程序控制指令 改变改变 CSCS :: IP/IPIP/IP 的值,以改变指令执行的顺序。的值,以改变指令执行的顺序。 11 、无条件转移、调用和返回指令、无条件转移、调用和返回指令 (1) (1) 无条件转移指令无条件转移指令 JMPJMP 格式: 格式: JMP OPRD JMP OPRD 直接转移:直接转移:直接给出相对偏移量直接给出相对偏移量 // 目的地址目的地址 短转移短转移 JMP SHORT OPRD JMP SHORT OPRD ;; IP=IP+8IP=IP+8 位位移位位移

量量 例:例: JMP SHORT LP1 JMP SHORT LP1 ;段内转向;段内转向 LP1LP1 处处 近转移近转移 JMP NEAR PTR OPRD JMP NEAR PTR OPRD ;; IP=IP+16IP=IP+16

位位移量位位移量 例:例: JMP NEAR PTR KKK JMP NEAR PTR KKK ;段内转向;段内转向 KKKKKK 处处 JMP 2500H JMP 2500H ;转向;转向 2500H2500H 处处

Page 72: 第 一节   8086 指令系统 1

段间转移段间转移 JMP FAR PTR OPRD JMP FAR PTR OPRD 例:例: JMP 3000HJMP 3000H :: 2500H 2500H ;执行该指令时(;执行该指令时( IPIP ))

=2500H=2500H ,(,( CSCS )) =3000H=3000H 间接转移: 间接转移: 目的地址由存储器目的地址由存储器 // 寄存器给出寄存器给出 段内间接转移段内间接转移 :转移的有效地址在寄存器 :转移的有效地址在寄存器 // 存储中存储中 例:例: JMP BX JMP BX ;如果(;如果( BXBX )) =1300H=1300H ,执行指令,执行指令

后(后( IPIP )) =1300H=1300H JMP [BX+DI] JMP [BX+DI] ;如果(;如果( DSDS )) =3000H=3000H ,, (( BXBX )) =1300H=1300H ,(,( DIDI )) =1200H=1200H ,, (( 32500H32500H )) =2350H=2350H ,执行指令后(,执行指令后( IPIP )) =2350H=2350H

Page 73: 第 一节   8086 指令系统 1

段间间接转移段间间接转移 :将指定存储单元中的第 :将指定存储单元中的第一个字送一个字送 IPIP ,第二个字送,第二个字送 CSCS 。。

例:例: JMP DWORD PTR [DI] JMP DWORD PTR [DI] 如果(如果( DSDS )) =4000H=4000H ,(,( DIDI )) =1212=1212

HH ,, (( 41212H41212H )) =1000H=1000H ,(,( 41214H41214H ))

=4A00H=4A00H ,指令执行后,(,指令执行后,( IPIP )) =1000=1000HH ,(,( CSCS )) =4A00H=4A00H 程序从程序从 4B000H4B000H开始执行指令。开始执行指令。

Page 74: 第 一节   8086 指令系统 1

40001212+)

41212

DSDI

001000

4A

41212412134121441215

1000

4A00

IP

CS

段间间接转移操作示意图

1111111111101100

JMP DWORD PTR [DI] 的机器码

DS:[DI]

Page 75: 第 一节   8086 指令系统 1

(2) (2) 调用和返回指令 调用和返回指令 CALLCALL调用一个过程或子程序。有段间调用一个过程或子程序。有段间 (FAR)(FAR) 和和

段内调用段内调用 (NEAR)(NEAR) 段内调用段内调用:将:将 CALLCALL 下面一条指令的地址推入下面一条指令的地址推入

堆栈,调用的有效地址由指定的操作数决定。 堆栈,调用的有效地址由指定的操作数决定。 CALL 2500H CALL 2500H ;调用的入口地址为(;调用的入口地址为( IPIP )) =2=2

500H500H CALL AX CALL AX ;调用的入口地址由;调用的入口地址由 AXAX 给出给出 CALL [BX] CALL [BX] ;调用的入口地址由;调用的入口地址由 BXBX 和和 BX+1BX+1

两存储单元的内容给出两存储单元的内容给出当执行当执行 RETRET 指令而返回时,从堆栈中取出一个指令而返回时,从堆栈中取出一个

字放入字放入 IPIP 中。中。

Page 76: 第 一节   8086 指令系统 1

段间调用段间调用:将:将 CALLCALL 下面一条指令的地址下面一条指令的地址 CSCS ::IPIP 的内容推入堆栈,将指令中指定的存储单的内容推入堆栈,将指令中指定的存储单元两个相邻字的内容送元两个相邻字的内容送 IPIP 和和 CSCS 。。

操作:操作: SP=SP-2SP=SP-2 ,(,( SPSP )) =CS=CS ;; SP=SP-SP=SP-22 ,(,( SPSP )) =IP=IP ;; IP=[EA]IP=[EA] ;; CS=[EA+2]CS=[EA+2]

CALL DWORD PTR [SI] CALL DWORD PTR [SI] ;调用的入口地址;调用的入口地址由由 SISI ,, SI+1SI+1 ,, SI+2SI+2 ,, SI+3SI+3 单元内容给出。单元内容给出。

执行执行 RETRET 指令时,从堆栈中取出第一个字放指令时,从堆栈中取出第一个字放入入 IPIP ,取出第二个字放入,取出第二个字放入 CSCS 中,作为段间中,作为段间返回地址。返回地址。

Page 77: 第 一节   8086 指令系统 1

返回指令格式有:返回指令格式有: RET RET ;; IP=IP= (( (SP+1),SP(SP+1),SP ),), SP=SP+SP=SP+

2 2 RET n RET n ;; IP=IP= ( ( (SP+1), SP(SP+1), SP ),), SP=SPSP=SP

+2 +2 SP=SP+nSP=SP+n 要求要求 nn 为偶数,当为偶数,当 RETRET 正常返回以后,再正常返回以后,再做做 SP=SP+nSP=SP+n 操作。操作。

RET n RET n 用于废除在执行调用指令前入栈的用于废除在执行调用指令前入栈的参数。参数。

Page 78: 第 一节   8086 指令系统 1

22 、条件转移指令、条件转移指令

80888088 有多种不同的条件转移指令。它们有多种不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段目的地址必须在现行的代码段 (CS)(CS) 内,内,并且以当前指针寄存器并且以当前指针寄存器 IPIP 内容为基准,内容为基准,其位移必须在十其位移必须在十 127~—128127~—128 的范围之内 的范围之内

Page 79: 第 一节   8086 指令系统 1

标志位转移指令:标志位转移指令: JZ/JE JZ/JE (( Z=1Z=1 )结果为零转移)结果为零转移 JNZ/JNE JNZ/JNE (( Z=0Z=0 )结果不为零转移)结果不为零转移 JS JS (( S=1S=1 )负数转移)负数转移 JNS JNS (( S=0S=0 )正数转移)正数转移 JP/JPE JP/JPE (( P=1P=1 )奇偶校验为偶数转移)奇偶校验为偶数转移 JNP/JPO JNP/JPO (( P=0P=0 )奇偶校验为奇数转移)奇偶校验为奇数转移 JO JO (( O=1O=1 )溢出转移)溢出转移 JNO JNO (( O=0O=0 )不溢出转移)不溢出转移 JC [C=1]JC [C=1] 有进位有进位 //借位转移借位转移 JNC [C=0]JNC [C=0] 无进位无进位 //借位转移借位转移

Page 80: 第 一节   8086 指令系统 1

不带符号数比较转移指令:不带符号数比较转移指令: JB/JNAE JB/JNAE 低于即不高于也不等于转移低于即不高于也不等于转移 JAE/JNB JAE/JNB 高于高于 // 等于即不低于转移等于即不低于转移 带符号数比较转移指令:带符号数比较转移指令: JG/JNLE JG/JNLE 大于或不小于等于转移大于或不小于等于转移 JGE/JNL JGE/JNL 大于等于或不小于转移大于等于或不小于转移 JL/JNGE JL/JNGE 小于或不大于等于转移小于或不大于等于转移 JLE/JNG JLE/JNG 小于等于或不大于转移小于等于或不大于转移测试转移指令测试转移指令 JCXZ OPRD CX=0 JCXZ OPRD CX=0 时转移时转移

Page 81: 第 一节   8086 指令系统 1

说明:说明: (1)(1) 判断无符号大小:判断无符号大小: JA/JNBEJA/JNBE ;高于,即不低于也不等于,则转移;高于,即不低于也不等于,则转移 条件为: 条件为: C & Z=0C & Z=0 ;; 例如:例如: AA 和和 BB 两个无符号数进行比较,两个无符号数进行比较, A>BA>B 时因时因高于无借位,高于无借位, C=0C=0 ,不相等,不相等 Z=0Z=0 ,两者相与满足,两者相与满足这个条件。这个条件。

JNA/JBEJNA/JBE ;不高于,即低于;不高于,即低于 // 等于,则转移等于,则转移 条件为 :条件为 : C Z=1∥C Z=1∥ ;; 例如:例如: AA 和和 BB 两个无符号数进行比较,两个无符号数进行比较, A<=BA<=B 时时因低于有借位,因低于有借位, C=1C=1 ,相等,相等 Z=1Z=1 ,两者相或满足,两者相或满足这个条件。这个条件。

Page 82: 第 一节   8086 指令系统 1

(2) (2) 判断有符号大小:判断有符号大小: JG/JNLE JG/JNLE ; ; 大于即不小于也不等于转移大于即不小于也不等于转移 条件为 条件为 S S ⊕⊕ O=0 O=0且且 Z=0Z=0 ;; 带符号数大于的条件为,带符号数大于的条件为, S S ⊕⊕ O=0 O=0 ,不相等,不相等 Z=0Z=0 ,,

两者都符合满足条件。两者都符合满足条件。 JNG/JLE JNG/JLE ; ; 不大于即小于不大于即小于 // 等于转移等于转移 条件为 条件为 S S ⊕⊕ O =1 O =1 或或 Z=1Z=1 ;带符号数小于的条件;带符号数小于的条件

为,为, S S ⊕⊕ O =1 O =1 ,相等,相等 Z=1Z=1 ,任一个符合则满足条,任一个符合则满足条件。件。

JL/JNGE JL/JNGE ; ;小于即不大于也不等于转移小于即不大于也不等于转移 条件为 条件为 S S ⊕⊕ O=1 O=1且且 Z=0Z=0 。。 JNL/JNL/ JGEJGE ; ; 不小于即大于或等于转移不小于即大于或等于转移 条件为 条件为 S S ⊕⊕ O=0 O=0 或或 Z=1Z=1 . .

Page 83: 第 一节   8086 指令系统 1

33 、循环控制指令、循环控制指令 LOOPLOOP

用在循环程序中以确定是否要继续循环。用在循环程序中以确定是否要继续循环。 循环次数通常置于循环次数通常置于 CXCX 中。中。 转移的目标应在距离本指令转移的目标应在距离本指令 -128-128~~ +127+127

的范围之内。的范围之内。 循环控制指令不影响标志位。循环控制指令不影响标志位。

Page 84: 第 一节   8086 指令系统 1

(1)LOOP(1)LOOP格式:格式: LOOP LOOP labellabel操作:操作: (CX)-1→CX(CX)-1→CX ;; 若若 (CX)≠0,(CX)≠0,则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,,执行执行 LOOPLOOP 后面的指令。后面的指令。 注:注: LOOPLOOP 指令与下面的指令段等价:指令与下面的指令段等价:

DEC CXDEC CX JNZ labelJNZ label

Page 85: 第 一节   8086 指令系统 1

(2)LOOPZ (LOOPE)(2)LOOPZ (LOOPE)格式:格式: LOOPZ LOOPZ labellabel操作:操作: (CX)-1→CX(CX)-1→CX;; 若若 (CX)≠0(CX)≠0 且且 ZF=1,ZF=1,则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,,执行执行 LOOPLOOP后面的指令。后面的指令。

(3)LOOPNZ (LOOPNE)(3)LOOPNZ (LOOPNE)格式:格式: LOOPNZ LOOPNZ labellabel操作:操作: (CX)-1→CX(CX)-1→CX;; 若若 (CX)≠0(CX)≠0 且且 ZF=0,ZF=0,则转至则转至 labellabel 处执行处执行;; 否则退出循环否则退出循环 ,,执行执行 LOOPLOOP后面的指令。后面的指令。

Page 86: 第 一节   8086 指令系统 1

例例 66 首地址为首地址为 ARRAYARRAY 存放有存放有 MM 个字组成的个字组成的数组,编写一段程序,求出该数组的内容之和数组,编写一段程序,求出该数组的内容之和

(不考虑溢出),并把结果存入(不考虑溢出),并把结果存入 TOTALTOTAL 中中

MOV CXMOV CX ,, M M ;设计数器初值;设计数器初值 MOV AXMOV AX ,, 0 0 ;累加器初值为;累加器初值为 00 MOV SIMOV SI ,, AX AX ;地址指针初值为;地址指针初值为 00 STARTSTART :: ADD AXADD AX ,, ARRAY[SI]ARRAY[SI] ADD SIADD SI ,, 2 2 ;修改指针值;修改指针值 LOOP START LOOP START ;重复;重复 MOV TOTALMOV TOTAL ,, AX AX ;存结果;存结果

Page 87: 第 一节   8086 指令系统 1

例例 77 :有一字符串,存放在:有一字符串,存放在 ASCIISTRASCIISTR 处,串的长处,串的长度为度为 LL 。在字符串中查找空格(。在字符串中查找空格( ASCIIASCII 码为码为 20H20H ),),找到则继续运行,否则转到找到则继续运行,否则转到 NOTFOUNDNOTFOUND 。。

MOV CXMOV CX ,, L L ;设计数器初值;设计数器初值 MOV SIMOV SI ,, -1 -1 ;设地址指针初值;设地址指针初值 MOV ALMOV AL ,, 20H 20H ;空格的;空格的 ASCIIASCII 码送码送 ALAL NEXTNEXT : : INC SIINC SI CMP ALCMP AL ,, ASCIISTR[SI] ASCIISTR[SI] ;比较是否空格;比较是否空格 ?? LOOPNZ NEXTLOOPNZ NEXT JNZ NOTFOUNDJNZ NOTFOUND ………… NOTFOUNDNOTFOUND :: …………

Page 88: 第 一节   8086 指令系统 1

六、中断指令六、中断指令

程序运行时,如果出现特殊任务,要求计程序运行时,如果出现特殊任务,要求计算机暂停正在运行的程序,转去执行一组算机暂停正在运行的程序,转去执行一组专门服务程序,完成后返回被中止的程序专门服务程序,完成后返回被中止的程序继续执行,这一过程叫中断。继续执行,这一过程叫中断。

8086/80888086/8088 中断系统分为外中断(硬件中中断系统分为外中断(硬件中断)和内部中断(软件中断)。外中断处断)和内部中断(软件中断)。外中断处理外设与理外设与 CPUCPU 之间的通信,内中断处理由之间的通信,内中断处理由中断指令等引起的中断。中断指令等引起的中断。

Page 89: 第 一节   8086 指令系统 1

8086/80888086/8088 中断系统将中断系统将 00 段的段的 0000H~03FF0000H~03FFHH 这这 10241024 个字节设为中断向量区,可容纳个字节设为中断向量区,可容纳 225656 个中断向量个中断向量

中断向量:中断服务程序入口地址中断向量:中断服务程序入口地址 中断类型码:中断向量的编号中断类型码:中断向量的编号中断指令共有三条:中断指令共有三条: (1)INT n (1)INT n 执行类型执行类型 nn的中断服务程序,的中断服务程序, N=0N=0 ~~ 255255

(2)INTO (2)INTO 执行溢出中断的中断服务程序执行溢出中断的中断服务程序

(3)IRET (3)IRET 从中断服务程序返回调用程序从中断服务程序返回调用程序

Page 90: 第 一节   8086 指令系统 1

11 、中断指令、中断指令 INT n INT n ;; n=0~255 n=0~255 中断类型码中断类型码

说明:说明: n×4n×4 = = 向量地址。该向量地址中的内容即向量地址。该向量地址中的内容即

为中断服务程序入口地址为中断服务程序入口地址 (( 段段 :: 偏移偏移 )) ,入口,入口地址也称为“中断向量”。地址也称为“中断向量”。

YYH

0000 : n×4 XXHXXHYYH

中断服务程序入口的偏移地址 (IP)中断向量中断服务程序入口的段地址 (CS)

YYH

Page 91: 第 一节   8086 指令系统 1

执行过程:(执行过程:( 11 )标志寄存器入栈,)标志寄存器入栈, SP-2SP-2 ;; (( 22 )清除)清除 II 和和 TT ; ; (( 33 )断点地址的段值和偏移量入栈,)断点地址的段值和偏移量入栈, SP-4SP-4 (( 44 )中断向量地址)中断向量地址 = = n×4n×4 ,前两单元的内,前两单元的内

容送容送 IPIP ,后两单元内容送,后两单元内容送 CSCS ,转去执行中,转去执行中断处理程序。断处理程序。

INT nINT n 除复位除复位 II 和和 TT 外,对其他标志无影响。外,对其他标志无影响。

Page 92: 第 一节   8086 指令系统 1

INTINT 指令的操作例:指令的操作例:

INT 21HINT 21H

IPLIPHCSLCSH

SP=1200

FLAGSLFLAGSH

SP=11FA

执行 INT 21H 指令后

保护断点堆栈

执行 INT 21H 指令前

Page 93: 第 一节   8086 指令系统 1

INTINT 指令的操作例(续):指令的操作例(续):

执行执行 INT 21HINT 21H 指令后, 指令后, CS=CS= ?? IP=IP= ??因为因为 n=21Hn=21H ,所以,所以 nn×4×4=84H=84H 。。

下图中,下图中, (0:0084H)=2000H:1123H(0:0084H)=2000H:1123H

所以: 所以: CS=2000H IP=1123HCS=2000H IP=1123H

0000:0084H 23H11H00H20H

IP

CS

0000 : 21H×4

Page 94: 第 一节   8086 指令系统 1

22 、、溢出中断溢出中断 INTOINTO 把把 INTOINTO 放在有符号数加减运算后面,查到放在有符号数加减运算后面,查到 OFOF

=1=1 则则启动一个类型启动一个类型 44的中断过程;如果的中断过程;如果 , , OF=0OF=0不做任何不做任何给出出错信息给出出错信息

33 、中断返回指令、中断返回指令 IRETIRET 用于从中断服务程序返回被中断的程序。用于从中断服务程序返回被中断的程序。 IRETIRET负负责恢复断点责恢复断点 (CS(CS和和 IP)IP)和恢复标志寄存器内容和恢复标志寄存器内容。。

任何中断服务程序不管是外部中断引起的任何中断服务程序不管是外部中断引起的 ,, 还是还是内部中断引起的内部中断引起的 ,,最后都要用最后都要用 IRETIRET 返回。返回。

Page 95: 第 一节   8086 指令系统 1

IRETIRET 指令执行的操作为:指令执行的操作为: (1)(1)栈顶内容弹出到栈顶内容弹出到 IPIP (2)(2)栈顶内容弹出到栈顶内容弹出到 CSCS (3) (3)栈顶内容弹出到栈顶内容弹出到 FLAGFLAG

七、 标志处理和七、 标志处理和 CPUCPU 控制类指令控制类指令 标志处理指令用来控制标志位,主要有标志处理指令用来控制标志位,主要有 CFCF 、、

DFDF 和和 IFIF 三个。三个。 处理器控制指令用以控制处理器的工作状态,处理器控制指令用以控制处理器的工作状态,均不影响标志位 均不影响标志位

Page 96: 第 一节   8086 指令系统 1

标志处理指令:标志处理指令: CLC CLC 置进位标志,置进位标志, CF=1CF=1 STC STC 清进位标志,清进位标志, CF=0CF=0 CMC CMC 进位标志取反进位标志取反 CLD CLD 清方向标志,清方向标志, DF=0DF=0 STD STD 置方向标志,置方向标志, DF=1DF=1 CLI CLI 关中断标志,关中断标志, IF=0IF=0 ,不允许中断,不允许中断 STI STI 开中断标志,开中断标志, IF=1IF=1 ,允许中断,允许中断

Page 97: 第 一节   8086 指令系统 1

CPUCPU 控制类指令控制类指令 HLT HLT ::执行执行 HLTHLT 指令时指令时 ,CPU,CPU 进入暂停状态进入暂停状态 ,,

设置该指令通常是为了等待中断。设置该指令通常是为了等待中断。 外部中断外部中断 (( 包括包括 IF=1IF=1时的可屏蔽中断请求时的可屏蔽中断请求 ININTRTR 及非屏蔽中断请求及非屏蔽中断请求 NMI)NMI) 或复位信号可让或复位信号可让CPUCPU 退出暂停状态。退出暂停状态。

HLTHLT 不影响标志位不影响标志位

Page 98: 第 一节   8086 指令系统 1

WAIT WAIT :使处理器处于等待状态,:使处理器处于等待状态, TESTTEST 线线为低时,退出等待为低时,退出等待

ESC ESC :交权指令,当处理器执行这条指令时:交权指令,当处理器执行这条指令时把控制权交给协处理把控制权交给协处理

LOCKLOCK :封锁总线指令,可放在任一条指令:封锁总线指令,可放在任一条指令前作为前缀 前作为前缀 ,, 在在 CPUCPU 访问存储器或外设时,访问存储器或外设时,总线控制器对总线进行封锁,使其它处理器总线控制器对总线进行封锁,使其它处理器得不到总线控制权。得不到总线控制权。

Page 99: 第 一节   8086 指令系统 1

NOPNOP :空操作指令,:空操作指令,不做任何实质性不做任何实质性的操作的操作 ,,但占用但占用 33个时钟周期个时钟周期 ,,然后执然后执行下一条指令。行下一条指令。

常用于程序的延时和调试 常用于程序的延时和调试

Page 100: 第 一节   8086 指令系统 1

习题:习题: 11 、试分析下列程序段:、试分析下列程序段: ADDADD AXAX ,, BXBX JNCJNC L2L2 SUBSUB AXAX ,, BXBX JNCJNC L3L3 JMPJMP SHORT L5SHORT L5 设:(设:( 11 )()( AXAX ) ) =14C6H=14C6H ; (; ( BX BX )) =80DCH=80DCH (( 22 )()( AXAX ) ) = 0B568H= 0B568H ;(;( BX BX ) ) =54B7H=54B7H 问该程序执行后,程序转向何处?问该程序执行后,程序转向何处? 22 、编写一段程序,比较两个具有、编写一段程序,比较两个具有 55 个字节的字符串个字节的字符串

OLDSOLDS 和和 NEWSNEWS ,如果两字符串不同,则执行,如果两字符串不同,则执行 NEWNEW_LESS_LESS ,否则顺序执行。,否则顺序执行。

Page 101: 第 一节   8086 指令系统 1

第四节 汇编语言程序设计第四节 汇编语言程序设计 11

重点:重点:了解汇编的概念及其方法了解汇编的概念及其方法 , , 掌握汇掌握汇编语言源程序的基本格式、常用运算符的编语言源程序的基本格式、常用运算符的使用方法、汇编的步骤。了解伪指令的功使用方法、汇编的步骤。了解伪指令的功能,掌握定义数据、符号、段、过程等伪能,掌握定义数据、符号、段、过程等伪指令的使用方法 指令的使用方法

Page 102: 第 一节   8086 指令系统 1

4.1 4.1 汇编语言的基本元素汇编语言的基本元素一、 汇编语言的语句格式一、 汇编语言的语句格式

[[ 标号标号 ] ] 指令助记符 指令助记符 [[ 操作数操作数 ][][ ;注解;注解 ]] 11 、标识符、标识符 给指令或存储单元地址起的名字。由字符组给指令或存储单元地址起的名字。由字符组

成:成: 字母:字母: A ~ z A ~ z ; 数字:; 数字: 0 ~ 9 0 ~ 9 ; 下划线 。; 下划线 。 数字不能作标识符的第一个字符,最长数字不能作标识符的第一个字符,最长 3131

个字符;加冒号,是标号个字符;加冒号,是标号 ,, 代表指令的起始地代表指令的起始地址;不加冒号表示变量;伪指令前的标识符不址;不加冒号表示变量;伪指令前的标识符不加冒号。 加冒号。

Page 103: 第 一节   8086 指令系统 1

22 、指令助记符 、指令助记符 不同操作的指令,包括不同操作的指令,包括指令助记符指令助记符和和伪指令伪指令。。 33 、操作数:指令执行的对象。可有一、操作数:指令执行的对象。可有一 // 两个或两个或

者没有者没有 例如:例如: RET RET ;无操作数;无操作数 COUNTCOUNT : : INC CX INC CX ;一个操作数;一个操作数 MOV AXMOV AX ,, [BP[BP十十 4] 4] ;操作数为表达式;操作数为表达式伪指令可有多个操作数,例如:伪指令可有多个操作数,例如: COST DB 3COST DB 3 ,, 44 ,, 55 ,, 66 ,, 7 7 ;五个操作;五个操作

数数 44 、注解项是为源程序加的注解,用于提高程序、注解项是为源程序加的注解,用于提高程序

的可读性。的可读性。

Page 104: 第 一节   8086 指令系统 1

二、 汇编语言的运算符二、 汇编语言的运算符 11 、算术运算符、逻辑运算符和关系运算符、算术运算符、逻辑运算符和关系运算符 算术运算符算术运算符 55 个个 ::+(加)、-(减)、*(乘)、+(加)、-(减)、*(乘)、 // (整除)、(整除)、

MODMOD (求余),参加运算的数和运算结果均(求余),参加运算的数和运算结果均是整数。 是整数。

逻辑运算符有逻辑运算符有 44 个:个: ANDAND (与)、(与)、 OROR (或)、(或)、 NOTNOT (非)和(非)和 XX

OROR (异或),参加运算的数和运算的结果均(异或),参加运算的数和运算的结果均是整数,逻辑运算是按位进行的。是整数,逻辑运算是按位进行的。

Page 105: 第 一节   8086 指令系统 1

关系运算符关系运算符 66 个:个: GTGT (大于)、(大于)、 GEGE (大于(大于等于)、等于)、 LTLT (小于)、(小于)、 LELE (小于等于)、(小于等于)、EQEQ (等于)、和(等于)、和 NENE (不等于)。它们用于(不等于)。它们用于比较两个表达式,比较两个表达式,

表达式表达式一定是常数或同段内的变量。若是常数,一定是常数或同段内的变量。若是常数,按无符号数比较;若是变量则比较它们的偏按无符号数比较;若是变量则比较它们的偏移量。移量。

比较比较的结果为真,表示为全的结果为真,表示为全 11 ;结果为假,表;结果为假,表示为全示为全 00 。。

Page 106: 第 一节   8086 指令系统 1

22 、取值运算符、取值运算符 SEGSEG 、、 OFFSETOFFSET 、、 TYPETYPE 、、SIZESIZE 和和 LENGTHLENGTH SEGSEG 和和 OFFSETOFFSET 给出变量或标号的段地址和偏移量。给出变量或标号的段地址和偏移量。

TYPETYPE 返回表示存储器操作数(变量或标号)类型的返回表示存储器操作数(变量或标号)类型的数值 数值

变量变量:: DBDB 为为 11 ,, DWDW 为为 22 ,, DDDD 为为 44 ,, DQDQ 为为 88 。。 标号标号:则汇编程序将送回代表该标号类型的数值: :则汇编程序将送回代表该标号类型的数值:

NEARNEAR 为-为- 11 ,, FARFAR 为-为- 22 。。 LENGTHLENGTH 返回由返回由 DUPDUP 定义的操作数个数。定义的操作数个数。 SIZESIZE 返回字节数。返回字节数。 例如:若 例如:若 MULT DW 50 DUPMULT DW 50 DUP (( 00 )) MOV AXMOV AX ,, SEG MULTSEG MULT ;将;将 MULTMULT 的段地址送的段地址送 AXAX LENGTH MULT=50LENGTH MULT=50 SIZE MULT=100SIZE MULT=100

Page 107: 第 一节   8086 指令系统 1

33 、属性运算符、属性运算符 用来给指令中的操作数指定一个临时属性,用来给指令中的操作数指定一个临时属性,常用的有合成运算符常用的有合成运算符 PTRPTR ,它作用于操作数,它作用于操作数时,忽略操作数当前的类型时,忽略操作数当前的类型 (( 字节字节 // 字字 )) 或属或属性性 (NEAR/FAR)(NEAR/FAR) ,给出临时的类型或属性。,给出临时的类型或属性。

一般格式:一般格式:类型 类型 PTR PTR 表达式表达式 功能:建立一个存储器地址操作数,与其后的功能:建立一个存储器地址操作数,与其后的

存储器地址操作数有相同的段地址偏移量,但存储器地址操作数有相同的段地址偏移量,但类型不同。类型不同。

例如:例如: SLOT DW 25SLOT DW 25 MOV ALMOV AL ,, BYTE PTR SLOTBYTE PTR SLOT

Page 108: 第 一节   8086 指令系统 1

三、 表达式三、 表达式 由运算符和操作数组成的序列,在汇编时产生确定由运算符和操作数组成的序列,在汇编时产生确定

的值,这个值可以是一个常数,也可以是存储单元的值,这个值可以是一个常数,也可以是存储单元的偏移地址 的偏移地址

11 、常量、常量 ⑴⑴ 数字常量数字常量 ① ① 二进制数 后跟二进制数 后跟 BB ,如,如 01000001B01000001B 。。 ② ② 八进制数 后跟八进制数 后跟 QQ 或或 OO ,如,如 202Q202Q 或或 202O202O 。。 ③ ③ 十进制数 后跟十进制数 后跟 DD 或省略,如或省略,如 85D85D 或或 8585 。。 ④ ④ 十六进制数 后跟十六进制数 后跟 HH ,如,如 56H56H ,, 0FFH0FFH 。数字。数字

的第一个字符是的第一个字符是 A~FA~F 时,字符前应加一个数字时,字符前应加一个数字 00 ,,与变量区别。与变量区别。

Page 109: 第 一节   8086 指令系统 1

⑵⑵ 字符串常量:引号内的字符字符串常量:引号内的字符 22 、常量操作数、常量操作数 是一个数值操作数,一般是是一个数值操作数,一般是常量常量或或表表示常量的标识符示常量的标识符。可以是。可以是数字常量数字常量操作操作数或数或字符串常量字符串常量操作数。操作数。

((常量的标识符:用常量的标识符:用 EQUEQU 来赋值,不开来赋值,不开辟存储单元辟存储单元 ))

Page 110: 第 一节   8086 指令系统 1

33 、存储器操作数、存储器操作数 存储器操作数是存储器操作数是地址地址操作数,代表存储单操作数,代表存储单

元的地址,元的地址,常以标识符的形式出现。常以标识符的形式出现。 存储器操作数分为存储器操作数分为变量变量和和标号标号。。 表示表示数据数据在数据在数据 //附加附加 // 堆栈段中的地址的堆栈段中的地址的

存储器操作数称为存储器操作数称为变量变量;; 表示表示某条指令代码某条指令代码在码段中地址的存储器在码段中地址的存储器

操作数称为操作数称为标号标号。。

Page 111: 第 一节   8086 指令系统 1

变量内容可以改变。标号常作为转移变量内容可以改变。标号常作为转移 //调用指令调用指令的目标操作数。的目标操作数。

存储器操作数有三个方面的属性。存储器操作数有三个方面的属性。 (1) (1) 段地址:存储单元所在段的段地址;段地址:存储单元所在段的段地址; (2) (2) 偏移地址:存储单元在段内的偏移地址;偏移地址:存储单元在段内的偏移地址; (3) (3) 类型:变量的类型是类型:变量的类型是 B/W/DWB/W/DW ;标号的类;标号的类型为型为 NEARNEAR 和和 FAR FAR

Page 112: 第 一节   8086 指令系统 1

44 、常量表达式、常量表达式 由常量操作数及运算符构成由常量操作数及运算符构成 ,,汇编时产生一个常量。汇编时产生一个常量。 如如 VALVAL十十 11 等。等。 55 、地址表达式、地址表达式 由存储器操作数与运算符构成,必须有明确的物理由存储器操作数与运算符构成,必须有明确的物理

意义。例如 意义。例如 SUMSUM ++ 22 、、 CYCLECYCLE -- 55 表达式表达式 SUMSUM ++ 22 、、 CYCLECYCLE -- 55 的值仍然是一个存的值仍然是一个存

储器操作数,该存储器操作数的段地址与类型属性储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数分别与存储器操作数 SUMSUM 及及 CYCLECYCLE 相同,但偏移相同,但偏移地址分别比地址分别比 SUMSUM 及及 CYCLECYCLE大大 22 或小或小 55 。表达式是。表达式是在汇编时计算的,而变量单元的内容在程序的运行在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。过程中可以改变。

Page 113: 第 一节   8086 指令系统 1

四、 汇编语言程序汇编步骤四、 汇编语言程序汇编步骤

汇编语言程序要能在机器上运行,还必需汇编语言程序要能在机器上运行,还必需将汇编源程序汇编成可执行程序。为此必将汇编源程序汇编成可执行程序。为此必须完成以下几个步骤。 须完成以下几个步骤。

11 、编辑源程序、编辑源程序 22 、用宏汇编对源程序进行汇编、用宏汇编对源程序进行汇编 33 、对目标程序进行连接、对目标程序进行连接 44 、运行可执行程序并调试 、运行可执行程序并调试

Page 114: 第 一节   8086 指令系统 1

4.2 4.2 伪指令伪指令伪指令本身伪指令本身不产生与之对应的目标代码不产生与之对应的目标代码。它。它

是在汇编程序对汇编语言源程序汇编期间,是在汇编程序对汇编语言源程序汇编期间,由汇编程序由汇编程序处理的操作,它们可以完成如数处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束据定义、分配存储区、指示程序结束等功能。等功能。一、 定义一、 定义存储空间存储空间伪指令伪指令

用来定义存储空间及所存数据的长度。用来定义存储空间及所存数据的长度。 DBDB :定义字节,每个数据是:定义字节,每个数据是 11 个字节。个字节。 DWDW :定义字,每个数据占:定义字,每个数据占 22 个字节。个字节。 DDDD :定义双字,每个数据占:定义双字,每个数据占 44 个字节。个字节。

Page 115: 第 一节   8086 指令系统 1

DQDQ :定义:定义 44 字长,即每个数据占字长,即每个数据占 88 个字。个字。 DTDT :定义:定义 1010 个字节长,用于压缩式十进制数,个字节长,用于压缩式十进制数, 例如:例如: DATA1 DB 5DATA1 DB 5 ,, 66 ,, 88 ,, 100100 DATA2 DW 7DATA2 DW 7 ,, 287287 TABLE DB ? TABLE DB ? ,表示保留一个单元;,表示保留一个单元; 在存储区内的每个单元放置同样的数据时,可用在存储区内的每个单元放置同样的数据时,可用

DUPDUP 操作符。操作符。 一般格式:一般格式: COUNT DUPCOUNT DUP (?),(?), COUNT COUNT 为为

重复的次数,“( )”中为要重复的数据。重复的次数,“( )”中为要重复的数据。 如:如: BUFF DB 100DUP(0) BUFF DB 100DUP(0) ;表示以;表示以 BUFFBUFF 为为首地址的首地址的 100100 个单元中存放个单元中存放 00H00H 数据数据

BASE DB 100 DUPBASE DB 100 DUP (( 33 ,, 55 ,, 2 DUP2 DUP (( 1010 ,,3535 ),), 2424 ))

Page 116: 第 一节   8086 指令系统 1

二、 符号定义伪指令二、 符号定义伪指令 EQUEQU 、、 == 、及、及 PURGEPURGE EQUEQU 给符号定义一个值。程序中出现该符号的地方,给符号定义一个值。程序中出现该符号的地方,汇编时用其值代替。(未被解除前不可再定义)汇编时用其值代替。(未被解除前不可再定义)

如:如: TIMES EQU 50TIMES EQU 50 DATA DB TIMES DUP(?)DATA DB TIMES DUP(?) 等效于如下语句:等效于如下语句: DATA DB 50 DUP(?)DATA DB 50 DUP(?) ““=”=” 给变量赋初值,可再定义。给变量赋初值,可再定义。 如:如: COUNT=100 COUNT=100 ;; TIME=50TIME=50 PURGEPURGE 用于释放由用于释放由 EQUEQU伪指令定义符号的,使这伪指令定义符号的,使这

些符号可以被重新定义。些符号可以被重新定义。 PURGE PURGE TIMESTIMES TIMES EQU 2TIMES EQU 2

Page 117: 第 一节   8086 指令系统 1

三、段定义伪指令三、段定义伪指令 SEGMENTSEGMENT 和和 ENDSENDS 汇编源程序一般由汇编源程序一般由 33 个段组成,即堆栈段、数据段个段组成,即堆栈段、数据段

和代码段。段定义伪指令和代码段。段定义伪指令可将源程序划分成若干段,可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合以便生成目的代码和连接时将各同名段进行组合。。

一般格式为 :一般格式为 : 段名 段名 SEGMENT [SEGMENT [ 定位类型定位类型 ] [] [ 组合类型组合类型 ] [] [ 类别类别 ...... 段名 段名 ENDSENDS 可选项,是赋予段名的属性。可选项,是赋予段名的属性。 例如: 例如: DATA SEGMENT DATA SEGMENT DW 20DUP(?)DW 20DUP(?) DATA ENDSDATA ENDS

Page 118: 第 一节   8086 指令系统 1

四、 设定段寄存器伪指令四、 设定段寄存器伪指令 ASSUMEASSUME 一般格式: 一般格式: ASSUME ASSUME 段寄存器:段名段寄存器:段名 [[ ,段寄,段寄

存器:段名,……存器:段名,…… ]] 功能功能:通知汇编程序,哪一个段寄存器是该段的:通知汇编程序,哪一个段寄存器是该段的

段寄存器,以便对使用变量或标号的指令汇编出段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。在段名中,正确的目的代码。在段名中, CODECODE 表示代码段,表示代码段,DATADATA 表示数据段,表示数据段, STACKSTACK 表示堆栈段。表示堆栈段。

ASSUMEASSUME伪指令指明某一个段地址应存于哪个段伪指令指明某一个段地址应存于哪个段寄存器,不包含将段地址送入段寄存器的操作。寄存器,不包含将段地址送入段寄存器的操作。要将段地址装入段寄存器需用汇编指令来实现。要将段地址装入段寄存器需用汇编指令来实现。

例如,例如, CODE SEGMENTCODE SEGMENT ASSUME CSASSUME CS :: CODECODE ,, DSDS :: DATADATA ,,

SSSS :: STACK STACK

Page 119: 第 一节   8086 指令系统 1

MOV AXMOV AX ,, DATA DATA ;; DATADATA 段值送段值送 AXAX MOV DSMOV DS ,, AX AX ;; AXAX 内容送内容送 DSDS CODE ENDSCODE ENDS当程序运行时,由于当程序运行时,由于 DOSDOS 的引导程序负的引导程序负责把责把 CSCS 初始化成正确的代码段地址,因初始化成正确的代码段地址,因此用户在程序中就不必设置。但是,在引此用户在程序中就不必设置。但是,在引导程序中导程序中 DSDS 寄存器由于被用作其它用途,寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对因此,在用户程序中必须用两条指令对 DDSS 进行初始化,以装入用户的数据段地址。进行初始化,以装入用户的数据段地址。当使用附加段时,也要用当使用附加段时,也要用 MOVMOV 指令给指令给 ESES赋段地址。赋段地址。

Page 120: 第 一节   8086 指令系统 1

五、 定义过程的伪指令五、 定义过程的伪指令 PROCPROC 和和 ENDPENDP 程序设计中,可将具有一定功能的程序段看成为程序设计中,可将具有一定功能的程序段看成为

一个过程一个过程 (( 相当于一个子程序相当于一个子程序 )) ,它可以被别的程,它可以被别的程序调用。序调用。

一个过程由伪指令一个过程由伪指令 PROCPROC 和和 ENDPENDP 来定义,其格来定义,其格式为:式为:

过程名 过程名 PROC [PROC [ 类型类型 ]] 过程体过程体 RETRET 过程名 过程名 ENDPENDP 过程名是为过程起的名称,类型由过程名是为过程起的名称,类型由 FARFAR (为段间(为段间调用)和调用)和 NEARNEAR (在本段内调用)来确定,缺省(在本段内调用)来确定,缺省类型,默认为类型,默认为 NEARNEAR 。。 ENDPENDP 表示过程结束。过表示过程结束。过程体内至少应有一条程体内至少应有一条 RETRET 指令,以便返回调用处。指令,以便返回调用处。过程可以嵌套,也可以递归使用。过程可以嵌套,也可以递归使用。

Page 121: 第 一节   8086 指令系统 1

例如延时子程序,其过程可定义如下,例如延时子程序,其过程可定义如下, DELAY PROCDELAY PROC PUSH BXPUSH BX PUSH CXPUSH CX MOV BLMOV BL ,COUNT1  ,COUNT1  AGAINAGAIN : : MOV CXMOV CX ,COUNT2 ,COUNT2 WAITWAIT : : LOOP WAITLOOP WAIT DEC BLDEC BL JNZ AGAINJNZ AGAIN POP CXPOP CX POP BXPOP BX RETRET DELAY ENDPDELAY ENDP

Page 122: 第 一节   8086 指令系统 1

六、 宏指令六、 宏指令 多次使用的程序段,可用一条宏指令来代替,汇编多次使用的程序段,可用一条宏指令来代替,汇编

程序汇编到该条宏指令时,生成源程序代码。程序汇编到该条宏指令时,生成源程序代码。 宏指令的一般格式为:宏指令的一般格式为: 宏指令名 宏指令名 MACRO [MACRO [ 形式参量表形式参量表 ]] 宏体宏体 ENDMENDM 例如:例如: SHIFT MACROSHIFT MACRO MOV CLMOV CL ,, 44 SAL ALSAL AL ,, ClCl ENDMENDM 定义后,凡是使定义后,凡是使 ALAL 中内容左移中内容左移 44 位的操作都可用位的操作都可用

SHIFTSHIFT 来代替。来代替。

Page 123: 第 一节   8086 指令系统 1

宏指令与子程序都是一段相对独立的、完宏指令与子程序都是一段相对独立的、完成某种功能的程序模块,定义后可多次调成某种功能的程序模块,定义后可多次调用。汇编时,子程序只形成一段目的代码,用。汇编时,子程序只形成一段目的代码,调用时转向该程序段执行;调用时转向该程序段执行;汇编宏指令时汇编宏指令时将形成的目的代码插到主程序调用的地方。将形成的目的代码插到主程序调用的地方。前者占内存少,执行速度稍慢;后者相反。前者占内存少,执行速度稍慢;后者相反。

Page 124: 第 一节   8086 指令系统 1

七、 七、 ORG ORG 伪指令伪指令 ORGORG 规定某一段内,程序或数据存放的起规定某一段内,程序或数据存放的起

始偏移地址。始偏移地址。 一般格式: 一般格式: ORG <ORG < 表达式表达式 >> 例如:例如: DATADATA SEGMENTSEGMENT BUFF1BUFF1 DBDB 2323 ,, 56H56H ,‘,‘ EOF’EOF’ ORGORG 2000H2000H BUFF2BUFF2 DBDB ‘STRING’‘STRING’ DATADATA ENDSENDS BUFF1BUFF1 从从 DATADATA 段段 00 单元开始存放,单元开始存放, BUFBUF

F2F2 从从 DATADATA 段段 2000H2000H 单元开始存放。单元开始存放。

Page 125: 第 一节   8086 指令系统 1

八、 汇编结束伪指令八、 汇编结束伪指令 ENDEND

ENDEND 表示源程序的结束.令汇编程序停止表示源程序的结束.令汇编程序停止汇编。任何一个完整的源程序均应有汇编。任何一个完整的源程序均应有 ENENDD 指令。指令。

一般格式: 一般格式: END [END [ 表达式表达式 ]] 表达式表示该汇编程序的启动地址。表达式表示该汇编程序的启动地址。 例如:例如: END START END START ;表明该程序的启动地址;表明该程序的启动地址

为为 STARTSTART 。。

Page 126: 第 一节   8086 指令系统 1

习题:习题: 11 、下列语句分别为变量分配多少单元?画出存储空、下列语句分别为变量分配多少单元?画出存储空

间的分配图。间的分配图。 VAR1 VAR1 DB 10DB 10 ,, 22 VAR2VAR2 DW 5DUPDW 5DUP (?),(?), 00 VAR3VAR3 DB ‘HOW ARE YOUDB ‘HOW ARE YOU?’,‘?’,‘ $’$’ VAR4VAR4 DD -1DD -1 ,, 11 ,, 00 22 、、 VAR1VAR1 和和 VAR2VAR2 为字变量,为字变量, LABLAB 为标号,指出下为标号,指出下

列指令的错误。列指令的错误。(( 11 )) ADD VAR1ADD VAR1 ,, VAR2 VAR2 (( 22 )) SUB ALSUB AL ,, VAR1VAR1(( 33 )) JMPJMP LAB[SI]LAB[SI] (( 44 )) JNZJNZ VAR1VAR1 33 、给定符号定义,指出下列指令的错误。、给定符号定义,指出下列指令的错误。 A1 DBA1 DB ?,?, A2 DB 10 A2 DB 10 ,, K1 EQU 1024K1 EQU 1024(( 11 )) MOVMOV K1K1 ,, AXAX (( 22 )) MOVMOV A1A1 ,, AXAX(( 33 )) CMPCMP A1A1 ,, A2A2 (( 44 )) K1K1 EQUEQU 20482048

Page 127: 第 一节   8086 指令系统 1

第五节 汇编程序设计第五节 汇编程序设计 重点:掌握汇编程序的分析与设计方法重点:掌握汇编程序的分析与设计方法

(包括分支程序和循环程序)(包括分支程序和循环程序) 一、 简单程序设计一、 简单程序设计简单程序是没有分支简单程序是没有分支 // 循环的直线运行程序,循环的直线运行程序,

程序执行按照程序执行按照 IPIP 内容自动增加的顺序进行。内容自动增加的顺序进行。 例例 1 1 :利用查表法计算平方值。:利用查表法计算平方值。 0 ~ 90 ~ 9 的的平方值连续存在以平方值连续存在以 SQTABSQTAB 开始的存储区中,开始的存储区中,求求 SURSUR单元内容单元内容 XX 的平方值,并放在的平方值,并放在 DISDIS单元中。假定单元中。假定 0≤X≤ 90≤X≤ 9且为整数。且为整数。

Page 128: 第 一节   8086 指令系统 1

分析:建立平方表,通过查表完成。分析:建立平方表,通过查表完成。 STACKSTACK SEGMENTSEGMENT DB 100 DUPDB 100 DUP (?)(?) STACK ENDSSTACK ENDS DATA SEGMENTDATA SEGMENT SUR DB SUR DB ?? DIS DB DIS DB ?? SQTAB DB 0SQTAB DB 0 ,, 11 ,, 44 ,, 99 ,, 1616 ,,

2525 ,, 3636 ,, 4949 ,, 6464 ,, 81 81 DATA ENDSDATA ENDS CODE SEGMENTCODE SEGMENT ASSUME CSASSUME CS :: CODECODE ,, DSDS :: DATADATA ,,

SSSS :: STACKSTACK ,, ESES :: DATADATA

Page 129: 第 一节   8086 指令系统 1

BEGINBEGIN :: PUSH DSPUSH DS MOVMOV AXAX ,, 00 PUSHPUSH AXAX MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX LEA BXLEA BX ,, SQTABSQTAB MOVMOV ALAL ,, SURSUR XLAT XLAT MOV DIS, ALMOV DIS, AL CODECODE ENDSENDS END END BEGINBEGIN

Page 130: 第 一节   8086 指令系统 1

例例 22 、试求出表达式:、试求出表达式: (X×4(X×4-- YY )) /2/2 的值,并保的值,并保存到存到 ZZ 存储单元中,其中存储单元中,其中 XX ,, YY均为字节变量均为字节变量。。

解:完成该功能的解:完成该功能的流程图流程图如图所示:如图所示:

Page 131: 第 一节   8086 指令系统 1

DATADATA SEGMENTSEGMENT ;数据段;数据段 XX DBDB 22 YY DBDB 44 ZZ DBDB ?? ;定义变量;定义变量 DATADATA ENDSENDS STACKSTACK SEGMENTSEGMENT DWDW 20H20H DUPDUP (( 00 )) STACKSTACK ENDSENDS CODECODE SEGMENTSEGMENT ;代码段;代码段 ASSUME CS:CODE,DS:DATA,SS:STACKASSUME CS:CODE,DS:DATA,SS:STACK

Page 132: 第 一节   8086 指令系统 1

BEGINBEGIN :: MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX ;; DSDS 赋初值赋初值 MOVMOV ALAL ,, XX ;; AL←XAL←X MOVMOV CLCL ,, 22 SALSAL ALAL ,, CLCL ;; AL←X×4AL←X×4 SUBSUB ALAL ,, YY ;; AL←X×4AL←X×4-- YY SARSAR ALAL ,, 11 ;; AL←(X×4AL←(X×4-- Y)/2Y)/2 MOVMOV ZZ ,, ALAL ;存结果;存结果 MOVMOV AHAH ,, 4CH4CH ;返回;返回 DOSDOS INTINT 21H21H CODECODE ENDSENDS ENDEND BEGINBEGIN

Page 133: 第 一节   8086 指令系统 1

二、 分支程序设计二、 分支程序设计 分支程序是根据逻辑判断结果形成程序的分支程序是根据逻辑判断结果形成程序的

分支,如图,若分支,如图,若 AA 成立,则执行成立,则执行 P1P1 ;否则;否则执行执行 P2P2 。 。

例例 1 1 试编写程序段,实现符号函数。试编写程序段,实现符号函数。 分析:变量分析:变量 XX 的符号函数可表示为:的符号函数可表示为: 1 X>01 X>0 Y= 0 X=0Y= 0 X=0 -1 X<0 -1 X<0 程序可通过对符号标志的判别来确定执行程序可通过对符号标志的判别来确定执行哪一分支。哪一分支。

Page 134: 第 一节   8086 指令系统 1

STARTSTART :: MOVMOV AXAX ,, BUFFER BUFFER ;(;( BUFFERBUFFER ))=X=X

OROR AXAX ,, 0 0 JEJE ZERO ZERO ;; XX == 0,0, 则转则转 ZEROZERO JNSJNS PLUS PLUS ;; XX 为正数,则转为正数,则转 PLUPLU

SS MOVMOV BXBX ,, 0FFFFH 0FFFFH ;; XX 为负数,则-为负数,则- 11 送送

BXBX JMPJMP CONT1CONT1 ZEROZERO :: MOVMOV BXBX ,, 00 JMPJMP CONT1CONT1 PLUSPLUS :: MOVMOV BXBX ,, 11 CONT1CONT1 : ……: ……

Page 135: 第 一节   8086 指令系统 1

例例 2 2 利用表实现分支利用表实现分支根据根据 ALAL 中各位被置位中各位被置位情况,控制转移到情况,控制转移到 88 个个子程序子程序 P1~P8P1~P8 之一中去之一中去

分析:对于这种程序关分析:对于这种程序关键要找出每种情况的转键要找出每种情况的转移地址移地址

表地址表地址 == 表基地址表基地址 ++ 偏偏移量移量 , , 而偏移量可由而偏移量可由 AALL 各位所在位置各位所在位置 *2*2求得。求得。

Page 136: 第 一节   8086 指令系统 1

DATA SEGMENTDATA SEGMENT BASE DW SR0BASE DW SR0 ,, SR1SR1 ,, SR2SR2 ,, SR3SR3 , , SR4SR4 ,,

SR5SR5 ,, SR6SR6 ,, SR7SR7 DATADATA ENDSENDS CODECODE SEGMENTSEGMENT ASSUME CSASSUME CS :: CODECODE ,, DSDS :: DATADATA ,, ESES :: DADA

TATA BEGINBEGIN : : PUSHPUSH DSDS XORXOR AXAX ,, AXAX PUSH PUSH AXAX MOVMOV AXAX ,, DATA DATA MOVMOV DSDS ,, AX AX

LEALEA BXBX ,, BASE BASE ;表头送;表头送 BXBX ININ ALAL ,, PORT PORT GETBITGETBIT :: RCR ALRCR AL ,, 1 1 ;右移一位;右移一位 JC GETAD JC GETAD ;移出位是;移出位是 11??

Page 137: 第 一节   8086 指令系统 1

INCINC BXBX INC BX INC BX ;修改指针;修改指针 JMPJMP GETBIT GETBIT GETADGETAD :: JMP WORDJMP WORD PTR[BX] PTR[BX] ;实现散转;实现散转 CODECODE ENDS ENDS END BEGINEND BEGIN 例例 33 :将内存中某一区域的源数据块传送到另一区:将内存中某一区域的源数据块传送到另一区

域中。域中。 分析:若源数据块与目的数据块之间地址没有重叠,分析:若源数据块与目的数据块之间地址没有重叠,

可直接用传送或串操作实现;若地址重叠,要先判可直接用传送或串操作实现;若地址重叠,要先判断源地址断源地址 ++ 数据块长度是否小于目的地址,是可按数据块长度是否小于目的地址,是可按增量方式进行,否则要修改指针指向数据块底部,增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。 采用减量方式传送。

Page 138: 第 一节   8086 指令系统 1

DATADATA SEGMENTSEGMENT STRSTR DBDB 1000DUP1000DUP (?)(?) STR1STR1EQUEQU STR+7STR+7 STR2STR2EQUEQU STR+25STR+25 STRCOUNT EQU 50STRCOUNT EQU 50 DATADATA ENDSENDS STACKSTACK SEGMENTSEGMENT STAPNSTAPN DBDB 100DUP100DUP (?)(?) STACKSTACK ENDSENDS CODECODE SEGMENTSEGMENT ASSUME CSASSUME CS :: CODECODE ,, DSDS :: DATADATA ,, ESES :: DADA

TATA ,, SSSS :: STACKSTACK

Page 139: 第 一节   8086 指令系统 1

GOO GOO PROCPROC PUSHPUSH DSDS SUBSUB AXAX ,, AX AX PUSHPUSH AXAX MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX MOVMOV ESES ,, AXAX MOVMOV AXAX ,, STACKSTACK MOVMOV SSSS ,, AXAX MOVMOV CXCX ,, STRCOUNTSTRCOUNT MOVMOV SISI ,, STR1STR1 MOVMOV DIDI ,, STR2STR2

Page 140: 第 一节   8086 指令系统 1

CLDCLD PUSHPUSH SISI ADDADD SISI ,, STRCOUNT-1STRCOUNT-1 CMPCMP SISI ,, DIDI POPPOP SISI JLJL OKOK STDSTD ADDADD SISI ,, STRCOUNT-1STRCOUNT-1 ADDADD DIDI ,, STRCOUNT-1STRCOUNT-1 OKOK :: REP MOVSBREP MOVSB RETRET GOOGOO ENDPENDP CODECODE ENDSENDS ENDEND GOOGOO

Page 141: 第 一节   8086 指令系统 1

三、 循环程序设计三、 循环程序设计 循环程序是经常遇到的程序结构,循环结构通循环程序是经常遇到的程序结构,循环结构通常由以下几个部分组成。 常由以下几个部分组成。

11 、循环初始化部分。进行地址指针、循环次、循环初始化部分。进行地址指针、循环次数及标志设置,相关寄存器清零等操作。 数及标志设置,相关寄存器清零等操作。

22 、循环体。重复执行的程序段部分。 、循环体。重复执行的程序段部分。 33 、循环控制部分。修改并判断控制循环的条、循环控制部分。修改并判断控制循环的条件是否满足件是否满足 ,,决定是否继续循环。 决定是否继续循环。

44 、循环结束部分。保存循环运行结果等。、循环结束部分。保存循环运行结果等。

Page 142: 第 一节   8086 指令系统 1

循环程序有两种结构形式,循环程序有两种结构形式,一种是一种是 DO—WHILEDO—WHILE结构,结构,另一种是另一种是 DO—UNTILDO—UNTIL结结构构

前者把循环控制部分放在前者把循环控制部分放在循环体的前面,先判断执循环体的前面,先判断执行循环体的条件,满足条行循环体的条件,满足条件就执行循环体,否则就件就执行循环体,否则就退出循环;后者则是在执退出循环;后者则是在执行循环体之后,再判断循行循环体之后,再判断循环控制条件是否满足,若环控制条件是否满足,若满足条件,则继续执行循满足条件,则继续执行循环操作,否则,则退出循环操作,否则,则退出循环。 环。

Page 143: 第 一节   8086 指令系统 1

例例 4 4 设设 BUFFBUFF开始的单元中存放开始的单元中存放 3030 个个 88 位无符号数,位无符号数, 求它们的和并放在求它们的和并放在 SUMSUM单元中。单元中。 分析:是累加的程序(设计思想同分析:是累加的程序(设计思想同 CC语言):语言): MOV MOV SISI ,, BUFF BUFF ;设地址指针;设地址指针 MOVMOV CXCX ,, 30 30 ;设计数初值;设计数初值 XORXOR AXAX ,, AX AX ;设累加器初值;设累加器初值 AGAINAGAIN :: ADDADD ALAL ,, [SI][SI] ADCADC AHAH ,, 00 INCINC SISI DECDEC CXCX JNZJNZ AGAIN AGAIN ;循环累加;循环累加 MOVMOV SUMSUM ,, AXAX

Page 144: 第 一节   8086 指令系统 1

例例 55 、在给定个数的、在给定个数的 1616 位数串中,找出大于零、位数串中,找出大于零、等于零和小于零的个数,紧跟原串存放。等于零和小于零的个数,紧跟原串存放。

分析:统计问题,设定三个计数器统计结果。分析:统计问题,设定三个计数器统计结果。 DATADATA SEGMENTSEGMENT BUFFBUFF DW X1DW X1 ,, X2X2 ,, X3X3 ,……,,……, XnXn COUNT EQU $-BUFF COUNT EQU $-BUFF PLUSE DB PLUSE DB ?? ZERO DB ZERO DB ?? MINUSMINUS DB DB ?? DATADATA ENDSENDS CODECODE SEGMENTSEGMENT ASSUMEASSUME CSCS :: CODECODE ,, DSDS :: DATADATA ASSUMEASSUME ESES :: DATADATA ,, SSSS :: STACKSTACK

Page 145: 第 一节   8086 指令系统 1

BEGINBEGIN :: MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX MOVMOV CXCX ,, COUNTCOUNT SHRSHR CXCX ,, 1 1 MOVMOV DXDX ,, 0 0 ;设定计数器初值;设定计数器初值 MOVMOV AXAX ,, 0 0 ;设定计数器初值;设定计数器初值 LEALEA BXBX ,, BUFFBUFF AGAINAGAIN : : CMP WORD PTR[BX]CMP WORD PTR[BX] ,, 00 JAEJAE PLU PLU ;大于等于;大于等于 00 ,则转,则转 PIPI

UU INCINC AH AH ;; <0<0 ,则统计,则统计 JMPJMP NEXTNEXT PLUPLU :: JZJZ ZER ZER ;=;= 00 ,则转,则转 ZERZER INCINC DL DL ;; >0>0 ,则统计,则统计 JMPJMP NEXTNEXT

Page 146: 第 一节   8086 指令系统 1

ZERZER :: INCINC DH DH ;=;= 00 ,则统计,则统计 NEXTNEXT :: INCINC BXBX INCINC BXBX LOOPLOOP AGAINAGAIN MOVMOV PLUSPLUS ,, DLDL MOVMOV ZEROZERO ,, DHDH MOVMOV MINUSMINUS ,, AHAH MOVMOV AHAH ,, 4CH4CH INTINT 21H21H CODECODE ENDSENDS ENDEND BEGINBEGIN

Page 147: 第 一节   8086 指令系统 1

第六节 汇编程序设计第六节 汇编程序设计

重点:掌握汇编程序的分析与设计方法重点:掌握汇编程序的分析与设计方法(包括循环程序和子程序)(包括循环程序和子程序)

Page 148: 第 一节   8086 指令系统 1

三、 循环程序设计三、 循环程序设计 例例 6 ADDR6 ADDR 单元中存放着单元中存放着 1616 位数位数 YY 的地的地

址,编写程序,把址,编写程序,把 YY 中中 11 的个数存入的个数存入 COUCOUNTNT 单元中。单元中。

分析:循环统计。采用分析:循环统计。采用 DO—WHILEDO—WHILE 结构,结构,每次将最高位移入每次将最高位移入 CFCF 中进行测试,判断结中进行测试,判断结果是否为果是否为 00 ,是则结束;否则统计后重复。,是则结束;否则统计后重复。

DATADATA SEGMENTSEGMENT ADDRADDR DWDW NUMBERNUMBER NUMBERNUMBER DWDW YY COUNTCOUNT DWDW ?? DATADATA ENDSENDS

Page 149: 第 一节   8086 指令系统 1

PROGRAMPROGRAM SEGMENTSEGMENT MAINMAIN PROCPROC FARFAR ASSUMEASSUME CSCS :: PROGRAMPROGRAM ,, DSDS :: DATADATA STARTSTART :: PUSHPUSH DSDS MOVMOV AXAX ,, 00 PUSHPUSH AXAX MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX MOVMOV CXCX ,, 0 0 MOVMOV BXBX ,, ADDRADDR MOVMOV AXAX ,, [BX] [BX] ;取;取 YY 送送

AXAX

Page 150: 第 一节   8086 指令系统 1

REPEATREPEAT :: TESTTEST AXAX ,, 0FFFFH 0FFFFH ;检测;检测是否为全是否为全 00

JZJZ EXIT EXIT ;是,则转;是,则转 EXITEXIT JNSJNS SHIFT SHIFT ;最高位是;最高位是 00 ,则转,则转 INCINC CX CX ;最高位是;最高位是 11 ,统计计,统计计

数数 SHIFTSHIFT :: SHLSHL AX AX ,, 1 1 ;处理下一位;处理下一位 JMP REPEATJMP REPEAT EXITEXIT :: MOV COUNTMOV COUNT ,, CXCX RETRET MAINMAIN ENDPENDP PROGRAMPROGRAM ENDSENDS ENDEND STARTSTART

Page 151: 第 一节   8086 指令系统 1

例例 77 、在数据段从、在数据段从 BUFFERBUFFER 开始顺序存放开始顺序存放100100 个无符号个无符号 1616 位数,编程从大到小排序。位数,编程从大到小排序。

分析:采用冒泡法 分析:采用冒泡法 LEA DILEA DI ,, BUFFER BUFFER ;; DIDI 作为指针 作为指针

MOVMOV BLBL ,, 99 99 ;循环控制初值;循环控制初值 NEXT0NEXT0 :: MOVMOV SISI ,, DIDI MOVMOV CLCL ,, BLBL NEXT3NEXT3 :: MOVMOV AXAX ,, [SI] [SI] ;取数;取数 ADDADD SISI ,, 22

Page 152: 第 一节   8086 指令系统 1

CMP AXCMP AX ,, [SI] [SI] ;与下一个数进行比;与下一个数进行比较较

JNCJNC NEXT5 NEXT5 ;大于等于时转移;大于等于时转移 MOVMOV DXDX ,, [SI] [SI] ;否则,两数交;否则,两数交换换

MOVMOV [SI-2][SI-2] ,, DXDX MOVMOV [SI][SI] ,, AXAX NEXT5NEXT5 :: DEC CL DEC CL ;控制进行交换的次数;控制进行交换的次数 JNZJNZ NEXT3NEXT3 DECDEC BL BL ;修改交换的次数;修改交换的次数 JNZJNZ NEXT0NEXT0 HLTHLT

Page 153: 第 一节   8086 指令系统 1

四、 子程序设计四、 子程序设计子程序是程序设计中常用程序结构,把固子程序是程序设计中常用程序结构,把固定的、经常用的功能做成子程序的形式,定的、经常用的功能做成子程序的形式,可使源程序及目标程序缩短,提高程序设可使源程序及目标程序缩短,提高程序设计的效率和可靠性。计的效率和可靠性。

子程序的入口参数由主程序传给子程序,子程序的入口参数由主程序传给子程序,出口参数是子程序完成运算传给主程序的出口参数是子程序完成运算传给主程序的结果。结果。

子程序用到的寄存器和存储单元需要保护,子程序用到的寄存器和存储单元需要保护,避免影响返回后主程序的运行。避免影响返回后主程序的运行。

Page 154: 第 一节   8086 指令系统 1

参数传递有三种方法:参数传递有三种方法: (1) (1) 利用寄存器。这是一种最常见方法,把利用寄存器。这是一种最常见方法,把

需传递的参数直接放在寄存器中传递给子程需传递的参数直接放在寄存器中传递给子程序。序。

(2) (2) 利用存储单元。这种参数传递方法,把利用存储单元。这种参数传递方法,把所需传递的参数直接放在子程序调用指令代所需传递的参数直接放在子程序调用指令代码之后。码之后。

(3) (3) 利用堆栈。这种方法将参数压入堆栈,利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。在子程序运行时从堆栈中取参数。

例例 88 、两个、两个 66 字节数相加。字节数相加。 分析:将字节相加的程序段设计为子程序。分析:将字节相加的程序段设计为子程序。主程序调用该子程序,每次调用的参数不同。主程序调用该子程序,每次调用的参数不同。

Page 155: 第 一节   8086 指令系统 1

DATADATA SEGMENTSEGMENT ADD1ADD1 DBDB FEHFEH ,, 86H86H ,, 7CH7CH ,, 35H35H ,, 68H68H ,, 77

7H7H ADD2ADD2 DBDB 45H45H ,, BCHBCH ,, 7DH7DH ,, 6AH6AH ,, 87H87H ,,

90H90H SUMSUM DB 6DUPDB 6DUP (( 00 )) COUNTCOUNT DBDB 66 DATADATA ENDSENDS STACKSTACK SEGMENTSEGMENT DBDB 100DUP100DUP (?)(?) STACKSTACK ENDSENDS CODECODE SEGMENTSEGMENT

ASSUME CSASSUME CS :: CODECODE ,, DSDS :: DATADATA ,, SSSS :: STACKSTACK

Page 156: 第 一节   8086 指令系统 1

MADDMADD :: MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX MOVMOV AXAX ,, STACKSTACK MOVMOV SSSS ,, AXAX MOVMOV SISI ,, OFFSET ADD1OFFSET ADD1 MOVMOV DIDI ,, OFFSET ADD2OFFSET ADD2 MOVMOV BXBX ,, OFFSET SUMOFFSET SUM MOVMOV CXCX ,, COUNT COUNT CLCCLC AGAINAGAIN :: CALL SUBADDCALL SUBADD LOOP AGAIN LOOP AGAIN MOVMOV AH AH ,, 4CH4CH INTINT 21H21H

Page 157: 第 一节   8086 指令系统 1

SUBADDSUBADD PROC PROC PUSH AXPUSH AX MOVMOV AL AL ,, [SI] [SI] ADCADC AL AL ,, [DI] [DI] MOVMOV [BX] [BX] ,, AL AL INCINC SISI INC DIINC DI INCINC BXBX POP AXPOP AX RETRET SUBADDSUBADD ENDPENDP CODECODE ENDSENDS END MADDEND MADD

Page 158: 第 一节   8086 指令系统 1

例例 99 、把字变量、把字变量 NUMBERNUMBER 的值,转换为的值,转换为 44个个 ASCIIASCII 码表示的十六进制数码串,串的起码表示的十六进制数码串,串的起始地址为始地址为 STRINGSTRING 。。

分析:把内存中的字变量分析:把内存中的字变量 NUMBERNUMBER 的值转的值转换为换为 44 个个 ASCIIASCII 码表示的十六进制数码串的码表示的十六进制数码串的工作设计成子程序,在这个子程序中再调用工作设计成子程序,在这个子程序中再调用完成从“完成从“ BCD”BCD” 码到码到 ASCIIASCII 码转换的子程序。码转换的子程序。

STACK SEGMENTSTACK SEGMENT DB 100 DUP(?)DB 100 DUP(?) STACK ENDSSTACK ENDS

Page 159: 第 一节   8086 指令系统 1

DATADATA SEGMENTSEGMENT NUMBERNUMBER DW DW 25AFH25AFH STRINGSTRING DBDB 4DUP4DUP (?),(?), 0DH0DH ,, 0A0A

HH ,‘,‘ $’ $’ DATADATA ENDSENDS CODECODE SEGMENTSEGMENT ASSUMEASSUME CSCS :: CODECODE ,, DSDS :: DATADATA SS:STACKSS:STACK BEGINBEGIN :: MOVMOV AXAX ,, DATADATA MOVMOV DSDS ,, AXAX MOVMOV ESES ,, AXAX

Page 160: 第 一节   8086 指令系统 1

LEALEA BXBX ,, STRINGSTRING PUSH BX PUSH BX PUSH NUMBER PUSH NUMBER

CALL BINHEXCALL BINHEX LEALEA DIDI ,, STRINGSTRING MOVMOV AHAH ,, 99 INTINT 21H21H MOVMOV AHAH ,, 4CH4CH INTINT 21H 21H

Page 161: 第 一节   8086 指令系统 1

BINHEX BINHEX PROC PROC PUSHPUSH BPBP MOVMOV BP BP ,, SPSP PUSHPUSH AXAX PUSHPUSH DIDI PUSHPUSH CXCX PUSHPUSH DXDX PUSHF PUSHF MOVMOV AX AX ,, [BP+2] [BP+2] MOVMOV DI DI ,, [BP+4] [BP+4] ADDADD DIDI ,, 33 MOV DXMOV DX ,, AX AX MOVMOV CXCX ,, 44

Page 162: 第 一节   8086 指令系统 1

AGAINAGAIN :: ANDAND AXAX ,, 000FH 000FH CALLCALL HEXD HEXD STDSTD STOSB STOSB PUSHPUSH CX CX MOVMOV CLCL ,, 44 SHRSHR DXDX ,, CLCL MOVMOV AXAX ,, DXDX POPPOP CXCX LOOPLOOP AGAINAGAIN POPFPOPF POPPOP DXDX POPPOP CXCX

Page 163: 第 一节   8086 指令系统 1

POPPOP DIDI POPPOP AXAX POPPOP BPBP RETRET 44 BINHEXBINHEX ENDPENDP HEXDHEXD PROC PROC CMPCMP ALAL ,, 0AH0AH JLJL ADDZADDZ ADD ALADD AL ,, 07H 07H ADDZADDZ :: ADDADD ALAL ,‘,‘ 0’ 0’ RETRET HEXDHEXD ENDP ENDP CODECODE ENDSENDS EDNEDN BEGINBEGIN