《單片機(jī)原理與接口技術(shù)》第3章MCS51單片機(jī)的指令系統(tǒng)課件_第1頁(yè)
《單片機(jī)原理與接口技術(shù)》第3章MCS51單片機(jī)的指令系統(tǒng)課件_第2頁(yè)
《單片機(jī)原理與接口技術(shù)》第3章MCS51單片機(jī)的指令系統(tǒng)課件_第3頁(yè)
《單片機(jī)原理與接口技術(shù)》第3章MCS51單片機(jī)的指令系統(tǒng)課件_第4頁(yè)
《單片機(jī)原理與接口技術(shù)》第3章MCS51單片機(jī)的指令系統(tǒng)課件_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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)介

高等職業(yè)教育計(jì)算機(jī)類課程規(guī)劃教材單片機(jī)原理與接口技術(shù)大連理工大學(xué)出版社高等職業(yè)教育單片機(jī)原理與接口技術(shù)大連理工大學(xué)出版社1第3章MCS-51單片機(jī)的指令系統(tǒng)3.1指令格式及分類3.2尋址方式3.3數(shù)據(jù)傳送指令3.4算術(shù)運(yùn)算指令3.5邏輯操作指令3.6控制轉(zhuǎn)移指令3.7位處理指令第3章MCS-51單片機(jī)的指令系統(tǒng)3.1指令23.1.1指令格式

MCS-51系列單片機(jī)指令有兩種標(biāo)識(shí)方式:機(jī)器語(yǔ)言方式和匯編語(yǔ)言方式。機(jī)器語(yǔ)言方式由二進(jìn)制代碼組成(通常用十六進(jìn)制表示),被稱為機(jī)器指令。用機(jī)器指令編寫的程序稱為機(jī)器語(yǔ)言源程序,它是機(jī)器所能理解和執(zhí)行的,但人們記憶和讀寫都很困難。匯編語(yǔ)言方式由方便人們記憶的“助記符”和數(shù)字符號(hào)組成,被稱為符號(hào)指令。用符號(hào)指令編寫的程序稱為匯編語(yǔ)言源程序,它必須通過(guò)匯編程序匯編成機(jī)器語(yǔ)言程序后,機(jī)器才能理解和執(zhí)行。匯編過(guò)程也可以手工完成,即手工匯編。3.1指令格式及分類3.1.1指令格式3.1指令格式及分類3

1.匯編語(yǔ)言指令格式匯編語(yǔ)言指令的一般格式如下:[標(biāo)號(hào):]操作碼[第一操作數(shù)][,第二操作數(shù)][,第三操作數(shù)][;注釋]

說(shuō)明:

(1)帶方括號(hào)的部分為可選項(xiàng)。(2)標(biāo)號(hào)是用符號(hào)表示的一個(gè)地址常量。它表示該指令在程序存儲(chǔ)器中的起始地址。標(biāo)號(hào)的命名規(guī)則是:必須以字母開頭,長(zhǎng)度不超過(guò)6個(gè)字符,并以“:”結(jié)束。(3)操作碼表示指令的操作功能。每條指令都有操作碼。(4)操作數(shù)表示的是參與操作的數(shù)據(jù)來(lái)源和操作之后結(jié)果數(shù)據(jù)的存放位置,可以是常數(shù)、地址或寄存器符號(hào)。1.匯編語(yǔ)言指令格式4指令的操作數(shù)可能有1個(gè)、2個(gè)或3個(gè),有些指令可能沒(méi)有操作數(shù)。操作數(shù)與操作數(shù)之間用“,”分隔,操作碼與操作數(shù)之間用空格分隔。(5)注釋字段是編程人員對(duì)該指令或該段程序的功能說(shuō)明,是為了方便閱讀程序的一種標(biāo)注。注釋以“;”開始,當(dāng)匯編語(yǔ)言源程序被匯編成機(jī)器語(yǔ)言程序時(shí),該項(xiàng)被舍棄。

2.機(jī)器語(yǔ)言指令格式機(jī)器語(yǔ)言指令是一種二進(jìn)制代碼,它包括兩部分:操作碼和操作數(shù)。MCS-51指令系統(tǒng)中有單字節(jié)、雙字節(jié)和三字節(jié)共3種指令。

機(jī)器指令格式如下:(1)單字節(jié)指令指令的操作數(shù)可能有1個(gè)、2個(gè)或3個(gè),有些指令可能沒(méi)有5在單字節(jié)指令中,操作碼和操作數(shù)共占一個(gè)字節(jié),其中操作數(shù)通常為以隱含形式指定的常用寄存器。其指令格式如下:例如INCDPTR指令,其功能為DPTR←(DPTR)+1。指令機(jī)器碼為:MCS-51系列單片機(jī)中,單字節(jié)的機(jī)器指令共有49條。(2)雙字節(jié)指令雙字節(jié)指令的第一個(gè)字節(jié)為操作碼,第二個(gè)字節(jié)為操作數(shù)或操作數(shù)的地址。這類指令的指令格式為:操作碼nn

1010

0011操作碼操作數(shù)nn

nn+1

在單字節(jié)指令中,操作碼和操作數(shù)共占一個(gè)字節(jié),其中操作6例如MOVA,#00H指令,其功能為A←00H。指令機(jī)器碼為:MCS-51系列單片機(jī)中,雙字節(jié)的機(jī)器指令共有46條。(3)三字節(jié)指令三字節(jié)指令的第一個(gè)字節(jié)為操作碼,第二個(gè)字節(jié)和第三個(gè)字節(jié)都是操作數(shù)或操作數(shù)的地址。這類指令的指令格式為:例如MOV2FH,#00H指令,其功能為2FH←00H。0111010000000000操作碼操作數(shù)操作碼第一操作數(shù)nn

nn+1

第二操作數(shù)nn+2

例如MOVA,#00H指令,其功能為A←00H。指7指令機(jī)器碼為:MCS-51系列單片機(jī)中,三字節(jié)的機(jī)器指令共有16條。3.1.2指令分類

