微机原理与接口技术汇编语言指令详解吐血版

第一讲

第三章 指令系统--寻址方式

回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过

程。

重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及

有效地址的计算。

讲授内容:

3.1 8086/8088寻址方式

首先,简单讲述一下指令的一般格式:

计算机中的指令由操作码字段和操作数字段组成。

操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。

寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址

所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。

例如:MOV AX,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。

立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址

操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS 加上这16位地址偏移量。如图2-2所示。

例如: MOV AX,DS :[2000H];

图2-2

(对DS 来讲可以省略成 MOV AX,[2000H], 系统默认为数据段) 这种寻址方法是以数据段的地址为基础,可在多达64KB 的范围内寻找操作数。

8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS 或SS 或ES 相加,作为操作数的地址。

MOV AX,[2000H] ;数据段

MOV BX,ES :[3000H] ;段超越,操作数在附加段

即绝对地址=(ES )*16+3000H

3.寄存器寻址

操作数包含在CPU 的内部寄存器中,如寄存器AX 、BX 、CX 、DX 等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址

操作数是在存储器中,但是,操作数地址的16

位偏移量包含在以下四个寄

存器SI 、DI 、BP 、BX 之一中。可以分成两种情况: (1) 以SI 、DI 、BX 间接寻址,则

通常操作数在现行数据段区域中,即数据段寄存器(DS )*16加上SI 、DI 、BX 中的16位偏移量,为操作数的地址, 例如: MOV AX, [SI] 操作数地址是:(DS )*16+(SI )

(2) 以寄存器BP 间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS )

*16与BP 的内容相加作为操作数的地址,

例如:MOV AX,[BP] 操作数地址是:(SS )*16+(BP )

若在指令中规定是段超越的,则BP 的内容也可以与其它的段寄存器相加,形成操作数地址。

例如: MOV AX,DS :[BP] 操作数地址是:(DS )*16+(BP ) 5.变址寻址

由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个段寄存器作为地址基准)作为操作数的偏移地址。(操作数在存贮器中)

可以作为寄存器变址寻址的四个寄存器是SI 、DI 、BX 、BP 。

⑴若用SI 、DI 和BX 作为变址,则与数据段寄存器相加,形成操作数的地址即默认在数据段;

⑵若用BP 变址,则与堆栈段寄存器相加,形成操作数的地址即默认在堆栈段

例如: MOV AX,COUNT[SI];

操作数地址是:(DS )*16+(SI )+COUNT

但是,只要在指令中指定是段超越的,则可以用别的段寄存器作为地址基准。 6.基址加变址寻址

把BX 和BP 看成是基址寄存器,把SI 、DI 看着是变址寄存器,把一个基址寄存器(BX 或BP )的内容加上一个变址寄存器(SI 或DI )的内容,再加上指令中指定的8位或16位偏移量(当然要以一个段寄存器作为地址基准)作为操作

数的偏移地址,如图所示。

操作数在存贮器中,其偏移地址由(基址寄存器)+(变址寄存器)+相对偏移量形成

基址寄存器――BX :数据段、BP :堆栈段; 变址寄存器――SI 、DI 。

例如:MOV AX,[BX][SI] 或 MOV AX,[BX+SI]

也可放置一个相对偏移量,如COUNT 、MASK 等等,用于表示相对寻址。 MOV AX,MASK[BX][SI]

MOV BH,COUNT[DI][BP];MOV BH,COUNT[BP+DI] ✧ 若用BX 作为基地址,则操作数在数据段区域 ✧ 若用BP 作为基地址,则操作数在堆栈段区域

但若在指令中规定段是超越的,则可用其它段寄存器作为地址基准。

P.28 表2-1 段寄存器使用的基本约定

习题与思考:

1.假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL 的偏移地址为0050H ,请指出下列指令源操作数是什么寻址方式?其物理地址是多少?

(1)MOV AX,0ABH (2)MOV AX ,[100H] (3)MOV AX ,VAL (4)MOV BX ,[SI] (5)MOV AL ,VAL[BX] (6)MOV CL ,[BX][SI] (7)MOV VAL[SI],BX (8)MOV [BP][SI],100

2.已知SS=0FFA0H,SP=00B0H,先执行两条把8057H 和0F79H 分别进栈的PUSH 指令,再执行一条POP 指令,试画出堆栈区和SP 内容变化的过程示意图。(标出存储单元的地址)

第二讲

3.2 指令系统--数据传输、算术运算

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程。

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解指令的功能,掌握数据传送类,算术运算类指令的使用方法。(掌握指令内涵,会用)

讲授内容:

3.2 8086/8088 指令系统

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

1.数据传送(Data Transter) 2.算术运算(Arithmetic) 3.逻辑运算(Logic) 4.串操作(String menipulation) 5.程序控制(Program Control) 6.处理器控制(Processor Control)

一、数据传送指令

主要介绍 MOV,XCHG 、堆栈和地址传送指令。

1.数据传送MOV 指令

一般格式:MOV OPRD1,OPRD2

MOV 是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。 功能:完成数据传送

具体来说,一条数据传送指令能实现:

⑴CPU 内部寄存器之间数据的任意传送(除了代码段寄存器CS 和指令指针IP 以外) 。

MOV AL,BL ;字节传送 MOV CX,BX ;字传送 MOV DS,BX

⑵立即数传送至CPU 内部的通用寄存器组(即AX 、 BX、CX 、DX 、BP 、SP 、SI 、DI) ,

MOV CL,4 MOV AX,03FFH MOV SI,057BH

⑶CPU 内部寄存器(除了CS 和IP 以外) 与存储器(所有寻址方式) 之间的数据传送。

MOV AL,BUFFER MOV AX,[SI] MOV [DI],CX MOV SI,BLOCK[BP] MOV DS,DATA[SI+BX] MOV DEST[BP+DI],ES

⑷ 能实现用立即数给存储单元赋值

例如:MOV [2000H],25H

MOV [SI],35H

对于MOV 指令应注意几个问题:

①存储器传送指令中,不允许对CS 和IP 进行操作;

②两个操作数中,除立即寻址之外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;

如我们需要把地址(即段内的地址偏移量) 为AREAl 的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中去,MOV 指令不能直接完成这样的传送,但我们可以用CPU 内部寄存器为桥梁来完成这样的传送: MOV AL,AREAl

MOV AREA2,AL

③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;如:MOV AX ,0;MOV DS ,AX ④目的操作数,不能用立即寻址方式。

2.堆栈指令

(简述堆栈的概念及存取特点,如先进后出)

包括入栈(PUSH )和出栈(POP )指令两类。仅能进行字运算。(操作数不能是立即数) ⑴ 入栈指令PUSH 一般格式:PUSH OPRD

源操作数可以是CPU 内部的16位通用寄存器、段寄存器(CS 除外)和内存操作数(所有寻址方式)。入栈操作对象必须是16位数。 功能:将数据压入堆栈

执行步骤为:SP=SP-2;[SP]=操作数低8位;[SP+1]= 操作数高8位

例如:PUSH BX

执行过程为:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如图2-8所示。 ⑵ 出栈指令POP 一般格式:POP OPRD 功能:将数据弹出堆栈

对指令执行的要求同入栈指令。

例如:POP AX 图2-8

POP [BX] POP DS

3.交换指令 XCHG

一般格式:XCHG OPRD1,OPRD2 功能:完成数据交换

这是—条交换指令,把一个字节或一个字的源操作数与目的操作数相交换。交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间

进行。但段寄存器和立即数不能作为一个操作数,不能在累加器之间进行。 例如: XCHG AL,CL

XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER XCHG DATA[SI],DH

4.累加器专用传送指令

有三种,输入、输出和查表指令。前两种又称为输入输出指令。 ⑴ IN 指令

一般格式:IN AL,n ; B AL←[n]

IN AX,n ; W AX←[n+1][n] IN AL,DX ; B AL←[DX] IN AX,DX ; W AX←[DX+1][DX]

功能:从I/O端口输入数据至AL 或AX 。

输入指令允许把一个字节或一个字由一个输入端口传送到AL 或AX 中。若端口地址超过255时,则必须用DX 保存端口地址,这样用DX 作端口寻址最多可寻找64K 个端口。 ⑵ OUT 指令

一般格式:OUT n,AL ; B AL→[n] OUT n,AX ; W AX→[n+1][n]

OUT DX,AL ; B AL→[DX] OUT DX,AX ; W AX→[DX+1][DX]

功能:将AL 或AX 的内容输出至I/O端口。

该指令将AL 或AX 中的内容传送到一个输出端口。端口寻址方式与IN 指令相同。 ⑶ XLAT指令

