第5章86系列微型计算机的指令系统_第1页
第5章86系列微型计算机的指令系统_第2页
第5章86系列微型计算机的指令系统_第3页
第5章86系列微型计算机的指令系统_第4页
第5章86系列微型计算机的指令系统_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

第五章

86系列微型计算机的指令系统

汇编指令格式

寻址方式

8086指令系统5.1汇编指令的格式DATA SEGMENTSTR DB“Howdoyoudo?$” DATA ENDSSTACK SEGMENT STACK DB 200DUP(?)STACK ENDSCODE SEGMENT ASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATA MOV DS,AX LEA DX,STR MOV AH,9 INT

21H MOV AH,4CH INT 21HCODE ENDS END START5.1.1汇编语言源程序结构介绍例:显示信息“Howdoyoudo?”任何一种汇编语言的指令语句都是与机器指令一一对应的,它通过汇编程序将其翻译成机器指令代码(目标代码),让CPU执行某种操作。图中由前向后的箭头表示是可选项,由后向前的箭头表示是重复项,圆头方框表示是语句中的关键字。5.1.2汇编指令的格式标号是给该指令所在地址取的名字,必须后跟冒号“:”,它可以缺省,是可供选择的标识符。-86系列汇编语言中可使用的标识符必须遵循下列规则:①标识符由字母(a-z,A-Z)、数字(0-9)或某些特殊字符(@,-,?)组成。②第一个字符必须是字母(a-z,A-Z)或某些特殊的符号(@,-,?),但“?”不能单独作标识符。③标识符有效长度为31个字符,若超过31个字符,则只保留前面的31个字符为有效标识符。下面是有效的标识符:

START:MY-CODE:ALPHA:

NUM@-1:LOOP1:X:?MORE-350:BETA-1:DELAYIS:下面是无效的标识符:

4LOOP:MAIN

A/B:

BETA*:START=3:GAMA$1:

NUM+1:?:ONE*TWO:(2)指令助记符又称操作码,表示本指令的操作类型,是指令语句中的关键字,不可缺省。必要时可在指令助记符的前面加上一个或多个“前缀”,从而实现某些附加操作。(3)操作数是参加本指令运算的数据,有些指令不需要操作数,可以缺省;有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开;有些操作数可以用表达式来表示。(4)注释部分是可选项,允许缺省,如果带注释则必须用分号(;)开头,注释本身只用来对指令功能加以说明,给阅读程序带来方便,汇编程序不对它做任何处理。5.1.3操作数类型

计算机中的一条指令通常包含两部分:

依据操作数的个数划分,80X86CPU指令系统中的指令格式最常用的有:双操作数指令、单操作数指令和无操作数指令。

操作码操作数一、操作数类型-格式:[标号:]操作符OPD,OPS

[;注释]-操作规定:(1)OPD与OPS应为同种操作类型且类型明确,即同为字节类型或字类型。(2)OPD不能是立即数。(3)OPS和OPD不能同时为存储器操作数,即:或者是OPS和OPD中至少有一个为寄存器操作数,或者是OPD为存储器操作数,OPS为立即数。(4)操作结束后,运算结果存入OPD中,OPS内容不变。二、双操作数指令汇编格式及操作规定-格式:[标号:]操作符OPD

[;注释]-操作规定:(1)OPD类型必须明确即为字节类型或字类型,不能是模糊类型。(2)操作对象为目的操作数,操作结束后结果存入OPD中。(3)OPD不能是立即数,只能是寄存器操作数或存储器操作数。三、单操作数指令汇编格式及操作规定-格式:[标号:]操作符

[;注释]-操作规定:指令中只有操作码,不含操作数,这种指令有两种可能:(1)无需任何操作数。如停机指令、空操作指令等。(2)所需操作数是隐含指定的,操作时取固定操作数进行操作。

四、无操作数指令汇编格式及操作规定

5.2寻址方式

-寻址方式:寻找指令中所需操作数存放地址的方式或程序转移时寻找转移地址的方式。-寻址方式分类:数据寻址方式、转移地址寻址方式。由于80X86指令涉及四种操作数:立即操作数、寄存器操作数、存储器操作数和隐含操作数,因此,数据寻址方式又可对应四种寻址方式,即:立即寻址、寄存器寻址、存储器寻址和固定寻址。

