18086CPU指令小结所有指令:(1)立即数不能作为目的操作数。(2)不能在2个存储单元之间直接进行操作(串操作除外)。(3)MOV指令和堆栈指令是惟一能对段寄存器进行操作的指令。(4)源和目的操作数的数据类型必须匹配,都是8位,或都是16位。(5)CS、IP不能直接作为操作数。(6)指令中至少要有一项明确说明传送的是字节还是字,如果没有,可通过PTR进行设置。一、传送指令(1)6种指令:通用传送指令、堆栈操作指令、交换操作指令、I/O操作指令、目的地址传送指令和标志传送指令。(2)对标志位的影响:除标志传送(SAHF、POPF)外,均不影响标志位。(3)操作数表示方法:立即数——data,存储器单元地址——mem,寄存器——reg,段寄存器——segreg。1.通用传送指令:完成数据传送(1)指令格式:MOVOPRD1,OPRD2;[目的操作数OPRD1]←[源操作数OPRD2](2)源OPRD2:data、mem、reg、segreg。(3)目的OPRD1:mem、reg、segreg。(4)通用传送指令MOV和堆栈指令是唯一允许以段寄存器(代码段寄存器CS和指令指针IP除外,即CS、IP不能作为直接操作数)作为操作数的指令,不允许通过MOV指令直接以立即数方式给段寄存器赋值,不允许直接在两个段寄存器之间直接进行传送。(5)8位/16位操作。2.堆栈操作指令:将数据压入/弹出堆栈(1)指令格式:入栈:PUSHOPRD;先修改堆栈指针SP-2,然后将数据压入堆栈。;SP=SP-1,[SP]=操作数高8位;SP=SP-1,[SP]=操作数低8位。出栈:POPOPRD;先将数据弹出堆栈,然后修改堆栈指针SP+2。;(操作数低8位)←[SP],SP=SP+1;(操作数高8位)←[SP],SP=SP+1。(2)操作数:mem、reg、segreg。操作数不能是立即数data。(3)仅能进行字运算(16位操作)。(4)堆栈存取原则为后进先出,只有一个入/出口SS:SP,SP始终指向栈顶,SP是自动修改的,SP在初始化中需要设置。(5)PUSH、POP指令必须成对使用。3.交换操作指令:XCHG——数据交换;XLAT——完成一个字节的换码转换(1)指令格式:交换操作指令:XCHGOPRD1,OPRD2;[OPRD1]←→[OPRD2]累加器换码指令(表转换指令、查表指令):XLAT;(AL)←((DS)×16+(BX)+(AL))(2)XCHG:段寄存器和立即数不能作为一个操作数,8位/16位操作。(3)XLAT:表首地址在BX中,AL的内容作为某一项到表首的偏移量(256字节的2表的下标),转换后的结果存放在AL中。4.I/O操作指令:累加器(AX/AL)与I/O端口之间的数据传送(1)指令格式:输入指令:INAL/AX,PORT;(AL/AX)←[PORT]INAL/AX,DX;(AL/AX)←[DX]输出指令:OUTPORT,AL/AX;[PORT]←(AL/AX)OUTDX,AL/AX;[DX]←(AL/AX)(2)当端口地址≤255时,使用PORT(8位端口直接地址);当端口地址≥255时,必须用DX(16位端口直接地址)作桥梁。DX作端口寻址最多可寻找64K个端口。(3)PORT为直接寻址,8位/16位操作。5.目的地址传送指令(1)取有效地址指令:LEAOPRD1,OPRD2或:LEAreg,[add];(reg)←add,add为有效地址把存储器的有效地址EA(源操作数的地址偏移量)送入一个寄存器reg;常用于将一个16位的通用寄存器作为地址指针。传送的是有效地址EA。(2)将双地址指针装入DS和另一个寄存器指令LDS指令:LDSOPRD1,OPRD2或:LDSreg,[add];(reg)←(add+1)(add),(DS)←(add+3)(add+2)(3)将双地址指针装入ES和另一个寄存器指令LES指令:LESOPRD1,OPRD2或:LESreg,[add];(reg)←(add+1)(add),(ES)←(add+3)(add+2)①从源操作数指定的存储单元中取出4字节的地址指针(包括2字节的段地址和2字节的偏移量)传送到DS/ES和reg。指定将段地址送入DS/ES,偏移量部分送入一个16位的指针寄存器或变址寄存器。②源操作数mem,目的操作数必须是一个16位的通用寄存器。③传送的是存储单元的内容,而不是存储器的有效地址EA。6.标志传送指令(1)读标志指令:LAHF;(AH)←(FR)0~7功能:将标志寄存器中的SF、ZF、AF、PF和CF(即低8位)传送至AH寄存器的指定位,空位没有定义。(2)存标志指令:SAHF;(FR)0~7←(AH)功能:将寄存器AH的指定位,送至标志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根据AH的内容,影响上述标志位,对OF、DF、IF和TF无影响。(3)标志入栈指令:PUSHF;将FR入栈。(SP)←(SP)-2,((SP)+1,(SP))←(FR)功能:将标志寄存器FR压入堆栈顶部,同时修改堆栈指针,不影响标志位。(4)标志弹出栈指令:POPF;将栈顶的内容弹出到FR中。;(FR)←((SP)+1,(SP)),(SP)←(SP)+2功能:堆栈顶部的一个字,传送到标志寄存器FR,同时修改堆栈指针,影响标志位。二、算术运算指令(1)9种指令:加法指令、减法指令、增量//减量指令、求补指令、比较指令、乘法指令、除法指令、字节字/转换为字扩展指令和十进制调整指令。(2)对标志位的影响:3①加、减、比较指令(CMP)、取补指令(NEG)指令均影响6个标志位CF、OF、PF、SF、ZF和AF。②乘法指令影响CF和OF标志;除法指令所有标志位都不确定,无意义。③增量//减量指令影响除进位标志CF以外的5个标志位AF、OF、PF、SF和ZF。④字节字/转换为字扩展指令不影响标志位。⑤加法的ASCII调整指令AAA,十进制调整指令DAA影响除溢出标志OF以外5个标志:CF、PF、SF、ZF和AF;OF没有意义。⑥减法的ASCII调整指令AAS、十进制调整指令DAS影响2个标志:CF和AF;其余标志没有意义。⑦乘法的ASCII调整指令AAM、除法的ASCII调整指令AAD根据AL寄存器的结果影响SF、ZF和PF。1.加法指令(Addition):完成加法操作。(1)格式:ADD/ADCOPRD1,OPRD2;(OPRD1)←(OPRD1)+(OPRD2)(2)源:data、mem、reg;目的:reg,mem。(3)ADC指令主要用于多字节运算中。(4)8位/16位操作。2.减法指令(Subtraction):完成减法操作。(1)格式:SUB/SBBOPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2)(2)规定同加法指令。3.增量(加1)/减量(减1)指令INC/DEC:完成+1/-1操作。(1)格式:INC/DECOPRD;(OPRD)←(OPRD)±1(2)功能:主要用于在循环程序中修改地址指针和循环次数等。(3)操作数:reg、mem。4.求补指令NEG:完成补码操作。(1)格式:NEGOPRD(2)操作数:reg、:mem。5.比较指令CMP:完成减法操作,结果不回送,反映在标志位上。(1)格式:CMPOPRD1,OPRD2;(OPRD1)-(OPRD2)(2)功能:主要用于比较两个数之间的关系。在比较指令之后,根据标志即可判断两者之间的关系。减法操作,结果不回送目的操作数。(3)两数关系的判断标志①A=B用ZF=1判断;②两个无符号数的大小用CF判断。CF=1,AB;CF=0,AB。③两个符号数的大小用SF⊕OF判断。SF⊕OF=1,AB;SF⊕OF=0,AB。JG/JNLE(大于,SF⊕OF=0且ZF=0)JL/JNGE(小于,SF⊕OF=1且ZF=0)6.乘法指令MUL/IMUL:完成无符号乘法/带符号(整数)乘法操作。(1)格式:MUL/IMULOPRD;8位:(AX)←(AL)╳(OPRD);16位:(DX)(AX)←(AX)╳(OPRD)(2)源操作数:reg、mem,由指令给出。(3)目的操作数:默认在AL/AX中。(4)带符号数乘法指令IMUL当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。(6)可完成字节与字节乘法、字与字乘法操作。47.除法指令DIV/IDIV:完成无符号除法/带符号(整数)除法操作。(1)格式:DIV/IDIVOPRD;8位:(AL)←(AX)/(OPRD)……(AH)(余数);16位:(AX)←(DX)(AX)/(OPRD)……(DX)(余数)(2)源/目的操作数规定同乘法指令。(3)对于符号数,当被除数不够位数时,需要对高8/16位进行扩展符号扩展。8.字节字/转换为字扩展指令CBW/CWD:将AL/AX寄存器的最高位扩展到AH/DX。(1)格式:CBW/CWD(2)功能:将AL/AX寄存器的最高位扩展到AH/DX,AL.7(AX.15)=0,则AH(DX)=0;AL.7(AX.15)=1,则AH=0FFH(DX=0FFFFH)。9.十进制调整指令(1)压缩BCD码:每个字节表示两位BCD数;非压缩BCD码:用一个字节表示一位BCD数,在这字节的高四位用0填充。(2)每条十进制调整指令在使用时都与相应的算术运算指令配合,并自动对相应的算术运算指令结果进行相应的十进制调整。(3)格式:①DAA:压缩的BCD码加法调整②DAS:压缩的BCD码减法调整③AAA:非压缩的BCD码加法调整④AAS:非压缩的BCD码减法调整⑤AAM:乘法后的BCD码调整⑥AAD:除法前的BCD码调整三、逻辑运算和移位指令1.逻辑运算指令(1)5种指令:逻辑与、或、非、异或和测试指令。(2)指令格式①逻辑与指令ANDOPRD1,OPRD2;(OPRD1)←(OPRD1)∧(OPRD2)②逻辑或指令OROPRD1,OPRD2;(OPRD1)←(OPRD1)∨(OPRD2)③逻辑非指令NOTOPRD;(OPRD)←(/OPRD)④逻辑异或指令XOROPRD1,OPRD2;(OPRD1)←(OPRD1)⊕(OPRD2)⑤测试指令TESTOPRD1,OPRD2;(OPRD1)∧(OPRD2),结果不回送。(3)操作数范围源操作数为reg、mem、data;目的操作数为reg、mem(NOT指令只有一个操作数)。单操作数指令NOT的操作数不能为立即数。双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。(4)功能:实现相应的逻辑功能。①与指令可实现屏蔽(复位)数据的某些位(使一个字或字节中的某些位清0,而其余位不变),提取某些位或拆字。②或指令可实现置位数据的某些位(使一个字或字节中的某些位置1,而其余位不变),拼字。③非指令常用于使某个数取反,或取反后+1而得补码。④异或指令可实现某个寄存器清0,或使目的操作数的某些位取反(使一个字或字节中的某些位取反,而其余位不变)。⑤测试指令通常用于测试。目的操作数的某些位是1还是0,用ZF标志判断。5(5)对标志位的影响①逻辑与、或、异或和测试指令影响ZF,PF,SF标志;CF=0,OF=0;AF无意义。②逻辑非指令不影响标志位。2.移位指令(1)4组8种指令:算术移位SA,逻辑移位SH,循环移位RO,带进位位的循环移位RC。右移R,左移L。(2)指令格式:操作码OPRD,MM=1时,只移1位;M1时,可将指令格式中的CNT改为CL寄存器,并在移位指令前将移位次数预先送入CL寄存器中。(3)功能:将OPRD的内容移位M次。算术移位适用于带符号数的×2,÷2。逻辑移位适用于无符号数的×2,÷2。(4)操作数范围:reg、mem。(5)对标志位的影响:①算术/逻辑移位指令影响CF、SF、ZF、PF标志,在移1位时,影响OF标志。不影响AF标志。②循环移位指令只影响CF、OF标志,不影响其他标志位。MSBLSBMSBLSBMSBLSBCF