MCS-51單片微型計(jì)算機(jī)及其應(yīng)用:第3章指令_第1頁
MCS-51單片微型計(jì)算機(jī)及其應(yīng)用:第3章指令_第2頁
MCS-51單片微型計(jì)算機(jī)及其應(yīng)用:第3章指令_第3頁
MCS-51單片微型計(jì)算機(jī)及其應(yīng)用:第3章指令_第4頁
MCS-51單片微型計(jì)算機(jī)及其應(yīng)用:第3章指令_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、MCS-51單片微型計(jì)算機(jī)及其應(yīng)用 王澄非seuwangchengfei第3章 MCS-51單片機(jī)指令系統(tǒng) 3.1 MCS-51指令系統(tǒng)概述 3.2 尋址方式 3.3 數(shù)據(jù)傳送類指令 3.4 算術(shù)運(yùn)算類指令 3.5邏輯運(yùn)算及移位指令 3.6控制轉(zhuǎn)移類指令 3.7子程序調(diào)用及返回指令 3.8 位操作類指令3.1 MCS-51單片機(jī)指令系統(tǒng)概述3.1.1 指令、指令系統(tǒng)的概念指令:是使計(jì)算機(jī)內(nèi)部執(zhí)行的一種操作,提供給用戶編程使用的 一種命令。機(jī)器語言:以二進(jìn)制代碼來描述指令功能的語言。匯編語言:給每條機(jī)器語言指令賦予助記符號(hào)來表示,這就形成 了匯編語言。是一種指令形式指令

2、系統(tǒng):計(jì)算機(jī)能夠執(zhí)行的全部操作所對(duì)應(yīng)的指令集合。 指令一般有功能、時(shí)間和空間三種屬性。功能屬性:是指每條指令都對(duì)應(yīng)一個(gè)特定的操作功能;時(shí)間屬性:是指一條指令執(zhí)行所用的時(shí)間,一般用機(jī)器周期來 表示;空間屬性:是指一條指令在程序存儲(chǔ)器中存儲(chǔ)所占用的字節(jié)數(shù)指令的描述形式有兩種:機(jī)器語言形式和匯編語言形式采用機(jī)器語言編寫的程序稱之為目標(biāo)程序采用匯編語言編寫的程序稱之為源程序 匯編匯編語言程序 機(jī)器語言程序 3.1.2 MCS-51單片機(jī)指令系統(tǒng)及其指令格式MCS-51單片機(jī)指令系統(tǒng)共有111條指令。單機(jī)器周期指令雙機(jī)器周期指令4個(gè)機(jī)器周期指令(只有乘、除法)單字節(jié)指令雙字節(jié)指令三節(jié)指令B 空間數(shù)據(jù)傳送

3、、算術(shù)操作、邏輯操作、程序轉(zhuǎn)移、子程序調(diào)用及返回位操作A 功能C 時(shí)間每條指令通常由操作碼和操作數(shù)兩部分組成匯編語言指令有如下的格式: 標(biāo)號(hào): 操作碼助記符 目的操作數(shù),源操作數(shù) ;注釋操作碼:由助記符表示的字符串,它規(guī)定了指令的操作功能操作數(shù):參加操作的數(shù)據(jù)或數(shù)據(jù)的地址注釋:為該條指令作的說明,以便于閱讀 為便于后面的學(xué)習(xí),在這里先對(duì)描述指令的一些符號(hào)的約定意義作以說明: (1) Ri和Rn:表示當(dāng)前工作寄存器區(qū)中的工作寄存器,i取0或1,表示R0或R1。n取07,表示R0R7。 (2) #data:表示包含在指令中的8位立即數(shù)。 (3) #data16:表示包含在指令中的16位立即數(shù)。 (

4、4) rel:以補(bǔ)碼形式表示的8位相對(duì)偏移量, 范圍為-128127,主要用在相對(duì)尋址的指令中。 (5) addr16和addr11:分別表示16位直接地址和11位直接地址。 (6) direct:表示直接尋址的地址。 (7) bit:表示可位尋址的直接位地址。 (8) (X):表示X單元中的內(nèi)容。 (9) (X):表示以X單元的內(nèi)容為地址的存儲(chǔ)器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用(X)表示。 (10) / 和符號(hào):“/”表示對(duì)該位操作數(shù)取反,但不影響該位的原值?!啊北硎静僮髁鞒?,將箭尾一方的內(nèi)容送入箭頭所指另一方的單元中去。 3.2 尋 址 方 式3.2.1 立即尋址 操作數(shù)直接出