1、立即寻址-因为操作数可以从指令中直接取得,不需要运行总线周期,所以,立即数寻址方式的显著特点就是速度快。立即数只能是整数,不能是小数、变量或者其他类型的数据。-立即寻址只能用于源操作数,不能用于目的操作数。

2、寄存器寻址-此寻址方式由于存取操作数直接从CPU内部寄存器中获得,不需访问存储器,因而指令执行的速度快。-寄存器寻址既可用于源操作数,又可用于目的操作数,应用频率高。-存储器寻址方式的操作数都是存放在存储器中,一般是数据段、附加段、堆栈段中的存储单元。指令中给出的是存储单元的地址或产生存储单元地址的表达式。存储单元地址是采用逻辑地址表示(段首址:段内偏移地址)

--段首址存放在某个段寄存器中;

--段内偏移地址是指存放操作数的存储单元与段起始地址(段首址)之间的距离(字节数),又称为“有效地址”,记作EA。有效地址EA是由3个地址分量的某种组合求得,这3个地址分量是:位移量、基址、变址。-这3个地址分量的不同组合,使形成有效地址EA的方法不同,相应有以下5种不同的存储器操作数寻址方式。

3、存储器寻址(1)直接寻址-直接寻址是最简单的存储器寻址,这种寻址,操作数的有效地址EA由指令直接给出。它主要用于存取简单变量。-对使用直接寻址方式需说明以下几点:●操作数默认存放在数据段中,段寄存器DS在指令格式无须指定。●若操作数在代码段、堆栈段或附加段中,则在指令格式中必须指定相应的段寄存器名。在操作数地址之前使用前缀指出段寄存器名,这种前缀称为段超越前缀。MOVBX,CS:[3000H]●指令中操作数的EA即可以是一个数字,也可以是一个符号地址。当EA是一个数字时,一定要注意立即寻址方式与直接寻址方式的区别。●直接寻址方式适合于处理存储器的单个存储单元。

(2)寄存器间接寻址(一)(2)寄存器间接寻址(二)操作数的有效地址EA存放在SI、DI、BX或BP四个寄存器之一中,即:EA=(BX)或(BP)或(SI)或(DI)。-SI、DI、BX、BP叫间址寄存器。若用BX、SI或DI间址寻址时,则操作数默认在数据段中,且用DS内容作为段首址,操作数的物理地址为:(BX)

PA=(DS)×16+(SI)(DI)【例】MOVDL,[BX]-若指令中使用BP间址寻址时,则操作数默认在堆栈段中,且用SS的内容作为段首址,操作数的物理地址为:PA=(SS)×16+(BP)。【例】MOV[BP],AX

(3)基址寻址21-此寻址操作数的有效地址EA是指令中指定的基址寄存器的内容与指令中给出的位移量之和,即:EA=(BX)+位移量(BP)-该寻址方式中若以BX作为基址寄存器,则操作数默认在数据段中;若以BP作为基址寄存器,则操作数默认在堆栈段中,因而操作数的物理地址为:

PA=(DS)×16+(BX)+位移量

(SS)×16+(BP)+位移量-若操作数不在默认段中,则应使用段超越前缀明确指定。【例】MOVAX,[BX+7CH]MOVAX,[BP+COUNT]

(4)变址寻址-变址寻址与基址寻址类似,其操作数的有效地址EA是变址寄存器的内容与位移量之和,即:EA=(SI)+位移量(DI)-默认段是数据段,因而操作数的物理地址为:

PA=(DS)×16+(SI)+

位移量

(DI)-若操作数不在默认段中,则应使用段超越前缀明确指定。【例】MOVDX,COUNT[DI]MOVES:3480H[SI],AX

(5)基址加变址寻址-操作数的有效地址EA是指令中的基址寄存器的内容、变址寄存器的内容、位移量三个地址分量之和,即:EA=(BX)+(SI)+位移量(BP)+(DI)-该寻址方式中若基址寄存器采用BX,则操作数默认在数据段中;若基址寄存器采用BP,则操作数默认在堆栈段中,因而操作数的物理地址为:PA=(DS)×16+(BX)+(SI)+位移量(DI)

(SS)×16+(BP)+(SI)+位移量

(DI)

