第4章-指令系統(tǒng)_第1頁(yè)
第4章-指令系統(tǒng)_第2頁(yè)
第4章-指令系統(tǒng)_第3頁(yè)
第4章-指令系統(tǒng)_第4頁(yè)
第4章-指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩92頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

234.1.1指令分類(lèi)4.1.2指令格式4.1.3指令字長(zhǎng)與周期4

51系列單片機(jī)能夠識(shí)別并執(zhí)行的指令有111條,這些指令構(gòu)成了單片機(jī)的指令系統(tǒng)。該指令系統(tǒng)的分類(lèi)方法有多種,主要包括按指令字長(zhǎng)分類(lèi)、按執(zhí)行時(shí)間分類(lèi)、按照指令功能分類(lèi)等,如表4-1所示。51內(nèi)核單片機(jī)指令分類(lèi)按指令字長(zhǎng)分類(lèi)單字節(jié)指令49條雙字節(jié)指令46條三字節(jié)指令16條按執(zhí)行時(shí)間分類(lèi)單機(jī)器周期指令64條雙機(jī)器周期指令45條四機(jī)器周期指令2條51內(nèi)核單片機(jī)指令分類(lèi)按指令功能分類(lèi)數(shù)據(jù)傳送指令29條算術(shù)運(yùn)算指令24條邏輯運(yùn)算指令24條位操作指令17條控制轉(zhuǎn)移指令17條表4-1指令分類(lèi)5

51系列單片機(jī)的匯編語(yǔ)言指令包含4個(gè)部分,各部分之間用分隔符分開(kāi)。指令格式如下:[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]例如:

LOOP:MOVA,#40H使用指令的注意事項(xiàng)如下:①[]項(xiàng)為可選項(xiàng)。6②

標(biāo)號(hào)由字母、數(shù)字和下劃線組成,且標(biāo)號(hào)的第一個(gè)字符必須是字母或下劃線。標(biāo)號(hào)不是必選項(xiàng),是否需要標(biāo)號(hào)由程序的結(jié)構(gòu)及運(yùn)行情況而定。③

操作碼也稱(chēng)為助記符,它規(guī)定本語(yǔ)句要執(zhí)行的操作。操作碼是匯編指令中唯一不能空缺的部分。⑤

操作數(shù)是指令執(zhí)行時(shí)需要的數(shù)據(jù),可以分為源操作數(shù)和目的操作數(shù),有時(shí)也可以沒(méi)有操作數(shù),如空操作指令NOP。7⑥

注釋不屬于語(yǔ)句的功能部分,用于解釋或說(shuō)明語(yǔ)句的功能以增加程序的可讀性。注釋內(nèi)容以分號(hào)“;”開(kāi)頭,操作數(shù)與注釋之間用分號(hào)“;”隔開(kāi)。如果指令同時(shí)需要目的操作數(shù)和源操作數(shù),指令格式如下:[標(biāo)號(hào):]操作碼[目的操作數(shù),][源操作數(shù)][;注釋]例如:

LOOP:ADDA,#50H;將A中的內(nèi)容加上立即數(shù)#50H,結(jié)果送入A中

④指令助記符或系統(tǒng)中的保留字不能用作標(biāo)號(hào)。⑦

分隔符用于分隔指令的各個(gè)部分。標(biāo)號(hào)之后用冒號(hào)“:”,操作碼與操作數(shù)之間用空格隔開(kāi),操作數(shù)與操作數(shù)之間用逗號(hào)“,”隔開(kāi)。8⑧

數(shù)據(jù)與地址的區(qū)分:在51系列單片機(jī)匯編語(yǔ)言中,數(shù)據(jù)的出現(xiàn)以“#”開(kāi)始,地址前面沒(méi)有“#”符號(hào),二者的數(shù)值部分可以是0~9,A~F的合適組合(在數(shù)據(jù)范圍內(nèi)),若以字母開(kāi)頭,則需要在字母前添加一個(gè)“0”,例如,#40H,#46H,#0A0H等都是數(shù)據(jù);40H,46H,0AH等是指地址而不是數(shù)據(jù),這些地址是單片機(jī)內(nèi)部存儲(chǔ)單元的地址,在這些存儲(chǔ)單元中可以存放數(shù)據(jù)。指令字長(zhǎng)是指存儲(chǔ)這條指令所占用的存儲(chǔ)單元的個(gè)數(shù)。51系列單片機(jī)采用變字長(zhǎng)指令方式,按8位二進(jìn)制數(shù)為一個(gè)字長(zhǎng),可分為單字節(jié)、雙字節(jié)、三字節(jié)3種,在存儲(chǔ)單元中分別占1~3個(gè)單元(51內(nèi)核單片機(jī)內(nèi)部存儲(chǔ)器一個(gè)單元為8位)。指令周期是指執(zhí)行這條指令需要的時(shí)間。目前,51系列單片機(jī)的指令執(zhí)行周期主要有單機(jī)器周期、雙機(jī)器周期和四機(jī)器周期3種情況。例如:NOP為單字節(jié),單機(jī)器周期指令。DIV為單字節(jié),四機(jī)器周期指令。

不同指令它們占有的字節(jié)數(shù)不同,執(zhí)行需要的時(shí)間不一樣。但指令所占的字節(jié)數(shù)與執(zhí)行所需要的機(jī)器周期數(shù)無(wú)必然的內(nèi)在聯(lián)系。當(dāng)我們需要知道具體指令占有的字節(jié)數(shù)與執(zhí)行需要的時(shí)間數(shù)時(shí),可以去查詢(xún)單片機(jī)指令字節(jié)數(shù)與周期數(shù)(見(jiàn)配套書(shū)本附錄二)9104.2.1直接尋址4.2.2立即尋址4.2.3寄存器尋址4.2.4寄存器間接尋址4.2.5變址尋址4.2.6相對(duì)尋址4.2.7位尋址11

在指令中直接給出操作數(shù)所在的單元地址或位地址,這種尋址方式稱(chēng)為直接尋址。指令中的操作數(shù)是所需數(shù)據(jù)的地址,真正的數(shù)據(jù)存放于此地址中。例如:MOVA,25H;將內(nèi)部RAM中地址為25H單元的內(nèi)容送入累加器AMOVP0,#45H;將立即數(shù)送入直接尋址的特殊功能寄存器P0中MOV30H,20H;將內(nèi)部RAM中地址為20H單元的內(nèi)容送入30H單元直接尋址方式可以訪問(wèn)單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器的低128個(gè)字節(jié)單元(00H~7FH)和特殊功能寄存器(80~FFH)。采用直接尋址方式訪問(wèn)特殊功能寄存器時(shí),可以用直接地址,也可以用寄存器名。例如,指令“MOVA,0D0H”與“MOVA,PSW”功能相同。PSW的物理地址就是0D0H(以字母A~F開(kāi)頭的十六進(jìn)制數(shù)均需加前導(dǎo)0)。1213特殊功能寄存器中的累加器A可表示成A、ACC或0E0H,它們雖然分屬不同的尋址方式,但都是指累加器ACC。例如:INCA ;寄存器尋址,累加器A中的內(nèi)容自動(dòng)加1INCACC ;直接尋址方式,累加器A中的內(nèi)容自動(dòng)加1INC0E0H ;直接尋址方式,累加器A中的內(nèi)容自動(dòng)加1上述3條指令的執(zhí)行結(jié)果相同。

立即尋址方式是指操作數(shù)包含在指令中。這樣的操作數(shù)稱(chēng)為立即數(shù)。立即數(shù)前面要加“#”,一般占用1個(gè)或2個(gè)字節(jié)。例如:MOVR0,#30H;將立即數(shù)#30H送入R0MOVDPTR,#2000H;將立即數(shù)#2000H送入DPTR14

寄存器尋址是指將指令需要的數(shù)據(jù)存放在寄存器中,而不是放在位地址或用戶RAM區(qū)。例如,操作數(shù)放在寄存器R0~R7、累加器A、寄存器B、數(shù)據(jù)指針DPTR或布爾處理器的位累加器Cy等寄存器中。