5、現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找,故稱為立即尋址。匯編指令中,在一個(gè)數(shù)的前面冠以#符號(hào)作前綴,就表示該數(shù)為立即尋址。 例如:MOVA,#30H3.2.2 寄存器尋址 在指令選定的某寄存器中存放或讀取操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址。 例如:MOVA,R0 3.2.3 寄存器間接尋址 由指令指出某一寄存器的內(nèi)容作為操作數(shù)地址的尋址方法,稱為寄存器間接尋址。這里需要強(qiáng)調(diào)的是:寄存器中的內(nèi)容不是操作數(shù)本身,而是操作數(shù)的地址,到該地址單元中才能得到操作數(shù)。寄存器起地址指針的作用。 例如:MOV A,

6、R1圖3.1 寄存器間接尋址示意圖 3.2.4 直接尋址 指令中直接給出操作數(shù)所在的存儲(chǔ)器地址,以供取數(shù)或存數(shù)的尋址方式稱為直接尋址。 例如:MOV A,40H3.2.5 變址尋址基址寄存器加變址寄存器間接尋址,簡稱變址尋址。它是以數(shù)據(jù)指針寄存器DPTR或PC作為基址寄存器,累加器A作為變址寄存器,兩者的內(nèi)容相加的和作為程序存儲(chǔ)器地址,再尋址該單元,讀取數(shù)據(jù)。這種尋址方式常用于訪問程序存儲(chǔ)器中的常數(shù)表。MOVCA,A+DPTR 圖3.2 變址尋址示意圖 3.2.6 相對(duì)尋址 相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器PC值加上指令中給出的偏移量rel,而構(gòu)成實(shí)際操作數(shù)地址的尋址方法。它用于訪問程序存儲(chǔ)器,常出

7、現(xiàn)在相對(duì)轉(zhuǎn)移指令中。 在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn): (1) 當(dāng)前PC值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該指令的字節(jié)數(shù)。例如:JZ rel 是一條累加器A為零就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲(chǔ)地址為2050H,則執(zhí)行該指令時(shí)的當(dāng)前PC值即為2052H。即當(dāng)前PC值是對(duì)相對(duì)轉(zhuǎn)移指令取指結(jié)束時(shí)的值。 (2) 偏移量rel是有符號(hào)的單字節(jié)數(shù)。以補(bǔ)碼表示,其值的范圍是-128+127(00HFFH),負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。所以,相對(duì)轉(zhuǎn)移指令滿足條件后,轉(zhuǎn)移的地址(目的地址)為: 目的地址=當(dāng)前PC值+rel = 指令存儲(chǔ)地址+指令字節(jié)數(shù)+rel010000000111

8、01011000H1001H1002H1077H+1PCALURel=75HPC=1002H1077H程序存儲(chǔ)器例:C=1,PC=1000H,REL=75H,執(zhí)行指令JC REL3.2.7 位尋址 位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對(duì)片內(nèi)RAM中的128位和特殊功能寄存器SFR中的93位進(jìn)行尋址。3.3 29條數(shù)據(jù)傳送類指令 3.3.1 訪問片內(nèi)數(shù)據(jù)存儲(chǔ)器的一般數(shù)據(jù)傳送指令 該類指令的功能是實(shí)現(xiàn)數(shù)在片內(nèi)RAM單元之間、寄存器之間、寄存器與RAM單元之間的傳送。所有指令具有統(tǒng)一的格式,其格式如下: MOV ,; MOV是操作碼助記符 功能:目的操作數(shù)單元源操作數(shù)(或單元)操作數(shù)單

