8086/8088指令详解

来源:互联网 发布:linux中文显示问号 编辑:程序博客网 时间:2024/06/06 08:56
一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV指令格式为: MOV  DST,SRC执行的操作:(DST)<-(SRC).PUSH进栈指令格式为:PUSH  SRC执行的操作:(SP)<-(SP)-2           ((SP)+1,(SP))<-(SRC).POP出栈指令格式为:POP  DST执行的操作:(DST)<-((SP+1),(SP))           (SP)<-(SP)+2.XCHG 交换指令格式为:XCHG  OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)2.累加器专用传送指令IN(Input)  输入OUT(Output)  输出XLAT(Translate)  换码这组指令只限于使用累加器AX或AL传送信息..IN 输入指令长格式为:    IN  AL,PORT(字节)     IN  AX,PORT(字)执行的操作:  (AL)<-(PORT)(字节)             (AX)<-(PORT+1,PORT)(字)短格式为:    IN  AL,DX(字节)             IN  AX,DX(字)执行的操作:  AL<-((DX))(字节)             AX<-((DX)+1,DX)(字).OUT 输出指令长格式为:    OUT  PORT,AL(字节)             OUT   PORT,AX(字)执行的操作:  (PORT)<-(AL)(字节)             (PORT+1,PORT)<-(AX)(字)短格式为:    OUT  DX,AL(字节)             OUT  DX,AX(字)执行的操作:  ((DX))<-(AL)(字节)             ((DX)+1,(DX))<-AX(字)    在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来 传送信息. .XLAT  换码指令格式为:    XLAT  OPR或:        XLAT执行的操作:(AL)<-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器格式为:  LEA   REG,SRC执行的操作:(REG)<-SRC    指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令格式为:  LDS  REG,SRC执行的操作:(REG)<-(SRC)           (DS)<-(SRC+2)    把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES 指针送寄存器和ES指令格式为:  LES  REG,SRC执行的操作: (REG)<-(SRC)            (ES)<-(SRC+2)    把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AHSAHF(store AH into flags)AH送标志寄存器PUSHF(push the flags) 标志进栈POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为:    LAHF执行的操作:(AH)<-(PWS的低字节).SAHF AH送标志寄存器格式为:    SAHF执行的操作:(PWS的低字节)<-(AH).PUSHF 标志进栈格式为:    PUSHF执行的操作:(SP)<-(SP)-2           ((SP)+1,(SP))<-(PSW).POPF 标志出栈格式为:    POPF执行的操作:(PWS)<-((SP)+1,(SP))           (SP)<-(SP+2)
二、算术指令1.加法指令ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1.ADD  加法指令格式:    ADD   DST,SRC执行的操作:(DST)<-(SRC)+(DST).ADC  带进位加法指令格式:    ADC   DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CF.ADD  加1指令格式:    INC   OPR执行的操作:(OPR)<-(OPR)+12.减法指令SUB(subtract)减法SBB(subtract with borrow)带借位减法DEC(Decrement)减1NEG(Negate)求补CMP(Compare)比较.SUB  减法指令格式:  SUB  DST,SRC执行的操作:(DST)<-(DST)-(SRC).SBB  带借位减法指令格式:  SBB  DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CF.DEC  减1指令格式:  DEC  OPR执行的操作:(OPR)<-(OPR)-1.NEG  求补指令格式:  NEG  OPR执行的操作:(OPR)<- -(OPR).CMP  比较指令格式:  CMP  OPR1,OPR2执行的操作:(OPR1)-(OPR2)    该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.3.乘法指令MUL(Unsigned Multiple)无符号数乘法IMUL(Signed Multiple)带符号数乘法.MUL 无符号数乘法指令格式:   MUL  SRC执行的操作:    字节操作数:(AX)<-(AL)*(SRC)    字操作数:(DX,AX)<-(AX)*(SRC).IMUL 带符号数乘法指令格式:   IMUL  SRC执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法IDIV(Signed divide)带符号数除法CBW(Convert byte to word)字节转换为字CWD(Contert word to double word)字转换为双字.DIV  无符号数除法指令格式:   DIV  SRC执行的操作: 字节操作:(AL)<-(AX)/(SRC)的商           (AH)<-(AX)/(SRC)的余数  字操作:  (AX)<-(DX,AX)/(SRC)的商           (AX)<-(DX,AX)/(SRC)的余数.IDIV  带符号数除法指令格式:   DIV  SRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW 字节转换为字指令格式:   CBW执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH.CWD 字转换为双字指令格式:  CWD执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.    这两条指令都不影响条件码.
三、逻辑指令1.逻辑运算指令AND(and)          逻辑与OR(or)           逻辑或NOT(not)         逻辑非XOR(exclusive or)异或TEST(test)       测试.AND  逻辑与指令格式:    AND   DST,SRC执行的操作:(DST)<-(DST)^(SRC).OR  逻辑或指令格式:    OR   DST,SRC执行的操作:(DST)<-(DST)V(SRC).NOT  逻辑非指令格式:    NOT   OPR执行的操作:(OPR)<-(OPR).XOR  异或指令格式:    XOR   DST,SRC执行的操作:(DST)<-(DST)V(SRC).TEST  测试指令格式:    TEST   OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical left)          逻辑左移SAL(shift arithmetic left)      算术左移SHR(shift logical right)        逻辑右移SAR(shift arithmetic right)     算术右移ROL(Rotate left)                 循环左移ROR(Rotate right)                循环右移RCL(Rotate left through carry)  带进位循环左移RCR(Rotate right through carry) 带进位循环右移格式:    SHL  OPR,CNT(其余的类似)其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上格式:  REP   string primitive其中String Primitive可为MOVS,LODS或STOS指令执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3).MOVS  串传送指令格式:可有三种    MOVS  DST,SRC    MOVSB(字节)    MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:            MOVS    ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:   (SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1   当方向标志DF=0时用+,当方向标志DF=1时用-3)字操作:   (SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2   当方向标志DF=0时用+,当方向标志DF=1时用-该指令不影响条件码..CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS  存入串指令格式:   STOS  DST        STOSB(字节)        STOSW(字)执行的操作:   字节操作:((DI))<-(AL),(DI)<-(DI)+-1    字操作:  ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中..LODS  从串取指令格式:    LODS  SRC         LODSB         LODSW执行的操作:   字节操作:(AL)<-((SI)),(SI)<-(SI)+-1    字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.   2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ  当相等/为零时重复串操作格式:     REPE(或REPZ)    String Primitive其中String Primitive可为CMPS或SCAS指令.执行的操作:1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3).REPNE/REPNZ  当不相等/不为零时重复串操作格式:     REPNE(或REPNZ)   String Primitive其中String Primitive可为CMPS或SCAS指令执行的操作:    除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同..CMPS  串比较指令格式:     CMP   SRC,DST          CMPSB          CMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1  字操作:  (SI)<-(SI)+-2,(DI)<-(DI)+-2 指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS  串扫描指令格式:   SCAS   DST        SCASB        SCASW执行的操作:    字节操作:(AL)-((DI)),(DI)<-(DI)+-1    字操作:  (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同. 
五、控制转移指令  1.无条件转移指令.JMP(jmp)  跳转指令1)段内直接短转移格式:JMP  SHORT OPR执行的操作:(IP)<-(IP)+8位位移量2)段内直接近转移格式:JMP  NEAR PTR OPR执行的操作:(IP)<-(IP)+16位位移量3)段内间接转移格式:JMP  WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP  FAR PTR OPR执行的操作:(IP)<-OPR的段内偏移地址           (CS)<-OPR所在段的段地址5)段间间接转移格式:JMP  DWORD PTR OPR执行的操作:(IP)<-(EA)           (CS)<-(EA+2)2.条件转移指令1)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or equal)  结果为零(或相等)则转移格式:JE(或JZ)  OPR测试条件:ZF=1.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE)  OPR测试条件:ZF=0.JS(Jump if sign)  结果为负则转移格式:  JS  OPR测试条件:SF=1.JNS(Jump if not sign)  结果为正则转移格式:JNS  OPR测试条件:SF=0.JO(Jump if overflow)  溢出则转移格式:   JO  OPR测试条件:OF=1.JNO(Jump if not overflow)不溢出则转移格式:   JNO OPR测试条件:OF=0.JP(或JPE)(Jump if parity,or parity even)奇偶位为1则转移格式:   JP  OPR测试条件:PF=1.JNP(或JPO)(Jump if not parity,or parity odd)奇偶位为0则转移格式:   JNP(或JPO)  OPR测试条件:PF=0.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC)  OPR测试条件:CF=1.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC)  OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上.JNB(或JAE,JNC)格式:同上.JBE(或JNA)(Jump if below or equal,or not above)低于或等于,或不高于则转移格式:JBE(或JNA)  OPR测试条件:CFVZF=1.JNBE(或JA)(Jump if not below or equal,or above)不低于或等于,或者高于则转移格式:JNBE(或JA)  OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移.JL(或LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于则转移格式:JL(或JNGE)  OPR测试条件:SFVOF=1.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE)  OPR测试条件:SFVOF=0.JLE(或JNG)(Jump if less or equal,or not greater)小于或等于,或者不大于则转移格式:JLE(或JNG)  OPR测试条件:(SFVOF)VZF=1.JNLE(或JG)(Jump if not less or equal,or greater)不小于或等于,或者大于则转移格式:JNLE(或JG)  OPR测试条件:(SFVOF)VZF=04)测试CX的值为0则转移指令.JCXZ(Jump if CX register is zero)CX寄存器的内容为零则转移格式:JCXZ  OPR测试条件:(CX)=0注:条件转移全为8位短跳!3.循环指令.LOOP 循环指令格式: LOOP  OPR测试条件:(CX)<>0.LOOPZ/LOOPE 当为零或相等时循环指令格式: LOOPZ(或LOOPE)  OPR测试条件:(CX)<>0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令格式: LOOPNZ(或LOOPNE)  OPR测试条件:(CX)<>0且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.4.子程序.CALL调用指令.RET返回指令5.中断.INT指令格式:    INT  TYPE或       INT执行的操作:(SP)<-(SP)-2           ((SP)+1,(SP))<-(PSW)           (SP)<-(SP)-2           ((SP)+1,(SP))<-(CS)           (SP)<-(SP)-2           ((SP)+1,(SP))<-(IP)           (IP)<-(TYPE*4)           (CS)<-(TYPE*4+2).INTO  若溢出则中断执行的操作:若OF=1则:           (SP)<-(SP)-2           ((SP)+1,(SP))<-(PSW)           (SP)<-(SP)-2           ((SP)+1,(SP))<-(CS)           (SP)<-(SP)-2           ((SP)+1,(SP))<-(IP)           (IP)<-(10H)           (CS)<-(12H).IRET    从中断返回指令格式:     IRET执行的操作:(IP)<-((SP)+1,(SP))           (SP)<-(SP)+2           (CS)<-((SP)+1,(SP))           (SP)<-(SP)+2           (PSW)<-((SP)+1,(SP))           (SP)<-(SP)+2
六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF<-0.CMC进位位求反指令(Complement carry)CF<-CF.STC进位位置1指令(Set carry)CF<-1.CLD方向标志置0指令(Clear direction)DF<-0.STD方向标志置1指令(Set direction)DF<-1.CLI中断标志置0指令(Clear interrupt)IF<-0.STI中断标志置1指令(Set interrupt)IF<-02.其他处理机控制指令NOP(No Opreation)   无操作HLT(Halt)           停机WAIT(Wait)          等待ESC(Escape)         换码LOCK(Lock)          封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP 无操作指令    该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令    该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令    该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令   格式ESC  mem其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件..LOCK封锁指令    该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.