例如:MOVA,R1;將寄存器R1中的數(shù)據(jù)送入累加器A數(shù)據(jù)傳送前,若R1中的數(shù)據(jù)是#02H,A中的數(shù)據(jù)是#55H,傳送后累加器A中的數(shù)據(jù)將會(huì)被R1中的數(shù)據(jù)覆蓋,變成#02H,如圖4-1所示。圖4-1寄存器尋址15

寄存器間接尋址是以某個(gè)寄存器中的內(nèi)容作為地址去尋找操作數(shù)。在該尋址方式中,尋址內(nèi)部RAM區(qū)的低128個(gè)字節(jié)單元時(shí),需要使用寄存器R0,R1作為間接尋址寄存器。尋址外部64K的RAM區(qū)時(shí),可以使用16位寄存器DPTR作為間接尋址寄存器,也可以采用R0或R1作為低8位地址、P2口指定高8位地址的方式。寄存器用于間接尋址方式時(shí),需要在寄存器前加上@符號(hào);寄存器間接尋址方式不能對(duì)特殊功能寄存器(SFR)進(jìn)行尋址。堆棧操作指令也是間接尋址方式,但它使用堆棧指針SP作為間接尋址寄存器。注意16

例如:MOVA,@R0本指令采用了寄存器間接尋址方式,所以,參與運(yùn)算的數(shù)據(jù)不是直接給出的,而是需要根據(jù)寄存器R0中的地址找到數(shù)據(jù)。指令的執(zhí)行過(guò)程如下:

(1)到寄存器R0中尋找數(shù)據(jù)#40H(見(jiàn)圖4-2)。(2)以40H為地址,到該地址對(duì)應(yīng)的存儲(chǔ)單元去尋找數(shù)據(jù),此時(shí)找到數(shù)據(jù)#10H。(3)將數(shù)據(jù)#10H送入累加器A中,覆蓋掉原先的數(shù)據(jù)#55H。#10H才是累加器A最終要尋址的數(shù)據(jù)。圖4-2寄存器間接尋址17該尋址方式可以訪問(wèn)程序存儲(chǔ)器中的數(shù)據(jù)表格,它以程序指針PC或數(shù)據(jù)指針DPTR作為基址寄存器,累加器A作為變址寄存器,二者相加得到操作數(shù)的地址,再按此地址尋址并讀取操作數(shù)。(1)以程序指針PC作為基址寄存器的指令,例如:

MOVCA,@A+PC該指令執(zhí)行時(shí),將程序指針PC指向的下一條指令的開(kāi)始地址加上累加器A中的內(nèi)容作為新的地址,以此地址尋找數(shù)據(jù),并將數(shù)據(jù)存入累加器A中。(2)以程序指針DPTR作為基址寄存器的指令,例如:MOVCA,@A+DPTR上述指令執(zhí)行時(shí),先將數(shù)據(jù)指針DPTR的內(nèi)容加上累加器A的內(nèi)容作為新的地址,并以此地址尋找數(shù)據(jù),將找到的數(shù)據(jù)存入累加器A中。18

①將累加器A中的數(shù)據(jù)#00H與DPTR中的內(nèi)容相加,即使#00H+1000H=1000H。②將①中得到的1000H作為地址,到該地址中找到數(shù)據(jù)#11H。③將數(shù)據(jù)#11H傳送至累加器A中,覆蓋累加器A中先前的數(shù)據(jù)。圖4-3變址尋址19該指令的執(zhí)行過(guò)程可以分為以下3步(見(jiàn)圖4-3):在執(zhí)行“MOVCA,@A+DPTR”指令的過(guò)程中,數(shù)據(jù)指針DPTR一直指向數(shù)據(jù)表格的開(kāi)頭(即首地址1000H)保持不變。

當(dāng)累加器A中的數(shù)據(jù)不斷從#00H變成#01H,#02H,#03H,#04H,#05H,#06H,#07H時(shí),累加器A與DPTR所指地址(1000H)之和將會(huì)不斷地從1000H變成1001H,1002H……1007H,從而可以從這些不斷變化的地址單元中取得新的數(shù)據(jù)#11H,#22H……#88H,然后再將這些數(shù)據(jù)分別送入累加器A中進(jìn)行處理。20相對(duì)尋址方式通常出現(xiàn)在相對(duì)轉(zhuǎn)移指令中,尋址不是尋找操作數(shù)的地址,而是要得到程序的轉(zhuǎn)移地址PC的值。這種尋址方式是以PC的值加上指令中給定的偏移量形成新的轉(zhuǎn)移地址。

一般將相對(duì)轉(zhuǎn)移指令操作碼所在的地址稱(chēng)為源地址,轉(zhuǎn)移后的地址稱(chēng)為目的地址,目的地址是這樣計(jì)算出來(lái)的::

目的地址=源地址+2(相對(duì)轉(zhuǎn)移指令字節(jié)數(shù))+偏移量rel例如:SJMP08H;PC+2+08H→PC21指令中的操作數(shù)為8位二進(jìn)制數(shù)中的某一位,這種尋址方式稱(chēng)為位尋址。51單片機(jī)指令系統(tǒng)中,操作數(shù)不僅可以是字節(jié),也可以是一個(gè)二進(jìn)制位。把一個(gè)二進(jìn)制位作為操作數(shù)時(shí),這個(gè)操作數(shù)的地址稱(chēng)為位地址。位尋址區(qū)包括內(nèi)部RAM中的兩個(gè)區(qū)域:(1)內(nèi)部RAM中地址為20H~2FH的16個(gè)RAM單元,共128個(gè)位,位地址為00H~7FH。位地址可用直接地址或單元地址加位地址的方式表示。例如,“MOVC,7AH”與“MOVC,2FH.2”功能相同。(2)特殊功能寄存器SFR中可供位尋址的專(zhuān)用寄存器有11個(gè),共有83個(gè)位可進(jìn)行位尋址操作,這些地址在指令中有4種表示方式。22例如,訪問(wèn)程序狀態(tài)字PSW中的輔助進(jìn)位位AC可采用以下4種方式:

MOVC,0D6H ;位地址表示法MOVC,AC ;位名稱(chēng)表示法MOVC,0D0H.6H ;單元地址加位的表示法MOVC,PSW.6 ;專(zhuān)用寄存器符號(hào)加位的表示法這4條指令的執(zhí)行結(jié)果是一樣的。51單片機(jī)中,對(duì)外部I/O口的操作和對(duì)數(shù)據(jù)存儲(chǔ)器的操作是完全一樣的,因?yàn)橥獠繑?shù)據(jù)存儲(chǔ)器與I/O口是統(tǒng)一編址的。例如,在指令中使用P1.0來(lái)表示P1口的第0位,此種表示方式也屬于位尋址的范疇。23244.3.1寄存器及數(shù)據(jù)說(shuō)明4.3.2數(shù)據(jù)傳送類(lèi)指令4.3.3算術(shù)運(yùn)算類(lèi)指令4.3.4邏輯運(yùn)算類(lèi)指令4.3.5控制轉(zhuǎn)移類(lèi)指令4.3.6位操作類(lèi)指令4.3.7偽指令25指令中常用標(biāo)號(hào)的表示方式如下:Rn:當(dāng)前選定的寄存器區(qū)中的8個(gè)工作寄存器R0~R7。Ri:當(dāng)前選定的寄存器R0或R1。direct:

8位內(nèi)部RAM單元的地址。它可以是內(nèi)部RAM(00H~7FH)地址,也可以是特殊功能寄存器地址。#data:指令中的8位常數(shù)。#data16:指令中的16位常數(shù)。#addr11:

11位目的地址,用于AJMP和ACALL指令。該目的地址與下一條指令的地址距離必須保持在2KB范圍內(nèi)。#data16:

16位目的地址,用于LJMP和LCALL指令,該目的地址可指向64KB范圍的程序存儲(chǔ)器地址空間。rel:

8位帶符號(hào)的偏移量,用于SJMP和所有條件轉(zhuǎn)移指令中。偏移量的取值范圍是-128~+127,即跳轉(zhuǎn)的目標(biāo)地址與下一條指令的開(kāi)始地址之間的距離應(yīng)在這一范圍內(nèi)。26bit:內(nèi)部數(shù)據(jù)RAM或特殊功能寄存器中的可直接尋址位。DPTR:數(shù)據(jù)指針,可用做16位的地址寄存器。A:累加器。B:乘除法寄存器,主要用于MUL和DIV指令中。C:進(jìn)位標(biāo)志位。@:間接尋址寄存器或基址寄存器的前綴,如@Ri。/::位操作數(shù)的前綴,表示對(duì)該位取反。(X):X中的內(nèi)容。((X)):由X尋址的單元中的內(nèi)容?!杭^左邊的內(nèi)容需要被箭頭右邊的內(nèi)容所取代。$:當(dāng)前指令存放的地址。27該類(lèi)指令是指令系統(tǒng)中使用最為頻繁的一類(lèi)指令,它主要用于數(shù)據(jù)的保存及交換等場(chǎng)合。1.?dāng)?shù)據(jù)傳送到累加器A的指令該組指令的作用是將源操作數(shù)的內(nèi)容送入累加器A,指令有以下4種格式:MOVA,R0MOVA,direct ;direct為直接尋址,如40H,5FHMOVA,@Ri ;Ri代表R0或R1MOVA,#data ;#data表示立即數(shù),如#8表示十進(jìn)制數(shù)8,#55H表示十六進(jìn)制數(shù)2.?dāng)?shù)據(jù)傳送到工作寄存器Rn的指令該組指令的作用是將源操作數(shù)的內(nèi)容送入寄存器Rn,指令格式如下:MOVRn,AMOVRn,directMOVRn,#data注:其中n代表0~7。283.?dāng)?shù)據(jù)傳送到內(nèi)部RAM單元或特殊功能寄存器的指令該組指令的功能是將源操作數(shù)的內(nèi)容送入內(nèi)部RAM單元或特殊功能寄存器中。指令格式如下:MOVdirect,AMOVdirect,RnMOVdirect,directMOVdirect,@RiMOVdirect,#dataMOV@Ri,AMOV@Ri,directMOV@Ri,#dataMOVDPTR,#data1629例如,“MOV20H,@R1”是將寄存器間接尋址得到的數(shù)據(jù)送入20H單元中。4.累加器A與外部數(shù)據(jù)存儲(chǔ)器之間的傳送指令這組指令的功能是在累加器A與外部數(shù)據(jù)存儲(chǔ)器或I/O口之間進(jìn)行數(shù)據(jù)傳送。指令格式如下:MOVXA,@DPTRMOVXA,@RiMOVX@DPTR,AMOVX@Ri,A前兩條指令執(zhí)行時(shí),P3.7引腳輸出的“/RD”有效信號(hào)用作外部數(shù)據(jù)存儲(chǔ)器的“讀”選通信號(hào);后兩條指令執(zhí)行時(shí),P3.6引腳輸出的“/WR”有效信號(hào)用作外部數(shù)據(jù)存儲(chǔ)器的“寫(xiě)”選通信號(hào)。DPTR為16位數(shù)據(jù)指針,使用@DPTR進(jìn)行間接尋址時(shí)可訪問(wèn)64KB范圍的外部RAM。尋址時(shí),16位地址的高8位地址由P2口輸出,低8位地址由P0口輸出,數(shù)據(jù)通過(guò)P0口讀入或?qū)懗?。例如,“MOVX@DPTR,A”和“MOVXA,@DPTR”指令均使用P0口和P2口共同完成尋址操作。指令“MOVX@Ri,A”在使用@Ri進(jìn)行片外數(shù)據(jù)存儲(chǔ)器間接尋址時(shí),P0口分時(shí)輸出Ri指定的8位地址信息和8位數(shù)據(jù)信息,P2口輸出高8位地址,這種情況下P2口可以事先預(yù)置。30【例4-1】將片外RAM中50H單元中的數(shù)據(jù)送到片外RAM的1000H單元。先將#50H賦值給R1,再將A中的數(shù)據(jù)通過(guò)寄存器間接尋址方式送入外部RAM的50H單元中,接下來(lái)把50H單元中的數(shù)據(jù)通過(guò)變址尋址方式送入外部存儲(chǔ)器1000H單元中。外部數(shù)據(jù)存儲(chǔ)器單元之間不能直接進(jìn)行數(shù)據(jù)的傳輸。在CPU不知情的情況下,外部存儲(chǔ)器單元之間直接完成數(shù)據(jù)的傳送,這樣對(duì)于系統(tǒng)來(lái)說(shuō)是很不安全的。因此,要先將外部數(shù)據(jù)單元的數(shù)據(jù)傳輸?shù)絻?nèi)部累加器A,然后通過(guò)累加器A再將數(shù)據(jù)傳輸?shù)搅硪粋€(gè)外部數(shù)據(jù)存儲(chǔ)單元中。31【例4-1】將片外RAM中50H單元中的數(shù)據(jù)送到片外RAM的1000H單元。

【參考代碼】;*********************************************************************;程序功能:將外部數(shù)據(jù)存儲(chǔ)器中的50H單元中的數(shù)據(jù)傳送給;外部數(shù)據(jù)存儲(chǔ)器的1000H單元;注意:

;********************************************************************* ORG0000H ;程序開(kāi)始 SJMPMAINMAIN: 32【例4-1】將片外RAM中50H單元中的數(shù)據(jù)送到片外RAM的1000H單元。MOVP2,#00H ;P2口作為外部數(shù)據(jù)存儲(chǔ)器尋址的高8位地址口使用MOVR1,#50H ;給R1賦值,該值為要訪問(wèn)的外部數(shù)據(jù)存儲(chǔ)器單元地址MOVA,#01H ;給累加器A賦初始值#01HMOVX@R1,A ;將累加器中的數(shù)據(jù)送給外部數(shù)據(jù)存儲(chǔ)器50H地址單元保存CLR A ;將累加器A中的內(nèi)容清0,以便后面使用MOVXA,@R1 ;將外部數(shù)據(jù)存儲(chǔ)50H單元中的數(shù)據(jù)讀入到內(nèi)部累加器A中MOVDPTR,#1000H ;將外部數(shù)據(jù)存儲(chǔ)器1000H單元地址賦給DPTR寄存器MOVX@DPTR,A ;將累加器中的數(shù)據(jù)#01H寫(xiě)入外部數(shù)據(jù)存儲(chǔ)器1000H中SJMPMAIN ;返回主程序END ;匯編結(jié)束33指令執(zhí)行后,外部存儲(chǔ)器50H單元和1000H單元中的數(shù)據(jù)均為01H,如圖4-4和圖4-5所示。這說(shuō)明片外數(shù)據(jù)存儲(chǔ)單元之間的數(shù)據(jù)成功傳送了。圖4-4外部數(shù)據(jù)存儲(chǔ)器50H單元的數(shù)據(jù)為“01H”圖4-5外部數(shù)據(jù)存儲(chǔ)器1000H單元地址中的數(shù)據(jù)為“01H”345.堆棧操作指令符合“先進(jìn)后出,后進(jìn)先出”存放規(guī)則的區(qū)域稱(chēng)之為“堆?!?。在51單片機(jī)的內(nèi)部RAM中,也可以構(gòu)造出這樣一個(gè)“先進(jìn)后出”的區(qū)域用來(lái)存放某一數(shù)據(jù)區(qū)的地址,或者用來(lái)存放需要臨時(shí)保存的中間數(shù)據(jù)。堆棧在使用時(shí),需要用堆棧指針SP指向堆棧的棧頂以便進(jìn)行入棧和出棧操作。指令格式如下:PUSHdirect ;將direct地址中的數(shù)據(jù)壓入堆棧POPdirect ;將堆棧中的數(shù)據(jù)彈出到direct地址當(dāng)中堆棧操作的執(zhí)行過(guò)程如下:

入棧時(shí),首先將堆棧指針SP加1,然后將直接地址direct所指向的內(nèi)容送入SP所指向的內(nèi)部RAM單元。

出棧時(shí),將SP所指向的內(nèi)部RAM單元的內(nèi)容送入由直接地址指向的字節(jié)單元中,然后將堆棧指針SP減1。

51單片機(jī)的堆棧增長(zhǎng)方向?yàn)橄蚋叩刂吩鲩L(zhǎng),因此在設(shè)置堆棧時(shí),要注意堆棧的棧頂不要超出用戶RAM區(qū)從而到達(dá)低地址的特殊功能寄存器區(qū)。注意356.程序存儲(chǔ)器內(nèi)容讀指令這組指令可以查詢(xún)存放在程序存儲(chǔ)器中的常數(shù)表格。指令格式如下:MOVCA,@A+PCMOVCA,@A+DPTR第一條指令是以PC作為基址寄存器,把累加器A中的無(wú)符號(hào)數(shù)與PC相加后得到一個(gè)16位地址,然后將該地址指向的程序存儲(chǔ)器單元的內(nèi)容送入累加器A。這條指令的優(yōu)點(diǎn)是不改變PC及特殊功能寄存器的值,只要根據(jù)累加器A的內(nèi)容就可以取出數(shù)據(jù);缺點(diǎn)是表格只能存放在該條查表指令后面的256個(gè)單元內(nèi),表格的大小受到限制,而且表格只能被一段程序所使用。第二條指令是以DPTR作為基址寄存器,把累加器A中的無(wú)符號(hào)數(shù)與DPTR相加后得到一個(gè)16位的地址,然后將該地址指向的程序存儲(chǔ)單元的內(nèi)容送到累加器A。這條指令的執(zhí)行結(jié)果與指針DPTR及累加器A有關(guān),與該指令存放的地址無(wú)關(guān)。因此,表格的大小和位置可以在64KB程序存儲(chǔ)器范圍內(nèi)任意安排,并且一個(gè)表格可以為多個(gè)程序塊所共用。36例如,已知累加器A中有一個(gè)0~9范圍的數(shù),編寫(xiě)程序,要求通過(guò)查表指令求這個(gè)數(shù)的平方值(設(shè)平方表表頭地址為2000H)。(1)用DPTR作為基址寄存器。MOV DPTR,#2000HMOVC A,@A+DPTRORG 2000H ;提示下一條指令從2000H地址開(kāi)始DB 0,1,4,9,16 ;開(kāi)辟10個(gè)存儲(chǔ)單元作為表格,存儲(chǔ)平方值DB 25,36,49,64,81程序存儲(chǔ)器內(nèi)的數(shù)據(jù)存儲(chǔ)情況如圖4-6所示。37圖4-6程序存儲(chǔ)器2000H單元之后的數(shù)據(jù)(2)用PC作為基址寄存器。ORG 1FFBHADD A,#data ;把偏移量#data送入累加器AMOVC A,@A+PC SJMP $DB 0,1,4,9,16 ;開(kāi)辟10個(gè)存儲(chǔ)單元作為表格,存儲(chǔ)平方值DB 25,36,49,64,81END程序在程序存儲(chǔ)器中的存儲(chǔ)情況如圖4-7所示。38圖4-7程序在程序存儲(chǔ)器中存儲(chǔ)情況修正量“#data”與指令“MOVCA,@A+PC”所在位置及它后面的指令占用的字節(jié)數(shù)有關(guān)。本例中,查表指令所在的存儲(chǔ)單元地址為1FFDH,執(zhí)行該指令后,PC值為1FFEH,故修正量#data=表頭首地址?PC當(dāng)前值=2000H?1FFEH=02H(SJMP為2字節(jié)指令)。由于累加器A中數(shù)據(jù)為8位無(wú)符號(hào)數(shù),因此,查表指令在存儲(chǔ)器中的位置與備查表格在同一頁(yè)(00H~0FFH)。7.字節(jié)交換指令這組指令的功能是交換源操作數(shù)和目的操作數(shù)的指定位。指令格式如下:XCHA,RnXCHA,@RiXCHA,directXCHDA,@RiSWAPA前3條指令的功能是將A中的內(nèi)容與源操作數(shù)的內(nèi)容相互交換;后兩條指令是半字節(jié)交換指令,XCHD是將累加器A的低4位與Ri所指向的內(nèi)部RAM單元的低4位相互交換,二者的高4位保持不變;SWAP指令是將累加器A的高4位與低4位進(jìn)行交換。39算術(shù)運(yùn)算指令可以實(shí)現(xiàn)加、減、乘、除、增量、減量、二—十進(jìn)制調(diào)整操作。這類(lèi)指令支持8位無(wú)符號(hào)數(shù)操作,也支持帶符號(hào)數(shù)的運(yùn)算。帶符號(hào)數(shù)的操作是對(duì)操作數(shù)進(jìn)行補(bǔ)碼運(yùn)算,其結(jié)果會(huì)影響到程序狀態(tài)字PSW中的標(biāo)志位。1.加法指令(1)不帶進(jìn)位加法指令該指令的功能是將源操作數(shù)與累加器A中的內(nèi)容相加,結(jié)果保存到累加器A中。指令格式如下:ADDA,RnADDA,directADDA,@RiADDA,#data該指令的運(yùn)算結(jié)果影響PSW標(biāo)志位。40(2)帶進(jìn)位加法指令該指令的功能是將源操作數(shù)與累加器A中的內(nèi)容相加,再加上進(jìn)位標(biāo)志位Cy,最后將結(jié)果放入累加器A中。該組指令會(huì)影響到PSW標(biāo)志位。指令格式如下:ADDCA,RnADDCA,directADDCA,@RiADDCA,#data41(3)增量指令該指令的功能是將指定的操作數(shù)的內(nèi)容加1,這組指令不影響任何標(biāo)志位。指令格式如下:INCAINCRnINCdirectINC@RiINCDPTR若操作數(shù)是0FFH,則加1后將產(chǎn)生溢出,操作數(shù)的內(nèi)容變成00H,但溢出不會(huì)影響標(biāo)志位。最后一條指令是對(duì)16位數(shù)據(jù)指針寄存器DPTR執(zhí)行加1操作,指令執(zhí)行時(shí),先對(duì)低8位指針DPL的內(nèi)容加1,如果產(chǎn)生溢出,就對(duì)高8位指針DPH加1。42(4)二一十進(jìn)制調(diào)整指令該指令的功能是對(duì)累加器A中的參與BCD碼加法操作的8位運(yùn)算結(jié)果進(jìn)行十進(jìn)制調(diào)整,調(diào)整結(jié)果為壓縮型BCD碼。指令格式如下:

DAA指令的執(zhí)行過(guò)程為先判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為1,若兩者有一個(gè)條件滿足,則低4位的值加上6;同樣,判斷A中的高4位是否大于9或者進(jìn)位標(biāo)志位Cy是否為1,若兩者有一個(gè)條件滿足,則高4位的值加上6。43

進(jìn)行上述調(diào)整的原因是:十進(jìn)制數(shù)逢十進(jìn)一,而十六進(jìn)制數(shù)逢十六進(jìn)一,兩種數(shù)制相差為6,因此在用BCD碼(4位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù))進(jìn)行運(yùn)算時(shí)需要調(diào)整。注意例如:有兩個(gè)BCD數(shù)36與45相加,結(jié)果應(yīng)為BCD碼81,程序如下:MOVA,#36HADDA,#45HDAA加法過(guò)程如下:00110110[36H]+01000101[45H]--------------------------------------01111011[7BH]DAA指令對(duì)上述結(jié)果進(jìn)行調(diào)整:01111011[7BH]+00000110[06H]----------------------------------------10000001[81H]