【例】设BX=0158H,DI=10A5H,位移量=1B57H,DS=2100H,并假定没有使用段前缀,即把DS作为操作数对应的段寄存器。在各种寻址方式下,这些寄存器和位移量所产生的有效地址和物理地址为:①直接寻址:MOVAX,[1B57H]有效地址=1B57H物理地址=21000H+1B57H=22B57H②寄存器间接寻址(寄存器为BX):

MOVAX,[BX]有效地址=0158H物理地址=21000H+0158H=21158H③基址寻址:MOVAX,[BX+1B57H]有效地址=0158H+1B57H=1CAFH物理地址=21000H+1CAFH=22CAFH④变址寻址(寄存器为DI):MOVAX,[DI+1B57H]有效地址=10A5H+1B57H=2BFCH物理地址=21000H+10A5H=220A5H⑤基址加变址寻址(BX为基址寄存器,DI为变址寄存器):

MOVAX,[BX+DI+1B57H]有效地址=0158H+10A5H+1B57H=2D54H物理地址=21000H+2D54H=23D54H写出下列指令执行后的结果:1、MOVAX,1234HMOVBX,5678HADDAX,BX2、MOVAX,BUF(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。执行后:(AX)=?

3、MOVAX,[BX]若(DS)=2000H,(BX)=1000H,(AX)=2030H,(21000H)=0A0H,(21001H)=50H,

(21002H)=56H,(21003H)=67H

1、(AX)=68ACH,(BX)=5678H2、(AX)=4545H3、(AX)=50A0H,(21000H)=0A0H,(21001H)=50H答案4、MOVAX,[BP](AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H(20032H)=5678H5、MOVAX,6[BX](AX)=0040H,(BX)=0030H,(DS)=2000H,(20035H)=50H(20036H)=00H,(20037H)=41H,(20038H)=78H6、MOVAL,[BX+SI](MOVAL,[BX][SI])(DS)=1000H,(BX)=0010H,(SI)=0002H,(10012H)=45H4、答案5、6、(AL)=45H(AX)=4100H

5.38086指令系统

8086指令系统按功能可分为六大类:(1)数据传送类指令(2)算术运算类指令(3)位操作指令(4)串操作指令(5)控制转移指令(6)处理器控制指令8086指令按操作数个数可划分为三种类型:(1)双操作数指令(2)单操作数指令(3)无操作数指令学习汇编指令应从以下几方面着重理解掌握:(1)学习指令格式;(2)掌握指令中操作数的寻址方式及寻址方式的搭配规则;(3)掌握指令的功能及指令执行后对条件码的影响;(4)学习如何正确运用指令。一、数据传送指令

1.通用数据传送指令

(1)传送指令MOV

格式:MOVOPD,OPS

功能:把源操作数传送到目的操作数。即:OPD←(OPS)说明:①源操作数和目的操作数的操作类型必须明确且一致;当指令中只有一个操作数的类型明确时,另一个操作数被视为同一类型;当两操作数类型均不明确时,必须用“BYTEPTR”或“WORDPTR”将一个存储器操作数定义为字节或字类型。②指令执行后,源操作数内容不变。③

指令执行后,对标志寄存器各位无影响。④

源操作数可以是通用寄存器、段寄存器、存储器和立即数;目的操作数也可以是通用寄存器、段寄存器、存储器,但立即数、CS段寄存器不能作为目的操作数。源操作数和目的操作数不能同时为存储器操作数。

用一条MOV指令能实现:

(a)立即数传送到通用寄存器或存储单元如MOVDL,’a’、MOVAX,1FA4H(b)寄存器之间的传送如MOVAX,BX、MOVAL,DH、MOVDS,AX

(c)寄存器与存储单元之间的传送如MOVDL,BUFBYTEMOVWORDPTR[BX+SI],AX

由于MOV指令中只允许一个操作数在存储器中,因此用一条MOV指令无法完成两个存储单元之间的数据传送,但可以用二条指令来实现。【例】把BUFWORD1字单元内容传送到BUFWORD2字单元中,可用以下指令完成:MOVAX,BUFWORD1MOVBUFWORD2,AX

立即数段寄存器存储单元通用寄存器图MOV指令传送路径(1)立即数到通用寄存器的传送立即数传送到通用寄存器主要用于给通用寄存器赋初值,立即数(8位或16位)与通用寄存器的类型必须匹配。立即数可以是各种数制(十进制、二进制、八进制、十六进制)的常数、ASCII字符和符号常数。例5-1:分析下列立即数到通用寄存器的传送指令。MOVAL,6;AL6,字节传送MOVAX,10;AX10,字传送MOVAL,1000H;非法指令,1000H为字,AL为字节寄存器MOVCX,0FFH;CX0FFH,字传送(十六进制)MOVAL,1010B;AL00001010B,字节传送(二进制)MOVAL,‘$’;AL24H(2)通用寄存器之间的数据传送CPU内部通用寄存器之间可以相互传送,传送时要注意两操作数类型必须匹配,即同为字节型或同为字型。例5-2:分析下列各条指令。MOVAX,BX;AX(BX),字型MOVCL,AL;CL(AL),字节型MOVAL,CX;非法指令,两操作数类型不一致(3)通用寄存器与存储单元之间数据传送通用寄存器与存储单元之间相互传送数据时,传送类型由通用寄存器类型来定。例3-3:分析下列各条指令。MOV[2000H],AL;[2000H](AL),字节传送MOV[2000H],AX;[2000H](AL),[2001H](AH),字传送MOVBH,[1050H];BH([1050H]),字节传送MOVBX,[1050H];BL([1050H]),BH[1051H]),字传送(4)通用寄存器与段寄存器之间、存储单元与段寄存器之间的数据传送由于段寄存器皆为16位寄存器,因此,通用寄存器与段寄存器之间、存储单元与段寄存器之间只能是字传送。另外,CS段寄存器不能作为传送指令的目标操作数。例5-4:分析下列各条指令。MOVDS,AX;DS(AX)MOVBX,CS;BX(CS)MOVCS,AX;非法指令,不允许给CS寄存器赋值MOVDS,AL;非法指令,操作数的类型不匹配MOV[1000H],DS;将16位段寄存器DS的内容送入1000H

(低字节)和1001H(高字节)单元中(5)立即数传送到存储单元当存储单元的类型不确定时,必须用BYTEPTR或WORDPTR属性操作符来指定存储单元的类型。例5-5:分析下列各条指令。MOVBUF1,20 ;BUF1为字节变量MOVSUM,0FFFFH ;SUM为字变量MOVBYTEPTR[1000H],8;字节型传送,表示将08传送到

1000H单元中MOVWORDPTR[1000H],8;字传送,将08传送到1000H

单元,将00传送到1001H单元MOV[2000H],10H;非法指令,无法确定操作类型①MOV指令不改变源操作数内容,不影响标志位。②源操作数和目的操作数应该有相同的类型,即必须同为字节型或同为字型。③代码段寄存器CS不能用作目的操作数,即不允许给CS赋值。④立即数不能用作目的操作数,立即数也不能直接传送给段寄存器。若要设置数据段寄存器DS的初值为2000H,不能直接用指令

MOVDS,2000H

可用如下两条指令表示:

MOVAX,2000HMOVDS,AX具体应用时要特别注意以下几点:例5-6:交换两个存储单元BUF1和BUF2的内容。MOVAX,BUF1;AX(BUF1)MOVBUF2,AX;BUF2(AX)⑥不允许在段寄存器之间直接传送数据。例如:MOVDS,ES为非法指令。⑤源操作数和目的操作数不能同时为存储单元操作数。

(2)交换指令XCHG

格式:XCHGOPD,OPS

功能:源操作数和目的操作数的内容相互交换。即:(OPD)←→(OPS)

说明:该指令与MOV指令相似,但在功能上有两点区别,其一,该指令不允许使用立即数和段寄存器作为操作数;其二,该指令改变源操作数的内容。

交换指令XCHG可以实现字节交换,也可以实现字交换。交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间执行数据交换过程。

【例】寄存器与寄存器、存储器之间数据交换。MOV AX,5678H ;(AX)=5678HMOV BX,0FFFFH ;(BX)=0FFFFHXCHG AX,BX ;(AX)=0FFFFH,(BX)=5678HXCHG[2530],CX;CX中的内容和2530,2531两单元的内容交换(3)查表转换指令XLAT格式:XLAT或XLATOPS功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据传送到AL中。即:AL←([BX+AL])字节*在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。执行XLAT指令可将任意一个十进制数翻译成7段显示码,其操作步骤如下:(1)将译码表定位到某个逻辑段的一片连续地址中,并将其表首址的偏移地址置入BX寄存器中。(2)将待翻译的十进制数字送入AL寄存器中。(3)执行XLAT指令。例如,假设这段数据存放在偏移地址为2000H开始的内存中,取出“3”所对应的7段码,用如下几条程序助记符即可完成:MOV

BX,2000H

MOV

AL,3

XLAT

2.地址传送指令

地址传送指令主要用于将存储器操作数地址(偏移地址、段地址)传送给指定的寄存器。它包括3条指令:LEA、LDS和LES。(1)传送有效地址指令LEA

格式:LEAREG16,OPS

功能:将源操作数的有效地址EA传送给目的操作数指定的16位通用寄存器。说明:①源操作数必须是存储器操作数,即OPS采用存储器寻址;目的操作数必须是一个16位通用寄存器。②本指令对标志位无影响。③该指令通常用来建立内存储器的寄存器指针。LEA

AX,[2728];将2728单元的偏移量送AX,指令执行后,AX中为2728

LEA

BX,[BP+SI];指令执行后,BX中的内容为BP+SI的值

(2)传送偏移地址及数据段首址指令LDS格式:LDSREG16,OPS功能:将由源操作数确定的双字存储单元的内容传送给DS及目的操作数指定的16位通用寄存器中,其中高字单元的内容送给DS,低字单元的内容送给REG16。说明:①源操作数必须是双字存储器操作数,即:OPS采用存储器寻址,寻找到相继4个字节的存储单元,低字单元中存放偏移地址,高字单元中存放段首地址;目的操作数必须是一个16位通用寄存器,通常特定为SI。

②本指令不影响标志位。例:设2130H~2133H这4个单元中存放着一个地址,2130H和2131H中为地址的偏移量,2132H和2133H中为地址的段值,执行指令:

LDSDI,[2130H];2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到DS。

(3)传送偏移地址及附加段首址指令LES格式:LESREG16,OPS功能:将由源操作数确定的双字存储单元的内容传送给ES及目的操作数指定的16位通用寄存器中,其中高字单元的内容送给ES,低字单元的内容送给REG16。说明:同LDS指令。*LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。

3.标志位传送指令

标志位传送指令有4条指令,即:LAHF、SAHF、PUSHF和POPF。(1)标志送AH指令LAHF格式:LAHF功能:将标志寄存器低8位的内容送入AH寄存器。即:AH←(FLAGS)7-0,该指令的执行不影响标志位。(2)AH标志送指令SAHF格式:SAHF功能:将AH寄存器的内容送入标志寄存器低8位,高8位保持不变。该指令用于设置或恢复SF、ZF、AF、PF、CF五个标志位,该指令的执行只影响标志寄存器的低8位,对高8位(即OF、DF、IF、TF)标志位无影响。从指令的功能上可看出,SAHF和LAHF为互逆过程。

(3)标志进栈指令PUSHF

格式:PUSHF

功能:将标志寄存器的内容压入堆栈。(4)标志出栈指令POPF

格式:POPF

功能:将栈顶字单元内容弹出到标志寄存器中。该指令的执行影响标志位。PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。PUSHF和POPF互为逆过程。

【例】将标志寄存器的单步标志TF置位。PUSHF ;(FLSGS)→↓(SP)POPAX ;(SP)→AXORAX,0100H ;设置D8=TF=1PUSHAX ;(AX)→↓(SP)POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS

标志位传送指令中SAHF和POPF指令将直接影响标志寄存器的内容。利用这一特性,可以方便地改变标志寄存器中指定位的状态.

4.堆栈操作指令堆栈操作的用途在子程序调用和中断处理过程时,分别要保存返回地址和断点地址,在进入子程序和中断处理后,还需要保留通用寄存器的值;子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。这些功能都要通过堆栈来实现,其中寄存器的保存和恢复需要由堆栈指令来完成。86系列指令系统中提供了专用的堆栈操作指令,其中PUSH是把字压入堆栈,POP是把字弹出堆栈。在程序中采用堆栈操作指令时,应预置堆栈段寄存器SS、堆栈指示器SP的值,同时,使SP的内容为当前堆栈段的栈顶。1)进栈指令PUSH语句格式:PUSHOPS功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。即:①(SP)-1→SP(OPS)15~8→[SP]②(SP)-1→SP (OPS)7~0→[SP]2)出栈指令POP语句格式:POPOPD功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。从POP指令功能可看出,该指令为PUSH指令的逆过程。即:①([SP])→(OPD)7~0 (SP)+1→SP②([SP])→(OPD)15~8 (SP)+1→SP例:将16位通用寄存器CX的内容压入堆栈,已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH。指令:PUSHCX例:将16位通用寄存器CX的内容弹出堆栈,已知:(SS)=0200H,(SP)=0006H,(CX)=12FAH。指令:POPCX二、算术运算指令

