微型计算机原理与应用 教学 作者 陈建铎 宋彩利 程俊波 第四章 汇编语言_第1页
微型计算机原理与应用 教学 作者 陈建铎 宋彩利 程俊波 第四章 汇编语言_第2页
微型计算机原理与应用 教学 作者 陈建铎 宋彩利 程俊波 第四章 汇编语言_第3页
微型计算机原理与应用 教学 作者 陈建铎 宋彩利 程俊波 第四章 汇编语言_第4页
微型计算机原理与应用 教学 作者 陈建铎 宋彩利 程俊波 第四章 汇编语言_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章指令系统与汇编语言

程序设计

【内容简介】

首先讲述8086的寻址方式、指令系统、汇编语言语句格式、保护方式编程指

令,然后讲述汇编语言程序设计、宏以及DOS功能调用,最后简要说明32位

微处理器指令系统的功能与使用。

【重点难点】

重点是8086寻址方式、指令系统与汇编程序设计。难点是汇编语言程序设计。

第4章指令系统与汇编语言程序设计

4.1概述

4.28086寻址方式

4.38086指令系统

4.4汇编语言程序格式与常用伪指令

4.5汇编语言程序设计

4.6汇编语言程序上机过程

1概述

4.1.1指令与程序

4.1.2汇编语言基本概念

4.L1指令与程序

所谓指令,就是指示计算机进行某一工作的命令,而程序是为求

解某一问题或进行某项工作的若干条指令的有序集合。指令如所

示。一台计算机全部指令的集合称为指令系统。操作码域说明指令的

类型与功能,操作数域也称为地址域,说明数据在存储器中的地址及

操作结果存放的地址。

表示一条指令的二进制数称操作码操作数

为指令字,按长度可分为单字节、

图4」指令的基本格式

双字节、三字节甚至四字节等。

按操作数的个数又可分为无操作数、单操作数、双操作数以至三

操作数指令,也称为无地址、一地址、二地址以至三地址指令。

其中存放结果的称为目的操作数或目的地址,其它则称为源操作

数或源地址。

4

用二进制代码表示指令系统的语言称为机器语言,用以设计

的程序称为机器语言程序。例如以下两条指令可构成一段程序,

是把数据20H经寄存器CL,与累加器AL中的数相加,结果在AL

中。

1011000100100000

0000001011000001

5

4.L2汇编语言基本概念

用英文助记符表示指令系统的语言称为汇编语言,比如用

ADD、SUB、JMP表示加、减、转移等操作。用汇编语言指令编写

的程序称为汇编语言程序。

在计算机中,一条汇编语言指令对应于一条机器语言指令。因

此,汇编语言指令实际上是机器指令的符号化表示。例如上一节的

机器语言程序可由如下汇编语言指令来表示。

MOVCL,20H

ADDAL,CL

6

汇编语言程序,人们易于编写、识别和理解。但是必须转换

成机器语言,计算机才能被识别和执行。这一转换过程称为汇编,

由专门的汇编程序进行。通常,人们把用汇编语言编写的程序称为

源程序,经汇编而生成的机器语言程序称为目标程序或目标代码。

另外,还有一些用来说明汇编过程,或对汇编过程进行辅助说

明的指令,称为伪指令。

7

4.28086寻址方式

在指令中,操作数或操作数的地址可用多种方式来表示,统称

为寻址方式。同一条指令可有不同的寻址方式,以说明不同的操

作对象。

4.2.1数据类型

4.2.2寻址方式

4.2.1数据类型

在计算机中,二进制数据有多种类型或用途。一种是指令处理的

对象,即操作数;另一种是指令字;第三种是操作数的地址。在指令

中,操作数又分为两种,一种是参加运算或由计算机处理的对象,即

数据操作数,简称为数据;另一种表示转移指令的目标地址,即转移

地址。

1.数据操作数

按照存储的位置,可分为三种:立即数、寄存器数据和存储器数

据。

2.转移地址操作数

表示转移目标地址,可在转移指令中直接给出,也可根据某一寻址

方式求得。

9

4.2.2寻址方式

根据操作数的两大类型,寻址方式也分为两类,即数据寻址方式

和转移地址寻址方式。

1.数据寻址方式

在数据寻址方式中,有以下7种。

(1)立即数

立即数是指指令操作数域直接给出的就是参加运算或进行某种操作的

数据,又称即时数,有8位、16位等形式。对于16位数据,低字节在

先,高字节在后。例如指令:

MOVAL,5

执行后(AL)=05H,操作示意图如图4.2(a)所示。

1()

又如指令:

MOVAX,2790H;操作示意图如所示。

(a)8位立即数(b)16位立即数

图4.2立即寻址示意图

立即数只能是源操作数,不能是目的操作数。

(2)寄存器寻址

是指指令操作数域给出的是存放操作数的寄存器。对于8位操作数,寄

存器有AL、AH、BL、BH、CL、CH、DL、DH;对于16位操作

