《單片機(jī)原理及應(yīng)用》課件-第3章_第1頁
《單片機(jī)原理及應(yīng)用》課件-第3章_第2頁
《單片機(jī)原理及應(yīng)用》課件-第3章_第3頁
《單片機(jī)原理及應(yīng)用》課件-第3章_第4頁
《單片機(jī)原理及應(yīng)用》課件-第3章_第5頁
已閱讀5頁,還剩178頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章單片機(jī)指令系統(tǒng)3.1指令系統(tǒng)概述3.2單片機(jī)的尋址方式3.3單片機(jī)的指令系統(tǒng)思考與練習(xí)

3.1指令系統(tǒng)概述

指令是計算機(jī)(單片機(jī))按照人們的意圖來執(zhí)行某種操作的命令。一臺計算機(jī)能夠執(zhí)行的全部指令的集合稱為該計算機(jī)的指令系統(tǒng)。指令系統(tǒng)的功能強(qiáng)弱在很大程度上決定了計算機(jī)性能的高低。指令一般有功能、時間和空間三種屬性。功能屬性是指每條指令都對應(yīng)一個特定的操作功能;時間屬性是指一條指執(zhí)行所用的時間,一般用機(jī)器周期來表示;空間屬性是指一條指令在ROM中存儲所占用的字節(jié)數(shù)。

MCS-51單片機(jī)指令系統(tǒng)共有111條基本指令,具有功能強(qiáng)、指令短、執(zhí)行快等特點。按功能屬性劃分,MCS-51指令系統(tǒng)可分為以下五類:

(1)數(shù)據(jù)傳送類指令(29條);

(2)算術(shù)運算類指令(24條);

(3)邏輯運算類指令(24條);

(4)控制轉(zhuǎn)移類指令(17條);

(5)位操作類指令(17條)。

按空間屬性劃分,MCS51指令系統(tǒng)可分為以下三類:

(1)單字節(jié)指令(49條);

(2)雙字節(jié)指令(45條);

(3)三字節(jié)指令(17條)。

按時間屬性劃分,MCS51指令系統(tǒng)可分為以下三類:

(1)單機(jī)器周期指令(64條);

(2)雙機(jī)器周期指令(45條);

(3)四機(jī)器周期指令(只有乘、除法2條指令)。

3.1.1指令的表達(dá)形式

通常,指令有兩種表達(dá)形式:機(jī)器語言形式和匯編語言形式。機(jī)器語言指令用二進(jìn)制代碼表示每條指令,是計算機(jī)能直接識別和執(zhí)行的指令。但是用機(jī)器語言編寫程序不方便記憶,不容易閱讀、理解和查錯。為方便程序的編寫,人們采一種助記符號來反映指令的功能和主要特征,這種用助記表示的機(jī)器指令被稱為匯編語言指令。匯編語言指令直觀、易記憶、好理解、易閱讀,執(zhí)行速度快,實時性強(qiáng),且與計算機(jī)的機(jī)器語言指令一一對應(yīng),因此單片機(jī)系統(tǒng)開發(fā)時可以采用匯編語言指令。即使使用C語言,也需要了解匯編語言指令。

MCS-51單片機(jī)匯編語言指令的一般格式如下:

即一條匯編語言指令可以由標(biāo)號、操作碼、操作數(shù)和注釋四部分組成,其中操作碼是指令中必不可少的內(nèi)容,其余三部分可以根據(jù)實際情況取舍,因此在格式中使用了可選擇符號“[]”。下面對組成指令的四個部分分別進(jìn)行介紹。

①標(biāo)號位于語句的開始,由字母和數(shù)字組成,它代表該指令的地址,也稱為指令的符號地址。標(biāo)號必須以字母開始,其余部分可以是字母、數(shù)字和符號,但不能為MCS-51單片機(jī)指令集中的指令助記符。標(biāo)號與操作碼之間必須用冒號“:”分隔。

②操作碼是指令的助記符(表明指令功能的英語單詞或其縮寫),表示指令所執(zhí)行的操作功能,描述指令的操作性質(zhì),是一條指令中唯一不能空缺的部分。

③操作數(shù)為指令的操作對象,既可以是參加操作的數(shù)據(jù),也可以是操作數(shù)所在的地址。MCS-51單片機(jī)的指令可以沒有操作數(shù),也可以有1~3個操作數(shù)。多個操作數(shù)之間必須用逗號“,”分隔,操作數(shù)與操作碼之間要用空格分隔。

操作數(shù)中的數(shù)據(jù)可以是二進(jìn)制、十進(jìn)制或十六進(jìn)制數(shù)據(jù),也可以是ASCII碼,具體格式如下:

二進(jìn)制數(shù),以字母B結(jié)尾,如10101010B。

十進(jìn)制數(shù),以字母D結(jié)尾或?qū)省略,如78D或78。

十六進(jìn)制數(shù),以字母H結(jié)尾,如78H、0A2H。注意:十六進(jìn)制數(shù)以A~F開頭時應(yīng)在其前面加上數(shù)字“0”。

ASCII碼,字符外加單引號''標(biāo)志,如'A'。

④注釋位于語句的最后,是說明語句功能和性質(zhì)的文字。注釋的主要作用是對程序段或者某條指令在整個程序中的作用進(jìn)行解釋和說明,以幫助閱讀、理解和使用源程序。

操作碼與注釋之間可以用分號“;”分隔,在KeilμVision集成環(huán)境中,也可以用“//”分割。

注意:指令中的標(biāo)點符號均為英文符號。

由上述分析可知,在MCS-51單片機(jī)的指令系統(tǒng)中,指指主要由操作碼和操作數(shù)組成,而操作碼和操作數(shù)都有對應(yīng)的二進(jìn)制代碼。通常,操作碼用1個字節(jié)表示,操作數(shù)用1個或2個字節(jié)表示。因此MCS-51單片機(jī)的指令按二進(jìn)制代碼所占的字節(jié)數(shù)可以分為單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令三種格式。

1.單字節(jié)指令

單字節(jié)指令中的8位二進(jìn)制代碼既包含操作碼的信息,也包含操作數(shù)的信息,這種指令包含以下三種情況:

①無操作數(shù)指令,如指令“NOP”的編碼為00000000B,其十六進(jìn)制表示形式為00H,該編碼僅為操作碼,說明指令實現(xiàn)空操作功能。

②指令碼中隱含著對某一寄存器的操作,如指令“INCA”的編碼為00000100B,其十六進(jìn)制表示形式為04H,該編碼僅為操作碼,而操作數(shù)(累加器A)隱含在操作碼中,該指令的功能是將累加器A的內(nèi)容加1。

③指令碼含有操作碼和寄存器編碼,如指令“MOVA,Rn”的編碼為11101rrrB,該編碼的高5位為操作碼,低3位rrr為存放操作數(shù)的寄存器編碼,與n的值相對應(yīng),該指令的功能是將當(dāng)前工作寄存器Rn(n=0~7)中的數(shù)據(jù)傳送到累加器A中。

2.雙字節(jié)指令

雙字節(jié)指令用一個字節(jié)表示操作碼,另一個字節(jié)表示操作數(shù)或操作數(shù)所在的地址,如指令“MOVA,#40H”的代碼(十六進(jìn)制形式)為74H、40H,其中74H為操作碼,40H

為操作數(shù),該指令的功能是將立即數(shù)“40H”傳送到累加器A中。

3.三字節(jié)指令

三字節(jié)指令用一個字節(jié)表示操作碼,兩個字節(jié)表示操作數(shù)或操作數(shù)所在的地址,如指令“MOV50H,#40H”的代碼(十六進(jìn)制形式)為74H、50H、40H,其中74H為操作碼,

50H為數(shù)據(jù)存放的地址,40H為操作數(shù),該指令的功能是將立即數(shù)“40H”傳送到片內(nèi)RAM的50H單元中。

3.1.2指令中的常用符號

在描述指令系統(tǒng)和尋址方式時,常用一些符號來代表具體的操作數(shù),下面簡單介紹這些常用符號的意義。

Rn:當(dāng)前選中的寄存器組中的8個工作寄存器R0~R7(n=0~7)。

Ri:當(dāng)前選中的寄存器組中的2個工作寄存器R0和R1(i=0,1)。

@:間接尋址寄存器或基址寄存器的前綴,如@Ri,@DPTR。

#data:8位立即數(shù),即包含在指令中的8位常數(shù),00H~FFH。

#data16:16位立即數(shù),即包含在指令中的16位常數(shù),0000H~FFFFH。

direct:8位直接地址,既可以是片內(nèi)RAM的低128字節(jié)的單元地址,也可以是SFR的單元地址或名稱(包括I/O口P0、P1、P2和P3)。

addr11:表示11位目的地址,主要用于ACALL和AJMP指令中。

addr16:表示16位目的地址,主要用于LCALL和LJMP指令中。

rel:補(bǔ)碼形式的8位地址偏移量,取值范圍為-128~+127,主要用于相對轉(zhuǎn)移指令,以形成轉(zhuǎn)移的目的地址。