算术运算指令用来执行加、减、乘、除四则运算。它包括无符号数、有符号数的二进制算术运算指令和十进制算术运算调整指令。1加法指令(1)不带进位加法指令ADD(2)带进位加指令ADC(3)加1指令INC1.二进制数算术运算指令(1)加法运算指令加法运算指令包括ADD、ADC、INC三条指令。①加法指令ADD格式:ADDOPD,OPS功能:将目的操作数与源操作数相加,结果存入目的地址中,而源操作数不变。即:OPD←(OPD)+(OPS)。说明:该指令的源操作数或在通用寄存器或在存储单元中,也可以是立即数,而目的操作数只能在通用寄存器或存储单元中,不能是立即数,且两操作数不能同时为存储器操作数;操作数可以是字节或字,且两操作数的类型明确并一致。该指令相加后,根据得到的结果设置标志寄存器的OF、SF、ZF、CF、AF和PF标志位。ADD指令执行后对标志位的影响及作用如下,这里我们只重点说明OF、CF、SF和ZF四个标志位。OF:当两个有符号数相加时,若两个操作数的符号相同,而结果的符号与之相反,则OF=1,否则,其余情况OF=0。当OF=1时,说明两个有符号数相加产生了溢出,即和的值超出了有符号数的有效范围。在把操作数视为有符号数时,可通过该标志了解加法结果是否正确。CF:运算过程中当最高位产生进位时,则CF=1,否则,CF=0。当CF=1时,说明运算结果超出了无符号数的表示范围。

