第3.1章-MCS-51單片機(jī)的指令系統(tǒng)_第1頁
第3.1章-MCS-51單片機(jī)的指令系統(tǒng)_第2頁
第3.1章-MCS-51單片機(jī)的指令系統(tǒng)_第3頁
第3.1章-MCS-51單片機(jī)的指令系統(tǒng)_第4頁
第3.1章-MCS-51單片機(jī)的指令系統(tǒng)_第5頁
已閱讀5頁,還剩141頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

【主要內(nèi)容】1.掌握單片機(jī)源操作數(shù)和目的操作數(shù)的尋址方式,指令格式操作碼和操作數(shù),數(shù)據(jù)傳送指令、算術(shù)運(yùn)算類指令、邏輯運(yùn)算及位移指令、控制轉(zhuǎn)移類指令等指令系統(tǒng)。2.熟悉指令描述符號,入棧和出棧操作。3.了解十進(jìn)制調(diào)整指令和空操作指令?!局攸c(diǎn)與難點(diǎn)】1.重點(diǎn):指令格式和指令系統(tǒng)2.難點(diǎn):源操作數(shù)和目的操作數(shù)的尋址方式第3章MCS-51的指令系統(tǒng)和匯編語言程序設(shè)計2024/3/19嵌入式應(yīng)用基礎(chǔ)2

MCS-51的7種尋址方式.尋址方式,是學(xué)習(xí)指令的前提。 MCS-51有111條指令,其中49條單字節(jié)指令,45條雙字節(jié)指令,17條三字節(jié)指令;按運(yùn)算速度分類,有64條單周期指令,45條雙周期指令,2條四周期指令。2024/3/19嵌入式應(yīng)用基礎(chǔ)3指令:是規(guī)定計算機(jī)進(jìn)行操作的命令。指令系統(tǒng):計算機(jī)能夠執(zhí)行的各種指令的集合。MCS-51指令系統(tǒng)是最普遍的。

機(jī)器指令與匯編語言指令

機(jī)器指令:以二進(jìn)制代碼表達(dá),能直接被計算機(jī)所識別和執(zhí)行。

指令由操作碼和操作數(shù)兩部分組成。3.1MCS-51單片機(jī)的指令系統(tǒng)2024/3/19嵌入式應(yīng)用基礎(chǔ)4機(jī)器指令難以被人們理解、記憶與使用

匯編語言指令:用便于記憶與理解的助記符和符號地址來表達(dá)的指令。指令格式:指令的表示形式。

兩部分組成,即操作碼和操作數(shù)。

操作碼:規(guī)定指令進(jìn)行什么操作

操作數(shù):指令操作的對象2024/3/19嵌入式應(yīng)用基礎(chǔ)5

使P1.0清零的匯編語言指令如表中第2列第2行所示,其中助記符CLR(clear縮寫)就是操作碼,P1.0就是符號地址。

匯編語言指令與機(jī)器指令之間有一一對應(yīng)的關(guān)系。2024/3/19嵌入式應(yīng)用基礎(chǔ)6

指令由操作碼和操作數(shù)組成,操作數(shù)是可選項,還有源、目之分,指令格式舉例:操作碼[目的操作數(shù)],[源操作數(shù)]MOV

A, #30H

操作碼:由MCS-51關(guān)鍵字表示的字符串,用來指示指令的操作功能。

操作碼與操作數(shù)之間必須用空格分隔。2024/3/19嵌入式應(yīng)用基礎(chǔ)7

操作數(shù):指示參加指令操作的數(shù)據(jù)或數(shù)據(jù)的地址,與操作碼一起確定了指令所要執(zhí)行的具體操作。 操作數(shù)如果有2個或多個,則操作數(shù)之間必須用逗號分隔。操作數(shù)可以是寄存器名、常數(shù)、標(biāo)號名;還可是表達(dá)式,如ADDA,‘a(chǎn)’+1;也可用PC的當(dāng)前值“$”,如SJMP$。2024/3/19嵌入式應(yīng)用基礎(chǔ)8指令系統(tǒng)中所用符號的說明1.Rn:工作寄存器n為0-72.#data:8位立即數(shù),范圍00H-FFH3.Direct:8位直接地址,也可以為SFR中的一個4.@Ri:表示寄存器間接尋址,i=0、15.#data16:16位立即數(shù)6.@DPTR:表示以DPTR為數(shù)據(jù)指針的間接尋址7.Bit:位尋址指令系統(tǒng)標(biāo)識符98.addr11、addr16:11、16位目標(biāo)地址9.Rel:8位帶符號地址偏移量10.$:當(dāng)前指令的地址

P84

2024/3/19嵌入式應(yīng)用基礎(chǔ)10指令的分類1.數(shù)據(jù)傳送指令(28)

主要用于單片機(jī)片內(nèi)RAM和特殊功能寄存器SFR之間的數(shù)據(jù)傳送,也可在片內(nèi)和片外的存儲單元中傳送,傳送結(jié)束后源地址的操作數(shù)不被破壞,數(shù)值不變。2.算術(shù)運(yùn)算指令(24)

用于對兩個操作數(shù)進(jìn)行加、減、乘、除等算術(shù)運(yùn)算。結(jié)果放在A里面。2024/3/19嵌入式應(yīng)用基礎(chǔ)113.邏輯操作和環(huán)移指令(25)

邏輯操作結(jié)果也放在累加器A中,環(huán)移是對A中數(shù)進(jìn)行操作,有左右和是否帶進(jìn)位(CF)之分。4.控制轉(zhuǎn)移指令(17)

分為條件轉(zhuǎn)移,無條件轉(zhuǎn)移,調(diào)用和返回等。目的:改變程序執(zhí)行的流向。實現(xiàn)方法:通過改變程序計數(shù)器PC中的值。2024/3/19嵌入式應(yīng)用基礎(chǔ)125.位操作指令(17)

布爾變量操作指令,分為位傳送、位置位、位運(yùn)算和位控制轉(zhuǎn)移指令四類。 通過對字節(jié)當(dāng)中的某一位來進(jìn)行相應(yīng)的操作。2024/3/19嵌入式應(yīng)用基礎(chǔ)13尋址方式

尋址方式:尋找操作數(shù)地址的方式。尋址方式越豐富,CPU的功能就越強(qiáng),靈活性就越大。

MCS-51單片機(jī)的指令系統(tǒng)中,設(shè)有7種尋址方式,在同一條指令中的源、目操作數(shù),可能有不同的尋址方式,下面以源操作數(shù)尋址方式為例來加以闡述。2024/3/19嵌入式應(yīng)用基礎(chǔ)14

立即尋址是指參加運(yùn)算的操作數(shù)已經(jīng)在指令中直接給出,這種形式的操作數(shù)稱為立即數(shù)。立即數(shù)要前綴“#”,以區(qū)別直接地址。 立即尋址一般為雙字節(jié)指令,如第1條指令,操作碼74占一個字節(jié),操作數(shù)30為8位立即數(shù),也占一個字節(jié)。1立即尋址2024/3/19嵌入式應(yīng)用基礎(chǔ)15

設(shè)內(nèi)部RAM中33H單元中內(nèi)容為44H,34H單元中內(nèi)容為0AFH,R0中內(nèi)容為33H,R1中內(nèi)容為00H,給出以下每一條指令執(zhí)行后A中的值。 MOVA,#34H MOVA,34H MOVA,R1(將R1中的內(nèi)容給A,(R1)(A)) MOVA,@R0(間接地址的內(nèi)容給A,((R0

))(A))2024/3/19嵌入式應(yīng)用基礎(chǔ)16