MCS-51系列單片機(jī)指令系統(tǒng)共有111條不同的指令。這些指令按每條指令的執(zhí)行時(shí)間分類,有64條單周期指令,45條雙周期指令和2條4周期指令;如果按字節(jié)數(shù)分類則有單字節(jié)的指令49條,雙字節(jié)的指令46條,三字節(jié)的指令16條。這些指令按指令操作功能劃分,有以下5類:●數(shù)據(jù)傳送指令(28條)

●算術(shù)運(yùn)算指令(24條)

0111010100101111操作碼第一操作數(shù)00000000第二操作數(shù)指令機(jī)器碼為:0111010100101118●邏輯運(yùn)算及移位指令(25條)●控制轉(zhuǎn)移指令(22條,含以位值為條件的轉(zhuǎn)移指令5條)●位操作指令(17條,含以位值為條件的轉(zhuǎn)移指令5條)3.1.3指令系統(tǒng)符號(hào)約定指令的一個(gè)重要組成部分是操作數(shù),為了表示指令中同一種類型的操作數(shù),MCS-51單片機(jī)指令系統(tǒng)采用了如下符號(hào)約定。

1.Rn:n=0~7,表示當(dāng)前工作寄存器區(qū)的8個(gè)工作寄存器R0~R7。2.Ri:i=0,1。表示當(dāng)前工作寄存器區(qū)的2個(gè)工作寄存器R0、R1。3.direct:表示8位內(nèi)部數(shù)據(jù)存儲(chǔ)單元的地址。

4.#data:表示8位立即數(shù)?!?”表示后面的data為立即數(shù)。5.#data16:表示16位立即數(shù)。“#”意義同上。

6.addr11:表示11位目的地址。●邏輯運(yùn)算及移位指令(25條)97.addr16:表示16位目的地址。

8.rel:表示帶符號(hào)的8位偏移量,被用在SJMP和所有條件轉(zhuǎn)移指令中。

9.bit:表示8位內(nèi)部數(shù)據(jù)存儲(chǔ)空間或特殊功能寄存器區(qū)中可按位尋址區(qū)的8位位地址。

10.bit:表示在位操作指令中,對(duì)該位(bit)先取反,再參與運(yùn)算,但不改變位(bit)的原值。11.():表示某一寄存器、存儲(chǔ)單元或表達(dá)式的內(nèi)容。

12.(()):表示某一寄存器、存儲(chǔ)單元或表達(dá)式的內(nèi)容的內(nèi)容。13.@:表示其后的寄存器或表達(dá)式的值為操作數(shù)的地址。(1)@Ri:表示寄存器Ri(i=0或1)中存放的是操作數(shù)的地址。(2)@DPTR:表示DPTR中存放的是操作數(shù)的地址,該地址位于外部數(shù)據(jù)存儲(chǔ)空間,其取值范圍為0000H~0FFFFH。7.addr16:表示16位目的地址。1014.←:表示將箭頭右邊的值賦給箭頭左邊的寄存器或存儲(chǔ)單元。15.∠:表示箭頭兩端的數(shù)據(jù)進(jìn)行交換。16.(S):表示源操作數(shù)。

17.(D):表示目的操作數(shù)。

18.rrr:在指令編碼中,rrr三位值由工作寄存器Rn確定,R0~R7對(duì)應(yīng)的rrr值分別為000~111。

19.$:表示本指令的起始地址。3.2尋址方式3.2.1寄存器尋址方式寄存器尋址是指,在指令中直接以寄存器名表示操作數(shù)的地址。即寄存器的內(nèi)容作為操作數(shù)。

14.←:表示將箭頭右邊的值賦給箭頭左邊的寄存器或存11可以采用寄存器尋址的寄存器有R0~R7、累加器A、DPTR以及位累加器Cy。例如指令:MOVA,R2

源操作數(shù)和目的操作數(shù)都屬于寄存器尋址。3.2.2直接尋址方式直接尋址方式是指,在指令中以地址或符號(hào)形式直接給出操作數(shù)地址。用這種尋址方式可以訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器三種地址空間:1.內(nèi)部數(shù)據(jù)存儲(chǔ)器的128個(gè)字節(jié)單元。例如指令:MOVA,50H;指令中源操作數(shù)的尋址方式為直接尋址

2.位地址空間。例如指令:MOVC,00H;指令中源操作數(shù)的尋址方式為直接尋址3.特殊功能寄存器地址空間。例如指令:MOVAcc,P1;源操作數(shù)和目的操作數(shù)采用的都是直接尋址可以采用寄存器尋址的寄存器有R0~R7、累加器A、123.2.3立即尋址方式立即尋址方式是指,指令操作數(shù)部分給出的就是參與運(yùn)算的操作數(shù)本身,它可以是8位二進(jìn)制數(shù)或16位二進(jìn)制數(shù)。即操作數(shù)是以指令字節(jié)的形式存放于程序存儲(chǔ)器中的。在MCS-51系統(tǒng)中是用在數(shù)值前加“#”形式表示的,如果立即數(shù)的最高位為A~F英文字符時(shí),該字符前要加“0”,以便使之區(qū)別于標(biāo)號(hào)。例如指令:MOVA,#0A0H或指令:MOVDPTR,#2000H

兩指令中的源操作數(shù)的尋址方式都是立即尋址。3.2.4寄存器間接尋址方式寄存器間接尋址是指,指令操作數(shù)部分所指定的寄存器中存放的是操作數(shù)的地址。3.2.3立即尋址方式13

在下面幾種情況下,可以使用該尋址方式:(1)訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)的00H~7FH單元使用當(dāng)前工作寄存器區(qū)的R0、R1作地址指針來(lái)間接尋址。(2)堆棧操作指令PUSH和POP

