第3章 80C51單片機(jī)的尋址方式和指令系統(tǒng)_第1頁(yè)
第3章 80C51單片機(jī)的尋址方式和指令系統(tǒng)_第2頁(yè)
第3章 80C51單片機(jī)的尋址方式和指令系統(tǒng)_第3頁(yè)
第3章 80C51單片機(jī)的尋址方式和指令系統(tǒng)_第4頁(yè)
第3章 80C51單片機(jī)的尋址方式和指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩188頁(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)介

第3章1第2章:80C51系列單片機(jī)基本結(jié)構(gòu)及原理3.1匯編語(yǔ)言指令格式及其常用符

3.1.1匯編語(yǔ)言指令格式

3.1.2機(jī)器碼的三種格式

3.1.3指令中常用符號(hào)說(shuō)明3.280C51的尋址方式

3.2.1立即尋址

3.2.2直接尋址

3.2.3寄存器尋址

3.2.4寄存器間接尋址

3.2.5變址尋址

3.2.6相對(duì)尋址

3.2.7位尋址目錄2第2章:80C51系列單片機(jī)基本結(jié)構(gòu)及原理3.3數(shù)據(jù)傳送類指令(29條)

3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令

3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令

3.3.5堆棧操作指令3.4算術(shù)運(yùn)算類指令(24條)

3.4.1加法指令

3.4.2減法指令

3.4.3乘、除法指令3.5邏輯運(yùn)算及移位類指令(24條)3.5.1邏輯與運(yùn)算指令

3.5.2邏輯或運(yùn)算指令目錄3第2章:80C51系列單片機(jī)基本結(jié)構(gòu)及原理

3.5.3邏輯異或運(yùn)算指令

3.5.4累加器清零、取反指令

3.5.5循環(huán)移位指令3.6控制轉(zhuǎn)移類指令(17條)

3.6.1無(wú)條件轉(zhuǎn)移指令

3.6.2條件轉(zhuǎn)移指令

3.6.3子程序調(diào)用及返回指令

3.6.4空操作指令3.7位操作類指令

3.7.1位變量傳送指令

3.7.2位置位、清零指令

3.7.3位邏輯運(yùn)算指令

3.7.4位控制轉(zhuǎn)移指令目錄4第3章80C51單片機(jī)的尋址方式和指令系統(tǒng)指令是規(guī)定計(jì)算機(jī)進(jìn)行某種操作的命令。一臺(tái)計(jì)算機(jī)所能執(zhí)行的指令集合稱為該計(jì)算機(jī)的指令系統(tǒng)。能被計(jì)算機(jī)直接識(shí)別、執(zhí)行的指令是使用二進(jìn)制編碼表示的指令,這種指令被稱為機(jī)器語(yǔ)言指令。機(jī)器語(yǔ)言難編寫、難讀懂、難查錯(cuò)和難交流。以助記符表示的指令被稱為符號(hào)指令。匯編語(yǔ)言就是典型的符號(hào)指令。單片機(jī)常用的編程語(yǔ)言:匯編語(yǔ)言和C語(yǔ)言。5第3章80C51單片機(jī)的尋址方式和指令系統(tǒng)

80C51系列單片機(jī)匯編語(yǔ)言指令系統(tǒng)共有111條指令,按功能劃分,可分為五大類:(1)數(shù)據(jù)傳送類指令(29條);(2)算術(shù)運(yùn)算類指令(24條);(3)邏輯運(yùn)算及移位類指令(24條);(4)控制轉(zhuǎn)移類指令(17條);(5)位操作類指令(17條)。6

本節(jié)內(nèi)容3.1.1匯編語(yǔ)言指令格式3.1.2機(jī)器碼的三種格式3.1.3指令中常用符號(hào)說(shuō)明73.1.1匯編語(yǔ)言指令格式一條完整的匯編語(yǔ)言指令通常由標(biāo)號(hào)、操作碼、操作數(shù)(一般包括目的操作數(shù)和源操作數(shù))及指令的注釋構(gòu)成。指令格式:

[標(biāo)號(hào):]<操作碼>[操作數(shù)][,操作數(shù)][;注釋]說(shuō)明:在一條指令中,方括號(hào)中的內(nèi)容可有可無(wú),尖括號(hào)中的內(nèi)容必須有。由指令格式可見,操作碼是指令的核心,不可缺少。8標(biāo)號(hào)—標(biāo)號(hào)是該指令的起始地址,是一種符號(hào)地址。標(biāo)號(hào)可以由1~8個(gè)字符組成,第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其他特定符號(hào)。標(biāo)號(hào)后跟分界符“:”。操作碼—指令的助記符。操作碼規(guī)定了指令所能完成的操作功能,是指令的必需部分,是指令的核心,不可缺少。操作數(shù)—指出了指令的操作對(duì)象。操作數(shù)可以是一個(gè)具體的數(shù)據(jù),也可以是存放數(shù)據(jù)的單元地址,還可以是符號(hào)常量或符號(hào)地址等。操作數(shù)可分為目的操作數(shù)和源操作數(shù),多個(gè)操作數(shù)之間用逗號(hào)“,”分隔。注釋—為了方便閱讀而添加的解釋說(shuō)明性的文字,用“;”開頭。舉例:START:MOVA,#30H;將立即數(shù)30H傳送至A中9

本節(jié)內(nèi)容3.1.1匯編語(yǔ)言指令格式3.1.2機(jī)器碼的三種格式3.1.3指令中常用符號(hào)說(shuō)明103.1.2機(jī)器碼的三種格式:匯編語(yǔ)言需要編譯成用機(jī)器語(yǔ)言表達(dá)的機(jī)器碼才能在ROM中存放。按所占字節(jié)分,分三種:(1)單字節(jié)指令49條(只有操作碼,沒有直接數(shù)字(只有寄存器名))(2)雙字節(jié)指令45條(有一個(gè)字節(jié)“立即數(shù)”或一個(gè)字節(jié)“地址數(shù)”)(3)三字節(jié)指令17條(有兩個(gè)字節(jié)“立即數(shù)”或兩個(gè)字節(jié)“地址數(shù)”)按執(zhí)行時(shí)間來(lái)分,分三種:(1)1個(gè)機(jī)器周期(12個(gè)時(shí)鐘振蕩周期)的指令64條;(2)2個(gè)機(jī)器周期指令45條;(3)4個(gè)機(jī)器周期--乘、除指令2條。11一、單字節(jié)指令(49條):兩種編碼格式:1.8位編碼只表示一個(gè)操作碼編碼,其格式為:例如:INCA

該匯編指令的機(jī)器碼為:00000100B

其十六進(jìn)制數(shù)為04H,操作數(shù)(累加器A)隱含在操作碼中。注意:在匯編語(yǔ)言指令中,“A”代表累加器,而用“ACC”代表累加器的地址E0H。122.8位編碼中包含操作碼和寄存器編碼,其格式為:這類指令中高5位表示操作碼,低3位rrr為存放操作數(shù)的寄存器編碼Rn(n=0,…7)。例如:MOVA,R0該指令的編碼為:11101000B

其十六進(jìn)制表示為E8H,低三位000為R0的編碼。13二、雙字節(jié)指令(45條)雙字節(jié)指令為16位編碼,其格式為:

第一個(gè)字節(jié)表示操作碼,第二個(gè)字節(jié)為參與操作的操作數(shù)data或數(shù)據(jù)所在地址direct。例如:MOVA,#30H該指令兩個(gè)字節(jié)的編碼為01110100B,00110000B

其十六進(jìn)制表示為:74H,30H,其中74H存放在指令碼的第一字節(jié),data這個(gè)具體的數(shù)據(jù)存放在第二字節(jié)。14三、三字節(jié)指令(17條):三字節(jié)指令為24位編碼,其格式為:第一個(gè)字節(jié)表示操作碼,后兩個(gè)字節(jié)為參與操作的操作數(shù)data或數(shù)據(jù)所在地址direct。例如:MOV20H,#50H該指令的3個(gè)字節(jié)編碼為01110101B,00100000B,01010000B。

