第4章 MCS-51指令系統(tǒng)、語言程序設(shè)計基礎(chǔ)_第1頁
第4章 MCS-51指令系統(tǒng)、語言程序設(shè)計基礎(chǔ)_第2頁
第4章 MCS-51指令系統(tǒng)、語言程序設(shè)計基礎(chǔ)_第3頁
第4章 MCS-51指令系統(tǒng)、語言程序設(shè)計基礎(chǔ)_第4頁
第4章 MCS-51指令系統(tǒng)、語言程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章MCS-51單片機(jī)指令系統(tǒng)4.1概述4.2數(shù)據(jù)傳送類指令4.3算術(shù)運算類指令4.4邏輯運算類指令4.5控制轉(zhuǎn)移類指令4.6位處理類指令2.1概述一、指令與指令系統(tǒng)指令系統(tǒng):

一種型號的計算機(jī)所有指令的集合就是它的指令系統(tǒng)[即軟件(語言)系統(tǒng)]。各種型號的計算機(jī)都有自己的指令系統(tǒng)。指令:是主機(jī)能直接識別和接受并指揮計算機(jī)執(zhí)行某種操作的命令。二、計算機(jī)指令的基本類型1.機(jī)器語言2.匯編語言3.高級語言1.機(jī)器語言a.特點:b.缺點:c.機(jī)器碼表示的指令格式:是計算機(jī)自身固有的語言;用二進(jìn)制代碼表示,亦稱為機(jī)器代碼。能被主機(jī)直接識別、分析和執(zhí)行;程序不易閱讀,易出錯;----------(讀程序難)代碼不便于記憶,編程繁、難;--(寫程序難)操作碼[操作數(shù)]2.匯編語言a.優(yōu)點:b.缺點:指令意義直觀、易記憶,編程方便;不需專門的軟件平臺,占用的存儲空間少;1-3B執(zhí)行速度快;不能被機(jī)器本身直接識別。程序通用性差,復(fù)雜程序編程工作量大;介于機(jī)器語言和高級語言之間,用助記符、符號地址和標(biāo)號來表示指令和編寫程序。直接和硬件接口,適時性強(qiáng)。機(jī)器語言匯編語言代真(匯編、翻譯目標(biāo)代碼)手工代真、自動代真3.高級語言Basic、Fortran、Pascal、C、Delphi、java等b.缺點:寫、讀程序方便、簡單;程序通用性強(qiáng)。機(jī)器本身無法識別。a.優(yōu)點:需要專門的軟件系統(tǒng)(平臺),需占用較大的存儲空間;三、MCS-51系列單片機(jī)的指令格式完整的指令格式如下:[標(biāo)號:]操作碼[操作數(shù)][,操作數(shù)][;注釋]其中:[]項是可選項。注釋:注釋也是指令語句的可選項,它是為增加程序的可讀性而設(shè)置的,是針對某指令而添加的說明性文字,不產(chǎn)生可執(zhí)行的目標(biāo)代碼。操作數(shù):參與操作的地址單元、寄存器單元或數(shù)據(jù);可選項(可以是0-2個)“對誰操作”操作碼:用助記符表示,是由對應(yīng)的英文縮寫構(gòu)成的,作用是命令主機(jī)作何操作。它規(guī)定了指令具體的操作功能,描述指令的操作性質(zhì),是一條指令中不可缺少的內(nèi)容?!白鍪裁矗瑧?yīng)達(dá)到什么目的”標(biāo)號:用符號表明本條指令的起始存儲單元地址,也稱為指令的符號地址。以便控制程序的轉(zhuǎn)向。可選項。Note:標(biāo)號與操作碼之間用“:”隔開;標(biāo)號以英文字母為首,不能超過6個字符;操作碼與操作數(shù)之間用若干空格隔開;操作數(shù)之間用“,”隔開;注釋前用“;”與指令主題隔開。四、指令的分類MCS-51指令系統(tǒng)有111條指令,可按下列幾種方式分類:1.按指令字節(jié)數(shù)分類:

單字節(jié)指令(49條)、雙字節(jié)指令(45條)和三字節(jié)指令(17條)。2.按指令執(zhí)行時間分類:

單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和四機(jī)器周期指令(2條)。3.按功能分類:

數(shù)據(jù)傳送類指令(29條)、算術(shù)運算類指令(24條)、邏輯操作類指令(24條)、控制轉(zhuǎn)移類指令(17條)和位操作指令(17條)。五、指令格式的符號約定Rn:當(dāng)前工作寄存器R0-R7中的某個寄存器;Ri:當(dāng)前寄存器組中能間接尋址的兩個寄存器R0,R1;#data:8位二進(jìn)制數(shù)(立即數(shù));#data16:16位二進(jìn)制數(shù);direct:片內(nèi)RAM中的某個單元或某個SFR的地址;addr11:11位二進(jìn)制碼表示的地址,尋址范圍0-2KB;addr16:16位二進(jìn)制碼表示的地址,尋址范圍0-64KB;rel:用補(bǔ)碼形式表示的8位二進(jìn)制偏移量;bit:可直接位尋址的片內(nèi)RAM或SFR中的某個位地址;C:最高進(jìn)位標(biāo)志位或為累加器;@:在間接尋址方式中,是間接尋址寄存器指針的前綴。$:表示當(dāng)前的指令地址;/:在位操作指令中,表示對該位先求反后再參與操作。(X):表示X單元中的內(nèi)容;((X)):表示以X單元中的內(nèi)容為地址的相應(yīng)單元中的數(shù)據(jù);如((Ri))、((DPTR))←:表示將箭頭右邊的內(nèi)容傳送到左邊;:表示將數(shù)據(jù)交換;∨、∧、⊕:分別表示邏輯或、與、異或。4.2數(shù)據(jù)傳送類指令(共29條)數(shù)據(jù)傳送就是將數(shù)據(jù)從一個單元傳送到另一個單元的操作,是單片機(jī)最基本、最主要、量最大的操作。數(shù)據(jù)傳送指令共29條,可分為內(nèi)部RAM數(shù)據(jù)傳送、外部RAM數(shù)據(jù)傳送、程序存儲器數(shù)據(jù)傳送、數(shù)據(jù)交換和堆棧操作等五類。尋址范圍:累加器A、片內(nèi)RAM、SFR、片外RAM。功能:(目的地址)←(源地址),源地址單元的內(nèi)容不變。對標(biāo)志位的影響:除以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令對P標(biāo)志位有影響外,其余均不影響標(biāo)志位。一、一般傳送類指令(4+3+5+3=15條)MOVA,Rn;(A)←(Rn)MOVA,direct;(A)←(direct)MOVA,@Ri;(A)←((Ri))MOVA,#data;(A)←#dataMOVRn,A;(Rn)←(A)MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←#dataMOVdirect,A;(direct)←(A)MOVdirect,Rn;(direct)←(Rn)MOVdirect,@Ri;(direct)←((Rn))MOVdirect,direct;(direct)←(direct)MOVdirect,#data;(direct)←#dataMOV@Ri,A;((Rn))←(A)MOV@Ri,direct;((Rn))←(direct)MOV@Ri,#data;((Rn))←#data例子:設(shè)內(nèi)部RAM第30H單元內(nèi)容為40H,第40H單元內(nèi)容10H,P1作為輸出口其輸入的數(shù)據(jù)為0CAH(11001010B)經(jīng)過程序執(zhí)行后結(jié)果。

MOVR0,#30HMOVA,@R0MOVR1,AMOVB,@R1MOV@R1,P1MOVP2,P1R0,R1,A,B40H單元,P2口?二、堆棧操作指令(2條)PUSHdirect;SP←SP+1,(SP)←(direct)POPdirect;(direct)←(SP),(SP)←(SP)-1例1:設(shè)(SP)=30H,(A)=01H,(B)=02H,執(zhí)行如下指令后,SP、A和B中的內(nèi)容分別是什么?

PUSH ACCPUSH BPOP ACCPOPB三、累加器傳送類指令(3+2+4+2=11條)①8位數(shù)據(jù)交換指令:XCH A,Rn ;(A)(Rn)XCH A,@Ri ;(A)((Ri))XCH A,direct ;(A)(direct)②4位數(shù)據(jù)(半字節(jié))交換指令:XCHD A,@Ri ;(A)3~0((Ri))3~0SWAP A ;(A)7~4(A)3~0例2:編程將內(nèi)部RAM中30H單元的低4位和高4位進(jìn)行交換,并保持A中的內(nèi)容不變。XCHA,30HSWAPAXCHA,30HSWAP30H???③訪問外部RAM的指令MOVXA,@DPTR;(A)←((DPTR))MOVXA,@Ri;(A)←((Ri))MOVX@DPTR,A;((DPTR))←(A)MOVX@Ri,A;((Ri))←(A)例3:若(R0)=12H,(0012H)=56H,則執(zhí)行指令

