單片機(jī)原理及應(yīng)用 蔡啟仲 第4章 匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
單片機(jī)原理及應(yīng)用 蔡啟仲 第4章 匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
單片機(jī)原理及應(yīng)用 蔡啟仲 第4章 匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
單片機(jī)原理及應(yīng)用 蔡啟仲 第4章 匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
單片機(jī)原理及應(yīng)用 蔡啟仲 第4章 匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩55頁(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)介

1、1第第4 4章章 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)單片機(jī)原理及應(yīng)用2 2 第第4章章 目錄目錄4.1 單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)概述單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)概述 4.1.1 機(jī)器語(yǔ)言、匯編語(yǔ)言和C語(yǔ)言 4.1.2 匯編語(yǔ)言的特點(diǎn)4.2 偽指令偽指令4.3 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式匯編語(yǔ)言程序的基本結(jié)構(gòu)形式 4.3.1 順序程序 4.3.2 分支程序 4.3.3 循環(huán)程序 4.3.4 位操作程序34.4 匯編語(yǔ)言程序設(shè)計(jì)舉例匯編語(yǔ)言程序設(shè)計(jì)舉例 4.4.1 順序程序設(shè)計(jì) 4.4.2分支程序設(shè)計(jì) 4.4.3 循環(huán)程序設(shè)計(jì) 4.4.4 子程序設(shè)計(jì)34n匯編語(yǔ)言的相關(guān)概念、匯編語(yǔ)言程序的基本結(jié)構(gòu)形式、編匯

2、編語(yǔ)言的相關(guān)概念、匯編語(yǔ)言程序的基本結(jié)構(gòu)形式、編寫(xiě)匯編語(yǔ)言程序的基本方法。寫(xiě)匯編語(yǔ)言程序的基本方法。目的:目的:由于匯編語(yǔ)言是面向機(jī)器硬件的語(yǔ)言,掌握匯編語(yǔ)言由于匯編語(yǔ)言是面向機(jī)器硬件的語(yǔ)言,掌握匯編語(yǔ)言 能夠更好的理解單片機(jī)的內(nèi)部結(jié)構(gòu)和工作原理。能夠更好的理解單片機(jī)的內(nèi)部結(jié)構(gòu)和工作原理。內(nèi)容概要內(nèi)容概要454 4.1 .1 單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)概述單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)概述4 4.1.1 .1.1 機(jī)器語(yǔ)言、匯編語(yǔ)言和機(jī)器語(yǔ)言、匯編語(yǔ)言和C C語(yǔ)言語(yǔ)言計(jì)算機(jī)所用的程序設(shè)計(jì)語(yǔ)言可以分為三類(lèi):機(jī)器語(yǔ)言,匯編語(yǔ)言,高級(jí)語(yǔ)言。1 1機(jī)器語(yǔ)言機(jī)器語(yǔ)言機(jī)器語(yǔ)言。也稱(chēng)為機(jī)器碼機(jī)器碼,是一種由二進(jìn)制碼“0

3、 0”、“1 1”組成的、能夠被計(jì)算機(jī)直接識(shí)別和執(zhí)行的語(yǔ)言。用機(jī)器語(yǔ)言表示的程序,又稱(chēng)目標(biāo)程序目標(biāo)程序。單片機(jī)程序設(shè)計(jì)中,不管采用高級(jí)語(yǔ)言還是匯編語(yǔ)言編寫(xiě),最終下載到單片機(jī)芯片的HexHex文件或BinBin文件也都是二進(jìn)制機(jī)器碼。由于二進(jìn)制代碼較為冗長(zhǎng),通常用一位十六進(jìn)制數(shù)來(lái)表示四位二進(jìn)制數(shù),即應(yīng)用十六進(jìn)制十六進(jìn)制表示機(jī)器碼。56 6例如例如,51單片機(jī)控制P1口實(shí)現(xiàn)流水燈效果的某Hex文件,用記事本打開(kāi)該文件,可以看到如下幾行機(jī)器碼:圖圖4-14-1 5151控制控制P1P1口實(shí)現(xiàn)流水燈的機(jī)器碼口實(shí)現(xiàn)流水燈的機(jī)器碼從圖41可以看出,機(jī)器碼用十六進(jìn)制數(shù)表示,但如果不通過(guò)指令表進(jìn)行對(duì)照,難以看