一般格式:XLAT ; AL=(DX )×16+(BX )+(AL )) 功能:完成一个字节的查表转换。

要求:①寄存器AL 的内容作为一个256字节的表的下标。②表的基地址在BX 中,③转换后的结果存放在AL 中. TABLE:例如:MOV BX,OFFSET TABLE

MOV AL,8 ……

IN AL,1 第9个字符 AAH XLAT ;查表

OUT 1,AL ;(AL )= AAH 表长度256本指令可用在数制转换、函数表查表、代码转换等场合。

5.地址传送指令(有三条地址传送指令) ⑴ LEA (Load Effective Address) 一般格式: LEA OPRD1,OPRD2

功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。

要求:①源操作数必须是一个内存操作数,②目的操作数必须是一个16位的通

用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。 例:LEA BX,BUFR ;把变量BUFR 的地址偏移量部分送到BX

⑵ LDS (Load pointer into DS) 一般格式: LDS OPRD1,OPRD2

功能:完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址送入DS ,偏移量部分送入一个16位的指针寄存器或变址寄存器。

要求:源操作数是一个内存操作数,目的操作数是一个通用寄存器/变址寄存器。

例如:LDS SI,[BX] ;将把BX 所指的32位

地址指针的段地址部分送入DS ,偏移量部分送入SI 。图2-9 LDS指令示意

如图2-9所示。

⑶ LES (Load pointer into ES) 一般格式: LES OPRD1,OPRD2

这条指令除将地址指针的段地址部分送入ES 外,与LDS 类似。例如: LES DI ,[BX+COUNT]

6.标志寄存器传送(有四条标志传送指令) ⑴ LAHF (LOAD AH WITH FLAG)

将标志寄存器中的SF 、ZF 、AF 、PF 和CF (即低8位)传送至AH 寄存器的指定位,空位没有定义。

⑵ SAHF (STORE AH WITH FLAG)

将寄存器AH 的指定位,送至标志寄存器的SF 、ZF 、AF 、PF 和CF 位(即低8位)。根据AH 的内容,影响上述标志位,对OF 、DF 和IF 无影响。 ⑶ PUSHF (PUSH FLAG)

将标志寄存器压入堆栈顶部,同时修改堆栈指针,不影响标志位。 ⑷ POPF (POP FLAG)

堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。

二、算术运算指令

8086/8088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。 带符号数用补码表示。同时

8086/8088也提供了各种校正操作,故可以进行十进制算术运算。

参与加、减运算的操作数可如上图所示。 1.加法指令 (Addition)

⑴一般形式:ADD OPRD1,OPRD2

功能:OPRD1←OPRD1+OPRD2

完成两个操作数相加,结果送至目的操作数OPRD1。目的操作数可以是累加器,任一通用寄存器以及存储器操作数。 例如:

ADD AL ,30;累加器与立即数相加

ADD BX ,[3000H];通用寄存器与存储单元内容相加 ADD DI ,CX ;通用寄存器之间

ADD DX ,DATA[BX+SI];通用寄存器与存储单元内容相加 ADD BETA[SI],DX ;存储器操作数与寄存器相加 这些指令对标志位CF 、DF 、PF 、SF 、ZF 和AF 有影响。

⑵一般形式:ADC OPRD1,OPRD2;带进位的加法

功能:OPRD1←OPRD1+OPRD2 +CF

这条指令与上—条指令类似,只是在两个操作数相加时,要把进位标志CF 的现行值加上去,结果送至目的操作数。

ADC 指令主要用于多字节运算中。若有两个四字节的数,已分别放在自FIRST 和SECOND 开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。

MOV AX,FIRST

ADD AX,SECOND ;进行字运算 MOV THIRD,AX MOV AX,FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX

这条指令对标志位的影响与ADD 相同。 ⑶一般形式:INC OPRD ;

功能:OPRD ←OPRD+1

完成对指定的操作数OPRD 加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。

这条指令执行的结果影响标志位AF 、OF 、PF 、SF 和ZF ,而对进位标志没有影响。

如:INC AL

INC [BX]

2.减法指令(Subtraction) ⑴一般形式:SUB OPRD1,OPRD2 ;

功能:OPRD1←OPRD1-OPRD2

完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。 例如: SUB CX ,BX

SUB [BP],CL

⑵一般形式:SBB OPRD1,OPRD2 ;

功能:OPRD1←OPRD1-OPRD2-CF

这条指令与SUB 类似,只是在两个操作数相减时,还要减去借位标志CF 的现行值.本指令对标志位AF 、CF 、OF 、PF 、SF 和ZF 都有影响。

同ADC 指令一样,本指令主要用于多字节操作数相减。 ⑶一般形式:DEC OPRD ;

功能:OPRD ←OPRD-1-CF

对指令的操作数减1,然后送回此操作数,

在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF 、OF 、PF 、SF 和ZF .但对CF 标志不影响(即保持此指令以前的值) 。

例如: DEC [SI] DEC CL ⑷一般形式:NEG OPRD

功能: (NEGDate) 取补

对操作数取补,即用零减去操作数,再把结果送回操作数。 例如: NEG AL NEG MULRE

(AL =0011 1100)则取补后为1100 0100 即0000 0000-0011 1100=1100 0100

若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF 置位。

此指令影响标志AF 、CF 、OF 、PF 、SF 和ZF 。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。 ⑸一般形式:CMP OPRD1,OPRD2 ;

功能: OPRD1-OPRD2

比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法) 。 例如: CMP AL,100

CMP DX,DI CMP CX,COUHT[BP] CMP COUNT[SI],AX

比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF 标志即可判断两者是否相等。 相等的比较:

①若两者相等,相减以后结果为零,ZF 标志为1,否则为0。

②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的

大小。

大小的比较:

如果是两个无符号数(如CMP AX ,BX )进行比较,则可以根据CF 标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX ≥BX ;若产生了借位(即CF =1),则AX <BX 。

习题与思考:

1.设有关寄存器及存储单元的内容如下:

DS=2000H,BX=0100H,AX=1200H,SI=0002H,[20100H]=12H,[20101H]=34H,[20102H]=56H,[20103]=78H,[21200]=2AH,[21201H]=4CH,[21202H]=0B7H,[21203H]=65H。 试说明下列各条指令单独执行后相关寄存器或存储单元的内容。 (1)MOV AX ,1800H (2)MOV AX ,BX

(3)MOV BX ,[1200H] (4)MOV DX ,1100[BX]

(5)MOV [BX][SI],AL (6)MOV AX ,1100[BX][SI] 2.写出实现下列计算的指令序列。(假定X 、Y 、Z 、W 、R 都为字变量) (1)Z=W+(Z+X) (2)Z=W-(X+6)-(R+9) 3.若在数据段中从字节变量TABLE 相应的单元开始存放了0~15的平方值,试写出包含有XLAT 指令的指令序列查找N (0~15)中的某个数的平方。(设N 的值存放在CL 中)

第三讲

3.3 指令系统-算术运算、逻辑运算、控制转移

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程。

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解指令的功能,掌握算术运算类、逻辑运算

和移位指令的功能和应用。(掌握指令内涵,会用)

讲述内容:

3.乘法指令(分为无符号乘法指令和带符号乘法指令两类)

(1) 无符号乘法指令MUL 一般格式: MUL OPRD

完成字节与字节相乘、字与字相乘,且默认的操作数放在AL 或AX 中,而源操作数由指令给出。8位数相乘,结果为16位数,放在AX 中;16位数相乘结果为32位数,高16位放在DX ,低16位放在AX 中。注意:源操作数不能为立即数。 例如:

MOV AL,FIRST ;

MUL SECOND ;结果为AX=FIRST*SECOND MOV AX,THIRD ;

MUL AX ;结果DX :AX=THIRD*THIRD MOV AL,30H

CBW ; 字扩展AX=30H MOV BX,2000H MUL BX ; (2) 带符号数乘法指令IMUL

一般格式:IMUL OPRD ;OPRD 为源操作数

这是一条带符号数的乘法指令,同MUL 一样可以进行字节与字节、字和字的乘法运算。结果放在AX 或DX ,AX 中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF 和OF 将置位。

4.除法指令

(1) 无符号数除法指令 DIV 一般格式:DIV OPRD (2) 带符号数除法IDIV 一般格式:IDIV OPRD

该指令执行过程同DIV 指令,但IDIV 指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。

在除法指令中,在字节运算时被除数在AX 中;运算结果商在AL 中,余数在AH 中。字运算时被除数为DX :AX 构成的32位数,运算结果商在AX 中,余数在DX 中。

例如:AX=2000H,DX=200H,BX=1000H,则 DIV BX 执行后,AX=2002H ,DX=0000。