MOVXA,@R0后;累加器(A)=?例4:若(DPTR)=3020H,(A)=48H,則執(zhí)行指令MOVX@DPTR,A后,外部RAM(3020H)=?再來一個例子

例如:設(shè)外部RAM(0203H)=FFH,分析以下指令執(zhí)行后的結(jié)果。MOVDPTR,#0203H;(DPTR)←0203H,900203MOVXA,@DPTR;(A)←((DPTR)),E0MOV30H,A;(30H)←(A),F530MOVA,#0FH;(A)←0FH,740FMOVX@DPTR,A;((DPTR))←(A),F0執(zhí)行結(jié)果為:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。④讀程序存儲器的指令(查表指令):

MOVCA,@A+DPTR;(A)←((A)+(DPTR))

MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))※兩條指令的異同:其功能完全相同,但使用中存在著差異:采用DPTR作為基址寄存器,表可以放在64KB程序存儲器空間的任何地址,使用方便,故稱為遠(yuǎn)程查表。一般作為首選查表指令。采用PC作為基址寄存器,具體的表在程序存儲器中只能在查表指令后的256B的地址空間中,使用有限制,故稱為近程查表。四、16位數(shù)據(jù)傳送指令(1條)MOVDPTR,#data16;(DPTR)←#data16即:(DPH)←#data8~15;(DPL)←#data0~7。例5:編程將內(nèi)部RAM中30H單元的數(shù)據(jù)傳送到外部RAM的2000H單元。

MOVA,30HMOVDPTR,#2000HMOVX@DPTR,A例:利用查表的方法編寫Y=X2(X=0,1,2,…,9)的查表程序。設(shè)變量X的值存放在內(nèi)存30H單元中,求得的Y的值存放在內(nèi)存31H單元中;平方表存放在首地址為TABLE的程序存儲器中。編程如下:MOVA,30HMOVDPTR,#TABLEMOVCA,@A+DPTRMOV31H,ATABLE:00H,01H,04H,09H,10H,19H,24H,31H,40H,51H若(30H)=#03H,則執(zhí)行完上述程序后:(31H)=?4.3算術(shù)運算類指令

(共24條)算術(shù)運算指令的兩個參與運算的操作數(shù),累加器A為第一操作數(shù),也是目的操作數(shù);第二操作數(shù)可以是#data(立即數(shù))、寄存器R0~R7、@Ri(片內(nèi)RAM)或直接地址單元。算術(shù)運算指令可分為加法指令、帶進(jìn)位的加法指令、帶借位的減法指令、十進(jìn)制調(diào)整指令、加1指令、減1指令、乘除指令。算術(shù)指令都是針對8位無符號數(shù)的,如要進(jìn)行帶符號或多字節(jié)二進(jìn)制數(shù)運算,需編寫程序,通過執(zhí)行程序來實現(xiàn)。(實驗1.多字節(jié)算術(shù)運算程序?qū)嶒?一、加法指令A(yù)DDA,#data;(A)←(A)+#dataADDA,direct;(A)←(A)+(direct)ADDA,@Ri;(A)←(A)+((Ri))ADDA,Rn;(A)←(A)+(Rn)ADDCA,#data;(A)←(A)+#data+(C)ADDCA,direct;(A)←(A)+(direct)+(C)ADDCA,@Ri;(A)←(A)+((Ri))+(C)ADDCA,Rn;(A)←(A)+(Rn)+(C)INCA;(A)←(A)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCRn;(Rn)←(Rn)+1INCDPTR;(DPTR)←(DPTR)+1進(jìn)位(借位)標(biāo)志CY為無符號整數(shù)的多字節(jié)加法、減法、移位等操作提供了方便;溢出標(biāo)志OV可方便的控制補(bǔ)碼運算;輔助進(jìn)位標(biāo)志AC用于BCD碼運算。算術(shù)運算操作將影響PSW中的OV、CY、AC和P等。

例若(A)=84H,(30H)=8DH,執(zhí)行指令A(yù)DDA,30H之后,由于:

即:(A)=11H,(CY)=1,(AC)=1,(OV)=1(D7有進(jìn)位,D6無進(jìn)位),(P)=0。

帶進(jìn)位加法指令