数,寄存器有AX、BX、CX、DX、SI、DI、SP、BPo

11

例如指令:MOVBX,AX

操作示意图如所示。

AXBX

1234H->15678H

图4.3寄存器寻址示例

(3)直接寻址

是指令操作数域给出的是存放操作数地址的偏移量,也称为有效

地址,常用EA表示,寻址方式如图4.4所示。例如指令:

MOVBX,[2000H]

执行前(DS)=4000H,EA=2000H,(42000H)=1FH,(42001H)

=75Ho

执行后(BX)=751FH,操作示意图如所示。

12

如果操作数存放在其它段中,应指定段寄存器,又如指令:

MOVAX,ES:[2100H]

执行前(ES)=1000H,EA=2100H,

(12100H)=2AH,(12101H)=17H

执行后(AX)=172AH

13

在汇编语言中,可以使用符号地址代替数值地址。例如:

MOVAX,[VALUE]

VALUE是符号地址。符号地址出现在指令中,可省略方括号,

例如MOVAX,DATAo

(4)寄存器间接寻址

是指令操作数域给出的是存放操作数地址偏移量的寄存器。寄存

器主要有BX、BP、SI和DI。若没有特别说明,BX、SI>DI默认操

作数在数据段(DS)中。BP默认操作数在堆栈段(SS)中。段寄存

器中的的基地址左移4位与16位偏移量相加,生成20位的物理地址,

如图4.6所示。

例如指令:MOVAX,[BX]

设(DS)=3000H,(BX)=3000H,执行后(AX)=2C7DH,操作示

意图如图4.7所示。

又如指令:MOVAX,ES:[SI];段寄存器为ES,数据在附加段中。

图4.7寄存器间接寻址示例

(5)寄存器相对寻址

指令操作数域给出的是一个基址寄存器和一个偏移量,基地址与

偏移量相加,作为操作数地址的偏移地址EA,如图4.8所示。

15

段寄存器

图4.8寄存器相对寻址示意图

例如指令:

DS30000操作码

MOVAX,DATA[DI]DI200000H

+0300v

03H

执行前(DS)=3000H,32300

(DI)=2000H,AX32300H

1AH

AHAL

DATA=300H,20H

执行后(AX)=201AH,

操作示意图如图4.9所示。

图4.9寄存器相对寻址示例

16

(6)基址加变址寻址

指令操作数域给出的是一个基址寄存器和一个变址寄存器,两寄

存器中的数据相加,作为操作数的偏移地址EA。基址寄存器主要有

BX、BP,变址寄存器主要有SI和DI。其中BX默认DS,BP默认SS,

允许使用段跨越,如图4.10所示。

段寄存器

图4.10基址加变址寻址示意图

例如指令:MOVAX,[BX][DI]或MOVAX,[BX+DI]

执行前(DS)=2100H,(BX)=0158H,(DI)=10A5H,

执行后(AX)=1234H,操作示意图如图4.1所示。

17

DS21000

BX0158

+DI10A5

221FD

AX221FDH

AHAL

/

图4.11基址加变址5

(7)相对基址加变址寻址

指令操作数域给出一个基址寄存器、变址寄存器和一个偏移量,两

寄存器中的数据及偏移量相加,作为操作数的偏移地址EA。基址寄存器

主要有BX、BP,变址寄存器主要有SI和DI。BX默认DS,BP默认SS。

MOVAX,MASK[BX][DI]

MOVAX,MASK[BX+DI]

MOVAX,[MASK+BX+DI]

执行前(DS)=3000H,(BX)=2000H,(DI)=1000H,

MASK=0250H

执行后(AX)=4675H,操作示意如图4.12所示。

图4.12相对基址加变址寻址示例

19

2.转移地址寻址方式

主要用来确定转移指令和CALL指令的目标地址,其目标地址可

能在当前代码段内,也可能在当前代码段外,故有4中方式。

(1)段内相对寻址

转移地址由IP的当前值与指令中给出的8位或16位偏移量相加而

生成。偏移量是一个带符号的数,用补码表示。其中8位偏移量称为

段内短转移SHORT,转移范围为-128~+127;16位偏移量称为段内

近转移NEAR,转移范围-32768+32767。其示意如所示。

指令IP

偏移量一>(+)<—偏移地址

I_.

EA

图4.13段内相对寻址示意图

20

段内相对寻址的特点是代码段寄存器CS的值保持不变。指令格式

如下:

JMPSHORTOPR;IP=(IP)+8位偏移量

JMPNEARPTROPR;IP-(IP)+16位偏移量

(2)段内间接寻址

转移指令的偏移地址存放在一个16位的寄存器或存储器单元中,

用来取代IP中的当前值。该寄存器或存储器单元可由数据寻址方式中

除立即数之外的任何一种方式得到。其示意如84.所示。

寄存器

指令

数据寻址方式

存储器

图4.14段内间接寻址示意图

21