9、元內(nèi)容不變。圖3.3 訪問片內(nèi)RAM的一般傳送指令操作關(guān)系圖 1、四條以累加器A為目的操作數(shù)的指令MOV A, Rn; A - RnMOV A, direct; A - RnMOV A, Ri ; A - RiMOV A, #data ; A - data Ri為R0、R1。2、三條以寄存器Rn為目的操作數(shù)的指令MOV Rn, A; Rn - AMOV Rn, direct; Rn - directMOV Rn, #data; Rn - dataRn為R0R7例:A=5BH,R1=10H,R2=20H,R3=30H,(30H)=4FHMOV R1,AMOV R2,30HMOV R3,#83H執(zhí)

10、行后:R1,R2,R3為多少?3、五條以直接地址(內(nèi)部數(shù)據(jù)存貯器00H7FH及 80HFFH)為目的操作數(shù)的指令MOV direct, A; (direct) - AMOV direct, Rn; (direct) - -RnMOV direct, direct; (direct) - (direct)MOV direct, Ri; (direct) - (Ri)MOV direct, #data; (direct) - data例:R0=60H,片內(nèi)存儲(chǔ)單元(60H)=50H MOV 40H,R0;執(zhí)行后:40H=?4、三條以間接地址為目的操作數(shù)的指令MOV Ri, A ; (Ri) - A

11、MOV Ri, direct; (Ri) - directMOV Ri, #data ; (Ri) - data 間接地址指向內(nèi)部數(shù)據(jù)存貯器地址00H7FH及80HFFH地址。Ri:為R0或R1 5、一條16位數(shù)據(jù)傳送類指令MOV DPTR, #data16; DPH - dataH, DPL 9或(AC)=1,則(A)30(A)30+06H若(A)749或(CY)=1,則(A)74(A)74+60HDA A ; 若AC=1,CY=1同時(shí)發(fā)生,或者高4位雖等于9但低4位修正后有進(jìn)位,則A應(yīng)加66H修正。 這條指令是在進(jìn)行BCD碼(十進(jìn)制)加法運(yùn)算時(shí),跟在ADD和ADDC指令后,對(duì)BCD碼加法運(yùn)

12、算結(jié)果自動(dòng)進(jìn)行修正。 在計(jì)算機(jī)中,在遇到十進(jìn)制調(diào)整指令時(shí),中間結(jié)果的修正是由ALU硬件中的十進(jìn)制修正電路自動(dòng)進(jìn)行的。用戶不必考慮何時(shí)該加“6”,使用時(shí)只需要在上述加法指令后面緊跟一條DA A指令即可。DA A指令不適用于減法指令。 例:累加器A中BCD碼數(shù)是5,立即數(shù)為8,執(zhí)行加法指令A(yù)DD A,#08,在CPU中是按照二進(jìn)制加法進(jìn)行的,結(jié)果為1101,BCD碼無此值,加6調(diào)整后,可得正確的結(jié)果,13 例 對(duì)BCD碼加法65 + 58DBH,進(jìn)行十進(jìn)制調(diào)整。 參考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十進(jìn)制調(diào)整3.4.3 乘、除法指令

13、MUL AB;(B)(A)(B)158(A)(A)(B)70CY0機(jī)器碼:A4H 乘法指令的功能是把累加器A和寄存器B中的兩個(gè)8位無符號(hào)數(shù)相乘,將乘積16位數(shù)中的低8位存放在A中,高8位存放在B中。若乘積大于FFH(255),則溢出標(biāo)志OV置1,否則OV清零。乘法指令執(zhí)行后進(jìn)位標(biāo)志CY總是零,即CY=0。2除法指令DIV AB;(A)(A)(B)之商,(B)(A)(B)之余數(shù)(CY)0,(OV)0機(jī)器碼:84H 除法指令的功能是把累加器A中的8位無符號(hào)整數(shù)除以寄存器B中的8位無符號(hào)整數(shù),所得商存于累加器A中,余數(shù)存于寄存器B中,進(jìn)位標(biāo)志位CY和溢出標(biāo)志位OV均被清零。若B中的內(nèi)容為0時(shí),溢出標(biāo)

