單片機(jī)匯編語言指令教程匯集.ppt_第1頁
單片機(jī)匯編語言指令教程匯集.ppt_第2頁
單片機(jī)匯編語言指令教程匯集.ppt_第3頁
單片機(jī)匯編語言指令教程匯集.ppt_第4頁
單片機(jī)匯編語言指令教程匯集.ppt_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二章:MCS-51單片機(jī)指令系統(tǒng),2.1 概述,2.2 尋址方式,2.3 數(shù)據(jù)傳送指令,2.4 算邏運(yùn)算和移位指令,2.5 控制轉(zhuǎn)移和位操作指令,2.1:MCS-51指令系統(tǒng)的概述,MCS-51共有111條指令,指令的長度和執(zhí)行時(shí)間因不同的指令而各不相同。 2.1.1 指令格式 2.1.2 指令的三種表示形式 2.1.3 指令的字節(jié)數(shù) 2.1.4 指令的分類,繼續(xù),2.1.1 指令格式,指令格式:既指令的結(jié)構(gòu)形式,操作碼,操作數(shù)或操作數(shù)地址,由操作碼和操作數(shù)(或操作數(shù)地址)構(gòu)成指令的結(jié)構(gòu),舉例:MOV A,#0FFH ADD A,R0,返回,指令的表示形式是識別指令的標(biāo)志。 1,二進(jìn)制的表示

2、形式:(以“累加器的內(nèi)容+08H”為例) 00100100B 操作碼 OP (加法) 00001000B 操作數(shù)DATA(08H) 特點(diǎn): 能被CPU直接識別、運(yùn)行的形式。也稱機(jī)器碼、匯編語 言的目標(biāo)代碼。 缺點(diǎn):不便于閱讀、記憶和調(diào)試修改,2.1.2 指令的三種表示形式,2,十六進(jìn)制表示方式: 它是對二進(jìn)制形式的一種簡化。 00100100B 24H 00001000B 08H 在實(shí)驗(yàn)室等少數(shù)環(huán)境下,可以將這種形式作為輸入程序的一種輔助手段。但是,這種形式的指令格式必須由對應(yīng)的監(jiān)控程序把它們翻譯成二進(jìn)制的“機(jī)器碼”后存入程序存儲器并運(yùn)行,二進(jìn)制表示的形式 十六進(jìn)制表示的形式,3,指令的“助記

3、符”方式(也稱“匯編格式”): 00100100B 24H 00001000B 08H ADD A,#08H 1,這是一種由英文單詞或字母、數(shù)字來表征指令功能的 形式。是一種便于閱讀、書寫和交流的表示形式。 2,這種 “匯編”格式的指令必須把它“翻譯”為二進(jìn)制形式 “機(jī)器碼”后才能為CPU所識別和執(zhí)行。 3,三種不同的表示方法適用于不同的場合。 本章內(nèi)容都以匯編的形式介紹指令系統(tǒng),二進(jìn)制表示形式 十六進(jìn)制表示 匯編格式,返回,2.1.3 指令的字節(jié)數(shù),在MCS-51單片機(jī)的指令系統(tǒng)中,因指令操作碼和操作數(shù)的不同,指令(在存儲器中)長度也各不相同。 分為單字節(jié)、雙字節(jié)和三字節(jié)。 單字節(jié)指令(49

4、條):分無操作數(shù)、有操作數(shù)兩種。 無操作數(shù):如 INC DPTR 10100011B INC A 00000100B 【特點(diǎn)】:操作數(shù)隱含在操作碼中。 含有操作數(shù)寄存器名稱的單字節(jié)指令: 如:MOV A,R0 11101000B MOV A,R1 11101001B 【特點(diǎn)】:寄存器名以三位數(shù)代碼的形式在指令的后三位,雙字節(jié)指令(46條): 指令的操作碼和操作數(shù)各占一個字節(jié)。 如: MOV A,#data 01110100B data 很明顯:8位的操作數(shù)本身占據(jù)一個字節(jié),n,n+1,mov a,#data,雙字節(jié)指令在程序存儲器的存放示意圖,三字節(jié)指令(16條): 指令中的操作數(shù)為雙字節(jié)。如

5、: MOV DPTR,#data16 1001000B,data15-8,data7-0 或者:指令中分別包含1個字節(jié)的操作數(shù)和1個字節(jié)的操作數(shù)地址。如: MOV direct,#data 舉例:MOV 20H,#0FFH,MOV dptr,#data16,MOV direct,#data,三字節(jié)指令在存儲器中存放的方式示意圖,指令的字節(jié)數(shù)與指令的運(yùn)行時(shí)間,指令的字節(jié)多是否意味著指令周期就長,從表中可見,指令的字節(jié)數(shù)與指令周期不是對等的關(guān)系,返回,2.1.4 指令的分類,MCS-51單片機(jī)的指令如果按功能劃分可以分為五類: 1,數(shù)據(jù)傳送類指令:完成數(shù)據(jù)在單片機(jī)內(nèi)部之間的傳送。 分為8位數(shù)和16

6、位兩種。除了奇偶位外,指令的執(zhí)行對 PSW無影響。 2,算術(shù)運(yùn)算指令:用于操作數(shù)之間的加、減、乘除運(yùn)算。 【特點(diǎn)】:多數(shù)情況下:操作數(shù)之一在累加器A中,結(jié)果也保留在A中,運(yùn)算結(jié)果要影響PSW(進(jìn)位標(biāo)志、奇偶和溢出標(biāo)志等)。 3,邏輯操作和循環(huán)移位指令:操作數(shù)之間的邏輯加、邏輯與、取反和異或等操作。多數(shù)情況下一個操作數(shù)在A中,結(jié)果也存于A。移位指令分為左移、右移和帶進(jìn)位和不帶進(jìn)位幾種情況。與算術(shù)類指令相比邏輯類指令基本不影響PSW的內(nèi)容,4,控制轉(zhuǎn)移類指令:條件轉(zhuǎn)移、無條件轉(zhuǎn)移,調(diào)用和返回。 【 特點(diǎn)】:通過修改程序指針PC的內(nèi)容,使CPU轉(zhuǎn)到另一處執(zhí)行,從而改變程序的流向。 5,位操作指令:位