段内间接寻址的特点是CS的值不变,IP的值由16位寄存器或存储

器单元中的数据所取代。

例如指令:

JMPBX;BX中的数送入指令指针IP中

又如指令:

JMPWORDPTR[BX][SI]

;按照基址加变址的方式获取操作数,送入IP中

(3)段间直接寻址

在指令中直接给出16位段地址和16位偏移地址,分别送入CS和IP中。

例如指令:JMPFARPTRNEXTSUB

段间寻址由FAR来说明,其中NEXTSUB是符号地址,指令直接给

出,包括转移目标的偏移地址和段地址。

22

(4)段间间接寻址

转移地址存放在存储器中的两个连续字单元中,第一个字是偏移

地址,第二个字是段地址。存储器单元地址可用数据寻址方式中除立

即数和寄存器直接寻址以外的任何一种寻址方式来确定,如所

O

JMPDWORDPTR[BX]

由BX确定两个连续存储器单元,取出其中的数分别送入IP和CS中.

23

4.38086指令系统

8086指令系统按功能可分为6种类型,即数据传送指令、算术运算

指令、逻辑运算指令、串操作指令、程序控制指令和处理器控制指令。

4.3.1数据传送类指令

4.3.2算术运算类指令

4.3.3逻辑运算与移位类指令

4.3.4串操作类指令

4.3.5控制转移类指令

4.3.6处理器控制类指令

4

4.3.1数据传送类指令

数据传送类指令共有14条,可分为4种类型:通用数据传送指令、

地址传送指令、标志寄存器传送指令和输入输出指令。

1.通用数据传送指令

(1)传送指令MOV

格式:MOVDST,SRC

功能:DST-(SRC)

说明:DST表示目的操作数地址,SRC表示源操作数地址,其中

目的操作数不能是立即数、CS和IP寄存器;两存储器单元之间和两段

寄存器之间不能直接传送;立即数不能直接传送到段寄存器;允许段

跨越,不影响标志位。源/目操作数传送关系如图4.16所示。

25

段寄存器

<———>

DSSSES通用寄存器[各寄存器

立即数AXBXCXDX之间互传

BPSPSIDI

r

存储器<———>

图4.16源操作数与目的操作数规定

例如指令:

MOVAX,DX;源与目操作数均为16位

MOVAL,ES:[BX];目的操作数8位,即说明源操作数也为8位

【例4」】将地址为ADD1存储器单元中的数据传送到同段内地址为

ADD2的存储器单元中。

解:使用传送指令,程序如下:

MOVAL,ADD1

MOVADD2,AL

26

【例4.2】将立即数DAT1传送到段寄存器ES中。

解:由于ES不能直接传送立即数,因此需要借用其它寄存器来实现,程序

如下:

MOVAX,DAT1

MOVES,AX

(2)堆栈操作指令

压栈指令PUSH

格式:PUSHSRC

功能:SP-(SP)-2

(SP)+1,(SP)=(SRC)

弹栈指令POP

格式:POPDST

功能:DST-((SP)+1,(SP))

SP-(SP)+2

27

说明:堆栈操作指令以字为单位,可以使用除立即数以外的其它

寻址方式,允许段跨越;PUSHCS合法,但POPCS非法;不影响状

态志位。

(3)交换指令XCHG

格式:XCHGOPRI,OPR2

功能:(OPR1)-(OPR2)

说明:XCHG指令不适用段寄存器和立即数,不允许两存储器单

元直接交换,两操作数可以是8位或16位。允许段跨越,不影响状态

标志位。例如指令:

XCHGAL,BL;两操作数均为8位

XCHGAX,SS:[SI];AX寄存器指明操作数为16位

(4)换码指令XLAT

格式:XLATOPR或XLAT

功能:AL-((BX)+(AL))

28

说明:OPR表示表格中的地址,BX存放表格首地址,AL存放待

查值(偏移量),查得结果送AL中,不影响状态标志位。

【例4.5]在以DATA为首地址的主存区域中连续存放着0~9的平方

表,试编写查表程序。

解:首地址存入寄存器BX中,待查数据X送入AL中。

MOVBX,OFFSETDATA

MOVAL,X

XLATDATA或XLAT

2.地址传送指令

(1)有效地址送寄存器指令LEA

格式:LEAREG,SRC

功能:REG-SRC

说明:将源操作数的有效地址传送到指定的寄存器REG中,源操

作数可以是除立即数和寄存器寻址以外的其它寻址方式;允许段跨

越;不影响状态标志位。

29

【例4.6】将例4.5中DATA首地址存入寄存器BX中。

解:使用LEA指令,程序如下:

LEABX,DATA

(2)指定寄存器与段寄存器DS置数指令LDS

格式:LDSREG,SRC

功能:REG-(SRC)

DS-(SRC+2)

说明:把存储器中两个连续字单元中的数据传送到指定寄存器和

DS中,不影响状态标志。

例如指令:LDSSL[1508H]