此為BCD碼相加的真正結(jié)果。44使用時(shí)需要注意,該指令只能跟在加法指令后,對(duì)加法結(jié)果進(jìn)行調(diào)整,不能對(duì)減法指令的結(jié)果進(jìn)行調(diào)整。指令執(zhí)行結(jié)果不影響溢出標(biāo)志位。2.減法指令(1)帶進(jìn)位減法指令該組指令的功能是將累加器A中的內(nèi)容與第二操作數(shù)及借位標(biāo)志位相減,結(jié)果送回到累加器A中。該組指令會(huì)影響到PSW寄存器中的借位標(biāo)志位Cy、輔助進(jìn)位標(biāo)志位AC和溢出標(biāo)志位OV。指令格式如下:SUBBA,RnSUBBA,directSUBBA,@RiSUBBA,#data在執(zhí)行減法的過(guò)程中,如果位7有借位,則Cy置1,否則Cy清0;如果位3有借位,則AC置1,否則AC清0;如果位6、位7中任意一位有借位,則溢出標(biāo)志位置1,否則OV清0。45若要進(jìn)行不帶借位的減法操作,必須先將Cy清0。

例如:MOV A,#49H

SUBB A,#58H上述指令實(shí)現(xiàn)的功能是A=49H?58H?Cy,假設(shè)指令執(zhí)行前Cy=0,指令執(zhí)行后,A的值是0F1H。因?yàn)楸纠a(chǎn)生了借位,所以指令執(zhí)行后Cy=1。46(2)減1指令該組指令的功能是將操作數(shù)的內(nèi)容減1。指令格式如下:DECADECRnDECdirectDEC@Ri若操作數(shù)為00H,則減1后產(chǎn)生溢出,使得操作數(shù)變成0FFH。該指令與INC指令一樣不影響任何標(biāo)志位。3.乘法指令該指令完成單字節(jié)的乘法操作。指令格式如下:MULAB執(zhí)行時(shí),將累加器A中的內(nèi)容與寄存器B中的內(nèi)容相乘,乘積的低8位送入累加器A,高8位送入寄存器B中;如果乘積超過(guò)0FFH,則溢出標(biāo)志位OV置1,否則清0,進(jìn)位標(biāo)志位Cy總是被清零。474.除法指令該指令完成單字節(jié)的除法操作。指令格式如下:

DIV

AB執(zhí)行時(shí),將累加器A中的數(shù)據(jù)除以寄存器B中的8位無(wú)符號(hào)整數(shù),所得商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中。執(zhí)行后,進(jìn)位標(biāo)志位Cy和溢出標(biāo)志位OV清0。若執(zhí)行該指令前,B中的值為0,則執(zhí)行后A與B中的內(nèi)容不定,且溢出標(biāo)志位OV置1。在任何情況下,進(jìn)位標(biāo)志位Cy總是被清0。48邏輯運(yùn)算類(lèi)指令包括與、或、非、異或、取反、左右移動(dòng)等操作。1.簡(jiǎn)單邏輯操作指令CLR A

;清除累加器A中的數(shù)據(jù)CPL A

;對(duì)累加器A按位取反RL A

;將累加器A中的內(nèi)容左移1位RLC A

;將累加器A中的內(nèi)容帶進(jìn)位標(biāo)志左環(huán)移動(dòng)1位,影響C標(biāo)志RR A

;將累加器A中的內(nèi)容向右環(huán)移1位RRC A

;將累加器A中的內(nèi)容帶進(jìn)位標(biāo)志位向右環(huán)移1位,影響C標(biāo)志

移位指令中的移位方式如圖4-8(下頁(yè))所示。49RLRRRLCRRC圖4-8邏輯移動(dòng)指令示意圖50其中,RL指令是將b0~b7這8位數(shù)據(jù)循環(huán)左移一位,移動(dòng)過(guò)程如下:將b0中的數(shù)據(jù)移至b1,b1中的數(shù)據(jù)移至b2,依此類(lèi)推,b7中的數(shù)據(jù)移至b0。RR指令是將b0~b7循環(huán)右移一位,移動(dòng)過(guò)程與RL指令類(lèi)似,方向相反。RLC指令是將Cy,b0~b7共9位數(shù)據(jù)循環(huán)左移一位,Cy中的數(shù)據(jù)移至b0,b0中的數(shù)據(jù)移至b1,依此類(lèi)推,b7中的數(shù)據(jù)移至Cy。RRC是將Cy,b0~b7共9位數(shù)據(jù)循環(huán)右移一位,移動(dòng)過(guò)程與RL指令類(lèi)似,方向相反。

2.邏輯與操作指令(按位進(jìn)行與)該組指令完成兩個(gè)操作數(shù)的按位“與”操作,指令格式如下:ANL A,RnANL A,directANL A,@RiANL A,#dataANL direct,AANL direct,#data51前4條指令是以累加器A為目的操作數(shù)的邏輯與指令。指令功能是將累加器A中的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯與操作,并將結(jié)果送累加器A。后兩條指令是以direct為目的地址的邏輯與指令。指令功能是將direct地址單元的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯與操作,并將結(jié)果送direct地址單元。在實(shí)際應(yīng)用中,若希望屏蔽目的操作數(shù)的某些位,可以把這些位和0相與;若希望某些位保持不變,就可以和1相與。例如,若40H單元存放的是9的ASCII碼值39H,希望將40H單元的內(nèi)容變?yōu)?的BCD碼,此時(shí)只需執(zhí)行指令“ANL39H,#0FH”,將39H的高四位屏蔽,低四位分別與1完成與操作,即可使40H單元的內(nèi)容變?yōu)?9H,即9的BCD碼。5253【例4-2】將片內(nèi)RAM的30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)RAM的40H單元中。將兩位壓縮BCD碼轉(zhuǎn)換成十進(jìn)制數(shù),其算法為:(A1A0)BCD=A1*10+A0。如令A(yù)1A0為#75H(注:因?yàn)槭荁CD碼,所以每位數(shù)的取值范圍應(yīng)在0~9之間),則轉(zhuǎn)換為十進(jìn)制時(shí)應(yīng)為(75)BCD=7×10+5=75,結(jié)果送入40H單元時(shí)自動(dòng)轉(zhuǎn)成十六進(jìn)制格式4BH?!緟⒖即a】;********************************************************************;BCD碼轉(zhuǎn)換成十進(jìn)制數(shù)的算法;********************************************************************54【例4-2】將片內(nèi)RAM的30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)RAM的40H單元中。

ORG0000HSTART:MOV30H,#75H ;將兩位BCD碼“#75H”送到RAM的30H單元中MOVA,30H ;取2位BCD壓縮碼A1A0送AANLA,#0F0H ;取高4位BCD碼A1SWAPA ;高4位與低4位換位MOVB,#0AH ;將二進(jìn)制10送入BMULAB ;將10乘A送入A中