在把操作数视为无符号数时,可通过该标志了解加法结果是否正确。

SF:运算结果的最高位为1,则SF=1,否则,SF=0。ZF:运算结果为零时,则ZF=1;否则,ZF=0。②

带进位加法指令ADC

格式:ADC

OPD,OPS

功能:与ADD指令基本相同,惟一区别是将该指令执行前的CF值加至目的操作数中。即:OPD←(OPD)+(OPS)+CF

说明:该指令与ADD指令在功能上及结果对标志位影响上基本相同。该指令主要用于多字节的加法运算。

【例】无符号双字加法运算。MOV AX,4652H ;(AX)=4652HADD AX,0F0F0H ;(AX)=?,CF=?MOV DX,0234H ;(DX)=0234HADC DX,0F0F0H ;(DX)=?,CF=?(AX)=3742H,CF=1(DX)=0F325H,CF=0③加1指令INC格式:INCOPD功能:将目的操作数加1后送回目的地址中,并根据执行结果设置标志位OF、SF、ZF、AF、PF,但不影响CF位。说明:该指令的操作数可以是字或字节且类型必须明确。其操作数只能在通用寄存器或存储单元中,不能是立即数。该指令执行后对OF、SF、ZF、AF、PF标志位的影响与ADD指令相同。INC主要用于计数器的计数或修改地址指针。ADD