bit:表示片內(nèi)RAM或SFR內(nèi)的直接尋址位。

A或ACC:表示累加器。

B:表示B寄存器。

C:表示位累加器。

DPTR:表示數(shù)據(jù)指針寄存器,可用作16位地址寄存器。

$:表示當(dāng)前指令的地址。

X:表示直接地址或寄存器。

(X):表示X地址單元或寄存器中的內(nèi)容。

((X)):表示以X地址單元或寄存器的內(nèi)容為地址所指定單元的內(nèi)容。

/:在位操作指令中,表示對該位求反后再參與操作。

←:表示指令的操作結(jié)果是將箭頭右邊的內(nèi)容傳送到箭頭的左邊。

→:表示指令的操作結(jié)果是將箭頭左邊的內(nèi)容傳送到箭頭的右邊。

3.2單片機(jī)的尋址方式

計算機(jī)在執(zhí)行指令時,要先尋找參加運算的操作數(shù),然后對其進(jìn)行操作并將操作結(jié)果存入相應(yīng)存儲單元或寄存器。我們把尋找源操作數(shù)所在單元的地址稱為尋址,而尋找源操作數(shù)所在地址的方法就是尋址方式。如:指令“MOVA,R0”中,第一個操作數(shù)“A”稱為目的操作數(shù),第二個操作數(shù)R0”稱為源操作數(shù),尋址方式就是尋找“R0”所在地址的方法。

在MCS51單片機(jī)中,操作數(shù)的存放范圍是很寬的,可以放在片外ROM/RAM中,也可以放在片內(nèi)ROM/RAM以及SFR中。為了適應(yīng)在操作數(shù)范圍內(nèi)的尋址,MCS-51的指令系統(tǒng)共使用了七種尋址方式,它們是立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址,每種尋址方式所對應(yīng)的寄存器和存儲空間如表3-1所示。

3.2.1立即尋址

在指令中直接給出操作數(shù)的尋址方式稱為立即尋址。在指令編碼中,操作數(shù)緊跟在操作碼后面,與操作碼一起存放在指令代碼段(ROM)中,這樣的操作數(shù)稱為立即數(shù)。采用匯編語言編寫指令時,把“#”號放在立即數(shù)前面,以表示該尋址方式為立即尋址。

【例3-1】有一指令為“MOVA,#68H”,該指令執(zhí)行后,(A)=68H,執(zhí)行過程如圖3-1所示。

指令“MOVA,#68H”在ROM中的編碼為01110100B、01101000B,表示成十六進(jìn)制形式為74H、68H。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是將操作碼后面的8位立即數(shù)“68H”復(fù)制到累加器A中,所以指令執(zhí)行后累加器A的內(nèi)容變?yōu)椤?8H”,而A中原來的內(nèi)容被覆蓋。圖3-1指令“MOVA,#68H”的執(zhí)行示意圖

在MCS51單片機(jī)指令系統(tǒng)中,僅有一條包含16位立即數(shù)的指令,形式為“MOVDPTR,#data16”,其中“#data16”表示16位立即數(shù)。如:指令“MOVDPTR,#1234H”,其功能是把16位立即數(shù)“1234H”傳送到寄存器DPTR中,其中高8位“12H”送到DPH,低8位“34H”送到DPL。

因為立即數(shù)直接存放在ROM中,所以立即尋址所對應(yīng)的尋址空間為ROM空間。

3.2.2直接尋址

指令中直接給出操作數(shù)所在存儲單元地址的尋址方式稱為直接尋址。在指令編碼中,操作數(shù)所在存儲單元的地址緊跟在操作碼之后,與操作碼一起存放在指令代碼段中,而操

作數(shù)本身則存放在該地址所指示的存儲單元中。

【例3-2】如果片內(nèi)RAM中(30H)=56H,則指令“MOVA,30H”執(zhí)行后,(A)=56H,執(zhí)行過程如圖3-2所示。

圖3-2指令“MOVA,30H”的執(zhí)行示意圖

指令“MOVA,30H”在ROM中的編碼(十六進(jìn)制形式)為E5H、30H。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是將30H單元的內(nèi)容復(fù)制到累加器A

中,A中原來的內(nèi)容被覆蓋。因為30H單元的內(nèi)容為“56H”,所以指令執(zhí)行后累加器A的內(nèi)容變?yōu)椤?6H”。

直接尋址方式只能用來訪問片內(nèi)RAM的低128字節(jié)和SFR區(qū)域。對于片內(nèi)RAM的低128字節(jié),在指令中以直接地址形式表示操作數(shù)所在單元的地址,如“MOVA,

direct”,其中“direct”代表直接地址。對于SFR,在指令中既可以用單元地址也可以用寄存器符號來表示操作數(shù)所在單元的地址。如指令“MOVA,80H”可以寫成“MOVA,P0”,這里的“P0”與地址“80H”是等同的,但“P0”這種寫法更容易理解和閱讀。

3.2.3寄存器尋址

操作數(shù)存放在寄存器中,指令中直接給出該寄存器名稱的尋址方式稱為寄存器尋址。存放操作數(shù)的寄存器在指令代碼中不占據(jù)單獨的一個字節(jié),而是包含在操作碼字節(jié)中。寄

存器尋址一般用于訪問選定的工作寄存器組的8個工作寄存器R0~R7,并以符號名稱來表示寄存器。

【例3-3】如果(R1)=80H,則指令“MOVA,R1

”執(zhí)行后,(A)=80H,執(zhí)行過程如圖3-3所示。圖3-3指令“MOVA,R1”的執(zhí)行示意圖

指令“MOVA,R1”在ROM中的編碼為11101001B,其中低3位001表示R1寄存器。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是將R1寄存器的內(nèi)容復(fù)

制到累加器A中,A中原來的內(nèi)容被覆蓋。由表2-2可知,Rn(n=0~7)的物理地址由PSW中的RS1和RS0狀態(tài)決定。因此,若假設(shè)此時RS1RS0=00B,則可知R1屬于第0組工作寄存器,其地址為01H。因為01H單元的內(nèi)容為“80H”,所以指令執(zhí)行后累加器A的內(nèi)容變?yōu)椤?0H”。

除了工作寄存器R0~R7符合寄存器尋址條件以外,部分特殊功能寄存器如累加器A、寄存器B(以AB寄存器對形式出現(xiàn))以及數(shù)據(jù)指針DPTR也可以采用寄存器方式尋址。

需要注意的是,指令“MOVRn,A”屬于寄存器尋址,而指令“MOVRn,ACC”屬于直接尋址,因為符號ACC代表累加器的單元地址“E0H”,但二者實現(xiàn)的功能是一樣的。

此外,對于第0組工作寄存器,R0的物理地址為00H,因此指令“MOVA,00H”和“MOVA,R0”實現(xiàn)的功能是一樣的,都是將00H單元的內(nèi)容復(fù)制到累加器A中。但是兩者也是有區(qū)別的:“MOVA,00H”屬于直接尋址,機(jī)器碼為E5H、00H,即這條指令要占用兩個字節(jié);“MOVA,R0”屬于寄存器尋址,機(jī)器碼為E8H,即這條指令只占用1個字節(jié)。由此可見,同一個功能可以采用不同的指令來實現(xiàn),而且對于同一個存儲單元,若采用不同形式表示,所對應(yīng)的尋址方式是不同的。

3.2.4寄存器間接尋址

指令中給出的寄存器中存放的不是操作數(shù),而是操作數(shù)所在單元的地址,類似C語言的指針,即操作數(shù)是通過指令中給出的寄存器間接得到的,這種尋址方式被稱為寄存器間接尋址。為了與寄存器尋址區(qū)別,應(yīng)在寄存器的名稱前面加前綴標(biāo)志“@”。

【例3-4】如果(R0)=40H,(40H)=30H,則指令“

MOVA,@R0”執(zhí)行后,(A)=30H,執(zhí)行過程如圖3-4所示。圖3-4指令“MOVA,@R0”的執(zhí)行示意圖

指令“MOVA,@R0”在ROM中的編碼為11100110B,其中最低位0表示間接尋址寄存器為R0。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是以R0寄存器的內(nèi)容作為操作數(shù)地址,然后將該地址單元的內(nèi)容復(fù)制到累加器A中,A中原來的內(nèi)容被覆蓋。若假設(shè)此時RS1RS0=00B,則可知R0屬于第0組工作寄存器,其地址為00H。因為00H單元的內(nèi)容為“40H”,則指令執(zhí)行后,40H單元的數(shù)據(jù)“30H”被傳送到累加器A中,所以A的內(nèi)容變?yōu)椤?0H”。

采用寄存器間接尋址不僅可以訪問片內(nèi)RAM,還可以訪問片外RAM,間接尋址寄存器可以采用寄存器R0或R1、數(shù)據(jù)指針DPTR和堆棧指針SP。應(yīng)用時要注意以下幾個

問題:

(1)訪問片內(nèi)RAM的低128字節(jié),可以采用寄存器R0或R1作間接尋址寄存器。其通用形式為“MOV指令@Ri(i=0,1)”。例如,指令“MOVA,@R1”,其功能是把R1

指定的片內(nèi)RAM單元的內(nèi)容送入累加器A。

注意:增強(qiáng)型片內(nèi)RAM的高128字節(jié)只能采用寄存器間接尋址方式。

(2)訪問片外RAM的64KB,通常采用數(shù)據(jù)指針(DPTR)作間接尋址寄存器。如指令“MOVXA,@DPTR”,其功能是把DPTR指定的片外RAM單元的內(nèi)容送入累加器A。

(3)堆棧操作指令PUSH和POP使用堆棧指針SP作間接尋址寄存器來對堆棧區(qū)進(jìn)行間接尋址。

3.2.5變址尋址

變址尋址是以DPTR或PC作為基址寄存器,以累加器A作為變址寄存器,并以兩者內(nèi)容相加形成操作數(shù)所在單元的地址。

在MCS51單片機(jī)中,用變址尋址方式只能訪問ROM,尋址范圍為64KB。變址尋址用于對ROM中的數(shù)據(jù)進(jìn)行尋址,特別適用于查表。例如:

此指令的功能是將DPTR的內(nèi)容與A的內(nèi)容相加,形成新的地址,再將此地址對應(yīng)單元中的8位二進(jìn)制數(shù)送入A中。

【例3-5】如果(DPTR)=1234H,(A)=60H,ROM

中(1294H)=78H,則指令“MOVCA,@A+DPTR”執(zhí)行后,(A)=78H,執(zhí)行過程如圖3-5所示。圖3-5指令“MOVCA,@A+DPTR”的執(zhí)行示意圖

指令“MOVCA,@A+DPTR”在ROM中的編碼(十六進(jìn)制形式)為93H。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是將累加器A的內(nèi)容與數(shù)據(jù)指針寄

存器DPTR中的內(nèi)容相加,并將相加的結(jié)果作為地址,再將該地址單元的內(nèi)容送入累加器A中,A中原來的內(nèi)容被覆蓋。因為累加器A的內(nèi)容為“60H”,數(shù)據(jù)指針寄存器DPTR的

內(nèi)容為“1234H”,則二者相加得到地址“1294H”,然后將該地址單元的內(nèi)容“78H”復(fù)制到累加器A中,所以指令執(zhí)行后累加器A的內(nèi)容變?yōu)椤?8H”。

3.2.6相對尋址

相對尋址是以程序計數(shù)器PC的當(dāng)前值加上指令中給出的偏移量rel形成目標(biāo)地址的尋址方式。采用該尋址方式進(jìn)行操作時修改的是PC值,因此這種尋址方式用于實現(xiàn)程序

的分支跳轉(zhuǎn)。

在使用相對尋址時需要注意以下兩點:

(1)PC的當(dāng)前值是讀出該相對轉(zhuǎn)移指令(2字節(jié)或3字節(jié))后,PC指向的下一條指令的地址,即

例如:“JZrel”是一條累加器A為0就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲地址為2010H,則執(zhí)行該指令時的PC當(dāng)前值為2012H,即PC當(dāng)前值是對相對轉(zhuǎn)移指令取指令結(jié)

束時的值。

(2)偏移量rel是一個有符號的8位二進(jìn)制數(shù),以補(bǔ)碼形式置于操作碼之后存放,取值范圍是-128~+127。負(fù)數(shù)表示向地址減小的方向轉(zhuǎn)移,正數(shù)表示向地址增加的方向轉(zhuǎn)移,相對的基準(zhǔn)是PC的當(dāng)前值。因此,轉(zhuǎn)移的目的地址為

【例3-6】如果rel為75H,PSW.7為1,指令“JCrel”存放在0200H開始的單元,則執(zhí)行“JCrel”指令后,程序?qū)⑻D(zhuǎn)到0277H單元取指令并執(zhí)行,執(zhí)行過程如圖3-6所示。圖-6指令“JCrel”的執(zhí)行示意圖

指令“JCrel”是一條雙字節(jié)指令,在ROM中的編碼(十六進(jìn)制形式)為40H、75H。該指令的功能是檢測進(jìn)位標(biāo)志位Cy(即PSW.7),當(dāng)Cy=1時程序轉(zhuǎn)移到PC當(dāng)前值加上偏移量rel所指示的目的地址開始執(zhí)行,否則Cy=0,程序不轉(zhuǎn)移,順序往下執(zhí)行。已知Cy=1,rel=75H,且指令存放在ROM的0200H、0201H單元中。CPU取出該雙字節(jié)指令后,PC的當(dāng)前值為0202H,該值與偏移量75H相加得到目的地址為0277H,即程序?qū)⑥D(zhuǎn)向0277H單元取指令并執(zhí)行,跳過了0203H~0276H單元的程序段。

采用匯編語言編程時,常用一個自定義的標(biāo)號(即符號地址)來表示相對地址偏移量rel,程序匯編時自動計算偏移量。

3.2.7位尋址

位尋址是對片內(nèi)RAM的位尋址區(qū)和某些可位尋址的SFR進(jìn)行位操作時的尋址方式。

【例3-7】如果位地址20H的內(nèi)容為1,則指令“

MOVC,20H”執(zhí)行后,位地址PSW.7的內(nèi)容為1,執(zhí)行過程如圖3-7所示。

圖3-7指令“MOVC,20H”的執(zhí)行示意圖

指令“MOVC,20H”在ROM中的編碼(十六進(jìn)制形式)為A2H、20H。指令執(zhí)行時,CPU在對操作碼進(jìn)行分析后得知該指令的功能是將位地址20H單元(對應(yīng)片內(nèi)RAM

中24H單元的最低位)的內(nèi)容復(fù)制到位累加器C(對應(yīng)PSW的最高位)中,C中原來的內(nèi)容被覆蓋。因為位地址20H單元的內(nèi)容為“1”,所以指令執(zhí)行后位累加器C(即PSW.

7)的內(nèi)容變?yōu)椤?”。

位尋址的尋址范圍如下:

(1)片內(nèi)RAM低128字節(jié)中位尋址區(qū)的128位(見表23),該區(qū)域的可尋址位有兩種表示方法:

·直接使用位地址表示;

·使用單元地址加位序號表示。

例如,位地址00H和20H.0指的都是片內(nèi)RAM中20H單元的第0位。編程中常用“位地址”表示方法。

(2)SFR的可尋址位,可供位尋址的特殊功能寄存器有11個,地址的尾數(shù)是0或8的寄存器(見表2-4)可以位尋址。該區(qū)域的可尋址位有4種表示方法:·使用位名稱表示;

·直接使用位地址表示;

·使用單元地址加位序號表示;

·使用SFR符號加位序號表示。

例如,中斷允許寄存器IE如下:

其中,最高位是中斷允許總控制位。位名稱是EA,直接位地址是0AFH,單元地址加位序號是0A8H.7,SFR符號加位序號是IE.7。編程中常用“位名稱”表示方法。

3.3單片機(jī)的指令系統(tǒng)

按指令的功能不同,MCS51單片機(jī)指令系統(tǒng)可分為五大類:(1)數(shù)據(jù)傳送類指令:實現(xiàn)存儲器賦值、數(shù)據(jù)轉(zhuǎn)移等功能。(2)算術(shù)運算類指令:實現(xiàn)數(shù)值的加、減、乘、除等運算功能。(3)邏輯運算類指令:實現(xiàn)邏輯與、或、異或、移位等功能。(4)控制轉(zhuǎn)移類指令:實現(xiàn)程序條件轉(zhuǎn)移、無條件轉(zhuǎn)移等功能。(5)位操作類指令:實現(xiàn)位清0、置1、判斷等功能,由MCS51單片機(jī)內(nèi)部特有的布爾處理器完成。

3.3.1數(shù)據(jù)傳送類指令

在MCS-51單片機(jī)中,數(shù)據(jù)傳送是最基本和最主要的操作。數(shù)據(jù)傳送操作可以在片內(nèi)RAM單元和SFR中進(jìn)行,也可以在累加器A和片外RAM之間進(jìn)行,還可以到ROM中進(jìn)行查表。在數(shù)據(jù)傳送類指令中,除了以累加器A為目的操作數(shù)的指令會對PSW中的奇偶標(biāo)志位P有影響外,其余指令執(zhí)行時均不會影響任何標(biāo)志位。

數(shù)據(jù)傳送類指令可分為數(shù)據(jù)傳送指令、數(shù)據(jù)交換指令和堆棧操作指令三類。

1.數(shù)據(jù)傳送指令

根據(jù)訪問對象的不同,數(shù)據(jù)傳送指令可進(jìn)一步分為三種:訪問片內(nèi)RAM的MOV指令、訪問片外RAM的MOVX指令和訪問ROM的MOVC指令。

1)訪問片內(nèi)RAM的MOV指令

