版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、3.4 匯編語言程序設(shè)計基礎(chǔ),3.4.1 程序設(shè)計語言概述 3.4.2 匯編語言程序設(shè)計的特點及偽指令 3.4.3 單片機(jī)匯編語言程序設(shè)計 3.4.3.1 順序結(jié)構(gòu)程序設(shè)計 3.4.3.2 分支程序設(shè)計 3.4.3.3 散轉(zhuǎn)程序設(shè)計 3.4.3.5 查表程序設(shè)計 3.4.3.6 子程序設(shè)計 3.4.4 單片機(jī)匯編語言程序設(shè)計舉例,3.4.1 程序設(shè)計語言概述 3.4.1.1
2、匯編語言的優(yōu)點 3.4.1.2 匯編語言程序設(shè)計的過程 3.4.1.3 程序質(zhì)量,3.4.2 匯編語言程序設(shè)計的特點及偽指令,3.4.2.1 匯編語言程序的特點,[標(biāo)號:] 操作碼 [操作數(shù)1,操作數(shù)2,操作數(shù)3] [;注釋]方括符[ ]表示可選項。標(biāo)號代表指令所在地址,1-8個字母/數(shù)字,字母開頭,“:”結(jié)尾。操作碼就是指令功能助記符,指令實體。操作數(shù)是指令操作的對象。分為目的操作
3、數(shù)和源操作數(shù)。注釋是對該指令的解釋和說明,是指令的非執(zhí)行部分,可省略,前面必須加“;”。,3.4.2.2 偽指令 匯編語言源程序是由匯編語句組成的,一般情況下,匯 編語言語句可分為指令性語句和指示性語句。指令性語句(即匯編指令) 指令性語句是進(jìn)行匯編語言程序設(shè)計的可執(zhí)行語句,每條指令都產(chǎn)生相應(yīng)的機(jī)器語言的目標(biāo)代碼。源程序的主要功能是由指令性語句去完成的。指示性語句(即偽指令),偽指令 偽
4、指令是控制匯編過程的一些命令,是程序員通知匯編程序在進(jìn)行匯編時的一些指示。沒有對應(yīng)的機(jī)器碼,不產(chǎn)生目標(biāo)代碼程序,不影響程序的執(zhí)行。1).偽指令主要用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的地址或為中間運算結(jié)果保留一部分存儲空間以及表示源程序結(jié)束等等。2).偽指令還可用來對符號﹑標(biāo)號賦值。 不同版本匯編語言,偽指令可能有所不同,但基本用法是相似的。,1) 設(shè)置目標(biāo)程序起始地址偽指令ORG 格式: [標(biāo)
5、號:] ORG 地址 功能:規(guī)定其后面的目標(biāo)程序或數(shù)據(jù)塊的起始地址。 偽指令ORG放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是ORG后面給出的地址。 例如: ORG 1000H START:MOV A, #34H …,2) 結(jié)束匯編偽指令END 格式: [標(biāo)號
6、:] END 功能: END是匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。 在END以后所寫的指令,匯編程序都不予處理。 一個源程序只能有一個END命令。,3) 定義字節(jié)偽指令DB 格式: [標(biāo)號:] DB 字節(jié)常數(shù)或字符 功能:從指定地址單元開始存放若干個字節(jié)的數(shù)據(jù)或字符。 字符若用引號括起來則表示ASCII碼。 例如: ORG 2000H TAB1
7、: DB 30H,8AH,7FH,73 DB '5','A', ‘YES',4) 定義字偽指令DW 格式: [標(biāo)號:] DW 16位數(shù)據(jù)表 功能: DW偽指令告訴匯編程序從指定的地址單元開始定義若干個16位數(shù)據(jù)。 對于MCS-51單片機(jī)系統(tǒng),16位數(shù)據(jù)的高8位存入低地址單元,低8位存入高地址單元。例如: ORG 150
8、0H TAB2: DW 1234H,80H, 'AB'匯編以后,(1500H)=12H,(1501H)=34H, (1502H)=00H,(1503H)=80H, (1504H)=41H,(1505H)=42H,5) 賦值偽指令EQU 格式: 字符名稱 EQU 賦值項 功能:將EQU右邊的值賦予EQU左面用戶定義的符號。
9、賦值項可以是常數(shù)、地址、標(biāo)號或表達(dá)式。 例如:TEMP EQU R2 PA8155 EQU 8001H 匯編后TEMP 對應(yīng)寄存器R2,PA8155值為8001H EQU定義的符號必須先定義后使用,且在同一個源程序中, 同一個標(biāo)號只能賦值一次,該語句通常放在程序開頭。,6) 位地址定義偽指令BIT格式: 字符名稱 BIT 位地址功能: 將位地址賦予字符名稱。 經(jīng)賦值后可用
10、字符名稱代替位地址。其中,位地址可以是絕對地址,也可以是符號地址(即位符號名稱)。例如:PLG BIT F0AI BIT P1.0 經(jīng)以上偽指令定義后,在程序中就可以把FLG和AI作為位地址來使用。,補(bǔ)充: 7) 定義標(biāo)號值偽指令DL 格式: 字符名稱 DL 表達(dá)式 功能:DL命令將數(shù)據(jù)地址或代碼地址賦予規(guī)定的字符名稱。 例如:COUNT DL 1000H
11、 COUNT DL COUNT+1 DL偽指令常用來定義數(shù)據(jù)地址。,補(bǔ)充: 8) 定義存儲空間偽指令DS 格式: [標(biāo)號:] DS 表達(dá)式 功能:從指定地址開始,保留若干個字節(jié)的內(nèi)存空間,供程序運行使用。 保留的字節(jié)單元數(shù)由表達(dá)式的值決定。 例如: ORG 2000H DS 05H DB 10H,20H 匯編后從2000H開始,
12、預(yù)留5個字節(jié)的內(nèi)存單元,然后從2005H開始,按照下一條DB指令賦值,即(2005H)=10H,(2006H)=20H。 對MCS-51來說,DB、DW、DS只能對程序存儲器使用。,補(bǔ)充: 9) 數(shù)據(jù)地址賦值偽指令DATA 格 式: 字符名稱 DATA 表達(dá)式 功能:將表達(dá)式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱。 DATA與EQU偽指令的功能類似,但也有區(qū)別: DATA定義的字符名稱可以先
13、使用后定義,EQU定義的字符名稱必須先定義后使用。 DATA偽指令可以放在源程序的開頭或結(jié)尾,也可以放在程序的其他位置,EQU偽指令通常放在程序開頭。,3.4.3 單片機(jī)匯編語言程序設(shè)計,,3.4.3.1 順序結(jié)構(gòu)程序設(shè)計 順序結(jié)構(gòu),是最簡單、最基本的程序結(jié)構(gòu),其特點是按指令的排列順序一條條地執(zhí)行,直到全部指令執(zhí)行完畢為止。 往往用來解決一些簡單的算術(shù)及邏輯運算問題,主要用數(shù)據(jù)傳送指令和數(shù)據(jù)運算指
14、令實現(xiàn)。,【例1】 :設(shè)有16位二進(jìn)制數(shù)存放在 R0,R1中(R0存放高位,R1存放低位),試編寫實現(xiàn)16位二進(jìn)制數(shù)的:“取反加1”操作的程序。程序如下: ORG 1000H MOV A,R1 CPL A ADD A,#01H MOV R1,A MOV A,R0 CPL A ADDC A,#00H
15、 MOV R0,A END,3.4.3.2 分支程序設(shè)計,分支結(jié)構(gòu)程序可根據(jù)程序要求無條件或有條件地改變程序執(zhí)行的順序,選擇新的程序流向。 編寫分支結(jié)構(gòu)程序主要在于正確使用轉(zhuǎn)移指令,即無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令。 根據(jù)分支多少,將分支程序結(jié)構(gòu)分為單分支(即兩分支)結(jié)構(gòu)和多分支結(jié)構(gòu)。 單分支常用條件轉(zhuǎn)移指令實現(xiàn)。 多分支,在MCS-51中,利用“JMP @A+DPTR”指令可以實現(xiàn)(可實現(xiàn)256分支)
16、,為菜單程序設(shè)計提供了方便。,圖 3.4.1 分支結(jié)構(gòu)框圖(a) 單分支流程; (b) 多分支流程,【例2】 :設(shè)a存放在累加器A中,b存放在寄存器B中,要求按下式計算Y值,并將結(jié)果Y存于累加器A中,試編寫程序。 a-b (a≥0) Y =
17、 a+b (a < 0) ORG 1000H BRMPNA:JB ACC.7,PLUS CLR C SUBB A,B SJMP BRDONE PLUS: ADD A,B BRDONE : SJMP BRDONE END,3.4.3.3 散轉(zhuǎn)程序設(shè)計,散轉(zhuǎn)程序是分支程序的一種,它可根據(jù)運算結(jié)
18、果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。 MCS-51指令系統(tǒng)中有一條跳轉(zhuǎn)指令JMP @A+DPTR,用它可以很容易地實現(xiàn)散轉(zhuǎn)功能。該指令把累加器的8位無符號數(shù)與16 位數(shù)據(jù)指針的內(nèi)容相加,并把相加的結(jié)果裝入程序計數(shù)器PC,控制程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行。 此指令的特點在于,轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時預(yù)先確定的,而是在程序運行過程中動態(tài)地確定的。目標(biāo)地址是以數(shù)據(jù)指針DPTR的內(nèi)容為起始的256字節(jié)范圍內(nèi)的指定地址,即由 DP
19、TR的內(nèi)容決定分支轉(zhuǎn)移程序的首地址,由累加器A的內(nèi)容來動態(tài)選擇其中的某一個分支轉(zhuǎn)移程序。,在程序設(shè)計過程中,常常遇到反復(fù)執(zhí)行某一段程序的情況,這種情況下采用循環(huán)程序結(jié)構(gòu),可以縮短程序代碼的長度,提高程序的質(zhì)量和運行效率。循環(huán)程序一般由四個主要部分組成: 初始化部分: 為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。 處理部分: 為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實體,也是循環(huán)程序的主體。 循環(huán)控制部分:
20、 這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束, 符合結(jié)束條件時,跳出循環(huán)。 結(jié)束部分: 這部分主要是對循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。,3.4.3.4 循環(huán)程序設(shè)計,循環(huán)程序的這四個部分,流程有兩種情況,如圖4-2所示。,圖3-4- 2 循環(huán)結(jié)構(gòu)程序流程圖,【例3】:51單片機(jī)晶振為6MHz,分析下列循環(huán)進(jìn)行了多少次?下面程序運行共需要多長時間? MOV R7,#00H ; 1機(jī)器
21、周期 RYCL:NOP ; 1機(jī)器周期 NOP ; 1機(jī)器周期 NOP ; 1機(jī)器周期 DJNZ R7,RYCL ; 2機(jī)器周期 RET ; 2機(jī)器周期 程序運行共需要機(jī)器周期=1+5*256+2=1283 1機(jī)
22、器周期=12/6M=2us 1283*2us=2566us,3.4.3.5 查表程序設(shè)計,查表程序是一種常用程序,它廣泛使用于LED顯示控制、 打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計算、轉(zhuǎn)換等功能程序中, 這類程序具有簡單、執(zhí)行速度快等特點。 查表, 首先要求建立一個表格。表格數(shù)據(jù)一般應(yīng)存放在程序存儲器中,在編程時可以很方便地通過DB或DW偽指令實現(xiàn)。然后,根據(jù)自變量x(可以為規(guī)則變量或非規(guī)則變量),通過查表指令,在表
23、格中查找與其相對應(yīng)的值y(可以是單字節(jié)、多字節(jié)等情況)。 MCS – 51具有很強(qiáng)的查表功能,其查表指令有如下兩條: MOVC A, @A+PC MOVC A, @A+DPTR,【例3】:設(shè)有一個巡回檢測報警裝置, 需對16路輸入進(jìn)行控制, 每路有一個額定的最大值, 是雙字節(jié)數(shù)。當(dāng)檢測量大于該路對應(yīng)的最大值時, 就越限報警。假設(shè) R2 為保存檢測路數(shù)的寄存器, 將其對應(yīng)的最大額定值存放于31H和32H單元中。,
24、查找最大額定值的程序如下: FMAX: MOV A, R2 ADD A, R2 ;表中一個額定值為2個字節(jié) MOV 31H, A MOV DPTR, #TAB ;表首址 MOVC A, @A+DPTR ;查表讀取第一個字節(jié),XCH A, 31H ;第一個字節(jié)內(nèi)容存入31H IN
25、C DPTR MOVC A, @A+DPTR ;查表讀取第二個字節(jié) MOV 32H, A ;第二字節(jié)的內(nèi)容存入32H ORG 2000H TAB: DW 1230H, 1450H, 1020H,... DW 2230H, 2440H, 1356H,...,3.4.3.6 子程序設(shè)計,子程序的概念 在程序設(shè)計的實踐中,經(jīng)常會遇到在不同的程序中或
26、在同一程序不同的地方,要求實現(xiàn)某些相同的操作,為了簡化程序設(shè)計、縮短程序設(shè)計的周期、節(jié)省內(nèi)存空間,通常把這些基本操作編寫為獨立的、標(biāo)準(zhǔn)化的通用程序段, 以供不同程序或同一程序反復(fù)調(diào)用,這些獨立的程序段稱為子程序。 子程序調(diào)用 主程序?qū)ψ映绦虻恼{(diào)用是通過調(diào)用指令A(yù)CALL或LCALL實現(xiàn)的。子程序的首址必須有地址標(biāo)號以供調(diào)用指令尋址。 子程序執(zhí)行結(jié)束后必須返回主程序,返回指令為RET。,參數(shù)傳遞 為使子程序具有通
27、用性,子程序處理過程中用到的數(shù)據(jù)都由主程序提供,主程序在調(diào)用子程序時必須將具體的數(shù)據(jù)傳遞給子程序,這些數(shù)據(jù)稱為入口參數(shù)。 另一方面,子程序的某些執(zhí)行結(jié)果也必須送回到主程序,供主程序使用,這些結(jié)果數(shù)據(jù)稱為出口參數(shù)。參數(shù)傳遞的方法通常有: 寄存器或累加器傳遞 寄存器間址傳遞 堆棧傳遞,MCS-51程序總體結(jié)構(gòu) MCS-51匯編語言源程序一般由主程序、完成特定操作的子程序(可能不止一個)及相應(yīng)功能的中斷服務(wù)程序等
28、部分組成,結(jié)構(gòu)如下:;----------程序頭(即定義變量和等值符號)---------SCLBIT P1.2;定義SCL位變量ByteConDATA 30H ;定義字節(jié)變量ByteCon……,3.4.4 單片機(jī)匯編語言程序設(shè)計舉例,補(bǔ)充:,;------------------程序區(qū)------------------------ ORG 0000H
29、 LJMP Main;------------------中斷矢量區(qū)----------------- ORG 0003H LJMP INT0 ……;------------------主程序--------------------- ORG yyyy ;其中yyyy就是主程序代碼存放區(qū)的首地址Main:MOV SP, #5FH ;
30、初始化有關(guān)寄存器,如設(shè)置堆棧指針SP、選擇 ;工作寄存器組、初始化中斷控制寄存器等 …… ; 主程序?qū)嶓w,具體指令由程序功能決定 LCALL SUB1 ; 調(diào)用子程序1,其中SUB1為子程序名 ……,;------------------子程序結(jié)構(gòu)------------------------ ORG zzzz
31、 ;其中zzzz就是子程序代碼存放區(qū)的首地址, ;可以不用ORG指令,直接將子程序存放主程序后SUB1:PUSH PSWPUSH Acc ;通過PUSH指令保護(hù)子程序中用到的有關(guān)寄存器, ;如Acc、PSW等,即保護(hù)現(xiàn)場?!?;子程序?qū)嶓w,具體指令由程序功能決定POP AccPOP PSW ;恢復(fù)現(xiàn)場RET ;子程序最后一
32、條指令,使子程序指令運行結(jié)束 ;后,返回主程序斷點,;----------中斷服務(wù)程序結(jié)構(gòu)------------------------ ORG kkkk;其中kkkk就是中斷程序代碼存放區(qū)的首地址PUSH PSWPUSH Acc;保護(hù)現(xiàn)場。 ……;中斷服務(wù)程序?qū)嶓w,具體指令由程序功能決定POP AccPOP PSW;恢復(fù)現(xiàn)場CLR TI ;清除中斷標(biāo)志(在MC
33、S-51中,對于電平觸發(fā)的 ;外中斷INT0和INT1、串行接收及發(fā)送中斷RI、 ;TI等,不自動清除,需要通過CLR指令清除。RETI;中斷服務(wù)程序最后一條指令,返回主程序斷點;----------匯編結(jié)束------------------------END,例:定時程序設(shè)計 在單片機(jī)的控制應(yīng)用中,常有定時的需要,如定時中斷、定時檢測和定時掃描等。定時功能除了可以使
34、用定時器/計數(shù)器實現(xiàn)之外,還可以使用軟件定時程序來完成。 定時程序是典型的循環(huán)程序,它可以通過執(zhí)行一個具有固定延遲時間的循環(huán)體來實現(xiàn)延時。利用單循環(huán)實現(xiàn)短定時 DL: MOV R5,#TIME LOOP: NOP NOP DJNZ R5,LOOP RET設(shè)晶振頻率為6MHz,則這個程序的最長定時時間為:256×8us,利用多重循環(huán)
35、實現(xiàn)較長時間定時 多重循環(huán),即在一個循環(huán)體中又包含了其它的循環(huán),是實現(xiàn)延時程序的常用方法。 【例2】設(shè)晶振頻率為12MHz,設(shè)計延遲時間為100ms的子程序。 使用“DJNZ”指令實現(xiàn)延遲,晶振頻率為12MHz,則一個機(jī)器周期為1us,執(zhí)行一條DJNZ Rn,rel的指令的時間為兩個機(jī)器周期即2μs。即使指定寄存器或存儲單元初值為FFH,減到0的延遲時間也只有256×2μs
36、,遠(yuǎn)小于所需的延遲時間,因此需要雙循環(huán)結(jié)構(gòu)。 對于雙循環(huán)結(jié)構(gòu),在知道系統(tǒng)的晶振頻率之后,延時時間主要與兩個因素有關(guān): 1)內(nèi)循環(huán)中指令的執(zhí)行時間; 2)外循環(huán)時間常數(shù)(內(nèi)循環(huán)的循環(huán)次數(shù))的設(shè)置。,; ***********延遲100 ms子程序**************; 子程序名稱:Delay100 Delay100: PUSH PSW CLR
37、 RS0 SETB RS1 MOV R7,#0C7H LOOP1: MOV R6,#0FAHLOOP2: DJNZ R6, LOOP2 ; DJNZ指令執(zhí)行時間為2個機(jī)器周期,而R6初值 ;為FAH(即250),則R6減到0,需500us。 DJNZ R7, LOOP1 ; 重裝R6初值指令及
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 匯編語言程序設(shè)計
- 匯編語言程序設(shè)計
- 匯編語言程序設(shè)計前言
- 匯編語言程序設(shè)計課后答案
- 實驗一 匯編語言程序設(shè)計
- 匯編語言程序設(shè)計競賽報告
- 匯編語言程序設(shè)計習(xí)題-答案
- 匯編語言程序設(shè)計課后答案
- 匯編語言程序設(shè)計課程教案
- 匯編語言程序設(shè)計習(xí)題答案
- 匯編語言程序設(shè)計課后答案
- 匯編語言程序設(shè)計-課程設(shè)計
- 匯編語言程序設(shè)計課程設(shè)計
- 匯編語言程序設(shè)計實驗報告-循環(huán)程序設(shè)計
- 匯編語言程序設(shè)計指導(dǎo)書
- 《匯編語言程序設(shè)計》教學(xué)大綱
- 匯編語言程序設(shè)計試卷樣例
- ch11-高級匯編語言程序設(shè)計
- 匯編語言程序設(shè)計試題及答案合集
- 匯編語言程序設(shè)計的環(huán)境及步驟
評論
0/150
提交評論