使用堆棧指針SP進(jìn)行間接尋址。(3)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)區(qū)的00H~0FFH單元使用當(dāng)前工作寄存器區(qū)的R0、R1作地址指針來(lái)間接尋址。(4)訪問(wèn)整個(gè)外部數(shù)據(jù)存儲(chǔ)區(qū)的0000H~0FFFFH單元使用數(shù)據(jù)指針DPTR進(jìn)行間接尋址。例如指令:MOVR1,#30HMOVA,@R1;源操作數(shù)為間接尋址,訪問(wèn)內(nèi)部RAM30H單元在下面幾種情況下,可以使用該尋址方式:14又例如指令:MOVR1,#30HMOVXA,@R1;源操作數(shù)為間接尋址,訪問(wèn)外部RAM30H單元3.2.5變址尋址方式變址尋址是指以程序計(jì)數(shù)器PC或數(shù)據(jù)指針DPTR作為基地址寄存器,以累加器A作為變址寄存器,把兩者的內(nèi)容相加形成16位的操作數(shù)的地址。這種尋址方式專用于訪問(wèn)程序存儲(chǔ)器中的常數(shù)表,不能訪問(wèn)數(shù)據(jù)存儲(chǔ)器。例如指令:MOVA,#7FHMOVDPTR,#2000HMOVCA,@A+DPTR;源操作數(shù)尋址方式為變址尋址說(shuō)明:又例如指令:15(1)變址尋址只能用在MOVC類指令中,該類指令用來(lái)從程序存儲(chǔ)空間中讀取數(shù)據(jù)。(2)該程序段的功能是把程序存儲(chǔ)器207FH單元的內(nèi)容送入累加器A。3.2.6相對(duì)尋址方式相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值作為基地址,與指令中給定的相對(duì)偏移量rel進(jìn)行相加,把得到的和作為程序的轉(zhuǎn)移地址。這種尋址方式用于相對(duì)轉(zhuǎn)移指令中。所謂相對(duì)轉(zhuǎn)移,是指程序轉(zhuǎn)移目標(biāo)地址由相對(duì)于該指令當(dāng)前地址的偏移量來(lái)決定。一般將相對(duì)轉(zhuǎn)移指令所在的地址稱為源地址,轉(zhuǎn)移后的地址稱為目標(biāo)地址,則有:目標(biāo)地址=源地址+轉(zhuǎn)移指令字節(jié)數(shù)+偏移量在相對(duì)轉(zhuǎn)移指令中,偏移量通常以目標(biāo)地址的標(biāo)號(hào)形式出現(xiàn)。(1)變址尋址只能用在MOVC類指令中,該類指令用來(lái)從16例如指令:JZLOOP;操作數(shù)為相對(duì)尋址此時(shí),計(jì)算偏移量的公式為:

偏移量=目標(biāo)地址-(源地址+2)如果偏移量為負(fù)數(shù),那么這條指令執(zhí)行后程序?qū)⑥D(zhuǎn)到該指令的前面(低地址方向);如果偏移量為正數(shù),那么將轉(zhuǎn)到該指令的后面(高地址方向)。在MCS-51指令系統(tǒng)中,偏移量的取值范圍是-128~+127。3.2.7尋址方式小結(jié)MCS-51指令系統(tǒng)的不同尋址方式對(duì)應(yīng)不同的存儲(chǔ)空間,也可以靈活使用不同的尋址方式訪問(wèn)同一個(gè)存儲(chǔ)空間,使用時(shí)應(yīng)多加注意。表3-1列出了不同尋址方式的作用空間。(見教材P47頁(yè))例如指令:17

數(shù)據(jù)傳送指令的功能是:把源操作數(shù)提供的數(shù)據(jù)傳送給目的操作數(shù)所指定的單元,源操作數(shù)內(nèi)容不變。它的另外一個(gè)功能是,將源操作數(shù)和目的操作數(shù)所指定的兩個(gè)單元內(nèi)容彼此進(jìn)行交換。3.3.1內(nèi)部RAM和SFR間的一般傳送指令MCS-51系列單片機(jī)內(nèi)部RAM和特殊功能寄存器SFR各存儲(chǔ)單元之間的數(shù)據(jù)傳送是通過(guò)MOV指令來(lái)實(shí)現(xiàn)的。MOV指令在內(nèi)部RAM和特殊功能寄存器SFR之間(包含立即數(shù))的數(shù)據(jù)傳送路徑如圖3-1所示。其中,#data表示立即數(shù);3.3數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令的功能是:把源操作數(shù)提供的數(shù)據(jù)傳送給目18@Ri中Ri的值為內(nèi)部數(shù)據(jù)存儲(chǔ)單元的地址;direct指向內(nèi)部數(shù)據(jù)存儲(chǔ)單元或特殊功能寄存器;Rn表示當(dāng)前工作寄存器區(qū)的8個(gè)工作寄存器R0~R7;Acc代表累加器A。1.以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令,見表3-2.(見教材P48頁(yè))2.以直接地址direct為目的操作數(shù)的數(shù)據(jù)傳送指令,見表3-3.(同上)3.以寄存器Rn為目的操作數(shù)的數(shù)據(jù)傳送指令,見表3-4。(同上)

4.以@Ri為目的操作數(shù)的數(shù)據(jù)傳送指令,見表3-5。(見教材P49頁(yè))5.16位數(shù)據(jù)傳送指令,見表3-6。(同上)圖3-1MOV指令的操作功能

@Ri中Ri的值為內(nèi)部數(shù)據(jù)存儲(chǔ)單元的地址;圖3-119

說(shuō)明:

(1)上述指令中的rrr取值為000~111,分別對(duì)應(yīng)選定工作寄存器區(qū)的8個(gè)工作寄存器。(2)上述指令中的i取值為0或1。分別對(duì)應(yīng)工作寄存器R0和R1。(3)直接地址到直接地址的數(shù)據(jù)傳送允許把一個(gè)端口引腳的狀態(tài)值讀入到內(nèi)部數(shù)據(jù)存儲(chǔ)單元,或者把內(nèi)部數(shù)據(jù)存儲(chǔ)單元的內(nèi)容輸出到端口鎖存器中,不需要通過(guò)累加器或中間寄存器。例如:MOV20H,90H;20H←(P1)該指令的功能為把P1口引腳狀態(tài)讀入到內(nèi)部RAM20H單元中。對(duì)于特殊功能寄存器來(lái)說(shuō),它的直接地址可以用其名稱來(lái)代替。因此,上面指令也可以寫成:MOV20H,P1;20H←(P1)說(shuō)明:20(4)某些指令的功能是相同的,但指令機(jī)器碼可能不同。例如:MOVA,#01H;A←01H,指令為2字節(jié),機(jī)器碼為:74H,01HMOVAcc,01H;;A←01H,指令為3字節(jié),機(jī)器碼為:75H,0E0H,01H在第二條指令中的Acc表示累加器A的直接地址0E0H。(5)上述數(shù)據(jù)傳送指令中,以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令會(huì)依據(jù)累加器A中“1”的個(gè)數(shù)的奇偶狀態(tài),對(duì)程序狀態(tài)字寄存器PSW的P標(biāo)志位重新賦值,其余的都不影響標(biāo)志位。3.3.2數(shù)據(jù)交換指令

MCS-51系列單片機(jī)指令系統(tǒng)中交換指令共4條,其中字節(jié)交換指令3條,半字節(jié)交換指令1條。字節(jié)交換指令的功能是將累加器A與內(nèi)部RAM中某一個(gè)單元的內(nèi)容相互交換。(4)某些指令的功能是相同的,但指令機(jī)器碼可能不同。例如21半字節(jié)交換指令的功能是將累加器A的低4位與Ri所指出的內(nèi)部存儲(chǔ)單元的低4位相互交換,其指令格式見表3-7。(見教材P50頁(yè))3.3.3累加器A與外部RAM(或外部接口)數(shù)據(jù)傳送指令

MCS-51系列單片機(jī)指令系統(tǒng)中,CPU與外部數(shù)據(jù)存儲(chǔ)器的數(shù)據(jù)傳送指令操作碼為MOVX,其中X為external(外部)的第二個(gè)字母。這組指令的功能是在外部數(shù)據(jù)存儲(chǔ)器或擴(kuò)展I/O口與累加器A之間進(jìn)行數(shù)據(jù)傳送。其指令格式見表3-8。(見教材P51頁(yè))

說(shuō)明:

(1)在以上4條指令中DPTR的取值范圍是:0000H~0FFFFH;Ri的取值范圍是xx00H~xxFFH。(2)由于MOVX類指令是專訪外部數(shù)據(jù)存儲(chǔ)器和外部接口的指令,因此它的操作數(shù)地址(DPTR或Ri的值),即外部數(shù)據(jù)存儲(chǔ)器16位地址是由P0口和P2口向外部地址總線發(fā)出的。半字節(jié)交換指令的功能是將累加器A的低4位與Ri所指出22(3)當(dāng)執(zhí)行指令MOVXA,@DPTR和MOVX@DPTR,A時(shí),寄存器DPH(DPTR的高8位)的內(nèi)容自動(dòng)寫入P2口,寄存器DPL(DPTR的低8位)的內(nèi)容自動(dòng)寫入P0口并鎖存。(4)當(dāng)執(zhí)行指令MOVXA,@Ri和MOVX@Ri,A時(shí),寄存器Ri的內(nèi)容為操作數(shù)地址的低八位,將自動(dòng)寫入P0口并鎖存,操作數(shù)地址的高八位必須事先通過(guò)MOVP2,#data指令寫入P2口。3.3.4累加器A與程序存儲(chǔ)器傳送指令

MCS-51系列單片機(jī)指令系統(tǒng)提供了兩條累加器A與程序存儲(chǔ)器的數(shù)據(jù)傳送指令,這兩條指令又稱查表指令,操作碼采用MOVC形式,指令的功能是將程序存儲(chǔ)器中的數(shù)據(jù)讀入累加器A中。其指令格式見表3-9。(見教材P51頁(yè))說(shuō)明:(3)當(dāng)執(zhí)行指令MOVXA,@DPTR和MOVX23(1)在上面兩條指令中,寄存器DPTR的值、DPTR與累加器A的值的和以及累加器A與PC值的和為程序存儲(chǔ)器單元的16位地址。(2)指令的執(zhí)行結(jié)果是將該地址中的操作數(shù)取出來(lái)送入累加器A。(3)前面已經(jīng)提到,該指令又叫查表指令。所謂的查表是指,在程序存儲(chǔ)空間中有一個(gè)常數(shù)表,在查表前將表頭地址送入DPTR寄存器,累加器A中存放的是從操作數(shù)地址到表頭地址的偏移量。則指令MOVCA,@A+DPTR的執(zhí)行過(guò)程如圖3-2所示。我們假設(shè)從1200H單元開始存有一個(gè)常數(shù)表,累加器A中的內(nèi)容為34H,DPTR的內(nèi)容為1200H,程序存儲(chǔ)單元1234H單元的內(nèi)容為0AAH,則指令的執(zhí)行結(jié)果是累加器A中的值變成0AAH。(4)第二條指令的基址寄存器為程序計(jì)數(shù)器PC。(1)在上面兩條指令中,寄存器DPTR的值、DPTR與24CPU在讀取指令時(shí),PC已執(zhí)行了加1操作,指向下一條指令的第一個(gè)字節(jié),所以作基址寄存器時(shí)值已經(jīng)是原PC加1。圖3-2MOVCA,@A+DPTR指令的執(zhí)行功能

CPU在讀取指令時(shí),PC已執(zhí)行了加1操作,指向下一條253.3.5堆棧操作指令

MCS-51系列單片機(jī)內(nèi)部RAM中設(shè)定的一個(gè)遵循“先進(jìn)后出,后進(jìn)先出”原則的區(qū)域被稱為堆棧,在SFR中有一個(gè)堆棧指針(8位寄存器),它指向堆棧的棧頂。堆棧技術(shù)在CPU響應(yīng)中斷、調(diào)用子程序、中斷嵌套或子程序嵌套時(shí)用于保存斷點(diǎn)和現(xiàn)場(chǎng)數(shù)據(jù)。