除法运算中,源操作数可为除立即寻址方式之外的任何一种寻址方式,且指令执行对所有的标志位都无定义。

由于除法指令中的字节运算要求被除数为16位数,而字运算要求被除数是32位数,在8086/8088系统中往往需要用符号扩展的方法取得被除数所要的格式,因此指令系统中包括两条符号扩展指令。

(3) 字节扩展指令CBW 一般格式:CBW

该指令执行时将AL 寄存器的最高位扩展到AH ,即若D7=0,则AH=0;否则AH=0FFH。

(4) 字扩展指令CWD 一般格式:CWD

该指令执行时将AX 寄存器的最高位扩展到DX ,即若D15=0,则DX=0;否则DX=0FFFFH。

CBW 、CWD 指令不影响标志位。 5.十进制调整指令

计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。为此在8086/8088系统中,针对十进制算术运算有一类十进制调整指令。

在计算机中人们用BCD 码表示十进制数,对BCD 码计算机中有两种表示方法:一类为压缩BCD 码,即规定每个字节表示两位BCD 数;另一类称为非压缩BCD 码,即用一个字节表示一位BCD 数,在这字节的高四位用0填充。例如,十进制数25D ,表示为压缩BCD 数时为:25H ;表示为非压缩BCD 数时为:0205H ,用两字节表示。

相关的BCD 转换指令见表2-2。

例如:

ADD AL,BL

DAA

表2-2 十进制调整指令

若执行前:AL=28H,BL=68H,则执行ADD 后:AL=90H,AF=1;再执行DAA 指令后,正确的结果为:AL=96H,CF=0,AF=1。

MUL BL AAM

若执行前:AL=07,BL=09,则执行MUL BL

后,AX=003FH,再执行AAM 指令后,正确的结果为:AH=06H,AL=03H。

注意:BCD 码进行乘除法运算时,一律使用无符号数形式,因而AAM 和AAD 应固定地出现在MUL 之前和DIV 之后。

三、 逻辑运算和移位指令 包括逻辑运算、移位和循环移位指令

1.逻辑运算指令 (1) 一般格式:NOT OPRD

功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL

(2) 一般格式:AND OPRD1,OPRD2

功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。 其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式) 。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。

8086/8088的AND 指令可以进行字节操作,也可以进行字操作。 例如: AND AL,0FH ;可完成拆字的动作 AND SI ,SI ; 将SI 清0 (3) 一般格式:TEST OPRD1,OPRD2

功能:完成与AND 指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试,

例如 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令: TEST AL ,01H

JNZ THERE …… THERE :

若要检测CX 中的内容是否为0,为0则转移。该如何做呢? (4) 一般格式:OR OPRD1,OPRD2

功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式) 。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。

AND AL,0FH AND AH,0FOH OR OR OR

AL ,AH ; 完成拼字的动作 AX ,0FFFH ;将AX 低12位置1 BX ,BX ; 清相应标志

(5) 一般格式:XOR OPRD1,OPRD2

功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式) 。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。例如:

XOR AL ,AL ;使AL 清0 XOR SI ,SI ;使SI 清0

XOR CL,0FH ;使低4位取反,高4位不变

逻辑运算类指令中,单操作数指令NOT 的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT 不影响标志位,其它四种指令将使CF=OF=0,AF 无定义,而SF 、ZF 和PF 则根据运算结果而定。

2.移位指令

(1)算术/逻辑移位指令 ① 算术左移或逻辑左移指令

SAL /SHL OPRD,M ;

② 算术右移指令 SAR OPRD,M ③ 逻辑右移指令 SHR OPRD,M M 是移位次数,可以是1或寄存器CL

这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL 中的内容规定的次数 (2)循环移位指令

ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位 RCR OPRD,M ;带进位右循环移位 前两条循环指令,未把标志位CF 包含在循环的环中,后两条把标志位CF 包含在循环的环中,

作为整个循环的一部分。

循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL 的内容所决定的次数。

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

在数的输入输出过程中乘10的操作是经常要进行的。而X10=X*2+X*8,也可以采用移位和相加的办法来实现*10。为保证结果完整,先将AL 中的字节扩展为字。

MOV AH,0 SAL AX,1 ;X*2 MOV BX,AX ;移至BX 中暂存 SAL AX,1 ;X*4 SAL AX,1 ;X*8 ADD AX,BX ;X*10

例1 BCD码转换为ASCII 码

若在内存某一缓冲区中存放着若干个单元的用BCD 码表示的十进制数。每—个单元中放两位BCD 码,要求把它们分别转换为ASCII 码。高位的BCD 码转换完后放在地址较高的单元。 分析:转换公式:ASCII =BCD+30H

算法:源串和目的串的表首分别设两个指针。取BCD 转ASCII 后存入(先低位,后高位) MOV MOV MOV MOV AND OR MOV INC MOV MOV SHR OR MOV POP INC

SI ,OFFSET BCDBUFF;设置源地址指针 CX ,COUNT ;设计数初值 DI ,OFFSET ASCBUF ;设置目的地址指针 BL ,AL

AL ,0FH ;取低位BCD 码 AL ,30H ;转换成ASCII 码 [DI],AL ;存入

DI ;修改指针 AL ,BL CL ,4

AL ,CL

AL ,30H ;高位转换成ASCII 码 [DI],AL ;存入

CX

DI

SI ;修改指针

AGAIN :MOV AL ,[SI]

PUSH CX

INC

LOOP AGAIN ;重复工作

习题与思考:

1.写出实现下列计算的指令序列。(假定X 、Y 、Z 、W 、R 都为字变量) (1)Z=(W*X)/(R+6) (2)Z=((W-X )/5*Y)*2

2.假定DX=[**************]1B,CL=3,CF=1,试确定下列各条指令单独执行后DX 的值。 (1)SHR DX ,1 (2)SHL DL ,1 (3)SAL DH ,1 (4)SAR DX ,CL (5)ROR DX ,CL (6)ROL DL ,CL

(7)RCR DL ,1 (8)RCL DX ,CL 3.试分析下列程序完成什么功能? MOV CL ,4 SHL DX ,CL MOV BL ,AH SHL BL ,CL SHR BL ,CL OR DL ,BL 4.已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX

INT 20H 试问:(1)每条指令执行后,AX 寄存器的内容是什么?(2)每条指令执行后,CF ,SF 及ZF 的值分别是什么?(3)程序运行结束时,AX 及DX 寄存器的值为多少?

第四讲:

3.4 指令系统-循环、子程序调用、中断、其他

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解串操作指令的功能。指令系统-循环、子

程序调用、中断、其他(掌握指令内涵,会用)

讲授内容:

四、 串操作类指令 (选讲或简单介绍)

串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。

1.重复指令前缀

串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2-3所示。

表2-3重复前缀

2.串指令

串指令共有五种,具体见表2-4。

对串指令要注意以下几个问题:

(1) 各指令所使用的默认寄存器是:SI (源串地址),DI (目的地址),CX (字串长度),AL (存取或搜索的默认值)。

(2) 源串在数据段,目的串在附加段。

表2-4 串操作指令

(3) 方向标志与地址指针的修改。DF =1,则修改地址指针时用减法;DF=0时,

则修改地址指针时用加法,

MOVS 、STOS 、LODS 指令不影响标志位。

· MOVS指令的功能,

把数据段中由SI 间接寻址的一个字节(或一个字) 传送到附加段中由DI 间接寻址的一个字节单元(或一个字单元) 中去,然后,根据方向标志DF 及所传送数据的类型(字节或字) 对SI 及DI 进行修改,在指令重复前缀REP 的控制下,可将数据段中的整串数据传送到附加段中去。

例2 在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;M ESS2为附加段中用以存放字符串区域的首地址。

实现上述功能的程序段如下:

LEA SI,MESS1 ;置源串偏移地址 LEA DI,MESS2 ;置目的串偏移地址 MOV CX,17 ;置串长度

CLD ;方向标志复位

REP MOVSB ;字符串传送

其中,最后一条指令也可写成

REP MOVS ES:BYTE PTR[DI],DS :[SI]

或 REP MOVS MESS2,MESS1

· CMPS指令的功能,

把数据段中由SI 间接寻址的一个字节(或一个字) 与附加段中由DI 间接寻址

的一个字节(或一个字) 进行比较操作,使比较的结果影响标志位,然后根据方向标志DF 及所进行比较的操作数类型(字节或字) 对SI 及DI 进行修改,在指令重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字) ,或者第一个相等的字节(或字) 。

例3 在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。 实现上述功能的程序段如下;

LEA SI,MESS1 ;装入源串偏移地址

LEA DI,MESS2 ;装入目的串偏移地址 MOV CX,17 ;装入字符串长度 CLD ;方向标志复位