指令的功能是把源操作數(shù)與累加器A的內(nèi)容相加再與進(jìn)位標(biāo)志CY的值相加,結(jié)果送入目的操作數(shù)A中。加的進(jìn)位標(biāo)志CY的值是在該指令執(zhí)行之前已經(jīng)存在的進(jìn)位標(biāo)志的值,而不是執(zhí)行該指令過程中產(chǎn)生的進(jìn)位。增1指令的功能是把源操作數(shù)的內(nèi)容加1,結(jié)果再送回原單元。這些指令僅INCA影響P標(biāo)志。其余指令都不影響標(biāo)志位的狀態(tài)。

DAA二-十進(jìn)制調(diào)整指令若(A)0~3>9或(AC)=1,則(A)0~3=(A)0~3+06H;若(A)4~7>9或(C)=1,則(A)4~7=(A)4~7+06H;若上述兩個條件同時滿足,則(A)=(A)+66H。本指令用于對兩個BCD碼相加后存放在累加器A中的結(jié)果進(jìn)行調(diào)整,使之成為一個正確的兩位BCD碼,以完成十進(jìn)制加法功能。例:若累加器和寄存器R3中均存放的是BCD碼,(A)=84H,(R3)=67H,執(zhí)行以下指令:ADDA,R3DAA執(zhí)行過程:執(zhí)行第1條指令時,單片機(jī)按二進(jìn)制數(shù)相加后得到:(A)=EBH,C=0。但是,按照十進(jìn)制的加法,應(yīng)該有:84+67=151,結(jié)果有誤。所以在按二進(jìn)制數(shù)相加后,再加一條十進(jìn)制調(diào)整指令:DAA,按照指令的執(zhí)行規(guī)則:(A)0~3和(A)4~7均大于9,所以要加66H調(diào)整,即(A)=(A)+66H=EBH+66H=51H,且(C)=1,這個結(jié)果就是十進(jìn)制加法84+67=151的結(jié)果。例若(A)=01010110B(56),表示的BCD碼為,(R2)=01100111B(67),表示的BCD碼為,(CY)=0。執(zhí)行以下指令:ADDA,R2DAA由于(A)=00100011B,即,且(CY)=1,即結(jié)果為BCD數(shù)123。應(yīng)該注意,DA指令不能對減法進(jìn)行十進(jìn)制調(diào)整。BDH(189)二、減法指令(4+1=5條)SUBBA,#data;(A)←(A)-#data-(C)SUBBA,direct;(A)←(A)-(direct)-(C)SUBBA,@Ri;(A)←(A)-((Ri))-(C)SUBBA,Rn;(A)←(A)-(Rn)-(C)DECA;(A)←(A)-1DECdirect;(direct)←(direct)-1DECRn;(Rn)←(Rn)-1DEC@Ri;((Ri))←((Ri))-1帶借位減CY:差的位7需借位時,(CY)=1;否則,(CY)=0。AC:差的位3需借位時,(AC)=1;否則,(AC)=0。OV:若位6有借位而位7無借位或位7有借位而位6無借位時,(OV)=1。如要用此組指令完成不帶借位減法,只需先清CY為0。例若(A)=C9H,(R2)=54H,(CY)=1,執(zhí)行指令SUBBA,R2之后,由于:

即:(A)=74H,(CY)=0,(AC)=1,(OV)=1(位6有借位,位7無借位),(P)=0。

例:試編寫計算3412H-0E7FH的程序,將差的高8位存入41H,低8位存入40H。CLRCMOVA,#12HSUBBA,#7FHMOV40H,AMOVA,#34HSUBBA,#0EHMOV41H,AEND減1這組指令的功能是把操作數(shù)的內(nèi)容減1,結(jié)果再送回原單元。這組指令僅DECA影響P標(biāo)志。其余指令都不影響標(biāo)志位的狀態(tài)。三、乘除法指令(1+1=2條)MULAB;累加器A與B寄存器相乘該指令的功能是將累加器A與寄存器B中的無符號8位二進(jìn)制數(shù)相乘,乘積的低8位留在累加器A中,高8位存放在寄存器B中。當(dāng)乘積大于FFH時,溢出標(biāo)志位(OV)=1。而標(biāo)志CY總是被清0。例若(A)=50H(80),(B)=A0H(160),執(zhí)行指令MULAB(12800即3200H)之后,(A)=00H,(B)=32H,(OV)=1,(CY)=0。