7、傳送、位置位、位運(yùn)算和位控制轉(zhuǎn)移等操作。 【 特點(diǎn)】:按位操作而不是按字節(jié)的操作。位控轉(zhuǎn)移的判斷不是檢測某一個字節(jié)而是對某一個位進(jìn)行檢測并決定是否進(jìn)行程序轉(zhuǎn)移。 這類指令基本不影響PSW的內(nèi)容,返回,2.2 尋址方式,在指令的操作數(shù)位置上,用于表征、尋找操作數(shù)的方式定義為“尋址方式”。 正確的理解、掌握尋址方式,是學(xué)習(xí)、使用指令的關(guān)鍵。 在MCS-51單片機(jī)中,共使用了七種尋址方式。 它們分別是: 1,寄存器尋址 5,變址尋址; 2,直接尋址 6,相對尋址; 3,立即數(shù)尋址 7,位尋址。 4,寄存器間接尋址,繼續(xù),2.2.1寄存器尋址,當(dāng)所需要的操作數(shù)在內(nèi)部某一個寄存器Rn中時(shí),將此寄存器名R

8、n直接寫在指令的操作數(shù)的位置上。如: MOV A,R7 ;將寄存器R7中的內(nèi)容送累加器A中。 MOV 20H,R0 ;將寄存器R0中的數(shù)據(jù)送內(nèi)存20H單元 INC R1 ;將寄存器R1中的內(nèi)容加一 ADD A,R3 ;A的內(nèi)容與寄存器R3的內(nèi)容相加送A 寄存器尋址方式的指令大多是單字節(jié)指令。指令本身并不帶有操數(shù),而是含有存放操作數(shù)的寄存器的3位代碼。以MOV A,Rn為例,使用R7寄存器,所以rrr=111,既指令的機(jī)器碼為:0EFH,1 1 1 0 1 r r r,操作碼,寄存器代碼,返回,E8HEFH,MOV A,Rn,2.2.2 直接尋址,指令本身含有操作數(shù)的8位或16位地址。既指令直接

9、給出了操作數(shù)的地址。如: MOV A,30H ;將RAM30H單元內(nèi)容送累加器 這里30H是操作數(shù)在RAM中的地址。 很明顯,直接尋址的指令長度是兩個或三個字節(jié),n,n+1,30H,累加器A,直接尋址示意圖,使用直接尋址應(yīng)注意的三個問題,1,指令助記符中direct是用16進(jìn)制數(shù)表示的操作數(shù)地址。 當(dāng)?shù)刂非『迷赟FR區(qū)域時(shí),指令也可以用寄存器名來表示。 如: MOV A,80H 可以寫成 MOV A,P0 后者用SFR中寄存器的名字取代它的物理地址80H。很明顯,后者更容易閱讀和交流,所以我們提倡使用SFR中寄存器名稱來代替直接地址。 如:MOV A,SBUF ;串口數(shù)據(jù)緩沖器數(shù)據(jù)送A MOV

10、 IE,#00H ;初始化中斷允許寄存器 MOV TH1,#0FEH ;為定時(shí)器1賦初值 盡管使用SFR的寄存器名稱來取代直接地址,可以帶來程序的可讀性,但是在匯編時(shí),仍要將寄存器名字轉(zhuǎn)換為直接地址,2,當(dāng)直接地址時(shí)在工作寄存器區(qū)中時(shí),可以使用兩種尋址方式來訪問。 如: MOV A,00H ;將RAM中00H單元數(shù)據(jù)送累加器A MOV A,R0 ;將工作寄存器R0的內(nèi)容送累加器A 這里使用了不同的尋址方式,其指令的結(jié)構(gòu)也不相同。 前者是:11100101(0E5H)、00000000(00H) 雙字節(jié)。 后者的機(jī)器碼是:11101000(0E8H) 單字節(jié); 在物理結(jié)構(gòu)上,R0與RAM的00H