;把DS和[1508H]所指定单元的字操作数送入寄存器SL下一单元的字

操作数送入段寄存器DS中。

3()

(3)指定寄存器与段寄存器ES置数指令LES

格式:LESREG,SRC

功能:REG-(SRC)

ES-(SRC+2)

说明:与指令LDS功能相同,段寄存器选择ES。

例如指令:LESDL[DI]

3.状态标志寄存器传送指令

(1)状态标志寄存器低8位送AH指令LAHF

格式:LAHF

功能:AH-(PSW的低字节)

说明:不影响状态标志位。

(2)寄存器AH送状态标志寄存器低8位指令SAHF

格式:SAHF

功能:PSW的低字节一(AH)

说明:状态标志寄存器的低8位由装入的数值来确定。

31

(3)状态标志寄存器压栈指令PUSHF

格式:PUSHF

功能:SP-(SP)-2

(SP)+1,(SP)—(PSW)

说明:不影响状态标志位。

(4)状态标志寄存器弹栈指令POPF

格式:POPF

功能:PSW-((SP)+1,(SP))

SP-(SP)+2

说明:影响状态标志寄存器,由装入的数值来确定。

4.输入输出指令

有两条,即IN和OUT,实现AL或AX与外设端口之间的数据传送。

32

(1)输入指令IN

格式:INAL,PORT

INAX,PORT

INAL,DX

INAX,DX

功能:AL-(PORT)

AX-(PORT+1,PORT)

AL-((DX))

AX*((DX)+1,(DX))

其中PORT是I/O端口地址,且在00H~0FFH之间。

(2)输出指令OUT

格式:OUTPORT,AL

33

(2)输出指令OUT

格式:OUTPORT,AL

OUTPORT,AX

OUTDX,AL

OUTDX,AX

功能:PORT-(AL)

PORT+1,PORT-(AX)

(DX)一(AL)

(DX)+1,(DX)—(AX)

说明:当端口地址为00H~0FFH时,可直接寻址;当端口地

址为0100H~0FFFFH时,必须使用寄存器DX间接寻址;不影响状

态志位。

34

4.3.2算术运算类指令

算术运算指令有20条,分5种类型,可对4种类型的数据进行运

算,即无符号二进制数、带符号二进制数、无符号压缩型BCD码和无

符号非压缩型BCD码。运算结果影响状态标志位。

1.加法指令

(1)加法指令ADD

格式:ADDDST,SRC

功能:DST+(DST)+(SRC)图4.17加法运算源/目操作数地址

说明:①源/目操作数地址如图4.17所示,其中目的操作数不能使用

立即数,两存储器单元之间不允许直接加法运算;允许段跨越;

②ADD指令不区分两个加数是无符号数还是带符号数,运算

结果的二进制形式相同,影响状态标志位。

35

例如指令:

ADDAL,[BX];AL寄存器指明操作是字节操作

ADDWORDPTR[BX],12H

;WORDPTR指明内存操作数为字操作数

又如指令:ADDAX,BX

设(AX)=1234H,(BX)=0F7C9H

指令执行后(AX)=09FDH,OF=0,SF=O,ZF=0,AF=0,

PF=0,CF=1

(2)带进位加法指令ADC

格式:ADCDST,SRC

功能:DST-(DST)+(SRC)+CF

说明:进位位CF的值加到两数和的最低位,其它与ADD指令相同。

36

【例4.7】试编写程序,计算双字4A750000H+78912365H之和。

解:按照双字操作,由寄存器DX和AX组成32位累加器,先用ADD

指令进行低字运算,再用ADC指令进行高字运算,程序如下:

MOVAX,0000H

MOVDX,4A75H

ADDAX,2365H

ADCDX,7891H

(3)加11指令INC

格式:INCDST

功能:DST-(DST)+1

说明:操作数可以是除立即数之外的其它寻址方式,可以字节运

算,也可以字运算,且不区分无符号数还是带符号数;允许段跨越;

影响除CF之外的其它状态标志位。

37

2.减法指令

(1)减法指令SUB

格式:SUBDST,SRC

功能:DST+(DST)-(SRC)

说明:①源/目操作数地址如图4.16所示,目的操作数不能使用立即

数,两存储器单元不能直接进行减法运算;允许段跨越。

②不区分操作数是无符号还是符号数,运算结果的二进制形式

相同,影响状态标志位。

例如指令:SUBAX,[BX]

设(AX)=578FH,(DS)=1000H,(BX)=2000H,(12000H)

=7890H

指令执行后(AX)=ODEFFH,OF=0,SF=1,ZF=O,AF=O,PF=1,

CF=1

38

(2)带借位减法指令SBB

格式:SBBDST,SRC

功能:DST-(DST)-(SRC)-CF

说明:被减数减去减数,同时再减进位位CF的值,其它与减法指令

SUB相同。

(3)减1指令DEC

格式:DECDST

功能:DST-(DST)-1