乘法DIVAB;累加器A除以寄存器B該指令的功能是將累加器A中的無符號8位二進(jìn)制數(shù)除以寄存器B中的無符號8位二進(jìn)制數(shù),商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中。當(dāng)除數(shù)為0時,則結(jié)果的A和B的內(nèi)容不定,且溢出標(biāo)志位(OV)=1。而標(biāo)志CY總是被清0。例若(A)=FBH(251),(B)=12H(18),執(zhí)行指令DIVAB之后,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。除法4.4邏輯運算類指令

(共24條)

邏輯運算指令可以完成與、或、異或、清0和取反操作,當(dāng)以累加器A為目的操作數(shù)時,對P標(biāo)志有影響;累加器清0操作對P標(biāo)志有影響。

循環(huán)指令是對累加器A的循環(huán)移位操作,包括左、右方向以及帶與不帶進(jìn)位位等移位方式,移位操作時,帶進(jìn)位的循環(huán)移位對CY和P標(biāo)志有影響;一、單操作數(shù)邏輯運算類指令(2+4=6條)CLRA;(A)←0CPLA;(A)←(A)1這兩條指令的功能分別是把累加器A的內(nèi)容清0和取反,結(jié)果仍在A中。例若(A)=A5H,執(zhí)行指令CLRA之后,(A)=00H。

例若(A)=AAH,執(zhí)行指令CPLA之后,(A)=55H。

1010101001010101累加器循環(huán)移位

例子設(shè)(A)=0C5H(11000101B)執(zhí)行指令RRA結(jié)果是什么? 累加器A內(nèi)容循環(huán)右位移,最低位A0移入最高位。 結(jié)果(A)=0E2H(11100010B)例子設(shè)(A)=0C5H(11000101B)(C)=1執(zhí)行指令RRCA結(jié)果是什么? 累加器A內(nèi)容和C循環(huán)右位移,C移入A的最高位,A的最低位移入C。 結(jié)果(A)=0E2H(11100010B)(C)=1例子設(shè)(A)=0C5H(11000101B)執(zhí)行指令RLA結(jié)果是什么? 累加器A內(nèi)容循環(huán)左位移,最高位轉(zhuǎn)移到最低位 結(jié)果(A)=08BH(10001011B)例子設(shè)(A)=045H(01000101B)(C)=1,執(zhí)行指令RLCA結(jié)果是什么? 累加器A內(nèi)容循環(huán)左位移,A最高位到C,C移入A的最低位。 結(jié)果(A)=08BH(10001011B)(C)=0二、雙操作數(shù)邏輯運算類指令(6+6+6=18條)1.邏輯“與”指令(6條):ANLA,#data;(A)←(A)∧#dataANLA,direct;(A)←(A)∧(direct)ANLA,Rn;(A)←(A)∧(Rn)ANLA,@Ri;(A)←(A)∧((Ri))ANLdirect,A;(direct)←(direct)∧(A)ANLdirect,#data;(direct)←(direct)∧#data&2.邏輯“或”指令(6條)

:ORLA,#data;(A)←(A)∨#dataORLA,direct;(A)←(A)∨(direct)ORLA,Rn;(A)←(A)∨(Rn)ORLA,@Ri;(A)←(A)∨((Ri))ORLdirect,A;(direct)←(direct)∨(A)ORLdirect,#data;(direct)←(direct)∨#data≥1

邏輯與

前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容相與,結(jié)果送入直接地址指示的單元。后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容相與,結(jié)果送入累加器A中。例若(A)=C3H,(11000011B)(R0)=AAH(10101010B),執(zhí)行指令A(yù)NLA,R0之后,(A)=82H(10000010B)。

前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容相或,結(jié)果送入直接地址指示的單元。后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容相或,結(jié)果送入累加器A中。邏輯或例若(A)=C3H(11000011B),(R0)=55H(01010101B),執(zhí)行指令ORLA,R0之后,(A)=D7H(11010111B)。3.5.3邏輯異或

前2條指令的功能是把源操作數(shù)與直接地址指示的單元內(nèi)容異或,結(jié)果送入直接地址指示的單元。后4條指令的功能是把源操作數(shù)與累加器A的內(nèi)容異或,結(jié)果送入累加器A中。例若(A)=C3H(11000011B),(R0)=AAH(10101010B),執(zhí)行指令XRLA,R0之后,(A)=69H(11010010B)。邏輯“與”指令常用來“屏蔽”某些不用的位。P72例2例9:已知(A)=8AH,(R1)=73H,試編程將A的高4位和R1的低4位合并成一個字節(jié)存放在R0中。ANLA,#F0HANLR1,#0FHORLA,R1MOVR0,AANLA,#F0H;屏蔽A的低4位MOVR0,A;暫存到R0中MOVA,R1