4、出機(jī)器碼與指令對(duì)應(yīng)的關(guān)系,編寫(xiě)、修改和維護(hù)困難,容易出錯(cuò),難以發(fā)現(xiàn)和排除錯(cuò)誤。7 72 2匯編語(yǔ)言匯編語(yǔ)言為了解決機(jī)器語(yǔ)言難以編程和閱讀的難題,應(yīng)用匯編語(yǔ)言來(lái)表示機(jī)器語(yǔ)言,應(yīng)用匯編語(yǔ)言編寫(xiě)程序的每一條指令與機(jī)器碼一一對(duì)應(yīng)。例如,圖41的流水燈機(jī)器碼的匯編程序?yàn)椋?MOV A, #0FEH ;對(duì)累加器A賦值,F(xiàn)EH=1111 1110B,最低位LED亮 START: RL A ;自定義代碼段START,對(duì)A進(jìn)行不帶進(jìn)位Cy的左循環(huán)移位 MOV P1,A ;將A的值送入P1口,點(diǎn)亮某個(gè)引腳的LED LCALL DELAY ;調(diào)用延時(shí)子程序 LJMP START ;跳轉(zhuǎn)回START段,實(shí)現(xiàn)流水燈循環(huán)

5、亮滅的效果 DELAY: MOV R0, #00H ;自定義延時(shí)代碼段,對(duì)寄存器R0賦值0,用于自減延時(shí)DELAY1:MOV R1, #00H ;R1賦值0,用于內(nèi)循環(huán)自減延時(shí) DJNZ R1, $ ;(R1)1R1,(R1)0原地跳轉(zhuǎn),循環(huán)256次 DJNZ R0, DELAY1 ;(R0)1R0,(R0)0轉(zhuǎn)移到DELAY1,循環(huán)256次 RET ;返回主程序 END ;程序結(jié)束8 8用助記符表示的匯編語(yǔ)言比機(jī)器碼容易學(xué)習(xí)和使用。自MCS51單片機(jī)誕生之日起,匯編語(yǔ)言就伴隨著其它發(fā)展并獲得了廣泛應(yīng)用。由于單片機(jī)不能直接識(shí)別和執(zhí)行匯編語(yǔ)言編寫(xiě)的程序,需要將匯編語(yǔ)言源程序轉(zhuǎn)換(翻譯)為二進(jìn)制的

6、機(jī)器碼(目標(biāo)程序),這一轉(zhuǎn)換過(guò)程稱(chēng)為“匯編”,而用于轉(zhuǎn)換的工具稱(chēng)為匯編程序,如圖42所示。9 9其中,源文件是匯編語(yǔ)言編寫(xiě)的文件源文件是匯編語(yǔ)言編寫(xiě)的文件,默認(rèn)后綴名為ASM;匯編程序?yàn)镵eil、IAR等專(zhuān)門(mén)的編譯工具,也稱(chēng)為編譯器;目標(biāo)程序是最終燒寫(xiě)到單片機(jī)芯片的Hex或Bin文件。圖圖4-24-2 源程序、匯編程序、目標(biāo)程序的關(guān)系源程序、匯編程序、目標(biāo)程序的關(guān)系103 3C51C51語(yǔ)言語(yǔ)言匯編語(yǔ)言面向機(jī)器,便于理解和熟悉微處理器的內(nèi)部結(jié)構(gòu),存儲(chǔ)區(qū)域的特點(diǎn)和特殊功能寄存器的功能,指令執(zhí)行過(guò)程的基本工作原理,微處理器應(yīng)用系統(tǒng)電路設(shè)計(jì)等。但是,匯編語(yǔ)言開(kāi)發(fā)周期長(zhǎng)、設(shè)計(jì)成本高,也不易于移植。為此