MCS-51系列單片機(jī)的堆棧是向上增長(zhǎng)的,棧底固定,棧頂浮動(dòng)。有入棧(PUSH指令)和出棧(POP指令)兩種操作。入棧操作的過(guò)程是:

先將堆棧指針自動(dòng)加1,然后數(shù)據(jù)壓入堆棧;出棧操作與此相反,先從堆棧中將數(shù)據(jù)彈出,送給direct單元,然后指針自動(dòng)減1。無(wú)論是入棧操作還是出棧操作,其操作對(duì)象只能是用direct形式表示的內(nèi)部數(shù)據(jù)存儲(chǔ)空間地址(00H~7FH)或某個(gè)特殊功能寄存器。MCS-51系列單片機(jī)堆棧操作指令見表3-10。(見教材P53頁(yè))3.3.5堆棧操作指令263.4.1加法指令

1.不帶進(jìn)位加法指令這組指令完成兩個(gè)8位二進(jìn)制數(shù)的相加運(yùn)算,結(jié)果存放在累加器A中。它們的操作數(shù)可以是有符號(hào)數(shù)也可以是無(wú)符號(hào)數(shù)。無(wú)符號(hào)的操作數(shù)以真值的絕對(duì)值形式給出,有符號(hào)的操作數(shù)以真值的補(bǔ)碼形式給出。其指令格式見表3-11。(見教材P54頁(yè))

說(shuō)明:

(1)在運(yùn)算過(guò)程中,兩個(gè)操作數(shù)是無(wú)符號(hào)數(shù)還是有符號(hào)數(shù),是由程序員事先約定的,計(jì)算機(jī)總是按照二進(jìn)制補(bǔ)碼的規(guī)則完成相應(yīng)的運(yùn)算。3.4算術(shù)運(yùn)算指令3.4.1加法指令3.4算術(shù)運(yùn)算指令27(2)Cy的值反映的是將兩操作數(shù)作為無(wú)符號(hào)數(shù)運(yùn)算時(shí)有無(wú)進(jìn)位。(3)OV的值反映的是將兩操作數(shù)作為有符號(hào)數(shù)運(yùn)算時(shí)有無(wú)溢出。(4)程序員應(yīng)對(duì)操作數(shù)類型做到“心中有數(shù)”,并隨時(shí)查詢標(biāo)志位,以便獲得正確的運(yùn)算結(jié)果。2.帶進(jìn)位加法指令這組指令除了完成兩個(gè)8位二進(jìn)制數(shù)的相加運(yùn)算,還要與進(jìn)位標(biāo)志位Cy的值相加,結(jié)果存放在累加器A中。若Cy=0,則這組指令同ADD指令。帶進(jìn)位加法指令主要用在多字節(jié)加法運(yùn)算中,其指令格式見表3-12。(見教材P55頁(yè))可以總結(jié)出兩個(gè)字節(jié)數(shù)的加法運(yùn)算步驟是:1.用加法指令進(jìn)行低字節(jié)的加法運(yùn)算;2.用帶進(jìn)位加法指令進(jìn)行高字節(jié)的加法運(yùn)算。(2)Cy的值反映的是將兩操作數(shù)作為無(wú)符號(hào)數(shù)運(yùn)算時(shí)有無(wú)283.4.2減法指令

MCS-51系列單片機(jī)指令系統(tǒng)的減法只有一組帶借位的減法指令,指令操作功能是將累加器A中的內(nèi)容減去源操作數(shù)中的值或常數(shù)并減去進(jìn)位標(biāo)志Cy的值,運(yùn)算結(jié)果存入累加器A中。其指令格式見表3-13。(見教材P55頁(yè))

說(shuō)明:(1)減法指令影響Cy、AC、OV以及P標(biāo)志位。(2)兩個(gè)無(wú)符號(hào)數(shù)相減時(shí),Cy=1表示被減數(shù)小于減數(shù),需要將累加器A中的值和借位一并考慮才是正確結(jié)果。(3)兩個(gè)帶符號(hào)數(shù)相減時(shí),OV=0表示沒(méi)有發(fā)生溢出,結(jié)果正確;若OV=1,表明發(fā)生溢出,將導(dǎo)致不正確結(jié)果。(4)在進(jìn)行單字節(jié)或多字節(jié)減法的最低位相減時(shí),因?yàn)闇p法指令都是帶借位的,因此應(yīng)先將Cy清零(使用CLRC指令完成)。3.4.2減法指令293.4.3十進(jìn)制調(diào)整指令

MCS-51系列單片機(jī)指令系統(tǒng)中有一條專用于BCD碼加法的指令,即十進(jìn)制調(diào)整指令。該指令的功能是在兩個(gè)壓縮型BCD碼數(shù)據(jù)按二進(jìn)制數(shù)相加存入累加器A后,根據(jù)PSW中標(biāo)志位AC、Cy的狀態(tài)以及A中的結(jié)果,將A的內(nèi)容進(jìn)行“加6調(diào)整”,使其轉(zhuǎn)換為BCD碼形式。

指令具體操作過(guò)程是:若累加器A的低4位大于9或AC等于1,則指令對(duì)累加器A的低四位加6,產(chǎn)生低四位正確的BCD碼。在加6調(diào)整后,如果低四位向高四位產(chǎn)生進(jìn)位,并且高四位均為1,則進(jìn)位標(biāo)志Cy=1;反之,它不能使Cy=0。若累加器A的高4位大于9或Cy等于1,則指令對(duì)累加器A的高四位加6,產(chǎn)生高四位正確的BCD碼。在加6調(diào)整后,如果最高位產(chǎn)生進(jìn)位,則進(jìn)位標(biāo)志Cy=1;反之,它不能使Cy=0。3.4.3十進(jìn)制調(diào)整指令30Cy=1表示兩個(gè)BCD碼數(shù)相加后,和大于或等于100,這對(duì)于多字節(jié)加法有用,但不影響OV位。其指令的格式見表3-14。(見教材P56頁(yè))說(shuō)明:為了實(shí)現(xiàn)BCD碼減法運(yùn)算,用8位二進(jìn)制數(shù)10011010(9AH)來(lái)表示十進(jìn)制數(shù)100(因?yàn)?AH經(jīng)過(guò)十進(jìn)制調(diào)整后為00H,Cy=1即100)。BCD碼的模數(shù)為9AH,模數(shù)減去減數(shù),可以得到減數(shù)的補(bǔ)碼,所以十進(jìn)制無(wú)符號(hào)數(shù)的減法運(yùn)算變?yōu)?被減數(shù)+(9AH-減數(shù))源程序:CLRC;Cy=0MOVA,#9AHSUBBA,31H;求減數(shù)的補(bǔ)碼ADDA,30HCy=1表示兩個(gè)BCD碼數(shù)相加后,和大于或等于10031DAA;十進(jìn)制調(diào)整