14、志OV被置1,即OV=1,而CY仍為0。例:試編寫計(jì)算1234H+0FE7H的程序,將和的高8位存入41H, 低8位存入40H單元。 先計(jì)算低8位,后計(jì)算高8位,計(jì)算高8位時(shí)需要考慮進(jìn)位位。MOV A,#34HADD A,#0E7HMOV 40H,AMOV A,#12HADDC A,#0FHMOV 41H,A例:把上例中的加法改為減法,其它要求相同CLR CMOV A,#34HSUBB A,#0E7HMOV 40H,AMOV A,#12HSUBB A,#0FHMOV 41H,A例:試編寫計(jì)算17H*68H的程序,將乘積的高8位存入31H,低8位存入30H單元。MOV A,#17HMOV B,#

15、68HMUL ABMOV 30H,AMOV 31H,B3.5 邏輯運(yùn)算及移位指令圖3.5 邏輯指令形式結(jié)構(gòu)圖 與加、減法指令尋址方式相同的邏輯指令;(b) 與加、減法指令尋址方式不同的邏輯指令 這一類指令主要用于對(duì)2個(gè)操作數(shù)按位進(jìn)行邏輯操作,操作結(jié)果送到A累加器或直接尋址單元,這一類指令所能執(zhí)行的操作主要有“與”、“或”、“異或”以及移位、取反、清除等。這些指令一般不影響程序狀態(tài)字寄存器PSW,僅當(dāng)目的操作數(shù)為ACC時(shí)對(duì)奇偶標(biāo)志位有影響。1、 六條邏輯與指令A(yù)NL A,Rn; A - ARnANL A, direct; A - A(direct)ANL A, Ri; A - A(Ri)ANL

16、A, #data; A - AdataANL direct, A; (direct) (direct)AANL direct, #data; (direct) (direct)data “與邏輯”:全1為1,有0為0。例:已經(jīng)A=8FH,(40H)=96H,執(zhí)行指令A(yù)NL A,40H,則操作如下:10001111()10010110_10000110結(jié)果:A=86H,(40H)=96H,P=1 2、六條邏輯或指令ORL A,Rn; A - ARnORL A, direct; A- A(direct)ORL A, Ri; A - A(Ri)ORL A, #data; A - AdataORL d

17、irect, A; (direct) - (direct)AORL direct, data; (direct) - (direct)data“或邏輯”:有1為1,全0為0。 例:已經(jīng)A=1AH,R0=45H,(45H)=39H,執(zhí)行指令ORL A,R0,則操作如下:00011010()00111001_00111011結(jié)果:A=3BH,R0=45H,(45H)=39H,P=13、 六條邏輯異或指令XRL A, Rn; A - ARnXRL A, direct; A - A(direct)XRL A, Ri ; A - A(Ri)XRL A, #data; A - AdataXRL direc

18、t, A; (direct) - (direct)AXRL direct, #data; (direct) - (direct)data“異或邏輯”:相同為0,不同為1。例:已經(jīng)A=87H,(32H)=77H,執(zhí)行指令XRL 32H,A,則操作如下:10000111)01110111-11110000結(jié)果:A=87H,(32H)=0F0H,P=0 4、四條循環(huán)移位指令RL A; A循環(huán)左移RR A; A循環(huán)右移RLC A; A帶進(jìn)位位的循環(huán)左移RRC A; A帶進(jìn)位位的循環(huán)右移前兩條指令執(zhí)行后不影響PSW中的各位;后兩條指令執(zhí)行后影響PSW中的進(jìn)位位CY和奇偶狀態(tài)標(biāo)志位。 A.7 A.0A.7

19、 A.0A.7 A.0CYA.7 A.0CYRL ARR ARLC ARRC A例:已知A=7AH,CY=1,執(zhí)行指令RLC A結(jié)果:A=0F5H,CY=0,P=05、一條取反指令CPL A; A - (/A)功能:將累加器A的內(nèi)容按位邏輯取反。 6、一條清零指令CLR A; A - 0例:把累加器A中數(shù)據(jù)的低4位送入外部數(shù)據(jù)存儲(chǔ)器的3000H單元。MOV DPTR,#3000HANL A,#0FHMOVX DPTR,A 例:將累加器A中低4位的狀態(tài),通過P1口的高4位輸出。ANL A,#0FHSWAP AANL P1,#0FHORL P1,A例 設(shè)(A)=5AH=90,且CY=0,則執(zhí)行指令