7、,人們將高級(jí)語(yǔ)言引入微處理器領(lǐng)域。目前基本采用C語(yǔ)言,例如51單片機(jī)的C51,MSP430的C430等。C51易學(xué)易用,成熟穩(wěn)定,性能已經(jīng)接近匯編語(yǔ)言,優(yōu)化后的機(jī)器代碼長(zhǎng)度也能控制在匯編語(yǔ)言的1.21.5倍左右,網(wǎng)上的各種資源豐富,獲得了市場(chǎng)和單片機(jī)愛(ài)好者的廣泛認(rèn)可,成為單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的首選語(yǔ)言。101111當(dāng)然,C51也并不能完全替代匯編語(yǔ)言。在對(duì)時(shí)間和空間要求較高的場(chǎng)合,匯編語(yǔ)言仍然是不可或缺的,例如,在典型的冒泡排序算法中,C51需要1033s,而匯編語(yǔ)言只需要376s,性能的差異依然不小。不少工程師為了保持單片機(jī)系統(tǒng)的最佳性能,采用C51與匯編進(jìn)行混合編程的方法進(jìn)行程序設(shè)計(jì)。另外,

8、即使是高級(jí)語(yǔ)言編寫(xiě)的源程序,經(jīng)過(guò)程序的編譯鏈接,產(chǎn)生絕對(duì)目標(biāo)代碼的Hex文件,對(duì)編譯的Hex文件進(jìn)行反編譯后仍然是以匯編程序的形式出現(xiàn)的。12上面流水燈的Hex文件的反編譯結(jié)果如下:地址標(biāo)號(hào) 匯編程序 指令地址 指令代碼 Q0000: MOV A, #0FEH ;0000 74 FE Q0002: RL A ;0002 23 MOV P1,A ;0003 F5 90 LCALL Q000B ;0005 12 00 0B LJMP Q0002 ;0008 02 00 02 Q000B: MOV R0, #00H ;000B 78 00 Q000D: MOV R1, #00H ;000D 79 0

9、0 DJNZ R1, $ ;000F D9 FE DJNZ R0, Q000D ;0011 D8 FA RET ;0013 22其中第四列為指令代碼,即機(jī)器碼(對(duì)應(yīng)圖4-1)。要真正掌握單片機(jī)技術(shù),應(yīng)該掌握匯編程序。C51請(qǐng)參閱第13章。12134 4.1.2 .1.2 匯編語(yǔ)言的特點(diǎn)匯編語(yǔ)言的特點(diǎn)(1)(1) 匯編語(yǔ)言比C51的學(xué)習(xí)和編程、調(diào)試的難度要大,因此多用 于編寫(xiě)4KB以下、運(yùn)算不太復(fù)雜的小程序。(2)(2) 匯編語(yǔ)言程序占用的存儲(chǔ)空間小,運(yùn)行效率高。只有通過(guò) 匯編語(yǔ)言,才能寫(xiě)出性能最優(yōu)的程序。(3)(3) 面向硬件,能夠直接管理和控制硬件設(shè)備,例如對(duì)I/O接口、 存儲(chǔ)器的訪問(wèn)等。(

10、4)(4) 與單片機(jī)內(nèi)部結(jié)構(gòu)緊密結(jié)合,例如累加器A、寄存器R0等。 掌握匯編語(yǔ)言才能更好的理解內(nèi)部結(jié)構(gòu)和工作原理。(5)(5) 依賴(lài)于機(jī)器硬件,缺乏通用性,程序難以移植。(6)(6) 高級(jí)語(yǔ)言一般用十進(jìn)制編寫(xiě),匯編語(yǔ)言多用十六進(jìn)制來(lái)表 示二進(jìn)制數(shù)。1314144.2 4.2 偽指令偽指令 第3章介紹的每條指令分別對(duì)應(yīng)單片機(jī)能夠執(zhí)行的一個(gè)機(jī)器碼。還有一類(lèi)指令沒(méi)有對(duì)應(yīng)的機(jī)器碼,不生成目標(biāo)程序,也不影響程序的執(zhí)行,僅用于對(duì)匯編過(guò)程進(jìn)行某種控制或操作,這類(lèi)指令稱(chēng)為偽指令。常用的偽指令有8條。15151 1ORGORG ORG用于定義起始地址,也就是緊隨其后的程序段或數(shù)據(jù)塊將被設(shè)置在所規(guī)定的起始地址。O