AL,50H;AL和50H相加,结果放在AL中ADD

CX,1000H;CX中的内容和1000H相加,结果放在CX中ADD

DI,SI;DI和SI的内容相加,结果放在DI中ADD[BX+DI],AX;BX+DI和BX+DI+1两个存储单元的内容和AX中的内容

;相加,结果放在BX+DI和BX+DI+1所指的存储单元中ADD

AX,[BX+2000H];BX+2000H和BX+2001H所指的两单元的内容和AX;的内容相加,结果放在AX中ADC

DX,[SI];SI和SI+1所指的存储单元的内容和DX的内容以及CF的值相加,结果放在DX中ADC

BX,3000H;BX的内容和立即数3000H以及CF的值相加,结果放在BX中ADC

AL,5;AL的内容和立即数5以及CF的值相加,结果送AL中例:ADC指令为实现多字节的加法运算提供了方便。比如,有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求进行运算后,得到的和放在2000H开始的内存单元中。可以用如下程序段实现这种多字节的加法:CLC

;清进位位CFMOV

SI,2000H;取第一个数的首地址MOV

AX,[SI];将第一个数的低16位取到AXMOV

DI,3000H;取第二个数的首地址ADDAX,[DI];

第一个数和第二个数的低16位相加MOV[SI],AX;低16位相加的结果送到2000H,2001H单元MOV