20、RL A后,(A)=B4H=180。執(zhí)行指令 RR A后,(A)=2DH=45。執(zhí)行指令 RLC A后,(A)=B4H=180。執(zhí)行指令 RRC A后,(A)=2DH=45。用移位指令還可以實(shí)現(xiàn)算術(shù)運(yùn)算,左移一位相當(dāng)于原內(nèi)容乘以2,右移一位相當(dāng)于原內(nèi)容除以2,但這種運(yùn)算關(guān)系只對(duì)某些數(shù)成立(請(qǐng)讀者自行思考)。3.6 控制轉(zhuǎn)移類指令3.6.1 無條件轉(zhuǎn)移指令表3.4 無條件轉(zhuǎn)移指令 轉(zhuǎn)移和調(diào)用類指令在編程時(shí)都可以用目的程序的代號(hào)(標(biāo)號(hào))來代替目的程序的地址。LJMP(長轉(zhuǎn)指令):使程序從當(dāng)前地址轉(zhuǎn)移到64 KB程序存儲(chǔ)器地址空間的任意地址,故得名為長轉(zhuǎn)移AJMP(絕對(duì)轉(zhuǎn)移指令):程序可轉(zhuǎn)移的位置是

21、和PC當(dāng)前值在同一2 KB范圍內(nèi)。SJMP(相對(duì)短轉(zhuǎn)指令):該指令的轉(zhuǎn)移范圍是:相對(duì)PC當(dāng)前值向前轉(zhuǎn)128字節(jié),向后轉(zhuǎn)127字節(jié)。JMP A+DPTR(相對(duì)長轉(zhuǎn)移指令):它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對(duì)偏移量,在64 KB范圍內(nèi)無條件轉(zhuǎn)移。1LJMP(長轉(zhuǎn)指令) LJMP指令執(zhí)行后,程序無條件地轉(zhuǎn)向16位目標(biāo)地址(addr16)處執(zhí)行,不影響標(biāo)志位。由于指令中提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64 KB程序存儲(chǔ)器地址空間的任意地址,故得名為“長轉(zhuǎn)移”。該指令的缺點(diǎn)是執(zhí)行時(shí)間長,字節(jié)多。 2AJMP(絕對(duì)轉(zhuǎn)移指令) AJMP的機(jī)器碼是由11位

22、直接地址addr11和指令操作碼00001,按下列分布組成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 該指令執(zhí)行后,程序轉(zhuǎn)移的目的地址是由AJMP指令所在位置的地址PC值加上該指令字節(jié)數(shù)2,構(gòu)成當(dāng)前PC值。取當(dāng)前PC值的高5位與指令中提供的11位直接地址形成轉(zhuǎn)移的目的地址,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0轉(zhuǎn)移目的地址(PC) 由于11位地址的范圍是0000000000011111111111,即2 KB范圍,而目的地址的高5位是由PC當(dāng)前值,所以程序可轉(zhuǎn)移的位

23、置只能是和PC當(dāng)前值在同一2 KB范圍內(nèi)。本指令轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位。 例如:若AJMP指令地址(PC)=2300H。執(zhí)行指令A(yù)JMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=20FFH,程序向前轉(zhuǎn)到20FFH單元開始執(zhí)行。 又如:若AJMP指令地址(PC)=2FFFH。執(zhí)行指令A(yù)JMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=30FFH,程序向后轉(zhuǎn)到30FFH單元開始執(zhí)行。 由上可見:若addr11相同,則AJMP指令的機(jī)器碼相同,但轉(zhuǎn)移的目的地址卻可能不同,這是因?yàn)檗D(zhuǎn)移的目的地址是由PC當(dāng)前值的高5位與addr11共同決定的。 3SJMP(相對(duì)短轉(zhuǎn)指令)