直接尋址是指指令中直接給出操作數(shù)的地址,即給出了參加運(yùn)算或傳送的數(shù)據(jù)在內(nèi)存單元的地址。 直接地址只能用來表示片內(nèi)RAM、位地址空間以及SFR,位地址與SFR只能用直接尋址方式來訪問。尋址范圍:(1)內(nèi)部RAM的128個單元 (2)特殊功能寄存器。除了以單元地址的形式外,還可用寄存器符號的形式給出。例如:

MOVA,80H

與MOVA,P0是等價的。2直接尋址2024/3/19嵌入式應(yīng)用基礎(chǔ)17

第1條指令是雙字節(jié)指令,設(shè)分別放在ROM區(qū)30H和31H中。操作碼E5指示CPU,按照下一字節(jié)單元中內(nèi)容40為地址,把片內(nèi)RAM單元40H中的內(nèi)容送到累加器A中去,即A←(40H),尋址過程如圖4.2(a)。2024/3/19嵌入式應(yīng)用基礎(chǔ)18

第2條指令設(shè)放在ROM區(qū)30H和31H單元中。操作碼A2指示CPU,按照下一字節(jié)中的內(nèi)容40為位地址,把40H位單元中的內(nèi)容送到位累加器CY中,即CY←(40H),位直接尋址過程如圖(b)。2024/3/19嵌入式應(yīng)用基礎(chǔ)19

第3條指令的尋址過程與第1條指令是類似的,是把SFR區(qū)中90H中的內(nèi)容送累加器A,即A←(90H)。

按表2-7可知90H是P1口寄存器的直接地址,而P1是其符號地址,所以第3條指令也可以寫成MOV

A,P1直接尋址,三點(diǎn)注意事項 1.指令含有SFR中的某一個,可用物理地址或者SFR的名稱符號MOVA,SPMOVA,81H2024/3/19嵌入式應(yīng)用基礎(chǔ)20 2.累加器具有A,ACC,E0H三種表示形式,執(zhí)行的效果是一樣的INCAINCACCINC0E0H 3.指令系統(tǒng)中,字節(jié)地址和位地址是有區(qū)別的。MOVA,20HMOVC,20H

第一條指令將20H單元里面的數(shù)值傳給A,第二條將20H位傳送給Cy位。2024/3/19嵌入式應(yīng)用基礎(chǔ)21寄存器尋址

寄存器尋址是指存放操作數(shù)的寄存器直接寫在指令中,寄存器包括選定的R0~R7、A、B、DPTR、CY、SP及其他SFR。MOVA,Rn;Rn→A,n=0~7

工作寄存器R0~R7由指令碼的低3位000~111來編碼,A、B、DPTR以及CY則隱含在指令碼中,因此寄存器尋址也包含一種隱含尋址。2024/3/19嵌入式應(yīng)用基礎(chǔ)22

寄存器尋址舉例,指令碼的二進(jìn)制為11100001,低3位的001正好為R1的編碼,指令的含義是把R1中的內(nèi)容送到累加器A中,即A←R1,尋址過程如圖。2024/3/19嵌入式應(yīng)用基礎(chǔ)23尋址范圍:

(1)4組通用工作寄存區(qū)共32個工作寄存器。

(2)部分特殊功能寄存器,例如A、B以及數(shù)據(jù)指針寄存器DPTR等。例如: 已知R0=70H,R7=25H,DPTR=0300H則MOV A,R0 ;A←R0INC DPTR ;DPTR←DPTR+1ADD R7,#20H ;R7←20H+R72024/3/19嵌入式應(yīng)用基礎(chǔ)24

寄存器間接尋址是指操作數(shù)所指定的寄存器中存放的不是操作數(shù)本身,而是操作數(shù)的地址。用作間址的寄存器為Ri和DPTR,指令助記符中在寄存器名前冠以“@”。

當(dāng)訪問片內(nèi)RAM低128B,或片外RAM低256B時,用8位地址指針Ri,i=0或1

寄存器間接尋址2024/3/19嵌入式應(yīng)用基礎(chǔ)25

這條指令的機(jī)器碼為11100110,最后位的0與1分別用來指定R0和R1,設(shè)R0=40H,(40H)=88H。

1、根據(jù)指令碼的最后一位為0,先去訪問R02、根據(jù)R0中的內(nèi)容,最終把40H單元中的數(shù)88H送到A中去即A←(R0)。2024/3/19嵌入式應(yīng)用基礎(chǔ)26 當(dāng)訪問片外RAM時,用16位地址指針DPTR,舉例:MOVXA,@DPTR。 這條指令的尋址過程同上一條指令類似,指令的執(zhí)行結(jié)果是把DPTR中的內(nèi)容為地址的外部RAM單元中的內(nèi)容送到了累加器A中,即:A←(DPTR)。 注意:不能用寄存器間接尋址來訪問特殊功能寄存器。2024/3/19嵌入式應(yīng)用基礎(chǔ)27

已知R0=40H,內(nèi)RAM(40H)=50H,外RAM(40H)=60H,DPTR=0300H則 MOV A,@R0;A←內(nèi)部RAM(R0) MOVX A,@R0 ;A←外部RAM(R0) MOVX @DPTR,A ;外部RAM(DPTR)←A 設(shè)內(nèi)部RAM30H單元中內(nèi)容為52H,請給出以下程序結(jié)果: MOVA,#30H; MOVA,30H MOVR0,#30H; MOVA,@R0 MOV30H,#30H;2024/3/19嵌入式應(yīng)用基礎(chǔ)28基址寄存器加變址寄存器間接尋址方式--變址尋址

變址尋址是指將基址寄存器與變址寄存器的內(nèi)容相加,把相加結(jié)果作為操作數(shù)的地址。 指令中把DPTR或PC作為基址寄存器,累加器A作為變址寄存器。變址尋址主要用于查表操作。

變址尋址2024/3/19嵌入式應(yīng)用基礎(chǔ)29

對于第1條指令,設(shè)A=30H,DPTR=0100H。 CPU取出指令碼93H后,就會把DPTR中的基本地址0100H與A中的偏移量相加,得到真正的目的地址為0130H;

然后再到0130H單元去訪問,把此單元中的內(nèi)容送到累加器A中。2024/3/19嵌入式應(yīng)用基礎(chǔ)30

對于第2條指令,偏移量還是放在A中,基本地址換為當(dāng)前的PC值。

注意:變址尋址只能在64KB程序存儲器的范圍內(nèi)尋址,但不能對數(shù)據(jù)存儲器進(jìn)行變址尋址。 雖然變址尋址的過程比較復(fù)雜,但變址尋址的指令機(jī)器碼只有一個字節(jié)。2024/3/19嵌入式應(yīng)用基礎(chǔ)31三個特點(diǎn): 1.指令操作碼內(nèi)隱含有作為基地址寄存器用的數(shù)據(jù)指針DPTR或程序寄存器PC,其中DPTR和PC中預(yù)先存放操作數(shù)的基地址。

2.指令操作碼內(nèi)隱含有累加器A,A中預(yù)先放有被尋址操作數(shù)地址對基地址的偏移量,00H-FFH. 3.執(zhí)行過程中,先把基地址(DPTR、PC)和地址偏移量(A)相加,來形成操作數(shù)的物理地址。MOVCA,@A+PC MOVCA,@A+DPTR2024/3/19嵌入式應(yīng)用基礎(chǔ)32

例3.1已知片外ROM的0302H單元中有一個常數(shù)X,現(xiàn)欲把它取到累加器A,編寫程序。基地址:0300偏移量:02HMOVDPTR,#0300HMOVA,#02HMOVC

A,@A+DPTR

例如:指令MOVCA,@A+DPTR