;ANLA,#0FH;屏蔽R1的高4位ORLA,R0;合并MOVR0,A;結(jié)果送到R0中END例:編寫一程序,實現(xiàn)下圖所示的邏輯運算功能。其中:X、Y和Z表示輸入信號的地址,F(xiàn)表示輸出信號的地址。MOVA,XANLA,YMOVF,AMOVA,YORLA,ZCPLAORLA,FMOVF,A≥1&≥1XYZF4.5控制轉(zhuǎn)移類指令

(共17條)功能:改變程序計數(shù)器PC中的內(nèi)容,控制程序執(zhí)行的流向,實現(xiàn)程序分支轉(zhuǎn)向。分為兩大類:一、無條件轉(zhuǎn)移類指令(9條)

:1.子程序調(diào)用與返回類指令(2+2=4條)2.轉(zhuǎn)移類指令(4條)3.空操作指令(1條)二、條件轉(zhuǎn)移類指令(8條)

:1.判0轉(zhuǎn)移指令(2條)2.比較轉(zhuǎn)移指令(4條)3.循環(huán)轉(zhuǎn)移指令(2條)一、無條件轉(zhuǎn)移類指令(9條)ACALLaddr11;(PC)←(PC)+2;(SP)←(SP)+1,((SP))←(PC)0~7;(SP)←(SP)+1,((SP))←(PC)8~15;(PC)0~10←addr11,(PC)11~15不變。LCALLaddr16;(PC)←(PC)+3;(SP)←(SP)+1,((SP))←(PC)0~7;(SP)←(SP)+1,((SP))←(PC)8~15;(PC)

←addr16。RET;(PC)8~15←((SP)),(SP)←(SP)-1;(PC)0~7←((SP)),(SP)←(SP)-1RETI;(PC)8~15←((SP)),(SP)←(SP)-1;(PC)0~7←((SP)),(SP)←(SP)-1主程序與子程序的調(diào)用關(guān)系圖返回兩級子程序嵌套的示意圖

這兩條指令可以實現(xiàn)子程序的短調(diào)用和長調(diào)用。這兩條指令的執(zhí)行不影響任何標(biāo)志。

子程序調(diào)用指令A(yù)CALL指令執(zhí)行時,被調(diào)用的子程序的首址必須設(shè)在包含當(dāng)前指令(即調(diào)用指令的下一條指令)的第一個字節(jié)在內(nèi)的2K字節(jié)范圍內(nèi)的程序存儲器中。LCALL指令執(zhí)行時,被調(diào)用的子程序的首址可以設(shè)在64K字節(jié)范圍內(nèi)的程序存儲器空間的任何位置。

例若(SP)=07H,標(biāo)號“XADD”表示的實際地址為0345H,PC的當(dāng)前值為0123H。執(zhí)行指令A(yù)CALL后,(PC)+2=0125H,其低8位的25H壓入堆棧的08H單元,其高8位的01H壓入堆棧的09H單元。(PC)=0345H,程序轉(zhuǎn)向目標(biāo)地址0345H處執(zhí)行。RET指令的功能是從堆棧中彈出由調(diào)用指令壓入堆棧保護(hù)的斷點地址,并送入指令計數(shù)器PC,從而結(jié)束子程序的執(zhí)行。程序返回到斷點處繼續(xù)執(zhí)行。返回類指令

RETI指令是專用于中斷服務(wù)程序返回的指令,除正確返回中斷斷點處執(zhí)行主程序以外,并有清除內(nèi)部相應(yīng)的中斷狀態(tài)寄存器(以保證正確的中斷邏輯)的功能。AJMPaddr11;(PC)←(PC)+2,(PC)0~10←addr11LJMPaddr16;(PC)←(PC)+3,(PC)←addr16NOP;;(PC)←(PC)+1JMP@A+DPTR;(PC)←(A)+(DPTR)SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel轉(zhuǎn)移類指令

