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與其他處理機協同工作時,該指令可避免破壞有用信息.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章