AX,[SI+2];取第一个数的高16位送到AX中ADC

AX,[DI+2];两个数的高16位连同进位位相加MOV[SI+2],AX;高16位相加的结果送到2002H,2003H单元2减运算指令(1)不带借位减法指令SUB(2)带借位减指令SBB(3)减1指令DEC(4)求补指令NEG(5)比较指令CMP

(2)减法运算指令减法运算指令包括SUB、SBB、DEC、NEG和CMP五条指令。①减法指令SUB

格式:SUBOPD,OPS

功能:目的操作数减去源操作数,其差值存入目的地址,源操作数不变,即:OPD←(OPD)-(OPS)。并按相减的结果设置标志位OF、CF、SF、ZF、AF和PF。说明:该指令的源操作数和目的操作数可以在通用寄存器或存储单元中,但两者不能同时在存储器中,立即数可作为源操作数,而不能作为目的操作数。两操作数可以是字节或字,且类型明确一致。SUB指令执行后对标志位的影响与ADD指令类似,下面仅说明CF和OF两位的设置情况及作用:

OF:当两个有符号数相减时,若两个操作数的符号相反,而结果的符号与减数相同,则OF=1,否则,其余情况OF=0。

OF=1时,说明有符号数减法溢出,结果是错误的。OF位可用来判断有符号数相减,结果是否正确。

CF:当两无符号数相减时,若减数大于被减数,则此时有借位,

CF=1,否则CF=0,CF值反映了无符号数相减时是否有借位。②带借位减法指令SBB

格式:SBB

OPD,OPS

功能:SBB与SUB指令基本相同,惟一区别是:目的操作数除减去源操作数外,还要减去该指令执行前的CF值。即:OPD←(OPD)-(OPS)-CF。并按相减的结果设置标志位OF、CF、SF、ZF、AF和PF。

说明:该指令与SUB指令在功能上及结果对标志位的影响上基本相同。该指令在使用上类似于ADC指令,主要用于多字节减法运算。

SUB和SBB指令配合可以实现多倍精度数减法运算。③减1指令DEC

格式:DEC

OPD

功能:将目的操作数减1后送入目的地址中,并根据执行结果设置标志位OF、SF、ZF、AF和PF,但不影响CF位。即OPD←(OPD)-1。

说明:该指令的操作数可以是字节或字且类型必须明确;其操作数只能在通用寄存器或存储单元中,不能是立即数。该指令执行后对OF、SF、ZF、AF、PF的影响与SUB指令相同。

SUB

BX,CX;将BX中的内容减去CX中的内容,结果放在BX中SUB[BP+2],CL;将SS段的BP+2所指的单元中的值减去CL中的值,;结果放在BP+2所指的堆栈单元中SUB

AL,20;AL中的数减去20,结果放在AL中SUB

SI,5010H;SI中的数减去5010H,结果放在SI中SUB

WORDPTR[DI],1000H;DI和DI+1所指的两单元中的数减去1000H,结果放在DI和DI+1所指的单元中SBB

AX,2030H;将AX的内容减去立即数2030H,并减去进位位CF的值SBB

WORDPTR[DI+2],1000H;将DI+2和DI+3所指的两单元的内容减去立即数1000H,并减去CF的值,结果放在DI+2和DI+3所指的单元中DEC

AX;将AX的内容减1,再送回AX中DEC

BL;将BL的内容减1,结果送回BL中DEC

BYTEPTR[DI+2];将DI+2所指的单元的内容减1,结果送回此单元【例】减法运算。MOV AX,5678H ;(AX)=5678HSUB AX,1234H ;(AX)=4444HMOV BX,3354H ;(BX)=3354HSUB BX,3340H ;(BX)=0014H④求负数指令NEG