说明:同INC指令。

例如指令:DECCX

(4)求补指令NEG

格式:NEGDST

功能:DST*-O-(DST)

说明:操作数同INC指令,影响所有状态标志位,操作数为零时

CF=1,其它情况下CF=O。

39

例如指令:NEGAX

设(AX)=OFFFFH

指令执行后(AX))=0001H,OF=0,SF=O,ZF=O,AF=1,

PF=O,CF=1

(5)比较指令CMP

格式:CMPDST,SRC

功能:(DST)-(SRC)置状态标志位

说明:进行减法运算,不送结果,置状态标志位。

3.乘法指令

(1)无符号数乘法指令MUL

格式:MULSRC

功能:AX*(AL)X(SRC)字节操作

DX,AX-(AX)X(SRC)字操作

40

说明:①源/目操作数均为无符号数;

②目的操作数必须是累加器AX或AL,源操作数可以是除立即数之

外的其它寻址方式;源操作数允许段跨越;

③除OF和CF之外的状态标志无定义;执行MUL指令后,若乘积

的高字/高字节为0,贝!IOF=CF=0;否则,OF=CF=lo

【例4.9】将DAT1和DAT2两个字节单元的无符号数相乘,乘积存放

在DAT3字单元中。

解:使用无符号指令,程序如下:

MOVAL,DAT1

MULDAT2

MOVDAT3,AX

(2)带符号数乘法指令IMUL

格式:IMULSRC

功能:操作数为带符号数,其它与MUL相同。

41

说明:①源/目操作数均为带符号数;

②同MUL指令;

③除OF和CF之外的标志无定义;执行IMUL指令后,若乘积的高

字/高字节是符号扩展位时,贝!IOF=CF=0;否则,OF=CF=1。

4.除法指令

(1)无符号数除法指令DIV

格式:DIVSRC

功能:AL-(AX)/(SRC)的商AH-余数

AX-(DX,AX)/(SRC)的商DX-余数

说明:①字节运算时16位的被除数存放在AX中,字运算时32位的

被除数存放在DX,AX中;除数可以是除立即数之外的其它寻址方

式,允许段跨越;

②所有状态标志位无定义。

42

(2)带符号数除法指令IDIV

格式:IDIVSRC

功能:操作数是带符号数,其它与DIV相同。

说明:被除数的长度不是除数的2倍时,被除数高位符号扩展,其它

与DIV指令相同。

【例4.10]设(AX)=0400H,(BL)=0B4H,执行指令DIVBL和IDIV

BLo

解:①执行指令DIVBL

由于(AX)和(BL)为无符号数,因此指令DIVBL执行后:

(AL)=05HAL一商

(AH)=7CHAH-余数

43

②执行指令IDIVBL

由于(AX)和(BL)为带符号的补码数,因此指令IDIVBL执行后:

(AL)=0F3H=-13DAL一商

(AH)=24H=36DAH-余数

在除法运算时若商溢出,直接转入0型中断处理。

(3)CBW符号位扩展指令

格式:CBW字节转换为字

CWD字转换为双字

功能:字节扩展AH-(AL)的符号位

字扩展DX-(AX)的符号位

5.十进制调整指令

在BCD码数据运算后必须修正,该类指令共有6条。

44

(1)非压缩BCD码加法调整指令AAA

格式:AAA

功能:AL一把AL中的和调整成非压缩BCD码格式

AH-(AH)+调整产生的进位值

说明:影响状态标志CF和AF,其余标志位无定义。

例如指令:ADDAL,BL

AAA

(2)压缩BCD码加法调整指令DAA

格式:DAA

功能:AL一把AL中的和调整成压缩BCD码格式

说明:两加数为压缩BCD码,状态标志OF无定义,影响其余状态

志位。

例如指令:ADDAL,BL

DAA

45

(3)非压缩BCD码减法调整指令AAS

格式:AAS

功能:AL一把AL中的差调整成非压缩BCD码格式

AH-(AH).调整产生的借位

说明:两操作数为非压缩BCD码,影响状态标志CF和AF,其余标

志位无定义。

(4)压缩BCD码减法调整指令DAS

格式:DAS

功能:(AL)一把AL中的差调整成压缩BCD码格式

说明:两操作数为压缩BCD码,状态标志OF无定义,影响其余标志

(5)非压缩BCD码乘法调整指令AAM

格式:AAM

功能:AX+把AL中的乘积调整成非压缩的BCD码格式

说明:两乘数为非压缩BCD码,影响状态标志SF、ZF和PF,其余

标志位无定义。

46

例如指令:MULAL,BL

AAM

(6)非压缩BCD码除法调整指令AAD

格式:AAD

功能:AL-10X(AH)+(AL)

AH-0

说明:①在指令DIV之前使用,被除数是两位非压缩BCD码,存放

在AX中,AH中存放十位数字,AL中存放个位数字,且高4位均为

0;除数是一位非压缩的BCD码,高4位为0;调整结果在AL中,AH