其中A的原有內(nèi)容為05H,DPTR的內(nèi)容為0400H,該指令執(zhí)行的結(jié)果是把程序存儲器0405H單元的內(nèi)容傳送給A。2024/3/19嵌入式應(yīng)用基礎(chǔ)33注意以下幾點(diǎn):

(1)本尋址方式是專門針對程序存儲器的尋址方式,尋址范圍可達(dá)到64KB。

(2)程序執(zhí)行之前要做準(zhǔn)備工作。

(3)本尋址方式的指令只有3條:

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR2024/3/19嵌入式應(yīng)用基礎(chǔ)34相對尋址

MCS-51的轉(zhuǎn)移指令有長轉(zhuǎn)移、短轉(zhuǎn)移和相對轉(zhuǎn)移之分,相對尋址是用在相對轉(zhuǎn)移指令中的。 它將PC的當(dāng)前值與指令操作數(shù)部分所給出的相對偏移量rel相加,其結(jié)果作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址或稱目的地址。2024/3/19嵌入式應(yīng)用基礎(chǔ)35

第1條指令SJMP38H,假設(shè)執(zhí)行相對轉(zhuǎn)移指令之前,PC指向指令的起址0030H,稱其為(或用“$”表示)。

CPU從0030H單元取出指令碼80H后,就會繼續(xù)取出下一字節(jié)中的偏移量06H,這時PC已經(jīng)指向了0032H,稱其為;接著,CPU會將偏移量06H與基址

相加,得到跳轉(zhuǎn)的目的地址為0038H,并跳轉(zhuǎn)到0038H單元去訪問。2024/3/19嵌入式應(yīng)用基礎(chǔ)36

從可看到,在計算目的地址時,人工算法與機(jī)器算法跳轉(zhuǎn)的起點(diǎn)是不一樣的。 CPU是在取出2字節(jié)指令碼后,以為基址跳轉(zhuǎn)到目的地址去的;2024/3/19嵌入式應(yīng)用基礎(chǔ)37

人工是從跳轉(zhuǎn)指令的首址為跳轉(zhuǎn)的起點(diǎn),兩者差了跳轉(zhuǎn)指令本身所占的字節(jié)數(shù)Insbyt。(1)機(jī)器算法=+rel(2)人工算法=+Insbyt(跳轉(zhuǎn)指令字節(jié)數(shù))+rel2024/3/19嵌入式應(yīng)用基礎(chǔ)38

這里要特別指出,對于SJMPREL以一般形式表達(dá)的相對轉(zhuǎn)移指令,對rel的理解在匯編指令和機(jī)器指令中是有很大區(qū)別的。

rel,無論是用16進(jìn)制地址,還是用符號地址,都不是相對偏移量,而是對應(yīng)指令轉(zhuǎn)移的目的地址; 在機(jī)器指令中,rel是相對偏移量,是一個8位的補(bǔ)碼,其值范圍為-128~+127;值是正的,表示向地址增加方向跳轉(zhuǎn),值是負(fù)的,表示向地址減少方向跳轉(zhuǎn)。2024/3/19嵌入式應(yīng)用基礎(chǔ)39

位尋址是指對位尋址空間按位進(jìn)行尋址的操作。 在需要進(jìn)行位處理時,借助于進(jìn)位位CY作為位操作累加器,可對片內(nèi)RAM位尋址區(qū)和11個可位尋址特殊功能寄存器的位尋址單元進(jìn)行操作。位尋址

2024/3/19嵌入式應(yīng)用基礎(chǔ)40

第1條指令MOVC,40H中直接使用位尋址空間中的位地址40H,指令功能是將位尋址空間中位地址為40H中的內(nèi)容送到進(jìn)位標(biāo)志中。位地址也可用符號地址來表示,如RS1、RS0。2024/3/19嵌入式應(yīng)用基礎(chǔ)41

可位尋址的SFR允許采用寄存器名加位數(shù)的形式來表示位地址。如可以分別用PSW.4和PSW.3來表示RS1和RS0,在單燈閃爍程序中用CLRP1.0和SETBP1.0,使P1口的第0位清零和置1的。

特殊功能寄存器中的可尋址位在指令中有4種表示方法: a.直接使用位地址。例如PSW.5的位地址為0D5H。P602024/3/19嵌入式應(yīng)用基礎(chǔ)42

b.位名稱的表示方法。例如:PSW.5是F0標(biāo)志位,可使用F0表示該位。 c.單元地址加位數(shù)的表示方法。例如:(0D0H).5。 d.特殊功能寄存器符號加位數(shù)的表示方法。例如:PSW.5。2024/3/19嵌入式應(yīng)用基礎(chǔ)43

例如:SETB10H;將10H位置1,其中10H是直接使用位地址。MOV22H.0,C;22H.0←進(jìn)位位CP57 (其中22H.0是內(nèi)部RAM22H單元的第0位)ORLC,PSW.0;C←C∨PSW.0ANLC,P;C←C∧P (其中P是PSW的第0位,是位符號地址)2024/3/19嵌入式應(yīng)用基礎(chǔ)44

注意:MCS-51指令系統(tǒng)的各類尋址方式對應(yīng)不同的存儲空間,在不同的存儲區(qū)中應(yīng)采用不同的尋址方式。 例:指出各指令中源、目操作數(shù)的尋址方式。2024/3/19嵌入式應(yīng)用基礎(chǔ)45

使用最頻繁的一類指令,分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、堆棧操作指令和數(shù)據(jù)交換指令四類。格式為:MOV<目的操作數(shù)>,<源操作數(shù)>

MOV<dest>,<src>

屬“復(fù)制”,而不是“搬家”

,源操作數(shù)里面的數(shù)值不發(fā)生改變。3.1.5單片機(jī)指令功能

3.1.5.1數(shù)據(jù)傳送指令2024/3/19嵌入式應(yīng)用基礎(chǔ)46

在29條數(shù)據(jù)傳送類指令中,用到8種助記符MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP,可細(xì)分為片內(nèi)RAM數(shù)據(jù)傳送、訪問程序存儲器與片外RAM、堆棧操作、數(shù)據(jù)交換4類。

數(shù)據(jù)傳送指令執(zhí)行后,除了奇偶標(biāo)志P會受到以累加器A

為目的操作數(shù)指令的影響,其他標(biāo)志均不受到影響。2024/3/19嵌入式應(yīng)用基礎(chǔ)47

片內(nèi)RAM存儲空間,只有256B,僅用8位地址尋址,但卻是數(shù)據(jù)傳送最活躍的區(qū)域,使用的尋址方式也最多。下面以目的操作數(shù)的尋址方式分組介紹。1、內(nèi)部存儲器間傳送(1)以累加器A為目的操作數(shù)指令一、片內(nèi)RAM數(shù)據(jù)傳送指令2024/3/19嵌入式應(yīng)用基礎(chǔ)48

表中指令均是8位數(shù)送A指令,第1組中的機(jī)器碼E8~EF,分別對應(yīng)于源為R0~R7的8條指令。

第3組中的機(jī)器碼E6~E7,分別對應(yīng)于源為@R0~@R1的2條指令。2024/3/19嵌入式應(yīng)用基礎(chǔ)49

第1、3兩組指令的源操作數(shù)分別采用寄存器尋址和寄存器間址,所占字節(jié)數(shù)少,為1個字節(jié)。 第2、4兩組指令的源操作數(shù)分別采用直接尋址和立即尋址,占2個字節(jié)數(shù)。

2024/3/19嵌入式應(yīng)用基礎(chǔ)50(2)以寄存器為目的操作數(shù)指令