格式:NEGOPD

功能:用零减去目的操作数,相减结果送回目的地址中。即:OPD←0-(OPD)=-(OPD)即求目的操作数的相反数。说明:(a)该指令是单操作数指令,OPD的用法与前面讲过的单操作数指令,如INC、DEC)中的目的操作数相同。(b)NEG指令是对有符号数进行操作的,由于机器中有符号数是用补码表示的,求一个操作数的负数,就是求其补码,NEG又叫求补指令,即:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。(c)该指令执行后影响标志位CF、OF、SF、ZF、AF和PF。其中:OF:当字节操作数为-128(80H),字操作数为-32768

(8000H),执行NEG指令后,操作数无变化,但溢出标志位OF置1,其余情况OF置0。CF:当操作数为零时,求负数的结果仍为零,CF=0,其余情况CF=1

【例】求补运算。MOV AX,0FF64HNEG AL ;(AX)=?SUB AL,9DH ;(AX)=?NEG AX ;(AX)=?DEC AL ;(AX)=?NEG AX ;(AX)=?(AX)=0FF9CH(AX)=0FFFFH(AX)=0001H(AX)=0000H(AX)=0000H⑤比较指令CMP格式:CMP

OPD,OPS功能:目的操作数减去源操作数,结果只影响标志位,不送入目的地址即:(OPD)-(OPS)。说明:CMP指令与SUB指令一样执行减法操作,但它不保存差值结果,

OPD和OPS在操作前后值不变。CMP指令功能上、使用方法上、对标志位的影响上均与SUB指令基本相同。CMP指令常用于比较两个操作数的大小。执行CMP指令后,根据标志位的设置情况判断两个数的大小关系。若两无符号数比较时:当ZF=0时,则OPD=OPS;

否则:当CF=0时,则OPD>OPS;

当CF=1时,则OPD<OPS。若两有符号数比较时:当ZF=0时,则OPD=OPS;

否则:当OF=SF时,则OPD>OPS;

当OF≠SF时,则OPD<OPS。CMP指令后面常跟着条件转移指令,根据比较结果产生不同的分支。

【例】比较AL的内容数值大小。CMP AL,50 ;(AL)-50JB BELOW ;(AL)<50,转到BELOW处执行SUB AL,50 ;(AL)>=50,(AL)-50→ALINC AH ;(AH)+1→AHBELOW:

(3)乘法运算指令乘法指令用于实现两个二进制操作数的乘法运算,乘法指令区别无符号数和有符号数,所以它提供了两条指令:MUL和IMUL。

①无符号数乘法指令MUL

格式:MUL

OPS

功能:实现两个无符号数相乘。

字节乘:当OPS为字节操作数时,将(AL)乘以(OPS),

得到字乘积送入AX中,即:AX←(AL)×(OPS)。

字乘:当OPS为字操作数时,将(AX)乘以(OPS),得到双字乘积,高字部分送入DX中,低字部分送入AX中。即:DX,AX←(AX)×(OPS)。

说明:(a)MUL指令有两种操作类型,即字节乘和字乘,MUL操作类型取决于OPS的类型,OPS指定乘数,它可以是字节或字,但类型必须明确,乘数可以在通用寄存器或存储器中,但不能是立即数。(b)MUL指令只影响OF和CF位。

若乘积的高一半(即字节相乘时乘积中的(AH),字相乘时乘积中的(DX))为0,则OF=CF=0,否则OF=CF=1。MUL指令对其它标志位不确定。当CF=OF=1时,说明AH或DX中有乘积的有效数字,CF=OF=0时,说明AH或DX中无乘积的有效数字,也就是说字节乘以字节积为字节或字乘以字积为字。编程时我们可以利用OF和CF位的设置情况检查字节乘时乘积的结果是字节还是字,字乘时乘积的结果是字还是双字。②有符号数乘法指令IMUL

格式:IMULOPS

功能:实现了两个有符号数相乘。其操作方法与MUL指令相同。说明:IMUL指令也只影响OF和CF位,对其它标志位不确定。若乘积的高一半(即AH或DX)是低一半(即AL或AX)的符号扩展,

温馨提示

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

评论

0/150

提交评论