REPE CMPSB

上述程序段执行之后,SI 或DI 的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符.则当比较完毕后,CX =0,退出重复操作状态。

· SCAS指令的功能,

用由指令指定的关键字节或关键字(分别存放在AL 及AX 寄存器中) ,与附加段中由DI 间接寻址的字节串(或字串) 中的一个字节(或字) 进行比较操 作,使比较的结果影响标志位,然后根据方向标志DF 及所进行操作的数据类型(字节或字) 对DI 进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字) 匹配的字节(或字) ,或者搜索第一个与关键字节(或字) 不匹配的字节(或字) 。

例4 在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H) 。

实现上述功能的程序段如下:

LEA DI,MESS2 ;装入目的串偏移地址 MOV AL,20H ;装入关键字节 MOV CX,17 ;装入字符串长度 REPNE SCASB

上述程序段执行之后,DI 的内容即为相匹配字符的下一个字符的地址,CX 中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字) ,则当查完之后(CX)=0退出重复操作状态。

· STOS指令的功能,

把指令中指定的一个字节或一个字(分别存放在AL 及AX 寄存器中) ,传送到附加段中由DI 间接寻址的字节内存单元(或字内存单元) 中去,然后,根据方向标志DF 及所进行操作的数据类型(字节或字) 对DI 进行修改操作。在指令重复前缀的控制下,可连续将AL (AX )的内容存入到附加段中的一段内存区域中去,该指令不影标志位。

例5 要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可用

下列程序段实现:

LEA DI,MESS2 ;装入目的区域偏移地址 MOV AL,00H ;为清零操作准备 MOV CX,5 ;设置区域长度 REP STOSB

· LODS指令的功能, 从串中取指令实现从指定的字节串(或字串) 中读出信息的

操作。

例6 比较DEST 和SOURCE 中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE 中的这个数送AL 中。

CLD

LEA DI,ES :DEST

LEA SI,SOURCE

MOV CX,500

REPE CMPSB

JCXZ NEXT

MATCH :DEC SI

MOV AL,BYTE PTR[SI]

NEXT :

五、 程序控制指令

转移类指令可改变CS 与IP 的值或仅改变IP 的值,以改变指令执行的顺序。

1.无条件转移、调用和返回指令

(1) 无条件转移指令JMP 分直接转移和间接转移两种。

一般格式: JMP OPRD ;OPRD 是转移的目的地址

直接转移的3种形式为:

· 短程转移 JMP SHORT OPRD ;IP=IP+8位位移量

目的地址与JMP 指令所处地址的距离应在-128~127范围之内。

· 近程转移 JMP NEAR PTR OPRD ;IP=IP+16位位移量

或 JMP OPRD ;NEAR 可省略

目的地址与JMP 指令应处于同一地址段范围之内。

· 远程转移 JMP FAR PTR OPRD ;IP=OPRD的段内位移量,CS=OPRD所在段地址。

远程转移是段间的转移,目的地址与JMP 指令所在地址不在同一段内。执行该指令时要修改CS 和IP 的内容。

间接转移指令的目的地址可以由存储器或寄存器给出。

· 段内间接转移 JMP WORD PTR OPRD ;IP=[EA] (由OPRD 的寻址方式确定)。

JMP WORD PTR[BX] IP=((DS )*16+(BX ))

JMP WORD PTR BX IP=(BX )

· 段间间接转移 JMP DOWRD PTR OPRD;IP=[EA],CS=[EA+2]

该指令指定的双字节指针的第一个字单元内容送IP ,第二个字单元内容送CS 。

JMP DWORD PTR [BX+SI]

(2) 调用和返回指令

CALL 指令用来调用一个过程或子程序。由于过程或子程序有段间(即远程FAR) 和段内调用(即近程NEAR) 之分。所以CALL 也有FAR 和NEAR 之分。。因此RET 也分段间与段内返回两种。

调用指令一般格式为:

段内调用: CALL NEAR PTR OPRD ;,

操作:SP=SP-2,((SP )+1),(SP ))=IP,IP=IP+16位位移量

CALL 指令首先将当前IP 内容压入堆栈。当执行RET 指令而返回时,从堆栈中取出一个字放入IP 中。

段间调用:CALL FAR PTR OPRD ;

操作:SP=SP-2,((SP )+1),(SP ))=CS;SP=SP-2,((SP )+1),(SP ))=IP;

IP=[EA];CS=[EA+2]

CALL 指令先把CS 压入堆栈,再把IP 压入堆栈。当执行RET 指令而返回时,从堆栈中取出一个字放入IP 中,然后从堆栈中再取出第二个字放入CS 中,作为

段间返回地址。

返回指令格式有:

RET ;SP=((SP+1),SP ),SP=SP+2

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

RET n指令要求n 为偶数,当RET 正常返回后,再做SP=SP+n操作。

2.条件转移指令

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

表2-5 条件转移指令表

从该表可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。这些指令通常对溢出标志位OF 和符号标志位SF 进行测试。对无符号数而言,这类指令通常测试标志位CF 。对于带符号数分大于、等于、小于3种情况;对于无符号数分高于、等于、低于3种情况。在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。

3.循环控制指令

对于需要重复进行的操作,微机系统可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX 或标志位ZF 进行测试,确定是否循环,如表2-6所示。

表2-6 循环指令表

例7 有一首地址为ARRAY 的M 个字数组,试编写一段程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL 中,程序段如下:

MOV CX,M ;设计数器初值

MOV AX,0 ;累加器初值为0

MOV SI,AX ;地址指针初值为0

START :ADD AX,ARRAY[SI]

ADD SI,2 ;修改指针值(字操作,因此加2) LOOP START ;重复

MOV TOTAL,AX ;存结果

例8 有一字符串,存放在ASCIISTR 的内存区域中,字符串的长度为L 。要求在字符串中查找空格(ASCII 码为20H ),找到则继续运行,否则转到NOTFOUND 去执行。实现上述功能的程序段如下:

MOV CX,L ;设计数器初值

MOV SI,-1 ;设地址指针初值

MOV AL,20H ;空格的ASCII 码送AL

NEXT : INC SI

CMP AL,ASCIISTR[SI] ;比较是否空格?

LOOPNZ NEXT

JNZ NOTFOUND

……

……

NOTFOUND :

……

……

六、 标志处理和CPU 控制类指令

标志处理指令用来控制标志,主要有CF 、DF 和IF 三个。处理器控制指令用

以控制处理器的工作状态,均不影响标志位,我们仅列出了一些常用指令,具体见表2-7所示。

表2-7 标志处理和CPU 控制类指令

习题与思考:

1.试分析下列程序段:

ADD AX,BX

JNC L2

SUB AX ,BX

JNC L3

JMP SHORTL5

如果AX 、BX 的内容给定如下:

AX BX

(1)14C6H 80DCH

(2)B568H 54B7H

问该程序在上述情况下执行后,程序转向何处?

2.编写一段程序,比较两个5字节的字符串OLDS 和NEWS ,如果OLDS 字符串不同于NEWS 字符串,则执行NEW_LESS,否则顺序执行。

第一讲

第三章 指令系统--寻址方式

回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过

程。

重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及

有效地址的计算。

讲授内容:

3.1 8086/8088寻址方式

首先,简单讲述一下指令的一般格式:

计算机中的指令由操作码字段和操作数字段组成。

操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。

寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址

所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。

例如:MOV AX,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。

立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址

操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS 加上这16位地址偏移量。如图2-2所示。

例如: MOV AX,DS :[2000H];

图2-2

(对DS 来讲可以省略成 MOV AX,[2000H], 系统默认为数据段) 这种寻址方法是以数据段的地址为基础,可在多达64KB 的范围内寻找操作数。

8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS 或SS 或ES 相加,作为操作数的地址。

MOV AX,[2000H] ;数据段

MOV BX,ES :[3000H] ;段超越,操作数在附加段

即绝对地址=(ES )*16+3000H

3.寄存器寻址

操作数包含在CPU 的内部寄存器中,如寄存器AX 、BX 、CX 、DX 等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址

操作数是在存储器中,但是,操作数地址的16

位偏移量包含在以下四个寄

存器SI 、DI 、BP 、BX 之一中。可以分成两种情况: (1) 以SI 、DI 、BX 间接寻址,则

通常操作数在现行数据段区域中,即数据段寄存器(DS )*16加上SI 、DI 、BX 中的16位偏移量,为操作数的地址, 例如: MOV AX, [SI] 操作数地址是:(DS )*16+(SI )

(2) 以寄存器BP 间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS )

*16与BP 的内容相加作为操作数的地址,

例如:MOV AX,[BP] 操作数地址是:(SS )*16+(BP )