數(shù)據(jù)傳送指令是將數(shù)據(jù)進(jìn)行單向傳送,即將操作數(shù)從源操作數(shù)單元傳送到目的操作數(shù)單元,指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)修改為源操作數(shù)。該類指令用于實現(xiàn)數(shù)據(jù)在片內(nèi)RAM單元之間、寄存器之間、寄存器與片內(nèi)RAM單元之間的傳送。

該類指令采用的指令助記符為MOV,通用格式如下:

其功能是將源操作數(shù)的內(nèi)容復(fù)制到目的操作數(shù)所在單元,而源操作數(shù)的內(nèi)容不變。在MCS-51單片機(jī)中,能夠作源操作數(shù)的有A、Rn、direct、@Ri和#data(或#data16),能

夠作目的操作數(shù)的有A、Rn、direct、@Ri和DPTR。將目的操作數(shù)和源操作數(shù)按照不同尋址方式進(jìn)行組合就可派生出該類指令的全部形式。

但是在源操作數(shù)和目的操作數(shù)進(jìn)行組合時要遵守以下規(guī)則:

·源操作數(shù)與目的操作數(shù)的類型要匹配;

·除direct以外,源操作數(shù)與目的操作數(shù)不能相同;

·Rn和@Ri之間不能相互傳送。

基于上述規(guī)則,分別以A、Rn、direct、@Ri和DPTR作目的操作數(shù),可以構(gòu)造出如下五組指令。

(1)以A為目的操作數(shù)的指令:

其功能是將源操作數(shù)的內(nèi)容傳送到累加器A中,源操作數(shù)的尋址方式分別為寄存器尋址、直接尋址、寄存器間接尋址和立即尋址。

(2)以Rn為目的操作數(shù)的指令:

其功能是將源操作數(shù)的內(nèi)容傳送到工作寄存器Rn中,源操作數(shù)的尋址方式分別為寄存器尋址、直接尋址和立即尋址。這里的Rn可以是工作寄存器R0~R7中的某一個,因此上面一條基本指令可以變成8條具體指令。

(3)以direct為目的操作數(shù)的指令:

其功能是將源操作數(shù)的內(nèi)容送入由直接地址指出的片內(nèi)RAM單元,源操作數(shù)的尋址方式分別為寄存器尋址、直接尋址、寄存器間接尋址和立即尋址。

(4)以@Ri為目的操作數(shù)的指令:

其功能是將源操作數(shù)的內(nèi)容傳送到Ri內(nèi)容所指向的地址單元中,源操作數(shù)的尋址方式分別為寄存器尋址、直接尋址和立即尋址。這里的Ri只能是工作寄存器R0或R1。

(5)以DPTR為目的操作數(shù)的指令:

這是MCS51單片機(jī)指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送指令,該指令的功能是將16位立即數(shù)傳送到數(shù)據(jù)指針DPTR中。由于DPTR是由DPH和DPL組成的,因此這條指令執(zhí)行后要把data16的高8位數(shù)據(jù)傳送給DPH,而把低8位數(shù)據(jù)傳送給DPL。

【例3-8】試用不同方法實現(xiàn)以下傳送功能:

①把存放在片內(nèi)RAM50H單元中的數(shù)據(jù)20H傳送到累加器A中(要求最終指令以A為目的操作數(shù))。

②把存放在片內(nèi)RAM20H單元中的數(shù)據(jù)55H送到寄存器R7中(要求最終指令以R7為目的操作數(shù))。

③把存放在片內(nèi)RAM30H單元中的數(shù)據(jù)00H送到60H單元中(要求最終指令以60H為目的操作數(shù))。

④把存放在片內(nèi)RAM30H單元中的數(shù)據(jù)00H送到60H單元中(要求最終指令以@Ri為目的操作數(shù))。

【例3-9】設(shè)(30H)=40H,(40H)=10H,(10H)=00H,(P1)=11001010B,試分析如下程序段中的指令分別屬于上述16條訪問片內(nèi)RAM的數(shù)據(jù)傳送指令中的哪一條?

指令執(zhí)行后各單元中的內(nèi)容是什么?

解:“MOVR0,#30H”屬于“MOVRn,#data”格式,執(zhí)行后(R0)=30H?!癕OVA,@R0”屬于“MOVA,@Ri”格式,執(zhí)行后(A)=((R0))=(30H)=40H。

2)訪問片外RAM的MOVX指令在MCS51指令系統(tǒng)中,CPU對片外RAM進(jìn)行數(shù)據(jù)傳送,必須通過累加器A且采

用寄存器間接尋址的方法來完成,該類指令采用的指令助記符為MOVX,有以下單字節(jié)指令:

前兩條指令的功能是把片外RAM中的一個字節(jié)讀到累加器A中,后兩條指令的功能是把累加器A中一個字節(jié)的數(shù)據(jù)寫到片外RAM中。若采用DPTR間接尋址,高8位地址(由DPH提供)由P2口輸出,低8位地址(由DPL提供)由P0口輸出,可尋址片外RAM的全部64KB單元。若采用Ri(

i=0,1)間接尋址,低8位地址(由Ri提供)由P0口輸出,能尋

址片外RAM的256個單元。因為高8位地址由P2口提供,如果對P2口進(jìn)行相應(yīng)的修改,也可尋址片外RAM的全部64KB單元。

【例3-10】試寫出完成以下功能需要的指令序列:

①將片內(nèi)RAM30H單元中的內(nèi)容送入片外RAM1000H單元中;

②將片外RAM1000H單元中的內(nèi)容送入片內(nèi)RAM40H單元中;

③將片外RAM1000H單元中的內(nèi)容送入片外RAM2000H單元中。

因為在MCS-51單片機(jī)中,與片外RAM打交道的只能是累加器A,所以所有需要送入片外RAM的數(shù)據(jù)必須通過累加器A送出去,而所有要讀入的片外RAM中的數(shù)據(jù)也必

須先讀入到累加器A中。并且使用時應(yīng)先將要讀或?qū)懙牡刂匪腿隓PTR中,然后再用讀/寫命令。

注意:片外擴(kuò)展的I/O接口也要利用這4條指令進(jìn)行數(shù)據(jù)的輸入/輸出。

3)訪問ROM的MOVC指令

通常ROM中可以存放兩類內(nèi)容:一是單片機(jī)執(zhí)行的程序代碼;二是一些固定不變的常數(shù)(如表格數(shù)據(jù)、字符代碼等)。訪問ROM實際是指讀取ROM常數(shù)表中的數(shù)據(jù),簡稱查表,而訪問ROM的數(shù)據(jù)傳送指令被稱為查表指令。該指令必須通過累加器A且采用變址尋址的方法來完成,采用的指令助記符為MOVC,有以下單字節(jié)指令:

第一條指令以數(shù)據(jù)指針DPTR作為基址寄存器,累加器A的內(nèi)容作為無符號數(shù)和DPTR的內(nèi)容相加得到一個16位的地址,把該地址指出的ROM單元的內(nèi)容送到累加器A中。

第二條指令以程序計數(shù)器PC作為基址寄存器,累加器A的內(nèi)容作為無符號數(shù)和PC的當(dāng)前值(下一條指令的起始地址)相加后得到一個16位的地址,把該地址指出的ROM單元的內(nèi)容送到累加器A中。

【例3-11】假設(shè)從ROM的1000H單元開始存放0~9的平方值,如果以DPTR為基址寄存器進(jìn)行查表得5的平方值,其程序段如下:

執(zhí)行結(jié)果為(DPTR)=1000H,(A)=19H。

如果以PC作為基址寄存器進(jìn)行上述查表功能,并假設(shè)MOVC指令所在地址(PC)=0FF5H,則在執(zhí)行查表指令之前要進(jìn)行地址調(diào)整,因為PC的當(dāng)前值與表格首地址的偏移

量為1000H-(0FF5H+1)=0AH,所以相應(yīng)的程序段如下:

執(zhí)行結(jié)果為(PC)=0FF6H,(A)=19H。

2.數(shù)據(jù)交換指令

數(shù)據(jù)交換指令是將數(shù)據(jù)進(jìn)行雙向傳送,是兩個字節(jié)間或兩個半字節(jié)間的雙向交換,涉及傳送的雙方互為源操作數(shù)、目的操作數(shù),指令執(zhí)行后雙方的操作數(shù)互換。因此,兩操作數(shù)均未丟失。數(shù)據(jù)交換指令又分為字節(jié)交換指令和半字節(jié)交換指令兩種。

1)字節(jié)交換指令

字節(jié)交換指令包括以下3條:

這3條指令的功能是將累加器A中的數(shù)據(jù)與源操作數(shù)中的數(shù)據(jù)進(jìn)行互換。即指令執(zhí)行后,源操作數(shù)中的內(nèi)容與交換前的累加器A中的內(nèi)容相同,累加器A中的內(nèi)容與交換前的源

操作數(shù)中的內(nèi)容相同。

2)半字節(jié)交換指令

半字節(jié)交換指令如下:

第一條指令的功能是將累加器A的低4位(低半字節(jié))與間接寄存器所指向的地址單元中的低4位互換,而各自的高4位(高半字節(jié))保持不變。