11、RG為origin(源點(diǎn))的縮寫(xiě)。其格式為: ORG addr16 其中,addr16addr16表示程序存儲(chǔ)器中的一個(gè)16位地址,一般是一個(gè)十六進(jìn)制數(shù),或者是定義好的標(biāo)號(hào)。一個(gè)源程序中可以多次使用ORG指令,以表示不同程序段的起始位置。但是所規(guī)定的地址應(yīng)該按照順序從小到大,不能交叉或重疊。1616例例4141 ORG 1000HSTART:MOV A, 20H ORG 1500H NEXT:MOV R0, #30H當(dāng)使用編譯器匯編完這段程序后,就會(huì)自動(dòng)把“MOV A, 20H”這條指令(雙字節(jié)指令)放置在程序存儲(chǔ)器中的地址為1000H和1001H單元中。START這個(gè)標(biāo)號(hào)所表示的地址就是10

12、00H,而NEXT所在行的指令首地址是1500H。17172 2ENDEND END用于表示程序結(jié)束。整個(gè)源程序中只能有一條END命令,且應(yīng)該位于程序的最后。如果END出現(xiàn)在源程序的中間,則后面的程序?qū)?huì)被編譯器省略。 其格式為: END18183 3EQUEQUEQU用于賦值,equal(等于)的縮寫(xiě),與C語(yǔ)言的#define類(lèi)似,相當(dāng)于“=”。其格式為:常量名 EQU 操作數(shù)/符號(hào)其中,操作數(shù)可以是8位、16位二進(jìn)制數(shù),也可以用十進(jìn)制、十六進(jìn)制表示。符號(hào)為其它的匯編符號(hào)。例例4242 X EQU 50;X等于50,十進(jìn)制 Y EQU 1000H;Y等于1000H,十六進(jìn)制BUTTON2 E

13、QU P1.0;BUTTON2等價(jià)于P1.0編譯器進(jìn)行匯編時(shí),程序中所有的常量X就具有50的值,Y、BUTTON2同理。19194 4DATADATADATA用于賦值。其格式為:變量名 DATA 操作數(shù)/表達(dá)式例例4343 X DATA 2000H;X等于2000H編譯器匯編時(shí),程序中所有的變量X都用2000H代替。DATA的功能與EQU類(lèi)似,但也存在以下區(qū)別:(1)(1)EQUEQU先定義才能使用,而DATA不受限制。也就是說(shuō)EQU定義的是常量,DATA定義變量。(2)(2)EQUEQU可以把一個(gè)匯編符號(hào)賦給一個(gè)字符名,DATA不能。(3)(3)DATADATA可以將一個(gè)表達(dá)式的值賦給變量,

14、而EQU不能。(4)(4)DATADATA通常用于定義數(shù)據(jù)地址。20205 5DBDBDB用于從指定的地址單元開(kāi)始,定義若干單字節(jié)內(nèi)存單元的內(nèi)容。其格式為:標(biāo)號(hào): DB 單字節(jié)操作數(shù)操作數(shù)可以是8位二進(jìn)制、十進(jìn)制、十六進(jìn)制數(shù)值或ASCII碼。例例4444 ORG 2000HDB 3, 41H, 0F7H, BDB “123Ac”編譯器進(jìn)行匯編后,存儲(chǔ)單元的內(nèi)容分別為:(2000H)=3 (2001H)=41H (2002H)=F7H(2003H)=42H (B) (2004H)=31H (1) (2005H)=32H (2)(2006H)=33H (3) (2007H)=41H (A) (20

15、08H)=63H (c)21216 6DWDWDW用于從指定的地址單元開(kāi)始,定義若干雙字節(jié)存儲(chǔ)單元的內(nèi)容。其格式為:標(biāo)號(hào): DW 雙字節(jié)操作數(shù)雙字節(jié)操作數(shù)是16位二進(jìn)制數(shù)值、十進(jìn)制和十六進(jìn)制數(shù)值,或ASCII碼,其中高8位存入低地址字節(jié),低8位存入高地址字節(jié)。如果不足16位,則高位用0填充。例例4545 ORG 2000HTAB: DW 1234H,100,69H編譯器進(jìn)行匯編后,存儲(chǔ)單元的內(nèi)容分別為:(2000H)=12H (2001H)=34H (2002H)=00H(2003H)=64H (100)(2004H)=00H (2005H)=69H22227 7DSDSDS用于從指定的地址單