中清0;执行其后的DIV指令后,AL中为一位非压缩BCD码的商,

AH中为一位BCD码的余数;

②影响状态标志SF、ZF和PF,其余OF、CF和AF标志位无

定义。

47

433逻辑运算与移位类指令

逻辑运算与移位指令有13条,分为3类,即逻辑运算指令、移位指令

和循环移位指令,可对8位/16位寄存器或存储器中的数据进行操作。

1.逻辑运算指令

逻辑运算指令有5条,其中源/目操作数地址同算术运算指令。

(1)逻辑“与"指令AND

格式:ANDDST,SRC

功能:DST-(DST)A(SRC)

说明:使状态标志CF和OF清0,AF无定义,SF、ZF和PF由运算结

果设置。

例如指令:ANDAX,1110111101111111B

;使AX中第7、12位清0,其余位不变

48

(2)逻辑“或”指令OR

格式:ORDST,SRC

功能:DST-(DST)V(SRC)

说明:对状态标志位的影响同AND指令。

例如指令:ORBX,0001000010000000B

;使BX中第7位、12位置1,其余位不变。

(3)逻辑“异或”指令XOR

格式:XORDST,SRC

功能:DST-(DST)㊉(SRC)

说明:对状态标志位的影响同AND指令。

例如指令:XORAL,10100000B

;使AL的第5、7位取反,其余位不变。

49

将AX和CF清零。

解:实现方法有多种,如下:

方法1:ANDAX,0

方法2:XORAX,AX

方法3:SUBAX,AX

(4)逻辑“非”指令NOT

格式:NOTDSTDST

功能:DST*-(DST)

说明:不影响标志位。

⑸TEST测试指令

格式:TESTDST,SRC

功能:(DST)A(SRC)置状态标志,不送结果

说明:执行过程与AND指令相同,设置状态标志,不送结果;对状

态标志位的影响同AND指令。

50

例如指令:TESTAX,0040H;测试AX中第6位是否为1

2.移位指令

移位指令有4条,包括算术/逻辑左移与右移,其作用如图4.18所示。

(1)算术左移指令SAL

格式:SALDST,CNT

功能:左移,如图4.18(a)所示,相当于操作数乘以2。

说明:①DSF可以是除立即数之外的任一种寻址方式,移位次数由

CNT决定,CNT可以是1或寄存器CL;DST可以是字节,也可以是

字;

②影响状态标志CF、SF、PF和ZF,AF无定义,OF只在CNT=1时

有效。

(2)算术右移指令SAR

51

格式:SARDST,CNT

功能:右移,如所示,相当于操作数除以2。

说明:操作数同指令SAL,对状态标志位的影响同指令SAL。

CF<-<<—0>CF

DST—DST

(a)算术左移(b)算术右移

CF<—<<—0()—>>—>CF

DSTDST

(C)逻辑左移(d)逻辑右移

图4.18移位指令示意图

(3)逻辑左移指令SHL

格式:SHLDST,CNT

功能:左移,如图4.18(c)所示,相当于无符号数乘2。

说明:操作数同指令SAL,对状态标志位的影响同指令SAL。

52

(4)逻辑右移指令SHR

格式:SHRDST,CNT

功能:右移,如图4.18(d)所示,相当于无符号数除2。

说明:操作数同SAL指令,对状态标志位的影响同指令SAL。

3.循环移位指令

循环移位指令有4条,包括带进位/不带进位的循环左移与右移,其

作用如图4.19所示。

(1)循环左移指令ROL

格式:ROLDST,CNT

功能:循环左移,如图4.19(a)所示。

说明:影响状态标志位CF,OF只在CNT=1时有效,不影响SF、

PF、ZF和AF。

53

DSTDST

CF

(a)循环左移(b)循环右移

DSTDST

CF<<,CF>>

(C)带进位循环左移(d)带进位循环右移

图4.19循环移位指令的操作示意图

(2)循环右移指令ROR

格式:RORDST,CNT

功能:循环右移,如图4.19(b)所示。

说明:同指令ROL。

(3)带进位循环左移指令RCL

格式:RCLDST,CNT

功能:带进位循环左移,如图4.19(所示。

说明:同指令ROL。

54

(4)带进位循环右移指令RCR

格式:RCRDST,CNT

功能:带进位循环右移,如图4.19(d)所示。

说明:同指令ROL。

【例4.12]在寄存器DX和AX中存放有32位无符号二进制数,试编写

程序,实现乘4运算。

解:由于是32位数据,因此需要先对低16位左移,再对高16位带进位

左移,重复两遍,即乘4,程序如下:

SHLAX,1

RCLDX,1

SHLAX,1

RCLDX,1

55

4.3.4串操作类指令

在程序设计中经常遇到成组数据处理,比如对一串字符进行处

理,可以是字节串,也可以是字串。所处理的字符长度可达64KB字节。