24、指令的操作數(shù)rel用8位帶符號(hào)數(shù)補(bǔ)碼表示,占指令的一個(gè)字節(jié)。因?yàn)?位補(bǔ)碼的取值范圍為-128+127,所以該指令的轉(zhuǎn)移范圍是:相對(duì)PC當(dāng)前值向前轉(zhuǎn)128字節(jié),向后轉(zhuǎn)127字節(jié)。即轉(zhuǎn)移目的地址= SJMP指令所在地址+2+rel 如在2100H單元有SJMP指令,若rel = 5AH(正數(shù)),則轉(zhuǎn)移目的地址為215CH(向后轉(zhuǎn));若rel = F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。 用匯編語言編程時(shí),指令中的相對(duì)地址rel往往用欲轉(zhuǎn)移至的地址的標(biāo)號(hào)(符號(hào)地址)表示。機(jī)器匯編時(shí),能自動(dòng)算出相對(duì)地址值; 因?yàn)镸CS-51的指令集無暫停指令,所以常用下列指令將程序原處無限循環(huán),進(jìn)入等待

25、狀態(tài)。L4:SJMP L4 4JMP A+DPTR(相對(duì)長轉(zhuǎn)移指令) 它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對(duì)偏移量,在64 KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。例如,當(dāng)DPTR為確定值,根據(jù)A的不同值就可以實(shí)現(xiàn)多分支的轉(zhuǎn)移。該指令在執(zhí)行后不會(huì)改變DPTR及A中原來的內(nèi)容。例 根據(jù)累加器A的值,轉(zhuǎn)不同處理程序的入口。 MOV DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根據(jù)A值轉(zhuǎn)移 TABLE:AJMP TAB1 ;當(dāng)(A)=0時(shí)轉(zhuǎn)TAB1執(zhí)行 AJMP TAB2 ;當(dāng)(A)=2時(shí)轉(zhuǎn)TAB2執(zhí)行 AJMP TAB3

26、;當(dāng)(A)=4時(shí)轉(zhuǎn)TAB3執(zhí)行3.6.2 條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令是當(dāng)某種條件滿足時(shí),程序轉(zhuǎn)移執(zhí)行;條件不滿足時(shí),程序仍按原來順序執(zhí)行。轉(zhuǎn)移的條件可以是上一條指令或更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標(biāo)志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運(yùn)算結(jié)果。由于該類指令采用相對(duì)尋址,因此程序可在以當(dāng)前PC值為中心的-128+127范圍內(nèi)轉(zhuǎn)移。該類指令共有8條,可以分為累加器判零條件轉(zhuǎn)移指令、比較條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令三類。表3.5中列出了這些指令。表3.5 條件轉(zhuǎn)移指令 1判零條件轉(zhuǎn)移指令 判零條件轉(zhuǎn)移指令以累加器A的內(nèi)容是否為0作為轉(zhuǎn)移的條件。JZ指令是為0轉(zhuǎn)移,不為0則順序執(zhí)行;JNZ

27、指令是不為0轉(zhuǎn)移,為0則順序執(zhí)行。累加器A的內(nèi)容是否為0,是由這條指令以前的其它指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運(yùn)算,也不影響標(biāo)志位。 例 將片外RAM首地址為DATA1的一個(gè)數(shù)據(jù)塊轉(zhuǎn)送到片內(nèi)RAM首地址為DATA2的存儲(chǔ)區(qū)中。 外部RAM向內(nèi)部RAM的數(shù)據(jù)轉(zhuǎn)送一定要經(jīng)過累加器A,利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止。完成數(shù)據(jù)傳送的參考程序如下: MOV R0,#DATA1 ;R0作為外部數(shù)據(jù)塊的地址指針 MOV R1,#DATA1 ;R1作為內(nèi)部數(shù)據(jù)塊的地址指針LOOP: MOVX A,R0 ;取外部RAM數(shù)據(jù)送入AHERE: JZ HERE ;數(shù)據(jù)為零則終止傳送 M

28、OV R1,A ;數(shù)據(jù)傳送至內(nèi)部RAM 單元 INC R0 ;修改指針,指向下一數(shù)據(jù)地址 INC R1 SJMP LOOP ;循環(huán)取數(shù) 2比較轉(zhuǎn)移指令 比較轉(zhuǎn)移指令共有4條。這組指令是先對(duì)兩個(gè)規(guī)定的操作數(shù)進(jìn)行比較,根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移。若兩個(gè)操作數(shù)相等,則不轉(zhuǎn)移,程序順序執(zhí)行;若兩個(gè)操作數(shù)不等,則轉(zhuǎn)移。比較是進(jìn)行一次減法運(yùn)算,但其差值不保存,兩個(gè)數(shù)的原值不受影響,而標(biāo)志位要受到影響。利用標(biāo)志位CY作進(jìn)一步的判斷,可實(shí)現(xiàn)三分支轉(zhuǎn)移。(P86例) 例 當(dāng)從P1口輸入數(shù)據(jù)為01H 時(shí),程序繼續(xù)執(zhí)行,否則等待,直到P1口出現(xiàn)01H。參考程序如下: MOV A,#01H ;立即數(shù)01H送AWAI