MOV32H,A;差存入32H單元3.4.4加1、減1指令加1指令的功能是把操作數(shù)指定單元的內(nèi)容加1,減1指令的功能是將操作數(shù)指定單元的內(nèi)容減1。除奇偶標(biāo)志外,兩類指令操作結(jié)果不影響PSW中的標(biāo)志位。兩類指令的格式見表3-15。(見教材P57頁(yè))3.4.5乘法指令

MCS-51指令系統(tǒng)的乘法指令格式見表3-16。乘法指令的功能是將累加器A和寄存器B中的兩個(gè)8位無(wú)符號(hào)整數(shù)相乘,16位乘積的低8位存入累加器A,高8位存入寄存器B。當(dāng)B的值不等于0時(shí),OV=1,否則OV=0;Cy位的值自動(dòng)清零;奇偶標(biāo)志位P的值依據(jù)累加器A中“1”的個(gè)數(shù)決定。DAA;十進(jìn)制調(diào)整323.4.6除法指令

MCS-51指令系統(tǒng)的除法指令格式見表3-17。(見教材P58頁(yè))除法指令的功能是將累加器A和寄存器B中的兩個(gè)8位無(wú)符號(hào)整數(shù)相除,得到的8位商(整數(shù))存入累加器A,8位余數(shù)存入寄存器B。當(dāng)除數(shù)B的值不等于0時(shí),OV位、Cy位的值自動(dòng)清零;奇偶標(biāo)志位P的值依據(jù)累加器A中“1”的個(gè)數(shù)決定。當(dāng)除數(shù)B的值等于0時(shí),OV=1;Cy位的值自動(dòng)清零,商和余數(shù)則無(wú)法確定。3.5邏輯或操作指令3.5.1邏輯或操作指令這組指令的功能是將兩個(gè)8位二進(jìn)制數(shù)操作數(shù)按位進(jìn)行邏輯“或”運(yùn)算,結(jié)果存放在累加器A中。3.4.6除法指令3.5邏輯或操作指令3.5.1邏輯33其指令格式見表3-18。(見教材P59頁(yè))

說(shuō)明:

(1)除前4條指令依據(jù)累加器A中“1”的個(gè)數(shù)影響奇偶標(biāo)志位P的值外,所有指令不影響任何標(biāo)志。(2)任意邏輯量(0或1)和1相或,結(jié)果為1;和0相或,結(jié)果為不變。利用這一特點(diǎn),邏輯或指令常用來(lái)組合數(shù)據(jù)位。即使累加器、內(nèi)部RAM或特殊功能寄存器的指定位置為1。置位控制字可以是指令中的常數(shù)或運(yùn)行時(shí)累加器里的值。(3)當(dāng)?shù)?條指令中的直接地址為P0~P3端口時(shí),進(jìn)行的是讀操作。即將引腳上的數(shù)據(jù)讀入到CPU內(nèi)部數(shù)據(jù)總線。(4)當(dāng)?shù)?、6條指令中的直接地址為P0~P3端口時(shí),進(jìn)行的是讀-修改-寫操作。即從鎖存器中讀取數(shù)據(jù)經(jīng)修改后重新寫入鎖存器,同時(shí)又送出引腳。其指令格式見表3-18。(見教材P59頁(yè))343.5.2邏輯與操作指令這組指令的功能是將兩個(gè)8位二進(jìn)制數(shù)操作數(shù)按位進(jìn)行邏輯“與”運(yùn)算,結(jié)果存放在累加器A中。其指令格式見表3-19。(見教材P59頁(yè))

說(shuō)明:

(1)除前4條指令依據(jù)累加器A中“1”的個(gè)數(shù)影響奇偶標(biāo)志位P的值外,所有指令不影響任何標(biāo)志。(2)任意邏輯量(0或1)和0相與,結(jié)果為0,和1相與,結(jié)果為不變,利用這一特點(diǎn),邏輯與指令常用來(lái)完成將若干數(shù)據(jù)位清零(屏蔽這些位),而其余位不變的操作。(3)與邏輯或指令相同,該類指令也可以對(duì)P0~P3端口進(jìn)行的“讀操作”或進(jìn)行“讀-修改-寫操作”。3.5.2邏輯與操作指令353.5.3邏輯異或操作指令這組指令的功能是將兩個(gè)8位二進(jìn)制數(shù)操作數(shù)按位進(jìn)行邏輯“異或”運(yùn)算,結(jié)果存放在累加器A中。其指令格式為見表3-20。(見教材P60頁(yè))

說(shuō)明:

(1)除前4條指令依據(jù)累加器A中“1”的個(gè)數(shù)影響奇偶標(biāo)志位P的值外,所有指令不影響任何標(biāo)志。(2)任意邏輯量(0或1)和1相異或,結(jié)果取反,和0相異或,結(jié)果為不變,利用這一特點(diǎn),邏輯異或指令常用來(lái)完成將若干數(shù)據(jù)位取反,而其余位不變的操作。(3)相同邏輯量(0或1)相異或,結(jié)果為0,不同邏輯量相異或,結(jié)果為1,利用這一特點(diǎn)可以判斷兩數(shù)是否相等。(4)與邏輯或指令相同,該類指令也可以對(duì)P0~P3端口進(jìn)行的“讀操作”或進(jìn)行“讀-修改-寫操作”。3.5.3邏輯異或操作指令363.5.4累加器A的邏輯操作指令這組指令是針對(duì)累加器A的單操作數(shù)指令,包括對(duì)累加器A的清零、取反、循環(huán)移位以及半字節(jié)交換等操作。其指令格式見表3-21。(見教材P61頁(yè))