其十六進(jìn)制表示為75H,20H,50H。第一個(gè)字節(jié)存放75H這個(gè)操作碼,第二個(gè)字節(jié)存放目的地址20H,第三個(gè)字節(jié)存放源操作數(shù)50H。15

本節(jié)內(nèi)容3.1.1匯編語(yǔ)言指令格式3.1.2機(jī)器碼的三種格式3.1.3指令中常用符號(hào)說(shuō)明163.1.3指令中常用符號(hào)說(shuō)明在描述80C51系列單片機(jī)指令系統(tǒng)的功能時(shí),經(jīng)常使用的符號(hào)及意義如下:Rn(n=O~7)

當(dāng)前選中的工作寄存器中的寄存器R0~R7之一;Ri(i=0、1)

當(dāng)前選中的工作寄存器可作為地址指針的寄存器R0、R1;#data8位立即數(shù);#datal616位立即數(shù);direct

片內(nèi)部RAM的低128個(gè)單元地址,也可以是特殊功能寄存器SFR的單元地址或符號(hào);

addrll

11位目的地址,只限于在ACALL和AJMP指令中使用;addrl616位目的地址,只限于在LCALL和LJMP指令中使用;rel

補(bǔ)碼形式表示的8位地址偏移量,其值的范圍:-128~+127;bit

片內(nèi)RAM位尋址區(qū)或可位尋址的特殊功能寄存器的位地址;@

間接尋址或變址尋址的前綴標(biāo)志;C

進(jìn)位標(biāo)志位,也稱為位累加器;/加在位地址的前面,表示對(duì)該位先求反再參與操作,但不影響該位的值;(X)

由X指定的寄存器或地址單元中的內(nèi)容;((X))

由X寄存器的內(nèi)容作為地址的存儲(chǔ)單元的內(nèi)容;$

本條指令的起始地址;

指令操作流程,將箭頭右邊的內(nèi)容送到箭頭左邊的單元中;

數(shù)據(jù)交換。17指令中常用符號(hào)說(shuō)明:Rn當(dāng)前選中的工作寄存器組中的寄存器R0-R7之一,

所以n=0-7。Ri當(dāng)前選中的工作寄存器組中可作地址指針的寄存器R0、R1,所以i=0、1。#data8位立即數(shù)。#data1616位立即數(shù)。Direct內(nèi)部RAM的8位地址。即可以是內(nèi)部RAM的低128個(gè)單元地址,也可以是特殊功能寄存器的單元地址或符號(hào)。在指令中direct表示直接尋址方式。Addr1111位目的地址,只限于在ACALL和AJMP指令中使用。Addr1616位目的地址,只限于在LCALL和LJMP指令中使用。Rel補(bǔ)碼形式表示的8位地址偏移量,在相對(duì)轉(zhuǎn)移指令中使用。Bit表示片內(nèi)RAM位尋址區(qū)或可位尋址的特殊功能寄存器的位地址;@間接尋址方式中間址寄存器的前綴標(biāo)志;C進(jìn)位標(biāo)志位,它是布爾處理機(jī)的累加器,也稱之為位累加器;/加在位地址的前面,表示對(duì)該位先求反再參與操作,但不影響該位的值;(x)由x指定的寄存器或地址單元中的內(nèi)容;((x))由x所指寄存器的內(nèi)容作為地址的存儲(chǔ)單元的內(nèi)容;$表示本條指令的起始地址;←表示指令操作流程,將箭頭右邊的內(nèi)容送到箭頭左邊的單元中。18尋址就是尋找操作數(shù)的地址。尋址方式則指出尋找操作數(shù)地址的方式方法。一條指令可能含多種尋址方式,通常根據(jù)指令的源操作數(shù)來(lái)決定指令的尋址方式。尋址方式總體上分為兩大類:一是操作數(shù)的尋址。二是跳轉(zhuǎn)、調(diào)用等指令所涉及的跳轉(zhuǎn)目標(biāo)地址和調(diào)用程序的首地址的尋址。1980C51單片機(jī)的尋址方式有七種:立即數(shù)尋址直接尋址寄存器尋址寄存器間接尋址基址變址尋址相對(duì)尋址位尋址20

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址213.2.1立即尋址所謂立即尋址就是在指令中直接給出操作數(shù)。通常把出現(xiàn)在指令中的操作數(shù)稱為立即數(shù),為了與直接尋址指令中的直接地址相區(qū)別,指令中需要在直接給出的具體數(shù)據(jù)前面加“#”標(biāo)志。22【例3-1】執(zhí)行指令:MOVA,#30H后累加器A的值是多少?解:執(zhí)行指令如圖3-1所示,(A)=30H。匯編指令MOVA,#30H編譯成機(jī)器碼后為:74H,30H,其中30H就是立即數(shù),該指令功能是將30H這個(gè)數(shù)本身送入累加器A中,執(zhí)行完這條指令后累加器A中的值為30H,即(A)=30H。立即尋址所對(duì)應(yīng)的存儲(chǔ)空間為ROM空間。2324

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址

3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址253.2.2直接尋址

直接尋址方式就是在指令中直接給出操作數(shù)存放在內(nèi)部RAM的地址,或直接給出特殊功能寄存器的地址或符號(hào)。直接尋址方式可訪問以下存儲(chǔ)空間:1)內(nèi)部RAM低128個(gè)字節(jié)單元,在指令中直接地址以單元地址的形式給出;2)特殊功能寄存器。26【例3-2】已知內(nèi)部RAM(30H)=58H,執(zhí)行指令“MOVA,30H”后,(A)=?解:指令執(zhí)行過(guò)程如圖3-2所示,結(jié)果:(A)=58H。該指令在ROM中的機(jī)器碼為:E5H、30H,其中30H表示直接地址,該指令功能是把內(nèi)部RAM地址為30H單元中的操作數(shù)58H傳送給累加器A,累加器原先的數(shù)值被覆蓋。2728注意:1)對(duì)于特殊功能寄存器,其直接地址既可以寫成特殊功能寄存器的直接地址形式。如指令:MOVA,90H說(shuō)明:90H是特殊功能寄存器P1的直接地址形式。

2)更常采用特殊功能寄存器的符號(hào)名稱來(lái)表示。如指令:MOVA,P1說(shuō)明:P1是特殊功能寄存器的符號(hào)名稱,也是符號(hào)地址,在指令中符號(hào)“P1”與地址“90H”是等同的。29

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址

3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址303.2.3寄存器尋址

寄存器尋址就是以寄存器的內(nèi)容作為操作數(shù)?!纠?-3】如(RO)=60H,則執(zhí)行MOVA,R0指令后,(A)=?解:指令執(zhí)行過(guò)程如圖3-3,結(jié)果:(A)=60H。指令在ROM中的機(jī)器碼為E8H,指令對(duì)應(yīng)的機(jī)器碼是:E8H=11101000B,二進(jìn)制的后三位000就是隱含的R0寄存器的編碼,如果是R7其編碼為111。由于寄存器在CPU內(nèi)部,所以采用寄存器尋址可以獲得較高的運(yùn)算速度。3132能實(shí)現(xiàn)這種尋址方式的寄存器有:(1)工作寄存器R0~R7

(4組工作寄存器均可)(2)累加器A

(注:使用A為寄存器尋址,使用ACC為直接尋址)(3)寄存器B

(注:以AB寄存器對(duì)的形式出現(xiàn)時(shí)為寄存器尋址,單獨(dú)出現(xiàn)時(shí)為直接尋址)(4)數(shù)據(jù)指針DPTR

例如:MOVA,R0;將R0寄存器的內(nèi)容送到累加器A中。