以寄存器Rn為目的操作數(shù)的傳送指令和要素如表。 前3組指令均是8位數(shù)送寄存器Rn指令,源只能采用直接尋址和立即尋址,不能采用寄存器尋址和寄存器間址。2024/3/19嵌入式應(yīng)用基礎(chǔ)51

MOVRn,Rn和MOVRn,@Ri形式指令是非法的,工作寄存器間數(shù)據(jù)傳送可通過累加器A為中介來傳送。 最后1條指令是MCS-51指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送指令,指令功能是將16位數(shù)據(jù)傳送給16位寄存器DPTR,作為地址指針。2024/3/19嵌入式應(yīng)用基礎(chǔ)52

例如:MOV

DPTR,#1000H;

功能為DPTR←1000H

相當(dāng)于執(zhí)行兩條8位數(shù)據(jù)傳送指令:MOVDPH,#10H;DPH←10H,數(shù)的高8位送DPH,MOVDPL,#00H;DPL←00H,數(shù)的低8位送DPL。2024/3/19嵌入式應(yīng)用基礎(chǔ)53(3)以直接尋址direct為目的操作數(shù)指令以直接尋址為目的操作數(shù)的傳送指令和要素如下。 指令功能均是8位數(shù)送片內(nèi)RAM低128字節(jié)或SFR直接地址單元。2024/3/19嵌入式應(yīng)用基礎(chǔ)54

指令中的源、目地操作數(shù)dir1和dir2都為直接尋址,這就使得內(nèi)部RAM之間的數(shù)據(jù)傳送,不必通過累加器A為中介來間接傳送,同時也說明訪問SFR僅允許使用直接尋址,例如:MOV30H,31H;機(jī)器碼853130,功能為30H←(31H)MOVPl,B;機(jī)器碼為85F090,功能為P1←B

2024/3/19嵌入式應(yīng)用基礎(chǔ)55(4)以寄存器間址@Ri為目的操作數(shù)指令

指令功能均是把源操作數(shù)指定的內(nèi)容傳送到Ri所指向的片內(nèi)RAM單元中。

Ri不是目的地址,Ri中存放的片內(nèi)RAM單元的地址才是真正目的地址。Ri在機(jī)器碼中是用最后一位來指定,0指定R0,1指定R1。2024/3/19嵌入式應(yīng)用基礎(chǔ)56例閱讀下面匯編源程序,問程序運(yùn)行后:(1)A,B,R0,R1和內(nèi)RAM30H~31H內(nèi)容各為多少?解:程序運(yùn)行后各單元的內(nèi)容為:

ORG0030HSTART:MOV30H, #0AAH MOV31H, #30H MOVR1, #31H MOVR0, 31H MOVB, @R0 MOVA,B

MOV@R1,A MOV

P1,@R1

ENDSTARTA=B=(30H)=(31H)=(P1)=AAH,R0=30H,R1=31H。課堂知識鞏固2024/3/19嵌入式應(yīng)用基礎(chǔ)57 (2) 若R0=50H,R4=38H,內(nèi)RAM(40H)=05H,內(nèi)RAM(50H)=25H,A=12H,則解:程序運(yùn)行后各單元的內(nèi)容為:MOV

50H,#20H;MOV

55H,40H;MOV

5AH,A;MOV

60H,R4; MOV

68H,@R0;(50H)=20H(55H)=05H(5AH)=12H(60H)=38H(68H)=25H

(3)若R0=50H,R1=60H,內(nèi)RAM(38H)=05H,A=10H,則 MOV @R0,#40H MOV @R1,38H MOV @R1,A內(nèi)部數(shù)據(jù)傳送指令的使用1)禁止非法指令:MOVRn,@Ri;MOV#DATA,A2)正確的給程序注釋

Rn、A、B、DPTR等寄存器中的內(nèi)容作為源操作數(shù)的時候不加括號,目標(biāo)操作數(shù)的時候也不加。3)(Ri)--表示操作數(shù)地址在Ri中(DPTR)--表示操作數(shù)在外部的RAM/ROM中,地址放在DPTR中2024/3/19嵌入式應(yīng)用基礎(chǔ)592.訪問片外RAM指令 訪問片外RAM指令有4條,片外RAM單元與累加器A可以互相傳送數(shù)據(jù),都屬于寄存器間接尋址方式。 第1~2兩組指令采用8位地址指針Ri作間址寄存器,8位地址和數(shù)據(jù)均由P0口分時輸出或輸入,可尋址256B,此時,P2口仍可用做通用I/O口。2024/3/19嵌入式應(yīng)用基礎(chǔ)60

在MCS-51指令系統(tǒng)中,沒有專門對外設(shè)的I/O指令,I/O與片外RAM是統(tǒng)一編址的,這4條指令也可以作為I/O指令。例

采用16位地址指針DPTR,把數(shù)存入片外RAM單元1000H中。 ORG0030HSTART:MOVA,#0AAH MOVDPTR,#1000H;先送地址

MOVX@DPTR,A;后存數(shù)

END STARTP93說明

請改用8位地址指針R0,編寫相同功能的程序;ORG0030HSTART:MOVA,#0AAH

MOVP2,#10H ;高8位地址送P2 MOVR0,#00H ;低8位地址送R0

MOVX@R0,A ;存數(shù)

ENDSTART2024/3/19嵌入式應(yīng)用基礎(chǔ)623

.訪問程序存儲器ROM查表指令 指令功能均是讀取程序存儲器指令,屬于變址尋址方式,但兩者的基址寄存器不同,適用范圍也不同。第1條指令以DPTR為基址寄存器,把表頭地址送入DPTR后,就可以用它來方便地查找存放在程序存儲器64KB范圍內(nèi)的遠(yuǎn)程表格數(shù)據(jù)。2024/3/19嵌入式應(yīng)用基礎(chǔ)63

指令MOVCA,@A+PC以PC為基址寄存器,CPU在讀取指令時,PC已經(jīng)加1,作為基址值的已不是,而是。

由于PC值已經(jīng)確定,查表范圍只能由累加器A內(nèi)8位數(shù)值確定,這樣,使用此指令的表格只能存放在以為起始地址的256B范圍內(nèi),稱這為本地表。2024/3/19嵌入式應(yīng)用基礎(chǔ)64例:0~4的平方表首址為SQTB,如圖(a)。下面程序以DPTR為基址指針,設(shè)A=3,用查表法求其平方值。

ORG0030HSTART:MOV

A,#03H;所查數(shù)正好為離表首址偏移量

MOVDPTR,#SQTB

;送平方表首址

MOVCA,@A+DPTR

;查平方表SQTB:DB00H,01H,04H,09H,10H

;建立平方表區(qū)域

END

START2024/3/19嵌入式應(yīng)用基礎(chǔ)65(1)請改用PC為基址指針,編寫相同功能的程序;解:(1)見圖(b),具有相同功能,用PC為基址指針程序如下:

ORG 0030HSTART:MOVA,#03H

;所查數(shù)正好為離表首址偏移量

MOVCA,@A+PC

;查平方表SQTB:DB01H,04H,09H,10H;設(shè)置平方表區(qū)域

END

START2024/3/19嵌入式應(yīng)用基礎(chǔ)66

上面程序中本地表表頭地址SQTB緊跟在查表指令之后,即正好指向SQTB,這時所查數(shù)(A=3)正好為離表首址偏移量; 如果與SQTB之間還隔有其它指令,則需要在查表指令前安排一條加法指令,使累加器A中的值等于所需的地址偏移量。 例:外部ROM從1000H中有一個0-9的平方表。利用查表指令來求X(0-9)的平方值.2024/3/19嵌入式應(yīng)用基礎(chǔ)67

例:外部ROM從1000H中有一個0-9的平方表。利用查表指令來求X(0-9)的平方值.ORG0100H