若在指令中规定是段超越的,则BP 的内容也可以与其它的段寄存器相加,形成操作数地址。

例如: MOV AX,DS :[BP] 操作数地址是:(DS )*16+(BP ) 5.变址寻址

由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个段寄存器作为地址基准)作为操作数的偏移地址。(操作数在存贮器中)

可以作为寄存器变址寻址的四个寄存器是SI 、DI 、BX 、BP 。

⑴若用SI 、DI 和BX 作为变址,则与数据段寄存器相加,形成操作数的地址即默认在数据段;

⑵若用BP 变址,则与堆栈段寄存器相加,形成操作数的地址即默认在堆栈段

例如: MOV AX,COUNT[SI];

操作数地址是:(DS )*16+(SI )+COUNT

但是,只要在指令中指定是段超越的,则可以用别的段寄存器作为地址基准。 6.基址加变址寻址

把BX 和BP 看成是基址寄存器,把SI 、DI 看着是变址寄存器,把一个基址寄存器(BX 或BP )的内容加上一个变址寄存器(SI 或DI )的内容,再加上指令中指定的8位或16位偏移量(当然要以一个段寄存器作为地址基准)作为操作

数的偏移地址,如图所示。

操作数在存贮器中,其偏移地址由(基址寄存器)+(变址寄存器)+相对偏移量形成

基址寄存器――BX :数据段、BP :堆栈段; 变址寄存器――SI 、DI 。

例如:MOV AX,[BX][SI] 或 MOV AX,[BX+SI]

也可放置一个相对偏移量,如COUNT 、MASK 等等,用于表示相对寻址。 MOV AX,MASK[BX][SI]

MOV BH,COUNT[DI][BP];MOV BH,COUNT[BP+DI] ✧ 若用BX 作为基地址,则操作数在数据段区域 ✧ 若用BP 作为基地址,则操作数在堆栈段区域

但若在指令中规定段是超越的,则可用其它段寄存器作为地址基准。

P.28 表2-1 段寄存器使用的基本约定

习题与思考:

1.假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL 的偏移地址为0050H ,请指出下列指令源操作数是什么寻址方式?其物理地址是多少?

(1)MOV AX,0ABH (2)MOV AX ,[100H] (3)MOV AX ,VAL (4)MOV BX ,[SI] (5)MOV AL ,VAL[BX] (6)MOV CL ,[BX][SI] (7)MOV VAL[SI],BX (8)MOV [BP][SI],100

2.已知SS=0FFA0H,SP=00B0H,先执行两条把8057H 和0F79H 分别进栈的PUSH 指令,再执行一条POP 指令,试画出堆栈区和SP 内容变化的过程示意图。(标出存储单元的地址)

第二讲

3.2 指令系统--数据传输、算术运算

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程。

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解指令的功能,掌握数据传送类,算术运算类指令的使用方法。(掌握指令内涵,会用)

讲授内容:

3.2 8086/8088 指令系统

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

1.数据传送(Data Transter) 2.算术运算(Arithmetic) 3.逻辑运算(Logic) 4.串操作(String menipulation) 5.程序控制(Program Control) 6.处理器控制(Processor Control)

一、数据传送指令

主要介绍 MOV,XCHG 、堆栈和地址传送指令。

1.数据传送MOV 指令

一般格式:MOV OPRD1,OPRD2

MOV 是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。 功能:完成数据传送

具体来说,一条数据传送指令能实现:

⑴CPU 内部寄存器之间数据的任意传送(除了代码段寄存器CS 和指令指针IP 以外) 。

MOV AL,BL ;字节传送 MOV CX,BX ;字传送 MOV DS,BX

⑵立即数传送至CPU 内部的通用寄存器组(即AX 、 BX、CX 、DX 、BP 、SP 、SI 、DI) ,

MOV CL,4 MOV AX,03FFH MOV SI,057BH

⑶CPU 内部寄存器(除了CS 和IP 以外) 与存储器(所有寻址方式) 之间的数据传送。

MOV AL,BUFFER MOV AX,[SI] MOV [DI],CX MOV SI,BLOCK[BP] MOV DS,DATA[SI+BX] MOV DEST[BP+DI],ES

⑷ 能实现用立即数给存储单元赋值

例如:MOV [2000H],25H

MOV [SI],35H

对于MOV 指令应注意几个问题:

①存储器传送指令中,不允许对CS 和IP 进行操作;

②两个操作数中,除立即寻址之外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;

如我们需要把地址(即段内的地址偏移量) 为AREAl 的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中去,MOV 指令不能直接完成这样的传送,但我们可以用CPU 内部寄存器为桥梁来完成这样的传送: MOV AL,AREAl

MOV AREA2,AL

③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;如:MOV AX ,0;MOV DS ,AX ④目的操作数,不能用立即寻址方式。

2.堆栈指令

(简述堆栈的概念及存取特点,如先进后出)

包括入栈(PUSH )和出栈(POP )指令两类。仅能进行字运算。(操作数不能是立即数) ⑴ 入栈指令PUSH 一般格式:PUSH OPRD

源操作数可以是CPU 内部的16位通用寄存器、段寄存器(CS 除外)和内存操作数(所有寻址方式)。入栈操作对象必须是16位数。 功能:将数据压入堆栈

执行步骤为:SP=SP-2;[SP]=操作数低8位;[SP+1]= 操作数高8位

例如:PUSH BX

执行过程为:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如图2-8所示。 ⑵ 出栈指令POP 一般格式:POP OPRD 功能:将数据弹出堆栈

对指令执行的要求同入栈指令。

例如:POP AX 图2-8

POP [BX] POP DS

3.交换指令 XCHG

一般格式:XCHG OPRD1,OPRD2 功能:完成数据交换

这是—条交换指令,把一个字节或一个字的源操作数与目的操作数相交换。交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间

进行。但段寄存器和立即数不能作为一个操作数,不能在累加器之间进行。 例如: XCHG AL,CL

XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER XCHG DATA[SI],DH

4.累加器专用传送指令

有三种,输入、输出和查表指令。前两种又称为输入输出指令。 ⑴ IN 指令

一般格式:IN AL,n ; B AL←[n]

IN AX,n ; W AX←[n+1][n] IN AL,DX ; B AL←[DX] IN AX,DX ; W AX←[DX+1][DX]

功能:从I/O端口输入数据至AL 或AX 。

输入指令允许把一个字节或一个字由一个输入端口传送到AL 或AX 中。若端口地址超过255时,则必须用DX 保存端口地址,这样用DX 作端口寻址最多可寻找64K 个端口。 ⑵ OUT 指令

一般格式:OUT n,AL ; B AL→[n] OUT n,AX ; W AX→[n+1][n]

OUT DX,AL ; B AL→[DX] OUT DX,AX ; W AX→[DX+1][DX]

功能:将AL 或AX 的内容输出至I/O端口。

该指令将AL 或AX 中的内容传送到一个输出端口。端口寻址方式与IN 指令相同。 ⑶ XLAT指令

一般格式:XLAT ; AL=(DX )×16+(BX )+(AL )) 功能:完成一个字节的查表转换。

要求:①寄存器AL 的内容作为一个256字节的表的下标。②表的基地址在BX 中,③转换后的结果存放在AL 中. TABLE:例如:MOV BX,OFFSET TABLE

MOV AL,8 ……

IN AL,1 第9个字符 AAH XLAT ;查表

OUT 1,AL ;(AL )= AAH 表长度256本指令可用在数制转换、函数表查表、代码转换等场合。

5.地址传送指令(有三条地址传送指令) ⑴ LEA (Load Effective Address) 一般格式: LEA OPRD1,OPRD2

功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。

要求:①源操作数必须是一个内存操作数,②目的操作数必须是一个16位的通

用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。 例:LEA BX,BUFR ;把变量BUFR 的地址偏移量部分送到BX

⑵ LDS (Load pointer into DS) 一般格式: LDS OPRD1,OPRD2

功能:完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址送入DS ,偏移量部分送入一个16位的指针寄存器或变址寄存器。

要求:源操作数是一个内存操作数,目的操作数是一个通用寄存器/变址寄存器。

例如:LDS SI,[BX] ;将把BX 所指的32位

地址指针的段地址部分送入DS ,偏移量部分送入SI 。图2-9 LDS指令示意

如图2-9所示。

⑶ LES (Load pointer into ES) 一般格式: LES OPRD1,OPRD2

这条指令除将地址指针的段地址部分送入ES 外,与LDS 类似。例如: LES DI ,[BX+COUNT]

6.标志寄存器传送(有四条标志传送指令) ⑴ LAHF (LOAD AH WITH FLAG)