55【例4-2】將片內(nèi)RAM的30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)RAM的40H單元中。MOVR0,A ;結(jié)果送入R0中保存MOVA,30H ;再取兩位BCD碼A1A0送AANLA,#0FH ;取低4位BCD碼A0ADDA,R0 ;求和10乘A1+A0MOV40H,A ;結(jié)果送入40H中保存SJMP$ ;原地踏步END程序運(yùn)行后的結(jié)果如圖4-9所示。56圖4-9數(shù)據(jù)存儲(chǔ)器RAM中30H與40H單元中數(shù)據(jù)3.邏輯或操作指令(按位或)該組指令完成兩個(gè)操作數(shù)的按位“或”操作,指令格式如下:ORLA,RnORLA,directORLA,@RiORLA,#dataORLdirect,AORLdirect,#data前4條指令是以累加器A為目的操作數(shù)的邏輯或指令。指令功能是將累加器A中的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯或操作,并將結(jié)果送累加器A。后兩條指令是以direct為目的地址的邏輯或指令。指令功能是將direct地址單元的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯或操作,并將結(jié)果送direct地址單元。57在實(shí)際應(yīng)用中,若希望將某一位置1,就可以將該位與1進(jìn)行或運(yùn)算;若希望保持某些位不變,就可以將其與0進(jìn)行或運(yùn)算。利用或運(yùn)算指令的這個(gè)特性,我們可以進(jìn)行一些信號(hào)量的合并。例如,將片內(nèi)40H單元的高四位值賦給P1口的高4位,但不能修改P1口的低四位值。首先可以用邏輯與指令將40H單元中的低四位和P1口的高四位屏蔽掉,然后用邏輯或指令將修改后的40H單元的值和P1的值進(jìn)行合并。代碼如下:MOVA,40HANLA,#0F0H ;A與0F0H按位“與”,使A的低4位變成0ANLP1,#0FH ;P1與0FH按位“與”,使P1的高4位變成0ORLP1,A ;A與P1按位“或”,完成對(duì)P1的高4位賦值584.邏輯異或指令(按位異或)該組指令完成兩個(gè)操作數(shù)的按位“異或”操作,指令格式如下:XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data前4條指令是以累加器A為目的操作數(shù)的邏輯異或指令。指令的功能是將累加器A的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位“異或”操作,并將結(jié)果送入累加器A。后兩條是以direct為目的地址的邏輯異或指令。指令的功能是將direct地址單元的內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位“異或”操作,并將結(jié)果送入direct地址單元。59異或指令常被用來(lái)判斷兩數(shù)是否相等或?qū)?shù)值進(jìn)行部分取反操作。例如,判斷累加器A的內(nèi)容是否為08H,如果是,則程序跳轉(zhuǎn)到LOOP1程序段。語(yǔ)句如下:XRLA,#08H;異或指令執(zhí)行08H⊕08H,指令完成后A中內(nèi)容為0JZ

LOOP1;根據(jù)A中內(nèi)容進(jìn)行跳轉(zhuǎn),若A為0,則程序跳轉(zhuǎn)至LOOP1程序段60邏輯異或:兩數(shù)異或,相同為0,不同為1。即0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1。從運(yùn)算結(jié)果看,與0異或,數(shù)值不變;與1異或,數(shù)值取反。控制轉(zhuǎn)移類(lèi)指令通過(guò)改變程序計(jì)數(shù)器PC的值達(dá)到控制程序走向的目的,其作用區(qū)間為程序存儲(chǔ)器空間。51單片機(jī)提供了豐富的控制轉(zhuǎn)移類(lèi)指令,因而編程相當(dāng)靈活方便。(1)短跳轉(zhuǎn)指令該指令為無(wú)條件跳轉(zhuǎn)指令,跳轉(zhuǎn)地址距離下一條指令的起始地址必須在2KB范圍內(nèi)。指令格式如下:AJMPaddr11執(zhí)行該指令時(shí),先將PC加2,然后將addr11送入PC的低11位,PC的高5位保持不變,這樣得到的PC值即為跳轉(zhuǎn)的目的地址。1.無(wú)條件轉(zhuǎn)移指令目標(biāo)地址與AJMP下面一條指令的第一個(gè)字節(jié)必須在同一個(gè)2KB范圍的存儲(chǔ)器區(qū)域內(nèi)。注意61(2)相對(duì)轉(zhuǎn)移指令執(zhí)行該指令時(shí),先將PC加2,再將指令中帶符號(hào)的偏移量rel與PC值相加,得到的結(jié)果送入PC作為跳轉(zhuǎn)地址。指令格式如下:SJMPrel62(3)長(zhǎng)跳轉(zhuǎn)指令執(zhí)行該指令時(shí),將16位目標(biāo)地址addr16裝入PC,程序無(wú)條件跳轉(zhuǎn)至該目標(biāo)地址。目標(biāo)地址可以是64KB程序存儲(chǔ)器地址空間內(nèi)的任何地址,且該指令不影響任何標(biāo)志位。指令格式如下:LJMPaddr16(4)散轉(zhuǎn)指令該指令能夠?qū)崿F(xiàn)程序的散轉(zhuǎn),轉(zhuǎn)移的目標(biāo)地址在64KB范圍內(nèi)的程序存儲(chǔ)區(qū)。指令格式如下:JMP@A+DPTR執(zhí)行時(shí),將累加器A中的8位無(wú)符號(hào)數(shù)與數(shù)據(jù)指針DPTR中的16位數(shù)相加,其結(jié)果作為跳轉(zhuǎn)地址送入PC。該指令不改變累加器A和DPTR的內(nèi)容,也不影響標(biāo)志位。例如:根據(jù)累加器的數(shù)值設(shè)計(jì)散轉(zhuǎn)程序如下:ORG 2000HSTR:MOV DPTR,#TAB RL A ;A中的內(nèi)容乘以2JMP @A+DPTR TAB:AJMP KL0 ;A=0時(shí),跳轉(zhuǎn)至KL0AJMP KL1 ;A=1時(shí),跳轉(zhuǎn)至KL1AJMP KL2 ;A=2時(shí),跳轉(zhuǎn)至KL2

……AJMP是2字節(jié)指令,所以“AJMPKL0”指令占用了TAB和TAB+1兩個(gè)字節(jié);當(dāng)A值為1時(shí),跳轉(zhuǎn)到KL1執(zhí)行,此時(shí)指令“AJMPKL1”的開(kāi)始地址是TAB+A*2,因此,在執(zhí)行散轉(zhuǎn)指令之前需要將A中的數(shù)據(jù)乘以2,這樣,散轉(zhuǎn)指令才能找到正確的跳轉(zhuǎn)地址。632.條件轉(zhuǎn)移指令該組指令是根據(jù)累加器A的值判斷程序是否進(jìn)行跳轉(zhuǎn),指令格式如下:JZrel ;(A)=0時(shí)轉(zhuǎn)移,不成立則順序執(zhí)行下一條指令JNZrel ;(A)≠0時(shí)轉(zhuǎn)移,不成立則順序執(zhí)行下一條指令轉(zhuǎn)移的目標(biāo)地址在以當(dāng)前指令的下一條指令地址為中心的256個(gè)字節(jié)范圍內(nèi)(-128~+127)。當(dāng)條件滿足時(shí),則PC←(PC)+N+rel,其中(PC)為該條件轉(zhuǎn)移指令的起始地址,N為該轉(zhuǎn)移指令的字節(jié)數(shù),本轉(zhuǎn)移指令中N=2。643.比較轉(zhuǎn)移指令在51單片機(jī)指令系統(tǒng)中沒(méi)有專(zhuān)門(mén)的比較指令,它只提供了下面4條比較不相等轉(zhuǎn)移指令。指令格式如下:CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel這組指令的功能是比較兩個(gè)操作數(shù)的大小,如果值不相等則轉(zhuǎn)移。轉(zhuǎn)移地址的計(jì)算方法與條件轉(zhuǎn)移指令相同,即PC←(PC)+N+rel。如果第一個(gè)操作數(shù)(無(wú)符號(hào)整數(shù))小于第二個(gè)操作數(shù),則進(jìn)位標(biāo)志位Cy置1,否則清0。該指令不影響任何操作數(shù)的內(nèi)容。65該組指令是先將操作數(shù)進(jìn)行減1操作,再根據(jù)結(jié)果判斷是否轉(zhuǎn)移,格式如下:DJNZRn,relDJNZdirect,rel指令執(zhí)行時(shí),先將第一操作數(shù)減1,然后判斷結(jié)果是否為0,不為0則轉(zhuǎn)移到PC←(PC)+N+rel;結(jié)果為0,則順序向下執(zhí)行。該指令不影響標(biāo)志位。664.減1不為0轉(zhuǎn)移指令例如,編寫(xiě)一個(gè)延時(shí)子函數(shù),要求延時(shí)時(shí)間為1秒。首先分別給R5,R6,R7賦初值,然后執(zhí)行DJNZ操作,判斷該指令后面的操作數(shù)是否為0,如果不為0則跳轉(zhuǎn)到標(biāo)號(hào)對(duì)應(yīng)的指令處;如果為0則順序向下執(zhí)行指令。;**************延時(shí)1S子函數(shù)*******************DELAY1S: MOVR7,#0A7HDL1:MOVR6,#0ABHDL0:MOVR5,#10HDJNZR5,$DJNZR6,DL0