16、元開(kāi)始,保留若干字節(jié)的存儲(chǔ)單元作為備用。其格式為:標(biāo)號(hào): DS 操作數(shù)例例4646 ORG 0050HDS 06HDB 5AH編譯器匯編后,從0050H開(kāi)始保留6個(gè)字節(jié)的單元給程序備用,也就是占用了0050H0055H。而5AH存放在0056H存儲(chǔ)單元。要注意的是,DB、DW、DS偽指令都只對(duì)程序存儲(chǔ)器起作用,不能對(duì)數(shù)據(jù)存儲(chǔ)器的內(nèi)容進(jìn)行賦值或初始化。23238 8BITBITBIT用于定義位常量,與EQU類(lèi)似。有些編譯器不具備BIT命令時(shí),可以用EQU來(lái)代替BIT。其格式為:常量名 BIT 操作數(shù)/符號(hào)例例4747 flag BIT 20H key BIT P1.1編譯器進(jìn)行匯編后,位地址20

17、H賦值給flag,key作為P1.1使用。24244 4. .3 3 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式匯編語(yǔ)言程序的基本結(jié)構(gòu)形式與高級(jí)語(yǔ)言一樣,匯編語(yǔ)言程序設(shè)計(jì)中廣泛應(yīng)用結(jié)構(gòu)化的程序設(shè)計(jì)方法。采用結(jié)構(gòu)化設(shè)計(jì)的程序。按照結(jié)構(gòu)化程序設(shè)計(jì)的方法,匯編語(yǔ)言程序一般有順序、分支、循環(huán)等幾種結(jié)構(gòu)。三種結(jié)構(gòu)的程序分別稱(chēng)為順序程序、分支程序、循環(huán)程序,如圖4-3所示。圖圖4-34-3 順序程序、分支程序、循環(huán)程序順序程序、分支程序、循環(huán)程序(a) (a) 順序程序順序程序(b) (b) 分支程序分支程序(c) (c) 循環(huán)程序循環(huán)程序25254.3.1 4.3.1 順序程序順序程序 按照指令的順序逐條執(zhí)行指令,也稱(chēng)

18、為簡(jiǎn)單程序或直線程序。按指令的排列順序逐條執(zhí)行,直到全部指令執(zhí)行完畢。順序程序主要使用數(shù)據(jù)傳送指令和數(shù)據(jù)運(yùn)算類(lèi)指令。例例4848 對(duì)寄存器R1、R2、R3中存儲(chǔ)的數(shù)據(jù)進(jìn)行相加,結(jié)果存儲(chǔ)到R4。MOV A, R1 ;R1的數(shù)據(jù)復(fù)制到累加器AADD A, R2 ;A與R2的數(shù)據(jù)相加,結(jié)果存儲(chǔ)在AADDC A, R3 ;A與R3的數(shù)據(jù)進(jìn)行帶進(jìn)位相加,結(jié)果存儲(chǔ)在AMOV R4, A ;將A的數(shù)據(jù)復(fù)制到R426264.3.2 4.3.2 分支程序分支程序 根據(jù)不同條件轉(zhuǎn)向不同的處理程序來(lái)改變程序執(zhí)行的順序,這種結(jié)構(gòu)的程序稱(chēng)為分支程序。分支程序一般是利用條件轉(zhuǎn)移指令來(lái)進(jìn)行判斷,通過(guò)轉(zhuǎn)移指令的組合,可以形成