說(shuō)明:

(1)帶進(jìn)位位循環(huán)指令影響Cy和P標(biāo)志位;CLR指令影響P標(biāo)志位;其他指令不影響任何標(biāo)志。(2)利用累加器A求反指令,可進(jìn)行求補(bǔ)操作。(3)指令RLA和RRA的功能是將累加器A的內(nèi)容循環(huán)左移或右移1位;指令RLCA和RRCA的功能是將累加器A的內(nèi)容連同Cy位循環(huán)左移或右移1位。(4)指令RLCA可以將累加器A中的內(nèi)容擴(kuò)大2倍,但擴(kuò)大之后不能超過(guò)255。3.5.4累加器A的邏輯操作指令37(5)指令RRCA可以將累加器A中的內(nèi)容除以2。(6)SWAP指令主要用于有關(guān)BCD碼數(shù)的轉(zhuǎn)換操作中。3.6控制轉(zhuǎn)移指令3.6.1無(wú)條件轉(zhuǎn)移指令

無(wú)條件轉(zhuǎn)移指令的功能是:

當(dāng)程序執(zhí)行該指令時(shí)將無(wú)條件的轉(zhuǎn)移到該指令所提供的地址。

這類指令分為:絕對(duì)轉(zhuǎn)移指令A(yù)JMP、長(zhǎng)轉(zhuǎn)移指令LJMP、相對(duì)轉(zhuǎn)移指令SJMP和間接轉(zhuǎn)移指令JMP。最后一條又稱為散轉(zhuǎn)指令。所有無(wú)條件轉(zhuǎn)移指令均不影響標(biāo)志位。無(wú)條件轉(zhuǎn)移指令的格式見表3-22。(見教材P62頁(yè))

1.絕對(duì)無(wú)條件轉(zhuǎn)移指令(5)指令RRCA可以將累加器A中的內(nèi)容除以238絕對(duì)轉(zhuǎn)移指令A(yù)JMP中提供11位地址,在使用絕對(duì)轉(zhuǎn)移類指令時(shí),要求轉(zhuǎn)移的目標(biāo)地址必須和AJMP指令的下一條指令的首字節(jié)在同一個(gè)2K字節(jié)存儲(chǔ)區(qū)內(nèi),即PC+2后的值與目標(biāo)地址的高5位a15~a11

應(yīng)該相同(PC為AJMP指令首字節(jié)單元的指針)。

2.長(zhǎng)轉(zhuǎn)移指令長(zhǎng)轉(zhuǎn)移指令的功能是把指令給出的16位字地址直接送給程序計(jì)數(shù)器PC。程序可以轉(zhuǎn)到程序存儲(chǔ)器0000H~0FFFFH范圍的任何一個(gè)單元。在匯編源程序中,目標(biāo)操作數(shù)addr16一般以目標(biāo)地址的標(biāo)號(hào)形式給出。長(zhǎng)轉(zhuǎn)移指令是三字節(jié)指令。

3.相對(duì)轉(zhuǎn)移指令相對(duì)轉(zhuǎn)移指令給出的rel為轉(zhuǎn)移偏移量,它是一個(gè)以補(bǔ)碼形式表示的有符號(hào)數(shù)。指令轉(zhuǎn)移目的地址為當(dāng)前指令的下一條指令的地址與偏移量rel的和。即:絕對(duì)轉(zhuǎn)移指令A(yù)JMP中提供11位地址,在使用絕對(duì)轉(zhuǎn)移39轉(zhuǎn)移目的地址PC=PC當(dāng)前值+2+rel說(shuō)明:

(1)該指令的轉(zhuǎn)移范圍是:以PC+2為基準(zhǔn),向前128字節(jié),向后127字節(jié)范圍。(2)SJMP指令中也可以直接給出轉(zhuǎn)移地址(4位16進(jìn)制數(shù))或給出標(biāo)號(hào)地址。例如指令SJMPADR。此類指令在進(jìn)行手工匯編時(shí)需算出rel值。偏移量=目標(biāo)地址-(源地址+2)(3)MCS-51系列指令系統(tǒng)中沒(méi)有暫停指令,可以使用SJMP指令實(shí)現(xiàn)動(dòng)態(tài)停機(jī)。例如:HERE:SJMPHERE

或?qū)懗?SJMP$;$表示本指令首字節(jié)所在單元的地址。4.間接轉(zhuǎn)移指令轉(zhuǎn)移目的地址PC=PC當(dāng)前值+2+rel40間接轉(zhuǎn)移指令的目標(biāo)地址,是由數(shù)據(jù)指針DPTR的內(nèi)容加上累加器A的內(nèi)容形成的,A和DPTR的內(nèi)容均為無(wú)符號(hào)數(shù)。本指令可以在程序運(yùn)行過(guò)程中動(dòng)態(tài)決定轉(zhuǎn)移的目標(biāo)地址,是一條極其有用的多分支選擇轉(zhuǎn)移指令,又被稱為散轉(zhuǎn)指令。下面一段程序是JMP@A+DPTR指令散轉(zhuǎn)功能的應(yīng)用舉例。

CLRCRLCA;累加器A的內(nèi)容乘2MOVDPTR,#JPTAB;轉(zhuǎn)移指令表的首地址送數(shù)據(jù)指針……JMP@A+DPTR;根據(jù)累加器A的內(nèi)容選擇并……;執(zhí)行轉(zhuǎn)移指令表中的轉(zhuǎn)移指令間接轉(zhuǎn)移指令的目標(biāo)地址,是由數(shù)據(jù)指針DPTR的內(nèi)容41JPTAB:AJMPCCS0AJMPCCS1AJMPCCS2

