微型计算机指令系统.ppt
第三章 微型计算机指令系统,指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解INTEL公司生产的8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。通过本章的学习,读者应该掌握以下内容:3种操作数的寻址方式 常用指令的格式、功能、以及对标志位的影响,3、1 8086/8088的寻址方式,操作码 操作数,汇编指令:,操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例:MOV AX,CX;将CX的内容送入AX中。,本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。,3、1、1 立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。例:MOV AL,5;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOV AX,3064H;源操作数为立即寻址指令执行后,AX=3064H,16位数据3064H存入AX寄存器。,3、1、2 寄存器寻址方式寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成两8位使用。例:MOV AX,CX;(AX)(CX)MOV AL;(AL)(AL)-13、1、3 内存寻址方式在内存寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常在隐含的某个段寄存器中。,1、直接寻址方式 直接寻址方式的操作数的形式为:Variable或Variable在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式),它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。例:MOV AX,ES:2000H将ES:2000H单元内容送入AX。例:MOV AX,LABLE 或 MOV AX,LABEL将标号为LABLE(存放操作数单元的符号地址),即DS:LABLE中的内容送入AX。,2、寄存器间接寻址寄存器间接寻址方式的操作数形式为:reg操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。例:MOV AX,BX;将由BX决定的存储单元的内容送到AX寄存器。,0000,0001,0002,0003,BB,AA,TAB:,AX,AH AL,AA BB,间接寻址,数据段,0001,BX,操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。(BX)(SI)(DI)(BP),有效地址=,段寄存器为DS,段寄存器为SS,物理地址计算方法:物理地址=(DS)*16+(BX)或(SI)或(DI)物理地址=(SS)*16+(BP),例:已知:(DS)=2100H,(DI)=2000H 指令:MOV AX,DI;(AX)(DI)物理地址=(DS)*16+(DI)=2100H*16+2000H=21000H+2000H=23000H 指令结果:将23000H单元内容送AL中,将23001H单元内容送AH中。,3、寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。(BX)DISP8(SI)(DI)(BP)DISP16,有效地址=,段寄存器为DS,段寄存器为SS,+,物理地址=(DS)*16+(BX)+DISP8(SI)、(DI)、DISP16类同。物理地址=(SS)*16+(BP)+DISP16,例:如果(DS)=3000H,(SI)=2000H,COUNT=3000H,则执行指令 MOV AX,CONUTSI,求出此种寻址方式对应的有效地址和物理地址。有效地址=2000H+3000H=5000H物理地址=(DS)*16+5000H=30000H+5000H=35000H4、基址变址寻址方式:操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。,(BX)(SI)(BP)(DI),有效地址=,+,物理地址=(DS)*16+(BX)+(SI)或(DI)物理地址=(SS)*16+(BP)+(SI)或(DI)例:MOV AX,BX+DI 或 MOV AX,BXDI DS:(BX)+(DI)字存储单元内容送AX。例:MOV AX,BP+SI 或 MOV AX,BPSI SS:(BP)+(SI)字存储单元内容送AX。,例:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,EA=11FDH,则执行指令 MOV AL,BXDI有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH 物理地址:(DS)*16+有效地址=21000H+11FDH=221FDH执行结果:将221FDH单元内容送入寄存器AL中。,5、相对基址变址寻址方式操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。(BX)(SI)DISP8(BP)(DI)DISP16,有效地址=,+,+,物理地址=(DS)*16+(BX)产生的有效地址物理地址=(SS)*16+(BP)产生的有效地址例:已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H 指令:MOV AX,MKBXSI 或 MOV AX,MKBX+SI 或 MOV AX,MK+BX+SI 有效地址:MK+(BX)+(SI)=0250H+2000H+0100H=3250H 物理地址:(DS)*16+有效地址=30000H+3250H=33250H 执行结果:将33250H单元内容送AL,33251H内容送AH。,3、1、4 段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。段超越前缀形式为:段寄存器名:例如:MOV AX,ES:BP;段地址在ESMOV AX,CS:BX SI;段地址在CS段地址的基本约定和允许超越的情况如表所示:,3、1、5 对8086内存寻址方式的注解(1)在汇编后,指令中的变量名有具体的偏移地址所取代。,(2)在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。(3)在Microsoft宏汇编MASM(Microsoft Macro Assembler)中,内存操作数可以采用多种书写形式。(4)操作数中使用变量的地方也可以用下列形式:变量名整数表达式。5)计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略所有溢出。(6)记忆8086内存操作数形式的简易方法如下:BX SI disp BP DI每列选择0项或一项,构成至少一项,即可得到有效的内存操作数形式。,3、2 标志位在标志寄存器FLAGS中有若干标志位,这些标志用来表示CPU当前的操作方式和状态信息。与普通应用程序有关的主要是FLAGS中的9个标志 6个状态标志(CF、OF、SF、ZF、AF、PF)3个控制信息标志(DF、IF、TF)3、2、1 深入认识CF和OF1、深入认识CF和OFCF表示无符号溢出,即运算结果超出了无符号数的表示范围。OF表示带符号溢出,即运算结果超出了带符号数的表示范围。,2、CF和OF判断方法(1)加法 CF的判断方法从十进制角度来看,若无符号加的结果大于2n(n为位数),则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有进位,则CF=1,否则CF=0。OF的判断方法从十进制角度来看,若带符号加的结果不在范围n 1n-11(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则OF=1,否则OF=0。例:8位数加法,判断CF和OF,二进制加法 看作无符号数 看作带符号数 0011 0000B 6 6+0000 1001B+9+9,0011 1001B 15 15 CF=0 OF=0 0000 0111B 7+7+1111 1011B+251+(5),0000 0010B 258+21 CF=1 OF=0 现为2结果错 0000 1001B 9+9+0111 1100B+124+(+124),1000 0101B 133+133 CF=0 OF=1 现为123,结果错 1000 0111B 135(121)+1111 0101B+245+(11),0111 1100B 380 1321 CF=1 OF=1 现为124,结果错 现为124,结果错,(2)减法 CF的判断方法从十进制角度来看,若无符号减数大于被减数,则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有借位,则CF=1,否则CF=0。OF的判断方法从十进制角度来看,若带符号减的结果不在范围 n-1n-11(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则OF=1,否则OF=0。,3、3 指令系统8086/8088的指令系统可以分为6组:(1)数据传送指令;(2)算术运算指令;(3)逻辑指令与移位指令;(4)串操作指令;(5)控制转移指令;(6)处理机控制指令;3、3、1 数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中。,1MOV(Move):传送指令MOV指令的格式为:MOV dest,src;destsrc功能:将源操作数src复制到目的操作数dest中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。对标志位的影响:无语法格式:MOV reg/mem/seg,reg/mem/seg/imm说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。MOV seg,seg;错误 MOV mem,mem;错误,(2)立即数不能传送到段寄存器中。MOV seg,imm;错误(3)目的操作数不允许使用CS段寄存器。(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定内存操作数的类型,需要用byteptr和wordptr明确指出是字节或字类型。关于PTR的详细介绍见第4章。只要其中一个操作数的类型确定即可。,例:错误的MOV 指令如下所示:MOV AX,BL;类型不匹配MOV DS,1000H;不允许立即数送段寄存器MOV BX,SI;不允许内存操作数之间传送MOV ES,CS;不允许段寄存器之间传送MOV CS,AX;CS不能作为目的操作数例:设B是已定义的字节变量,以下是一些错误和正确的指令。MOV AX,B;错误,类型不匹配MOV A,0;正确,MASM可以判断出要送字节0,XCHG(Exchange):交换指令XCHG指令的格式为:XCHG oprd1,oprd2;交换oprd1与oprd2的内容语法格式为:XCHG reg/mem,reg/mem例:XCHG BX,BP+SI如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F00H)=4254H,OPR2的物理地址=2F00+0200+0046=2F246则指令执行后:(BX)=5154H,(2F246H)=6F30H。,3、堆栈操作指令堆栈概念-存储器的一段区域,按“先进后出”的原则进行存出操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。指令格式:进栈 PUSH SRC;操作:(SP)(SP)-2,(SP)+1,(SP)(SRC)出栈 POP DST;操作:(DST)(SP)+1,(SP),(SP)(SP)+2,堆栈,SS:01F8,SS:01FA,SS:01FC,SS:01FE,SP,AA BB,(执行PUSH AX之前),堆栈,SS:01F8,SS:01FA,SS:01FC,SS:01FE,SP,AA BB,(执行PUSH AX之后),1101H,1101H,AX,堆栈,SS:01F8,SS:01FA,SS:01FC,SS:01FE,SP,AA BB,(执行POP AX之后),1101H,AX,1,2,3,8086/8088系统的堆栈具有如下特点:堆栈是在内存的堆栈段中,具有“先进后出”的特点;堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;堆栈操作只能作字操作;SS:SP在任何时候都指向当前的栈顶。,4、地址传送指令将操作数所在存储器的地址送入目标寄存器。指令格式:有效地址送寄存器:LEA reg16,mem;reg16 mem 指针送寄存器和DS:LDS reg16,mem32;把源操作数指定的4个相继字节到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。指针送寄存器和ES:LES reg16,mem32;把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器。,LEA 指令与MOV 指令的区别:LEA SI,BUFF指令是将标号BUFF的偏移地址送入寄存器中;MOV SI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。,BUFF=,0,1,2,3,4,5,48,00,FE,FF,LEA SI,BUFF;执行后:(SI)=0002HMOV SI,BUFF;执行后:(SI)=0048H,段起始地址,B、LDS或LES指令将源操作数指定的4个连续字节单元内容分别送入指令指定的寄存器以及DS或ES中。其中:低16位送到一个指定的字寄存器,高16位送到DS或ES中。,57H,13H,68H,24H,例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H,DS:2480H,DS:2481H,DS:2482H,DS:2483H,13 57,24 68,SI,DS,LDS SI,2480,4、标志寄存器传送指令指令格式:LAHF;(AH)(PSW低字节)SAHF;(PSW低字节)AHPUSHF;(SP)(SP)-2,(SP)+1,(SP)(PSW)POPF;(PSW)(SP)+1,(SP)(SP)(SP)+2,说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。指令SAHF/POPF将影响标志位。,4、2、2 算术运算指令1、加法指令指令格式:加法 ADD DST,SRC;(DST)(SRC)+(DST)带进位加法 ADC DST,SRC;(DST)(SRC)+(DST)+CF加 1 INC OPR;(OPR)(OPR)+1说明:这在三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。,2、减法指令指令格式:减法 SUB DST,SRC;(DST)(DST)-(SRC)带进位减法 SBB DST,SRC;(DST)(DST)-(SRC)-CF减 1 DEC OPR;(OPR)(OPR)-1求补 NEG OPR;(OPR)0FFFFH-(OPR)+1比较 CMP OPR1,OPR2;(OPR1)-(OPR2)以上五条指令均可作字或字节运算,而且除DEC不影响CF外,其他都按一般规则影响状态标志位。,3、乘法指令指令格式:无符号数乘法 MUL SRC;(AX)(AL)*(SRC)字节乘法;(DX,AX)(AX)*(SRC)字乘法带符号数乘法 IMUL SRC;操作同上进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。源操作数不允许使用立即数。乘法指令运算结果只影响状态标志CF、OF。例:MUL BX;无符号数乘法,BX乘上AX,4、除法指令指令格式:无符号数除法 DIV SRC;(AL)(AX)/(SRC)除法的商(AH)(AX)/(SRC)除法余数 或者(AX)(DX,AX)/(SRC)除法的商(DX)(DX,AX)/(SRC)除法余数带符号数除法 IDIV SRC;操作同上。,当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。除法指令运算结果对状态标志无定义。8086/8088规定IDIV指令运算结果余数的符号与被除数相同。带符号数除法运算中,当被除数位数不够时,可进行扩展。,符号扩展指令:字节扩展到字 CBW;将寄存器AL中的符号位扩展到寄存器AH字扩展到双字 CWD;将寄存器AX中的符号位扩展到寄存器DX,7,0,AL,7,0,AH,0,15,AX,DX,15,0,CBW,CWD,5、压缩BCD码十进制调整指令加法十进制调整 DAA;执行的操作:这条指令执行前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。减法十进制调整 DAS;执行的操作:这条指令执行之前,必须先执行SUB或SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。,调整的方法:累加器AL低4位大于9或辅助进位标志位AF=1,则累加器AL加06H修正。累加器AL高4位大于9或辅助进位标志位AF=1,则累加器AL加60H修正。累加器AL高4位大于等于9,低4位大于9,则累加器AL进行加66H修正。,例:进行BCD码加法运算59+68=127 0101 1001 59+0110 1000 68 1100 0001 C1+0110 0110 66 10010 0111 127,加法运算结果为C1,AF=1,高位大于9,加66H进行压缩BCD调整,说明:压缩BCD码加法或减法十进制调整指令必须在ADD(ADC)或SUB(SBB)指令之后,调整结果对标志OF无影响,对其它状态标志位均有影响。减法十进制调整方法与加法十进制调整方法类同,只是将加6变为减6操作。,6、非压缩BCD码十进制调整指令指令格式:加法十进制调整 AAA;减法十进制调整 AAS;乘法十进制调整 AAM;除法十进制调整 AAD;,AAA指令将AL的内容变换成一位非压缩的十进制数。AAA检查AL低四位,如低四位是0-9的数字,AAA就清除AL的高四位,以及AF和CF标志;如AL低四位表示的数大于9或AF=1,AAA执行:加6到AL寄存器;加1到AH寄存器;置AF=1,CF=1;清除AL高四位为0。例:ADD AL,BL;AL和BL中的数相加 AAA;非压缩BCD码调整,AAS指令检查AL低四位,如低四位表示的数是0-9的数字,ASS清除AL高四位及CF和AF标志;如AL低四位表示的数大于9或AF=1,AAS进行如下调整:,AL减去6;AH减去1;置AF=1,CF=1;清除AL中高四位。例:SUB AL,BL;AAS,AAM指令的作用是用10(0AH)来除AL寄存器的内容,并将除得的商和余数分别送到AH和AL来实现转换。例:MUL BL;AL*BL AAM,3、3、3 逻辑指令与移位指令1、逻辑运算指令:对字节或字数据进行按位的操作。格式:逻辑与 AND DST,SRC;(DST)(DST)AND(SRC)逻辑或 OR DST,SRC;(DST)(DST)OR(SRC)逻辑非 NOT OPR;(OPR)(OPR)异或 XOR DST,SRC;(DST)(DST)XOR(SRC)测试 TEST OPR1,OPR2;(OPR1)AND(OPR2)(1)、逻辑与(AND)、或(OR)、异或(XOR)操作指令,AND指令主要用来屏蔽掉一个数中某些位,以便对剩下的其它位进行某些处理。对那此两个操作数都是1的位,目的操作数相对应位就是1,其它各种组合的位,目的操作数相应位都是0。,例:AND AX,BX;两个寄存器逻辑与 AND AL,MEM-BYTE;寄存器和存储单元逻辑与 AND MEM-BYTE,AL;存储单元和寄存器逻辑与,OR指令在两个操作数相对应位中有一个是1或两个都是1时,在目的操作数的该位产生一个1。例:OR BX,0C000B将BX的两位最高的有效位(15和14位)置成1,而其它位不变。,XOR指令主要用于判断两个操作数中那些位是不同的。如两个操作数相对应位的值不同时,在目的操作数产生一个1。相同为0,不同为1。例:XOR BX,0C000B;,NOT指令改变寄存器或存储单元的每一位状态,原来为0变为1,原为1变为0。例:NOT AX;AX各位取反,TEST指令是一条测试指令,它执行的操作与AND相同,不过它不送回结果,只影响标志位。例:TEST AL,0000 0001B;如AL最低位为0,则ZF=1。,2、移位指令逻辑左移 SHL OPR,CNL算术左移 SAL OPR,CNL逻辑右移 SHR OPR,CNL算术右移 SAR OPR,CNT其中:OPR为操作数,CNT为1或CL表示移位次数,0,CF,OPR,0,CF,OPR,CF,OPR,例:设AL=1011 0100,CF=1在SAL AL,1之后,AL=0110 1000 CF=1在SAR AL,1之后,AL=1101 1010 CF=0在SHL AL,1之后,AL=0110 1000 CF=1在SHR AL,1之后,AL=0101 1010 CF=0,算术左移(SAL)和算术右移(SAR)实现带符号数移位。SAR通过在整个移位过程中复制符号来保护操作数的符号。SAL不保护进位,但如果符号位发生变化的话,就将1送OF标志。每次移位,SAL都将操作数空出来的第0位置0。,逻辑左移(SHL)和逻辑右移(SHR)对无符号数的移位。SHL将操作数左移,空出来的第0位置0;SHR将操作数右移,空出来的高位(字节时第7位,字时第15位)置0。,例:将两个非压缩BCD码(高位在BL,低位在AL)合并成压缩BCD码送AL。MOV CL,4;将计数值送CL SHL BL,CL;将高位移到BL的高4位 AND AL,0FH;清零AL高4位 OR AL,BL;合并AL和BL形成压缩BCD码。,(2)、循环移位指令循环左移 ROL OPR,CNT循环右移 ROR OPR,CNT带进位循环左移 RCL OPR,CNT带进位循环右移 RCR OPR,CNT,CF,OPR,CF,OPR,CF,OPR,CF,OPR,例:设AL=1011 0100B,CF=1执行下列语句:执行ROL AL,1 后,AL=0110 1001,CF=1执行ROR AL,1后,AL=0101 1010,CF=0执行RCL AL,1后,AL=0110 1001,CF=1执行RCR AL,1后,AL=1101 1010,CF=0,3、2、4 串操作指令串操作:对存储区中连续存放的字节或一串字进行操作。与REP前缀相配合工作的指令MOVS、LODS、和STOS指令(1)REP重复串操作直到(CX)=0为止。格式:REP STRING PRIMITIVE其中STRING PRIMITIVE可为MOVS,LODS或STOS指令。如(CX)=0则退出REP,否则继续执行;(CX)(CX)1;执行其后的串指令;重复。(2)MOVS串传送指令格式:MOVS DST,SRC;MOVSB(字节);MOVSW(字),(3)STOS存入串指令STOS指令的格式为:STOS DST;STOSB(字节);STOSW(字)。执行的操作:字节操作:(DI)(AL),(DI)(DI)1字操作:(DI)(AX),(DI)(DI)2(4)LODS 从串中取指令LODS指令的格式为:LODS SRC;LODSB(字节);LODSW(字)。执行的操作:字节操作:(AL)(SI),(SI)(SI)1字操作:(AX)(SI),(SI)(SI)22与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令,(1)REPE/REPZ当相等/为零时重复串操作REPE/REPZ指令的格式为:REPE/REPZ string primitive其中string primitive可为CMPS或SCAS指令。执行的操作:如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则继续执行;(CX)(CX)1;执行其后的串指令;重复。(2)REPNE/REPNZ当不相等/不为零重复串操作REPNE/REPNZ指令的格式为:REPNE/REPNZ string primitive其中string primitive可为CMPS或SCAS指令。执行的操作:除退出条件为(CX)=0或ZF=1外,其他操作与REPE指令完全相同。,(3)、串比较指令CMPSB;(SI)-(DI)(SI)(SI)1,(DI)(DI)1CMPSW;(SI)-(DI)(SI)(SI)2,(DI)(DI)2(4)SCAS串扫描指令SCAS指令的格式为:SCAS DST;SCASB(字节);SCASW(字)。执行的操作:字节操作:(AL)(DI),(DI)(DI)1字操作:(AX)(DI),(DI)(DI)2,3、2、5 控制转移指令控制转移指令分成无条件转移指令和条件转移指令。1无条件转移指令转移可以分成两类:段内转移和段间转移。段内转移是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。段间转移则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成。,(1)直接短转移 JMP SHORT OPR;操作:(IP)(IP)+8位位移量(2)段内直接转移 JMP NEAR PTR OPR;操作:(IP)(IP)+16位位移量(3)段内间接转移 JMP WORD PTR OPR;操作:(IP)(有效地址)(4)段间直接(远)转移 JMP NEAR PTR OPR操作:(IP)OPR的段内偏移地址(CS)OPR所在段的段地址(5)段间间接转移 JMP DWORD PTR OPR操作:(IP)(EA)(CS)(EA+2),2、条件转移指令状态标志作为转移的条件,当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。作为判断条件的状态标志位有:CF、PF、ZF、SF和OF。根据单个标志位的设置情况转移这组包括10种指令,它们一般适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况。结果为零(或相等)转移 JZ/JE OPR;ZF=1 结果不为零(或不相等)转移 JNZ/JNE OPR;ZF=0 结果为负转移 JS OPR;SF=1 结果为正转移 JNS OPR;SF=0,溢出转移 JO OPR;OF=1无溢出转移 JNO OPR;OF=0奇偶位为1转移 JP/PE OPR;PF=1奇偶位为0转移 JNP/JPO OPR;PF=0低于/不高于或等于/进位为1转移 JB/JNAE/JC OPR;CF=1不低于/高于或等于/进位为0转移 JNB/JAE/JNC OPR;CF=0(2)比较两个无符号数,并根据比较的结果转移。低于/不高于或不等于/进位为1转移 JB/JNAE/JC OPR;CF=1且ZF=0不低于/高于或等于/进位为0转移 JNB/JAE/JNC OPR;CF=0或ZF=1,低于或等于/不高于转移 JBE/JNA OPR;CF=1或CF=1不低于或不等于/高于转移 JNBE/JA OPR;CF=0且ZF=0(3)比较两个带符号数,并根据比较结果转移。小于或者不大于或者等于转移 JL(或JNGE)OPR SFZF=1小于或者不大于或者等于转移 JNL(或JGE)OPR SFZF=0 小于或等于,或者不大于转移 JLE(或JNG)OPR(SFZF)ZF=1小于或等于,或者不大于转移 JNLE(或JG)OPR(SFZF)ZF=0,(4)测试CX的值为0则转移指令 JCXZ OPR;(CX)=0则转移 3、循环控制指令(1)LOOP(LOOP)循环指令 格式:LOOP OPR 测试条件:(CX)0(2)LOOPZ/LOOPE(Loop while zero or equal)当为零或相等时循环指令 格式:LOOPZ(或LOOPE)OPR 测试条件:ZF=1且(CX)0(3)LOOPNZ/LOOPNE(Loop while nonzero,or not equal)当不为零或不相等时循环指令 格式:LOOPNZ(或LOOPNE)OPR 测试条件:ZF=0且(CX)0,4、子程序CALL调用指令(1)段内直接调用 格式:CALL DST 执行的操作:(IP)(SP)2;(SP)1,(SP)(IP);(IP)(IP)D16;()段内间接调用 格式:CALL DST 执行的操作:(SP)(SP)2;(SP)1,(SP)(IP);(IP)(EA)()段间直接调用 格式:CALL DST,执行的操作:(SP)(SP)2;(SP)1,(SP)(CS);(SP)(SP)2;(SP)1,(SP)(IP);(IP)偏移地址(指令的第2,3个字节);(CS)段地址(指令的第4,5个字节)。(4)段间间接调用 格式:CALL DST 执行的操作:(SP)(SP)2;(SP)1,(SP)(CS);(SP)(SP)2;(SP)1,(SP)(IP);(IP)(EA);(CS)(EA2),RET返回指令段内返回 RET;(IP)(SP)+1,(SP)(SP)(SP)+2段内带立即数返回 RET EXP;(IP)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+DISP16位移量段间返回 RET;(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2,段间带立即数返回 RET EXP;(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+DISP16位移量3、2、6 处理机控制指令1标志处理指令(1)CLC进位位置0指令(Clear carry)CF 0(2)CMC进位位求反指令(Complement carry)CFCF(3)STC进位位置1指令(Set carry)CF1(4)CLD方向标志置0指令(Clear direction)DF0,(5)STD方向标志位置1指令(Set direction)DF1(6)CLI中断标志置0(关中断)指令(Clear interrupt)IF0(7)STI中断标志置1(开中断)指令(Set interrupt)IF12其它处理机控制指令(1)NOP 空操作指令 NOP指令的语法格式为:NOP(2)HLT 停机指令 HLT指令的语法格式为:HLT(3)WAIT 等待指令 WAIT指令的语法格式为:WAIT(4)ESC 换码指令 ESC指令的语法格式为:ESC mem(5)LOCK 封锁前缀指令 LOCK指令的语法格式为:LOCK,习 题1.判断下列指令是否正确。若不正确,指出错误原因。(1)MOV SP,DL(2)POP CS(3)MOV BPSI,DI(4)MOV SP,BP(5)JLE BX(6)MOV ES,1000H(7)MOV AX,BX+2(8)MOV ES,CS(9)AND AX,CX(10)SHR BL2.说明指令DEC AX与SUB AX,1的区别。3.IP寄存器能作为指令的操作数吗?哪类指令的执行会改变IP的值?4.在无符号数和带符号数比较两种情况下,分别给出下列条件成立时相关标志位的值。(1)相等(2)不相等(3)小于(4)小于或等于(5)大于(6)大于或等,5.说明CALL和RET指令要执行的操作。6.如果过程的第一条指令是POP AX,那么AX的值将是什么?7.在哪两种情况下,执行DIV或IDIV指令将出错?8.给出与下列每组指令序列功能相同的一条指令。(1)MOV AH,AL SAR AH,7(2)MOV DX,AX SAR DX,15(3)TEST AX,1 JZ ISZERO STC JMP DONE ISZERO:CLC DONE,9.写出实现下列功能的指令序列。(1)将AL与BX中的两个无符号数相加,结果放入AX。(2)将AL与BX中的两个带符号数相加,结果放入AX。10.分析下列指令序列完成什么功能。MOV CL,4 SHL AX,CL MOV BL,DL SHR DX,CL SHL BL,CL OR AH,BL 11.给出下列各条指令执行后AL以及CF、OF、SF和ZF的值。XOR AL,AL MOV AL,255,INC AL NOT AL SHL AL CMP AL SUB AL,7FH SHL AL,112.写出与下列指令功能相同的指令序列。(1)CLD REP MOVSB(2)CLD RDP STOSD(3)CLD REPE CMPSW,13.设AX与DX存放的均为位十进制数对应的压缩BCD码,给出下列代码的功能。ADD AL,DL DAA XCHG AL,AH ADC AL,DH DAA XCHG AL,AH14.编写实现下列功能的指令序列。(1)AL的高位与低位分别放入BH与BL的低4位,并将BH与BL的高4位清0。(2)将CX:BX:AX中的48位数加倍。其中,CX与AX分别作为最高16位与最低16位。(3)设AL的值为带符号数,若AL的绝对值小于10,则置CF=0,否则置CF=1。,(4)若AX和BX中的数恰好一个是奇数、一个是偶数,则将奇数放入AX,偶数放入BX;否则,AX和BX不变。(5)将AX中的无符号数乘以10存入DX:AX(要求用移位、传送和加法指令实现)。(6)设字节变量X中存放着位带符号数,计算4X5X2,将结果存入AX中。(7)求12100,结果放入AX中。,