19、單分支、雙分支、多路分支形式。常用的轉(zhuǎn)移指令有JZ、JNZ、CJNE、JC、JNC、JB、JNB、JBC、DJNZ,多用于正負(fù)數(shù)判斷、位單元狀態(tài)判斷、進(jìn)借位判斷、是否為“0”的判斷、大小判斷等。27274.3.3 4.3.3 循環(huán)程序循環(huán)程序 在一個(gè)程序段要重復(fù)多次運(yùn)行的情況下,可以采用循環(huán)方法設(shè)計(jì)程序。循環(huán)程序主要有5個(gè)部分:(1)(1) 初始化部分:設(shè)置循環(huán)初值,包括循環(huán)變量計(jì)數(shù)、數(shù)據(jù)指針初 值,為循環(huán)作準(zhǔn)備。(2)(2) 循環(huán)處理部分:重復(fù)執(zhí)行的程序段,是循環(huán)程序的主體,稱(chēng)為 循環(huán)體。循環(huán)體可以是單條指令,也可以是復(fù)雜的程序段。(3)(3) 循環(huán)修改。每循環(huán)一次,就要修改循環(huán)次數(shù)、數(shù)據(jù)及

20、地址指針 等。(4)(4) 循環(huán)控制部分:控制循環(huán)的次數(shù),為進(jìn)行下一次循環(huán)修改計(jì)數(shù) 器和指針的值,并檢查循環(huán)次數(shù)是否達(dá)到退出循環(huán)的條件。(5)(5) 循環(huán)結(jié)果處理:分析和存儲(chǔ)結(jié)果。2828循環(huán)可以是單重循環(huán)和多重循環(huán)。如果在循環(huán)程序的循環(huán)體中不再包含循環(huán)程序,即為單重循環(huán);如果在循環(huán)體中還包含有循環(huán)程序,這種現(xiàn)象就稱(chēng)為循環(huán)嵌套,這樣的程序就稱(chēng)為多重循環(huán)程序。在多重循環(huán)中,內(nèi)外循環(huán)不得交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。通常對(duì)循環(huán)初始化只執(zhí)行一次,而對(duì)循環(huán)處理、循環(huán)控制可以執(zhí)行多次。循環(huán)結(jié)構(gòu)可以分為圖44所示的兩種形式:計(jì)數(shù)控制、條件控制。2929圖圖4-44-4 計(jì)數(shù)控制結(jié)構(gòu)和條

21、件控制結(jié)構(gòu)計(jì)數(shù)控制結(jié)構(gòu)和條件控制結(jié)構(gòu)(a) (a) 計(jì)數(shù)控制結(jié)構(gòu)計(jì)數(shù)控制結(jié)構(gòu)(b) (b) 條件控制結(jié)構(gòu)條件控制結(jié)構(gòu)30304.3.4 4.3.4 位操作程序位操作程序 C、C+、Java、C#、VB等主流高級(jí)語(yǔ)言主要面向8位或8位以上的數(shù)據(jù)處理,而檢測(cè)和控制應(yīng)用系統(tǒng)中常常需要對(duì)1位信息進(jìn)行處理,51單片機(jī)提供了用于位操作的指令,位操作的指令主要有MOV(傳送)、CLR(清0)、SETB(置1)、ANL(與)、ORL(或)、CPL(取反)、位單元狀態(tài)的判斷控制指令等。3131 例例4949 單片機(jī)應(yīng)用系統(tǒng)上電和復(fù)位后常常要求測(cè)試單片機(jī)外部擴(kuò)展各部件是否能夠正常工作。編寫(xiě)程序,測(cè)試外部擴(kuò)展RAM

22、的地址為4000H的存儲(chǔ)單元是否損壞。MOV DPTR, #4000H ;設(shè)置要測(cè)試的外部RAM的地址MOV A, #55H ;55H作為測(cè)試數(shù)據(jù)MOV B, A ;(B)=55H,保存測(cè)試數(shù)據(jù)MOVX DPTR, A ;55H寫(xiě)入外部RAM的4000H存儲(chǔ)單元中MOVX A, DPTR ;寫(xiě)入數(shù)據(jù)55H后,再讀回?cái)?shù)據(jù)AXRL A, B ;A、B各位進(jìn)行異或,比較寫(xiě)入和讀回 ;的數(shù)據(jù)是否一致JNZ BAD ;如果(A)(B),RAM可能已損壞,跳轉(zhuǎn) ;到BAD程序段3232位操作可以直接對(duì)P0、P1、P2、P3等端口的每個(gè)引腳進(jìn)行單獨(dú)控制,例如SETB P1.0將引腳P1.0置高電平,而CPL