;程序首地址MOVA,#XMOVDPTR,#1000H

;表格首地址MOVCA,@A+DPTRORG1000HDB0,1,4,9,16,25,36,49,64,81END2024/3/19嵌入式應(yīng)用基礎(chǔ)68(1)字節(jié)交換指令(3條)

前三條指令功能是把累加器A中內(nèi)容與片內(nèi)RAM單元的內(nèi)容進(jìn)行交換,為全字節(jié)交換指令。4.

數(shù)據(jù)交換指令2024/3/19嵌入式應(yīng)用基礎(chǔ)69例如:

A=80H,R7=08H,(40H)=F0HR0=30H,(30H)=OFH執(zhí)行下列指令(順序執(zhí)行):

XCHA,R7;A與R7互換

XCHA,40H;A與40H互換

XCHA,@R0;A與(R0)互換

結(jié)果:A=0FH,R7=80H,(40H)=08H,(30H)=F0H2024/3/19嵌入式應(yīng)用基礎(chǔ)70(2)半子節(jié)數(shù)據(jù)交換指令(2條) XCHDA,@Ri;將A中低4位與用@Ri間址單元的低4位進(jìn)行交換,而各自的高4位保持不變;SWAPA;將累加器A本身中高4位與低4位進(jìn)行交換。例如:R0=60H,(60H)=3EH,A=59H

執(zhí)行完XCHDA,@RO

指令則A=5EH,(60H)=39H。例4.8試用數(shù)據(jù)交換指令編程,將存放在片內(nèi)RAM單元30H中的兩位BCD碼分別轉(zhuǎn)換為ASCII碼,并存入31H和30H單元中,設(shè)(30H)=56H。解:從BCD碼轉(zhuǎn)換成ASCII碼要將此BCD碼加上30H,匯編源程序:

ORG 0030HSTART:MOV30H,#56H MOVA,#30H MOVR0,A XCHDA,@R0 XCH A,@R0;(A)=50H,(30H)=36H

INC R0

MOV31H, #03H

XCHDA,@R0 SWAPA XCH A,31H

;

(A)=00H,(31H)=35H

END

START2024/3/19嵌入式應(yīng)用基礎(chǔ)72

例:若A=30H,R0=40H,R3=50H,(38H)=61H,(40H)=58H,下列指令依次執(zhí)行:XCHA,R3 XCHA,38HXCHA,@R0XCHDA,@R0SWAPA

2024/3/19嵌入式應(yīng)用基礎(chǔ)735.

堆棧操作指令 堆棧操作指令和指令要素,如表所示。2024/3/19嵌入式應(yīng)用基礎(chǔ)74 MCS-51內(nèi)部RAM中可以設(shè)定一個后進(jìn)先出(LIFO-LastInFirstOut)的區(qū)域稱作堆棧.堆棧指針SP指出堆棧的棧頂位置。

堆棧操作總是按照SP所指向的棧頂單元進(jìn)行數(shù)據(jù)的壓入和彈出,棧頂一端會因此長高或壓縮。 堆棧操作對象只能是用直接尋址方式表示的片內(nèi)RAM低128B或SFR的內(nèi)容。

2024/3/19嵌入式應(yīng)用基礎(chǔ)75(1)進(jìn)棧指令PUSHdirect

功能是把direct所確定的片內(nèi)RAM或SFR中內(nèi)容壓入棧頂單元。 執(zhí)行過程是:“先加1,后壓入”,先將棧指針SP←SP+1,然后把direct中的內(nèi)容送到棧指針SP指示的內(nèi)部RAM單元中。2024/3/19嵌入式應(yīng)用基礎(chǔ)76例如:當(dāng)SP=60H,A=30H,B=70H時,執(zhí)行:

PUSHACC

SP+1=61H→SP,A→(61H)

PUSHB ;

SP+1=62H→SP,B→(62H)結(jié)果:(61H)=30H,(62H)=70H,(SP)=62H2024/3/19嵌入式應(yīng)用基礎(chǔ)77(2)出棧指令

POPdirect

指令功能是把棧頂(內(nèi)部RAM單元)內(nèi)容送入direct所確定的片內(nèi)RAM或SFR中。

執(zhí)行過程是:“先彈出,后減1”,即先執(zhí)行數(shù)據(jù)彈出,后執(zhí)行SP←SP-1,使SP指向降低了的棧頂。例如:當(dāng)SP=62H,(62H)=70H,(61H)=30H,

執(zhí)行:POPDPH;(SP)→DPH,SP-1→SP

POPDPL;(SP)→DPL,SP-1→SP結(jié)果:DPTR=7030H,SP=60H

2024/3/19嵌入式應(yīng)用基礎(chǔ)78堆棧操作可用在子程序調(diào)用和返回時的現(xiàn)場保護(hù)和恢復(fù)。 注意PUSH和POP要成對使用,并且后進(jìn)棧的數(shù)據(jù)應(yīng)先彈出。;主程序調(diào)用前PUSH ACC ;保護(hù)現(xiàn)場,先壓入ACCPUSH DPH ;再壓入DPHPUSH DPL ;后壓入DPL…… ;執(zhí)行調(diào)用指令;返回主程序后POP DPL ;恢復(fù)現(xiàn)場,先彈出DPLPOP DPH ;再彈出DPHPOP ACC ;后彈出ACC

2024/3/19嵌入式應(yīng)用基礎(chǔ)79

例4.7下面程序是把片內(nèi)RAM單元30H和31H中的內(nèi)容交換。 (1)改用堆棧為中介,編寫相同功能程序,設(shè)SP為復(fù)位后的值;

ORG0030HSTART:MOV30H,#55H MOV31H,#0AAH

MOVA, 30H MOV30H,31H MOV31H,A ENDSTART2024/3/19嵌入式應(yīng)用基礎(chǔ)80解:(1)具有相同功能,采用堆棧為中介的程序如下:

ORG0030HSTART:MOV30H, #55H MOV31H, #0AAH PUSH30H PUSH31H POP 30H POP 31H END

START2024/3/19嵌入式應(yīng)用基礎(chǔ)81

算術(shù)運(yùn)算指令能對8位無符數(shù)進(jìn)行加、減、乘、除運(yùn)算; 借助溢出標(biāo)志,可對有符數(shù)進(jìn)行補(bǔ)碼運(yùn)算; 借助進(jìn)位標(biāo)志,可進(jìn)行多字節(jié)加、減運(yùn)算; 還可以對壓縮BCD進(jìn)行運(yùn)算。 執(zhí)行的結(jié)果對Cy、Ac、OV

三種標(biāo)志位有影響。但增1和減1指令不影響上述標(biāo)志。

3.1.5.2算術(shù)運(yùn)算指令2024/3/19嵌入式應(yīng)用基礎(chǔ)82

在24條算術(shù)運(yùn)算類指令中,用到8種助記符ADD、ADDC、SUBB、DA、INC、DEC、MUL和DIV。 算術(shù)運(yùn)算指令執(zhí)行后,運(yùn)算結(jié)果保留在累加器A中。加減法指令1.加法指令加法指令和指令要素如表。2024/3/19嵌入式應(yīng)用基礎(chǔ)83

前4條指令是把累加器A中內(nèi)容與源操作數(shù)所指定的內(nèi)容相加,結(jié)果存放在A中,源操作數(shù)可用表中所示的4種尋址方式。2024/3/19嵌入式應(yīng)用基礎(chǔ)84