MOVR2,A;把累加器A中的內(nèi)容傳送到R2寄存器中。說(shuō)明:采用寄存器尋址方式的指令都是一字節(jié)的指令,指令中以符號(hào)名稱來(lái)表示寄存器;寄存器在CPU內(nèi)部,故有較高的運(yùn)算速度。33

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址343.2.4寄存器間接尋址所謂寄存器間接尋址就是以寄存器中的內(nèi)容作為RAM地址,該地址中的內(nèi)容才是操作數(shù)。寄存器名稱前加“@”標(biāo)志來(lái)表示寄存器間接尋址?!纠?-4】(RO)=60H,(60H)=32H,則執(zhí)行MOVA,@R0指令后,(A)=?,(RO)=?解:指令執(zhí)行過(guò)程如圖3-4,結(jié)果:(A)=32H,(RO)=60H。

35說(shuō)明:

R0寄存器的內(nèi)容60H是操作數(shù)地址,內(nèi)部RAM60H的內(nèi)容32H才是操作數(shù),把該操作數(shù)復(fù)制到累加器A中,A中原來(lái)的數(shù)據(jù)被覆蓋了,結(jié)果(A)=32H。若是寄存器尋址指令:MOVA,R0;則執(zhí)行結(jié)果(A)=60H。361)80C51系列單片機(jī)規(guī)定只能用寄存器R0、R1、DPTR作為間接尋址的寄存器。2)間接尋址可以訪問的存儲(chǔ)空間為內(nèi)部RAM和外部RAM。①內(nèi)部RAM的低128個(gè)單元采用R0、R1作為間址寄存器,在指令中表現(xiàn)為@R0、@R1的形式;②外部RAM的寄存器間接尋址有兩種形式:一是采用R0、R1作為間址寄存器,指令中表現(xiàn)為@R0、@R1的形式,可尋址外部RAM的低256個(gè)單元,即可訪問地址范圍為0000H~00FFH的單元;二是采用16位的DPTR作為間址寄存器,指令中表現(xiàn)為@DPTR的形式,可尋址外部RAM整個(gè)64KB個(gè)地址空間,地址范圍為0000H~FFFFH的單元。37

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址383.2.5變址尋址

變址尋址是以DPTR或PC作為基址寄存器,以累加器A作為變址寄存器(存放地址偏移量),并以兩者內(nèi)容相加形成的16位地址作為操作數(shù)地址,用于讀ROM數(shù)據(jù)操作。在變址尋址中:操作數(shù)地址=基址+變址基址寄存器:16位的地址指針寄存器DPTR或16位的PC寄存器變址寄存器:累加器A兩者中的“內(nèi)容”之和形成一個(gè)16位的“地址”,該“地址”所指的存儲(chǔ)單元中的內(nèi)容才是操作數(shù)。39變址尋址用于兩種情況:(1)用于對(duì)ROM(包含內(nèi)外ROM)的數(shù)據(jù)進(jìn)行尋址例如:MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))第一條指令的功能將A的內(nèi)容與DPTR的內(nèi)容之和作為操作數(shù)地址,把該地址中的內(nèi)容送入累加器A中;第二條指令的功能將A的內(nèi)容與PC的內(nèi)容之和作為操作數(shù)地址,把該地址中的內(nèi)容送入累加器A中。40變址尋址用于兩種情況:(2)用于跳轉(zhuǎn)指令例如:JMP@A+DPTR跳轉(zhuǎn)指令的功能是將累加器A的內(nèi)容與數(shù)據(jù)指針DPTR的內(nèi)容相加形成指令跳轉(zhuǎn)的目標(biāo)地址,從而使程序轉(zhuǎn)移到該地址運(yùn)行。注意:變址尋址所找到的地址是ROM空間的地址,指令中表現(xiàn)為@A+DPTR,@A+PC的形式。41【例3-5】若(A)=03H,(DPH)=20H,(DPL)=00H,即(DPTR)=2000H,ROM的(2003H)=66H。執(zhí)行指令MOVCA,@A+DPTR后,(A)=?解:指令執(zhí)行過(guò)程如圖3-5,結(jié)果:(A)=66H,(RO)=60H。該指令中累加器A的值和DPTR的值相加所得2003H為操作數(shù)所在ROM單元的地址,該地址中的數(shù)據(jù)66H才是要找的操作數(shù),該指令將66H覆蓋累加器A原來(lái)的值。4243

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址

3.2.7位尋址443.2.6相對(duì)尋址

相對(duì)尋址,用于相對(duì)轉(zhuǎn)移指令,將程序計(jì)數(shù)器PC的當(dāng)前值與指令中給出的偏移量rel相加,其結(jié)果作為轉(zhuǎn)移地址送入PC中。說(shuō)明:相對(duì)尋址能修改PC的值,故可用來(lái)實(shí)現(xiàn)程序的分支轉(zhuǎn)移;PC當(dāng)前值是指正在執(zhí)行指令的下一條指令的地址;rel是一個(gè)帶符號(hào)的8位二進(jìn)制數(shù),取值范圍-128~+127。45【例3-6】設(shè)指令SJMP54H存放在ROM內(nèi)以2000H起始的單元,求執(zhí)行本指令后程序?qū)⑻D(zhuǎn)到何處執(zhí)行?解:這是無(wú)條件相對(duì)轉(zhuǎn)移指令,是雙字節(jié)指令,指令代碼為80H、54H,其中80H是該指令的操作碼,54H是偏移量。

轉(zhuǎn)移地址為2000H+02H+54H=2056H。故指令執(zhí)行后,PC的值變?yōu)?056H,程序的執(zhí)行順序發(fā)生了轉(zhuǎn)移,指令執(zhí)行過(guò)程如圖3-6所示。在實(shí)際編程中,“rel”通常用標(biāo)號(hào)代替。例:SJMPLOOP14647

本節(jié)內(nèi)容3.2.1立即尋址3.2.2直接尋址3.2.3寄存器尋址3.2.4寄存器間接尋址3.2.5變址尋址3.2.6相對(duì)尋址3.2.7位尋址483.2.7位尋址

80C51系列單片機(jī)有位處理功能,位尋址方式是對(duì)內(nèi)RAM和特殊功能寄存器中的可尋址位進(jìn)行操作的尋址方式。

位尋址是在指令的操作數(shù)位置上直接給出位地址。例如:MOVC,07H將位地址07H(字節(jié)地址20H中最高位)中的數(shù)據(jù)傳傳送到位累加器CY中。提示:位地址里的數(shù)據(jù)只可能是一個(gè)0或1。再如:MOV30H,CCLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;CY←/(CY)49【例3-7】位地址為07H單元中的值為1,CY=0,執(zhí)行MOVC,07H指令后,CY=?解:該指令的功能是把位地址07H中的值傳送到位累加器CY中。5051系列單片機(jī)的內(nèi)部RAM有兩個(gè)區(qū)域可以位尋址:一個(gè)是位尋址區(qū)20H~2FH單元的128位;另一個(gè)是字節(jié)地址能被8整除的特殊功能寄存器的相應(yīng)位。51在MCS-51系列單片機(jī)中,位地址有以下幾種表示方式:(1)直接使用位地址。對(duì)于20H~2FH共16個(gè)單元的128位,其位地址編號(hào)是00H~7FH,例如,20H單元的0~7位的位地址為00H~07H。(2)用單元地址加位序號(hào)表示。如25H.5表示25H單元的D5位(位地址是2DH),而PSW中的D3可表示為D0H.3。這種表示方法可以避免查表或計(jì)算,比較方便。(3)用位名稱表示。特殊功能寄存器中的可尋址位均有位名稱,可以用位名稱來(lái)表示該位。如可用RS0表示PSW中的D3位:D0H.3(4)對(duì)特殊功能寄存器可直接用寄存器符號(hào)加位序號(hào)表示。如PSW中的D3位,又可表示為PSW.3。5253