将标志寄存器中的SF 、ZF 、AF 、PF 和CF (即低8位)传送至AH 寄存器的指定位,空位没有定义。

⑵ SAHF (STORE AH WITH FLAG)

将寄存器AH 的指定位,送至标志寄存器的SF 、ZF 、AF 、PF 和CF 位(即低8位)。根据AH 的内容,影响上述标志位,对OF 、DF 和IF 无影响。 ⑶ PUSHF (PUSH FLAG)

将标志寄存器压入堆栈顶部,同时修改堆栈指针,不影响标志位。 ⑷ POPF (POP FLAG)

堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。

二、算术运算指令

8086/8088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。 带符号数用补码表示。同时

8086/8088也提供了各种校正操作,故可以进行十进制算术运算。

参与加、减运算的操作数可如上图所示。 1.加法指令 (Addition)

⑴一般形式:ADD OPRD1,OPRD2

功能:OPRD1←OPRD1+OPRD2

完成两个操作数相加,结果送至目的操作数OPRD1。目的操作数可以是累加器,任一通用寄存器以及存储器操作数。 例如:

ADD AL ,30;累加器与立即数相加

ADD BX ,[3000H];通用寄存器与存储单元内容相加 ADD DI ,CX ;通用寄存器之间

ADD DX ,DATA[BX+SI];通用寄存器与存储单元内容相加 ADD BETA[SI],DX ;存储器操作数与寄存器相加 这些指令对标志位CF 、DF 、PF 、SF 、ZF 和AF 有影响。

⑵一般形式:ADC OPRD1,OPRD2;带进位的加法

功能:OPRD1←OPRD1+OPRD2 +CF

这条指令与上—条指令类似,只是在两个操作数相加时,要把进位标志CF 的现行值加上去,结果送至目的操作数。

ADC 指令主要用于多字节运算中。若有两个四字节的数,已分别放在自FIRST 和SECOND 开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。

MOV AX,FIRST

ADD AX,SECOND ;进行字运算 MOV THIRD,AX MOV AX,FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX

这条指令对标志位的影响与ADD 相同。 ⑶一般形式:INC OPRD ;

功能:OPRD ←OPRD+1

完成对指定的操作数OPRD 加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。

这条指令执行的结果影响标志位AF 、OF 、PF 、SF 和ZF ,而对进位标志没有影响。

如:INC AL

INC [BX]

2.减法指令(Subtraction) ⑴一般形式:SUB OPRD1,OPRD2 ;

功能:OPRD1←OPRD1-OPRD2

完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。 例如: SUB CX ,BX

SUB [BP],CL

⑵一般形式:SBB OPRD1,OPRD2 ;

功能:OPRD1←OPRD1-OPRD2-CF

这条指令与SUB 类似,只是在两个操作数相减时,还要减去借位标志CF 的现行值.本指令对标志位AF 、CF 、OF 、PF 、SF 和ZF 都有影响。

同ADC 指令一样,本指令主要用于多字节操作数相减。 ⑶一般形式:DEC OPRD ;

功能:OPRD ←OPRD-1-CF

对指令的操作数减1,然后送回此操作数,

在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF 、OF 、PF 、SF 和ZF .但对CF 标志不影响(即保持此指令以前的值) 。

例如: DEC [SI] DEC CL ⑷一般形式:NEG OPRD

功能: (NEGDate) 取补

对操作数取补,即用零减去操作数,再把结果送回操作数。 例如: NEG AL NEG MULRE

(AL =0011 1100)则取补后为1100 0100 即0000 0000-0011 1100=1100 0100

若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF 置位。

此指令影响标志AF 、CF 、OF 、PF 、SF 和ZF 。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。 ⑸一般形式:CMP OPRD1,OPRD2 ;

功能: OPRD1-OPRD2

比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法) 。 例如: CMP AL,100

CMP DX,DI CMP CX,COUHT[BP] CMP COUNT[SI],AX

比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF 标志即可判断两者是否相等。 相等的比较:

①若两者相等,相减以后结果为零,ZF 标志为1,否则为0。

②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的

大小。

大小的比较:

如果是两个无符号数(如CMP AX ,BX )进行比较,则可以根据CF 标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX ≥BX ;若产生了借位(即CF =1),则AX <BX 。

习题与思考:

1.设有关寄存器及存储单元的内容如下:

DS=2000H,BX=0100H,AX=1200H,SI=0002H,[20100H]=12H,[20101H]=34H,[20102H]=56H,[20103]=78H,[21200]=2AH,[21201H]=4CH,[21202H]=0B7H,[21203H]=65H。 试说明下列各条指令单独执行后相关寄存器或存储单元的内容。 (1)MOV AX ,1800H (2)MOV AX ,BX

(3)MOV BX ,[1200H] (4)MOV DX ,1100[BX]

(5)MOV [BX][SI],AL (6)MOV AX ,1100[BX][SI] 2.写出实现下列计算的指令序列。(假定X 、Y 、Z 、W 、R 都为字变量) (1)Z=W+(Z+X) (2)Z=W-(X+6)-(R+9) 3.若在数据段中从字节变量TABLE 相应的单元开始存放了0~15的平方值,试写出包含有XLAT 指令的指令序列查找N (0~15)中的某个数的平方。(设N 的值存放在CL 中)

第三讲

3.3 指令系统-算术运算、逻辑运算、控制转移

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程。

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解指令的功能,掌握算术运算类、逻辑运算

和移位指令的功能和应用。(掌握指令内涵,会用)

讲述内容:

3.乘法指令(分为无符号乘法指令和带符号乘法指令两类)

(1) 无符号乘法指令MUL 一般格式: MUL OPRD

完成字节与字节相乘、字与字相乘,且默认的操作数放在AL 或AX 中,而源操作数由指令给出。8位数相乘,结果为16位数,放在AX 中;16位数相乘结果为32位数,高16位放在DX ,低16位放在AX 中。注意:源操作数不能为立即数。 例如:

MOV AL,FIRST ;

MUL SECOND ;结果为AX=FIRST*SECOND MOV AX,THIRD ;

MUL AX ;结果DX :AX=THIRD*THIRD MOV AL,30H

CBW ; 字扩展AX=30H MOV BX,2000H MUL BX ; (2) 带符号数乘法指令IMUL

一般格式:IMUL OPRD ;OPRD 为源操作数

这是一条带符号数的乘法指令,同MUL 一样可以进行字节与字节、字和字的乘法运算。结果放在AX 或DX ,AX 中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF 和OF 将置位。

4.除法指令

(1) 无符号数除法指令 DIV 一般格式:DIV OPRD (2) 带符号数除法IDIV 一般格式:IDIV OPRD

该指令执行过程同DIV 指令,但IDIV 指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。

在除法指令中,在字节运算时被除数在AX 中;运算结果商在AL 中,余数在AH 中。字运算时被除数为DX :AX 构成的32位数,运算结果商在AX 中,余数在DX 中。

例如:AX=2000H,DX=200H,BX=1000H,则 DIV BX 执行后,AX=2002H ,DX=0000。

除法运算中,源操作数可为除立即寻址方式之外的任何一种寻址方式,且指令执行对所有的标志位都无定义。

由于除法指令中的字节运算要求被除数为16位数,而字运算要求被除数是32位数,在8086/8088系统中往往需要用符号扩展的方法取得被除数所要的格式,因此指令系统中包括两条符号扩展指令。

(3) 字节扩展指令CBW 一般格式:CBW

该指令执行时将AL 寄存器的最高位扩展到AH ,即若D7=0,则AH=0;否则AH=0FFH。

(4) 字扩展指令CWD 一般格式:CWD

该指令执行时将AX 寄存器的最高位扩展到DX ,即若D15=0,则DX=0;否则DX=0FFFFH。

CBW 、CWD 指令不影响标志位。 5.十进制调整指令

计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。为此在8086/8088系统中,针对十进制算术运算有一类十进制调整指令。

在计算机中人们用BCD 码表示十进制数,对BCD 码计算机中有两种表示方法:一类为压缩BCD 码,即规定每个字节表示两位BCD 数;另一类称为非压缩BCD 码,即用一个字节表示一位BCD 数,在这字节的高四位用0填充。例如,十进制数25D ,表示为压缩BCD 数时为:25H ;表示为非压缩BCD 数时为:0205H ,用两字节表示。

相关的BCD 转换指令见表2-2。

例如:

ADD AL,BL

DAA

表2-2 十进制调整指令

若执行前:AL=28H,BL=68H,则执行ADD 后:AL=90H,AF=1;再执行DAA 指令后,正确的结果为:AL=96H,CF=0,AF=1。

MUL BL AAM

若执行前:AL=07,BL=09,则执行MUL BL