說(shuō)明:在此程序中,以標(biāo)號(hào)JPTAB為首地址建立一張轉(zhuǎn)移地址表。表中有3個(gè)絕對(duì)轉(zhuǎn)移指令,它們的目標(biāo)地址分別為CCS0、CCS1、CCS2。JMP@A+DPTR指令會(huì)依據(jù)程序執(zhí)行前累加器A的內(nèi)容實(shí)現(xiàn)散轉(zhuǎn)功能。在程序開頭對(duì)累加器進(jìn)行乘2運(yùn)算的原因是AJMP指令為雙字節(jié)。3.6.2空操作指令空操作指令是一條只有操作碼沒(méi)有操作數(shù)的單字節(jié)指令,該指令執(zhí)行后程序計(jì)數(shù)器PC的值自動(dòng)加1指向它的下一條指令。除此之外,NOP指令不進(jìn)行任何其他操作,相當(dāng)于跳過(guò)一個(gè)字節(jié)??詹僮髦噶罹挥绊憳?biāo)志位,指令格式見表3-23。(見教材P64頁(yè))JPTAB:AJMPCCS042NOP指令的主要用途有:

(1)可以利用它來(lái)進(jìn)行延時(shí)或等待。該指令每執(zhí)行一次,就要花費(fèi)一個(gè)機(jī)器周期的執(zhí)行時(shí)間。(2)可以利用它來(lái)調(diào)試程序,例如要?jiǎng)h除某條指令,只需用NOP指令取代即可。(3)在程序中某些地方故意安排一些NOP指令,為以后添加新指令預(yù)留存儲(chǔ)空間。3.6.3條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是指當(dāng)條件滿足時(shí)程序才轉(zhuǎn)移,而條件不滿足時(shí)程序繼續(xù)執(zhí)行下一條指令。

這類指令包括:判累加器判零條件轉(zhuǎn)移指令、比較不等轉(zhuǎn)移指令以及減1非零轉(zhuǎn)移等。1.判零條件轉(zhuǎn)移指令NOP指令的主要用途有:43這類指令以累加器A的內(nèi)容是否為0作為指令轉(zhuǎn)移的條件,累加器A的值由以前指令執(zhí)行結(jié)果確定,指令轉(zhuǎn)移范圍為-128~+127。該類指令格式見表3-24。(見教材P65頁(yè))

說(shuō)明:

(1)第一條指令的執(zhí)行過(guò)程是該指令執(zhí)行前累加器A的值為0,程序轉(zhuǎn)移,否則程序順序執(zhí)行下一條指令。(2)第二條指令的執(zhí)行過(guò)程是該指令執(zhí)行前累加器A的值不為0,程序轉(zhuǎn)移,否則程序順序執(zhí)行下一條指令。(3)指令中的偏移量通常以目標(biāo)地址的標(biāo)號(hào)形式出現(xiàn)。例如指令:JZLOOP

表示當(dāng)累加器A的值為0時(shí)程序轉(zhuǎn)向LOOP地址,否則順序執(zhí)行程序。2.比較不等轉(zhuǎn)移指令這類指令以累加器A的內(nèi)容是否為0作為指令轉(zhuǎn)移的條件44這是一類3個(gè)操作數(shù)、3個(gè)字節(jié)的指令,執(zhí)行時(shí)首先對(duì)兩個(gè)操作數(shù)進(jìn)行比較,當(dāng)兩個(gè)數(shù)不相等時(shí),跳轉(zhuǎn)到偏移量指定的地址;若相等,則順序執(zhí)行下一條指令。執(zhí)行指令后,標(biāo)志位Cy還會(huì)依據(jù)操作數(shù)比較結(jié)果重新被賦值。該類指令的格式見表3-25。(見教材P65頁(yè))

說(shuō)明:

(1)利用這組指令可以比較兩個(gè)無(wú)符號(hào)數(shù)大小。(2)這組指令可以用作控制循環(huán)結(jié)束的條件。(3)指令轉(zhuǎn)移范圍為-128~+127。3.減1非零轉(zhuǎn)移指令這組指令除了附帶轉(zhuǎn)移條件外,其他功能與SJMP指令基本相同。該類指令格式見表3-26。(見教材P66頁(yè))這是一類3個(gè)操作數(shù)、3個(gè)字節(jié)的指令,執(zhí)行時(shí)首先對(duì)兩個(gè)45

說(shuō)明:(1)該指令可用于循環(huán)次數(shù)已知的循環(huán)過(guò)程:指定一個(gè)工作寄存器或內(nèi)部數(shù)據(jù)存儲(chǔ)單元為循環(huán)計(jì)數(shù)器,對(duì)計(jì)數(shù)器賦初值后每完成一次循環(huán),計(jì)數(shù)器減1,直到計(jì)數(shù)器減到0時(shí)循環(huán)結(jié)束。(2)利用該指令可以進(jìn)行軟件延時(shí)。3.6.4子程序調(diào)用和返回指令

MCS-51系列指令系統(tǒng)中子程序調(diào)用指令的功能是,一方面把程序轉(zhuǎn)向子程序的起始指令,同時(shí)又把斷點(diǎn)地址(它的下一條指令地址)壓入堆棧進(jìn)行保護(hù)。返回指令往往位于子程序的末尾,作用是從堆棧中彈出調(diào)用指令保存的斷點(diǎn)地址送入指令計(jì)數(shù)器PC,具體執(zhí)行過(guò)程如圖3-3所示。此類指令不影響標(biāo)志位。這類指令的格式見表3-27。(見教材P67頁(yè))說(shuō)明:461.絕對(duì)調(diào)用指令絕對(duì)調(diào)用指令A(yù)CALL中提供11位地址,和絕對(duì)轉(zhuǎn)移指令A(yù)JMP一樣,要求子程序的起始地址必須和ACALL指令的下一條指令的首字節(jié)(斷點(diǎn)地址)在同一個(gè)2K字節(jié)存儲(chǔ)區(qū)內(nèi)。例如:指令LOOP:ACALLaddr11。圖3-3子程序的調(diào)用和返回流程示意圖

溫馨提示

  • 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)論