本節(jié)內(nèi)容3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令

3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令3.3.5堆棧操作指令

54數(shù)據(jù)傳送類指令(29條)是最常用、最基本的一類指令,主要用于數(shù)據(jù)的傳送、保存及交換等場(chǎng)合。數(shù)據(jù)傳送類指令的一般功能是把源操作數(shù)傳送到目的操作數(shù),指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)被源操作數(shù)代替。3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令內(nèi)部RAM的數(shù)據(jù)傳送類指令共16條,包括累加器、寄存器、特殊功能寄存器、RAM單元之間的相互數(shù)據(jù)傳送。55一、以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令

MOVA,#data;A←dataMOVA,direct;A←(direct)MOVA,Rn

;A←(Rn)MOVA,@Ri

;A←((Ri))

這組指令的功能:將源操作數(shù)所指定的內(nèi)容送入累加器A中。源操作數(shù)可以采用立即尋址、直接尋址、寄存器尋址和寄存器間接尋址4種尋址方式。

56【例3-8】若(RO)=20H,(20H)=66H,試分別求解每條指令執(zhí)行后,(A)=?MOVA,#20H;A←20HMOVA,20H;A←(20H)MOVA,R0;A←(R0)MOVA,@RO;A←((RO))解:執(zhí)行每條指令后:(A)=20H(A)=66H(A)=20H(A)=66H57二、以寄存器Rn為目的操作數(shù)的數(shù)據(jù)傳送指令

MOVRn,A;Rn←(A)MOVRn,#data;Rn←dataMOVRn,direct;Rn←(direct)這組指令的功能:將源操作數(shù)所指定的內(nèi)容送到當(dāng)前工作寄存器組R0~R7中的某個(gè)寄存器中。源操作數(shù)可以采用累加器A(屬于寄存器尋址)、立即尋址和直接尋址。注意:沒有“MOVRn,Rn”指令,也沒有“MOVRn,@Ri”指令。58【例3-9】已知(A)=50H,(R1)=10H,(R2)=20H,(R3)=30H,(30H)=4FH,求解每條指令的執(zhí)行結(jié)果。①M(fèi)OVR1,A;R1←(A)②MOVR2,30H;R2←(30H)③MOVR3,#85H;R3←85H解:執(zhí)行后:①(R1)=50H;②(R2)=4FH;③(R3)=85H。第②條指令的執(zhí)行過(guò)程見圖3-8。5960三、以直接地址為目的操作數(shù)的數(shù)據(jù)傳送指令

MOVdirect,A;direct←(A)MOVdirect,#data;direct←dataMOVdirect1,direct2;direct1←(direct2)MOVdirect,Rn

;direct←(Rn)MOVdirect,@Ri

;direct←((Ri))這組指令的功能:將源操作數(shù)所指出的內(nèi)容送入由直接地址direct所指定的片內(nèi)存儲(chǔ)單元。源操作數(shù)可以采用寄存器尋址、立即尋址、直接尋址和寄存器間接尋址四種方式。61【例3-10】若(A)=36H,(50H)=22H,(R0)=60H,(60H)=72H,求解每條指令執(zhí)行后,(40H)=?①M(fèi)OV40H,A;40H←(A)②MOV40H,#50H;40H←50H③MOV40H,50H;40H←(50H)④MOV40H,R0;40H←(R0)⑤MOV40H,@R0;(40H)←((R0))解:每條指令的執(zhí)行結(jié)果分別為:①(40H)=36H;②(40H)=50H;③(40H)=22H;④(40H)=60H;⑤(40H)=

72H。62⑤MOV40H,@R0;(40H)←((R0))第⑤條指令的執(zhí)行過(guò)程如圖3-9所示。63四、以間接地址@Ri為目的操作數(shù)的數(shù)據(jù)傳送指令

MOV@Ri,A;(Ri)←(A)MOV@Ri,#data;(Ri)←dataMOV@Ri,direct;(Ri)←(direct)這組指令的功能:把源操作數(shù)所指定的內(nèi)容送入以R0或R1為地址指針的片內(nèi)RAM單元中。源操作數(shù)可以采用寄存器尋址、立即尋址和直接尋址3種方式。注意:沒有“MOV@Ri,Rn”指令和“MOV@Ri,@Ri”指令。

64【例3-11】已知(R1)=60H,(A)=20H,(30H)=22H,試分別求解每條指令的執(zhí)行結(jié)果。①M(fèi)OV@R1,A;(R1)←(A)②MOV@R1,#26H;(R1)←26H③MOV@R1,30H;(R1)←(30H)解:本條指令用源操作數(shù)的值修改的寄存器的值作為地址單元中的內(nèi)容,寄存器的值不變。第三條指令的執(zhí)行過(guò)程如圖3-10所示。①(R1)=60H,(60H)=20H;②(R1)=60H,(60H)=26H;③(R1)=60H,(60H)=22H。6566五、以DPTR為目的操作數(shù)的數(shù)據(jù)傳送指令

MOVDPTR,#data16;DPTR←data16這是80C51系列單片機(jī)指令系統(tǒng)唯一的一條16位傳送指令。功能:是將外部存儲(chǔ)器(RAM或ROM)某單元地址作為立即數(shù)送到DPTR中,立即數(shù)的高8位送DPH,低8位送DPL。67在使用上述各類傳送指令時(shí),需注意以下幾點(diǎn):(1)要區(qū)分各種尋址方式的含義,正確傳送數(shù)據(jù)?!纠?-12】若(R0)=30H,(30H)=50H時(shí),以下指令的執(zhí)行結(jié)果:MOVA,RO;MOVA,@R0;MOVA,30H;MOVA,#30H;執(zhí)行結(jié)果:(A)=30H(A)=(30H)=50H(A)=(30H)=50H(A)=30H68MCS-51單片機(jī)片內(nèi)數(shù)據(jù)傳送圖

69在使用上述各類傳送指令時(shí),需注意以下幾點(diǎn):(2)所有傳送指令都不影響標(biāo)志位。這里所說(shuō)的標(biāo)志位是指CY、AC和OV,涉及累加器A的將影響奇偶標(biāo)志位P。(3)估算指令的字節(jié)數(shù)。凡是指令中既不包含直接地址,又不包含8位立即數(shù)的指令均為一字節(jié)指令;若指令中包含一個(gè)直接地址或8位立即數(shù),指令字節(jié)數(shù)為2,若包含兩個(gè)這樣的操作數(shù),則指令字節(jié)數(shù)為3。如:MOVA,@R0;1字節(jié)

MOVA,direct;2字節(jié)

MOVdirect,#data;3字節(jié)

MOVDPTR,#datal16;3字節(jié)70

本節(jié)內(nèi)容3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX

3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令3.3.5堆棧操作指令

713.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX

單片機(jī)片經(jīng)常會(huì)與外部RAM進(jìn)行數(shù)據(jù)交換,以及對(duì)外部I/O口輸出控制信號(hào)或讀取外部I/O口的狀態(tài)。

80C51單片機(jī)與外部RAM或I/O口進(jìn)行數(shù)據(jù)傳送沒有專門的指令,都用MOVX指令,且必須采用寄存器間接尋址的方法,并通過(guò)累加器A來(lái)傳送。72一、單片機(jī)讀取片外RAM或I/O口指令

MOVXA,@DPTR;A←((DPTR))MOVXA,@Ri

;A←((Ri))二、單片機(jī)寫片外RAM或I/O口指令

MOVX@DPTR,A;(DPTR)←(A)MOVX@Ri,A;(Ri)←(A)該組指令的功能:在DPTR或R0、R1所指定的外部RAM單元與累加器A之間傳送數(shù)據(jù)。注意:片外擴(kuò)展的I/O接口進(jìn)行數(shù)據(jù)的讀、寫沒有專門的指令,只能與外部RAM共用這四條指令。73一、單片機(jī)讀取片外RAM或I/O口指令

