|
MCS-51操作指令? |
|
|
(一) 指令系統(tǒng)簡介 1. 指令分類統(tǒng)計 指令總數(shù):111條 操作碼:255個 助記符:48個 單字節(jié)指令:49條 單周期指令:64條 雙字節(jié)指令:48條 雙周期指令:45條 三字節(jié)指令:17條 四周期指令:2條
表3-1 MCS-51指令分類 數(shù)據(jù)傳送指令(29) 數(shù)據(jù)處理指令(48) 位操作指令(12) 程序控制指令(22) 1) 內(nèi)部傳送(16) 2) 外部傳送(4) 3) 查表 (2) 4) 交換 (5) 5) 棧操作 (2) 1) 算術(shù)運算(24) 2) 邏輯運算(24) 1) 位傳送(2) 2) 位置值(4) 3) 位邏輯(6) 1) 調(diào)用及返回(4) 2) 無條件轉(zhuǎn)移(4) 3) 條件轉(zhuǎn)移 (11) 4) 循環(huán) (2) 5) 空操作 (1)
2. 符號約定 Rn 表示當(dāng)前工作寄存器中的R0R7 Direct 表示對內(nèi)部單元直接尋址的8位地址 Ri 表示8位地址指針R0或R1,地址在R0或R1中。 DPTR 表示16位地址指針,地址在DPTR中。 #data 表示8位立即數(shù)。 #data16 表示16位立即數(shù)。 A+基地址 表示以A為變址寄存器。 addr11 表示短轉(zhuǎn)移的11位地址。 addr16 表示長轉(zhuǎn)移的16位地址。 rel 表示相對轉(zhuǎn)移的地址偏移量。 bit 表示位地址。 (xx) 表示XX單元的內(nèi)容,如(A)表示寄存器A的內(nèi)容。 ((xx)) 表示以(xx)為指針,所指單元的內(nèi)容。例如, ((DPTR))表示數(shù)據(jù)指針DPTR所指單元的內(nèi)容。 3. 尋址方式 表 F1-1 MCS-51指令系統(tǒng)的尋址方式 尋 址 方 式 尋 址 范 圍 操作數(shù)形式 舉 例 寄存器 尋址 R0-R7 ,DPTR Acc,B,C(Cy 位) 寄存器名 MOV R3,A INC DPTR 直接 尋址 內(nèi)部RAM 00H-7FH 特殊功能寄存器 80H-FFH 8位地址 SFR名 MOV 79H,SP PUSH P1
直接 位尋址 內(nèi)部RAM位尋址區(qū) (20H-2FH): 位地址00H-7FH 可尋址的特殊功能寄存器: 位地址 80H-F7H 8位地址 位名 SFR名.位序 MOV C,78H CLR TR0 ANL C,P0.1
寄存器 間接 尋址 以數(shù)據(jù)指針表示操作數(shù)。 內(nèi)部RAM 00H-7FH @R0 @R1 MOV A, @R0 ADD A, @R1 外部RAM或I/O端口 00H-FFH / 0000H-FFFFH @R0 ,@R1@DPTR MOVX A, @R0 MOVX @DPTR,A 立即 尋址 8位(二進(jìn)制)立即數(shù), # data MOV A,# 1 16位(二進(jìn)制)立即數(shù) # data16 MOV DPTR,#2000H 基址 加 變址 尋址 以變址方式讀程序存貯器 實際地址=基址+變址偏移量 8位無符號變址偏移量由A提供 基址由PC或DPTR提供 @A+DPTR @A+PC MOVC A,@A+DPTR MOVC A,@A+PC
轉(zhuǎn) 移 地 址 的 尋 址 方 式 相對 尋址 轉(zhuǎn)移地址= 基址+相對偏移量rel 基址為取指令后的PC 值 8位有符號數(shù)rel在指令中給出 rel SJMP 0EBH 標(biāo)號 SJMP LOOP 標(biāo)號 直接 尋址 短轉(zhuǎn)移,指令直接給出11位地址 Addr11或標(biāo)號 AJMP NEW 標(biāo)號 長轉(zhuǎn)移,指令直接給出16位地址 Addr16或標(biāo)號 LJMP 2010H (二) 數(shù)據(jù)傳送指令 表 3-2 數(shù)據(jù)傳送指令 操作碼 目標(biāo)操作數(shù) 可選擇的源操作數(shù) 說 明 MOV A Rn direct @Ri DPTR Rn;direct;@Ri;# data A;direct;# data A;Rn;direct;@Ri;# data A;direct;# data # data16 內(nèi)部傳送 內(nèi)部傳送 內(nèi)部傳送 內(nèi)部傳送 數(shù)據(jù)指針賦值 PUSH POP 隱含(SP) direct direct 隱含(SP) 壓棧,只能用直接尋址 退棧,只能用直接尋址 XCH A Rn; direct; @Ri 內(nèi)部交換 XCHD SWAP A A @Ri 隱含A 只交換低四位 A的高、低四位互換 MOVX A @Ri @DPTR @Ri; @DPTR A A A與外部數(shù)據(jù)存儲器間傳送 MOVC A @A+DPTR; @A+PC 讀外部程序存儲器 MOV C bit bit C Cy與可尋址位間傳送
1. 數(shù)據(jù)傳送指令的一般性說明 指令的一般格式: 操作碼 目標(biāo)操作數(shù),源操作數(shù) 操作碼 說明操作的性質(zhì) 操作內(nèi)容一般為 (目標(biāo)操作數(shù))←(源操作數(shù)) 8位操作數(shù)的形式有A、Rn、direct、@Ri、# data 等五種 16位操作數(shù)的形式有DPTR 與 # data16 1位操作數(shù)的形式有 C 與 bit 目標(biāo)與源應(yīng)同類型,且有規(guī)定的允許搭配,一般可逆。 A及direct可全搭配,@Ri、Rn不能相互搭配,# data只可作源.。 傳送指令一般不影響標(biāo)志位。 直接改寫PSW的情況除外,改寫Acc影響P標(biāo)志。 2. 內(nèi)部傳送(MOV) 內(nèi)部RAM、特殊功能寄存器(SFR)之間的數(shù)據(jù)傳送。 注意立即數(shù) #XXH與直接地址XXH 的區(qū)別。 @Ri指針使用要點:①與循環(huán)配合,適用于連續(xù)數(shù)據(jù)區(qū)的操作。 ②Ri應(yīng)先賦確定值。i=0,1。 ③是XCHD指令唯一的源操作數(shù)。
3. 外部傳送(MOVX) 以指針方式讀、寫外部數(shù)據(jù)存儲器或I/O端口。 @DPTR提供16位地址指針,可訪問總線擴(kuò)展的整個64k空間。 @Ri只提供低8位地址指針,適用于256個地址的小規(guī)?偩擴(kuò)展。 或者由P2口以I/O方式提供高8位(頁) 地址,采用頁訪問模式。例如: MOV P2,#30H ;由P2口提供高8位地址30H MOV R0,#0 ;低8位地址為00H MOVX A,@R0 ;讀(3000H)單元
應(yīng)用例:將內(nèi)部30H40H單元的內(nèi)容送外部數(shù)據(jù)存儲器,從4000H單元開始存放。 MOV R0,#30H MOV R2,#17 MOV DPTR,#4000H LOOP: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R2,LOOP ;設(shè)置(內(nèi)部)源指針初值 ;設(shè)置循環(huán)計數(shù)器初值 ;設(shè)置(外部)目標(biāo)指針初值 ;循環(huán)入口,讀源數(shù)據(jù) ;寫目標(biāo)數(shù)據(jù) ;源指針下移 ;目標(biāo)指針下移 ;循環(huán)計數(shù)器減一,不為0則繼續(xù)循環(huán)
4. 讀外部程序存儲器(MOVC) 讀取外部程序存儲器中的數(shù)據(jù),用于查表。 MOVC A,@A+PC ;(A)←((A)+(PC)+1) PC為本指令的地址,取指令后加一。 變址偏移量(A)是8位無符號數(shù),因此查表的范圍在(PC)+1 (PC)+255。 MOVC A,@A+DPTR ;(A)←((A)+(DPTR)) DPTR是16位指針,因此查表的范圍為全64k空間。 應(yīng)用例:查Y(x)函數(shù)表。 3000H MOV A,#表元素序號 3002H ADD A,#表頭偏移量 3004H MOVC A, @A+PC ORG 30A0H TABLE: DB 17,22,34,58,82,103 表頭偏移量=表頭地址-(MOVC指令地址+1)
5. 棧操作(PUSH / POP) 堆棧在內(nèi)部RAM區(qū)。 PUSH和POP的對象可以是內(nèi)部RAM單元或SFR。 尋址方式只能用direct。例如, PUSH 30H ;(SP)←(SP)+1,((SP))←(30H) POP DPH ;(DPH)←((SP)),(SP)←(SP)-1
6. 交換(XCH / XCHD /SWAP) XCH 字節(jié)交換:A與內(nèi)部RAM單元或SFR交換。例如 XCH A,R2 ;(A)(R2) XCHD 半字節(jié)交換:A與內(nèi)部RAM單元進(jìn)行低四位交換,只能用寄存器間址@Ri。例如 XCHD A,@R1 ;(A)D0- D 3 ((R1))D0- D 3 SWAP A ;(A)D0- D 3 (A)D4- D 7 應(yīng)用例:拆字,將壓縮BCD碼擴(kuò)展為單字節(jié)BCD碼。
MOV R0, #30H 設(shè)立指針 MOV A, #0 ;(A)=0 XCHD A, @R0 ;(A)=0BH MOV R4, A ;(R4)=0BH XCH A,30H ;(A)=30H SWAP A ;(A)=03H MOV R3,A ;(R3)=03H
(三) 算術(shù)運算指令 表 3-3 算術(shù)運算指令 操作碼 目標(biāo)操作數(shù) 參與運算的操作數(shù) 說 明 Cy AC OV P ADD A Rn; direct; @Ri; # data 不帶進(jìn)位加 ADDC A Rn; direct; @Ri; # data 帶進(jìn)位加 SUBB A Rn; direct; @Ri; # data 帶借位減 MUL AB (A)*(B) 積在(B)(A) 0 - DIV AB (A)/(B) 商 (A) ,余數(shù) (B) DA A 只對加法作十進(jìn)制修正 - - INC A; Rn; direct; @Ri; DPTR 加一 - - - DEC A; Rn; direct; @Ri (無DPTR) 減一 *“”表示標(biāo)志位根據(jù)運算結(jié)果取值,“-”表示對標(biāo)志位無影響。
1. 算術(shù)運算指令的一般性說明 除加1/減1指令外,一般以累加器Acc為目標(biāo),且影響標(biāo)志位。 沒有不帶借位減指令。用SUBB作不帶借位減運算,Cy應(yīng)先清零。 乘法若 積 > 255 , 則OV = 1 除法若 除數(shù) = 0 , 則OV = 1 。 DA A 指令只對ADD 或ADDC作十進(jìn)制修正。 無 DEC DPTR指令。
2. 加/減指令應(yīng)用例 將內(nèi)部RAM中從30H開始存放的10個雙字節(jié)無符號整數(shù)相加,其和送(R5 R4 R3),低字節(jié)在R3。
MOV R0,#30H MOV R2,#10 MOV R3,#0 MOV R4,#0 MOV R5,#0 LOOP:MOV A,@R0 ADD A, R3 MOV R3,A INC R0 MOV A,@R0 ADDC A,R4 MOV R4,A INC R0 MOV A,#0 ADDC A,R5 MOV R5,A DJNZ R2,LOOP
將內(nèi)部RAM中從30H開始存放的10個4位十進(jìn)制正整數(shù)(壓縮BCD碼)相加,其和送(R5 R4 R3),低字節(jié)在R3。
比較A與B中的無符號數(shù),大數(shù)存B。 MOV R2,A CLR C ;確保C = 0 SUBB A,B JC DONE ;若有借位,A<B,轉(zhuǎn)DONE 結(jié)束。 MOV B,R2 ;沒有借位,A>B,將大數(shù)存B。 DONE:
3. 乘/除指令應(yīng)用例 雙字節(jié)數(shù)乘單字節(jié)數(shù):雙字節(jié)數(shù)在(R3R4),單字節(jié)數(shù)在(R2),積送(R3R4R5) MOV A,R2 MOV B,R4 MUL AB (R4)(R2) MOV R5,A MOV R4,B MOV A,R2 MOV B,R3 MUL AB (R3)(R2) ADD A,R4 MOV A,#0 ADDC A,B MOV R3,A
單字節(jié)二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制(BCD)數(shù):二進(jìn)制數(shù)在A,十進(jìn)制數(shù)存入(R2R3) MOV B,#10 DIV AB 除十, 余個位 MOV R3,B 個位存R3 MOV B,#10 DIV AB 再除十, 余十位 MOV R2,A 商為百位,存R2 MOV A,B SWAP A ADD A,R3 十位與個位合并 MOV R3,A;

|
|
|