版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章指令系統(tǒng)與程序設(shè)計(jì)
主講:吳國東
不同種類的單片機(jī)指令系統(tǒng)一般是不同的,但C8051F系列單片機(jī)的指令系統(tǒng)與MCS-51系列單片機(jī)相同。本章將介紹C8051F系列單片機(jī)指令系統(tǒng)的尋址方式、各類指令的格式及功能,還將介紹匯編語言偽指令及匯編程序設(shè)計(jì)。第3章指令系統(tǒng)與程序設(shè)計(jì)
指令是規(guī)定計(jì)算機(jī)進(jìn)行某種操作的命令。一條指令只能完成有限的功能,為使計(jì)算機(jī)完成一定的或復(fù)雜的功能就需要一系列指令。計(jì)算機(jī)能夠執(zhí)行的各種指令的集合稱為指令系統(tǒng)。指令系統(tǒng)的性能與計(jì)算機(jī)硬件密切相關(guān),不同的計(jì)算機(jī)指令系統(tǒng)不完全相同。計(jì)算機(jī)的主要功能也是由指令系統(tǒng)來體現(xiàn)的。3.1指令系統(tǒng)簡(jiǎn)介
3.1指令系統(tǒng)簡(jiǎn)介
C8051F的指令系統(tǒng)共有111條指令。
C8051F單片機(jī)有豐富的位操作指令,這樣可方便地用于各種邏輯控制,這是所有單片機(jī)指令系統(tǒng)的共同特點(diǎn)。
通常指令分為操作碼和操作數(shù)兩部分,操作碼規(guī)定操作的類型,操作數(shù)給出參加操作的數(shù)據(jù)或存放數(shù)據(jù)的地址。
3.1指令系統(tǒng)簡(jiǎn)介
對(duì)于單字節(jié)指令有兩種情況:一種是操作碼、操作數(shù)均包含在這一字節(jié)之內(nèi);另一種情況是只有操作碼無操作數(shù)。對(duì)于雙字節(jié)指令,均為一字節(jié)是操作碼,一字節(jié)是操作數(shù);對(duì)于三字節(jié)指令,一般是一字節(jié)為操作碼,二字節(jié)為操作數(shù)。
3.1指令系統(tǒng)簡(jiǎn)介
C8051F匯編指令格式如下:操作碼[操作數(shù)]
操作碼:是由助記符表示的字符串,它規(guī)定了指令的操作功能。
操作數(shù):是指參加操作的數(shù)據(jù)或數(shù)據(jù)的地址。3.1指令系統(tǒng)簡(jiǎn)介
在C8051F指令系統(tǒng)中,操作碼是指令的核心,不可缺少。操作碼與操作數(shù)之間必須用空格分隔,操作數(shù)與操作數(shù)之間必須用“,”分開,帶方括號(hào)的項(xiàng)稱可選項(xiàng)。操作數(shù)可以是1個(gè)、2個(gè)或3個(gè),也可以沒有。不同功能的指令,操作數(shù)作用不同。3.1指令系統(tǒng)簡(jiǎn)介
例如,傳送類指令多數(shù)有兩個(gè)操作數(shù),寫在左面的稱為目的操作數(shù),寫在右面的稱為源操作數(shù)。
操作數(shù)的表達(dá)方式較多,可以是常數(shù)、寄存器名、標(biāo)號(hào)名、直接地址單元、表達(dá)式等,還可以使用一個(gè)特殊符號(hào)“$”,用來表示程序計(jì)數(shù)器的當(dāng)前值,通常用在轉(zhuǎn)移指令中。操作數(shù)如果是常數(shù),必須用整數(shù),不能用分?jǐn)?shù)和小數(shù),負(fù)數(shù)用補(bǔ)碼表示。3.1指令系統(tǒng)簡(jiǎn)介
例如,一條傳送指令的書寫格式為:
MOV4AH,AA→(4AH)
表示將累加器A的內(nèi)容送到4AH存儲(chǔ)單元中。3.2尋址方式尋址方式是指在指令代碼中用以表示操作數(shù)地址的各種規(guī)定,它指出了參與操作的數(shù)或數(shù)所在的地址。尋址方式與計(jì)算機(jī)的存儲(chǔ)器空間結(jié)構(gòu)是密切聯(lián)系的,尋址方式越多則計(jì)算機(jī)的功能越強(qiáng),靈活性亦越大,能更有效地處理各種數(shù)據(jù)。為了更好地理解、掌握指令系統(tǒng),需先了解它的尋址方式。3.2尋址方式3.2.1符號(hào)約定
說明C8051F系列的指令及對(duì)其功能時(shí),需要描述寄存器、地址及數(shù)據(jù)等的符號(hào),這些符號(hào)約定如下:
(1)Rn
當(dāng)前選中的工作寄存器組R0~R7(n=0~7)。它在核內(nèi)數(shù)據(jù)存儲(chǔ)器中的地址由PSW中RS1、RS0確定,可以是00H~07H(第0組)、08H~0FH(第1組)、10H~17H(第2組)、18H~1FH(第3組)。3.2尋址方式3.2.1符號(hào)約定
(2)Ri
當(dāng)前選中的工作寄存器組中可作為地址指針的兩個(gè)工作寄存器R0、R1(i=0或1)。它在核內(nèi)數(shù)據(jù)存儲(chǔ)器中的地址由RS0、RS1確定,分別為00H、01H;08H、09H;10H、11H;18H、19H。
(3)#data8位立即數(shù),即包含在指令中的8位常數(shù)。
3.2尋址方式3.2.1符號(hào)約定
(4)#data1616位立即數(shù),即包含在指令中的16位常數(shù)。
(5)direct8位核內(nèi)RAM單元的直接地址或寄存器(包括SFR)。
(6)addr1111位目的地址。用于ACA11和AJMP指令中,目的地址必須放在與下一條指令第一個(gè)字節(jié)同一個(gè)2KB程序存儲(chǔ)器地址空間之內(nèi)。3.2尋址方式3.2.1符號(hào)約定
(7)addr1616位目的地址。用于LCALL和LJMP指令中,目的地址范圍在64KB程序存儲(chǔ)器地址空間。
(8)rel
補(bǔ)碼形式的8位地址偏移量,表示相對(duì)跳轉(zhuǎn)的偏移字節(jié),用于相對(duì)轉(zhuǎn)移指令中。偏移量以下一條指令第一字節(jié)地址為基值,偏移范圍為-128~+127。3.2尋址方式3.2.1符號(hào)約定
(9)bit核內(nèi)RAM或特殊功能寄存器的直接尋址位地址。
(10)@間接尋址方式中,表示間址寄存器的前綴符號(hào)。
(11)/位操作指令中,表示對(duì)該位取反操作的前綴符號(hào)。
(12)A累加器
(13)BB寄存器,用于乘、除指令中。3.2尋址方式3.2.1符號(hào)約定
(14)C進(jìn)位標(biāo)志或進(jìn)位位,或位操作指令中的位累加器。
(15)SP堆棧地址指針。
(16)(X)在直接尋址方式中,X表示直接地址direct中的內(nèi)容;在間接尋址方式中,X表示由間址寄存器Ri、DPTR、SP等指出的地址單元中的內(nèi)容。3.2尋址方式3.2.1符號(hào)約定
(17)→指令操作流程,將箭頭左邊的內(nèi)容送人箭頭右邊的單元內(nèi)。
注意:在注釋操作數(shù)地址時(shí),為簡(jiǎn)潔明了,比英文原文少了一層括號(hào),例如((Rn)),簡(jiǎn)寫為(Rn);(A),簡(jiǎn)寫為A等。在此只保留了直接地址direct的括號(hào),因?yàn)橹苯拥刂吠ǔJ怯脭?shù)字表示,容易和數(shù)字#data引起混淆,這樣在注釋時(shí)也可以省去#data前的#。3.2尋址方式3.2.2尋址方式說明
C8051F系列指令共有7種尋址方式,下面將以指令為例逐一介紹。
1.立即尋址指令直接給出參加運(yùn)算的操作數(shù)。在立即尋址方式中的操作數(shù)直接參與操作,所以又稱立即數(shù),立即數(shù)就是存放在程序存儲(chǔ)器中的常數(shù),在立即數(shù)前面必須加”#”號(hào)表示。
3.2尋址方式3.2.2尋址方式說明
例1執(zhí)行指令MOVA,#3DH
指令代碼為74H、3DH,雙字節(jié)指令。功能是把立即數(shù)3DH送入累加器A中。設(shè)把指令存放在存儲(chǔ)區(qū)的0100H、0101H兩單元(存放指令的起始地址是任意假設(shè)的)。該指令執(zhí)行過程如圖3-1所示(圖中數(shù)字均為十六進(jìn)制并且省略后綴H)。3.2尋址方式3.2.2尋址方式說明
圖3-1MOVA,#3DH執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
例2執(zhí)行指令MOVDPTR,#1256H
指令代碼為90H、12H、56H,是三字節(jié)指令。功能是向地址指針DPTR傳送16位的立即數(shù),即把立即數(shù)的高8位送入DPH,低8位送入DPL。該指令執(zhí)行過程如圖3-2所示。3.2尋址方式3.2.2尋址方式說明
圖3-2MOVDPTR,#1256H執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
2.直接尋址在這種尋址方式中,指令直接給出參加運(yùn)算的操作數(shù)地址。在C8051F單片機(jī)中,直接地址只能用來表示特殊功能寄存器、核內(nèi)數(shù)據(jù)存儲(chǔ)器以及位地址空間。其中特殊功能寄存器和位地址空間只能用直接尋址方式來訪問。3.2尋址方式3.2.2尋址方式說明
例3執(zhí)行指令MOVA,3DH
指令代碼為E5H、3DH,雙字節(jié)指令。設(shè)該指令存放在程序存儲(chǔ)區(qū)的3DH、3EH單元,且核內(nèi)RAM的3DH單元中存放的數(shù)值為3AH。當(dāng)該指令執(zhí)行后,數(shù)值3AH就被送到A累加器中。指令執(zhí)行過程如圖3-3所示。3.2尋址方式3.2.2尋址方式說明
圖3-3MOVA,3DH執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
3.寄存器尋址在這種尋址方式中,操作數(shù)存放在所選定的寄存器中。這些寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR等。工作寄存器組的選擇是由狀態(tài)標(biāo)志寄存器PSW中的RS1、RS0來確定。3.2尋址方式3.2.2尋址方式說明
例4執(zhí)行指令MOVA,R4
指令代碼的二進(jìn)制形式為11101100,十六進(jìn)制為ECH,注意,其二進(jìn)制數(shù)低三位為100,正好為4,表示操作數(shù)在R4中。這就是操作碼、操作數(shù)均包含在一字節(jié)之內(nèi)的情況。3.2尋址方式3.2.2尋址方式說明
現(xiàn)假設(shè)這條指令存放在4AH單元,且PSW中RS1、RS0的值分別為0、1,則可知現(xiàn)在的R6是屬于第1組工作寄存器的,那么它的地址為0CH。現(xiàn)已知0CH中存放著數(shù)值58H,則執(zhí)行該指令后,58H就被送到A累加器中。該指令執(zhí)行過程如圖3-4所示。3.2尋址方式3.2.2尋址方式說明
圖3-4MOVA,R4執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
4.寄存器間接尋址在這種尋址方式中,寄存器中存放的數(shù)值不是操作數(shù),而是操作數(shù)的地址。這種尋址方式用于訪問核內(nèi)數(shù)據(jù)存儲(chǔ)器(RAM)或片外數(shù)據(jù)存儲(chǔ)器(RAM)。3.2尋址方式3.2.2尋址方式說明
4.寄存器間接尋址當(dāng)訪問核內(nèi)RAM低128字節(jié)或片外RAM低256字節(jié)時(shí),可采用當(dāng)前工作寄存器組中的R0或R工作間接地址寄存器,即由R0或R1間接給出操作數(shù)所在的地址,這樣R0或R1為存放操作數(shù)單元的地址指針。在間接地址寄存器前面一定要加@表示。
3.2尋址方式3.2.2尋址方式說明
例5執(zhí)行指令MOVA,@R0
指令代碼為E6H,是單字節(jié)指令。指令的源操作數(shù)存放在核內(nèi)數(shù)據(jù)存儲(chǔ)器中?,F(xiàn)假設(shè)此指令存放在30H單元,工作寄存器為第0組,R0中存放50H,50H為核內(nèi)RAM的一個(gè)單元,現(xiàn)50H中存放數(shù)值為5AH。則執(zhí)行該指令后,5AH就送入ACC中。該指令執(zhí)行過程如圖3-5所示。3.2尋址方式3.2.2尋址方式說明
圖3-5MOVA,@R0執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
例6執(zhí)行指令MOVXA,@R1
指令代碼為E3H,是單字節(jié)指令。源操作數(shù)存放在片外數(shù)據(jù)存儲(chǔ)器中?,F(xiàn)假設(shè)此指令存放在170H單元,工作寄存器組為第3組,在R1中存放的數(shù)值為C3H,片外數(shù)據(jù)存儲(chǔ)器C3H單元中值為1FH,則執(zhí)行該指令后,1FH就送入ACC中。該指令執(zhí)行過程如圖3-6所示。3.2尋址方式3.2.2尋址方式說明
圖3-6MOVXA,@RI執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
訪問片外數(shù)據(jù)存儲(chǔ)器時(shí),還可用數(shù)據(jù)指針DPTR作間址寄存器。DPTR是16位寄存器,故它可對(duì)整個(gè)64KB片外數(shù)據(jù)存儲(chǔ)器空間尋址。例如指令MOVXA,@DPTR,其功能是把DPTR指定的片外RAM中的內(nèi)容送到A中。在執(zhí)行PUSH(壓棧)和POP(出棧)指令時(shí),采用堆棧指針SP作寄存器間接尋址。3.2尋址方式3.2.2尋址方式說明
5.變址尋址(基址+變址寄存器間接尋址)
這種尋址方式以DPTR或PC為基址寄存器,累加器A為變址寄存器。變址尋址時(shí),把兩者的內(nèi)容相加,所得到的結(jié)果作為操作數(shù)的地址。這種方式常用于查表操作。例
MOVCA,@A+DPTR
3.2尋址方式3.2.2尋址方式說明
例7執(zhí)行指令MOVCA,@A+DPTR
指令代碼為93H,是單字節(jié)指令。假設(shè)此指令存放在1070H單元,ACC中原存放值為DCH,DPTR中值為1000H,則A+DPTR形成的地址為10DCH。10DCH單元內(nèi)容為1FH,則執(zhí)行指令后,ACC中原DCH被1FH代替。該指令執(zhí)行過程如圖3-7所示。3.2尋址方式3.2.2尋址方式說明
圖3-7MOVCA,@A+DPTR執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
6.相對(duì)尋址相對(duì)尋址只用于相對(duì)轉(zhuǎn)移指令中,這種尋址方式是將程序計(jì)數(shù)器PC中的當(dāng)前內(nèi)容與指令第二字節(jié)所給出的數(shù)相加,其結(jié)果作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址,轉(zhuǎn)移地址也稱為轉(zhuǎn)移目的地址。3.2尋址方式3.2.2尋址方式說明
PC中的當(dāng)前內(nèi)容稱為基地址(它實(shí)際是本指令之后的字節(jié)地址),指令第二字節(jié)給出的數(shù)據(jù)稱為偏移量。偏移量為帶符號(hào)的數(shù),其表示的范圍為-128~+127。
目的地址是相對(duì)于PC的基地址而言,所以這種尋址方式主要用于跳轉(zhuǎn)指令。
3.2尋址方式3.2.2尋址方式說明
轉(zhuǎn)移目的地址可如下式計(jì)算:
目的地址=源地址+轉(zhuǎn)移指令字節(jié)數(shù)+re1
源地址指轉(zhuǎn)移指令所在單元地址,不同的轉(zhuǎn)移指令字節(jié)數(shù)一般是不同的,通常為2字節(jié)或3字節(jié)。re1為偏移量。3.2尋址方式3.2.2尋址方式說明
在編程時(shí)這個(gè)偏移量的值可以直接用數(shù)字量,也可以用標(biāo)號(hào)表示。通常不必手工計(jì)算,只需用地址標(biāo)號(hào)代替即可,匯編程序可自動(dòng)計(jì)算出目的地址。例8執(zhí)行指令JNZ30H3.2尋址方式3.2.2尋址方式說明
例8執(zhí)行指令JNZ30H
指令代碼為70H、30H,雙字節(jié)指令。此指令表示若A=0,則程序順序執(zhí)行,即不跳轉(zhuǎn),PC=PC+2;若A≠0,則以PC中的當(dāng)前內(nèi)容為基地址,加上偏移量30H后所得到的結(jié)果為該轉(zhuǎn)移指令的目的地址。3.2尋址方式3.2.2尋址方式說明
假設(shè)此指令存放在1000H、1001H單元,且目前A≠O,則取指令后,PC當(dāng)前內(nèi)容為1002H,對(duì)A進(jìn)行判斷后,把PC當(dāng)前內(nèi)容與偏移量30H相加,得到轉(zhuǎn)移目的地址1032H。所以執(zhí)行完此指令后,PC中的值為1032H,程序?qū)?032H開始執(zhí)行。該指令執(zhí)行過程如圖3-8所示。3.2尋址方式3.2.2尋址方式說明
圖3-8JNZ30H執(zhí)行示意圖3.2尋址方式3.2.2尋址方式說明
7.位尋址位尋址是指對(duì)核內(nèi)RAM的位尋址區(qū)和某些可位尋址的特殊功能寄存器中的任意二進(jìn)制位,進(jìn)行位操作時(shí)的尋址方式。在進(jìn)行位操作時(shí),用進(jìn)位位C作為操作累加器。位地址與字節(jié)直接尋址中的字節(jié)地址形式完全一樣,主要由操作碼來區(qū)分。3.2尋址方式3.2.2尋址方式說明
例9執(zhí)行指令SETB6AH
指令代碼為D2H、6AH,雙字節(jié)指令。
6AH位是核內(nèi)RAM中2DH單元的第2位。假設(shè)2DH中原內(nèi)容為00H,那么執(zhí)行此指令后,就把6AH這一位置1。所以2DH中內(nèi)容就變?yōu)?4H。圖3-9為該指令執(zhí)行示意圖。3.2尋址方式3.2.2尋址方式說明
圖3-9SETB6AH執(zhí)行示意圖3.2尋址方式
C8051指令系統(tǒng)中的7種尋址方式所涉及的存儲(chǔ)器空間。3.3指令系統(tǒng)3.3指令系統(tǒng)
C8051F的指令系統(tǒng)按功能可分為5大類,即:數(shù)據(jù)傳送類、算術(shù)運(yùn)算類、邏輯運(yùn)算類、控制轉(zhuǎn)移類、位操作類。本節(jié)將介紹各類指令的助記符、功能及尋址方式
3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
數(shù)據(jù)傳送類指令是最常用、最基本的一類指令。傳送類指令一般不影響標(biāo)志位,只有堆棧操作可以直接修改程序狀態(tài)字PSW。另外,對(duì)于傳送目的操作數(shù)為ACC的指令將影響奇偶標(biāo)志PF。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
數(shù)據(jù)傳送類指令用到的助記符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共8種。源操作數(shù)可以采用寄存器尋址、寄存器間接尋址、直接尋址、立即尋址、變址尋址5種尋址方式,目的操作數(shù)可以采用前3種尋址方式。數(shù)據(jù)傳送指令共有29條,分為以下5類進(jìn)行介紹。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
1.內(nèi)部RAM數(shù)據(jù)傳送指令單片機(jī)內(nèi)部的數(shù)據(jù)傳送指令最多,包括寄存器、累加器、核內(nèi)RAM單元及專用寄存器之間數(shù)據(jù)的相互傳送。下面分類介紹:3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
1)累加器為目的操作數(shù)的指令(4條)匯編指令格式:
MOVA,Rn;Rn→AMOVA,direct;(direct)→AMOVA,@Ri;(Ri)→AMOVA,#data;data→A3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
1)累加器為目的操作數(shù)的指令(4條)
這組指令的功能是將源操作數(shù)所指定的內(nèi)容送人累加器A。源操作數(shù)有寄存器尋址、直接尋址、寄存器間接尋址和立即尋址4種尋址方式。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
2)以寄存器Rn為目的操作數(shù)的指令(3條)
匯編指令格式:
MOVRn,A;A→RnMOVRn,direct;(direct)→RnMOVRn,#data;data→Rn3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
這組指令的功能是把源操作數(shù)所指定的內(nèi)容送到當(dāng)前工作寄存器組R0~R7中的某個(gè)寄存器中。源操作數(shù)有寄存器尋址、直接尋址、立即尋址3種尋址方式。注意:沒有“MOVRn,Rn"指令。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
例1A=5BH,R1=10H,R2=20H,
R3=A0H,(A0H)=4FH,執(zhí)行指令:
MOVR1,A;A→R1MOVR2,0A0H;(A0H)→R2MOVR3,#83H;83H→R3執(zhí)行后,R1=5BH,R2=4FH,R3=83H。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
3)以直接地址為目的操作數(shù)的指令(5條)
匯編指令格式:
MOVdirect,A;A→(direct)MOVdirect,Rn
;Rn→(direct)
MOVdirect,direct
;(direct)→(direct)MOVdirect,@Ri
;(Ri)→(direct)MOVdirect,#data;data→(direct)3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
這組指令的功能是把源操作數(shù)所指定的內(nèi)容送入由直接地址direct所指出的核內(nèi)存儲(chǔ)單元中。源操作數(shù)有寄存器尋址、直接尋址、寄存器間接尋址、立即尋址等尋址方式。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
例2已知:R1中內(nèi)容為57H,核內(nèi)存儲(chǔ)單元57H中內(nèi)容為E7H,現(xiàn)執(zhí)行如下指令:
MOV43H,@R1;(R1)→(43H)
該指令執(zhí)行結(jié)果43H單元中為E7H。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
注意:
“MOVdirect,direct”指令譯成機(jī)器碼時(shí),源地址在前,目的地址在后。如“MOV0A0H,90H”機(jī)器碼為85,90,A0。另外,在匯編指令中,寄存器可寫成地址形式,也可寫成代號(hào)形式。例如:
MOV090H,A,也可寫成MOVP1,A。因?yàn)?0H為P1的地址。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
4)以間接地址為目的操作數(shù)的指令(3條)匯編指令格式:
MOV@Ri,A;A→(Ri)MOV@Ri,direct;(direct)→(Ri)MOV@Ri,#data;data一(Ri)3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
這組指令的功能是把源操作數(shù)所指定的內(nèi)容送入以R0或R1為地址指針的核內(nèi)存儲(chǔ)單元中。源操作數(shù)有寄存器尋址、直接尋址和立即尋址3種尋址方式。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
5)16位數(shù)據(jù)傳送指令(1條)匯編指令格式:
MOVDPTR,#data16;dataH→
DPH,dataL→DPL
對(duì)于C8051F單片機(jī),這是惟一的16位立即數(shù)傳送指令。其功能是把16位常數(shù)送入
DPTR。
3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
2.外部數(shù)據(jù)傳送指令(4條)
在C8051F指令系統(tǒng)中,CPU對(duì)核外RAM的訪問只能用寄存器間接尋址的方式。匯編指令格式:
MOVXA,@Ri;(Ri)一AMOVX@Ri,A;A→(Ri)MOVXA,@DPTR;(DPTR)一AMOVX@DPTR,A;A→(DPTR)3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
外部數(shù)據(jù)傳送指令主要是實(shí)現(xiàn)累加器A與核外數(shù)據(jù)存儲(chǔ)器之間的數(shù)據(jù)傳送,但要注意的是,對(duì)于C8051F單片機(jī)核內(nèi)的高128字節(jié)RAM也要用這類指令傳送。片外數(shù)據(jù)存儲(chǔ)器的地址總線低8位和高8位分別由功能選擇開關(guān)寄存器配置。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
MOVXA,@Ri;(Ri)一AMOVX@Ri,A;A→(Ri)
上述兩條指令是用R0或R1作低8位地址指針,由I/O的低端口送出,尋址范圍是256字節(jié)。這兩條指令完成以R0或R1為地址指針的核外數(shù)據(jù)存儲(chǔ)器與累加器A之間的數(shù)據(jù)傳送。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
MOVXA,@DPTR;(DPTR)一AMOVX@DPTR,A;A→(DPTR)
上述兩條指令以DPTR為核外數(shù)據(jù)存儲(chǔ)器16位地址指針,尋址范圍達(dá)64KB。其功能是在DPTR所指定的核外數(shù)據(jù)存儲(chǔ)器與累加器A之間傳送數(shù)據(jù)。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
由于在C8051F指令系統(tǒng)中,沒有專門對(duì)外設(shè)的輸入輸出指令,且片外擴(kuò)展的I/O接口地址與片外RAM是統(tǒng)一編址的。如果在片外數(shù)據(jù)存儲(chǔ)器的地址空間上插入I/O接口,則上面的4條指令就可以作為輸入輸出指令。C8051F單片機(jī)只能用這種指令方式與外部設(shè)備打交道。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
例3把C8051F單片機(jī)核內(nèi)90H單元中的數(shù)傳送到口地址為B000H的設(shè)備中去。程序如下:
MOVR0,#90H;90H→R0MOVXA,@R0;(R0)→AMOVDPTR,#0B000H;B000H→DPTRMOVX@DPTR,A;A→(DPTR)3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
3.查表指令(2條)匯編指令格式:
MOVCA,@A+PC;PC+1→PC,(A+PC)→AMOVCA,@A+DPTR;(A+DPTR)→A
這2條指令主要用于查表,其數(shù)據(jù)表格通常放在程序存儲(chǔ)器中。這兩條指令執(zhí)行后,不改變PC或DPTR的內(nèi)容。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
MOVCA,@A+PC為單字節(jié)指令,當(dāng)CPU讀取指令后,PC的內(nèi)容自動(dòng)加1。其操作是將新的PC的內(nèi)容與累加器A內(nèi)8位無符號(hào)數(shù)相加形成地址,取出該地址單元中的內(nèi)容送累加器A。這種指令查表很方便,但只能查找指令所在地址以后256字節(jié)范圍內(nèi)的代碼或常數(shù)。3.3指令系統(tǒng)例4在程序存儲(chǔ)器中,數(shù)據(jù)表格為:
1010H:02H1011H:04H1012H:06H1013H:08H執(zhí)行程序
1000H:MOVA,#ODH;0DH→A1002H:MOVCA,@A+PC;(0DH+1003H)→A1003H:MOVR0,A;A→R0結(jié)果:A=02H,R0=02H,PC=1004H3.3指令系統(tǒng)例5在程序存儲(chǔ)器中,數(shù)據(jù)表格為:
7010H:02H7011H:04H7012H:06H7013H:08H執(zhí)行程序
1004H:MOVA,#10H;10H→A1006H:MOVDPTR,#7000H;7000H→DPTR1009H:MOVCA,@A+DPTR;(10H+7000H)→A結(jié)果:A=02H,PC=100AH3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
4.堆棧操作指令(2條)匯編指令格式:
PUSHdirect;SP+1→SP,(direct)→(SP)POPdirect;(SP)→(direct),SP-1→SP3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
使用堆棧時(shí),一般需重新設(shè)定SP的初始值。由于壓入堆棧的第1個(gè)數(shù),必須存放在SP+1存儲(chǔ)單元,故實(shí)際棧底是在SP+1所指出的單元中。另外,要注意留出足夠的存儲(chǔ)單元作棧區(qū),因?yàn)闂m斒请S數(shù)據(jù)的彈入和彈出變化的,如棧區(qū)設(shè)置不當(dāng),則可能發(fā)生數(shù)據(jù)重疊,這樣會(huì)引起程序混亂,以致無法運(yùn)行。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
一般情況下,執(zhí)行此指令不影響標(biāo)志,但若目標(biāo)操作數(shù)為PSW,則有可能使一些標(biāo)志改變。這也是通過指令強(qiáng)行修改標(biāo)志的一種方法。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
例6已知堆棧指針為30H,核內(nèi)RAM50H單元中存放數(shù)值為3FH,把此數(shù)值壓入堆棧,然后再彈出到67H單元中。根據(jù)題意編寫指令如下:
MOVSP,#30H;30H→SP,設(shè)堆棧指針
PUSH50H;SP+1→SP,(50H)→(31H),
3FH送入31H中
POP67H;(31H)→(67H),SP-1→SP3.3指令系統(tǒng)
程序執(zhí)行過程如圖3-10所示。圖3-10例6程序執(zhí)行示意圖結(jié)果:數(shù)值3FH裝入67H單元內(nèi),SP終值為30H。
3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
5.交換指令(5條)匯編指令格式:
XCHA,Rn;A←→RnXCHA,direct;A←→(direct)XCHA,@Ri;A←→(Ri)XCHDA,@Ri;A.3~A.0←→(Ri.3~Ri.0)SWAPA;A.3~A.0←→A.7~A.43.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
這組指令的前3條為全字節(jié)交換指令。其功能是將累加器A與源操作數(shù)所指出的數(shù)據(jù)相互交換。這組指令的后2條為半字節(jié)交換指令。其中XCHDA,@Ri是將累加器A中低4位與Ri中的內(nèi)容所指示的核內(nèi)RAM單元中的低4位數(shù)據(jù)相互交換,各自的高4位不變。3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令
例7A中內(nèi)容為FFH,R0中內(nèi)容為5BH,5BH中內(nèi)容為6DH,執(zhí)行指令XCHDA,@R0后,ACC中內(nèi)容變?yōu)镕DH,5BH中內(nèi)容變?yōu)?FH。
SWAPA指令是將累加器A的高低兩個(gè)半字節(jié)交換。例如:A=F0H,執(zhí)行指令SWAPA后,A=0FH。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
算術(shù)運(yùn)算類指令主要是對(duì)8位無符號(hào)數(shù)據(jù)進(jìn)行算術(shù)操作,其中包括加法、減法、加1、減1以及乘法和除法運(yùn)算指令;借助溢出標(biāo)志,可對(duì)有符號(hào)數(shù)進(jìn)行補(bǔ)碼運(yùn)算;借助進(jìn)位標(biāo)志,可進(jìn)行多字節(jié)加、減運(yùn)算;也可以對(duì)BCD碼進(jìn)行運(yùn)算。算術(shù)運(yùn)算指令都影響程序狀態(tài)標(biāo)志寄存器PSW的有關(guān)位。對(duì)這一類指令要特別注意正確地判斷結(jié)果對(duì)標(biāo)志位的影響。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
算術(shù)運(yùn)算類指令共有24條,下分類介紹。1.加法指令(4條)匯編指令格式:
ADDA,Rn;A+Rn—AADDA,direct;A+(direct)→AADDA,@Ri;A+(Ri)→AADDA,#data;A+data(→A3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
這組指令的功能是把源操作數(shù)所指出的內(nèi)容加到累加器A,其結(jié)果存在A中。
加法運(yùn)算指令執(zhí)行結(jié)果影響PSW的進(jìn)位位CY、溢出位OV、半進(jìn)位位AC和奇偶校驗(yàn)位P。在加法運(yùn)算中,如果位7有進(jìn)位,則進(jìn)位位CY置1,否則清0;如果位3有進(jìn)位,則半進(jìn)位位AC置1,否則清0。若看作兩個(gè)帶符號(hào)數(shù)相加,還要判斷溢出位OV,若OV為1,表示和數(shù)溢出。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
例8已知A=8CH,執(zhí)行指令A(yù)DDA,#85H,則操作結(jié)果如下。
A=11H,CY=1,OV=1,AC=1,P=0。若把8CH、85H看作無符號(hào)數(shù)相加,則結(jié)果為111H,在看作無符號(hào)數(shù)時(shí),不考慮OV位;若把上述兩值看作有符號(hào)數(shù),則有兩個(gè)負(fù)數(shù)相加得到正數(shù)的錯(cuò)誤結(jié)論,此時(shí)OV=1表示有溢出,指出了這一錯(cuò)誤。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
2.帶進(jìn)位加法指令(4條)
匯編指令格式:
ADDCA,Rn;A+Rn+CY→AADDCA,direct;A+(direct)+CY→AADDCA,@Ri;A+(Ri)+CY→AADDCA,#data;A+data+CY→A3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
這組指令的功能是把源操作數(shù)所指出的內(nèi)容和累加器內(nèi)容及進(jìn)位標(biāo)志CY相加,結(jié)果存放在A中。運(yùn)算結(jié)果對(duì)PSW各位的影響同上述加法指令。
帶進(jìn)位加法指令多用于多字節(jié)數(shù)的加法運(yùn)算,在低位字節(jié)相加時(shí)要考慮低字節(jié)有可能向高字節(jié)進(jìn)位。因此,在作多字節(jié)加法運(yùn)算時(shí),必須使用帶進(jìn)位的加法指令。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
例9已知A=8CH,R1=85H,CY=1,執(zhí)行指令A(yù)DDCA,R1,則操作結(jié)果如下:
A=12H,CY=1,OV=1,
AC=1,P=0。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
3.帶借位減法指令(4條)
匯編指令格式:
SUBBA,Rn;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri
;
A-(Ri)-CY→ASUBBA,#data;
A-data-CY→A3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
這組指令的功能是將累加器A中的數(shù)減去源操作數(shù)所指出的數(shù)和進(jìn)位位CY,其差值存放在累加器A中。注意:C8051F指令系統(tǒng)中沒有不帶借位的減法指令。減法運(yùn)算指令執(zhí)行結(jié)果影響PSW的進(jìn)位位CY、溢出位OV、半進(jìn)位位AC和奇偶位P。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
在多字節(jié)減法運(yùn)算中,被減數(shù)的低字節(jié)有時(shí)會(huì)向高字節(jié)產(chǎn)生借位(即CY置1),所以在多字節(jié)運(yùn)算中必須用帶借位減法指令。在進(jìn)行單字節(jié)減法或多字節(jié)的低8位字節(jié)減法運(yùn)算時(shí),應(yīng)先將程序狀態(tài)標(biāo)志寄存器PSW的進(jìn)位位CY清“0”。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
例10已知A=ACHR4=67HCY=1,執(zhí)行指令SUBBA,R4,則操作結(jié)果如下:
A=42H,CY=0,AC=1,OV=1。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
例10已知A=ACHR4=67HCY=1,執(zhí)行指令SUBBA,R4,則操作結(jié)果如下:
A=42H,CY=0,AC=1,OV=1。若看作是兩個(gè)無符號(hào)數(shù)相減,結(jié)果42H是正確的;若看作有符號(hào)數(shù)相減,則得出負(fù)數(shù)減正數(shù)結(jié)果是正數(shù)的錯(cuò)誤結(jié)論,OV=1,指出了這一錯(cuò)誤。
3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
4.乘法指令(1條)匯編指令格式:
MULAB;A×B→BA
功能是把累加器A和寄存器B中兩個(gè)無符號(hào)8位數(shù)相乘,所得16位積低字節(jié)存放在A中、高字節(jié)存放在B中。若乘積大于FFH,則OV置1,否則清0,CY總是為0。另外,此指令也影響奇偶標(biāo)志位。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
乘法運(yùn)算指令執(zhí)行結(jié)果影響PSW的溢出位OV、奇偶校驗(yàn)位P。例11已知A=ABH,B=47H,執(zhí)行指令MULAB,則操作如下所示:結(jié)果:
B=2FH,A=6DH,OV=1,P=1。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
5,除法指令(1條)
匯編指令格式:
DIVAB;A/B的商→A,余數(shù)→B
指令的功能是進(jìn)行A除以B的運(yùn)算,A和B的內(nèi)容均為8位無符號(hào)整數(shù)。指令執(zhí)行后,整數(shù)商存于A中,余數(shù)存于B中。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
指令執(zhí)行結(jié)果影響PSW的溢出位OV和奇偶校驗(yàn)位P。指令執(zhí)行后,標(biāo)志CY和OV均清為0,當(dāng)除數(shù)為0時(shí),A和B中的內(nèi)容為不確定值,此時(shí)OV標(biāo)志置1,說明除法溢出,A中的內(nèi)容影響奇偶校驗(yàn)位P。例12已知A=ADH,B=0CH,求A除B的結(jié)果。解:執(zhí)行指令DIVAB,得計(jì)算結(jié)果如下:
A=14(0EH),B=5,CY=0,OV=0,P=0。3.3指令系統(tǒng)
6.加1/減1指令(9條)
匯編指令格式:
INCA;A+→AINCRn;Rn+1→RnINCdirect;(direct)+1→(direct)INC@Ri;(Ri)+1→(Ri)INCDPTR;DPTR+1→DPTRDECA;A—1→ADECRn;Rn—1→RnDECdirect;(direct)—1→(direct)DEC@Ri;(Ri)—1→(Ri)3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
指令的功能是將操作數(shù)所指定單元的內(nèi)容加1/減1,加1、減1指令僅當(dāng)源操作數(shù)為A時(shí),對(duì)PSW的奇偶校驗(yàn)位P有影響,其余指令操作均不影響PSW。例13已知DPTR=20FFH,執(zhí)行指令I(lǐng)NCDPTR。結(jié)果:DPTR=2100H。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
7.十進(jìn)制調(diào)整指令(1條)
匯編指令格式:
DAA
指令是在進(jìn)行BCD碼加法運(yùn)算時(shí),跟在ADD和ADDC指令之后,用來對(duì)壓縮BCD碼的加法運(yùn)算結(jié)果自動(dòng)進(jìn)行修正,使其仍為BCD碼表達(dá)形式。3.3指令系統(tǒng)3.3.2算術(shù)運(yùn)算類指令
在計(jì)算機(jī)中,遇到十進(jìn)制調(diào)整指令時(shí),中間結(jié)果的修正是由ALU硬件中的十進(jìn)制修正電路自動(dòng)進(jìn)行的。用戶不必考慮何時(shí)該加“6”,使用時(shí)只需在上述加法指令后面緊跟一條DAA指令即可。注意:DAA不對(duì)減法指令的結(jié)果進(jìn)行修正。3.3指令系統(tǒng)3.3.3邏輯操作類指令
這一類指令主要是用于對(duì)兩個(gè)操作數(shù)按位進(jìn)行“與”、“或”、“異或”邏輯操作,操作結(jié)果送到A累加器或直接尋址單元。移位、取反、清除等操作也包括在這一類指令中。這些指令執(zhí)行時(shí)一般不影響程序狀態(tài)字寄存器PSW,僅當(dāng)目的操作數(shù)為ACC時(shí),對(duì)奇偶標(biāo)志位有影響。3.3指令系統(tǒng)3.3.3邏輯操作類指令
邏輯運(yùn)算類指令共24條,下面分類介紹。
1.邏輯與指令(6條)
匯編指令格式:
ANLA,Rn;A·Rn→AANLA,direct;A·(direct)→AANLA,@Ri;A·(Ri)→AANLA,#data;A·data→AANLdirect,A;(direct)·A→(direct)
ANLdirect,#data;(direct)·data→(direct)3.3指令系統(tǒng)3.3.3邏輯操作類指令
這組指令的功能是將兩個(gè)指定的操作數(shù)按位邏輯與,結(jié)果存到目的操作數(shù)中。前4條指令是將累加器A的內(nèi)容和操作數(shù)的內(nèi)容按位邏輯與,結(jié)果存放在A中。指令執(zhí)行結(jié)果影響奇偶標(biāo)志位P。
例14已知A=8FH,(60H)=96H,執(zhí)行指令A(yù)NLA,60H,則操作結(jié)果為:
A=86H,(60H)=96H,P=1。3.3指令系統(tǒng)3.3.3邏輯操作類指令
2.邏輯或指令(6條)
匯編指令格式:
ORLA,Rn;A+Rn→AORLA,direct;A+(direct)→AORLA,@Ri;A+(Ri)→AORLA,#data;A+data→AORLdirect,A;(direct)+A→(direct)ORLdirect,#data;(direct)+data→(direct)3.3指令系統(tǒng)3.3.3邏輯操作類指令
這組指令的功能是將兩個(gè)指定的操作數(shù)按位邏輯或,結(jié)果存到目的操作數(shù)中。執(zhí)行后對(duì)奇偶標(biāo)志位P及I/O端口的影響與上述“與”指令相同。3.3指令系統(tǒng)3.3.3邏輯操作類指令例15將累加器A中低4位的狀態(tài),通過P1口的高4位輸出。解:編程如下:
ANLA,#0FH;屏蔽A.7~A.4SWAPA;高、低半字節(jié)交換
ANLP1,#0FH;清P1端口高4位
ORLP1,A;使P1.7~P1.4按A中初始值的
;A.3~A.0值置位本例中交換高、低半字節(jié)的功能也可用4條RLA指令實(shí)現(xiàn)。3.3指令系統(tǒng)3.3.3邏輯操作類指令
3.邏輯異或指令(6條)
匯編指令格式:
XRLA,Rn;ARn→AXRLA,direct;A(direct)→AXRLA,@Ri;A(Ri)→AXRLA,#data;Adara→AXRLdirect,A;(direct)A→(direct)
XRLdirect,#data;(direct)data→(direct)3.3指令系統(tǒng)3.3.3邏輯操作類指令
這組指令的功能是將兩個(gè)指定的操作數(shù)按位異或,結(jié)果存到目的操作數(shù)中。執(zhí)行后對(duì)奇偶標(biāo)志位P及I/O端口的影響與上述“與”指令相同。例16已知A=87H,(65H)=A7H,執(zhí)行指令XRL65H,A;則操作結(jié)果如下:
A=87H,(65H)=20H,P=1。3.3指令系統(tǒng)3.3.3邏輯操作類指令
4.循環(huán)移位指令(4條)
匯編指令格式:
RLARRARLCARRCA3.3指令系統(tǒng)3.3.3邏輯操作類指令循環(huán)移位指令執(zhí)行示意圖
3.3指令系統(tǒng)3.3.3邏輯操作類指令
RLA和RRA指令分別稱為循環(huán)左移和循環(huán)右移指令。功能分別是將累加器A的內(nèi)容循環(huán)左移或右移1位,執(zhí)行后不影響PSW中各位。
RLCA和RRCA指令分別稱為帶進(jìn)位循環(huán)左移指令和帶進(jìn)位循環(huán)右移指令。這兩條指令的功能分別是將累加器A的內(nèi)容與進(jìn)位位CY一起循環(huán)左移或右移1位,執(zhí)行后影響PSW中的進(jìn)位位CY和奇偶狀態(tài)標(biāo)志位P。3.3指令系統(tǒng)3.3.3邏輯操作類指令
例17A=EBH,CY=1,執(zhí)行指令RLCA。結(jié)果:A=D7H,CY=1,P=05.取反指令(1條)匯編指令格式:
CPLA;
功能是將累加器A的內(nèi)容按位取反。3.3指令系統(tǒng)3.3.3邏輯操作類指令
6.清0指令(1條)
匯編指令格式:
CLRA;0→A
本指令功能是將累加器A的內(nèi)容清0。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
這一類指令的功能主要是控制程序從原順序執(zhí)行地址轉(zhuǎn)移到其他指令地址上。計(jì)算機(jī)在運(yùn)行過程中,有時(shí)因?yàn)槿蝿?wù)要求,需要改變程序運(yùn)行方向;或者需要調(diào)用子程序;或者需要從子程序中返回,此時(shí)都需要改變程序計(jì)數(shù)器PC中的內(nèi)容,控制轉(zhuǎn)移類指令就可實(shí)現(xiàn)這一要求。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
控制程序轉(zhuǎn)移類指令包括無條件轉(zhuǎn)移和條件轉(zhuǎn)移,絕對(duì)轉(zhuǎn)移和相對(duì)轉(zhuǎn)移,長(zhǎng)轉(zhuǎn)移和短轉(zhuǎn)移,還有調(diào)用指令和返回指令等。這類指令多數(shù)不影響程序狀態(tài)標(biāo)志寄存器。指令系統(tǒng)中有17條(不包括位操作類的4條轉(zhuǎn)移指令)控制程序轉(zhuǎn)移類指令。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
1.無條件轉(zhuǎn)移指令(4條)
匯編指令格式:
LJMPaddr16;addr16→PCAJMPaddr11;PC+2→PC,addr11→PC.10~PC.0SJMPrel;PC+2+rel→PCJMP@A+DPTR;A+DPTR→PC3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
LJMPaddr16長(zhǎng)轉(zhuǎn)移指令。該指令中包含16位地址,所以轉(zhuǎn)移的目標(biāo)地址范圍是程序存儲(chǔ)器的0000H~FFFFH。指令執(zhí)行結(jié)果是將16位地址addr16送程序計(jì)數(shù)器PC。例18執(zhí)行如下指令:
0023HLJMP2400H
執(zhí)行后PC值由0026H變?yōu)?400H。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
AJMPaddr11絕對(duì)(或短)轉(zhuǎn)移指令。該指令中包含要改變的低11位地址,轉(zhuǎn)移的目標(biāo)地址是在下一條指令地址開始的2KB范圍內(nèi)。它把PC的高5位與操作碼的第7位~第5位(A10~A8)及操作數(shù)的8位并在一起,構(gòu)成16位的轉(zhuǎn)移地址。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
因?yàn)榈刂犯?位保持不變,為原PC的高5位,僅低11位發(fā)生變化,因此尋址范圍必須在該指令地址加2后的2KB區(qū)域內(nèi)。
例19執(zhí)行如下指令:
1300HAJMP1600H
執(zhí)行后PC值由1302H變?yōu)?600H。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
SJMPre1無條件相對(duì)轉(zhuǎn)移指令。該指令為雙字節(jié),指令的操作數(shù)是相對(duì)地址,rel是一個(gè)帶符號(hào)的偏移字節(jié)數(shù)(補(bǔ)碼),其范圍為-128~+127。負(fù)數(shù)表示向后轉(zhuǎn)移,正數(shù)表示向前轉(zhuǎn)移,該指令執(zhí)行后目的地址值如下式計(jì)算:
目的地址值=本指令地址值+2+re1。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
在用匯編語言編寫程序時(shí),可以用一個(gè)標(biāo)號(hào)表示轉(zhuǎn)移目標(biāo)地址的偏移量re1,此時(shí)匯編程序可以自動(dòng)計(jì)算出偏移地址,避免了人工匯編的麻煩且不容易出錯(cuò)。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
JMP@A+DPTR無條件間接轉(zhuǎn)移指令。
該指令轉(zhuǎn)移地址由數(shù)據(jù)指針DPTR的16位數(shù)和累加器A的8位無符號(hào)數(shù)相加形成,并直接送入PC。指令執(zhí)行過程對(duì)DPTR、A和標(biāo)志位均無影響。這條指令可代替眾多的判別跳轉(zhuǎn)指令,具有散轉(zhuǎn)功能(又稱散轉(zhuǎn)指令)。在實(shí)際編程中不必寫出具體的轉(zhuǎn)移目的地址,通常只需要給出地址標(biāo)號(hào)即可。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
2.條件轉(zhuǎn)移指令(8條)
匯編指令格式:
JZrel;A=0:PC+2+re1→PC;A≠0:PC+2→PCJNZrel;A≠0:PC+2+re1→PC;A=0:PC+2→PCCJNEA,direct,rel;A=(direct):PC+3→PC,0→C;A>(direct):PC+3+rel→PC,0→C;A<(direct):PC+3+rel→PC,1→C3.3指令系統(tǒng)
CJNEA,#data,rel;A=data:PC+3→PC,0→C;A>data:PC+3+rel→PC,0→C;A<data:PC+3+rel→PC,1→CCJNERn,#data,rel;Rn=data:PC+3→PC,0→C;Rn>data:PC+3+rel→PC,0→C;Rn<data:PC+3+rel→PC,1→CCJNE@Ri,#data,rel;(Ri)=data:PC+3→PC,0→C;(Ri)>data:PC+3+rel→PC,0→C;(Ri)<data:PC+3+rel→PC,1→CDJNZRn,rel;Rn-1→Rn,Rn≠0:PC+2+rel→PC
Rn=0:PC+2→PC3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
DJNZdirect,rel;(direct)-1→(direct),
;(direct)≠0:PC+3+rel→PC;(direct)=0:PC+3→PC
這一類指令都是以相對(duì)轉(zhuǎn)移的方式轉(zhuǎn)向目標(biāo)地址的。它們的共同特點(diǎn)是轉(zhuǎn)移前要先測(cè)試某一條件是否滿足,只有滿足規(guī)定條件時(shí),程序才能轉(zhuǎn)到指定轉(zhuǎn)移地址,否則程序?qū)⒗^續(xù)執(zhí)行下一條指令。條件是由條件轉(zhuǎn)移指令本身提供的。3.3指令系統(tǒng)例20將累加器A的內(nèi)容由零遞增,加到50,結(jié)果存在累加器A中。解:根據(jù)題意可編程如下:地址機(jī)器碼源程序
200E4CLRA;0→A201755032MOV50H,#50;50→(50H)20404L1:INCA;A+1→A205D550FCDJNZ50H,L1;(50H)-1→(50H),
;(50H)≠0:PC+3-4→PC;(50H)=0:PC+3→PC
標(biāo)號(hào)11在此代表偏移量,應(yīng)該為-4,用補(bǔ)碼表示為FCH,當(dāng)用標(biāo)號(hào)表示后就不用換算為補(bǔ)碼了。3.3指令系統(tǒng)
3.調(diào)用子程序及返回指令(4條)
匯編指令格式:
LCALLaddr16;PC+3→PC,SP+1→SP,
;PCL→(SP),SP+1→SP,
;PCH→(SP),addr16→PCACALLaddr11;PC+2→PC,SP+1→SP,
;PCL→(SP),SP+1→SP,
;PCH→(SP),;addr11→PC.10~PC.03.3指令系統(tǒng)
3.調(diào)用子程序及返回指令(4條)
匯編指令格式:
RET;(SP)→PCH,SP—1→SP,
;(SP)→PCL,SP—1→SPRETI;除具有RET指令的功能外,還將清
;除內(nèi)部相應(yīng)的中斷狀態(tài)觸發(fā)器3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
這組指令用于實(shí)現(xiàn)從主程序中調(diào)用子程序和從子程序中返回到主程序的功能。調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過程。此類指令不影響標(biāo)志位。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
LCALLaddr16稱為長(zhǎng)調(diào)用指令(三字節(jié))。執(zhí)行時(shí),先將PC加3,指向下條指令地址(即斷點(diǎn)地址),然后將斷點(diǎn)地址壓入堆棧,先把PC的低8位PCL壓入堆棧,再壓入PC的高8位PCH,然后把指令中的16位子程序入口地址裝入PC,程序轉(zhuǎn)到子程序。子程序入口地址可以設(shè)在64KB的空間中。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
ACALLaddr11稱為絕對(duì)(也稱短)調(diào)用指令(雙字節(jié)),其保護(hù)斷點(diǎn)地址過程同上,但PC只需加2,其轉(zhuǎn)入子程序入口的過程類同“LCALL”指令。被調(diào)用的子程序入口地址必須與調(diào)用指令A(yù)CALL下一條指令的第1個(gè)字節(jié)在相同的2KB存儲(chǔ)區(qū)之內(nèi)。其操作碼的形成類同于“AJMP"指令。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
RET指令是子程序返回指令。執(zhí)行時(shí)將堆棧內(nèi)的斷點(diǎn)地址彈出送入PC,使程序返回到原斷點(diǎn)地址。
RETI指令是實(shí)現(xiàn)從中斷子程序返回的指令,它只能用于中斷服務(wù)程序做結(jié)束指令。RET與RETI決不能互換使用。3.3指令系統(tǒng)例21已知調(diào)用指令LCALLSUB1的地址為42H,子程序SUB1入口地址是20BH,說明該段程序調(diào)用過程中PC及SP的變化:地址指令注釋
40MOVSP,#30H;設(shè)置堆棧指針,30H→SP42LCALLSUB1;調(diào)用子程序,45H→PC,31H→SP,
;45H→(31H),32H→SP,
;00H→(32H),20BH→PC20BSUB1:MOVA,R0212RET;(32H)一PCH,(31H)-PCL
執(zhí)行結(jié)果:此時(shí)PC=0045H,SP=30H。3.3指令系統(tǒng)3.3.4控制轉(zhuǎn)移類指令
4,空操作指令(1條)
匯編指令格式:
NOPNOP是一條單字節(jié)指令,控制CPU不進(jìn)行任何操作而轉(zhuǎn)到下一條指令。常用于產(chǎn)生一個(gè)時(shí)鐘周期的延遲。如果反復(fù)執(zhí)行這一指令,則單片機(jī)處于踏步等待狀態(tài)。3.3指令系統(tǒng)3.3.5位操作類指令
在C8051F的硬件結(jié)構(gòu)中,有個(gè)位處理機(jī),具有豐富的位處理功能。處理位變量的指令包括位變量傳送、位邏輯運(yùn)算、位條件轉(zhuǎn)移等指令。單片機(jī)的內(nèi)部數(shù)據(jù)存儲(chǔ)器中,20H~2FH為位操作區(qū)域,每一位都有自己的位地址,可以對(duì)其每一位進(jìn)行操作。位地址空間為00H~7FH,共128(16X8)位。另外,對(duì)于字節(jié)地址能被8整除的特殊功能寄存器的每一位,也具有可尋址的位地址。3.3指令系統(tǒng)3.3.5位操作類指令
在進(jìn)行位操作時(shí),進(jìn)位標(biāo)志CY作為位累加器C。位地址的表達(dá)方式有如下幾種:
(1)直接(位)地址方式:如RAM位尋址區(qū)的0H~7FH中任意1位,SFR寄存器中的部分寄存器可以直接位尋址,例如,PSW寄存器中的CY位可以用D7H表示等。3.3指令系統(tǒng)3.3.5位操作類指令
(2)點(diǎn)操作符方式:在字節(jié)地址和位數(shù)之間用“.”隔開,如PSW.3,(B8H).4等;
(3)位名稱方式:如RS0、P、OV等;
(4)用戶定義名方式:用偽指令bit定義任意位。如:SUGbitP1.0。經(jīng)定義后,允許指令中用SUG代替P1.0。3.3指令系統(tǒng)3.3.5位操作類指令
位操作類指令共17條,下面分類介紹。
1.位數(shù)據(jù)傳送指令(2條)
匯編指令格式:
MOVC,bit;bit→CMOVbit,C;C→bit
主要用于對(duì)位操作累加器C進(jìn)行數(shù)據(jù)傳送,均為雙字節(jié)指令。3.3指令系統(tǒng)3.3.5位操作類指令
例22已知核內(nèi)RAM(25H)=83H=10000011B,把25H的第4位傳送入C中。編寫指令如下:
MOVC,(25H).4;(25H).4→C
結(jié)果:C=0。3.3指令系統(tǒng)3.3.5位操作類指令
例23把P2.4狀態(tài)傳送到P1.5。按題意編寫指令如下:
MOVC,P2.4;P2.4→CMOVP1.5,C;C→P1.53.3指令系統(tǒng)3.3.5位操作類指令
2.位修正指令(6條)
匯編指令格式:
CLRC;0→CCLRbit;0→bitCPLC;/C→CCPLbit;/bit→bitSETBC;1→CSETBbit;1→bit3.3指令系統(tǒng)3.3.5位操作類指令
這類指令的功能分別是對(duì)進(jìn)位標(biāo)志C或直接尋址位進(jìn)行清除、取反、置位操作,執(zhí)行結(jié)果不影響其他標(biāo)志。當(dāng)直接位地址為端口中某一位時(shí),具有“讀—改—寫”功能。3.3指令系統(tǒng)
3.位邏輯運(yùn)算指令(4條)
匯編指令格式:
ANLC,bit;C·bit→CANLC,/bit;C·/bit→CORLC,bit;C+bit→CORLC,/bit;C+/bit→C
這組指令的功能是把進(jìn)位C的內(nèi)容和直接位地址的內(nèi)容邏輯與/或后的操作結(jié)果送回到C中。斜杠“/”表示對(duì)該位取反后再參與運(yùn)算,但不改變?cè)瓉淼臄?shù)值。3.3指令系統(tǒng)4.判位轉(zhuǎn)移指令(1條)
匯編指令格式:
JCrel;C=1:PC+2+rel→PC;C=0:PC+2→PCJNCrel;C=0:PC+2+rel→PC;C=1:PC+2→PCJBbit,rel;bit=1:PC+3+rcl→PC;bit=0:PC+3→PCJNBbit,rel;bit=0:PC+3+rel→PC;bit=1:PC+3→PCJBCbit,rel;bit=1:PC+3+rel→PC,0→bit;bit=0:PC+3→PC3.3指令系統(tǒng)3.3.5位操作類指令
這組指令的功能是分別判進(jìn)位C或直接尋址位是“1”還是“0”,條件符合則轉(zhuǎn)移,否則繼續(xù)執(zhí)行程序。前兩條指令是雙字節(jié),PC要加2,后3條指令是三字節(jié),PC要加3,其中最后1條指令的功能是:若直接尋址位為“1”則轉(zhuǎn)移,并同時(shí)將該位清0;否則順序執(zhí)行。這類指令也具有“讀—改—寫”功能。3.3指令系統(tǒng)例24在核內(nèi)RAM30H、40H單元中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 非拉國家的獨(dú)立和振興課件 華東師大版
- 旅行團(tuán)自愿不買擺渡車的協(xié)議書
- 創(chuàng)意目錄篇課件
- 《跟腱斷裂護(hù)理查房》課件
- 電機(jī)與電力拖動(dòng)課件-第6章
- 2024年度版權(quán)維權(quán)合同范本2篇
- 2025年貴州貨運(yùn)從業(yè)資格考試試題及答案大全解析
- 2024年度水穩(wěn)材料采購與知識(shí)產(chǎn)權(quán)保護(hù)合同3篇
- 2025年阿壩道路運(yùn)輸從業(yè)人員資格考試內(nèi)容有哪些
- 《工作流程集合》課件
- 【建設(shè)項(xiàng)目施工現(xiàn)場(chǎng)安全管理問題及對(duì)策研究(任務(wù)書+開題報(bào)告+論文)16000字】
- 小班美術(shù)雪花飄飄
- 2023-2024學(xué)年廣東省深圳市六上數(shù)學(xué)期末統(tǒng)考試題含答案
- 微信支付交易明細(xì)證明賬單文件修改
- 螺栓知識(shí)培訓(xùn)課件
- 餐飲企業(yè)日管控、周排查、月調(diào)度表格模板
- 創(chuàng)業(yè)前的準(zhǔn)備
- 酒店布草收發(fā)規(guī)范
- 變換句式和仿寫
- 電力安全工作規(guī)程(變電部分)課件
- 旅游學(xué)概論說課比賽公開課一等獎(jiǎng)市優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論