串操作指令隐含寄存器和标志位的作用如表4.:所示。串操作指令有5

条,重复前缀有3条。

表4.1串指令的寄存器和标志位作用

寄存器作用

SI源串变址寄存器,段地址在DS中(允许段超越前缀修改)

DI目的串变址寄存器,段地址在ES中(不允许修改)

CX重复执行次数计数器

AL/AXLODS指令目的操作数,STOS指令的源操作数

DF=O时SKDI自动增值(字节增1,字增2)

DF

DF=1时SKDI自动减值(字节减1,字减2)

FLAG

ZF控制比较/扫描操作结果

56

1.串传送指令MOVS

格式:MOVSDST,SRC

MOVSB(字节)

MOVSW(字)

功能:(DI)-((SI))

字节操作:SI-(SI)±1,DI<-(DI)±1

字操作:SI-(SI)±2,DI<-(DI)±2

说明:①指令MOVS在操作数地址的前面用关键字BYTE/WORD

PTR说明是字节传送还是字传送;

②当标志位DF=0时,地址递增;DF=1时,地址递减;

2.串比较指令CMPS

格式:CMPSSRC,DST

CMPSB(字节)

CMPSW(字)

功能:((SI)H(DI))置状态状态标志,不送结果

57

字节操作:SI^(SI)±1,DI-(DI)±1

字操作:SI<-(SI)±2,DI-(DI)±2

说明:同指令MOVS。

3.串扫描指令SCAS

格式:SCASDST

SCASB(字节)

SCASW(字)

功能:用AL/AX中的数据减去DI指示的数据,置状态标志,但不

送结果。

字节操作:(AL)・((DI)),DI-(DI)±1

字操作时:(AX).((DI)),DI-(DI)±2

说明:同指令MOVS。

58

4.串装入指令LODS

格式:LODSSRC

LODSB(字节)

LODSW(字)

功能:从SI指示的存储器单元读取数据,送入AL/AX中。

字节操作:(AL)一((SI)),SI-(SI)±1

字操作:(AX)一((SI)),SI-(SI)±2

说明:同指令MOVS。

5.串存储指令STOS

格式:STOSDST

STOSB(字节)

STOSW(字)

功能:把AL/AX中的数据传送到DI指示的存储器单元中。

字节操作:(DI)一(AL),DI-(DI)±1

字操作时:(DI)一(AX),DI-(DI)土2

说明:同指令MOVS。

59

6.串重复前缀指令

串重复前缀指令有三条,用来修饰串操作指令,使之重复执行。

(1)重复前缀指令

格式:REPStringprimitive;可作用于指令MOVS、LODS或

STOS

(2)相等时重复前缀指令

格式:REPE/REPZStringprimitive;可作用于指令CMPS或

SCAS

(3)不相等时重复前缀指令

格式:REPNE/REPNZStringprimitive;可作用于指令CMPS或

SCAS

【例4.13]若在主存TABLE起始的区域中存放有1K字节的数据,试

编程将该数据块传送到NEXT起始的区域中。

60

解:首先设置源/目操作数起始地址,然后使用重复传送指令编

程,程序如下:

MOVAX,SEGTABLE

;SEG是取值运算符,将TABLE标号所在段的段地址送入累加器AX中

MOVDS,AX

MOVAX,SEGNEXT

MOVES,AX

MOVSI,OFFSETTABLE

;OFFSET是取值运算符,将TABLE所在段的段内偏移地址送入寄存

器SI中

MOVDLOFFSETNEXT

MOVCX,1024

CLD;使DF=0

REPMOVSB

61

4.3.5控制转移类指令

控制转移指令有28条,分5种类型,主要用于控制程序的执行流程。

1.无条件转移指令

可段内转移,也可以段间转移,有4种寻址方式,详见422节。

格式:JMPOPR;其中OPR为标号

功能:段内转移IP-OPR偏移地址,CS不变

段间转移CS-OPR段地址,IP-OPR偏移地址

2.条件转移指令

以状态标志寄存器(PSW)相应位的值为依据,满足条件则转移,

属段内短转移,相对偏移量为428〜+127字节。

(1)单标志位转移指令

62

①JZ/JEOPR

功能:若ZF=L结果为0,转移到OPR处执行程序,否则顺序执行。

@JNZ/JNEOPR

功能:若ZF=0,结果不为0,转移到OPR处执行程序,否则顺序执行。

③JCOPR

功能:若CF=L有进位,转移到OPR处执行程序,否则顺序执行。

@JNCOPR

功能:若CF=0,无进位,转移到OPR处执行程序,否则顺序执行。

⑤JOOPR

功能:若OF=L有溢出,转移到OPR处执行程序,否则顺序执行。

(6)JNOOPR

功能:若OF=0,无溢出,转移到OPR处执行程序,否则顺序执行。

63

⑦JSOPR

功能:若SF=L结果为负,转移到OPR处执行程序,否则顺序执行。

@JNSOPR