后,AX=003FH,再执行AAM 指令后,正确的结果为:AH=06H,AL=03H。

注意:BCD 码进行乘除法运算时,一律使用无符号数形式,因而AAM 和AAD 应固定地出现在MUL 之前和DIV 之后。

三、 逻辑运算和移位指令 包括逻辑运算、移位和循环移位指令

1.逻辑运算指令 (1) 一般格式:NOT OPRD

功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL

(2) 一般格式:AND OPRD1,OPRD2

功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。 其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式) 。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。

8086/8088的AND 指令可以进行字节操作,也可以进行字操作。 例如: AND AL,0FH ;可完成拆字的动作 AND SI ,SI ; 将SI 清0 (3) 一般格式:TEST OPRD1,OPRD2

功能:完成与AND 指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试,

例如 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令: TEST AL ,01H

JNZ THERE …… THERE :

若要检测CX 中的内容是否为0,为0则转移。该如何做呢? (4) 一般格式:OR OPRD1,OPRD2

功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式) 。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。

AND AL,0FH AND AH,0FOH OR OR OR

AL ,AH ; 完成拼字的动作 AX ,0FFFH ;将AX 低12位置1 BX ,BX ; 清相应标志

(5) 一般格式:XOR OPRD1,OPRD2

功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式) 。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式) 。例如:

XOR AL ,AL ;使AL 清0 XOR SI ,SI ;使SI 清0

XOR CL,0FH ;使低4位取反,高4位不变

逻辑运算类指令中,单操作数指令NOT 的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT 不影响标志位,其它四种指令将使CF=OF=0,AF 无定义,而SF 、ZF 和PF 则根据运算结果而定。

2.移位指令

(1)算术/逻辑移位指令 ① 算术左移或逻辑左移指令

SAL /SHL OPRD,M ;

② 算术右移指令 SAR OPRD,M ③ 逻辑右移指令 SHR OPRD,M M 是移位次数,可以是1或寄存器CL

这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL 中的内容规定的次数 (2)循环移位指令

ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位 RCR OPRD,M ;带进位右循环移位 前两条循环指令,未把标志位CF 包含在循环的环中,后两条把标志位CF 包含在循环的环中,

作为整个循环的一部分。

循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL 的内容所决定的次数。

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

在数的输入输出过程中乘10的操作是经常要进行的。而X10=X*2+X*8,也可以采用移位和相加的办法来实现*10。为保证结果完整,先将AL 中的字节扩展为字。

MOV AH,0 SAL AX,1 ;X*2 MOV BX,AX ;移至BX 中暂存 SAL AX,1 ;X*4 SAL AX,1 ;X*8 ADD AX,BX ;X*10

例1 BCD码转换为ASCII 码

若在内存某一缓冲区中存放着若干个单元的用BCD 码表示的十进制数。每—个单元中放两位BCD 码,要求把它们分别转换为ASCII 码。高位的BCD 码转换完后放在地址较高的单元。 分析:转换公式:ASCII =BCD+30H

算法:源串和目的串的表首分别设两个指针。取BCD 转ASCII 后存入(先低位,后高位) MOV MOV MOV MOV AND OR MOV INC MOV MOV SHR OR MOV POP INC

SI ,OFFSET BCDBUFF;设置源地址指针 CX ,COUNT ;设计数初值 DI ,OFFSET ASCBUF ;设置目的地址指针 BL ,AL

AL ,0FH ;取低位BCD 码 AL ,30H ;转换成ASCII 码 [DI],AL ;存入

DI ;修改指针 AL ,BL CL ,4

AL ,CL

AL ,30H ;高位转换成ASCII 码 [DI],AL ;存入

CX

DI

SI ;修改指针

AGAIN :MOV AL ,[SI]

PUSH CX

INC

LOOP AGAIN ;重复工作

习题与思考:

1.写出实现下列计算的指令序列。(假定X 、Y 、Z 、W 、R 都为字变量) (1)Z=(W*X)/(R+6) (2)Z=((W-X )/5*Y)*2

2.假定DX=[**************]1B,CL=3,CF=1,试确定下列各条指令单独执行后DX 的值。 (1)SHR DX ,1 (2)SHL DL ,1 (3)SAL DH ,1 (4)SAR DX ,CL (5)ROR DX ,CL (6)ROL DL ,CL

(7)RCR DL ,1 (8)RCL DX ,CL 3.试分析下列程序完成什么功能? MOV CL ,4 SHL DX ,CL MOV BL ,AH SHL BL ,CL SHR BL ,CL OR DL ,BL 4.已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX

INT 20H 试问:(1)每条指令执行后,AX 寄存器的内容是什么?(2)每条指令执行后,CF ,SF 及ZF 的值分别是什么?(3)程序运行结束时,AX 及DX 寄存器的值为多少?

第四讲:

3.4 指令系统-循环、子程序调用、中断、其他

回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程

8086/8088的寻址方式及操作数地址的计算。

重点和纲要:要求学生了解串操作指令的功能。指令系统-循环、子

程序调用、中断、其他(掌握指令内涵,会用)

讲授内容:

四、 串操作类指令 (选讲或简单介绍)

串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。

1.重复指令前缀

串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2-3所示。

表2-3重复前缀

2.串指令

串指令共有五种,具体见表2-4。

对串指令要注意以下几个问题:

(1) 各指令所使用的默认寄存器是:SI (源串地址),DI (目的地址),CX (字串长度),AL (存取或搜索的默认值)。

(2) 源串在数据段,目的串在附加段。

表2-4 串操作指令

(3) 方向标志与地址指针的修改。DF =1,则修改地址指针时用减法;DF=0时,

则修改地址指针时用加法,

MOVS 、STOS 、LODS 指令不影响标志位。

· MOVS指令的功能,

把数据段中由SI 间接寻址的一个字节(或一个字) 传送到附加段中由DI 间接寻址的一个字节单元(或一个字单元) 中去,然后,根据方向标志DF 及所传送数据的类型(字节或字) 对SI 及DI 进行修改,在指令重复前缀REP 的控制下,可将数据段中的整串数据传送到附加段中去。

例2 在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;M ESS2为附加段中用以存放字符串区域的首地址。

实现上述功能的程序段如下:

LEA SI,MESS1 ;置源串偏移地址 LEA DI,MESS2 ;置目的串偏移地址 MOV CX,17 ;置串长度

CLD ;方向标志复位

REP MOVSB ;字符串传送

其中,最后一条指令也可写成

REP MOVS ES:BYTE PTR[DI],DS :[SI]

或 REP MOVS MESS2,MESS1

· CMPS指令的功能,

把数据段中由SI 间接寻址的一个字节(或一个字) 与附加段中由DI 间接寻址

的一个字节(或一个字) 进行比较操作,使比较的结果影响标志位,然后根据方向标志DF 及所进行比较的操作数类型(字节或字) 对SI 及DI 进行修改,在指令重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字) ,或者第一个相等的字节(或字) 。

例3 在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。 实现上述功能的程序段如下;

LEA SI,MESS1 ;装入源串偏移地址

LEA DI,MESS2 ;装入目的串偏移地址 MOV CX,17 ;装入字符串长度 CLD ;方向标志复位

REPE CMPSB

上述程序段执行之后,SI 或DI 的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符.则当比较完毕后,CX =0,退出重复操作状态。

· SCAS指令的功能,

用由指令指定的关键字节或关键字(分别存放在AL 及AX 寄存器中) ,与附加段中由DI 间接寻址的字节串(或字串) 中的一个字节(或字) 进行比较操 作,使比较的结果影响标志位,然后根据方向标志DF 及所进行操作的数据类型(字节或字) 对DI 进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字) 匹配的字节(或字) ,或者搜索第一个与关键字节(或字) 不匹配的字节(或字) 。

例4 在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H) 。

实现上述功能的程序段如下:

LEA DI,MESS2 ;装入目的串偏移地址 MOV AL,20H ;装入关键字节 MOV CX,17 ;装入字符串长度 REPNE SCASB

上述程序段执行之后,DI 的内容即为相匹配字符的下一个字符的地址,CX 中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字) ,则当查完之后(CX)=0退出重复操作状态。

· STOS指令的功能,

把指令中指定的一个字节或一个字(分别存放在AL 及AX 寄存器中) ,传送到附加段中由DI 间接寻址的字节内存单元(或字内存单元) 中去,然后,根据方向标志DF 及所进行操作的数据类型(字节或字) 对DI 进行修改操作。在指令重复前缀的控制下,可连续将AL (AX )的内容存入到附加段中的一段内存区域中去,该指令不影标志位。

例5 要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可用

下列程序段实现:

LEA DI,MESS2 ;装入目的区域偏移地址 MOV AL,00H ;为清零操作准备 MOV CX,5 ;设置区域长度 REP STOSB

· LODS指令的功能, 从串中取指令实现从指定的字节串(或字串) 中读出信息的

操作。

例6 比较DEST 和SOURCE 中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE 中的这个数送AL 中。

CLD

LEA DI,ES :DEST

LEA SI,SOURCE

MOV CX,500

REPE CMPSB

JCXZ NEXT

MATCH :DEC SI

MOV AL,BYTE PTR[SI]

NEXT :

五、 程序控制指令

转移类指令可改变CS 与IP 的值或仅改变IP 的值,以改变指令执行的顺序。

1.无条件转移、调用和返回指令

(1) 无条件转移指令JMP 分直接转移和间接转移两种。

一般格式: JMP OPRD ;OPRD 是转移的目的地址

直接转移的3种形式为:

· 短程转移 JMP SHORT OPRD ;IP=IP+8位位移量

目的地址与JMP 指令所处地址的距离应在-128~127范围之内。

· 近程转移 JMP NEAR PTR OPRD ;IP=IP+16位位移量

或 JMP OPRD ;NEAR 可省略

目的地址与JMP 指令应处于同一地址段范围之内。

· 远程转移 JMP FAR PTR OPRD ;IP=OPRD的段内位移量,CS=OPRD所在段地址。

远程转移是段间的转移,目的地址与JMP 指令所在地址不在同一段内。执行该指令时要修改CS 和IP 的内容。

间接转移指令的目的地址可以由存储器或寄存器给出。

· 段内间接转移 JMP WORD PTR OPRD ;IP=[EA] (由OPRD 的寻址方式确定)。

JMP WORD PTR[BX] IP=((DS )*16+(BX ))

JMP WORD PTR BX IP=(BX )

· 段间间接转移 JMP DOWRD PTR OPRD;IP=[EA],CS=[EA+2]

该指令指定的双字节指针的第一个字单元内容送IP ,第二个字单元内容送CS 。

JMP DWORD PTR [BX+SI]

(2) 调用和返回指令

CALL 指令用来调用一个过程或子程序。由于过程或子程序有段间(即远程FAR) 和段内调用(即近程NEAR) 之分。所以CALL 也有FAR 和NEAR 之分。。因此RET 也分段间与段内返回两种。

调用指令一般格式为:

段内调用: CALL NEAR PTR OPRD ;,

操作:SP=SP-2,((SP )+1),(SP ))=IP,IP=IP+16位位移量

CALL 指令首先将当前IP 内容压入堆栈。当执行RET 指令而返回时,从堆栈中取出一个字放入IP 中。

段间调用:CALL FAR PTR OPRD ;

操作:SP=SP-2,((SP )+1),(SP ))=CS;SP=SP-2,((SP )+1),(SP ))=IP;

IP=[EA];CS=[EA+2]

CALL 指令先把CS 压入堆栈,再把IP 压入堆栈。当执行RET 指令而返回时,从堆栈中取出一个字放入IP 中,然后从堆栈中再取出第二个字放入CS 中,作为

段间返回地址。

返回指令格式有:

RET ;SP=((SP+1),SP ),SP=SP+2

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

RET n指令要求n 为偶数,当RET 正常返回后,再做SP=SP+n操作。

2.条件转移指令

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

表2-5 条件转移指令表

从该表可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。这些指令通常对溢出标志位OF 和符号标志位SF 进行测试。对无符号数而言,这类指令通常测试标志位CF 。对于带符号数分大于、等于、小于3种情况;对于无符号数分高于、等于、低于3种情况。在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。

3.循环控制指令

对于需要重复进行的操作,微机系统可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX 或标志位ZF 进行测试,确定是否循环,如表2-6所示。

表2-6 循环指令表

例7 有一首地址为ARRAY 的M 个字数组,试编写一段程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL 中,程序段如下:

MOV CX,M ;设计数器初值

MOV AX,0 ;累加器初值为0

MOV SI,AX ;地址指针初值为0

START :ADD AX,ARRAY[SI]

ADD SI,2 ;修改指针值(字操作,因此加2) LOOP START ;重复

MOV TOTAL,AX ;存结果

例8 有一字符串,存放在ASCIISTR 的内存区域中,字符串的长度为L 。要求在字符串中查找空格(ASCII 码为20H ),找到则继续运行,否则转到NOTFOUND 去执行。实现上述功能的程序段如下:

MOV CX,L ;设计数器初值

MOV SI,-1 ;设地址指针初值

MOV AL,20H ;空格的ASCII 码送AL

NEXT : INC SI

CMP AL,ASCIISTR[SI] ;比较是否空格?

LOOPNZ NEXT

JNZ NOTFOUND

……

……

NOTFOUND :

……

……

六、 标志处理和CPU 控制类指令

标志处理指令用来控制标志,主要有CF 、DF 和IF 三个。处理器控制指令用

以控制处理器的工作状态,均不影响标志位,我们仅列出了一些常用指令,具体见表2-7所示。

表2-7 标志处理和CPU 控制类指令

习题与思考:

1.试分析下列程序段:

ADD AX,BX

JNC L2

SUB AX ,BX

JNC L3

JMP SHORTL5

如果AX 、BX 的内容给定如下:

AX BX

(1)14C6H 80DCH

(2)B568H 54B7H

问该程序在上述情况下执行后,程序转向何处?

2.编写一段程序,比较两个5字节的字符串OLDS 和NEWS ,如果OLDS 字符串不同于NEWS 字符串,则执行NEW_LESS,否则顺序执行。


相关文章

  • 微机原理与应用Ch01-绪论
  • 微机原理与应用 南京航空航天大学机电学院 授课教师 : 张 臣 Tel: 84891678 [1**********]  :[email protected] 1 <微机原理与应用>课件 教材及参考资料  张毅刚主编 ...查看


  • 微机原理课程总结
  • 微机原理与接口技术课程总结 班级: 学号: 姓名:朱松峰 03 B12020115 微机原理与接口技术课程总结 这学期我们学习了微机原理与接口技术这门课程,这门课学起来 是很难的,老师讲课很有激情,也很有层次,重点都告诉我们,每节 课上课的 ...查看


  • [微机原理及应用]课程教学方法探讨
  • 摘要:对<微机原理及应用>课程的课堂教学和实验实践教学方法进行了探讨.针对课堂教学,从教学内容和课堂教育方法两方面进行了总结探讨.探索创新:针对实验实践,对实验内容和实验教学模式进行了大胆尝试. 关键词:微型原理及应用:教学方法 ...查看


  • 微机原理与接口技术第三版要点
  • 微机原理与接口技术第三版要点 填空题: 第一章 1,微处理器是指包含有运算器.控制器.寄存器组以及总线接口等部件的一块大规模集成电路芯片,负责对计算机系统各部件进行统一协调和控制:微型计算机以微处理器为核心,配置存储器.输入/输出设备.接口 ...查看


  • 微机原理与接口技术考试试题及答案
  • 2013-2014学年度第一学期 <微机原理与接口技术>课程期末考试试卷(A卷,考试) 6 .6166为2Kx8位的SRAM芯片,它的地址线条数为( ). A. 11 B. 12 C. 13 D. 14 7 .在计算机系统中,可 ...查看


  • 微机原理与应用论文
  • <微机原理与应用>学后总结 这一学期过半了,而<微机原理与应用>也快结课了,就剩下考试了.记得刚开始学习这门课时,感觉摸不着头脑.面对着众多的术语.概念及原理性的问题不知道该如何下手.在了解课程的特点后,我发现,应该 ...查看


  • 微机原理实验步骤学生
  • 实验要求及步骤 一.遵守"微机原理实验室实验守则",严格执行各个要求. 二.实验前准备的内容:a .完成前次实验报告,b .本次实验的预习报告,c .实验用到的电路图.流程图.程序. 三.实验内容 1.软件实验步骤: D ...查看


  • 课程设计报告"9秒倒计时设计"
  • 沈 阳 工 程 学 院 微机原理及应用 课 程 设 计 课程设计题目:9秒倒计时设计 系 别 电气工程系 班级 发电本091 学生姓名 冀恩举 学号 2009205112 指导教师 曲乐声.踪念品 职称 讲师.讲师 起止日期: 2012年5 ...查看


  • 微机原理学习心得
  • 湖南农业大学课程论文 学 院:工学院 班 级:08级机制3班 姓 名:贺小裴 学 号:200840614xxx 课程论文题目:微机原理学习心得 课程名称:微机原理与接口技术 评阅成绩: 评阅意见: 成绩评定教师签名: 日期: 年 月 日 微 ...查看


热门内容