⑴ 求匯編指令大全~
8086/8088指令系統
一、數據傳送指令
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 與其他處理機協同工作時,該指令可避免破壞有用信息.
⑵ movslq 匯編指令 什麼意思
jnz short 7C921065意思是:
在這句前面,有一條指令是影響零位標志的,如
cmp/or/sub... ,該句執行後,如不為0 (ZR=0),
則跳向CS:7C921065那條指令執行。
short 是短轉移的標志,表明本條jnz short 7C921065指令
與CS:7C921065之間相距在0FFH以內。
⑶ 匯編語言指令
8086匯編指令手冊
一、數據傳輸指令
它們在存貯器和寄存器、寄存器和輸入輸出埠之間傳送數據.
1. 通用數據傳送指令.
MOV 傳送字或位元組.
MOVSX 先符號擴展,再傳送.
MOVZX 先零擴展,再傳送.
PUSH 把字壓入堆棧.
POP 把字彈出堆棧.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.
BSWAP 交換32位寄存器里位元組的順序
XCHG 交換字或位元組.( 至少有一個操作數為寄存器,段寄存器不可作為操作數)
CMPXCHG 比較並交換操作數.( 第二個操作數必須為累加器AL/AX/EAX )
XADD 先交換再累加.( 結果在第一個操作數里 )
XLAT 位元組查表轉換.
—— BX 指向一張 256 位元組的表的起點, AL 為表的索引值 (0-255,即
0-FFH); 返回 AL 為查表結果. ( [BX+AL]->AL )
2. 輸入輸出埠傳送指令.
IN I/O埠輸入. ( 語法: IN 累加器, {埠號│DX} )
OUT I/O埠輸出. ( 語法: OUT {埠號│DX},累加器 )
輸入輸出埠由立即方式指定時, 其范圍是 0-255; 由寄存器 DX 指定時,
其范圍是 0-65535.
3. 目的地址傳送指令.
LEA 裝入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 傳送目標指針,把指針內容裝入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 傳送目標指針,把指針內容裝入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 傳送目標指針,把指針內容裝入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 傳送目標指針,把指針內容裝入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 傳送目標指針,把指針內容裝入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 標志傳送指令.
LAHF 標志寄存器傳送,把標志裝入AH.
SAHF 標志寄存器傳送,把AH內容裝入標志寄存器.
PUSHF 標志入棧.
POPF 標志出棧.
PUSHD 32位標志入棧.
POPD 32位標志出棧.
二、算術運算指令
———————————————————————————————————————
ADD 加法.
ADC 帶進位加法.
INC 加 1.
AAA 加法的ASCII碼調整.
DAA 加法的十進制調整.
SUB 減法.
SBB 帶借位減法.
DEC 減 1.
NEC 求反(以 0 減之).
CMP 比較.(兩操作數作減法,僅修改標志位,不回送結果).
AAS 減法的ASCII碼調整.
DAS 減法的十進制調整.
MUL 無符號乘法.
IMUL 整數乘法.
以上兩條,結果回送AH和AL(位元組運算),或DX和AX(字運算),
AAM 乘法的ASCII碼調整.
DIV 無符號除法.
IDIV 整數除法.
以上兩條,結果回送:
商回送AL,余數回送AH, (位元組運算);
或 商回送AX,余數回送DX, (字運算).
AAD 除法的ASCII碼調整.
CBW 位元組轉換為字. (把AL中位元組的符號擴展到AH中去)
CWD 字轉換為雙字. (把AX中的字的符號擴展到DX中去)
CWDE 字轉換為雙字. (把AX中的字元號擴展到EAX中去)
CDQ 雙字擴展. (把EAX中的字的符號擴展到EDX中去)
三、邏輯運算指令
———————————————————————————————————————
AND 與運算.
OR 或運算.
XOR 異或運算.
NOT 取反.
TEST 測試.(兩操作數作與運算,僅修改標志位,不回送結果).
SHL 邏輯左移.
SAL 算術左移.(=SHL)
SHR 邏輯右移.
SAR 算術右移.(=SHR)
ROL 循環左移.
ROR 循環右移.
RCL 通過進位的循環左移.
RCR 通過進位的循環右移.
以上八種移位指令,其移位次數可達255次.
移位一次時, 可直接用操作碼. 如 SHL AX,1.
移位>1次時, 則由寄存器CL給出移位次數.
如 MOV CL,04
SHL AX,CL
四、串指令
———————————————————————————————————————
DS:SI 源串段寄存器 :源串變址.
ES:DI 目標串段寄存器:目標串變址.
CX 重復次數計數器.
AL/AX 掃描值.
D標志 0表示重復操作中SI和DI應自動增量; 1表示應自動減量.
Z標志 用來控制掃描或比較操作的結束.
MOVS 串傳送.
( MOVSB 傳送字元. MOVSW 傳送字. MOVSD 傳送雙字. )
CMPS 串比較.
( CMPSB 比較字元. CMPSW 比較字. )
SCAS 串掃描.
把AL或AX的內容與目標串作比較,比較結果反映在標志位.
LODS 裝入串.
把源串中的元素(字或位元組)逐一裝入AL或AX中.
( LODSB 傳送字元. LODSW 傳送字. LODSD 傳送雙字. )
STOS 保存串.
是LODS的逆過程.
REP 當CX/ECX<>0時重復.
REPE/REPZ 當ZF=1或比較結果相等,且CX/ECX<>0時重復.
REPNE/REPNZ 當ZF=0或比較結果不相等,且CX/ECX<>0時重復.
REPC 當CF=1且CX/ECX<>0時重復.
REPNC 當CF=0且CX/ECX<>0時重復.
五、程序轉移指令
———————————————————————————————————————
1>無條件轉移指令 (長轉移)
JMP 無條件轉移指令
CALL 過程調用
RET/RETF過程返回.
2>條件轉移指令 (短轉移,-128到+127的距離內)
( 當且僅當(SF XOR OF)=1時,OP1<OP2 )
JA/JNBE 不小於或不等於時轉移.
JAE/JNB 大於或等於轉移.
JB/JNAE 小於轉移.
JBE/JNA 小於或等於轉移.
以上四條,測試無符號整數運算的結果(標志C和Z).
JG/JNLE 大於轉移.
JGE/JNL 大於或等於轉移.
JL/JNGE 小於轉移.
JLE/JNG 小於或等於轉移.
以上四條,測試帶符號整數運算的結果(標志S,O和Z).
JE/JZ 等於轉移.
JNE/JNZ 不等於時轉移.
JC 有進位時轉移.
JNC 無進位時轉移.
JNO 不溢出時轉移.
JNP/JPO 奇偶性為奇數時轉移.
JNS 符號位為 "0" 時轉移.
JO 溢出轉移.
JP/JPE 奇偶性為偶數時轉移.
JS 符號位為 "1" 時轉移.
3>循環控制指令(短轉移)
LOOP CX不為零時循環.
LOOPE/LOOPZ CX不為零且標志Z=1時循環.
LOOPNE/LOOPNZ CX不為零且標志Z=0時循環.
JCXZ CX為零時轉移.
JECXZ ECX為零時轉移.
4>中斷指令
INT 中斷指令
INTO 溢出中斷
IRET 中斷返回
5>處理器控制指令
HLT 處理器暫停, 直到出現中斷或復位信號才繼續.
WAIT 當晶元引線TEST為高電平時使CPU進入等待狀態.
ESC 轉換到外處理器.
LOCK 封鎖匯流排.
NOP 空操作.
STC 置進位標志位.
CLC 清進位標志位.
CMC 進位標志取反.
STD 置方向標志位.
CLD 清方向標志位.
STI 置中斷允許位.
CLI 清中斷允許位.
六、偽指令
———————————————————————————————————————
DW 定義字(2位元組).
PROC 定義過程.
ENDP 過程結束.
SEGMENT 定義段.
ASSUME 建立段寄存器定址.
ENDS 段結束.
END 程序結束.
⑷ 匯編指令解釋
1.Rn 表示R0~R7中的一個
2.#data 表示8位的數值 00H~FFH
3.direct 表示8位的地址 00H~FFH
4.@Ri 表示寄存器間接定址 只能是R0或者R1
5.@DPTR 表示數據指針間接定址
6.bit 表示位地址
7.$ 表示當前地址
寄存器定址 MOV A,R1 將R1中的數值賦予A
直接定址 MOV A,3AH 將地址3AH中的數值賦予A
立即定址 MOV A,#3AH 將3AH數值賦予A
寄存器間址 MOV A,@R0 將 R0中地址的數值賦予A
變址定址 MOVC A,@A+DPTR 以A中的數值為地址偏移量進行查表
相對定址 AJMP MATN 跳轉到行號為MATNC處
位定址 MOV C,7FH 將位地址7FH的數值賦予C
MOV A,#3AH 數據傳輸、賦值命令
PUSH direct 將direct為地址的數值壓入堆棧中
POP direct 將direct為地址的數值彈出堆棧
XCH A,direct 將direct中的數值與A進行交換
ADD A,direct 將direct中的數值與
INC direct 將direct中的數值加1
SUBB A,direct 將A中的數值減去direct中的數值和Cy值,並保存在A中,如果想使用不帶Cy減法,可以在運算前對Cy清零 CLR C
DEC direct 將direct中的數值減1
DA A 用於對BCD碼加減法後進行10進制調整
MUL AB 將A和B相乘,並把高八位放在B中,低八位放在A中
DIV AB 將A和B相除,並把商放在A中,余數放在B中
ANL A,direct 將A與direct中的數值進行與運算,結果保留在A中(與運算規律:有0出0,全1出1)
ORL A,direct 將A與direct中的數值進行或運算,結果保留在A中(或運算規律:有1出1,全0出0)
XRL A,direct 將A與direct中的數值進行異或運算,結果保留在A中(異或運算規律:全0出0,全1出0,01、10出1)
CRL A 對A清零
CPL A 對A取反
RL A 對A中數右移
RR A 對A中數左移
RLC A 對A中數帶Cy右移
RRC A 對A中數帶Cy左移
SWAP A 對A中的數高4位低4位互相交換
LJMP 長跳轉指令,64K地址范圍
AJMP 短跳轉指令,2K地址范圍
JZ rel 如果A為0就跳轉到rel行號處
JNZ rel 如果A不為0就跳轉到rel行號處
CJNE A,#data,rel 如果A不等於data就跳轉到rel行號處
DJNZ R1,rel 如果R1減1後不為0就跳轉到rel行號處
ACALL rel 調用rel子程序,2K地址以內
LCALL rel 調用rel子程序,64K地址以內
RET 子程序返回指令
RETI 中斷程序返回指令
NOP 空操作指令
MOV C,bit 將位地址bit中的值賦予C
CRL bit 將bit位地址清0
SETB bit 將bit位地址置1
CPL bit 將bit位地址取反
ANL C,bit 將地址bit中的值和C做與運算,結果存放在C中
ORL C,bit 將地址bit中的值和C做或運算,結果存放在C中
JC rel 如果Cy為1,就跳轉到rel行號處
JNC rel 如果Cy為0,就跳轉到rel行號處
⑸ 匯編指令詳解
MOV(MOVe)
傳送指令
PUSH
入棧指令
POP
出棧指令
XCHG(eXCHanG)
交換指令
XLAT(TRANSLATE)
換碼指令
LEA
(Load
Effective
Address)
有效地址送寄存器指令
LDS(Load
DS
with
pointer)
指針送寄存器和DS指令
LES(Load
ES
with
pointer)
指針送寄存器和ES指令
LAHF(Load
AH
with
Flags)
標志位送AH指令
SAHF(Store
AH
into
Flgs)
AH送標志寄存器指令
ADD
加法指令
ADC
帶進位加法指令
INC
加1指令
SUB(SUBtract)
不帶借位的減法指令
SBB(SuVtrach
with
borrow)
帶借位的減法指令
DEC(DECrement)
減1指領
NEG(NEGate)
求補指令
CMP(CoMPare)
比較指令
MUL(unsinged
MULtiple)
無符號數乘法指令
IMUL(sIgned
MUL
tiple)
有符號數乘法指令
DIV(unsigned
DIVide)
無符號數除法指令
IDIV(sIgned
DIVide)
有符號數除法指令
DAA
壓縮的BCD碼加法十進制調整指令
DAS
壓縮的BCD碼減法十進制調整指令
AAA
非壓縮的BCD碼加法十進制調整指令
AAS
非壓縮的BCD碼加法十進制調整指令
AND
邏輯與指令
OR
邏輯或指令
XOR
邏輯異或指令
NOT
邏輯非指令
TEST
測試指令
SHL(SHift
logical
Letf)
邏輯左移指令
SHR(SHift
logical
Right)
邏輯右移指令
ROL(Rotate
Left
)
循環左移指令
ROR(Rotate
Right)
循環右移指令
RCL(Rotate
Left
through
Carry)
帶進位循環左移
RCR(Rotate
Right
through
Carry)
帶進位循環左移
MOVS(MOVe
String)
串傳送指令
REP(REPeat)
重復操作前綴
CLD(CLear
Direction
flag)
清除方向標志指令
STD(SeT
Direction
flag)
設置方向標志指令
CMPS(CoMPare
String)
串比較指令
SCAS(SCAn
String)
串掃描指令
REPE/REPZ(REPeat
while
Equal/Zero)相等/為零時重復操作前綴
REPNE/REPNZ(REPeat
while
Not
Equal/Zero)不相等/不為零進重復前綴
JMP(JuMP)
無條件轉移指令
JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ
條件轉移指令
LOOP
循環指令P70
LOOPZ/LOOPE
為零/相等時循環指令
LOOPNZ/LOOPNE
不為零/不相等時循環指令
CALL
子程序調用指令
RET(RETun)
子程序返回指令
NOP(No
OPeretion)
無操作指令
HLT(HaLT)
停機指令
OFFSET
返回偏移地址
SEG
返回段地址
EQU(=)
等值語句
DUP
操作數欄位用復制操作符
SEGMENT,ENDS
段定義指令
ASSUME
段地址分配指令
ORG
起始偏移地址設置指令
$
地址計數器的當前值
PROC,ENDP
過程定義語句
NAME,TITLE,END
程序開始結束語句
MACRO,ENDM
宏定義指令
⑹ 匯編指令手冊
自己總結,別偷懶!
⑺ 求匯編語言指令,最好詳細些
051指令集
資料轉移指令
MOV 移動
MOVC 程式記憶體移動
MOVX 外部RAM和擴展I/O口與累加器A的數據傳送指令
PUSH 放入堆疊
POP 由堆疊取回
XCH 8位元交換
XCHD 低4位元交換
SWAP 高低4位元交換
算術指令
ADD 兩數相加
ADDC 兩數相加再加C
SUBB 兩數相減再減C
INC 加一指令
DEC 減一指令
MUL (MUL AB乘法指令僅此一條)相乘指令,所得的16位二進制數低8位存累加器A高8位存B
DIV (DIV AB 除法指令僅此一條)相除指令,所得商存A,余數存B
DA (DA A 只此一條指令)調整為十進數
邏輯指令
ANL做AND(邏輯與)運算
ORL做OR(邏輯或)運算
XRL 做(邏輯異或)運算
CLR 清除為0
CPL 取反指令
RL 不帶進位左環移
RLC 帶進位左環移
RR 不帶進位右環移
RRC 帶進位右環移
控制轉移類指令
JC C=1時跳
JNC C=0時跳
JB 位元=1時跳
JNB 位元=0時跳
JBC 位元=1時跳且清除此位元
LCALL 長調用子程序
ACALL 絕對調用子程序
RET 由副程式返回
RETI 由中斷副程式返回
AJMP 絕對轉移
SJMP 相對轉移
JMP @A+DPTR 散轉,相對DPTR的間接轉移
JZ A=0時跳
JNZA 0時跳
CJNE 二數比較,不相等時跳
DJNZ 減一,不等於0時跳
NOP 空操作
位變數指令
SETB 設定為1
ORG 程序開始,規定程序的起始地址
END 程序結束
EQU 等值指令(先賦值後使用)例:SUM EQU 30H
DB 定義位元組指令
DW 定義字內容
DS 定義保留一定的存貯單元數目
BIT 位地址符號指令 例:SAM BIT P1.0
RET 子程序返回指令
RETI 中斷子程序返回指令
$ 本條指令地址
算術運算指令
指令 說明 周期
ADD A,Rn A←A+Rn 12
ADD A,direct A←A+direct 12
ADD A,@Ri A←A+Ri 12
ADD A,#data A←A+data 12
ADDC A,Rn A←A+Rn+C 12
ADDC A,direct A←A+direct+C 12
ADDC A,@Ri A←A+Ri+C 12
ADDC A,#data A←A+data+C 12
SUBB A,Rn A←A-Rn-C 12
SUBB A,direct A←A-direct-C 12
SUBB A,@Ri A←A-Ri-C 12
SUBB A,#data A←A-data-C 12
INC A A←A+1 12
INC Rn Rn←Rn+1 12
INC direct direct←direct+1 12
INC @Ri @Ri←@Ri+1 12
INC DPTR DPTR←DPTR+1 12
DEC A A←A-1 12
DEC Rn Rn←Rn-1 12
DEC direct direct←direct-1 12
DEC @Ri @Ri←@Ri-1 12
MUL AB 兩個無符號的8位數據相乘,其中高階8位放入B緩存器,低階8位則放入累積器ACC 24
DIV AB 兩個無符號的8位數據相除,把ACC值除以B緩存器值,商數放回ACC,余數放在B 48
DA A 累加器作十進制調整 48
邏輯運算指令
指令 說明 周期
ANL A,Rn A←A and Rn 12
ANL A,direct A←A and direct 12
ANL A,@Ri A←A and Ri 12
ANL A,#data A←A and data 12
ANL direct,A direct←direct and A 12
ANL direct,#data direct←direct and data 24
ORL A,Rn A←A or Rn 12
ORL A,direct A←A or direct 12
ORL A,Rn A←A or Rn 12
ORL A,@Ri A←A or Ri 12
ORL A,#data A←A or data 12
ORL direct,A direct←direct or A 12
ORL direct,#data direct←direct or data 24
XRL A,Rn A←A xor Rn 12
XRL A,direct A←A xor direct 12
XRL A,@Ri A←A xor Ri 12
XRL A,#data A←A xor data 12
XRL direct,A direct←direct xor A 12
XRL direct,#data direct←direct xor data 12
CLR A 清除累加器 12
CPL A 累加器反相 12
RL A 累加器向左旋轉 12
RLC A 累加器和C左旋 12
RR A 累加器向右旋轉 12
RRC A 累加器和C右旋 12
SWAP A 累加器的高低四位互換 12
數據轉移指令
指令 說明 周期
MOV A,Rn A←Rn 12
MOV A,direct A←direct 12
MOV A,@Ri A←Ri 12
MOV A,#data A←data 12
MOV Rn,A Rn←A 12
MOV Rn,direct Rn←direct 24
MOV Rn,#data Rn←data 12
MOV direct,A direct←A 12
MOV direct,Rn direct←Rn 24
MOV direct,direct direct←direct 24
MOV direct,@Ri direct←Ri 24
MOV direct,#data direct←data 24
MOV @Ri,A Ri←A 12
MOV @Ri,direct Ri←direct 24
MOV @Ri,#data Ri←data 12
MOV DPTR,#data 16 Ri←16bit data 24
MOVC A,@A+DPTR A←程序內存的數據 24
MOVC A,@A+PC A←程序內存的數據 24
MOVX A,@Ri A←外部RAM的數據(8bit地址) 24
MOVX A,@DPTR A←外部RAM的數據(16bit地址) 24
MOVX @Ri,A 外部的RAM(8bit)←A 24
MOVX @DPTR,A 外部的RAM(16bit)←A 24
PUSH direc 推迭區←direct 24
POP direc direct←堆棧區 24
XCH A,Rn A和Rn互換 12
XCH A,direct A和direct互換 12
XCH A,@Ri A和Ri互換 12
XCHD A,@Ri A和Ri的低四位互換 12
位運算指令
指令 說明 周期
CLR C 清除進位旗標 12
CLR bit 清除直接位 12
SETB C 設定進位旗標 12
SETB bit 設定直接位 12
CPL C 進位旗標反相 12
CPL bit 直接位反相 12
ANL C,bit C←C and bit 24
ANL C,/bit C←C and bit(反相) 24
ORL C,bit C←C or bit 24
ORL C,/bit C←C or bit(反相) 24
MOV C,bit C←bit 12
MOV bit,C bit←C 24
JC rel 若C=1跳至rel 24
JNC rel 若C=0跳至rel 24
JB bit,rel 若bit=1跳至rel 24
JNB bit,rel 若bit=0跳至rel 24
JBC bit,rel 若bit=1跳至rel,且清除此位 24
程序跳躍指令
指令 說明 周期
ACALL addr11 絕對式子程序呼叫 24
LCALL addr16 遠程子程序呼叫 24
RET 從子程序返回 24
RETI 從中斷子程序返回 24
AJMP addr11 絕對式跳躍 24
LJMP addr16 遠程跳躍 24
SJMP rel 短程跳躍 24
JMP @A+DPTR 間接跳躍 24
JZ rel 若A=0跳至rel 24
JNZ rel 若A不等於0跳至rel 24
CJNE A,direct,rel 若A不等於direct跳至rel 24
CJNE A,#data,rel 若A不等於data跳至rel 24
CJNE Rn,#data,rel 若Rn不等於data跳至rel 24
CJNE @Ri,#data,rel 若Ri不等於data跳至rel 24
DJNZ Rn,rel Rn減1不等於0跳至rel 24
DJNZ direct,rel direct減1不等於0跳至rel 24
NOP 沒動作 12
縮寫符號說明
縮寫符號 說明 備注
Rn 緩存器R0-R7
direct 8bit內部數據存儲器,包括
1.內部數據存儲器(00-7F)的地址
2.特殊功能緩存器(80-FF)的地址,如P0,PSW,TMOD..等
@Ri 由緩存器R0或R1所定址的內部RAM數據
#data 8bit常數
#data 16 16bit常數
addr 16 16bit的目的地址,可使跳躍指令跳躍64k
addr 11 11bit的目的地址,可使跳躍指令跳躍2k
rel 具正負號的8位地址偏移量,用於相對地址的跳躍
bit 1個bit:只所有可以位定址的位。(如PSW.7為CY旗號)
A 累加器(累積器)
C或CY 進位旗號
AC 輔助進位旗號
Bb 指定位B0-B7
D 半位元組(4Bit)助憶符號
F0 旗號0
I 中斷
PC 程序計數器
P0 I/O port 0
P1 I/O port 1
P2 I/O port 2
P3 I/O port 3
PSW 程序狀態字組(類似於旗號緩存器)
SP 堆棧指針緩存器
B 緩存器B
DPTR 數據指針緩存器
X 外部滋要內存的助憶符號
@ 間接地址符號
$ 程序計數迄目前的值
reg 緩存器
8051 INSTRUCTION SET
1.Arithmetic operations:
Mnemonic Byte Cyc
ADD A,@Ri 1 1
ADD A,Rn 1 1
ADD A,direct 2 1
ADD A,#data 2 1
ADDC A,@Ri 1 1
ADDC A,Rn 1 1
ADDC A,direct 2 1
ADDC A,#data 2 1
SUBB A,@Ri 1 1
SUBB A,Rn 1 1
SUBB A,direct 2 1
SUBB A,#data 2 1
INC A 1 1
INC @Ri 1 1
INC Rn 1 1
INC DPTR 1 1
INC direct 2 1
INC direct 2 1
DEC A 1 1
DEC @Ri 1 1
DEC Rn 1 1
DEC direct 2 1
MUL AB 1 4
DIV AB 1 4
DA A 1 1
2.Logical opreations:
ANL A,@Ri 1 1
XRL A,@Ri 1 1
ANL A,Rn 1 1
XRL A,Rn 1 1
ANL A,direct 2 1
XRL A,direct 2 1
ANL A,#data 2 1
XRL A,#data 2 1
ANL direct,A 2 1
XRL direct,A 2 1
ANL direct,#data 3 2
XRL direct,#data 3 2
ORL A,@Ri 1 1
CLR A 1 1
ORL A,Rn 1 1
CPL A 1 1
ORL A,direct 2 1
RL A 1 1
ORL A,#data 2 1
RLC A 1 1
ORL direct,A 2 1
RR A 1 1
ORL direct,#data 3 2
RRC A 1 1
SWAP A 1 1
3.Data transfer:
Mnemonic Byte Cyc
MOV A,@Ri 1 1
MOV DPTR,#data16 3 2
MOV A,Rn 1 1
MOVC A,@A+DPTR 1 2
MOV A,direct 2 1
MOVC A,@A+PC 1 2
MOV A,#data 2 1
MOVX A,@Ri 1 2
MOV @Ri,A 1 1
MOVX A,@DPTR 1 2
MOV @Ri,direct 2 2
MOVX @Ri,A 1 2
MOV @Ri,#data 2 1
MOVX @DPTR,A 1 2
MOV Rn,A 1 1
PUSH direct 2 2
MOV Rn,direct 2 2
POP direct 2 2
MOV Rn,#data 2 1
XCH A,@Ri 1 1
MOV direct,A 2 1
XCH A,Rn 1 1
MOV direct,@Ri 2 2
XCH A,direct 2 1
MOV direct,Rn 2 2
XCHD A,@Ri 1 1
MOV direct,direct3 2
MOV direct,#data 3 2
4.Boolean variable manipulation:
Mnemonic Byte Cyc
CLR C 1 1
ANL C,bit 2 2
SETB C 1 1
ANL C,/bit 2 2
CPL C 1 1
ORL C,bit 2 2
CLR bit 2 1
ORL C,/bit 2 2
SETB bit 2 1
MOV C,bit 2 1
CPL bit 2 1
MOV bit,C 2 2
5.Program and machine control:
Mnemonic Byte Cyc
NOP 1 1
JZ rel 2 2
RET 1 2
JNZ rel 2 2
RETI 1 2
JC rel 2 2
ACALL addr11 2 2
JNC rel 2 2
AJMP addr11 2 2
JB bit,rel 3 2
LCALL addr16 3 2
JNB bit,rel 3 2
LJMP addr16 3 2
JBC bit,rel 3 2
SJMP rel 2 2
CJNE A,direct,rel 3 2
JMP @A+DPTR 1 2
CJNE A,#data,rel 3 2
DJNZ Rn,rel 2 2
CJNE @Ri,#data,rel 3 2
DJNZ direct,rel 3 2
CJNE Rn,#data,rel 3 2
⑻ 匯編語言指令大全,要詳細的 !!!!
一、數據位傳送指令:
1、MOV C, bit ;bit 可直接定址位 C←(bit)
2、MOV bit,C ;C 進位位 (bit) ← C
二、位變數修改指令:
1、CLR C ; 將C=0
2、CLR bit
3、CPL C ; 將C求反再存入C
4、CPL bit ; 將bit求反再存入bit
5、SETB C ; 將C=1
6、SETB bit ; (bit) ← 1
三、位變數邏輯指令:
ANL C, bit ANL C, bit ORL C, bit ORL C, bit