DJNZR7,DL1NOPRET675.調(diào)用及返回指令具備特定功能的程序段通??梢杂米髯映绦颉U{(diào)用子程序時(shí),主程序中要有調(diào)用命令,子程序末尾需要有返回指令,以便執(zhí)行完子程序后能夠及時(shí)返回主程序。(1)絕對(duì)調(diào)用指令這是一條2KB范圍內(nèi)的子程序調(diào)用指令。執(zhí)行該指令時(shí),先將PC加2以獲得下一條指令的地址;然后將16位地址壓入堆棧,SP內(nèi)容加2;最后把PC的高5位與addr11合成的16位地址(PC的高5位作為合成地址的高5位,addr11作為低11位)作為子程序的入口地址送入PC。指令格式如下:ACALLaddr11

所用的子程序的入口地址必須與ACALL下一條指令的第一個(gè)字節(jié)在同一個(gè)2KB區(qū)域的存儲(chǔ)器區(qū)內(nèi)。注意68(2)長(zhǎng)調(diào)用指令該指令無(wú)條件調(diào)用16位地址addr16指向的子程序。指令格式如下:ACALLaddr16指令執(zhí)行過(guò)程如下:①PC←(PC)+3;②PC入棧(先壓入低字節(jié)后壓入高字節(jié)),SP←SP+2;③PC←addr16。執(zhí)行完畢后,程序跳轉(zhuǎn)至addr16指定的子程序入口處執(zhí)行子程序。LCALL指令可以調(diào)用位于64KB范圍內(nèi)任意地址的子程序。指令執(zhí)行后不影響任何標(biāo)志位。69(3)子程序返回指令該指令的功能是退出子程序,返回主程序。指令如下:RET執(zhí)行時(shí),將調(diào)用子程序時(shí)壓入堆棧的下一條指令的地址取出送入PC,使其能夠返回主程序繼續(xù)執(zhí)行。(4)中斷返回指令該指令的功能與RET指令相似,不同的是它還要清除51單片機(jī)內(nèi)部的中斷狀態(tài)標(biāo)志。指令如下:RETI70位操作指令的操作數(shù)是某字節(jié)中的一個(gè)二進(jìn)制位,其值只能是0或1。此類(lèi)指令又被稱(chēng)為布爾操作指令,布爾累加器Cy在指令中可簡(jiǎn)寫(xiě)成C。位操作指令中,位操作數(shù)的表達(dá)形式有以下4種:(1)直接地址方式,如0A8H。(2)點(diǎn)操作符方式,如IE.0。(3)位名稱(chēng)方式,如EX0。(4)用戶定義方式,例如,用偽指令BIT做如下定義:“WBZD0BITEX0”,經(jīng)過(guò)用戶的重新定義,可使用WBZD0代替EX0。1.位數(shù)據(jù)傳送指令

該指令是將源操作數(shù)指定的布爾變量送入目的操作數(shù)指定的位地址單元中。其中一個(gè)操作數(shù)是進(jìn)位標(biāo)志位Cy,另一個(gè)操作數(shù)可以是任何可直接尋址位。指令格式如下:MOVC,bitMOVbit,C712.位變量修改指令該組指令主要完成對(duì)位變量的修改,包括清零、置1、取反等。指令如下:CLRC ;將進(jìn)位標(biāo)志C清零CLRbit ;將位bit清零CPLC ;將C取反CPLbit ;將bit取反SETBC ;將C置1SETBbit ;將bit置1該組指令不影響其他標(biāo)志位。3.位變量邏輯與指令該組指令讓進(jìn)位標(biāo)志位C與源操作數(shù)作邏輯與運(yùn)算,結(jié)果放入進(jìn)位標(biāo)志位。指令如下:ANLC,bitANLC,/bit

;/bit為bit的取反值

該指令不影響其他標(biāo)志位。724.位變量邏輯或指令該組指令讓進(jìn)位標(biāo)志位C與源操作數(shù)作邏輯或運(yùn)算,結(jié)果放入進(jìn)位標(biāo)志位。指令如下:ORLC,bitORLC,/bit該指令不影響其他標(biāo)志位。5.位變量條件轉(zhuǎn)移指令這組指令是根據(jù)進(jìn)位標(biāo)志位或位變量的值完成程序的轉(zhuǎn)移。指令如下:JCrel ;若(Cy)=1,則轉(zhuǎn)移PC←(PC)+2+relJNCrel ;若(Cy)=0,則轉(zhuǎn)移PC←(PC)+2+relJBbit,rel ;若(bit)=1,則轉(zhuǎn)移PC←(PC)+3+relJNBbit,rel ;若(bit)=0,則轉(zhuǎn)移PC←(PC)+3+relJBCbit,rel ;若(bit)=1,則轉(zhuǎn)移PC←(PC)+3+rel,并將bit清073單片機(jī)的匯編指令包括可執(zhí)行指令和偽指令兩種。前面講到的指令都屬于可執(zhí)行指令,在匯編時(shí)產(chǎn)生可執(zhí)行的目標(biāo)代碼。偽指令又稱(chēng)指示性指令,它的形式與可執(zhí)行指令類(lèi)似,但匯編時(shí)不產(chǎn)生可執(zhí)行的目標(biāo)代碼,它們只是對(duì)匯編過(guò)程進(jìn)行某種控制或提供某些匯編信息。1.ORG定位偽指令規(guī)定程序塊或數(shù)據(jù)塊存放的起始位置。指令格式如下:[標(biāo)號(hào):]ORG16位地址或標(biāo)號(hào)說(shuō)明:由ORG定義的地址空間必須從小到大,且不允許重復(fù)。例如:ORG1000H;表示下面的指令“MOVA,#20H”存放于1000H開(kāi)始的單元中MOVA,#20H742.DB定義字節(jié)數(shù)據(jù)偽指令用于在程序存儲(chǔ)器中定義一個(gè)或多個(gè)字節(jié)。指令格式如下:[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)表說(shuō)明:將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)從左到右依次存放在指定的地址單元中。例如:ORG1000HTAB:DB2BH,0A0H,A,2*4表示從1000H單元開(kāi)始存放數(shù)據(jù)2BH,0A0H,41H(字母A的ASCII碼)和08H。7576【例4-3】利用查表指令將內(nèi)部RAM中的20H單元的壓縮BCD碼拆開(kāi),轉(zhuǎn)換成相應(yīng)的ASCII碼,存入21H和22H單元中,高位存在22H中。使用DB指令創(chuàng)建表格用以存放0~9這10個(gè)數(shù)的ASCII碼值。在20H單元中存入壓縮BCD碼89H,取其后4位送入累加器A,查表得到后4位的ASCII碼值送入21H。再次將20H中的內(nèi)容送入A,取其高4位,然后將A的高位和低位互換,再通過(guò)查表得到20H單元中高4位的ASCII碼值,最后將得到的結(jié)果存入22H單元。;************************************************************************;將壓縮BCD碼表示的數(shù)據(jù)轉(zhuǎn)換成ASCII碼;************************************************************************77【例4-3】利用查表指令將內(nèi)部RAM中的20H單元的壓縮BCD碼拆開(kāi),轉(zhuǎn)換成相應(yīng)的ASCII碼,存入21H和22H單元中,高位存在22H中。ORG 0000HSTART:MOV DPTR,#TABLE MOV 20H,#89H ;在20H單元預(yù)先存入一個(gè)壓縮BCD碼#89HMOV A,20HANL A,#0FH ;該數(shù)據(jù)和A相“與”MOVC A,@A+DPTR ;由A+DPTR尋址的程序存儲(chǔ)器字節(jié)送入AMOV 21H,A ;A的內(nèi)容送入21H中MOV A,20H ;20H的內(nèi)容送入A中

78【例4-3】利用查表指令將內(nèi)部RAM中的20H單元的壓縮BCD碼拆開(kāi),轉(zhuǎn)換成相應(yīng)的ASCII碼,存入21H和22H單元中,高位存在22H中。ANL A,#0F0H ;該數(shù)據(jù)和A相“與”

SWAP A ;A的高位與低位對(duì)換MOVC A,@A+DPTR ;查表MOV 22H,A ;將查詢(xún)到的0~9對(duì)應(yīng)的ASCII碼進(jìn)行保存SJMP $TABLE:DB 30H,31H,32H,33H,34H ;0~4對(duì)應(yīng)的ASCII碼DB 35H,36H,37H,38H,39H ;5~9對(duì)應(yīng)的ASCII碼END3.DW定義字?jǐn)?shù)據(jù)偽指令在程序存儲(chǔ)器中定義一個(gè)或多個(gè)字。格式如下:[標(biāo)號(hào):]DW字?jǐn)?shù)據(jù)表說(shuō)明:DW定義的數(shù)據(jù)項(xiàng)為字,包括兩個(gè)字節(jié),存放時(shí)高位在前,低位在后。例如:ORG1000HDATA:DW324AH,3CH表示從1000H單元開(kāi)始存放數(shù)據(jù)32H,4AH,00H和3CH(3CH以字形式表示為003CH)。794.DS