MOVXA,@DPTR;A←((DPTR))MOVXA,@Ri

;A←((Ri))二、單片機(jī)寫片外RAM或I/O口指令

MOVX@DPTR,A;(DPTR)←(A)MOVX@Ri,A;(Ri)←(A)前兩條指令是以DPTR作為間址寄存器,DPTR是16位,其尋址范圍可達(dá)片外RAM64KB空間。后兩條指令是以R0或R1作為間址寄存器,R0或R1是8位,其尋址范圍僅限于外部RAM256個(gè)字節(jié)單元。74【例3-13】試編程,將片外RAM的2000H單元內(nèi)容送入片外RAM的20H單元中。解:片外RAM與片外RAM之間不能直接傳送,需通過(guò)累加器A;另外,當(dāng)片外RAM地址值大于0FFH時(shí),不能用R0和R1作為間址寄存器,需用DPTR作為間址寄存器。編程如下:MOVDPTR,#2000H;源數(shù)據(jù)地址送DPTRMOVXA,@DPTR;從外部RAM中取數(shù)送AMOVRO,#20H;目的地址送DPTRMOVX@R0,A;A中內(nèi)容送外部RAM75

本節(jié)內(nèi)容3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令3.3.5堆棧操作指令

763.3.3讀取ROM中常數(shù)表的查表指令MOVC

通常ROM中是用來(lái)存放供單片機(jī)CPU執(zhí)行的程序代碼的,但其內(nèi)部也可以用來(lái)存放固定不變的數(shù)據(jù),如:表格數(shù)據(jù)。讀取ROM中常數(shù)表的查表指令MOVC,能夠?qū)⒊绦虼鎯?chǔ)器表格中的數(shù)據(jù)或字段代碼送到累加器A中。

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

MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))指令的功能是從程序存儲(chǔ)器中讀取源操作數(shù)送入累加器A中。這兩條指令特別適合于讀取在ROM中建立的數(shù)據(jù)表格,故稱做查表指令。源操作數(shù)均為變址尋址方式。兩條指令都是一字節(jié)指令。78二者在使用中有一點(diǎn)差異:第一條指令采用DPTR作為基址寄存器。表格數(shù)據(jù)可存放在64KBROM的任意位置,使用前需將表格首地址送入DPTR中,因此這條指令稱為遠(yuǎn)程查表指令。第二條指令是以PC作為基址寄存器。表格長(zhǎng)度不能超過(guò)256B,程序中PC值是確定的,為下一條指令的地址,不能送入表格首地址,使基址與實(shí)際要讀取的表格數(shù)據(jù)首地址不一致,這樣A+PC與實(shí)際要訪問的單元地址就不一致,因此,使用該指令之前要用一條加法指令進(jìn)行地址調(diào)整。由于PC的內(nèi)容不能隨意改變,所以只能借助于A來(lái)進(jìn)行調(diào)整,即通過(guò)對(duì)累加器A加一個(gè)數(shù),使得A+PC和所讀ROM單元地址一樣。79【例3-14】若在外部ROM中2000H單元開始存放(O~9)的平方值O,l,4,9,…,81,要求根據(jù)累加器A中的值(0~9),來(lái)查找所對(duì)應(yīng)的平方值,并存入60H單元中。解:(1)用DPTR作為基址寄存器:在MOVC指令前先將表首地址送給DPTRMOVDPTR,#2000H;表格首地址送DPTRMOVCA,@A+DPTR;根據(jù)表格首地址及A確定地址,取數(shù)送AMOV60H,A;存結(jié)果2000H:DB0,1,4,9,16,25,36,…,81

這種情況,(A)+(DPTR)之和就是待求數(shù)的平方值在ROM表格中的存放地址。80(2)用PC作為基址寄存器:在MOVC指令前先用一條加法指令進(jìn)行地址調(diào)整

ADDA,#data;(A)+data作為地址調(diào)整,本條指令占2字節(jié)

MOVCA,@A+PC;(A)+data+(PC)確定查表地址,取數(shù)送A,本條指令占1字節(jié)

MOV60H,A;存結(jié)果,本條指令占2字節(jié)

RET;本條指令占1字節(jié)2000H:DB0,1,4,9,16,25,36,…,81執(zhí)行該指令時(shí),PC當(dāng)前值不是要查找的表格首地址2000H,已指向下一條指令地址,兩者之間存在地址差,因此需進(jìn)行地址調(diào)整,使其能指向表格首地址,由于PC的內(nèi)容不能隨意改變,所以只能借助于A來(lái)進(jìn)行調(diào)整。加在A上的#data的值是由緊隨MOVC指令的下一條指令的首地址與數(shù)據(jù)表格首地址之間其它指令所占的字節(jié)數(shù)之和來(lái)確定。本例中,查表指令與表格首地址之間只有兩條指令,即:MOV60H,A和RET,兩者共占3個(gè)字節(jié),因此本題data=03H。

A中的內(nèi)容為8位無(wú)符號(hào)數(shù),該查表指令只能查找指令所在地址以后256B范圍內(nèi)的數(shù)據(jù),故稱之為近程查表指令。81

本節(jié)內(nèi)容3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令

3.3.5堆棧操作指令

823.3.4數(shù)據(jù)交換指令

數(shù)據(jù)交換指令共有5條,可完成累加器A和內(nèi)部RAM單元之間的字節(jié)或半字節(jié)交換。一、整字節(jié)交換指令整字節(jié)交換指令有3條,完成累加器A與內(nèi)部RAM單元內(nèi)容的整字節(jié)(即8位二進(jìn)制數(shù)據(jù))全部交換。

XCHA,Rn

;(A)←→(Rn)XCHA,direct;(A)←→(direct)XCHA,@Ri

;(A)←→((Ri))83【例3-15】已知(A)=40H,(R0)=20H,(30H)=58H,(20H)=4FH,試分別求解下面3條各自獨(dú)立指令的執(zhí)行結(jié)果。①XCHA,R0;(A)←→(R0)②XCHA,30H;(A)←→(30H)③XCHA,@R0;(A)←→((R0))解:①(A)=20H,(R0)=40H;②(A)=58H,(30H)=40H;③(A)=4FH,(R0)=20H,(20H)=40H。84【例3-16】試編程,將外部RAM1000H單元中的數(shù)據(jù)與內(nèi)部RAM6AH單元中的數(shù)據(jù)相互交換。解:數(shù)據(jù)交換指令只能完成累加器A和內(nèi)部RAM單元之間的數(shù)據(jù)交換,要完成外部RAM與內(nèi)部RAM之間的數(shù)據(jù)交換,需先把外部RAM中的數(shù)據(jù)取到A中,交換后再送回到外部RAM中。編程如下:

MOVDPTR,#1000H;外部RAM地址送DPTRMOVXA,@DPTR;從外部RAM中取數(shù)送AXCHA,6AH;A與6AH地址中的內(nèi)容進(jìn)行交換

MOVX@DPTR,A;交換結(jié)果送外部RAM85二、半字節(jié)交換指令

XCHDA,@Ri

;(A)3~0←→((Ri))3~0該指令功能:將累加器A中的低4位和Ri間接尋址找到的數(shù)據(jù)低4位交換,而各自的高4位內(nèi)容都保持不變?!纠?-17】已知(A)=40H,(R0)=26H,(26H)=3FH,試求解下面指令的執(zhí)行結(jié)果。

XCHDA,@R0;(A)3~0

((R0))3~0

解:指令執(zhí)行后:(A)=4FH,(R0)=26H,(26H)=30H。86三、累加器高低半字節(jié)交換指令

SWAPA;(A)7~4←→(A)3~0