23、 P1.0可以將P1.0輸出的電平取反。位操作能夠?qū)?nèi)部RAM的20H2FH字節(jié)單元中的每個(gè)位單元,以及對(duì)特殊功能寄存器中能夠進(jìn)行位尋址的位單元進(jìn)行單獨(dú)控制。例例410410CLR 20H.3 ;對(duì)20 H.3 (位地址為03H)清零 MOV C, 40H ;將位地址為40H單元的內(nèi)容送入進(jìn)位位CYSETB RS0 CLR RS1 ;選擇當(dāng)前寄存器組為第一組(參見(jiàn)表22)33334 4. .4 4 匯編語(yǔ)言程序設(shè)計(jì)舉例匯編語(yǔ)言程序設(shè)計(jì)舉例匯編語(yǔ)言程序設(shè)計(jì)的一般步驟有:任務(wù)分析,確定算法,算法優(yōu)化,設(shè)計(jì)程序流程圖,分配字節(jié)單元和位單元及有關(guān)I/O端口,擴(kuò)展部件的端口地址,編寫(xiě)程序并加上注釋?zhuān)抡?/p>

24、調(diào)試,實(shí)物調(diào)試。在使用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)的時(shí)候,要注意注意3 3個(gè)問(wèn)題個(gè)問(wèn)題:模模塊化設(shè)計(jì)塊化設(shè)計(jì);循環(huán)程序循環(huán)程序;子程序子程序。模塊化設(shè)計(jì)就是將一個(gè)復(fù)雜的任務(wù)劃分為若干個(gè)模塊(程序段),以提高程序的可讀性、可靠性,使得程序?qū)哟胃鼮榍逦Qh(huán)程序能夠大大減少對(duì)存儲(chǔ)空間的占用。子程序可以增加程序段的可重用性,簡(jiǎn)化程序結(jié)構(gòu)。34344.4.1 4.4.1 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 順序結(jié)構(gòu)程序是一種最簡(jiǎn)單、最基本的程序,無(wú)分支,按照程序編寫(xiě)的順序依次執(zhí)行。 例例411411 編寫(xiě)程序,將外部RAM的8000H單元的內(nèi)容傳輸?shù)?FFFH單元。分析:51單片機(jī)外部擴(kuò)展的存儲(chǔ)器或部件與單片機(jī)內(nèi)部寄存

25、器 或RAM之間的數(shù)據(jù)傳送,必須通過(guò)累加器A來(lái)實(shí)現(xiàn),外 部擴(kuò)展的存儲(chǔ)器的存儲(chǔ)單元或部件相互之間的數(shù)據(jù)傳輸 也是如此。編程時(shí),需要注意對(duì)16位地址指針DPTR的正 確設(shè)置。3535 ORG 0000H LJMP MAIN ;跳轉(zhuǎn)至主程序執(zhí)行, ;避開(kāi)中斷服務(wù)程序入口地址 ORG 0030H MAIN:MOV DPTR, #8000H ;16位地址值8000HDPTR MOVX A, DPTR ;存儲(chǔ)單元(8000H)A MOV DPTR, #7FFFH ;地址指針DPTR指向7FFFH存儲(chǔ)單元 MOVX DPTR, A ;A中的內(nèi)容傳輸給7FFFH單元 SJMP $ END3636 例例4124

26、12 設(shè)某一變量的數(shù)據(jù)保存在片內(nèi)RAM的20H單元中,取值范圍為00H09H,編寫(xiě)查表程序,查出變量的平方值,并存入片內(nèi)RAM的21H單元。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV DPTR, #TAB ;平方值表的起始地址值DPTR MOV A, 20H ;需要求平方的值(20H)A MOVC A, A+DPTR ;(A)+(DPTR)組成平方值單元地址, ;單元內(nèi)容A MOV 21H, A ;查表得到的平方值21H SJMP $ ;無(wú)限循環(huán) TAB: DB 0,1,4,9,16,25,36,49,64,81 ;00H09H的十進(jìn)制數(shù)平方值表 END3

