《《指令系统 》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指令系统 》PPT课件.ppt(109页珍藏版)》请在三一办公上搜索。
1、第五章8086/8088 指令系统,第一节指令格式和寻址方式第二节数据传送指令第三节算术运算指令第四节逻辑运算指令第五节控制转移指令第六节字符串指令,第一节指令格式和寻址方式,一、指令格式二、指令助记符三、寻址方式(一)指令地址的寻址方式(二)操作数地址寻地方式,一、指令格式,指令是计算机用以控制各部件协调动作的命令指令字是一种二进制代码,它包括两个基本部分:操作码和地址码。操作码提供的是操作控制信息,指明计算机应执行什么性质的操作,如进行+、-、等;地址码提供参加运算操作数据的存放地址(即操作数地址)。只提供一个操作数地址的指令,称为单操作数指令;提供二个操作数地址的指令,称为双操作数指令;
2、不提供操作数地址的指令,称为无操作数指令。无操作数指令只有操作码部分,它的格式为 其中为操作码。,这种指令表示只进行某种操作,无需操作数,如控制机器的运行状态,暂停(HALT)等,就属于无操作数指令。单操作数指令格式为 其中为操作码;D为目标操作数地址,简称目标地址。这种指令表示对目标地址D中的内容,按操作码规定进行操作,结果送目标地址。双操作数指令格式为 其中,为操作码,D为目标地址,S为源地址(即作数地址)。这种指令表示对源地址和目标地址中的内容,按操作码规定的操作进行操作,结果送目标地址,即DDS。,在微型机中,一般采用可变字长指令。也就是说,不同的指令用不同长度来表示,但都是字节的整倍
3、数。如一字节、二字节、三字节和四字节指令等。它们在存储器中分别占有14个存储单元,其格式如下:单字节指令:操作码 7 6 5 4 3 2 1 0,双字节指令:第一字节:操作码 第二字节:操作数或地址,三字节指令:第一字节:操作码 第二字节:操作数或地址低位 第三字节:操作数或地址高位 或:第一字节:操作码 第二字节:操作码 第三字节:操作数或地址,四字节指令:第一字节:操作码 第二字节:操作码 第三字节:操作数或地址地位 第四字节:操作数或地址高位,二、指令助记符,机器指令是二进制代码,二进制代码不易辨识和记忆。因此,在介绍机器指令时,除非必要情况下用二进制代码,一般情况下使用指令助记符。指令
4、助记符由操作码和操作数的助记符号表示。通常操作码用英文单词或英文缩写单词来表示如:ADD,JP(Jump)等。操作数用表示寄存器存储器地址的符号来表示。我们首先来学习操作数部分的符号,然后结合指令来学习表示操作码的符号。用助记符来表示的指令又称为指令的汇编格式。,指令中要出现的符号介绍如下:AX,BX,CX,DX 16位通用寄存器AH,BH,CH,DH,AL,BL,CL,DL 8位通用寄存器CS,DS,ES,SS 段寄存器SP,BP,IP 堆栈指针,基址指针,指令指针DI,SI 目的,源变址寄存器Flags 标志寄存r r=AX、BX、CX、DX r=AL、BL、CL、DLa(acc)a=AX
5、 AL,Seg seg=CS、DS、ES、SSSrc(source)、dst(dest)源操作数、目的操作数Count 计数器Oprd 操作数Im 立即数 n 8位 nn 16位nnnn 32位EA 有效地址,三、寻址方式,数据和程序在存储器中的位置,称为地址。存放指令的地址,称为指令地址;存放数据的地址,称为操作数地址,简称操作地址。寻找指令地址和操作数地址的方式,统称为寻址方式。形成指令地址和操作数地址的过程,称为寻址过程。,(一)指令地址的寻址方式(二)操作数地址寻地方式,(一)指令地址的寻址方式,在微机中,指令地址的寻址方式比较简单,通常是在CPU中设置程序计数器PC,PC中的内容就是
6、指令地址。在一般情况下,程序是顺序执行的,程序在存储器中也是按顺序存放的。这时,只要将程序计数器中的内容自动递增,就可以形成下一条指令地址。当需要改变程序的执行顺序时,要使用转移指令,由转移指令给出转移后指令字的起始地址。将此地址送到程序计数器,就形成了转移后的地址。然后,程序计数器中的内容又自动递增,直到再次发生转移为止。,(二)操作数地址寻地方式,微机在工作时,指令地址在程序执行过程中时自动形成的,但指令所需的操作数地址是随机的,要根据指令的规定求得,获得操作数地址的方式,称为操作数寻址方式,有时也把它称为寻址方式。在操作数寻址方式中,除了涉及BP的寻址方式外,一般寻址均在数据段内(段地址
7、由DS提供),在涉及BP时,则使用堆栈段(段地址由SS提供),在执行串操作时,使用附加段ES。在各种寻址方式中,以立即数和存储器直接寻址方式,速度最快,因为此时8086/8088的执行单元EU可以立即从寄存器中或指令队列中取出操作数,而无须再由总线执行单元计算出有效的20位地址,然后再去取操作数。,立即数寻址,在指令中直接给出一个常数作为操作数,如:MOV AX,200表示将常数200送到存储器AX中,要注意的是在16位操作中,直接数的取值范围为32767(7FFFH)到-32768(8000H),当为无符号数时则为0-65535(0FFFFH),对8位数应为0-255(OFFH),符号数为1
8、27(7FH)到-128(80H)。,2.寄存器直接寻址,指令中的寄存器存放了操作数,如:ADD CX,BX表示将BX中的值直接相加,然后送到CX中去。,3.寄存器间接寻址,在指令中,有操作数的地址,将该地址同左移4位后的DS值相加,即可得到20位物理地址,从该地址中取出操作数进行指令所要求的操作,这种寻址方法称为直接寻址,通常该类指令中,操作数的地址用标号表示,例如:ADD AX、TABLE表示将AX中的值和TABLE表示的地址中的内容相加,和放在AX中。8086/8088按字存放内容时,低字节方在低地址中,高字节跟随其后,方在高地址中。,5.变址寻址,将指令中指令的变址寄存器的内容加上偏移
9、值,即成为操作的地址,例如:MOV DI,4MOV AX,TABLEDI表示偏移值TABLE加4(DI的内容)作为操作数地址,取出操作数送AX。这种寻址方式通常用于读写表中的元素,如TABLE偏移值表示的首址,加4表示将表中的第三个量(16位)送AX,读写数组元素也采用此法。,6.基址寻址,同变址类似,不过这种寻址中使用基址寄存器BX、BP代替变址寄存器DI和SI。它是将基址寄存器的内容加上偏移量而作为操作数地址的,例如:MOV AX,BX+6表示BX作为基址,距其偏移6字节的地址便是操作数地址,在这种寻址中BX基址对应的段地址在当前数据段中,若基址是BP,则操做数在堆栈段内。IBM汇编允许用
10、三种形式指定基址寻址,它们的效果是一样的,如:MOV AX,BX+6;标准格式MOV AX,6BX;先写偏移值MOV AX,BX+6;偏移值写在括号内,7.基址变址寻址,基址变址寻址时,操作数地址是由一个基址寄存器的内容,一个变址寄存器的内容及偏移值(是任选项,也可不用)相加和,例如:MOV AX,6BPSI表示距栈顶6个字节处作为基址,然后以SI内容为相对基址的偏移作为操作地址,这种寻址方式在访问堆栈数组时很有用,如基址为栈顶,则变址寄存器中的值表示堆栈中的相应元素。这种寻址方式也多用于对二维数组的访问,如用BX作为数组的首地址,变址寄存器及偏移值作为数组行和列的值,依次寻址,就可找到某个二
11、维数组元素。,第二节数据传送指令,8086/8088有92条指令,按其功能可分为6个功能组:1.数据才传送2.算术运算 3.逻辑运算 4.串操作 5.控制传送 6.处理器控制,数据传送指令又可分为以下七种:(1)通用数据传送指令MOV(2)堆栈操作指令(3)交换指令(4)标志寄存器传送指令(5)输入输出指令(6)地址目的传送指令(7)查表转换指令 这类指令用来在寄存器和存储单元或输入/输出端口传送数据或地址,表5.2.1列出这7种指令:,汇编格式 操作MOV dest,source 传送一个字节或字PUSH source 压一个字进栈POP dest 弹一个字进栈PUSHF 压标志寄存器进栈P
12、OPF 弹标志寄存器出栈XCHG op1,op2 交换两个字节或字LAHF 将标志寄存器内容装入AH中(装右字节)SAHF 将AH寄存器内容存到标志寄存器(右字节)IN acc,port 从端口输入字节或字到累加器OUT port,acc 从累加器输出一个字节或字到端口LEA dest,source 装入有效地址,即将存储器操作数偏 移地址送目的寄存器LDS dest,source 将段地址装入DS中,偏移地址装入 目的寄存器LES dest,source 将段地址装入ES中,偏移地址装入目 的寄存器 XLAT 查表转换,、MOV指令,MOV指令是最基本的通用传送指令,它把一个字节或一个字从源
13、传送到目的。这条指令可实现下述操作:MOV nn,a;(nn)aMOV a,nn;a(nn)MOV seg,src;segsrcMOV dst,seg;dstsegMOV r,src;rsrcMOV dst,r;dstrMOV dst,im;dstim,MOV指令可以在寄存器与存储单元之间,寄存器和寄存器之间传送字节或字,也可以将一个立即数送寄存器或存储单元,例如:MOV AX,TABLE;TABLE存储地址传送到AXMOV TABLE,DX;从DX传送到存储地址MOV ES;BX,AX;指定段寄存器到ES,而不用DSMOV DS,AX;寄存器间16位数传送MOV DL,AL;8位寄存器间传送
14、MOV CL,30;常数送寄存器MOV TABLE,05H;常数送存储单元,2、堆栈操作指令,目前,微计算机一般都是把内存的一个区域作为堆栈。这个堆栈按照后进先出的原则组织一段内存区域,由堆栈指针指出它在存储器中的位置。8086/8088用段寄存器SS和堆栈指针SP指示堆栈在内存的位置,这个堆栈长度为64KB,因此SP为16位指针的单元。8086/8088规定SP始终指向堆栈的顶部,即始终指向最后压入堆栈的信息所在的单元。8086/8088的堆栈是下推式,即随着压入堆栈的内容的增加,SP的值减小。SP的初值可由MOV SP,im指令来设定。堆栈操作指令包括入栈指令和出栈指令。,(1)入栈指令
15、PUSH oprd 入栈指令完成将16位的数据送入堆栈的操作,具体入栈指令如下:PUSH r;(SP)r,SPSP-2PUSH seg;(SP)seg,SPSP-2PUSH src;(SP)src,SPSP-2,(2)出栈指令 POP oprd出栈指令完成将16位的数据从堆栈弹出的操作,具体出栈指令如下:POP r;r(SP),SPSP+2POP seg;seg(SP),SPSP+2POP dst;dst(DP),SPSP+2,入栈时,把一个字从上述操作数传送到已由SP指向的堆栈顶部,同时修改SP的值,使SP指向新的栈项单元。出栈时,把堆栈顶部的一个字,传送到指定的目标操作数,同时修改SP的值
16、,使SP指向新的栈顶单元。PUSH和POP指令提供一个先进后出的堆栈结构,它们用SS栈寄存器来指向栈的段地址,用SP堆栈指针来指向栈顶位置,当执行PUSH指令时,SP减2后,将源操作数(一个字)压入栈内,相反POP指令则将当时SP所指定的堆栈中的字取出到目的操作数,然后SP加2。,PUSH和POP指令提供了一种存储的技巧,例如可用于数据交换,将DS的值传给ES,使数据段和附加段指向同一个段地址:PUSH DSPOP ES又如在程序中要用到某一寄存器,它的值在程序中某一段将被改变,而后面又要用到它,且需要它的原先值,可采用如下方法:PUSH AX;将AX值存入堆栈;AX的值被改变的程序段POP
17、AX;再取回AX的原先值,(3)PUSHF和POPF指令PUSHF和POPF是将标志寄存器内容入栈和出栈,这两种指令在调用子程序,保存标志寄存器内容时常用到,即在调用前标志寄存器入栈,返回主程序时,恢复其值。另外,当标志寄存器TF位为1时,8086/8088在每执行一条指令后,便执行一条1型中断指令,即指令执行变成单步方式,这在调试程序时可用到,以便跟踪每条指令执行情况。由于没有任何一条指令能使TF变成1,但这可用下面的方法实现:PUSHF;标志进栈POP AX;标志值送AXOR AX,0100H;使TF位置1PUSH AX;AX进栈 POPF;将AX值送到标志寄存器若要恢复TF=0,则可将O
18、R AX,0100H换成AND AX,0FEFFH来清除TF。,3、交换指令,具体的指令如下:XCHG AX,r;AX r XCHG r,src;r src XCHG指令用于交换源操作数和目的操作数的内容,源和目的操作数可以在寄存器或单元中,但不能同为存储单元,段寄存器也不能用作操作数。下面是寄存器交换例如:MOV AX,50 MOV BX,10 XCHG AX,BX;现在AX=10,BX=50,4标志寄存器传送指令LAHF和SAHF,LAHF指令是将标志寄存其中标志CF.PF.AF.ZF.和SF分别送到AH的0.2.4.6.7位,而SAHF指令却相反,它是将AH的相应位内容送到标志寄存器的C
19、F、PF、AF、ZF和SF位。,5.输入输出指令IN和OUT,IN和OUT指令用来读写I/O口,8086/8088可寻址的口地址可达64K个,口地址可用DX或立即数表示,如用立即数,则仅能寻址0-FFH,读写的数据必须从AX中接收或传送,例如:IN AL,2FH;从2FH口输入一个字节到ALOUT 5,AL;将AL中的数送到5口中去MOV DX,3FCH;3FCH口地址送DXIN AX,DX;从3FCH口读一个字到AX中这类指令在接口技术中使用较多,当读写一个字时,先是低字节,然后是高字节(因为数据总线是8位,所以必须分两次读写),如从3FCH口读一个字时,实际上从3FCH口读一个字节到AL中
20、去.然后从3FCH口再读一个字节到AH中去。,6.地址-目标传送指令,8086/8088有三条地址-目标传送指令:LEA r,src LDS r,src LES r,src LEA指令将一个储储器中数据的偏移地址送到任一个通用寄存器.指针寄存器或变址寄存器,例如:LEA BX,TABLEDI 将把TABLE+DI的偏移地址送到BX中.LDS指令将从指定的存储器地址中取出一个32位的双倍字,将其低16位送到指定的字寄存器,而将高16位送到DS,例如:,LDS BX,ARRAY ARRAY假如为一个双倍字长的字,比如是代表一个物理地址的变量,执行此指令后将ARRAY高二字节表示的段地址送入DS中,
21、而将其低二字节表示的偏移地址送入BX中,这相当执行了三条指令:MOV BX,ARRAY MOV AX,ARRAY+2 MOV DS,AX LES指令将段地址送入ES中,其别的功能同LDS.,7.查表转换指令XLAT,XLAT指令可进行查表操作此表可达256个字节.使用该指令时,将表的起始地址送入BX中,将表的位移值(即要查表的位置)送入AL中.。然后执行XLAT指令,则将查到的值存入AL中.,第三节算术运算指令,8086/8088有加、减、乘、除四种基本的运算指令,这些指令可用于字节或字运算,可用于带字号数与无符号数的运算。如果是符号数,则用补码表示。大部分指令操作影响标志寄存器响应位。算术运
22、算指令如表5.3.1所示8086/8088提供各种矫正操作指令,这些矫枉正操令与二进制算术运算指令配合使用,使得8086/8088也能进行十进制算术运算。十进制数不带符号,可用压缩十进制数(BCD),或非压缩型十进制表示,前者每个字可包含两个用场4位二进制码表示的十进制数,即十进制数的范围为0099;对非压缩型的数,则一个字节仅表示一个十进制数即09,字节的高4位在作乘除运算时必须为0,加减时可任意。,1、加减法运算指令、2、比较指令3、INC、DNC、NEC指令4、乘法与除法指令MUL、IMUL、DIV、IDIV5、CBW与CWD指令6十进调整指令,1、加减法运算指令、,加法指令带进位加法指
23、令减法指令带借位减法指令,()、加法指令,,;,;,;,;,()带进位加法指令,,;,;A D C,;A D C,;其中为进位标志的现行值。,()减法指令,SUB,;SUB,;SUB,;SUB,;,(4)带借位减法指令,SBB r,src;r r src cSBB a,im;a a im c SBB dst,im;dst dstimcSBB dst,r;dst dstrc其中c为借位标志的现行值,、均是作加减运算的指令,其功能是源操作数与目的操作数进行相加或相减,而与的差别是为带进位的加,同样是带借位的减,源操作数可以在寄存器、存储器中或立即数,目的操作数可以在寄存器、存储器中。这些指令运算的
24、结突目的操作数中。上述指令可完成位(字节)或位运算超过位则需多条指令。比如操作数长度大于位的加法,用下面的指令,;低位相加,;带低位进位的高位相加这两条指令将把和中的位数加到和中的位数中,县后面的一条指令,还将低位的进位也一起加上,结果在和中。又比如操作数长度大于位的减法,可用下面的指令,,;低位相减,;带低位借位的高位相减作减法时,不仅和相减,还要减去上条指令执行相减后的借位,最后的结果低位将在中,高位将在中。这类指令不能用于存储单元容的加减,也不能用立即数作为目的操作数。它们的运算结果均将影响标志寄存器的、和。,、比较指令,比较指令完成两个操作数加减,使结果反映到标志位上,并不送回相减的差
25、值。指令格式如下:CMP,;CMP,;CMP,;CMP,;指令是比较指令,用于目的操用数 与源操用数 进行比较,即相减,类似于指令,但不同的是,该指令不保存相减的结果,因而不变操作数,它仅影响标志寄存器,表.示出了比较指令影响标志位的情况。,一般在使用指令时,后面总是跟着一条条件转移命令,跟据比较结果标志位的情况决定程序的执行方向,由表.可看出:两位比较要等用零标志位ZF,若ZF1则表示相等。不带符号数比较大小时,当借位标志CF1时,说明源目的,否则目的源。带符号数比较大小时,用符号标志SF与溢出OF半加(异或)来判断,若SFOF1,则源目的,否则源目的。例如:CMP AX,8000H;AX
26、与8000H相比较JL AGAIN;如AX小于8000H则转AGAIN当CMP执行后,若SFOF时,(即SFCF1),即源目的,则转移。,3、INC、DNC、NEC指令,INC和DEC指令仅有一个操作数,其操作可以是位或位的通用寄存器值,也可以是存储单元中的数,将执行操作数加的操作,指令将执行操作数减的操作,结果仍送回操作的位置中去。这两条指令操作结果均不影响CF标.。NEC指令为求补指令,它是从零中减去操作数,形成2 的补,操作数仅有一个,可以是寄存器的破除储存单元的数。例如:NEC DATADATA存储单元内设有数为00000101,则执行该指令后,其内容就变为11111011。,当从一个
27、立却数中减去寄存器或存储器中的数时,不能用SUB指令,但可以减数变补,然后再和其相加得到减的果,如立即数为100,则可用如下命令:NEG ALADD AL,100,4、乘法与除法指令MUL、IMUL、DIV、IDIV,8088提供乘法与除法指令,具体指令格式如下:MUL src;AXAL*src(无符号数)MUL src;DX、AXAX*src(无符号数)IMUL src;AXAL*src(符号数)IMUL src;DX、AXAX*src(符号数)DIV src;ALAX/src,AH余数DIV src;AXDX.AX/src,DX余数IDIV src;ALAX/src,AH余数(符号数)ID
28、IV src;AXDX、AX/src,DX余数(符号数),MUL是无符号数乘法指令,IMUL是带符号数的乘法指令(整数乘法),它们都可以完成字节与字节相乘,字与字的相乘,这些乘法指令均认为目的操作数在AL和AX中,源操作数由指令指出,当16位乘法时,32位的乘积规定高16位在DX中,低16位在AX中。在8位或16乘法若扩展部分AH或DX为0则CF=0,OF=0,反之CF=1。OF=1。IMUL是带符号数乘法,执行情况同MUL,不过在16位或31位乘积中,包括一位符号位。DIV是无符号除法指令,它可以进行字节或字除法,DIV规定:对于8位除法,被除数在AX 中,对于16位除法,被除数则在DX与A
29、X中,而除数在指令中指出。除完的结果,对8位数除法,商与余数分别放在AX与DX中。,IDIV是带符号 数除法,情况同DIV,除后余数符号和被除数相同。这两条除法指令都不能用立即数作源操作,但若需要时,可用如下指令来实现,例如:MOV BX,10 DIV BX;用10去除DX:AX,5、CBW与CWD指令,上述的除法,被除数均是除数的双倍字长,若要进行相同字长的除法,则需将被除数扩展为双倍字长,这就要用下面两条指令:CBW是将字节扩展为字指令,它是将AL 中的符号扩展到AH的所有位去,CWD是扩展为双字指令,它是将AX的符号(第15)扩展到DX的所有位去,例如AL中的内容为-2,执行CBW后 A
30、H AL 1111111111111110=-2,下面是一个四则运算的例子:设BH=FB(即-5)BL=FE(-2)CH=(-20)CL=05 计算(BH*BL)+(CH/CL)AX MOV AL,BH;AX=FB IMUL BL;AX=000A=-5(-2)MOV DX,AX;暂时保存结果 MOV AL,CH;AX=00EC(-20)CBW;AX=FFEC,扩展为双 字节 IDIV CL;AX=00FC(-4)CBW;AX=FFFC ADD AX、DX;AX=0006=+6,6十进调整指令,(1)DAA指令(2)AAA指令(3)DAS和AAS 指令(4)AAM与AAD指令,(1)DAA指令,
31、当BCD码的十进制运算用二进制进行时,有两种情况需要进行调整:1、运算的结果出现非法的BCD码(即大于的数);2、运算产生半字节间的进位。调整的方法是加6进行修正。DAA指令就是按上述原则进行十进制调整的,它是一条无操作数指令,与ADD指令配合实现压缩型十进制加法。,(2)AAA指令,AAA是非压缩型十进制加法调整指令,它的作用是将AL中的数换成一个非压缩型十进制数,即AAA指令执行时,检查AL的低4位,若是一个合法的BCD码,则清除AL的高4位,否则按上述修正原则进行低4位修正,并将AL的高4位清零。例如AL中的内容为00001001=9,CL的内容为00001000=8,执行如下指令:AD
32、D AL,CLAAA执行ADD后,AL中的内容为00010001,因AF=1,故AAA指令进行调整,将AL中的低4位加6,即变成00010111,然后高4位清零成为00000111,并且AH加1,因此AH中为00000001,AL中为00000111,得到两个非压缩型十进制数。,(3)DAS和AAS 指令,DAS是压缩型十进制数减法调整指令,AAS是非压缩型十进制数减法调整指令,它们同ADD和AAA指令一样,不要操作数,且假定要调整的数在AL中。DAS的调整过程是:若AL的低4位大于9或AF=1,则从AF中减去6,并置AF=1,若AL的高4位大于9,或CF=1,则从AL中高4位减去6,并置CF
33、=1,如用下述指令:SUB AL,BL;AL中的数(压缩的BCD码)减去BL(压缩的BCD码)DAS;调整结果,AL中为正确的码。AAS指令将AL中的内容调整成非压缩型十进制码,即如果AL低4位大于9,或AF=1,则减去6,AH减1,并置AF=1,CF=1,并清除AL高4位。,(4)AAM与AAD指令,AAM是非压缩型十进制乘法调整指令,它与指令配合使用,把中的两个非压缩型十进制数相乘所得结果加以校正。AAM指令必须跟在MUL指令后。AAD是非压缩型十进制除法调整指令,它要在执行除法之前使用,它是将非压缩十进制表示的被除数换成第二进制值送到AL中,即AAD将被除数高位(AH)乘10,然后加到低
34、位(AL)上,并将AH清零,ADD用法如下所示:AAD;将非压缩型十进制数调整 DIV BL;完成除法。,第四节逻辑运算指令,8086/8088逻辑运算指令组包括逻辑运算指令、移位指令和循环移位指令。它们是对寄存器或存储单元进行位操作的指令,也称位操作指令。逻辑运算指令如表5.4.1所示.,一、逻辑运算指令二、移位指令三、循环指令,一、逻辑运算指令,1、NOT指令 这条指令对原操作数求反,然后再送回原操作数。指令格式为:NOT src;srcsrc,这条指令对标志位无影响。,2、AND指令,这条指令对两个操作数按位进行逻辑“与”运算。与运算通常用符号“X”或“”或“.”来表示,它的运算规则为:
35、00=0 01=0 10=0 11=1 AND指令可以进行字节操作,也可以进行字操作。指令的一般格式为:AND dst,src;dstdstsrc 其中目的操作数可以用累加器,也可以是任意一通用寄存器,也可以是各种寻址方式的存储器操作数。原操作数可以是立即数,寄存器和各种寻址方式的存储器操作数。例如:,AND AX,BX AND AL,F0H AND SI,BP AND DATAWORD,AX AND AX,AX某个操作数与本身进行“与”运算,操作数不变,但可以是进位标志位CF清“0”。AND指令常用与屏蔽(清除)操作数的指定位。例如:AND AX,OFFH结果AH被清“0”,而AL值不变。,
36、3、OR指令,这条指令对两个操作数控位进行逻辑“或”运算,结果送回目的操作数。或运算通常用符号“+”或“”表示,它的运算规则为:0v0=0 0v1=1 1v0=1 1v1=1 OR指令可以进行字节操作,也可以进行字操作。指令的一般格式为 OR dst,src;dstdstsrc其中的目的操作数河源操作数,与AND指令相同。某个操作数本身进行或运算,操作数不变,但可以是进位标志位CF清“0”。例如:OR AX,AX操作的结果是:操作数不变,但使CF清“0”。,4、XOR指令,XOR指令用于异或操作,将源操作数与目的操作数做异或运算,然后送目的操作数。异或运算通常用符号表示,它的运算规则为:00=
37、0 01=110=1 11=0运算的结果相当于二个一位的二进制数做加法的结果(进位丢掉),所以又把异或运算称为“按位加”。XOR dst,src;dst dstsrc 其中,目的操作数和原操作数与AND指令相同。,XOR 指令可用对数据指定位进行求反。XOR AL,OFFH则将AL 中所有位求反。某操作数与其本身进行异或运算可使操作数和进位志位CF都清“0”。例如:XOR AX,AXNOT、AND、OR、XOR指令都是按位操作的逻辑运算指令,运算结果影响标志寄存器部分标志位。,5、TEST指令,TEST指令是一条测试指令,它执行的操作与AND相同,不过它不回送结果。只影响标志位,该指令常与条件
38、转移指令配合使用,以决定程序的转移方向。,二、移位指令,8086/8088有四条移为指令:算术左移指令 SAL dst,cout 逻辑左移指令 SHL dst,count 算数右移指令 SAR dst,count 逻辑右移指令 SHR dst,count 其中SAL与SHL 指令功能完全相同。这些指令的功能如图5.4.1。移位指令可将通用寄存器或存储单元的8位或16位的数左移或右移,其移位方向由指令决定,移动位数由指令中的计数值所决定,计数值可以是1或存放在CL中的无符号数。,这些移位指令如下所示。例如:MOV D,1将D中的数逻辑右移1位,D可以是寄存器或存储器单元。当要移多位时,则可用CL
39、作移位计数器,例如:MOV CL,2SHL BL,CL;将BL中的低4位左移到高4位,低4位变为0。常利用移位指令,作快速的乘除法,例如:某数乘4或除4的运算。MOV CL,2SHL AX,CL;AX中的无符号数乘4SAL AX,CL;AX中带符号数乘4SHR AX,CL;无符号数除以4SAR AX,CL;带符号数除以4,使用移位指令作乘除法,要比用乘除指令快得多,比如实现AX乘10:MOV BX,AX;保存AX MOV CL,2;移为两次(乘4)ADD AX,BX;加上原来的AX SHL AX,1;AX移位一次(实现乘10),三、循环指令,8086/8088有四条循环指令:循环左移指令 RO
40、L dst,count 循环右移指令 ROR dst,count 带进位位循环左移指令 RCL dst,count 带进位位循环右移指令 RCR dst,count 前两条指令未把标志位CF包括在循环的环中,而后两条指令把CF包括在循环中,作为整循环的一部分。循环指令的功能如图5.4.2所示。循环指令可以对字节操作,也可以对字操作。操作数可以是寄存器操作数,也可以是内存操作数。循环方向由指令决定。循环移动的位数由指令中的计数值决定,计数值可以是1或存放在CL中的无符号数。,第五节控制转移指令,8086/8088 有四类转移指令:(1)转移指令,包括无条件转移和条件转移指令。(2)重复控制指令(
41、3)调用和返回指令(4)中断指令 8086/8088 使用CS 段寄存器和IP 指令指针寄存器的值来寻址,以取指令来执行,转移指令则可改变CS与IP的值或仅改变IP 的值,使得改变指令执行的顺序,转移指令如表5.5.1所示指令中的 Target 表示转移的目标。这些指令都将引起程序执行方向的转移,不过转移又段内转移和段间转移之分,所谓段内转移是指段地址不变,只是IP改变,而段间转移则CS和IP均发生改变。,一、转移指令,转移指令分无条件转移和条件转移指令1.无条件转移指令无条件转移指令格式为:JMP TARGET JMP 转移指令分直接转移和间接转移,直接转移又分短程(SHORT),近程(NE
42、AR)和远程(FAR)三种形式,当程序中执行到JMP 指令时,执行就无条件转移到JMP所指的目标(TARGET)去,目标可以是一个标号指出的直接转移地址,如:JMP SUM它指出无条件转向SUM 地址(是段内转移)目标也可以是用NEAR或FAR 进行说明,例如:,JMP FAR LABEL 说明LABEL 不在现行段内,则是段间转移。如果目标与JMP 指令的距离在-128到+127个字节之间,则可用SHORT 来说明,表示为短程转移,这种格式,由于目标用位移表示(一个字节),所以指令节省一个单元,若是目标用地址表示,则需两个字节,当目标前不用NEAR说明时,隐含着NEAR型的段内转移。例如:J
43、MP SHORT NEXT;短程转移 JMP LOOPL;近程转移JMP指令中的目标也可以是由存储器或寄存器指出的间接转移地址,例如:JMP TARGET BX;转移地址由BX及TARGET变;址计算得到 JMP CX;以CX的内容位转移目的地;址,2.条件转移指令,8086/8088有18条不同的条件转移指令。它是根据标志寄存器的标志位决定程序是否进行转移,条件转移指令的目的地址必须在现行的代码段内(CS)中,并且以下一条指令地址为基准,必须在+127到-128的位移范围内,因此条件转移之零转移的范围是有限的,而不像JMP指令。条件转移指令如表5.5.1所列。从表种可看出条件转移指令有时根据
44、两数比较结果来进行转移,有时指明测试某些标志未来决定转移,但有时两条指令时实质上是一致的。如:JE/JZ SUM;JE指令的含义若两数相等则转SUM,而JZ指令的含义是若标志位ZF=1则转SUM。,使用条件转移指令时,经常在该指令之前用一条比较指令或减法指令,以建立标志位,然后由条件转移指令进行判断是否转移。条件转移指令由对带符号数比较或测试的指令,这常对溢出为OF或符号为SF及逆行测试,对无符号数则常测试CF,对带符号数由大于等于小于三种情况,无符号数则有高于等于低于三种情况。,二、重复控制指令,8086/8088有三条控制重复控制指令:LOOP、LOOPZ(LOOPE)、LOOPNZ(LO
45、OPNE),还有一条通常用于循环控制的条件转移指令JCXZ。,1、LOOP、LOOPZ、LOOPNZ指令2、JCXZ 指令,1、LOOP、LOOPZ、LOOPNZ指令,这类指令用于控制程序的循环,其控制转向的目的地址是在以下条指令地址为中心的+127到-128的范围内,这类指令用CX 作计数器,每执行该指令,CX便减1,直到减为0为止。例如用LOOP时,规定循环次数放在CX中,每LOOP指令一次,则CX减1,若CX不等于0,则转向目的地址执行,如此重复直到CX减为0为止,例如要重复执行某一程序段100次,可用下面的程序:MOV CX,100;100次输送CX START:.;要执行100次的程
46、序段 LOOP START;CX0,转START执行.;CX=0,往下执行,在循环过程中,常根据循环内出现的情况来终止循环,若相等则循环,这可用LOOP指令,若不相等则循环,这可用LOOPNE指令,前者,是当CX不等于零,ZF=1时则循环,后者是CX不等于零 ZF=0时则循环。当两个中的一个条件满足一个不满足时,则终止循环。例如在指定的存储区中,找第一个非零字节,设存储区开始单元的偏移地址在BX中,最后单元的偏移地址在DI中,若找到非零字节,则其偏移地址在BX中,若没找到则BX与DI相等,表示已找到最后单元。,SUB DI,BX INC DI;字节数=(DI)-(BX)+1 MOV CX,DI
47、;字节数送CX DEC BX NEXT:INC BX CMP BYTEPTRBX,0;与0比较 LOOPE NEXT;是0,去比较下一个 JNZ NZ_FOUND;找到否,即ZF=0?.;没找到NZ_FOUND:;找到,BX中为非零字节.,2、JCXZ 指令,这条指令也是一条转移指令,它的转移条件是CX=0。这条指令在循环程序的开始处,为了能跳过循环(只要是CX=0)是有用的。,三、调用和返回指令 CALL、RET,CALL 指令用来调用一个过程或者程序。当调用的过程或子程序结束后,使用RET 指令返回,由于过程或子程序由段间调用(即远程FAR)和段内调用(及近程NEAR)所以CALL也有FA
48、R和NEAR之分,这由被调用的过程的定义所决定,因此RET也有段间和段内返回两种。当段内调用时,首先将IP内容入栈。当返回时,从站内取出一个字并放回到IP中,若段间调用时,则先把CS入栈,在把IP如战,RET返回时,在从栈中去回一个字放入IP中,然后从栈中取第二个字放入CS中,作为段间返回地址。,象JMP指令一样CALL指令也有两种得到目标地址的办法:直接和间接。直接调用目标地址在CALL指令中,间接调用目标地址在由指令指定的寄存器或内存单元中。,四、中断指令,8088提供三条中断传送操作指令:中断指令 INT n 溢出中断指令 INTO 中断返回指令 IRET 在8086/8088中,程序的
49、执行控制可以采用软中断的方式。当程序中遇到中断指令时,中止现行程序,保护断点和现场后,转去执行。,1、INT n指令,这条指令启动在指令中的中断类型号(n)规定的中断过程。8088采取向量中断,中断类型号0255,规定了256个中断向量。每个中断向量包括了四个字节的中断程序的入口地址。其中,有两个字节是中断程序的代码段值,另两个字节是中断程序入口地址偏移量。这256个入口地址组成一个表叫中断向量表,存放在存储器绝对地址00000H到003FFH中。关于8088中断系统的介绍请参阅第七章,当程序中遇到中断指令INT时,便中断程序的执行,而转向由256个中断向量提供的地址之一去执行。例如:INT
50、1AH此时程序将转向IA型中断服务程序执行,此时中断向量地址为41AH=68H,即从68H和69H单元中取出IP的值,从6AH和6BH取出CS的值,然后转向该地址执行中断服务程序。,2、INTO指令和IRET指令,INTO指令可以写在一条算数指令的后面,若算数运算指令执行的结果溢出,及溢出标志OF=1,则转向溢出中断处理;否则不进行任何操作,接着执行下一条指令。,IRET指令的作用是:当执行完中段服务程序后,返回主程序。,第六节字符串指令,存储器中存放的一串字或字节,它们可以是二进制数,也可以是BCD码或ASCII代码等相关的一些信息。它们存放在连续区域中,若对它们的每个字或字节均作同样的操作