短跳轉(zhuǎn)AJMPaddr11;PC←(PC)+2,;PC10~0←addr11該指令執(zhí)行時,先將PC的內(nèi)容加2(這是PC指向的是AJMP的下一條指令),然后把指令中11位地址碼傳送到PC10~0,而PC15~11保持原內(nèi)容不變。在目標(biāo)地址的11位中,前3位為頁地址,后8位為頁內(nèi)地址(每頁含256個單元)。長跳轉(zhuǎn)LJMPaddr16;PC←addr16第一字節(jié)為操作碼,該指令執(zhí)行時,將指令的第二、三字節(jié)地址碼分別裝入指令計數(shù)器PC的高8位和低8位中,程序無條件地轉(zhuǎn)移到指定的目標(biāo)地址去執(zhí)行。LJMP提供的是16位地址,因此程序可以轉(zhuǎn)向64KB的程序存儲器地址空間的任何單元。

例若標(biāo)號“NEWADD”表示轉(zhuǎn)移目標(biāo)地址1234H。執(zhí)行指令LJMPNEWADD時,兩字節(jié)的目標(biāo)地址將裝入PC中,使程序轉(zhuǎn)向目標(biāo)地址1234H處運行??詹僮?/p>

NOP;PC←(PC)+1這條指令不產(chǎn)生任何控制操作,只是將程序計數(shù)器PC的內(nèi)容加1。該指令在執(zhí)行時間上要消耗1個機(jī)器周期,在存儲空間上可以占用一個字節(jié)。因此,常用來實現(xiàn)較短時間的延時。散轉(zhuǎn)指令JMP@A+DPTR;PC←(PC)+1,PC←(A)+(DPTR)該指令具有散轉(zhuǎn)功能,可以代替許多判別跳轉(zhuǎn)指令。其轉(zhuǎn)移地址由數(shù)據(jù)指針DPTR的16位數(shù)和累加器A的8位數(shù)進(jìn)行無符號數(shù)相加形成,并直接裝入PC。該指令執(zhí)行時對標(biāo)志位無影響。例有一段程序如下:MOVDPTR,#TABLEJMP@A+DPTRTABLE:AJMPROUT0AJMPROUT1AJMPROUT2AJMPROUT3當(dāng)(A)=00H時,程序?qū)⑥D(zhuǎn)到ROUT0處執(zhí)行;當(dāng)(A)=02H時,程序?qū)⑥D(zhuǎn)到ROUT1處執(zhí)行;其余類推。

一個補(bǔ)充知識(補(bǔ)碼) 補(bǔ)碼(two'scomplement)1、在計算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示(存儲)。主要原因:使用補(bǔ)碼,可以將符號位和其它位統(tǒng)一處理;同時,減法也可按加法來處理。另外,兩個用補(bǔ)碼表示的數(shù)相加時,如果最高位(符號位)有進(jìn)位,則進(jìn)位被舍棄。2、補(bǔ)碼與原碼的轉(zhuǎn)換過程幾乎是相同的。正數(shù)的補(bǔ)碼,是其本身 +9的補(bǔ)碼是00001001負(fù)數(shù)的補(bǔ)碼 符號位為1,其余位為該數(shù)絕對值的原碼按位取反;然后整個數(shù)加1。例子:求-7的補(bǔ)碼 后七位:+7的原碼(0000111)→按位取反(1111000)→加1(1111001)所以-7的補(bǔ)碼是11111001。相對轉(zhuǎn)移

SJMPrel;PC←(PC)+2,PC←(PC)+rel

第一字節(jié)為操作碼,第二字節(jié)為相對偏移量rel,rel是一個帶符號的偏移字節(jié)數(shù)(2的補(bǔ)碼),取值范圍為+127~-128(00H~7FH對應(yīng)表示0~+127,80H~FFH對應(yīng)表示-128~-1)。負(fù)數(shù)表示反向轉(zhuǎn)移,正數(shù)表示正向轉(zhuǎn)移。rel可以是一個轉(zhuǎn)移目標(biāo)地址的標(biāo)號,由匯編程序在匯編過程中自動計算偏移地址,并填入指令代碼中。在手工匯編時,可用轉(zhuǎn)移目標(biāo)地址減轉(zhuǎn)移指令所在的源地址,再減轉(zhuǎn)移指令字節(jié)數(shù)2得到偏移字節(jié)數(shù)rel。

例若標(biāo)號“NEWADD”表示轉(zhuǎn)移目標(biāo)地址0123H,PC的當(dāng)前值為0100H。執(zhí)行指令SJMPNEWADD后,程序?qū)⑥D(zhuǎn)向0123H處執(zhí)行(此時rel=0123H-(0100+2)=21H)。偏移量rel及其計算相對偏移量rel是一個帶符號的8位二進(jìn)制數(shù),最高位為符號位,其余7位為有效數(shù)。由于rel∈[-127,+127],所以SJMPrel指令的轉(zhuǎn)移范圍只能在[PC當(dāng)前值±127]。在用匯編語言編寫程序時,rel可用目的地址的標(biāo)號來表示,手工匯編時可按下式計算rel:rel=[目的地址-PC當(dāng)前值]補(bǔ)例:通常用SJMP$指令來實現(xiàn)動態(tài)停機(jī)的操作(稱原地踏步),$表示該指令所在地址,則rel=?rel=[目的地址-PC當(dāng)前值]補(bǔ)=[-02H]補(bǔ)=FEH例:SJMPLOOP,該指令所在首地址為0103H,LOOP目的地址為0150H,求偏移量rel=?PC當(dāng)前值=0103H+02H=0105H所以:rel=[0150H-0105H]補(bǔ)=[4BH]補(bǔ)=

