`

X86汇编指令

    博客分类:
  • x86
 
阅读更多

转自<http://blog.sina.com.cn/s/blog_9efa18c3010118qh.html>

一、数据传送指令
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)指针送寄存器和DS
LES(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)标志送AH
SAHF(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)+1

2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(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可以是
1CL.
     循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以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)-1
3)执行其中的串操作
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)-1
3)执行其后的串指令
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=0

2)比较两个无符号数,并根据比较的结果转移
.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=0

3)比较两个带符号数,并根据比较的结果转移

.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=0

4)测试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)-1
2)检查是否满足测试条件,如满足则(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<-0
2.其他处理机控制指令
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与其他处理机协同工作时,该指令可避免破坏有用信息.

一、数据传送指令
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)指针送寄存器和DS
LES(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)标志送AH
SAHF(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)+1

2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(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可以是
1CL.
     循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以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)-1
3)执行其中的串操作
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)-1
3)执行其后的串指令
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=0

2)比较两个无符号数,并根据比较的结果转移
.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=0

3)比较两个带符号数,并根据比较的结果转移

.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=0

4)测试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)-1
2)检查是否满足测试条件,如满足则(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<-0
2.其他处理机控制指令
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与其他处理机协同工作时,该指令可避免破坏有用信息.

一、数据传送指令
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)指针送寄存器和DS
LES(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)标志送AH
SAHF(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)+1

2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(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可以是
1CL.
     循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以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)-1
3)执行其中的串操作
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)-1
3)执行其后的串指令
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=0

2)比较两个无符号数,并根据比较的结果转移
.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=0

3)比较两个带符号数,并根据比较的结果转移

.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=0

4)测试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)-1
2)检查是否满足测试条件,如满足则(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<-0
2.其他处理机控制指令
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与其他处理机协同工作时,该指令可避免破坏有用信息.

一、数据传送指令
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)指针送寄存器和DS
LES(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)标志送AH
SAHF(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)+1

2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(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)-1
3)执行其中的串操作
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)-1
3)执行其后的串指令
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=0
2)比较两个无符号数,并根据比较的结果转移
.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=0
3)比较两个带符号数,并根据比较的结果转移
.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=0
4)测试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)-1
2)检查是否满足测试条件,如满足则(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<-0
2.其他处理机控制指令
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与其他处理机协同工作时,该指令可避免破坏有用信息.

分享到:
评论

相关推荐

    x86汇编指令集大全(带注释).pdf

    X86汇编指令集是计算机体系结构中不可或缺的一部分,特别是在32位和64位的x86架构处理器中。这篇文档详细列举了汇编指令,并为每条指令提供了注释说明。以下知识点涵盖了文档中提及的关键指令及其功能。 一、数据...

    X86汇编指令集X86汇编指令集

    **X86汇编指令集详解** X86汇编语言是针对Intel 8086处理器家族设计的一种低级编程语言,广泛应用于各种基于X86架构的计算机系统,包括个人电脑、服务器和嵌入式设备。它允许程序员直接控制硬件资源,提供更高的...

    x86 汇编指令速查手册

    ### x86汇编指令详解:速查手册精要 #### 概述 在计算机科学领域,特别是硬件编程与底层软件开发中,掌握x86架构下的汇编语言是至关重要的技能之一。本文旨在深入解析《x86汇编指令速查手册》中的关键知识点,涵盖...

    汇编语言--x86汇编指令集大全.zip

    **汇编语言与x86汇编指令集详解** 汇编语言是一种低级编程语言,它是计算机硬件系统可以直接理解和执行的指令集的符号化表示。在个人计算机领域,x86架构是主流,对应的汇编语言就是x86汇编语言。这种语言直接对应...

    汇编语言指令大全 X86和X87汇编指令大全(带注释).zip

    X86汇编语言是基于Intel 8086处理器的指令集,广泛应用于个人计算机系统。X86指令集包括数据处理、控制流程、输入输出等多种类型的指令,如: 1. **数据处理指令**:包括算术运算(如ADD、SUB、MUL、DIV)、逻辑...

    Intel x86 &amp; x64 汇编指令集(共七卷)

    ### Intel x86 & x64 汇编指令集概览 #### 一、概述 《Intel x86 & x64 汇编指令集(共七卷)》是一套全面介绍Intel架构下的汇编语言编程技术的文档资料。它由英特尔公司发布,包含了Intel 64和IA-32架构的软件...

    80x86汇编指令大全

    汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令汇编指令...

    汇编指令查询工具 (收录了汇编指令大全)

    例如,常见的x86汇编指令如MOV、ADD、SUB、JMP、CALL等,它们各自的作用和应用场合。 MOV指令用于数据的移动,可以从一个寄存器到另一个寄存器,或者从内存到寄存器,反之亦然。ADD和SUB则是进行加法和减法运算,而...

    x86汇编指令1

    X86体系结构(汇编语言)x86简介x86体系结构主要分成3种:x86-16,代表处理器为8086,字长x8616位IA-32,代表处理器为80386,字长32

    80x86汇编指令集

    80x86汇编指令

    汇编指令大全 英文版

    通过这两个文件,读者可以更方便地学习和查询X86汇编指令的详细信息,包括指令格式、操作数、操作结果以及示例代码等。 学习汇编语言不仅需要记忆大量的指令,还需要理解计算机的内存模型、寻址方式和程序结构。...

    现代X86汇编语言程序设计Modern X86 Assembly Language Programming

    X86汇编语言的特点在于它的指令集,包括数据处理、控制流程、输入输出和内存操作等多种指令。例如,`MOV`指令用于在寄存器或内存之间移动数据,`ADD`和`SUB`用于执行加法和减法运算,`JMP`和`CALL`则用于控制程序...

    X86汇编语言原版图书

    《X86汇编语言》是一本专注于X86架构汇编语言编程的专业图书,以英文原版的形式呈现,提供清晰的PDF格式,适合阅读和打印装订。这本书深入浅出地介绍了X86架构下的汇编语言编程,是学习这一领域知识的重要资源。 ...

    x86指令手册

    ### x86指令集架构概览 #### 一、引言 x86指令集架构(ISA)是现代计算机体系结构中的一个重要组成部分,它最初由Intel公司开发,并被广泛应用...此外,借助强大的开发工具和文档资源,学习x86汇编语言变得更为容易。

    X86 ARM 汇编指令参考CHM

    ARM 指令集 寄存器和处理器模式(26-bit 体系) &(32-bit 体系) 程序状态寄存器和操纵它的指令 寄存器装载和存储指令 算术和逻辑指令 移位操作 乘法指令 比较指令 分支指令 条件执行 ...X86常用汇编指令 X86汇编伪指令

    80x86汇编指令查询器 v3.0 绿色版.rar

    80x86汇编指令查询器主要功能是针对80 x 86 机的汇编指令的信息查询, 提供了按助记符和指令的类型进行查询的途径. 由于数据库的复杂性, 在数据库添加时难免出一些问题. 在此, 还望广大用户提供出自己指正并宝贵的...

    86系列汇编指令与机器码对照表_×86-64机器指令_x86_furnitureybl_汇编_

    86系列汇编指令与机器码对照表是一个重要的参考资料,主要针对的是x86架构的处理器,特别是针对8086及其后续的80386、80486和 Pentium等CPU系列。汇编语言是低级编程语言,它的每一个指令直接对应处理器的硬件操作,...

    x86汇编语言 从实模式到保护模式.zip

    《x86汇编语言 从实模式到保护模式》是一部深入探讨x86架构处理器在不同模式下工作原理及编程技术的专著。本文将详细介绍x86汇编语言的基础知识,实模式与保护模式的转换过程,以及这两者之间的关键差异。 一、x86...

Global site tag (gtag.js) - Google Analytics