后4條指令是帶進(jìn)位的加法運(yùn)算功能是除了累加器A中內(nèi)容與源操作數(shù)所指定的內(nèi)容相加外,還要與CY的值相加,結(jié)果存放在A中;帶進(jìn)位的加法指令主要用在多字節(jié)加法運(yùn)算中。ADDC A,Rn ;A+Rn+C→A,n=0~7ADDC A,direct ;A+(direct)+C→AADDCA,@Ri ;A+(Ri)+C→A,i=0,1 ADDCA,#data;A+#data+C→A2024/3/19嵌入式應(yīng)用基礎(chǔ)85

加法運(yùn)算的結(jié)果將影響CY、OV、AC和P。 (1)對于有符數(shù)加法,若OV=1,表示運(yùn)算產(chǎn)生了溢出(-128~+127),是錯誤的;否則,OV=0表示結(jié)果正確。判斷溢出方法OV=CY⊕CY’。 實際意義是:兩負(fù)數(shù)相加,和為正數(shù),產(chǎn)生了負(fù)溢出;兩正數(shù)相加,和為負(fù)數(shù),產(chǎn)生了正溢出。 (2)無符數(shù)加法,若A中位7有進(jìn)位,則進(jìn)位位CY=1,表示運(yùn)算結(jié)果大于255,否則,CY=0。2024/3/19嵌入式應(yīng)用基礎(chǔ)86注意,溢出標(biāo)志OV對判斷無符數(shù)溢出是沒有意義的。 將兩數(shù)看作有符數(shù),還是無符數(shù),完全是由編程者事先設(shè)定的。(3)如果位3有進(jìn)位,則半進(jìn)位位AC=1,否則AC=0。(4)若A中結(jié)果有奇數(shù)個1,則P=1,否則P=0。2024/3/19嵌入式應(yīng)用基礎(chǔ)872.減法指令

4條指令功能是把累加器A中內(nèi)容減去源操作數(shù)所指定的內(nèi)容并減去進(jìn)位位CY的值,結(jié)果存放在A中。 MCS-51中沒有不帶借位的減法指令,所以在需要時,必須先將CY清0。 減法運(yùn)算的結(jié)果也將影響CY、OV、AC和P等標(biāo)志,除了CY定義為位7的借位外,標(biāo)志位的判斷同加法指令一樣。其中OV和CY也分別用于兩有符數(shù)和無符數(shù)之差:

(1)兩有符數(shù)相減,若OV=0,表示運(yùn)算正確;若OV=1,表運(yùn)算結(jié)果產(chǎn)生了溢出,結(jié)果是錯誤的。(2)兩無符數(shù)相減,CY=0,表示“大減小,無借位”,結(jié)果,正確;若CY=1,表示“小減大,有借位”,將A中值連同借位一并考慮才正確。

2024/3/19MCS-51單片機(jī)原理與應(yīng)用89

3.加1、減1指令前4條指令功能是源操作數(shù)所指定的單元內(nèi)容按8位有符數(shù)加1,源操作數(shù)可用表中所示的4種尋址方式。第5條指令功能是用于對地址指針DPTR中內(nèi)容加1,是MCS-51中唯一的一條16位加1指令。2024/3/19嵌入式應(yīng)用基礎(chǔ)90

指令功能是源操作數(shù)所指定的單元內(nèi)容按8位有符數(shù)減1,源操作數(shù)可用表中所示的4種尋址方式。例

A=0FH,R7=19H,(30H)=00H,R1=40H,(40H)=0FFH,執(zhí)行指令

DEC A ;A-1→A DEC R7 ;R7-1→R7 DEC 30H ;(30H)-1→30H DEC @R1 ;(R1)-1→(R1)結(jié)果為

A=0EH,R7=18H,(30H)=0FFH,(40H)=0FEH加1、減1指令主要用于修改計數(shù)器的內(nèi)容及修改地址指針,以便與寄存器間址指令配合使用。2024/3/19嵌入式應(yīng)用基礎(chǔ)92

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

十進(jìn)制調(diào)整指令又稱BCD碼調(diào)整指令,指令功能是對A中的壓縮BCD碼的加法結(jié)果進(jìn)行十進(jìn)制調(diào)整。 所謂壓縮BCD碼,是指在一個字節(jié)中存放兩位BCD碼。 累加器A進(jìn)行二一十進(jìn)制調(diào)整的條件,也可以用CY和AC標(biāo)志來表示:(1)若AC=1或低4位AL>9,則A←A+06H;(2)若CY=1或高4位AH>9,A←A+60H。 十進(jìn)制調(diào)整指令只影響CY。BCD碼相加后,若CY=1,表示BCD碼和已大于或等于十進(jìn)制數(shù)100。注意:(1)DAA指令必須跟在ADD或ADDC指令后,對BCD碼和進(jìn)行二-十進(jìn)制調(diào)整,但不能把A中的二進(jìn)制數(shù)按4位一組轉(zhuǎn)換成BCD碼。(2)DAA指令不能用于十進(jìn)制減法調(diào)整。為了使兩個BCD數(shù)相減結(jié)果也是BCD數(shù),可用補(bǔ)碼運(yùn)算來化減為加,然后進(jìn)行BCD調(diào)整。2024/3/19嵌入式應(yīng)用基礎(chǔ)94

5.乘除法指令及其指令要素如表。

乘除法指令2024/3/19嵌入式應(yīng)用基礎(chǔ)95 第1條指令是把累加器A和寄存器B中兩個8位無符整數(shù)相乘,并把積的低8位存放到累加器A中,高8位存放到寄存器B中,指令執(zhí)行后將影響OV、CY和P標(biāo)志. 若乘積大于255,即B≠0,則OV=1,否則OV=0;CY總為0;P標(biāo)志由A中1的個數(shù)的奇偶性確定。2024/3/19嵌入式應(yīng)用基礎(chǔ)96 DIVAB指令功能是把A和B中兩個8位無符整數(shù)相除,并把商的整數(shù)部分存放到A中,余數(shù)存放到B中。 指令執(zhí)行后將影響OV、CY和P標(biāo)志,對CY和P標(biāo)志影響同乘法指令。當(dāng)B=0時,則OV=1,表示除法無意義,否則OV=0。2024/3/19嵌入式應(yīng)用基礎(chǔ)97

邏輯運(yùn)算指令都是字節(jié)操作指令,不是以累加器A為目的寄存器的指令不影響PSW中的標(biāo)志位。3.1.5.3邏輯運(yùn)算指令2024/3/19嵌入式應(yīng)用基礎(chǔ)981、邏輯與指令

ANL A,Rn;A∧Rn→A,n=0~7 ANL A,direct;A∧(direct)→A ANL A,#data;A∧#data→AANL A,@Ri;A∧(Ri)→A,i=0~1 功能是把累加器A中內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯與操作,結(jié)果存放在A中,源操作數(shù)可用表中所示的4種尋址方式。 例A=07H,R0=0FDH,執(zhí)行指令:ANLA,R0

結(jié)果:A=05H2024/3/19嵌入式應(yīng)用基礎(chǔ)99ANLdirect,A;(direct)∧A→(direct)ANL direct,#data;(direct)∧#data→(direct)

使某些位屏蔽:與0相與;使某些位不變:與1相與。

2024/3/19嵌入式應(yīng)用基礎(chǔ)1002.邏輯或指令

前4條指令功能是把A中內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯或操作。2024/3/19嵌入式應(yīng)用基礎(chǔ)101ORLdirect,A

;(direct)∨A→directORLdirect,#data;(direct)∨#data→direct 指令是把dir指定內(nèi)部RAM單元的內(nèi)容與累加器內(nèi)容或立即數(shù)進(jìn)行按位邏輯或操作,結(jié)果存放在dir指定內(nèi)部RAM單元。使某些位置1:與1相或;使某些位不變:與0相或。作用:可以使信號合并。2024/3/19嵌入式應(yīng)用基礎(chǔ)102例P1=05H,A=33H,執(zhí)行指令ORLP1,A