27、737查表查表就是根據(jù)自變量自變量x x,在表格中找表格中找y y,使y=f(x)y=f(x)。x一般為連續(xù)變化的整數(shù),將對(duì)應(yīng)的y放置在一個(gè)線性表中,在需要的時(shí)候通過(guò)查表就能快速獲取結(jié)果。查表方法廣泛應(yīng)用于顯示、打印、數(shù)據(jù)轉(zhuǎn)換,能夠極大地加快程序執(zhí)行的速度。例412的程序中,數(shù)據(jù)指針DPTR的地址值為T(mén)AB,即表格中存儲(chǔ)數(shù)據(jù)0的單元地址值,指令SJMP $是一條空循環(huán)指令,單片機(jī)未作任何實(shí)質(zhì)性工作,處于等待狀態(tài),該指令在編寫(xiě)有中斷服務(wù)程序的主程序時(shí)是一條經(jīng)常被使用的指令Q38384.4.2 4.4.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 分支程序的結(jié)構(gòu)有兩種:雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)(散轉(zhuǎn)分支結(jié)構(gòu))。圖圖

28、4-54-5 分支程序結(jié)構(gòu)分支程序結(jié)構(gòu)(a) (a) 雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)(b) (b) 多分支結(jié)構(gòu)多分支結(jié)構(gòu)3939例例413413 設(shè)變量x以無(wú)符號(hào)數(shù)的形式存放在內(nèi)部RAM的30H單元,變量y與x有如下關(guān)系:根據(jù)x的取值求出y,并將其存入內(nèi)部RAM的31H單元。 0FH 0AH= 0AH =0AH 01H 0AH,Cy0; ;如果(A)0AH,則0FHA SJMP RESULT XIAOYU: MOV A, #01H ;因?yàn)?A)=x0AH,則01HA RESULT: MOV 31H, A ;31H(A) SJMP $ END注意有兩條SJMP RESULT,否則31H中內(nèi)容都會(huì)是0AH。

29、4141例413是用條件轉(zhuǎn)移指令實(shí)現(xiàn)分支,下面介紹利用間接轉(zhuǎn)移指令JMP來(lái)實(shí)現(xiàn)多分支程序轉(zhuǎn)移(稱(chēng)為散轉(zhuǎn)程序),通常有兩種設(shè)計(jì)方法。(1) (1) 查轉(zhuǎn)移地址表,用轉(zhuǎn)移地址構(gòu)成散轉(zhuǎn)表,將表中的內(nèi)容作為轉(zhuǎn)移的目標(biāo)地址。(2)(2) 查轉(zhuǎn)移指令表,用轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令構(gòu)成散轉(zhuǎn)表,判斷條件后,轉(zhuǎn)到表中指令執(zhí)行。4242例例414414 試編寫(xiě)根據(jù)R7的內(nèi)容轉(zhuǎn)向?qū)?yīng)的入口地址的程序,R7的內(nèi)容為0n(n127),處理程序的入口地址為PR0PRn。分析分析:將PR0PRn的入口地址值列在一個(gè)表格中,每一個(gè)地址為16位地址值,占兩個(gè)單元。假設(shè)PR0PRn入口地址表格的首地址為T(mén)AB,則PR0的高8位地址值在表格的首地址中,低8位地址值在首地址TAB+1的存儲(chǔ)單元中;而PRx在表中的偏移量為2x,因此將R7的內(nèi)容乘以2即得到PRx在表中的偏移地址,從偏移地址2x和2x+1兩個(gè)單元分別取出PRx的高8位地址和低8位地址送至DPTR寄存器,將A清0,用JMP A+DPTR指令即轉(zhuǎn)移到PRx入口地址。4343 利用轉(zhuǎn)移地址表實(shí)現(xiàn)程序的轉(zhuǎn)移 PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H

溫馨提示

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