11、單元恰好是同一單元,所以不同的指令而執(zhí)行結(jié)果是一樣的。 類似的還有累加器A: INC A 寄存器尋址方式(單字節(jié)); INC ACC 直接尋址方式(雙字節(jié)); INC 0E0H 直接尋址方式(雙字節(jié),3,在指令系統(tǒng)中:字節(jié)地址與位地址是完全不同的概念。 前者用direct表示,而后者用bit 表示,但在指令中都是用16進(jìn)制表示的數(shù)。 如: MOV A,20H ;將RAM的20H單元內(nèi)容送A MOV C,20H ;將位尋址區(qū)中的位地址為20H位內(nèi)容送 PSW 中的Cy中,片內(nèi) RAM(20H-2FH)中的位尋址區(qū)結(jié)構(gòu)圖,2FH,20H,字節(jié)地址,返回,24H,位地址,返回前一次,2.2.3立即尋

12、址,指令本身直接含有所需要的8位或16位的操作數(shù)。 將此數(shù)稱為“立即數(shù)”(使用#標(biāo)明)。如: MOV A,#30H ;將(8位)立即數(shù)送累加器A MOV DPTR,#2000H ;16位立即數(shù)送DPTR積存器 【注意】:MOV A,#30H MOV A,30H 兩者的區(qū)別。 立即數(shù)尋址的指令長度為2或3個字節(jié),n,n+1,ROM,累加器A,MOV A,#30H 指令執(zhí)行流程,ROM,DPTR,MOV DPTR,#2000H指令的存儲和執(zhí)行,返回,2.2.4 寄存器間接尋址,指令中含有保存操作數(shù)地址的寄存器Ri。 MOV A,Ri ( i=0、1) CPU首先根據(jù)指令中寄存器名Ri找到操作數(shù)地址

13、,然后再從該地址中找到操作數(shù) x。 如:MOV R0,#30H ;立即數(shù)送R0寄存器 MOV A,R0 ;從RAM的H單元取數(shù)送累加器A 【注意】MOV A,R0 和 MOV A,R0 指令的區(qū)別,30H,R0,00H,累加器A,1,2,3,使用寄存器間址指令時(shí)應(yīng)注意的三個問題,1,間址寄存器Ri只能使用R0、R1寄存器(i=0、1)。 2,間址方式不僅用于片內(nèi)RAM,同樣也適用于片外RAM。 對于片內(nèi)RAM使用Ri寄存器,尋址范圍為00HFFH。 對于片外RAM,可以使用Ri,也可以使用DPTR做間址寄存器。兩者區(qū)別在于后者尋址范圍為0000HFFFFH,兩者都可以RAM和ROM。 3,間址

14、方式的指令不能訪問SFR中的單元。如下面的程序是錯誤的: MOV R1,#80H MOV A,R1 (因?yàn)?0H為SFR的物理地址,MCS-51 片內(nèi) 、片外 數(shù)據(jù)存儲器示意圖,特殊功能 寄存器 SFR,通用數(shù)據(jù) 存儲器,80H 7FH,00H,FFH,片內(nèi)數(shù)據(jù)存儲器 片外數(shù)據(jù)存儲器 256B個字節(jié) 64KB個字節(jié),片外數(shù)據(jù) 存儲器 64KB,0000H,FFFFH,注意: 1,訪問片內(nèi)RAM20H存儲單元; MOV A,20H 2,訪問片外RAM存儲單元; MOV R0,#20H MOVX A,R0 3,盡管片內(nèi)與片外的RAM單元 的00H-FFH地址相重疊但由 于指令的不同不會發(fā)生地址 混

15、亂,返回,2.2.5 變址尋址,指令使用DPTR或PC中的內(nèi)容作為基地址,再與累加器A的內(nèi)容相加,其和作為操作數(shù)地址。如: MOVX A,A+PC ;PC內(nèi)容與A的內(nèi)容相加得操作數(shù)地址 并將此操作數(shù)送A MOVX A,A+DPTR;DPTR內(nèi)容與A的內(nèi)容相加得操作數(shù) 地址并將此操作數(shù)送A 使用變址指令時(shí),要事先分別為A、DPTR賦值,以便獲得操作數(shù)得地址,變址指令只適用于對ROM存儲器得訪問,如查表等。 【舉例】:已知ROM中0302H 單元有一個數(shù)x,現(xiàn)要把它送到累加器A中,試編程。 MOV DPTR,#0300H ;立即數(shù)送DPTR MOV A,#02H ;立即數(shù)送累加器A MOVC A,

16、A+DPTR ;從ROM的00302單元取數(shù)送A,變址尋址示意圖,02H,0300H,ALU,0302H,累加器A,DPTR,0300H + 02H 0302H,MOVC A,A+DPTR,返回,2.2.6 相對尋址,轉(zhuǎn)移指令中使用的一種尋址方式。MCS-51單片機(jī)的指令系統(tǒng)中,有兩類轉(zhuǎn)移指令:相對轉(zhuǎn)移( 2個或3個字節(jié)) 絕對轉(zhuǎn)移(3個字節(jié))。 在絕對轉(zhuǎn)移指令中,指令直接給出轉(zhuǎn)移的目標(biāo)地址(2字節(jié)地址),執(zhí)行時(shí)將目標(biāo)地址直接送給PC,從而控制程序轉(zhuǎn)移; 而相對轉(zhuǎn)移指令在執(zhí)行中是將PC值與指令中的8位偏移量進(jìn)行相加,形成指令要轉(zhuǎn)移的目標(biāo)地址。 SJMP rel 由指令中有一個8位偏移量 rel

17、 為帶符號位的補(bǔ)碼,所以控制程序轉(zhuǎn)移的范圍為+127-128,54H,2002H,ALU,2056H,累加器A,PC,2002H + 54H 2056H,操作碼,偏移量,例如:SJMP 54H ;(80H、54H,2000H,2002H,LOOP1,相對尋址使用中應(yīng)注意的問題,與絕對尋址相比,相對尋址具有很好的“浮動性”,因此是編程人員普遍使用的一種尋址方式。 使用時(shí),要注意3點(diǎn): 1,CPU進(jìn)行地址計(jì)算時(shí),PC取值是執(zhí)行本指令后的地址值。以上面的例子說明: 指令本身的首地址是2000H,執(zhí)行完后變?yōu)?002H(既下一條指令的首地址)。 如果使用三字節(jié)的相對轉(zhuǎn)移指令,則PC=PC+3,返回上一

18、頁,2,偏移量的計(jì)算: rel=目標(biāo)地址-源地址-2 (2字節(jié)指令) 或: rel=目標(biāo)地址-源地址-3 (3字節(jié)指令) 結(jié)果用補(bǔ)碼的形式書寫。 為了減少計(jì)算偏移量的計(jì)算,匯編程序允許使用“符號地址”的方式代替偏移量。如: SJMP loop1 匯編程序在翻譯時(shí),自動計(jì)算并將結(jié)果替換符號地址。 3, 如果轉(zhuǎn)移地址的范圍超過相對尋址的范圍(如:-127+128)時(shí),就要采用別的方式法,否則在編譯時(shí),提示出錯,返回,2.2.7 位尋址,在位尋址指令(位操作指令)中使用的位地址。 在一般的情況下,系統(tǒng)的數(shù)據(jù)都是按字節(jié)(8位)來存放、處理。 單片機(jī)在控制、檢測的應(yīng)用中,系統(tǒng)的輸入、輸出數(shù)據(jù)有很多屬于開

19、關(guān)量信號。這些開關(guān)量信號以 bit - “位”的形式進(jìn)行各種運(yùn)算、處理和存儲的,MCS-51 單片機(jī) 控制、檢測 系統(tǒng),驅(qū)動器,電動機(jī),外設(shè)1,外設(shè)2,狀態(tài)信號,狀態(tài)信號,控制信號,在MCS-51單片機(jī)的硬件設(shè)計(jì)上充分考慮了這種“布爾”變量的處理,不僅在指令系統(tǒng)中設(shè)計(jì)了“位操作”指令,而且在片內(nèi)RAM區(qū)中還專門開辟了一個 “位尋址區(qū)”。這樣,布爾變量可以向字節(jié)數(shù)據(jù)一樣進(jìn)行存儲、尋址。 除了位尋址區(qū)外,RAM中的大多SFR都可以按位尋址,換句話,SFR除了有自己的字節(jié)地址外,在寄存器內(nèi)的每一位還有其位地址,舉例】:SETB 20H ;將位地址為20H的位置一 SETB 90H ;將P1口的d0位

20、置一 同字節(jié)尋址中的直接尋址一樣,為了增加程序的可讀性,凡在SFR中的位地址都可以使用符號地址來替代。如第二例中,完全可以使用下面的指令格式: MOV P1.0 ;將P0口的d0位置一 類似還有:MOV C,ACC.7 ;將累加器中的d7位送PSW的cy 這種指令在匯編程序進(jìn)行翻譯時(shí),還是要先將符號地址轉(zhuǎn)換為真正的位地址,返回,2.3 數(shù)據(jù)傳送指令,2.3.0 傳送指令的特點(diǎn) 2.3.1 內(nèi)部數(shù)據(jù)傳送類指令 2.3.2 外部數(shù)據(jù)傳送類指令 2.3.3 堆棧操作指令 2.3.4 數(shù)據(jù)交換指令,繼續(xù),數(shù)據(jù)傳送是編程中使用最多、最主要的操作。它的功能是將數(shù)據(jù)在累加器、片內(nèi)的RAM、SFR及片外ROM

21、、RAM之間進(jìn)行傳送。 在傳送類指令中,必須指定被傳送數(shù)據(jù)的源地址和目標(biāo)地址。在傳送過程中,源地址的內(nèi)容不被改變。 傳送類指令除了以累加器A為目標(biāo)的傳送對PSW的P有影響外,其余的傳送類指令對PWS一概無影響,舉例】:MOV A,R0 ;將R0寄存器中的數(shù)據(jù)送 累加器A中(注意尋址方式,指令通式:MOV,2.3.0 傳送指令的特點(diǎn),返回,2.3.1 內(nèi)部數(shù)據(jù)傳送類指令,特點(diǎn):指令的源操作數(shù)和目的操作數(shù)都在單片機(jī)內(nèi)部,1,立即尋址型傳送指令,2,直接尋址型傳送指令,3,寄存器尋址型傳送指令,4,寄存器間址型傳送指令,5,內(nèi)部數(shù)據(jù)傳送類指令的使用,繼續(xù),1,立即尋址型傳送指令,特點(diǎn)】:原操作數(shù)字節(jié)

22、是立即數(shù),處在指令的第二或第三字節(jié),所以這類指令都是多字節(jié)指令。這類指令有如下4條。 MOV A,#data ; A data (雙字節(jié)指令) MOV Rn,#data ; Rn data (雙字節(jié)指令) MOV Ri,#data ; (Ri) data (雙字節(jié)指令) MOV direct,#data ; direct data (三字節(jié)指令) 這類指令多用于程序的初始化。如: MOV R0,#20H MOV A,#00H,立即尋址指令舉例,已知:R0=20H,試問單片機(jī)執(zhí)行如下指令后,累加器A、 R7、20H和21H單元中的內(nèi)容是什么。 MOV A,#18H ;立即數(shù)18H送累加器A MO

23、V R7,#28H ;立即數(shù)28H送寄存器R7 MOV R0,#38H ;立即數(shù)38H送內(nèi)存20H單元 MOV 21H,#48H ;立即數(shù)48H送內(nèi)存21H單元,返回,2,直接尋址型傳送指令,特點(diǎn)】:指令中至少含有一個源操作數(shù)或目的操作數(shù)的地址。很明顯,這也是2個或3個字節(jié)的指令格式,其中直接地址在第2或第3個字節(jié)上。這類指令有如下5條: MOV A,direct MOV direct,A MOV Rn,direct MOV Ri,direct MOV direct2,direct1 【注意】:direct為內(nèi)部寄存器、RAM和SFR的地址,換句話說:direct適用于片內(nèi)所有的地址(寄存器、

24、SFR和RAM,直接尋址指令舉例,MOV A,30H ;內(nèi)存RAM30h單元數(shù)據(jù)送A MOV 50H,A ;A中內(nèi)容送RAM的50h單元 MOV R6,31H ;RAM的30h 內(nèi)容送R6寄存器 MOV Ri,30H ;RAM30h內(nèi)容送Ri指定的RAM單元 MOV P1,32H ;RAM32h內(nèi)容送P1口(p1:符號地址) MOV 90H,32H ;(同上,試比較兩種表示方法,返回,3,寄存器尋址型傳送指令,指令中含有存放操作數(shù)的寄存器名Rn 其中(n0,1,2,3,4,5,6,7)。 共有如下三條: MOV A,Rn MOV Rn,A MOV direct,Rn,返回,4,寄存器間接尋址型

25、傳送指令,指令特點(diǎn):指令中Ri中存放的不是操作數(shù)本身,而是操作數(shù)在RAM中的地址(i=0、1)。 格式如下: MOV A,Ri MOV Ri,A MOV direct,Ri 【注意】;Ri中存放操作數(shù)的地址是有所選擇的,只有非SFR的RAM單元才能使用這種尋址方式,寄存器間接尋址指令舉例,已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。試問,下面的指令執(zhí)行后,累加器A、40h、41h和42h單元中的內(nèi)容是什么。 MOV A,R0 ;RAM40h單元內(nèi)容11h送A MOV R1,A ;A中的11h送RAM的41h單元 MOV 42H,R1 ;RAM的41h單元內(nèi)容11h送

26、 RAM42h中,返回,5,內(nèi)部數(shù)據(jù)傳送類指令的使用,1,在使用傳送指令時(shí),可以根據(jù)實(shí)際情況選用恰當(dāng)尋址方式。上面給出的各種類型的傳送指令是INTEL公司在設(shè)計(jì)MCS-51的硬件時(shí)就已經(jīng)確定下來。編程人員只能像查字典一樣去查找、使用。不能根據(jù)主觀意愿去“創(chuàng)造”指令。 例如:要將R0中的數(shù)據(jù)傳送到R1中。如何使用指令去完成上面的操作? mov r1,r0 是否可以?回答是否定的!因?yàn)樵贛CS-51的指令系統(tǒng)中沒有此條指令!只能使用: 1,mov a,r0 或: 2, mov 01h,00h mov r1,a 因此,必須從MCS-51的指令表中選擇使用指令,MCS-51內(nèi)部數(shù)據(jù)傳送類指令方式圖,累

27、加器A,direct 直接尋址,Ri間址,Rn寄存器,Data立即數(shù),返回上一次,2,以累加器A為目的寄存器的傳送指令會影響PSW中的 奇偶位P,而其余的指令對PSW均無影響。 3,要會正確地估計(jì)指令的字節(jié)。凡是指令中包含有立即 數(shù)、直接地址的指令,都應(yīng)當(dāng)在原有的基礎(chǔ)上加1。 【舉例】: mov a,Ri ( )個字節(jié) mov a,direct ( )個字節(jié) mov direct,data ( )個字節(jié) mov direct2,direct1 ( )個字節(jié),4,對于同一問題可以有不同的編程方法。使用不同的方法雖然都可以實(shí)現(xiàn)題目的要求,但從指令長度、運(yùn)行時(shí)間和可閱讀性上等綜合因素考慮,不同的方法

28、就有合理和不合理、優(yōu)化和繁雜之分。所以,在學(xué)習(xí)指令系統(tǒng)和編程時(shí)開始就要養(yǎng)成一個好的、合理的編程習(xí)慣。 5,注意給程序進(jìn)行正確的注釋,這對于閱讀、編寫和修改程序都是非常重要的。下面就是一些注釋的例子: MOV A,30H ;(30h) A MOV A,R0 ; R0 A MOV 40H,30H ;(30h) 40h MOV A,Ri ; ( Ri ) A,內(nèi)部傳送類指令舉例,試編出把30h和40h單元內(nèi)容進(jìn)行交換。 MOV A,30H ;(30h) A MOV 30H,40H ;(40h) 30h MOV 40H,A ; A 40h,累加器A,30H,40H,返回,2.3.2 外部數(shù)據(jù)傳送類指令

29、,1,16位數(shù)傳送指令,2,外部ROM的字節(jié)傳送,3,外部RAM的字節(jié)傳送指令,繼續(xù),1,16位數(shù)傳送指令,MCS-51指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送類指令。 MOV DPTR,#data16 DPTR是單片機(jī)內(nèi)部SFR中的兩個寄存器DPH、DPL組合而成。其中DPH為高八位,DPL為低八位。 DPTR是一個專門用于訪問外部存儲器的間址寄存器。尋址能力為 64K (065535,返回,2,外部ROM的字節(jié)傳送指令,這類指令有兩條,都屬于變址尋址指令。 MOVC A,A+DPTR ;A (A+DPTR) MOVC A,A+PC ;PC PC+1, A (A+PC) 該指令也稱為“查表”指令。

30、在ROM中建立一個數(shù)據(jù)表,可以使用DPTR、PC作為數(shù)據(jù)表格的基地址。 在第一條指令中:用DPTR作為基地址。使用前,先將數(shù)據(jù)表的首地址送入DPTR中,累加器A作為偏移量。由兩者數(shù)據(jù)相加得到待查的表中數(shù)據(jù)地址并取出。 第二條指令是以程序計(jì)數(shù)器PC為基地址。由于PC的內(nèi)容與該指令在ROM中的位置有關(guān),所以一旦該指令在程序中的位置確定,其PC的值也就確定,外部ROM的字節(jié)傳送指令舉例,已知累加器A中存有09范圍內(nèi)的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。 1,采用DPTR作基址寄存器: 設(shè)平方表的首地址為2000h,累加器A中的內(nèi)容恰好是查表的偏移量。首先將表的起始地址2000h送入DPTR中

31、。 MOV DPTR,#2000H ;指針賦值 MOVC A,A+DPTR ;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,2,采用PC作基址寄存器: 與DPTR不同,使用PC作為基地址時(shí),必須對累 加器A的數(shù)據(jù)進(jìn)行修正,以保證a+pc恰好找到 待查的平方值地址。 ORG 1FFBH 1FFBH 74 data ADD A,#data ;data=02h 1FFDH 83H MOVC A,A+PC ;PC=1FFE 1FFEH 80FEH SJMP $ 2000H 00H DB 0 ;平房表首址 2001H

32、01H DB 1 2002H 04H DB 4 2003H 09H DB 9 2004H 10H DB 16 2005H 19H DB 25 : : : 2009H 51H DB 81 END data為MOVC指令首地址與表頭地址之間的單元數(shù),2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,1FFFh,1FFEh,1FFDh,1FFCh,1FFBh,返回,3,外部RAM的字節(jié)傳送指令,實(shí)現(xiàn)外部RAM和累加器A之間的數(shù)據(jù)傳送。只有寄存器間接尋址的指令。 MOVX A,Ri 使用Ri寄存器間址尋址范圍0255h MOVX R

33、i,A 在硬件電路中P0口輸出8位地址數(shù)據(jù)。 MOVX A,DPTR 使用DPTR間址,尋址范圍065535h MOVX DPTR,A 在硬件電路中,使用P0口輸出低8位, P2口輸出高8位外部RAM地址,外部RAM的字節(jié)傳送指令舉例,已知外部RAM的88H單元有一個數(shù)x,試編程將x送外部RAM的1818H單元。 【解】:外部RAM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次 MOVX 指令完成此操作。 ORG 2000H MOV R0,#88H ;為8位指針賦值 MOV DPTR,#1818H ;為16位指針賦值 MOVX A,R0 ;取 x 到累加器A MOVX DPTR,A ;x 送RAM

34、的1818h單元 SJMP $ ;停機(jī) END,返回,2.3.3 堆棧操作指令,堆棧操作是一種特殊的數(shù)據(jù)傳送指令。 堆棧:一個用來保存程序斷點(diǎn)、數(shù)據(jù)的特殊的存儲區(qū)域。在MCS-51單片機(jī)中,棧區(qū)是占用片內(nèi)RAM的存儲空間,具體棧位置由指針SP來確定(系統(tǒng)上電時(shí),SP=07h)。 1,進(jìn)棧操作: push direct ;sp+1sp,(direct)(sp) 2,出棧操作: pop direct ;(sp)(direct),sp -1sp 【注意】: 尋址方式為直接尋址,所以 push a 是錯誤的,應(yīng)當(dāng)是push acc或push 0e0h,同理:push r0也是錯誤的。 進(jìn)棧是堆棧向上“

35、生長”的過程,即sp+1;出棧則相反。 系統(tǒng)上電時(shí),sp=07h。SP的值可以根據(jù)需要進(jìn)行修改,以適應(yīng)具體編程的需要。在確定棧區(qū)位置時(shí)要考慮對數(shù)據(jù)區(qū)的影響,以避免數(shù)據(jù)區(qū)與棧區(qū)沖突,堆棧操作指令舉例(一,下面是一個BCD碼轉(zhuǎn)換為二進(jìn)制的子程序BCDB中有關(guān)堆棧操作的例子。在這里,進(jìn)棧操作是為了保護(hù)主程序中相關(guān)寄存器中的數(shù)據(jù),因?yàn)樽映绦蛞褂眠@些寄存器。 org 0800h bcdb:push psw push acc push b : : pop b pop acc pop psw ret,SP,堆棧操作指令舉例(二,堆棧操作指令除了可以在子程序的設(shè)計(jì)中,對主程序的數(shù)據(jù)進(jìn)行保護(hù)。還可以根據(jù)堆棧操

36、作的特點(diǎn)完成一些特殊的操作。 【舉例】:設(shè)片內(nèi)RAM的30h單元存有x,40h單元存有y。試將兩個單元內(nèi)容互換。 push 30h push 40h pop 30h pop 40h,SP=07h,40h,30h,繼續(xù),2.3.4 數(shù)據(jù)交換指令,為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換。避免了使用一般mov 傳送指令完成交換時(shí)的不便。 格式:xch a,Rn ;a Rn xch a,direct ;a (direct) xch a,Ri ;a (Ri) xchd a,Ri ;a30(Ri)30 舉例:已知,片外RAM20h單元、內(nèi)部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換

37、。 mov R1,#20h ;指針賦初值 movx a,R1 ;xa xch a,R1 ;交換 a(20h),ya movx R1,a ;y(20h)片外RAM,數(shù)據(jù)交換指令舉例(一,舉例:已知,片外RAM20h單元、內(nèi)部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換。 mov R1,#20h ;指針賦初值 movx a,R1 ;xa xch a,R1 ;交換 a(20h),ya movx R1,a ;y(20h)片外RAM,y) x,20h,20h,累加器A,1,2,3,數(shù)據(jù)交換指令舉例(二,已知RAM50h單元有一個09的數(shù),試編程將它變成相應(yīng)的ASCII碼。 【解】:09的ASCI

38、I碼是30h39h,兩者相差30h。 方法一:對50h單元的數(shù)據(jù)高四位組裝一個30h。 mov r0,#50h ;指針賦值 mov a,#30h ;30hA xchd a,r0 ; A30(r0)30,在A中組成ASCII碼 mov r0,a ;A中的ASCII送回50h單元,50h,00110101,A=30h,交換后A=35h,1,2,繼續(xù),2.4 算邏運(yùn)算和移位指令,功能:完成算術(shù)運(yùn)算、邏輯運(yùn)算和循環(huán)移位三大功能。 特點(diǎn):大多指令都要由累加器A來存放一個源操作數(shù),并把操作結(jié)果放回累加器A中,2.4.1: 算術(shù)運(yùn)算指令,2.4.2: 邏輯運(yùn)算指令,2.4.3: 移位指令,繼續(xù),2.4.1:

39、 算術(shù)運(yùn)算指令,不帶進(jìn)位的加法指令 ( ADD ) 1,加法指令: 帶進(jìn)位的加法指令 ( ADC ) 加1指令 ( INC ) (編程舉例) 2,減法指令: 帶進(jìn)位的減法指令 ( SUBB ) 減1指令 ( DEC ) 3,十進(jìn)制調(diào)整指令: ( DA A ) 4,乘法和除法指令: (MUL DIV,加法指令(一):不帶進(jìn)位的加法指令,格式: ADD A,Rn;A+RnA ADD A,direct;A+(direct)A ADD A,Ri;A+(Ri)A ADD A,#data;A+dataA 【注意】: 1,參加運(yùn)算的數(shù)據(jù)都應(yīng)當(dāng)是8位的,結(jié)果也是8位并影響PSW。 2,根據(jù)編程者的需要,8位數(shù)

40、據(jù)可以是無符號數(shù)(0255),也可以是有符號數(shù)(-127+128)。 3,不論編程者使用的數(shù)據(jù)是有符號數(shù)還是無符號數(shù),CPU都將它們視為有符號數(shù)(補(bǔ)碼)進(jìn)行運(yùn)算并影響PSW,不帶進(jìn)位的加法指令舉例(一,試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOV A,#19H Cy=0; ADD A,#66H AC=0 OV=CPCS=0 25 A= 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B 127 0 0 1 1 1 1 1 1 1 B 1,若兩數(shù)都是無符號數(shù),則因Cy=0無溢出,25+102=127。 2,若兩個數(shù)是有符號數(shù),則

41、因OV=0無溢出,cy,0 0 0 CP CS AC,不帶進(jìn)位的加法指令舉例(二,試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOV A,#5AH Cy=0; ADD A,#6BH AC=0; OV=CPCS=1 90 A= 0 1 0 1 1 0 1 0 B P=0 + 107 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B CP CS AC 1,若兩數(shù)是無符號數(shù),因Cy=0無溢出:90+107=197 2,若兩數(shù)是有符號數(shù),因OV=1,故有溢出,兩個正數(shù)相加后變?yōu)樨?fù)數(shù),很明顯結(jié)果是不正確的,加法指令(二):帶進(jìn)位的加法指令,格式: A

42、DDC A,Rn;A+Rn+CyA ADDC A,direct;A+(direct) +CyA ADDC A,Ri;A+(Ri) +CyA ADDC A,#data;A+data+CyA 【注意】:這里的Cy是指令執(zhí)行前的Cy; 對PSW的影響同ADD指令,加1指令,格式:INC A ;累加器A加一 INC Rn ;Rn+1Rn INC direct ;內(nèi)存單元數(shù)據(jù)加一 INC Ri ;內(nèi)存單元數(shù)據(jù)加一 INC DPTR ;dptr+1dptr 【注意】: 1,除了第一條對PSW的P有影響外,其余對PSW均無影響。 2,由于上面的原因,INC指令不能作為一般的數(shù)據(jù)算術(shù)運(yùn)算 使用,INC主要用于

43、修改數(shù)據(jù)指針等控制、循環(huán)語句中使用,返回本節(jié)目錄,編程舉例,已知M1、M2單元中存有兩個16位無符號數(shù)x1、x2(低位在前)。試寫出x1+x2,并將結(jié)果放入M1、M1+1單元(低8位在M1單元)。設(shè)兩數(shù)之和不會超過16位(65535)。 【解】: MOV R0,#M1 ;x1指針賦初值 MOV R1,#M2 ;x2指針賦初值 MOV A,R0 ;取x1低8位送A ADD A,R1 ;x1與x2低8位相加 MOV R0,a ;低8位和送m1單元 INC R0 INC R1 ;修改指針 MOV A,R0 ;取x1的高8位送A ADDC A,R1 ;x1與x2的高8位和Cy相加 MOV R0,A ;

44、結(jié)果送M1+1單元,M1,M1+1,M2,M2+1,返回本節(jié)目錄,減法指令(帶進(jìn)位的減法指令,在MCS-51單片機(jī)的指令系統(tǒng)中,只有: 帶進(jìn)位的減法 SUBB 減一 DEC 兩種指令。 1減法指令: 格式:SUBB A,Rn ;A Rn Cy A SUBB A,direct ;A (direct) Cy A SUBB A,Ri ;A (Ri) Cy A SUBB A,#data ;A data Cy A,使用減法指令要注意的幾個問題,1,在單片機(jī)內(nèi)部,減法指令實(shí)際上是采用補(bǔ)碼的加法實(shí)現(xiàn)的。但要判定減法結(jié)果編程者可以按二進(jìn)制減法法則驗(yàn)證。 2,無論相減兩數(shù)是無符號數(shù)還是有符號數(shù),減法操作總是按有

45、符號數(shù)來處理、影響PSW中相關(guān)的標(biāo)志(詳見舉例)。 3,在MCS-51的指令系統(tǒng)中沒有不帶Cy的減法,所以在使用SUBB指令前必須使用一條清除Cy的指令:CLR C,減法指令應(yīng)用舉例,試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 CLR C MOV A,#52H 01010010B = 82 SUBB A,#0B4H 10110100B = - 76 82 a= 0 1 0 1 0 0 1 0 -76 data= 1 0 1 1 0 1 0 0 158 1 1 0 0 1 1 1 1 0 =-62H= -98 手工計(jì)算 CP CS AC 1 0 1 【分析】:CPU的計(jì)算得-98,很明

46、顯答案是錯誤的。原因是OV=1,既產(chǎn)生了溢出。所以,對于符號數(shù)的減法在運(yùn)算后一定要檢測OV=1,返回本節(jié)目錄,減一指令,格式:DEC A ;累加器A減一 DEC Rn ;Rn-1Rn DEC direct ;內(nèi)存單元數(shù)據(jù)減一 DEC Ri ;內(nèi)存單元數(shù)據(jù)減一 【注意】: 1,除了第一條對PSW的P有影響外,其余對PSW均無影響。 2,由于上面的原因,DEC指令一般不作為數(shù)據(jù)算術(shù)運(yùn)算使用(因?yàn)椴荒軐SW的OV等位產(chǎn)生影響,它主要用于修改數(shù)據(jù)指針在控制、循環(huán)語句中使用,返回本節(jié)目錄,十進(jìn)制調(diào)整指令,在CPU進(jìn)行BCD碼運(yùn)算時(shí),必須在運(yùn)算后進(jìn)行十進(jìn)制調(diào)整,這是因?yàn)椋珻PU在運(yùn)算時(shí),并不知道數(shù)據(jù)是二

47、進(jìn)制還是BCD碼。 格式:DA A ;若AC=1或A30 9,則A+06hA ;若Cy =1或A74 9,則A+60hA 【注意】: 1,DA A指令必須緊跟在加法指令之后; 2,DA A指令只適用于加法指令的調(diào)整,十進(jìn)制調(diào)整指令應(yīng)用舉例(一,1,BCD加法運(yùn)算:試寫出完成85+59的BCD碼的加法程序。 MOV A,#85H ADD A,#59H DA A SJMP $ 85 a= 1 0 0 0 0 1 0 1B + 59 dtat= 0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位9,所以加06h + 0 0 0 0 0 1 1 0B 1 1 1 0 0

48、 1 0 0B 高4位9,所以加60h 0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 結(jié)果為144h(1包含在Cy) 【注意】: 144H是用16進(jìn)制數(shù)來表示十進(jìn)制,既BCD碼,十進(jìn)制調(diào)整指令應(yīng)用舉例(二,2,BCD減法運(yùn)算:由于DA A 指令只能對BCD碼的加法進(jìn)行調(diào)整,所以遇到BCD碼的加法時(shí)就要將其減法變?yōu)榧臃ㄟ\(yùn)算,然后再使用DA A指令進(jìn)行調(diào)整。 減法變加法就是使用BCD碼的補(bǔ)碼運(yùn)算法則: 將被減數(shù)-減數(shù)變?yōu)楸粶p數(shù)+減數(shù)的補(bǔ)碼。 減數(shù)的補(bǔ)碼 = BCD碼的模-減數(shù) 其中BCD碼的模為100H = 99H+01H = 9AH,已知:在M1、M2中分別存有被減數(shù)9

49、1和減數(shù)36。 試編程求19-36并將結(jié)果存入M3單元。 【解】: 1,算法:91-36=91+(100-36)=91+(9A-36) 2,編程: CLR C ; 清除Cy MOV A,#9AH ;BCD碼的模100送A SUBB A,M2 ;計(jì)算減數(shù)的補(bǔ)碼 (結(jié)果在A中) ADD A,M1 ;被減數(shù)+減數(shù)的補(bǔ)碼(結(jié)果在A中) DA A ;十進(jìn)制調(diào)整 MOV M3,A ;結(jié)果送M3單元 CLR C ;清除進(jìn)位位(不要Cy) (請同學(xué)自己驗(yàn)證一下,返回本節(jié)目錄,乘法和除法指令,這是MCS-51單片機(jī)唯一的一類單字節(jié)4周期指令,它相當(dāng)于4條加法指令的運(yùn)行時(shí)間。 格式:MUL A B ;ab=b a

50、 (b存高8位,a存低8位) DIV A B ;ab=ab (a存商,b存余數(shù)) 【注意】:指令對標(biāo)志的影響: 1,在乘法指令中對PSW的影響有Cy、OV、和P。 具體如下:Cy0;P取決于A中“1”的個數(shù);OV表明積的大小。當(dāng)積超過255(B0)時(shí),OV=1。 2,在除法指令中,Cy、P與乘法相同。在執(zhí)行除法指令時(shí),若B=0時(shí)OV=1,表示除數(shù)=0除法無意義,其余情況下OV被復(fù)位,返回本節(jié)目錄,2.4.2: 邏輯運(yùn)算指令,功能:對2個8位二進(jìn)制數(shù)進(jìn)行邏輯與、或、非和異或操作; 特點(diǎn):除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外,其余指令對PSW均無影響。 1,邏輯與運(yùn)算指令 (ANL)

51、 2,邏輯或運(yùn)算指令 (ORL) 3,邏輯異或指令 (XRL) 4,累加器清零和取反指令 (CLR 或運(yùn)算可以 “置位” 某些位,返回本節(jié)目錄,邏輯異或運(yùn)算指令,格式:XRL A,Rn; A R n A XRL A,direct ; A (direct) A XR A,Ri; A ( R I ) A XRL A,#data; A data A XRL direct,A; (direct) A direct XRL direct,# data; (direct) data direct 特點(diǎn):按位運(yùn)算,相同時(shí)為0,不同時(shí)為1。使用異或可以實(shí)現(xiàn)將某個字節(jié)的數(shù)據(jù)或?qū)?shù)據(jù)的某幾位變反,舉例,已知:外部

52、RAM的30H單元中有一個數(shù)AAH,現(xiàn)要將其高4位不變,低4位取反,試編程。 解1,利用MOVX A,Ri指令: MOV R0,#30H 1 0 1 0 1 0 1 0 MOVX A,R0 0 0 0 0 1 1 1 1 XRL A,#0FH 1 0 1 0 0 1 0 1 MOVX R0,A 解2,利用MOVX A,DPTR MOV DPTR,#0030H MOVX A,DPTR XRL A,#0FH MOVX DPTR,A,返回本節(jié)目錄,累加器清零和取反指令,用傳送指令可以實(shí)現(xiàn)對累加器A的清零和取反操作,但是它們都是雙字節(jié)指令。在MCS-51的指令系統(tǒng)中專門設(shè)計(jì)了單字節(jié)、單周期對累加器清零

53、和取反的指令。 格式:CLR A ;累加器清零 CPL A ;累加器取反 取反指令可以方便的實(shí)現(xiàn)求補(bǔ)操作。 舉例:已知30H單元中有一個數(shù)x,寫出對它求補(bǔ)的程序。 MOV A,30H CPL A INC A MOV 30H,A,邏輯運(yùn)算指令應(yīng)用舉例,設(shè)X、Y和Z分別存在X、Y和Z單元。試編出能實(shí)現(xiàn)此電路功能的程序,并將結(jié)果送入F單元。 解: MOV A,X ANL A,Y ;XYA MOV R1,A ;送R1暫存 MOV A,Y XRL A,Z ;YZA CPL A ;A取反 ORL A,R1;(XY) (YZ)A MOV F,A ;AF,X,Y,Z,F,返回本節(jié)目錄,2.4.3: 移位指令,

54、雖然MCS-51只有5條移位指令,但它可以處理所有移位問題。 格式: RL A RR A RLC A RRC A SWAP A 【注意】:只能對累加器A進(jìn)行移位,A7 A0,A7 A0,A7 A0,Cy,Cy,A7 A0,舉例(一,已知:在M1和M1+1單元有一個16位數(shù)(M1存低8位),試編程將其擴(kuò)大2倍(設(shè)結(jié)果小于65535)。 解:擴(kuò)大2倍可以用左移一位來實(shí)現(xiàn),M1 M1+1,1001110,1,0101101,0,程序清單,CLR C;清除Cy位 MOV R1,#M1;指針賦值 MOV A,R1;取低8位數(shù)據(jù) RLC A;循環(huán)左移,Cy進(jìn)低位,高位進(jìn)Cy MOV R1,A;移位后數(shù)據(jù)回

55、送 INC R1;指針加一 MOV A,R1;取高8位數(shù)據(jù) RLC A;循環(huán)左移Cy進(jìn)低位 MOV R1,A;數(shù)據(jù)回送,舉例(二,已知:M1、M2單元中有2個BCD碼,試編程將其緊縮為一個字節(jié)并存入M1單元。 解:MOV R1,#M1 MOV A,R1 SWAP A INC R1 ORL A,R1 MOV M1,A,M1 M1+1,BCD1 0000,BCD1 BCD2,0000 BCD1,返回本章目錄,累加器A,2.5 控制轉(zhuǎn)移和位操作指令,2.5.1 控制轉(zhuǎn)移指令 1,無條件轉(zhuǎn)移指令 2,條件轉(zhuǎn)移指令 3,子程序調(diào)用和返回 4,空操作指令 2.5.2,位操作指令 1,位傳送指令: 2,位置

56、位和位清零指令: 3,位運(yùn)算指令: 4,位控制轉(zhuǎn)移指令,返回本章目錄,1,無條件轉(zhuǎn)移指令,格式: LJMP addr16 長轉(zhuǎn)移指令,尋址范圍65535; AJMP addr11 絕對轉(zhuǎn)移,尋址范圍2K; SJMP rel 短轉(zhuǎn)移,轉(zhuǎn)移范圍(+127-128); JMP A+DPTR 變址轉(zhuǎn)移,尋址范圍65535,LJMP指令 (三字節(jié),AJMP指令 (雙字節(jié),SJMP指令 (雙字節(jié),JMP指令 (單字節(jié),長轉(zhuǎn)移指令:(三字節(jié)雙周期指令,指令執(zhí)行時(shí),將指令碼中的addr16送入PC中,使程序無條件的轉(zhuǎn)向addr16所指向的新地址執(zhí)行程序。 【舉例】: 已知某單片機(jī)的監(jiān)控程序地址為A080H,試

57、問用什么方法使單片機(jī)開機(jī)后自動的轉(zhuǎn)向該監(jiān)控程序? 【解】: 因?yàn)閱纹瑱C(jī)上電時(shí),PC=0000H,所以在0000H單元存放一條LJMP 0A080H 的指令即可,ROM,0000H 0001H 0002H 0003H,絕對轉(zhuǎn)移指令,雙字節(jié)、雙周期指令。 將AJMP指令中的11位轉(zhuǎn)移地址替換掉原來PC中16位地址中的低11位地址。 指令中的11位地址,確定了地址的轉(zhuǎn)移范圍在2K以內(nèi),所以AJMP也稱“頁內(nèi)轉(zhuǎn)移”指令,A10 a9 a8 操作碼 a7 a0,AJMP指令,PC程序計(jì)數(shù)器,MCS-15的ROM系統(tǒng)是以2K為一頁來劃分程序存儲器,這樣對于4K的片內(nèi)ROM存儲器可以分為2頁;片外64K的R

58、OM可以分為32頁。 在執(zhí)行AJMP指令時(shí),PC的高5位決定了ROM中的頁地址;而AJMP 指令的低11位地址用來選擇頁內(nèi)地址。 在一般情況下,AJMP指令應(yīng)當(dāng)與目標(biāo)地址在同一頁內(nèi)。更具體的說:目標(biāo)地址應(yīng)當(dāng)與AJMP指令取出后的PC值(PC=PC+2) 在同一頁內(nèi)。否則轉(zhuǎn)移將會出現(xiàn)錯誤,ROM的64K存儲空間的頁面(部分)劃分表,ROM的64K存儲空間的頁面示意圖,: : : AAA:MOV A,R0 MOV R1,A : : AJMP AAA,0100H,07FEH,000001111111 11111110,PC值,000010000000 00000000,PC+2值,000010010

59、000 00000000,AJMP指令中的11位地址,原本AJMP指令要轉(zhuǎn)到本 頁的 0100H 單元但是由 于 PC 的高5位頁面地址 發(fā)生了變化使AJMP指令 實(shí)際轉(zhuǎn)到下一頁 0900H 單元,最后PC值,發(fā)生跨頁錯誤,AJMP轉(zhuǎn)一指令是用來做頁內(nèi)2K范圍的轉(zhuǎn)移,如果使用不當(dāng),會發(fā)生錯誤的“跨頁”操作。 產(chǎn)生跨頁的原因是AJMP指令處于每一頁的最后兩個單元的結(jié)果,所以避免這種現(xiàn)象的方法就是不要在每一頁的最后兩個單元使用AJMP指令。 如果目標(biāo)地址與AJMP地址不再同一頁內(nèi),建議使用LJMP指令替代AJMP。 使用AJMP指令時(shí),11位的絕對地址可以用符號地址取代,正確使用AJMP轉(zhuǎn)移指令,

60、短轉(zhuǎn)移SJMP指令,格式:SJMP rel rel 為偏移量( +127-128) rel(偏移量)的計(jì)算公式: rel=目標(biāo)地址 源地址 2 (其中:2為SJMP指令的長度) 【例1】:如圖,要轉(zhuǎn)到0116H時(shí): rel=0116H-0110H-2=04H 【例2】:要轉(zhuǎn)到0109H時(shí): rel=0109H-0110H-2=F7H(-9) 實(shí)際編程時(shí),使用符號地址取代rel以簡化計(jì)算,在匯編時(shí)由匯編程序來計(jì)算rel,PC,PC+2,0109H,0110H,0116H,變址轉(zhuǎn)移指令,格式:JMP A+DPTR 單字節(jié)操作碼為73H 特點(diǎn):轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成。 用途:用來

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論