第二條指令的功能是將累加器A內(nèi)部的高4位與低4位的內(nèi)容互換。

【例3-12】已知(R0)=30H,(30H)=4AH,(A)=28H,試分析下列指令執(zhí)行的結(jié)果:

①XCHA,@R0

②XCHDA,@R0

③SWAPA

解:①程序執(zhí)行后,(A)=4AH,(30H)=28H。

②程序執(zhí)行后,(A)=2AH,(30H)=48H。

③程序執(zhí)行后,(A)=82H。

3.堆棧操作指令

堆棧是按“后進(jìn)先出”的規(guī)則組織的一片存儲區(qū)域。在MCS51單片機(jī)中,堆棧設(shè)置在片內(nèi)RAM的低128字節(jié)單元,堆棧的棧頂由堆棧指針SP指出。

堆棧操作指令是一種特殊的數(shù)據(jù)傳送指令,其特點是根據(jù)SP中棧頂?shù)刂愤M(jìn)行數(shù)據(jù)傳送操作。這類指令共有如下2條:

第一條指令為入棧指令,其功能是把direct單元中的操作數(shù)傳送到堆棧中去。這條指令執(zhí)行時分為兩步:第一步,將SP中的棧頂?shù)刂芳?,使之指向堆棧的新的棧頂單元;第二步,把direct所指定的單元中的數(shù)據(jù)壓入由SP所指示的棧頂單元。

第二條指令為出棧指令,其功能是把堆棧中的操作數(shù)傳送到direct單元。這條指令執(zhí)行時也分為兩步:第一步,把由SP所指示的棧頂單元中的操作數(shù)傳送到direct單元;第二步,將SP中的原棧頂?shù)刂窚p1,使之指向新的棧頂?shù)刂贰?/p>

入棧指令和出棧指令一般是成對出現(xiàn)的。

【例3-13】把數(shù)據(jù)指針DPTR、狀態(tài)標(biāo)志寄存器PSW、累加器A中的數(shù)據(jù)入棧保護(hù)。

解:執(zhí)行結(jié)果如圖3-8所示,完成該功能的程序如下:圖3-8PUSH指令的執(zhí)行結(jié)果

【例3-14】將上例中在堆棧里保存的數(shù)據(jù)恢復(fù)(彈出)到DPTR、PSW、A中。

解:執(zhí)行結(jié)果如圖3-9所示,完成該功能的程序如下:圖3-9POP指令的執(zhí)行結(jié)果

【例3-15】用堆棧指令實現(xiàn)RAM10H和20H中的內(nèi)容交換,設(shè)(10H)=12H,(20H)=34H。

參考程序:

3.3.2算術(shù)運算類指令

算術(shù)運算類指令可以分為加法、減法、乘法和除法指令4類,這一類指令的最大特點是執(zhí)行后可能會影響狀態(tài)標(biāo)志寄存器PSW的某些標(biāo)志位。

1.加法指令

加法指令可分為4類:不帶Cy的加法指令、帶Cy的加法指令、加1指令和十進(jìn)制調(diào)整指令。

1)不帶Cy的加法指令

不帶Cy的加法指令有以下4條:

這4條加法指令的一個加數(shù)必須由累加器A提供,而另一個加數(shù)可由寄存器尋址、直接尋址、寄存器間接尋址和立即尋址4種不同的尋址方式得到,相加的結(jié)果再存入累加器A中。

這些指令執(zhí)行后,根據(jù)指令的執(zhí)行情況,硬件自動對PSW中的Cy、Ac、OV和P四個標(biāo)志位重新進(jìn)行置1或清0:

·加法運算結(jié)果中,有向最高位進(jìn)位時,Cy=1,反之Cy=0;

·加法運算結(jié)果中,有低4位向高4位進(jìn)位時,Ac=1,反之Ac=0;

·加法運算結(jié)果中,第6位和第7位不同時產(chǎn)生進(jìn)位時,則代表運算有溢出,即OV=1,反之OV=0;

·累加器A中有奇數(shù)個“1”時,P=1,反之P=0。

【例3-16】分析如下程序段執(zhí)行后,累加器A及PSW相關(guān)標(biāo)志的結(jié)果。

解:第一條指令將立即數(shù)92H送入A中,第二條指令將立即數(shù)C9H與A中的92H相加,結(jié)果存入A中。

指令執(zhí)行后,(A)=01011011B=5BH,Cy=1,Ac=0,OV=1,P=1。

2)帶Cy的加法指令

帶Cy的加法指令有以下4條:

這組指令與不帶Cy的加法指令的區(qū)別在于:帶Cy的加法指令在執(zhí)行加法運算時必須考慮該指令執(zhí)行之前已經(jīng)存在的進(jìn)位標(biāo)志位Cy,即這組指令有三個操作數(shù)參加加法運算。

【例3-17】已知當(dāng)前的Cy=1,分析下列指令的執(zhí)行結(jié)果。

解:執(zhí)行結(jié)果為(A)=1DH,Cy=1,Ac=0,OV=1,P=0。

【例3-18】若16位二進(jìn)制數(shù)分別存放在工作寄存器R1R0和R3R2中,試編程計算R1R0+R3R2,并將結(jié)果存放在R5R4中。

分析:因為MCS-51單片機(jī)的CPU是8位的,所以只能進(jìn)行單字節(jié)加法運算,若想實現(xiàn)多字節(jié)加法運算,比如本例的R1R0+R3R2,首先應(yīng)進(jìn)行兩個低8位字節(jié)的加法運算,此時不需要考慮加法指令執(zhí)行之前存在的進(jìn)位標(biāo)志位Cy,即只需要計算R0+R2。接下來要進(jìn)行高位字節(jié)加法運算時必須考慮前一步加法運算產(chǎn)生的進(jìn)位標(biāo)志位Cy,即需要計算1+R3+Cy。注意,加法指令的一個加數(shù)必須由累加器A提供。

3)加1指令

加1指令包括以下5條:

這組指令都是單操作數(shù)指令,指令中的操作數(shù)既為源操作數(shù)又為目的操作數(shù)。這組指令的功能是把源操作數(shù)所指定的單元內(nèi)容加1,結(jié)果再送回原來單元。除“INCA”指令可能會影響P標(biāo)志位外,其余指令不影響PSW的標(biāo)志位。

【例3-19】將片內(nèi)RAM中30H為起始地址的3個無符號數(shù)相加,并將結(jié)果(假設(shè)小于256)存放到40H單元中,試編程實現(xiàn)該功能。

分析:要想實現(xiàn)該程序的功能,可以采取多種方法,比如直接從存儲區(qū)提取數(shù)據(jù)進(jìn)行順序相加或利用指針從存儲區(qū)提取數(shù)據(jù)進(jìn)行順序相加。

4)十進(jìn)制調(diào)整指令

十進(jìn)制調(diào)整指令如下:

其功能是在進(jìn)行BCD碼加法運算時,跟在ADD和ADDC指令之后,對相加后存放在累加器A中的運算結(jié)果進(jìn)行十進(jìn)制調(diào)整:若累加器低4位大于9或輔助進(jìn)位位Ac=1,則將累

加器作加6調(diào)整,即低4位進(jìn)行加6修正;若累加器高4位大于9或進(jìn)位位Cy=1,則將累加器作加60H調(diào)整,即高4位進(jìn)行加6修正。

【例3-20】試編寫程序,實現(xiàn)95+59的BCD碼加法。

參考程序:

上述程序段執(zhí)行后,(A)=54H,Cy=1,即95+59=154,結(jié)果是正確的。若不采用“DAA”進(jìn)行調(diào)整,結(jié)果為EEH就不正確了。

2.減法指令

減法指令可分為帶Cy的減法指令和減1指令兩種。

1)帶Cy的減法指令

帶Cy的減法指令包括以下4條:

其功能是用累加器A提供的操作數(shù)減去指令執(zhí)行前的

Cy值和源操作數(shù)所指內(nèi)容,最終結(jié)果存在A中。這些指令執(zhí)行后,根據(jù)指令的執(zhí)行情況,硬件重新對PSW中的Cy、Ac、OV和P四個標(biāo)志位進(jìn)行置1或清0:

·當(dāng)減法運算結(jié)果的最高位有借位時,Cy=1,否則Cy=0;

·當(dāng)減法運算的低4位向高4位有借位時,Ac=1,否則Ac=0;

·在減法運算中,第6位和第7位不同時產(chǎn)生借位時,OV=1,否則OV=0;

·當(dāng)累加器A中有奇數(shù)個“1”時,P=1,否則P=0。

MCS-51單片機(jī)指令系統(tǒng)中沒有不帶Cy的減法指令,若用此組指令完成不帶Cy的減法功能,必須將Cy先清0。帶Cy

的減法指令常用于多字節(jié)數(shù)減法運算中。

【例3-21】已知Cy=1,分析下列指令的執(zhí)行結(jié)果。

解:執(zhí)行結(jié)果為(A)=22H,Cy=0,Ac=0,OV=0,P=0。