由于十六進(jìn)制數(shù)或BCD碼都是以4位二進(jìn)制數(shù)表示,因此SWAP指令主要用于實(shí)現(xiàn)十六進(jìn)制數(shù)或BCD碼的數(shù)位交換?!纠?-18】已知(A)=40H,試求解下面指令的執(zhí)行結(jié)果。

SWAPA;(A)7~4←→(A)3~0解:指令執(zhí)行后(A)=04H。87

本節(jié)內(nèi)容3.3.1內(nèi)部RAM數(shù)據(jù)傳送指令3.3.2訪問外部RAM的數(shù)據(jù)傳送指令MOVX3.3.3讀取ROM中常數(shù)表的查表指令MOVC3.3.4數(shù)據(jù)交換指令3.3.5堆棧操作指令

883.3.5堆棧操作指令堆棧操作指令可以實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)數(shù)據(jù)或斷點(diǎn)地址的保護(hù)。一、進(jìn)棧指令

PUSHdirect;SP←(SP)+1,(SP)←(direct)進(jìn)棧指令的功能:先將棧頂指針SP的內(nèi)容加1,使棧區(qū)向上生長(zhǎng)出一個(gè)棧頂空單元,然后將直接地址direct單元的內(nèi)容送入棧頂空單元。89【例3-19】如圖3-11(a)所示:(SP)=41H,(41H)=22H,設(shè)(A)=18H,試回答:①執(zhí)行指令之前棧頂單元的地址是多少?②指令執(zhí)行后棧頂單元的地址是多少?③執(zhí)行指令后(SP)=?,(42H)=?PUSHACC;解:指令執(zhí)行過(guò)程如圖3-11(b)和3-11(c)。①指令執(zhí)行前棧頂單元的地址就是SP的值即41H;②指令執(zhí)行后棧頂單元的地址為42H;③(SP)=42H,(42H)=18H。

9091二、出棧指令

POPdirect;direct←((SP)),SP←(SP)-1出棧指令的功能:先將SP所指出的棧頂單元的內(nèi)容送入direct直接地址單元,然后將堆棧指針SP的內(nèi)容減1,使之指向新的棧頂單元?!纠?-20】如圖3-12(a)所示:(SP)=41H,(41H)=22H,試回答:①執(zhí)行指令之前棧頂單元的地址是多少?②指令執(zhí)行后棧頂單元的地址是多少?③執(zhí)行指令后(SP)=?,(5FH)=?POP

5FH92解:指令執(zhí)行過(guò)程如圖3-12(b)和3-12(C)。①指令執(zhí)行前棧頂單元的地址就是SP的值即41H;②指令執(zhí)行后棧頂單元的地址為40H;③(SP)=40H,(5FH)=22H。93注意:無(wú)論是進(jìn)棧還是出棧均是對(duì)棧頂單元進(jìn)行的,且這兩條指令的操作數(shù)只能采用直接尋址方式,不能用累加器A或工作寄存器Rn作為操作數(shù)。指令中如用到累加器A,必須寫出符號(hào)地址ACC的形式或?qū)懗鲋苯拥刂稥0H,不能寫成A的形式。

如:PUSHACC(ACC表示累加器A的直接地址)利用堆棧操作指令也可以完成數(shù)據(jù)的傳送。94

本節(jié)內(nèi)容3.4.1加法指令

3.4.2減法指令3.4.3乘、除法指令95

80C51系列單片機(jī)的算術(shù)運(yùn)算類指令共有24條,可以完成加、減、乘、除等各種操作,全部指令都是8位數(shù)運(yùn)算指令。算術(shù)運(yùn)算類指令大多數(shù)要影響到程序狀態(tài)字寄存器PSW中的溢出標(biāo)志OV、進(jìn)位(借位)標(biāo)志CY、輔助進(jìn)位標(biāo)志AC和奇偶標(biāo)志位P。如果需要做16位數(shù)的運(yùn)算則需編寫相應(yīng)的程序來(lái)實(shí)現(xiàn)。算術(shù)運(yùn)算的大部分指令均以累加器A作為源操作數(shù)之一,并且運(yùn)算結(jié)果還存放在累加器A中。963.4.1加法指令一、不帶進(jìn)位加法指令

ADDA,#data;A←(A)+dataADDA,direct;A←(A)+(direct)ADDA,Rn

;A←(A)+(Rn)ADDA,@Ri

;A←(A)+((Ri))這組指令的功能:把源操作數(shù)所指出的內(nèi)容與累加器A的內(nèi)容相加,其結(jié)果存放在A中。源操作數(shù)的尋址方式分別為立即尋址、直接尋址、寄存器尋址和寄存器間接尋址。97該組指令對(duì)PSW中的各標(biāo)志位影響情況如下:進(jìn)位標(biāo)志CY:如果D7位向上有進(jìn)位,則CY=1;否則,CY=O。半進(jìn)位標(biāo)志AC:如果D3位向上有進(jìn)位,則AC=1;否則,AC=0。溢出標(biāo)志OV:如果D7、D6位只有一個(gè)向上有進(jìn)位時(shí),OV=1;如果D7、D6位同時(shí)有進(jìn)位或同時(shí)無(wú)進(jìn)位時(shí),OV=0。奇偶標(biāo)志P:當(dāng)A中“1”的個(gè)數(shù)為奇數(shù),P=1;為偶數(shù),P=0。98【例3-21】設(shè)有兩個(gè)無(wú)符號(hào)數(shù)分別存放于累加器A和內(nèi)部RAM30H單元,其中(A)=94H,(30H)=8DH,試分析執(zhí)行指令A(yù)DDA,30H后兩個(gè)數(shù)的和及各標(biāo)志位的情形?解:不帶進(jìn)位的加法指令操作如下:結(jié)果為:(A)=21H;(CY)=1,(AC)=1,(OV)=1,(P)=O。99【例3-22】設(shè)有兩個(gè)帶符號(hào)數(shù)分別存放于累加器A和內(nèi)部RAM30H單元,其值分別為(A)=94H,(30H)=8DH,試分析執(zhí)行指令A(yù)DDA,30H后的結(jié)果?解:運(yùn)算過(guò)程及對(duì)標(biāo)準(zhǔn)位的影響與【例3-21】相同。注意:兩個(gè)正數(shù)相加或兩個(gè)負(fù)數(shù)相加時(shí),可能發(fā)生溢出(結(jié)果超出補(bǔ)碼的表達(dá)范圍-128~+127),則和的符號(hào)位將與加數(shù)和被加數(shù)不同,所得結(jié)果錯(cuò)誤,OV=1正好指出了這一類錯(cuò)誤。100二、帶進(jìn)位加法指令

ADDCA,#data;A←(A)+data+(CY)ADDCA,direct;A←(A)+(direct)+(CY)ADDCA,Rn

;A←(A)+(Rn)+(CY)ADDCA,@Ri

;A←(A)+((Ri))+(CY)這組指令的功能:把源操作數(shù)所指出的內(nèi)容與累加器A的內(nèi)容相加、再加上進(jìn)位標(biāo)志CY的值,其結(jié)果存放在A中。源操作數(shù)的尋址方式分別為立即尋址、直接尋址、寄存器尋址和寄存器間接尋址。運(yùn)算結(jié)果對(duì)PSW標(biāo)志位的影響與ADD指令相同。所加的進(jìn)位標(biāo)志CY的值是在該指令執(zhí)行之前的值。101【例3-23】設(shè)有兩個(gè)無(wú)符號(hào)數(shù)分別存放于累加器A和內(nèi)部寄存器R1單元,其中(A)=0AEH,(R1)=81H,(CY)=1,試求執(zhí)行指令A(yù)DDCA,R1的結(jié)果?解:帶進(jìn)位的加指令操作如下:結(jié)果為:(A)=30H;(CY)=1,(OV)=1,(AC)=1,(P)=0。帶進(jìn)位加法指令主要用于多字節(jié)數(shù)據(jù)的加法運(yùn)算。102【例3-24】設(shè)有兩個(gè)無(wú)符號(hào)16位二進(jìn)制數(shù),分別存放在30H、31H單元和40H、41H單元中(低8位先存),寫出兩個(gè)16位數(shù)的加法程序,將和存入50H、51H單元(設(shè)和不超過(guò)16位)。解:由于80C51單片機(jī)不存在16位數(shù)的加法指令,所以只能先加低8位,后加高8位,而在加高8位時(shí)要連低8位相加的進(jìn)位一起相加,編程如下:

MOVA,30H;取一個(gè)加數(shù)的低字節(jié)送A中

ADDA,40H;兩個(gè)低字節(jié)數(shù)相加

MOV50H,A;結(jié)果送50H單元

MOVA,31H;取一個(gè)加數(shù)的高字節(jié)送A中

ADDCA,41H;高字節(jié)數(shù)相加,同時(shí)加低字節(jié)產(chǎn)生的進(jìn)位

MOV51H,A;結(jié)果送51H單元。103三、加1指令

INCA;A←(A)+1INCdirect;direct←(direct)+1INCRn

;Rn←(Rn)+1INC@Ri

;(Ri)←((Ri))+1INCDPTR;DPTR←(DPTR)+1這組指令的功能:進(jìn)行無(wú)符號(hào)數(shù)的運(yùn)算,其將操作數(shù)所指定單元的內(nèi)容加1。本組指令除“INCA”指令影響P標(biāo)志外,其余指令均不影響PSW標(biāo)志。加1指令常用來(lái)修改操作數(shù)的地址,以便于使用間接尋址方式。104【例3-25】若已知(A)=20H,(30H)=36H,(R7)=58H,(R0)=50H,(50H)=08H,(DPTR)=2000H,試計(jì)算下列指令的結(jié)果。INCA;A←(A)+1INC30H;30H←(30H)+1INCR7;R7←(R7)+1INC@R0;(R0)←((R0))+1INCDPTR;DPTR←(DPTR)+1解:指令執(zhí)行后:①(A)=21H;②(30H)=37H;③(R7)=59H;④(R0)=50H;(50H)=09H;⑤(DPTR)=2001H。105四、十進(jìn)制調(diào)整指令

DAA1)功能:對(duì)A中剛進(jìn)行的兩個(gè)BCD碼的加法結(jié)果自動(dòng)進(jìn)行修正。2)該指令只影響進(jìn)位標(biāo)志CY。3)使用方法:在上述加法指令后面緊跟一條DAA指令。4)修正方法:若(A0~3)>9或(AC)=1,則(A0~3)+6H

(A0~3)。若(A4~7)>9或(CY)=1,則(A4~7)+6H

(A4~7)。5)相關(guān)內(nèi)容:所謂BCD碼就是采用四位二進(jìn)制編碼表示的十進(jìn)制數(shù)。四位二進(jìn)制數(shù)共有十六個(gè)編碼,BCD碼是取它前十個(gè)的編碼0000~1001來(lái)代表十進(jìn)制數(shù)的0~9,這種編碼簡(jiǎn)稱為BCD碼。如果兩個(gè)BCD碼數(shù)相加,結(jié)果也是BCD碼,則該加法運(yùn)算稱為BCD碼加法。在單片機(jī)中沒有專門的BCD碼加法指令,要進(jìn)行BCD碼加法運(yùn)算,也要使用加法指令A(yù)DD或ADDC。然而計(jì)算機(jī)在執(zhí)行ADD或ADDC指令時(shí),是按照二進(jìn)制規(guī)則進(jìn)行的,對(duì)于4位二進(jìn)制數(shù)是按逢16進(jìn)位,而BCD碼是逢十進(jìn)位的,二者存在進(jìn)位差。106【例3-26】試分析單片機(jī)對(duì)下列三個(gè)BCD碼給出的算式運(yùn)算結(jié)果是否正確?解:在上述3組運(yùn)算中,(a)的運(yùn)算結(jié)果是正確的,因?yàn)?的BCD碼就是1000;(b)的運(yùn)算結(jié)果是錯(cuò)誤的,因?yàn)?3的BCD碼應(yīng)是00010011,但單片機(jī)給出的運(yùn)算結(jié)果卻是1101,BCD碼中沒有這個(gè)編碼;(c)的運(yùn)算結(jié)果也是錯(cuò)誤的,因?yàn)?7的BCD碼應(yīng)是00010111,而運(yùn)算結(jié)果是00010001。107【例3-27】試編寫程序,實(shí)現(xiàn)兩位十進(jìn)制數(shù)95+59的BCD碼加法,并將結(jié)果存入30H、31H單元。

MOVA,#95H;95的BCD碼數(shù)送A中

ADDA,#59H;兩個(gè)BCD碼相加,結(jié)果在A中

DAA;對(duì)相加結(jié)果進(jìn)行十進(jìn)制調(diào)整

MOV30H,A;十位個(gè)位的BCD碼之和送30HMOVA,#00H;A清0ADDCA,#00H;加進(jìn)位(百位的BCD碼)

DAA;BCD碼相加后,用調(diào)整指令

MOV31H,A;存進(jìn)位第一次執(zhí)行DAA指令的結(jié)果:A=54H,CY=1,最終結(jié)果:(31H)=01H,(30H)=54H。108

本節(jié)內(nèi)容3.4.1加法指令3.4.2減法指令3.4.3乘、除法指令1093.4.2減法指令一、帶借位減法指令

SUBBA,#data;A←(A)-data-(CY)SUBBA,direct;A←(A)-(direct)-(CY)SUBBA,Rn

;A←(A)-(Rn)-(CY)SUBBA,@Ri

;A←(A)-((Ri))-(CY)這組指令的功能:將累加器A中的數(shù),減去源操作數(shù)所指出的數(shù)和上一次減法指令所產(chǎn)生的借位位CY,其結(jié)果存放在累加器A中。源操作數(shù)的尋址方式分別為立即尋址、直接尋址、寄存器尋址和寄存器間接尋址。110運(yùn)算結(jié)果對(duì)程序狀態(tài)字PSW中各標(biāo)志位的影響情況如下:借位標(biāo)志CY:如果D7位向上需借位,則CY=1;否則,CY=0。半借位標(biāo)志AC:如果D3位向上需借位,則AC=1;否則,AC=0。溢出標(biāo)志OV:如果D7、D6位只有一個(gè)向上需借位時(shí),OV=1;如果D7、D6位同時(shí)需借位或同時(shí)無(wú)借位時(shí),OV=0。奇偶標(biāo)志P:當(dāng)累加器A中“1”的個(gè)數(shù)為奇數(shù)時(shí),P=1;為偶數(shù)時(shí),P=0。說(shuō)明:減法運(yùn)算只有帶借位減法指令,而沒有不帶借位的減法指令。若要進(jìn)行不帶借位的減法算,應(yīng)該先用指令將CY清零,然后再執(zhí)行SUBB指令。111【例3-28】設(shè)(A)=0DBH,(R4)=73H,(CY)=1,試分析執(zhí)行指令SUBBA,R4后的差和各標(biāo)志位的狀態(tài)?結(jié)果(A)=67H,(CY)=O,(AC)=0,(OV)=1。在此例中,若DBH和73H是兩個(gè)無(wú)符號(hào)數(shù),則結(jié)果67H是正確的;反之,若為兩個(gè)帶符號(hào)數(shù),則由于產(chǎn)生溢出(OV=1),使得結(jié)果是錯(cuò)誤的,因?yàn)樨?fù)數(shù)減正數(shù)其結(jié)果不可能是正數(shù),OV=1,就指出了這一錯(cuò)誤。112二、減1指令

DECA;A←(A)-1DECdirect;direct←(direct)-1DECRn