結(jié)果:P1=37H 例試編程,將存放在片內(nèi)RAM單元31H和30H單元中的ASCII碼轉(zhuǎn)換為壓縮BCD碼,并存入30H中。 解:本例的算法是:用與指令將這兩個單元的高4位屏蔽掉,得到相應(yīng)的BCD碼;用或指令將兩個BCD碼合并在一個字節(jié)中。2024/3/19嵌入式應(yīng)用基礎(chǔ)103

ORG0030HSTART:MOV31H,#35H

MOV30H,#36H

ANL31H,#0FH

ANL30H,#0FH

MOVA,31H

SWAPA

ORL30H,A

ENDSTART2024/3/19嵌入式應(yīng)用基礎(chǔ)1043.邏輯異或指令 前4條指令功能是把A中內(nèi)容與源操作數(shù)所指定的內(nèi)容進(jìn)行按位邏輯異或操作。2024/3/19嵌入式應(yīng)用基礎(chǔ)105XRLdirect,A

;(direct)⊕A→directXRLdirect,#data

;(direct)⊕#data→direct

使某些位不變:與0相異或; 使某些位取反:與1相異或。如使Pl口的最高位取反,其余位不變:XRL

Pl,#80H。例A=90H,R3=73H執(zhí)行指令:XRLA,R3結(jié)果:A=E3H2024/3/19嵌入式應(yīng)用基礎(chǔ)106 兩數(shù)異或,相同出0,異或指令常用來判斷兩數(shù)是否相等。如判A中值是否為

0DH,來決定跳轉(zhuǎn):XRL

A,#0DH JZ

LOOP4.累加器A清0、取反指令 第1條指令功能是A清0,第2條指令功能是A取反,操作結(jié)果均影響P標(biāo)志。均為單字節(jié)單周期指令,對A專用指令速度最快。2024/3/19嵌入式應(yīng)用基礎(chǔ)107 例已知[x]補(bǔ)=E3H(-29的補(bǔ)碼),試編程,求[-x]補(bǔ),要求在KeilμVision3上運(yùn)行驗證。 解:本例的算法是按照求補(bǔ)方法:連同符號位一起“求反加一”,注意與求補(bǔ)碼的區(qū)別,按此算法的匯編源程序如下:

ORG0030HSTART:MOVA,#0E3H CPL

A INCA

END

START2024/3/19嵌入式應(yīng)用基礎(chǔ)108移位指令

移位指令均是針對A的單操作數(shù)、單字節(jié)和單周期指令。除帶進(jìn)位位循環(huán)移位指令影響CY和P標(biāo)志外,其它指令均不影響標(biāo)志位。1、左環(huán)移指令 RLA

循環(huán)左移指令,其功能是把A中內(nèi)容由低位向高位移動一位,最后移出的那一位將進(jìn)入A0位。2024/3/19嵌入式應(yīng)用基礎(chǔ)1092、帶進(jìn)位左環(huán)移指令RLCA

功能:將累加器A的內(nèi)容和進(jìn)位標(biāo)志位Cy一起向左環(huán)移一位,Acc.7移入進(jìn)位位Cy,Cy移入Acc.0。3、右環(huán)移指令 RRA

功能:是累加器A的內(nèi)容向右環(huán)移一位,Acc.0移入Acc.7,不影響其它標(biāo)志。2024/3/19嵌入式應(yīng)用基礎(chǔ)1104、帶進(jìn)位右環(huán)移指令RRCA

功能:累加器A的內(nèi)容和進(jìn)位標(biāo)志Cy一起向右環(huán)移一位,Acc.0進(jìn)入Cy,Cy移入Acc.7。

移位指令常用于乘2和除2運(yùn)算,對A中8位無符數(shù)實現(xiàn)乘2運(yùn)算指令:ADD

A,#0 ;A值不變,CY清0RLCA ;A值乘2,若把此指令改為RRCA,可對A中8位無符數(shù)實現(xiàn)除2運(yùn)算。以CY為“紐帶”,兩次使用循環(huán)移位指令,實現(xiàn)16位數(shù)移位。2024/3/19嵌入式應(yīng)用基礎(chǔ)111 控制轉(zhuǎn)移指令,又稱跳轉(zhuǎn)指令,通過改變PC的指向來改變程序執(zhí)行的流向,可分為無條件轉(zhuǎn)移、條件轉(zhuǎn)移、子程序調(diào)用和返回等。 在16條控制轉(zhuǎn)移類指令中,用到12種助記符LJMP、AJMP、SJMP、JMP、ACALL、LCALL、RET、RETI、JZ、JNZ、CJNE和DJNZ。 如果加上空操作指令,控制轉(zhuǎn)移類指令共有指令17條。6控制轉(zhuǎn)移指令2024/3/19嵌入式應(yīng)用基礎(chǔ)112無條件轉(zhuǎn)移指令 無條件轉(zhuǎn)移指令有長轉(zhuǎn)移LJMP、絕對轉(zhuǎn)移AJMP、相對轉(zhuǎn)移SJMP和變址轉(zhuǎn)移JMP;無條件轉(zhuǎn)移指令均不影響標(biāo)志位。 第1條長轉(zhuǎn)移指令LJMP

addrl6,為三字節(jié)雙周期指令。 指令的功能是將addrl6送入程序計數(shù)器PC,使程序無條件轉(zhuǎn)移到PC所指向的目的地址去執(zhí)行,轉(zhuǎn)移范圍可達(dá)64KB。2024/3/19嵌入式應(yīng)用基礎(chǔ)113 第2條絕對轉(zhuǎn)移指令A(yù)JMP

addrl1,為雙字節(jié)雙周期指令,在機(jī)器碼中提供11位地址addrl1,addrl1由第一字節(jié)高3位a10~8和第二字節(jié)8位a7~0構(gòu)成。

指令的功能是將addrl1送入程序計數(shù)器PC,取代低11位的PC10~0,與PC高5位PC15~11一起構(gòu)成16位目的地址,使程序無條件轉(zhuǎn)移到PC所指向的目的地址去執(zhí)行。 2024/3/19嵌入式應(yīng)用基礎(chǔ)114

絕對轉(zhuǎn)移又稱為短轉(zhuǎn)移,轉(zhuǎn)移范圍只有2KB,即轉(zhuǎn)移目的地址與AJMP下一條指令的第一字節(jié)同在一個2KB范圍內(nèi)。 本指令是為能與MCS-48的JMP指令兼容而設(shè)的。 第3條相對轉(zhuǎn)移指令SJMP

rel,為雙字節(jié)雙周期指令,其操作碼為80,后跟1字節(jié)的相對偏移量rel,rel為8位補(bǔ)碼。2024/3/19嵌入式應(yīng)用基礎(chǔ)115 指令功能:將

與相對偏移量rel相加,其結(jié)果作為轉(zhuǎn)移的目的地址,使程序無條件轉(zhuǎn)移到所指向的目的地址去執(zhí)行。 轉(zhuǎn)移范圍只允許在該指令下一條指令地址的-128~+127

字節(jié)的空間范圍內(nèi)。 第4條變址轉(zhuǎn)移指令JMP@A+DPTR,A及DPTR的內(nèi)容均為無符數(shù)。指令的功能是將DPTR中的基址與A中的偏移量相加,形成目的地址送入程序計數(shù)器PC,實現(xiàn)程序的分支轉(zhuǎn)移,又叫散轉(zhuǎn)。2024/3/19嵌入式應(yīng)用基礎(chǔ)116