【例3-22】試編寫1234H-0FA3H的程序段,將結(jié)果高8位存入51H,低8位存入50H單元。

分析:與多字節(jié)加法運算一樣,MCS-51單片機(jī)若想實現(xiàn)多字節(jié)減法運算,首先應(yīng)進(jìn)行兩個低8位字節(jié)的減法運算,此時不需要考慮之前存在的借位標(biāo)志位Cy。因為MCS51單片機(jī)中沒有不帶Cy的減法指令,所以在利用SUBB指令執(zhí)行該步減法操作之前需要將Cy先清0。接下來進(jìn)行高位字節(jié)減法運算時直接利用SUBB指令即可,因為該指令考慮了前一步減法運算產(chǎn)生的借位標(biāo)志位Cy。注意,減法指令的一個減數(shù)必須由累加器A提供。

2)減1指令

減1指令包括以下4條:

其功能是把源操作數(shù)所指定的單元內(nèi)容減1,結(jié)果再送回原來單元。除“DECA”指令可能會影響P標(biāo)志位外,其余指令不影響PSW的標(biāo)志位。

3.乘法指令

乘法指令如下:

其功能是將累加器A和寄存器B中的兩個8位無符號數(shù)相乘,乘積為16位,高8位存放在B中,低8位存放在A中。運算結(jié)果影響PSW標(biāo)志中的Cy、OV和P:指令執(zhí)行后,Cy=0;若乘積大于FFH(255),則OV=1,否則OV=0;奇偶校驗位P由累加器A中“1”的奇偶性決定。

【例3-23】分析下列指令執(zhí)行的結(jié)果。

解:執(zhí)行結(jié)果為(A)=56H,(B)=1CH,Cy=0,OV=1,P=0。

4.除法指令

除法指令如下:

其功能是將累加器A中的8位無符號整數(shù)除以寄存器B中的8位無符號整數(shù),所得商存放在A中,余數(shù)存放在B中。運算結(jié)果影響PSW標(biāo)志中的Cy、OV和P:指令執(zhí)行后,Cy=0;若除數(shù)為0,則OV=1,否則OV=0;奇偶校驗位P由累加器A中“1”的奇偶性決定。

【例3-24】分析下列指令執(zhí)行的結(jié)果。

解:執(zhí)行結(jié)果為(A)=0BH,(B)=03H,Cy=0,OV=0,P=1。

3.3.3邏輯運算類指令

邏輯運算類指令的功能是進(jìn)行字節(jié)的邏輯與、或、異或、求反、清0、左右移位等操作。按照操作數(shù)數(shù)量不同可以分為單操作數(shù)邏輯運算指令和雙操作數(shù)邏輯運算指令兩種。

1.單操作數(shù)邏輯運算指令

單操作數(shù)邏輯運算指令只能對累加器A的內(nèi)容進(jìn)行邏輯操作。

1)累加器A清零指令

累加器A清零指令如下:

其功能是將累加器A清0。指令執(zhí)行后P=0,其他標(biāo)志位不受影響。

2)累加器A取反指令

累加器A取反指令如下:

其功能是將累加器A的8個位同時按位取反操作,不影響標(biāo)志位。

3)累加器A循環(huán)移位指令

(1)累加器A循環(huán)左移指令:

其功能是將累加器A中的內(nèi)容循環(huán)左移1位。該指令不影響標(biāo)志位,操作過程如圖3-10所示。圖3-10“RLA”指令的執(zhí)行示意圖

(2)累加器A連同Cy循環(huán)左移指令:

其功能是將累加器A的內(nèi)容與Cy一起循環(huán)左移1位。該指令不影響Ac和OV標(biāo)志位,但執(zhí)行后將影響Cy和P標(biāo)志位,操作過程如圖3-11所示。圖3-11“RLCA”指令的執(zhí)行示意圖

(3)累加器A循環(huán)右移指令:

其功能是將累加器A中的內(nèi)容循環(huán)右移1位。該指令不影響標(biāo)志位,操作過程如圖3-12所示。圖3-12“RRA”指令的執(zhí)行示意圖

(4)累加器A連同Cy循環(huán)右移指令:

其功能是將累加器A的內(nèi)容與Cy一起循環(huán)右移1位。指令執(zhí)行后影響Cy和P標(biāo)志位,操作過程如圖3-13所示。圖3-13“RRCA”指令的執(zhí)行示意圖

【例3-25】設(shè)(A)=5AH(代表十進(jìn)制數(shù)90),且Cy=0。

①若執(zhí)行指令“RLCA”,結(jié)果為(A)=B4H(代表十進(jìn)制數(shù)180);

②若執(zhí)行指令“RRCA”,結(jié)果為(A)=2DH(代表十進(jìn)制數(shù)45)。

2.雙操作數(shù)邏輯運算指令

1)邏輯與運算指令

邏輯與運算指令如下:

其功能是將源操作數(shù)單元的內(nèi)容與目的操作數(shù)單元的內(nèi)容按位相與,結(jié)果存放到目的操作數(shù)單元中,而源操作數(shù)單元中的內(nèi)容不變。指令運行時僅影響P標(biāo)志位。

邏輯與運算指令常用來屏蔽字節(jié)中的某些不用位,其他位保持不變。實現(xiàn)方法:欲屏蔽的位與“0”相與,保持不變的位與“1”相與。

【例3-26】已知(A)=39H=00111001B,試分析下列指令的執(zhí)行結(jié)果。

①ANLA,#0FH

②ANLA,#0F0H

③ANLA,#0FFH

解:①因為A的高4位都與“0”相與,低4位都與“1”相與,所以高4位被屏蔽,低4位保持不變,即(A)=09H=00001001B。

②因為A的高4位都與“1”相與,低4位都與“0”相與,所以高4位保持不變,低4位被屏蔽,即(A)30H=00110000B。

③因為A的8位都與“1”相與,所以8位均保持不變,即(A)=39H=00111001B。

2)邏輯或運算指令

邏輯或運算指令如下:

其功能是將源操作數(shù)單元的內(nèi)容與目的操作數(shù)單元的內(nèi)容按位相或,結(jié)果存放到目的操作數(shù)單元中,而源操作數(shù)單元中的內(nèi)容不變。指令運行時僅影響P標(biāo)志位。

邏輯或運算指令常用來使字節(jié)中某些位置“1”,其他位保持不變。實現(xiàn)方法:欲置1的位與“1”相或,保持不變的位與“0”相或。

【例3-27】已知(A)=39H=00111001B,試分析下列指令的執(zhí)行結(jié)果。

①ORLA,#0FH

②ORLA,#0F0H

③ORLA,#00H

解:①因為A的高4位都與“0”相或,低4位都與“1”相或,所以高4位保持不變,低4位被置1,即(A)=3FH=00111111B。

②因為A的高4位都與“1”相或,低4位都與“0”相或,所以高4位被置1,低4位保持不變,即(A)=0F9H=11111001B。

③因為A的8位都與“0”相或,所以8位均保持不變,即(A)=39H=00111001B。

3)邏輯異或運算指令

邏輯異或運算指令如下:.

其功能是將源操作數(shù)單元的內(nèi)容與目的操作數(shù)單元的內(nèi)容相異或,結(jié)果存放到目的操作數(shù)單元中,而源操作數(shù)單元中的內(nèi)容不變。指令運行時僅影響P標(biāo)志位。

邏輯異或運算指令常用來使字節(jié)中某些位進(jìn)行取反操作,其他位保持不變。實現(xiàn)方法:欲取反的位與“1”相異或,保持不變的位與“0”相異或。

【例3-28】已知(A)=39H=00111001B,試分析下列指令的執(zhí)行結(jié)果。

①XRLA,#0FH

②XRLA,#0F0H

③XRLA,#0FFH

解:①因為A的高4位都與“0”相異或,低4位都與“1”相異或,所以高4位保持不變,低4位按位取反,即(A)=36H=00110110B。

②因為A的高4位都與“1”相異或,低4位都與“0”相異或,所以高4位按位取反,低4位保持不變,即(A)0C9H=11001001B。

③因為A的8位都與“1”相異或,故8位均按位取反,即(A)=0C6H=11000110B。

【例3-29】試編寫程序,將存放在片外RAM2000H

單元中某數(shù)的低4位取反,高2位置1,其余2位清0。

分析:根據(jù)前面介紹可知,某些位欲清0應(yīng)與“0”相與,保持不變的位應(yīng)與“1”相與;某些位欲置1應(yīng)與“1”相或,保持不變的位應(yīng)與“0”相或;某些位欲取反應(yīng)與“1”相異或,保持不變的位應(yīng)與“0”相異或。因此,為實現(xiàn)片外RAM2000H單元中某數(shù)的低4位取反,高2位置1,其余2位清0,需要先將該數(shù)從片外RAM讀到累加器中,然后對該數(shù)的相應(yīng)位進(jìn)行“異或”、“或”及“與”操作,最后再將數(shù)據(jù)送回片外RAM。