29、T: CJNE A,P1,WAIT ;(P1)01H,則等待 3減1條件轉(zhuǎn)移指令 減1條件轉(zhuǎn)移指令有兩條。每執(zhí)行一次這種指令,就把第一操作數(shù)減1,并把結(jié)果仍保存在第一操作數(shù)中,然后判斷是否為零。若不為零,則轉(zhuǎn)移到指定的地址單元,否則順序執(zhí)行。這組指令對(duì)于構(gòu)成循環(huán)程序是十分有用的,可以指定任何一個(gè)工作寄存器或者內(nèi)部RAM單元作為循環(huán)計(jì)數(shù)器。每循環(huán)一次,這種指令被執(zhí)行一次,計(jì)數(shù)器就減1。預(yù)定的循環(huán)次數(shù)不到,計(jì)數(shù)器不會(huì)為0,轉(zhuǎn)移執(zhí)行循環(huán)操作;到達(dá)預(yù)定的循環(huán)次數(shù),計(jì)數(shù)器就被減為0,順序執(zhí)行下一條指令,也就結(jié)束了循環(huán)。 例 將內(nèi)部RAM從DATA單元開始的10個(gè)無符號(hào)數(shù)相加,相加結(jié)果送SUM單元保存。

30、設(shè)相加結(jié)果不超過8位二進(jìn)制數(shù),則相應(yīng)的程序如下: MOV R0,#0AH ;設(shè)置循環(huán)次數(shù) MOV R1,#DATA ;R1作地址指針,指向數(shù)據(jù)塊首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一個(gè)數(shù) INC R1 ;修改指針,指向下一個(gè)數(shù) DJNZ R0,LOOP ;R0減1,不為0循環(huán) MOV SUM,A ;存10個(gè)數(shù)相加的和3.7 子程序調(diào)用與返回指令1、 反復(fù)多次執(zhí)行某段程序,可將此程序獨(dú)立出來作為子程序;2、 子程序可以被主程序多次調(diào)用,能實(shí)現(xiàn)這種功能的指令即為調(diào)用指令。3、子程序執(zhí)行完需自動(dòng)返回到主程序原斷口地址繼續(xù)執(zhí)行,因此,結(jié)尾放一條返回指令。3.7.1 子程序調(diào)用

31、指令子程序調(diào)用指令有長調(diào)用和絕對(duì)調(diào)用兩條,它們都是雙周期指令。 LCALL和ACALL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們?cè)谵D(zhuǎn)移前要把執(zhí)行完該指令的PC內(nèi)容自動(dòng)壓入堆棧后,才將子程序入口地址addr16(或addr11)送PC,實(shí)現(xiàn)轉(zhuǎn)移。 3.7.2 返回指令 返回指令共兩條:一條是對(duì)應(yīng)兩條調(diào)用指令的子程序返回指令RET,另一條是對(duì)應(yīng)從中斷服務(wù)程序的返回指令RETI。 從上述兩條指令的功能操作看,都是從堆棧中彈出返回地址送PC,堆棧指針減2,但它們是兩條不同的指令。其有下面兩點(diǎn)不同: (1) 從使用上,RET指令必須作子程序的最后一條指令;RETI必須作中斷服務(wù)程序的最后一條指令。 (2) RETI指令除恢復(fù)斷點(diǎn)地址外,還恢復(fù)CPU響應(yīng)中斷時(shí)硬件自動(dòng)保護(hù)的現(xiàn)場(chǎng)信息。執(zhí)行RETI指令后,將清除中斷響應(yīng)時(shí)所置位的優(yōu)先級(jí)狀態(tài)觸發(fā)器,使得已

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論