功能:若SF=0,结果为正,转移到OPR处执行程序,否则顺序执行。

(9)JPE/JPOPR

功能:若PF=L奇偶标志为1,转移到OPR处执行程序,否则顺序执行。

@JPO/JNPOPR

功能:若PF=0,奇偶标志为0,转移到OPR处执行程序,否则顺序执行。

(2)无符号数比较转移指令

@JA/JNBEOPR

功能:若CF=0或ZF=0,被减数高于减数,转移到OPR处执行程序,

否则顺序执行。

64

®JNA/JBEOPR

功能:若CF=1或ZF=L被减数低于或等于减数,转移到OPR处执行

程序,否则顺序执行。

(3)JNAE/JBOPR

功能:若CF=L被减数低于减数,转移到OPR处执行程序,否则顺

序执行。

@JAE/JNBOPR

功能:若CF=0,被减数不低于减数,转移到OPR处执行程序,否

则顺序执行。

(3)带符号数比较转移指令

@JL/JNGEOPR

功能:若SF㊉OF=L被减数小于减数,转移到OPR处执行程序,否

则顺序执行。

@JNL/JGEOPR

65

功能:若SF㊉OF=0,被减数大于或等于减数,转移到OPR处执

行程序,否则顺序执行。

@JLE/JNGOPR

功能:若ZF=1或SF㊉OF=L被减数小于或等于减数,转移到

OPR处执行程序,否则顺序执行。

@JNLE/JGOPR

功能:若ZF=O且SF㊉OF=0,被减数大于减数,转移到OPR处执

行程序,否则顺序执行。

2.循环控制指令

控制程序的重复执行,以CX中的值或CX与ZF标志位的值结合,作为

转移条件,属段内短转移,相对偏移量为-128〜+127字节。

(1)循环指令

66

格式:LOOPOPR

功能:CX<-(CX)-L测试(CX)#0,转移到标号处继续循环,否则退出循环。

(2)相等或为0时转移

格式:LOOPZ/LOOPEOPR

功能:CX*-(CX)-L测试(CX)WO且ZF=L转移到标号处继续循环,否则

退出循环。

(3)不相等或不为0时转移

格式:LOOPNZ/LOOPNEOPR

功能:CX-(CX)-1,测试(CX)#0且ZF=0,转移到标号处继续循环,否则

退出循环。

(4)测试转移指令

格式:JCXZOPR

功能:测试(CX)=0,转移到标号处继续循环,否则顺序执行。

67

【例4.14]编写程序,求1+2+3+.・・+100的累加和,结果保存在AX寄

存器中。

解:采用循环累加的方法编程,程序如下:

MOVAX,0

MOVCX,100

LP:ADDAX,CX

LOOPLP

3.子程序调用与返回指令

子程序通过指令CALL调用,执行完后,通过指令RET返回,有4种

寻址方式,可以段内调用,也可以段间调用。

(1)子程序调用指令

格式:CALLDST;其中DST为子程序名(也称为过程名)。

68

功能:①段内调用SP-(SP)—2

(SP)+L(SP)-(IP);返回地址压栈

IP-DST偏移地址

②段间调用SP-(SP)—2

(SP)+L(SP)-(CS);返回段地址压栈

SP-(SP)-2

(SP)+1,(SP)-(IP);返回偏移地址压栈

IP-DST偏移地址

CS-DST段地址

(2)子程序返回指令RET

作为子程序的最后一条指令,从堆栈中弹出断点地址,装入IP或

IP与CS中,即返回到主程序的断点处。若带参数(指令RETN),

使堆栈指针SP移动N个偶数字节单元。

69

格式:RET或RETN;其中N是一个整型表达式

功能:①段内返回IP-((SP)+L(SP))

SP-(SP)+2

带参数返回时还要再执行下面的一步操作

SP-(SP)+N

②段间返回IP-((SP)+L(SP))

SP-(SP)+2

CS*((SP)+L(SP))

SP-(SP)+2

带参数返回时还要再执行下面的一步操作

SP-(SP)+N

4.中断指令

(1)中断指令INT

70

格式:INTOPR

功能:SP-(SP)—2

(SP)+1,(SP)-PSW

SP-(SP)-2

(SP)+1,(SP)-(CS)

SP+(SP)-2

(SP)+1,(SP)-(IP)

IP-(OPRX4)

CS-(0PRX4+2)

其中OPR为中断类型码,其值在0~255范围内。

(2)溢出中断指令INTO

格式:INTO

功能:PSW、CS、IP压栈

71

IP-(10H)

CS-(12H)

(3)中断返回指令IRET

格式:IRET

功能:IP-((SP)+1,(SP))

SP-(SP)+2

CS*((SP)+L(SP))

SP*-(SP)+2

PSW-((SP)+1,(SP)

SP-(SP)+2

指令INT和INTO只影响控制标志IF和TF,使IF=TF=O,不影响其余标

志位;中断返回指令IRET影响所有标志位。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论