【例3-30】試編寫程序,將累加器A的低4位狀態(tài)通過P1口的高4位輸出,P1口的低4位狀態(tài)不變。

3.3.4控制轉(zhuǎn)移類指令

控制轉(zhuǎn)移類指令包括無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、子程序調(diào)用與返回指令、空操作指令4種??刂妻D(zhuǎn)移類指令的作用是根據(jù)要求改變PC值,以控制程序運行的方向,所

有這些指令的目標(biāo)地址都在ROM空間內(nèi)。

1.無條件轉(zhuǎn)移指令

無條件轉(zhuǎn)移是指當(dāng)程序執(zhí)行到該指令時,程序無條件轉(zhuǎn)移到指令所提供的地址處執(zhí)行。無條件轉(zhuǎn)移指令包括長轉(zhuǎn)移指令、短轉(zhuǎn)移指令、相對轉(zhuǎn)移指令和間接轉(zhuǎn)移指令4條。

1)長轉(zhuǎn)移指令

長轉(zhuǎn)移指令如下:

這是一條三字節(jié)指令,提供了16位的轉(zhuǎn)移目標(biāo)地址,機(jī)器碼為

執(zhí)行LJMP指令時,將指令的第2字節(jié)和第3字節(jié)的內(nèi)容分別裝入PC的高8位和低8位中,使程序無條件轉(zhuǎn)移到addr16指出的目標(biāo)地址,不影響標(biāo)志位。

由于指令中提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序在全部64KB的ROM空間內(nèi)轉(zhuǎn)移。

“LJMP$”與“SSS:LJMPSSS”相同。

2)短轉(zhuǎn)移指令

短轉(zhuǎn)移指令如下:

這是一條雙字節(jié)指令,提供了11位地址,機(jī)器碼為

該指令的特點是由addr11的高3位與指令操作碼00001共同組成指令的第一個字節(jié),addr11的低8位組成指令的第二個字節(jié)。

本指令是為能與MCS48的JMP指令兼容而設(shè)的。

3)相對轉(zhuǎn)移指令

相對轉(zhuǎn)移指令如下:

這是一條雙字節(jié)指令,第一個字節(jié)為操作碼,第二個字節(jié)是偏移量rel,其中rel是一個有符號的8位二進(jìn)制數(shù),以補(bǔ)碼形式置于操作碼之后存放,取值范圍是-128~+127。負(fù)數(shù)表示向地址減小的方向轉(zhuǎn)移(反向轉(zhuǎn)移),正數(shù)表示向地址增加的方向轉(zhuǎn)移(正向轉(zhuǎn)移),相對的基準(zhǔn)是PC的當(dāng)前值。因此,轉(zhuǎn)移的目標(biāo)地址為

例如,在(PC)=1000H單元有一條“SJMPrel”指令,若rel=3AH(+58),則程序正向轉(zhuǎn)移到002H+58=1002H+003AH=103CH地址處;若rel=F0H(-16),則程序反向轉(zhuǎn)移到1002H-16=1002H+FFF0H=0FF2H地址處。

若rel=FEH(-2),則目標(biāo)地址=(PC)+2-2=(PC),即轉(zhuǎn)移的目標(biāo)地址就是“SJMP”指令的地址,在匯編指令中該偏移地址可用$符號表示。若在程序的末尾加上“SJMP$”指令(機(jī)器碼為80H、FEH),則程序?qū)⒃谠撎庍M(jìn)行無限循環(huán),進(jìn)入等待狀態(tài)。

用匯編語言編程時,指令中的偏移量rel常用目標(biāo)地址的標(biāo)號表示。匯編器能自動算出相對地址值。另外,在匯編程序中長轉(zhuǎn)移指令可以替代短轉(zhuǎn)移指令和相對轉(zhuǎn)移指令。

4)間接轉(zhuǎn)移指令

間接轉(zhuǎn)移指令如下:

這是一條單字節(jié)指令,轉(zhuǎn)移的目標(biāo)地址由累加器A與數(shù)據(jù)指針DPTR的內(nèi)容之和來確定,可以實現(xiàn)在64KB范圍內(nèi)無條件轉(zhuǎn)移。

該指令以DPTR的內(nèi)容為基地址,A的內(nèi)容作變址,因此只要把DPTR的值固定,然后賦予A不同的值,即可實現(xiàn)程序的多分支轉(zhuǎn)移。指令在執(zhí)行后不改變DPTR及A中原來的內(nèi)容,也不影響標(biāo)志位。間接轉(zhuǎn)移指令可代替眾多的判別跳轉(zhuǎn)指令,又稱為散轉(zhuǎn)指令。

【例3-31】已知累加器A中存放著控制程序轉(zhuǎn)向的編號0~3,ROM中存有起始地址為TABLE的三字節(jié)長轉(zhuǎn)移指令表,試編程使單片機(jī)能按照累加器A中的編號轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序,即當(dāng)(A)=00H時,執(zhí)行TAB0分支程序;當(dāng)(

A)=01H時,執(zhí)行TAB1分支程序;當(dāng)(A)=02H時,執(zhí)行TAB2分支程序;當(dāng)(A)=03H時,執(zhí)行TAB3分支程序。

分析:因為表格中的LJMP是三字節(jié)指令,所以執(zhí)行查表指令之前應(yīng)將累加器A的內(nèi)容乘以3,以形成正確偏移量。有多種方法能夠?qū)崿F(xiàn)將A乘以3的功能,例如,可以先給B

賦值3,然后執(zhí)行“MULAB”指令;還可以先將Cy清零,并將A的內(nèi)容暫時傳遞給其他存儲單元/寄存器,然后令A(yù)執(zhí)行帶Cy的循環(huán)左移指令得到2×A,最后執(zhí)行“ADDA,direct/Rn”指令得到3×A。本例采用后一種方法實現(xiàn)將A乘以3的功能。

MCS-51單片機(jī)的4條無條件轉(zhuǎn)移指令各具特點,下面對它們的特點進(jìn)行簡單的總結(jié):

①“LJMPaddr16”是三字節(jié)的長轉(zhuǎn)移指令,指令提供16位直接目標(biāo)地址,程序可以在64KB地址空間內(nèi)轉(zhuǎn)移。

②“AJMPaddr11”是雙字節(jié)的短轉(zhuǎn)移指令,指令提供11位目標(biāo)地址,程序的轉(zhuǎn)移目標(biāo)地址是在包含PC當(dāng)前值在內(nèi)的同一個2KB區(qū)域。

③“SJMPrel”是雙字節(jié)的相對轉(zhuǎn)移指令,指令提供相對偏移量,程序是在PC當(dāng)前值為起始地址的-128~+127B范圍內(nèi)轉(zhuǎn)移。

以上3條指令都能使程序轉(zhuǎn)移到一個固定的目標(biāo)地址處,原則上說所有使用SJMP或AJMP的地方都可以用LJMP來替代。

④“JMP@A+DPTR”是單字節(jié)間接轉(zhuǎn)移指令,與前3條指令相比,雖然該指令的用途也是跳轉(zhuǎn),但是轉(zhuǎn)到什么地方去不能由標(biāo)號簡單地決定。因為轉(zhuǎn)移地址是由A和DPTR相加構(gòu)成的,根據(jù)A的不同值就可以實現(xiàn)程序的多分支轉(zhuǎn)移。

2.條件轉(zhuǎn)移指令

條件轉(zhuǎn)移是當(dāng)某種條件滿足時,程序執(zhí)行轉(zhuǎn)移;條件不滿足時,程序仍按原來順序執(zhí)行。轉(zhuǎn)移的條件可以是上一條指令或更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標(biāo)志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運算結(jié)果。由于該類指令采用相對尋址,因此程序可在以PC當(dāng)前值為中心的-128~+127B范圍內(nèi)轉(zhuǎn)移。條件轉(zhuǎn)移指令可以分為累加器判0條件轉(zhuǎn)移指令、比較不相等條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令3種。

1)累加器判零條件轉(zhuǎn)移指令

JZ指令的功能是若累加器(A)=0就轉(zhuǎn)移,否則就繼續(xù)往下執(zhí)行;JNZ指令與JZ指令的功能正好相反,若累加器(A)≠0就轉(zhuǎn)移,否則就順序執(zhí)行。累加器A的內(nèi)容是否為0,是由

這條指令以前的其他指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運算,也不影響標(biāo)志位。

這兩條指令都是雙字節(jié)相對轉(zhuǎn)移指令,rel為相對地址偏移量,當(dāng)各自的條件滿足時,程序轉(zhuǎn)移的目標(biāo)地址為(PC)+2+rel。該指令的轉(zhuǎn)移范圍在PC當(dāng)前值為起始地址的-128~+127B范圍內(nèi)。

【例3-32】試編寫程序,將片內(nèi)RAM以40H為起始地址的數(shù)據(jù)塊傳送到片外RAM以2000H為起始地址的區(qū)域,遇0中止。