DS是定義空間偽指令,格式如下:

[標(biāo)號(hào):]DS表達(dá)式說(shuō)明:從指定的地址開(kāi)始,保留若干個(gè)存儲(chǔ)單元作為備用空間。例如:

ORG1000HBUF:DS50HTAB:DB22H從1000H地址單元開(kāi)始預(yù)留50H個(gè)(1000H~104FH)字節(jié)空間,22H存放在1050H單元。805.EQU或“=”符號(hào)定義偽指令,將表達(dá)式的值或某個(gè)特定匯編符號(hào)定義為一個(gè)指定的符號(hào)名。格式如下:

符號(hào)名EQU表達(dá)式或符號(hào)名=表達(dá)式說(shuō)明:只能定義單字節(jié)數(shù)據(jù),并且遵循先定義后使用的原則,因此,該語(yǔ)句通常放在源程序的開(kāi)頭部分。

例如:

LEN=10SUMEQU21H

……MOVA,#LEN ;執(zhí)行指令后,累加器A中的值為0AH

……816.DATA數(shù)據(jù)賦值偽指令,將表達(dá)式的值或特定匯編符號(hào)定義為一個(gè)指定的符號(hào)名。格式如下:

符號(hào)名DATA表達(dá)式說(shuō)明:只能定義單字節(jié)數(shù)據(jù),而且可以先使用后定義。因此,數(shù)據(jù)可以放在程序末尾進(jìn)行定義。例如:

MOVA,#LEN

……LENDATA10盡管LEN是先引用后定義,但匯編語(yǔ)言系統(tǒng)仍可以知道A的值是0AH。827.XDATA數(shù)據(jù)地址賦值偽指令,是將表達(dá)式的值或某個(gè)特定匯編符號(hào)定義為一個(gè)指定的符號(hào)名。格式如下:

符號(hào)名XDATA表達(dá)式說(shuō)明:可以先使用后定義,并且用于雙字節(jié)數(shù)據(jù)定義。例如:

DELAYXDATA0356H

……LCALLDELAY ;指令執(zhí)行后,程序轉(zhuǎn)到0356H單元執(zhí)行838.END匯編程序結(jié)束偽指令是匯編語(yǔ)言源程序結(jié)束的標(biāo)志,用于匯編程序的末尾。格式如下:

[標(biāo)號(hào):]END說(shuō)明:END后面的語(yǔ)句將不被匯編成機(jī)器碼。8485(1)順序結(jié)構(gòu)該程序結(jié)構(gòu)的特點(diǎn)是按照順序依次向下執(zhí)行每一條指令,直到程序結(jié)束為止。順序結(jié)構(gòu)程序參考例4-4。(2)分支結(jié)構(gòu)由于順序結(jié)構(gòu)只能解決一些簡(jiǎn)單的算術(shù)運(yùn)算、邏輯運(yùn)算、傳送操作等問(wèn)題,而實(shí)際應(yīng)用中往往要求單片機(jī)根據(jù)給定的條件進(jìn)行判斷,然后選擇不同的處理方法。這種要求改變執(zhí)行順序的結(jié)構(gòu)稱(chēng)為分支結(jié)構(gòu),分支結(jié)構(gòu)會(huì)使程序的走向有兩個(gè)或兩個(gè)以上。單片機(jī)的分支程序的特點(diǎn)是含有轉(zhuǎn)移指令。轉(zhuǎn)移指令有無(wú)條件轉(zhuǎn)移(如JMP,LJMP,SJMP等)和有條件轉(zhuǎn)移(DJNZ,CJNE等)之分。匯編語(yǔ)言編程與其他編程語(yǔ)言的原理一樣,其程序結(jié)構(gòu)主要有順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)等幾種形式。86執(zhí)行無(wú)條件轉(zhuǎn)移指令時(shí),程序?qū)o(wú)條件地轉(zhuǎn)向一個(gè)預(yù)設(shè)的標(biāo)號(hào)處執(zhí)行。有條件轉(zhuǎn)移指令在執(zhí)行時(shí),程序依據(jù)條件選擇下一條要執(zhí)行的指令,其跳轉(zhuǎn)分支可能有兩個(gè)或兩個(gè)以上。分支程序的設(shè)計(jì)需要包含以下3個(gè)方面:

①建立可供條件轉(zhuǎn)移指令測(cè)試的條件。②選擇合適的條件轉(zhuǎn)移指令。③在轉(zhuǎn)移的目的地放置標(biāo)號(hào)。分支程序參考例4-5。(3)循環(huán)程序此種結(jié)構(gòu)中含有可以重復(fù)執(zhí)行的程序段(循環(huán)體)。使用循環(huán)結(jié)構(gòu)可以有效地縮短程序,減少程序占用的內(nèi)存空間,并使程序的結(jié)構(gòu)更緊湊、可讀性更好。87循環(huán)程序由循環(huán)初始化、循環(huán)體、循環(huán)控制以及循環(huán)結(jié)束等幾部分組成。循環(huán)結(jié)構(gòu)的流程圖如圖4-10所示。具體程序參考例4-6。(a)先執(zhí)行后判斷

(b)先判斷后執(zhí)行圖4-10循環(huán)結(jié)構(gòu)流程圖88【例4-4】編寫(xiě)程序?qū)崿F(xiàn)C=a2+b2(a,b均為1位十進(jìn)制數(shù))。首先使用DB指令開(kāi)辟存儲(chǔ)空間存放0~9這10個(gè)數(shù)的平方值,然后將參與運(yùn)算的兩個(gè)數(shù)分別存入A,調(diào)用平方子程序求出各自的平方值,最后將結(jié)果相加送入40H單元?!緟⒖即a】;************************************************************************;編制程序?qū)崿F(xiàn)C=a2+b2(a,b均為1位十進(jìn)制數(shù));************************************************************************ORG 0000HSR: 89【例4-4】編寫(xiě)程序?qū)崿F(xiàn)C=a2+b2(a,b均為1位十進(jìn)制數(shù))。MOV 30H,#01H ;將數(shù)據(jù)#01H送入30H中MOV 31H,#02H ;將數(shù)據(jù)#02H送入31H中MOV A,30H ;將30H中的內(nèi)容a送入A

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論