例設(shè)累加器A中的命令鍵的鍵值為0~2,命令鍵操作程序入口跳轉(zhuǎn)表首址為CTAB,試編程:根據(jù)A中的鍵值按跳轉(zhuǎn)表散轉(zhuǎn)。 解:算法:先將A中鍵值乘2(因為跳轉(zhuǎn)表中的AJMP指令是雙字節(jié)的),然后按散轉(zhuǎn)指令散轉(zhuǎn)。匯編源程序如下:

ORG

0030HSTART:CLRC RLC A 2024/3/19嵌入式應(yīng)用基礎(chǔ)117MOVDPTR,#CTABJMP@A+DPTRCTAB:AJMPC0 AJMP C1 AJMP C2 ENDSTART

2024/3/19嵌入式應(yīng)用基礎(chǔ)118 條件轉(zhuǎn)移指令可分為A判零轉(zhuǎn)移,比較不等轉(zhuǎn)移和減1非零轉(zhuǎn)移,這些指令均屬相對轉(zhuǎn)移指令。 1.累加器A判零轉(zhuǎn)移指令

指令都是以A是否為零作為轉(zhuǎn)移條件,為雙字節(jié)雙周期的指令,第二個字節(jié)是相對轉(zhuǎn)移的偏移量。第1條指令,若A=0,則程序作相對轉(zhuǎn)移;否則順序執(zhí)行2024/3/19嵌入式應(yīng)用基礎(chǔ)119 第2條指令,若A≠0,則程序作相對轉(zhuǎn)移;否則順序執(zhí)行均不影響標(biāo)志位。

2.比較不等轉(zhuǎn)移指令

比較不等轉(zhuǎn)移指令是僅有的3操作數(shù)指令,指令均為3字節(jié)雙周期的相對轉(zhuǎn)移指令,第1字節(jié)是操作碼并隱含了一個操作數(shù),第2個字節(jié)是第2個操作數(shù),第3個字節(jié)是相對偏移量。2024/3/19嵌入式應(yīng)用基礎(chǔ)120

指令的功能是先對指令給定的前兩個操作數(shù)進(jìn)行比較,若不相等,則相對轉(zhuǎn)移,否則順序執(zhí)行。2024/3/19嵌入式應(yīng)用基礎(chǔ)121

指令執(zhí)行后,將影響CY標(biāo)志,進(jìn)而能提供被比較兩數(shù)的大小。 若CY=1,說明被比較兩數(shù)是小減大,有借位;否則CY=0,沒有借位。

比較不等轉(zhuǎn)移指令常用來比較兩個無符號數(shù)的大小,用來控制循環(huán)結(jié)束條件。2024/3/19嵌入式應(yīng)用基礎(chǔ)1223.減1非零轉(zhuǎn)移指令 減1非零轉(zhuǎn)移指令和指令要素如表。 第1條指令功能是先對工作寄存器Rn內(nèi)容減1,若結(jié)果不等于0,則相對轉(zhuǎn)移,否則順序執(zhí)行。 第2條指令的功能則是先對片內(nèi)RAM或SFR內(nèi)容減1,若結(jié)果不等于0,則相對轉(zhuǎn)移,否則順序執(zhí)行。2024/3/19嵌入式應(yīng)用基礎(chǔ)123 指令執(zhí)行后,不影響PSW各標(biāo)志位。 DJNZ指令常用于循環(huán)程序中控制循環(huán)次數(shù),指令指定的Rn或direct單元作為循環(huán)的減1計數(shù)器,當(dāng)此計數(shù)器的值減為0時,循環(huán)就停止。2024/3/19嵌入式應(yīng)用基礎(chǔ)124 例

下面程序?qū)⒂嬎?+2+3+…10的和。試編程,改用DJNZ指令來判斷循環(huán)結(jié)束條件。

ORG 0030HSTART:CLR A MOVR0,#0AH LOOP:ADDA,R0 DEC R0 CJNER0,#00H,LOOP MOV30H,A

ENDSTART 解:DJNZR0,LOOP等價于:DECR0;CJNER0,#00H,LOOP。只要在上述程序中替換即可。得到與原程序相同的結(jié)果A=37H(55D)。2024/3/19嵌入式應(yīng)用基礎(chǔ)125

常用的相對獨(dú)立的功能模塊程序定義為子程序,以供主程序調(diào)用。 主程序中可以通過調(diào)用指令調(diào)用子程序;子程序執(zhí)行完后,通過RET返回主程序。子程序調(diào)用和返回指令2024/3/19嵌入式應(yīng)用基礎(chǔ)126

在主程序調(diào)用子程序1時,又發(fā)生了子程序1對另一個子程序2的調(diào)用,稱為子程序的嵌套。2024/3/19嵌入式應(yīng)用基礎(chǔ)1271.子程序調(diào)用指令子程序調(diào)用指令和指令要素如表。 第1條長調(diào)用指令LCALL

addrl6,為三字節(jié)雙周期指令,其操作碼為12,后跟兩字節(jié)的16位地址addrl6。2024/3/19嵌入式應(yīng)用基礎(chǔ)128指令功能: (1)指向斷點(diǎn),執(zhí)行PC←PC+3,使PC指向被稱為斷點(diǎn)的下一條指令地址; (2)保護(hù)斷點(diǎn),即先后將PCL和PCH壓入堆棧,棧指針SP加2指向新的棧頂; (3)轉(zhuǎn)子,將16位目的地址addr16送入程序計數(shù)器PC,使程序無條件轉(zhuǎn)向子程序入口地址addr16,執(zhí)行被調(diào)用的子程序。長調(diào)用指令可調(diào)用在64KB范圍內(nèi)的子程序。2024/3/19嵌入式應(yīng)用基礎(chǔ)129 第2條絕對調(diào)用指令A(yù)CALL

addrl1,為雙字節(jié)雙周期指令,在機(jī)器碼中提供11位地址addrl1,addrl1由第一字節(jié)高3位a10~8和第二字節(jié)8位a7~0構(gòu)成。指令功能: (1)指向斷點(diǎn),執(zhí)行PC←PC+2,使指向斷點(diǎn)地址,即ACALL下一條指令的第一字節(jié)單元的地址; (2)保護(hù)斷點(diǎn),即先后將PCL和PCH壓入堆棧,棧指針SP加2指向新的棧頂;2024/3/19嵌入式應(yīng)用基礎(chǔ)130 (3)轉(zhuǎn)子,將11位目的地址addr11送入PC,取代低11位的PC10~0,與高5位PC15~11一起構(gòu)成16位目的地址,使程序無條件轉(zhuǎn)向子程序入口地址去執(zhí)行。

絕對調(diào)用指令只修改了PC的低11位地址,高5位PC15~11仍由決定,所以調(diào)用子程序范圍只有2KB,又稱為短調(diào)用。2024/3/19嵌入式應(yīng)用基礎(chǔ)131

ACALL指令把整個64KB程序存儲空間劃分成32個區(qū),每個區(qū)為2KB,由高5位決定區(qū)號,區(qū)號范圍為0~31(0~1FH)。

與AJMP指令相類似,是為了與MCS-48中的CALL指令兼容而設(shè)的 2024/3/19嵌入式應(yīng)用基礎(chǔ)1322.返回指令 第1條子程序返回指令RET,為單字節(jié)雙周期指令,其操作碼為22。

功能是:恢復(fù)斷點(diǎn),將堆棧棧頂起兩個單元中的斷點(diǎn)分別彈出至PCH和PCL,同時堆棧指針減2。程序?qū)⒎祷氐綌帱c(diǎn)處繼續(xù)執(zhí)行。2024/3/19嵌入式

溫馨提示

  • 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

提交評論