;Rn←(Rn)-1DEC@Ri

;Ri←((Ri))–1這組指令的功能:將操作數(shù)所指定單元的內(nèi)容減1。說(shuō)明:除“DECA”指令影響P標(biāo)志外,其余指令均不影響PSW標(biāo)志。113【例3-29】若已知(A)=20H,(30H)=36H,(R7)=58H,(R0)=50H,(50H)=08H,試計(jì)算下列指令的結(jié)果。①DECA;A←(A)-1②DEC30H;30H←(30H)-1③DECR7;R7←(R7)-1④DEC@R0;(R0)←((R0))-1解:指令執(zhí)行后:①(A)=1FH;②(30H)=35H;③(R7)=57H;④(R0)=50H;(50H)=07H。114三、BCD碼的減法指令由于DAA指令只能用在加法指令的后面。如果要進(jìn)行BCD碼減法運(yùn)算,也應(yīng)該進(jìn)行調(diào)整,但在80C51系列單片機(jī)中沒有十進(jìn)制減法調(diào)整指令。為了進(jìn)行十進(jìn)制減法運(yùn)算,可用加減數(shù)的補(bǔ)數(shù)來(lái)進(jìn)行。兩位十進(jìn)制數(shù)是對(duì)100取補(bǔ)的。例如:減法60-30=30,也可以改為補(bǔ)數(shù)相加為:60+(100-30)=130。丟掉進(jìn)位后,就得到正確的結(jié)果。115在實(shí)際運(yùn)算時(shí),不可能用9位二進(jìn)制數(shù)來(lái)表示十進(jìn)制數(shù)100,因?yàn)镃PU是8位的。為此,可用8位二進(jìn)制數(shù)10011010(9AH)來(lái)代替。因?yàn)檫@個(gè)二進(jìn)制數(shù)經(jīng)過(guò)十進(jìn)制調(diào)整后就是100000000。

因此,十進(jìn)制無(wú)符號(hào)數(shù)的減法運(yùn)算可按以下步驟進(jìn)行:(1)求減數(shù)的補(bǔ)數(shù),即9AH-減數(shù);(2)被減數(shù)與減數(shù)的補(bǔ)數(shù)相加;(3)對(duì)第二步的和進(jìn)行十進(jìn)制調(diào)整,就得到所求的十進(jìn)制減法運(yùn)算結(jié)果。

這里用“補(bǔ)數(shù)”而沒有用“補(bǔ)碼”,這是為了和帶有符號(hào)位的補(bǔ)碼相區(qū)別。由于現(xiàn)在操作數(shù)都是正數(shù),沒有必要再加符號(hào)位,故稱“補(bǔ)數(shù)”更為合適一些。116

【例3-30】編寫程序?qū)崿F(xiàn)十進(jìn)制減法,計(jì)算87-38。117

本節(jié)內(nèi)容3.4.1加法指令3.4.2減法指令3.4.3乘、除法指令1183.4.3乘、除法指令

80C51系列單片機(jī)有乘、除法指令各一條,它們都是一字節(jié)指令,執(zhí)行需4個(gè)機(jī)器周期的時(shí)間。一、乘法指令

MULAB;BA←(A)×(B)這條指令的功能:把累加器A和寄存器B中的兩個(gè)8位無(wú)符號(hào)數(shù)相乘,所得16位乘積的低8位放在A中,高8位放在B中。

119乘法指令執(zhí)行后會(huì)影響3個(gè)標(biāo)志:若乘積小于FFH(即B的內(nèi)容為零),則OV=0,否則OV=1;CY總是被清零;奇偶標(biāo)志P仍按累加器A中“1”的個(gè)數(shù)來(lái)確定,“1”的個(gè)數(shù)是奇數(shù)P=1,反之P=0?!纠?-31】已知(A)=80H,(B)=32H,試求執(zhí)行指令MULAB的結(jié)果?解:=00H,(B)=19H,OV=1,CY=0,P=O。((A)×(B)=1900H,計(jì)算結(jié)果大于FFH)120二、除法指令

DIVAB;A←(A)/(B)之商,B←(A)/(B)之余數(shù)這條指令的功能:對(duì)兩個(gè)8位無(wú)符號(hào)數(shù)進(jìn)行除法運(yùn)算。其中被除數(shù)存放在累加器A中,除數(shù)存放在寄存器B中,指令執(zhí)行后,商存于累加器A中,余數(shù)存于寄存器B中。除法指令執(zhí)行后也影響3個(gè)標(biāo)志:若除數(shù)為零(B=O)時(shí),OV=1,表示除法沒有意義;若除數(shù)不為零,則OV=O,表示除法正常進(jìn)行;CY總是被清零;奇偶標(biāo)志P仍按累加器A中“1”的個(gè)數(shù)來(lái)確定,“1”的個(gè)數(shù)是奇數(shù)P=1,反之P=0。

121【例3-32】已知(A)=87H(135D),(B)=0CH(12D),試求執(zhí)行指令DIVAB后的結(jié)果?

解:(A)=OBH;(B)=03H;OV=O;CY=O;P=1。122其中:CY為1,表示無(wú)符號(hào)數(shù)進(jìn)行加、減法運(yùn)算發(fā)生了進(jìn)位或借位。OV為1,表示帶符號(hào)數(shù)進(jìn)行加、減法運(yùn)算,結(jié)果超出補(bǔ)碼的表達(dá)范圍:-128~+127;或無(wú)符號(hào)數(shù)進(jìn)行乘法運(yùn)算時(shí)積超出255;或進(jìn)行除法運(yùn)算時(shí)除數(shù)為0;AC為1,如果用BCD碼進(jìn)行十進(jìn)制加法時(shí),AC為1,表示在加法指令后需要加十進(jìn)制調(diào)整指令。P為1,表示存在于累加器A中運(yùn)算結(jié)果1的個(gè)數(shù)為奇數(shù)。

算術(shù)運(yùn)算類指令大多數(shù)要影響到程序狀態(tài)字寄存器PSW中的四個(gè)標(biāo)志位,算術(shù)運(yùn)算指令對(duì)標(biāo)志位的影響詳見表3-2。123

本節(jié)內(nèi)容3.5.1邏輯與運(yùn)算指令3.5.2邏輯或運(yùn)算指令3.5.3邏輯異或運(yùn)算指令3.5.4累加器清零、取反指令3.5.5循環(huán)移位指令124邏輯運(yùn)算的特點(diǎn)是按位進(jìn)行。邏輯運(yùn)算包括與、或、異或三類,每類都有6條指令。此外還有移位指令及對(duì)累加器A清零和求反指令,邏輯運(yùn)算及移位類指令共有24條。1253.5.1邏輯與運(yùn)算指令

ANLA,#data;A←(A)∧data

ANLA,direct;A←(A)∧(direct)ANLA,Rn

;A←(A)∧(Rn)ANLA,@Ri

;A←(A)∧((Ri))

前4條指令是將累加器A的內(nèi)容和源操作數(shù)所指出的內(nèi)容按位相與,結(jié)果存放在A中;

ANLdirect,A;direct←(direct)∧(A)ANLdirect,#data;direct←(direct)∧data

后兩條指令是將直接地址單元中的內(nèi)容和源操作數(shù)所指出的內(nèi)容按位相與,結(jié)果存入直接地址所指定的單元中。

指令應(yīng)用:用于將某些位屏蔽(即使之為0)。方法是:將要屏蔽的位和“0”相與,保留不變的位同“1”相與。126

本節(jié)內(nèi)容3.5.1邏輯與運(yùn)算指令3.5.2邏輯或運(yùn)算指令

3.5.3邏輯異或運(yùn)算指令3.5.4累加器清零、取反指令3.5.5循環(huán)移位指令1273.5.2邏輯或運(yùn)算指令

ORLA,#data;A←(A)∧data

ORLA,di

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。