4BH思考題:若SJMPrel指令首地址為0100H,目的地址為00B0H,求偏移量rel=?二、條件轉(zhuǎn)移類指令(2+4+2=8條)累加器判0轉(zhuǎn)移

指令的功能是對累加器A的內(nèi)容為0和不為0進(jìn)行檢測并轉(zhuǎn)移。當(dāng)不滿足各自的條件時,程序繼續(xù)往下執(zhí)行。當(dāng)各自的條件滿足時,程序轉(zhuǎn)向指定的目標(biāo)地址。目標(biāo)地址的計算與SJMP指令情況相同。指令執(zhí)行時對標(biāo)志位無影響。例若累加器A原始內(nèi)容為00H,則:JNZL1;由于A的內(nèi)容為00H,所以程序往下執(zhí)行INCA;JNZL2;由于A的內(nèi)容已不為0,所以程序轉(zhuǎn)向L2處執(zhí)行

例:將外部數(shù)據(jù)RAM的一個數(shù)據(jù)塊傳送到內(nèi)部數(shù)據(jù)RAM,兩者的首址分別為DATA1和DATA2,遇到傳送的數(shù)據(jù)為零時停止。 解:外部RAM向內(nèi)部RAM的數(shù)據(jù)傳送一定要以累加器A作為過渡,利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止。完成數(shù)據(jù)傳送的參考程序如下:MOVR0,#DATA1;外部數(shù)據(jù)塊首址送R0MOVR1,#DATA2;內(nèi)部數(shù)據(jù)塊首址送R1LOOP:MOVXA,@R0;取外部RAM數(shù)據(jù)入AHERE:JZEND;數(shù)據(jù)為零則終止傳送MOV@R1,A;數(shù)據(jù)傳送至內(nèi)部RAM單元INCR0;修改地址指針,指向下一數(shù)據(jù)地址INCR1SJMPLOOP;循環(huán)取數(shù)2.比較轉(zhuǎn)移指令(4條)這組指令的功能是對指定的目的字節(jié)和源字節(jié)進(jìn)行比較,若它們的值不相等則轉(zhuǎn)移,轉(zhuǎn)移的目標(biāo)地址為當(dāng)前的PC值加3后,再加指令的第三字節(jié)偏移量rel;若目的字節(jié)的內(nèi)容大于源字節(jié)的內(nèi)容,則進(jìn)位標(biāo)志清0;若目的字節(jié)的內(nèi)容小于源字節(jié)的內(nèi)容,則進(jìn)位標(biāo)志置1;若目的字節(jié)的內(nèi)容等于源字節(jié)的內(nèi)容,程序?qū)⒗^續(xù)往下執(zhí)行。例子例如:當(dāng)P1口輸入為3AH時,程序繼續(xù)進(jìn)行,否則等待,直至P1口出現(xiàn)3AH。參考程序如下:MOVA,#3AH;立即數(shù)3A送A;743AWAIT:CJNEA,P1,WAIT;(P1)≠3AH,則等待,B590FD3.循環(huán)轉(zhuǎn)移指令(2條)DJNZRn,rel規(guī)則:(PC)←(PC)+2,(Rn)←(Rn)-1若(Rn)≠0,則(PC)←(PC)+rel轉(zhuǎn)移;若(Rn)=0則結(jié)束循環(huán),程序順序往下執(zhí)行。

注意:(Rn)要先減一,再判斷是否為零!DJNZdirect,rel

不同點:(P

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論