分析:要實現(xiàn)多個存儲區(qū)的內(nèi)容傳送,通常采用Ri指針指向片內(nèi)RAM首地址,采用DPTR指向片外RAM首地址。對于片內(nèi)RAM存儲區(qū)內(nèi)容的傳送,可以采用A或其他存儲單元作中轉(zhuǎn),但是涉及對片外RAM存儲區(qū)的訪問,必須通過A作中轉(zhuǎn)。

根據(jù)本題的要求,需要先將發(fā)送端起始地址40H送入Ri(i=0,1),然后將接收端起始地址2000H送入DPTR,再通過@Ri將發(fā)送端起始地址40H中的內(nèi)容送A,并對A的內(nèi)容進(jìn)行如下判斷:若A的內(nèi)容為0,則程序跳轉(zhuǎn)到結(jié)束語句,否則通過A將40H中的內(nèi)容送入片外RAM的2000H中。然后分別令Ri和DPTR加1,使它們分別指向下一存儲單元,繼續(xù)讀取數(shù)據(jù)、判斷、傳送或結(jié)束的循環(huán)過程

2)比較不相等條件轉(zhuǎn)移指令

其功能是對兩個規(guī)定的操作數(shù)進(jìn)行比較,并根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移。若兩個操作數(shù)相等,則程序順序執(zhí)行;若兩個操作數(shù)不相等,則程序進(jìn)行轉(zhuǎn)移,因為這組指令都是三

字節(jié)指令,所以轉(zhuǎn)移的目標(biāo)地址為(PC)+3+rel。

這組指令可以判斷兩個無符號數(shù)是否相等,如果兩數(shù)不相等,還能用Cy來反映哪個數(shù)大,哪個數(shù)小。因為指令執(zhí)行過程中的比較操作實際上是減法操作,只是不保存兩數(shù)之差,但要影響Cy標(biāo)志位:如果目的操作數(shù)的內(nèi)容大于源操作數(shù)的內(nèi)容,則Cy=0;如果目的操作數(shù)的內(nèi)容小于源操作數(shù)的內(nèi)容,則Cy=1。因此在程序轉(zhuǎn)移后利用標(biāo)志位Cy作進(jìn)一步的判斷,可實現(xiàn)三分支轉(zhuǎn)移。

【例3-33】試用含有CJNE的指令編寫程序,將片內(nèi)RAM以40H為起始地址的數(shù)據(jù)塊傳送到片外RAM以2000H為起始地址的區(qū)域,遇0中止。

分析:本例同例3-32,采用Ri指針指向片內(nèi)RAM首地址,采用DPTR指向片外RAM首地址。不同之處在于:例3-32先將片內(nèi)存儲區(qū)內(nèi)容讀取到累加器A,然后對A是否為0進(jìn)行判斷;而本例在讀取片內(nèi)存儲區(qū)內(nèi)容前,先利用CJNE指令將該存儲區(qū)的內(nèi)容與0進(jìn)行比較,如果片內(nèi)存儲區(qū)內(nèi)容為0,則直接結(jié)束循環(huán),否則通過累加器A作為中轉(zhuǎn)將片內(nèi)RAM的內(nèi)容送入片外RAM,傳送指令與例3-32一樣。

【例3-34】已知工作寄存器R0中存放著一個無符號數(shù)X,試編寫程序求出下式的函數(shù)值Y,并存入工作寄存器R1中。

分析:因為CJNE指令不僅可以判斷兩個操作數(shù)是否相等,還可以利用標(biāo)志位Cy來反映哪個數(shù)大,哪個數(shù)小,所以可以利用該指令實現(xiàn)三分支轉(zhuǎn)移。

本例的解題思路為:首先將存放在R0的X傳送到累加器A,然后利用CJNE指令讓A與10H進(jìn)行比較,如果(R0)=10H,則令(R1)=00H;如果(R0)≠10H,則需要根據(jù)Cy

來判斷。如果Cy=1,說明(R0)<10H,則令(R1)=0FFH;如果Cy=0,說明(R0)>10H,則令(R1)=0AAH。

3)減1(循環(huán))條件轉(zhuǎn)移指令

減1條件轉(zhuǎn)移指令是把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令。每執(zhí)行這種指令時,先把第一操作數(shù)的內(nèi)容減1,并把減1后的結(jié)果仍保存在第一操作數(shù)中,然后判斷結(jié)果

是否為0。若不為0,則轉(zhuǎn)移到指定的地址單元,否則順序執(zhí)行。

這組指令對于構(gòu)成循環(huán)程序是十分有用的,可以指定任何一個工作寄存器作為程序循環(huán)計數(shù)器。每循環(huán)一次,這種指令被執(zhí)行一次,計數(shù)器就減1。預(yù)定的循環(huán)次數(shù)不到,計數(shù)器不會為0,繼續(xù)執(zhí)行循環(huán)操作;到達(dá)預(yù)定的循環(huán)次數(shù),計數(shù)器就被減為0,順序執(zhí)行下一條指令,也就結(jié)束了循環(huán)。

【例3-35】試編寫程序,將片內(nèi)RAM以DAT為起始地址的10個單元中的數(shù)據(jù)求和,并將結(jié)果送入SUM單元。假設(shè)和不大于255。

分析:該例涉及10個存儲單元的求和問題,最好采用循環(huán)語句實現(xiàn)其功能,并且可以利用DJNZ指令或CJNE指令實現(xiàn)循環(huán)相加的過程。因為這兩個指令特點不同,因此程序

的實現(xiàn)過程也有所區(qū)別,如例3-32和例3-33,本例分別利用這兩個指令編寫程序。

3.子程序調(diào)用與返回指令

子程序是一種重要的程序結(jié)構(gòu),它可以在程序中反復(fù)多次使用,且能減少程序所占的存儲空間。為了實現(xiàn)主程序?qū)ψ映绦虻囊淮瓮暾{(diào)用,主程序應(yīng)該能在需要時通過調(diào)用指

令自動轉(zhuǎn)入子程序執(zhí)行,子程序執(zhí)行完后應(yīng)能通過返回指令自動返回調(diào)用指令的下一條指令(該指令地址被稱為斷點地址)執(zhí)行。因此,調(diào)用指令是在主程序需要調(diào)用子程序時使用

的,返回指令則需放在子程序的末尾。調(diào)用和返回指令必須是成對使用的。調(diào)用指令具有把斷點地址保護(hù)到堆棧以及把子程序入口地址自動送入PC的功能;返回指令則具有能把堆棧中的斷點地址自動恢復(fù)到PC的功能。

1)調(diào)用指令

這兩條指令分別可以實現(xiàn)子程序的長調(diào)用和短調(diào)用,目標(biāo)地址的形成方式與LJMP和AJMP指令類似,不同之處在于:在轉(zhuǎn)移前要把PC的當(dāng)前值自動壓入堆棧后,才將子程序入口地址addr16(或addr11)送入PC,并且調(diào)用指令遇到RET后結(jié)束并返回。

2)返回指令

子程序執(zhí)行完后,程序應(yīng)返回到原調(diào)用指令的下一指令處繼續(xù)執(zhí)行,因此,在子程序的結(jié)尾必須設(shè)置返回指令RET。中斷服務(wù)程序執(zhí)行完后,程序應(yīng)返回到斷點的下一指令處繼續(xù)執(zhí)行,因此,在中斷服務(wù)程序的結(jié)尾必須設(shè)置返回指令RETI。

從功能上看,這兩條指令完全相同,都是把堆棧中斷點地址恢復(fù)到PC中,從而使單片機(jī)回到斷點處執(zhí)行程序。但這兩條指令具有以下區(qū)別:

①在使用方面,RET指令必須作子程序的最后一條指令;RETI必須作中斷服務(wù)程序的最后一條指。兩者不能互換使用。

②RETI指令除恢復(fù)斷點地址外,還恢復(fù)CPU響應(yīng)中斷時硬件自動保護(hù)的現(xiàn)場信息,如將清除中斷響應(yīng)時所置1的優(yōu)先級狀態(tài)觸發(fā)器,使得已申請的同級或低級中斷申請可以響應(yīng);而RET指令只能恢復(fù)返回地址。

③在確定性方面,RET指令的返回地址對開發(fā)者來說,是確知的,而RETI指令的返回地址對開發(fā)者來說,是未知的。

4.空操作指令

空操作指令是一條單字節(jié)單周期指令,操作碼為00H。執(zhí)行該指令除了使PC的內(nèi)容加1并消耗一個機(jī)器周期的時間以外,不產(chǎn)生任何操作結(jié)果,也不影響任何標(biāo)志位。NOP

指令常用于分割程序的不同功能模塊或短時間的延時。

3.3.5位操作類指令

MCS51單片機(jī)的特色之一就是具有很強(qiáng)的位處理功能,它借用進(jìn)位標(biāo)志位Cy作為位累加器,用片內(nèi)RAM20H~2FH(字節(jié)地址)單元中的128個位作為位RAM。另外,因為它擁有自己的位I/O口(P0.0~P0.7,P1.0~P1.7,P2.0~P2.7和P3.0~P3

溫馨提示

  • 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

提交評論