版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第4章 匯編語言程序設(shè)計,教學(xué)目標(biāo) 4.1 計算機編程語言概述 4.2 匯編語言程序設(shè)計基本概念 4.3 匯編語言程序設(shè)計 4.4 實用程序舉例 4.5 實訓(xùn)指導(dǎo) 本章小結(jié) 思考題與習(xí)題,教學(xué)目標(biāo),通過本章教學(xué),要求達(dá)到以下目標(biāo): 1. 熟悉匯編語言的語句結(jié)構(gòu); 2. 了解手工匯編,計算偏移量及轉(zhuǎn)移地址的 方法; 3. 了解程序設(shè)計的步驟,會畫程序流程圖; 4. 掌握順序程序、分支程序、循環(huán)程序等基 本程序的編制方法,重點掌握分支、循環(huán) 程序中的一些典型和常用子程序的編制方法。,4.1 計算機編程語言概述,4.1.1 機器語言 機器語言就是用二進(jìn)制編碼表示每條指令。因為計算機只能識別二進(jìn)制數(shù),
2、所以計算機能夠直接執(zhí)行用機器語言編出的機器碼程序。不同種類的計算機,由于其內(nèi)部結(jié)構(gòu)不完全相同,它的機器碼指令也不一定相同。,4.1.2 匯編語言 匯編語言是符號化的機器語言。它用一些容易理解和記憶的符號代替機器碼指令,因此又把匯編語言稱為助記符語言,也就是說助記符指令與機器碼指令是一一對應(yīng)的。匯編語言同機器語言一樣,不同結(jié)構(gòu)的計算機,它的匯編指令也不相同。例如,要求“8+7”的結(jié)果,用AT89C51匯編語言可寫成: MOV A,#08H ADD A,#07H,對比機器碼,匯編語言克服了機器語言的缺點,方便了用戶記憶指令和編寫程序,但用匯編語言編寫的源程序畢竟不是計算機能直接識別的機器碼,需用匯
3、編程序“翻譯”成機器碼后方可執(zhí)行。 采用匯編語言編寫程序,可以直接訪問和操作單片機中的寄存器及存儲器單元,對數(shù)據(jù)的處理表述的非常具體。因此,在計算機實時測試和控制領(lǐng)域中得到了廣泛應(yīng)用。,4.1.3 高級語言 高級語言是接近自然語言和數(shù)學(xué)語言的算法語言,具有直觀、通用等特點。相對于高級語言,機器語言和匯編語言屬于低級語言。用低級語言編寫程序需要完全了解CPU硬件結(jié)構(gòu),對程序設(shè)計人員要求較高,且程序不能移植。,4.2 匯編語言程序設(shè)計基本概念,4.2.1 匯編語言格式 匯編語言直接面向機器,它的格式因機器不同而不同。我們先看一段用AT89C51指令編寫的匯編程序。,例4.1 將40H、41H兩個單
4、元中的大數(shù)送入 A中。 MOV A,40H CJNE A,41H,BIG BIG: JNC OVER ;40H單元值大則結(jié)束 MOV A,41H ;41H單元值小則送入 ;累加器A中 OVER: RET,由上例可見,AT89C51單片機匯編語言 指令格式如下: 標(biāo)號: 操作碼 操作數(shù) ;注釋 其中 的部分為可選項,操作碼必不可少! (1) 標(biāo)號是表示該指令位置的符號地址。 (2) 操作碼指出了指令所要實現(xiàn)的操作功能。,(3) 操作數(shù)指出了參與操作的數(shù)據(jù)來源(源 操作數(shù)) 、和操作結(jié)果存放的目的單元 (目的操作數(shù))。 (4) 注釋是對一條指令或一段程序的解釋和說 明,目的是方便程序的閱讀。,4.
5、2.2 程序設(shè)計的一般步驟,1. 完成任務(wù)分析,(1)功能要求 (2) 技術(shù)指標(biāo) (3)硬件資源和工作環(huán)境,2. 進(jìn)行算法優(yōu)化,(1) 速度 (2) 內(nèi)存使用,3. 程序總體設(shè)計及繪制流程圖 清晰的流程圖是正確編制應(yīng)用程序的基礎(chǔ) 和條件。流程圖是用各種圖形、符號、有向線 段(如表4.1所示)來直觀地表示程序執(zhí)行的步 驟和順序。它可使人們通過流程圖的基本線 索,對全局有完整的了解。,(1)總流程圖: 程序的邏輯結(jié)構(gòu),各程序模塊 間的相互關(guān)系。 (2)局部流程圖: 程序模塊的具體實施細(xì)節(jié)。,表4.1 常用流程圖符號及說明,4. 編寫源程序,根據(jù)流程圖各部分功能,用匯編語言指令實現(xiàn)流程圖的每一個具體
6、步驟,也即編寫出具體的匯編語言源程序。所編寫的源程序要求簡單明了,層次清晰。 5. 調(diào)試、測試程序 調(diào)試是利用仿真器等開發(fā)工具,采用單步、設(shè)斷點、連續(xù)運行等方法排除程序中的錯誤,完善程序的功能。,4.2.3 程序編制的方法和技巧,1. 采用模塊化程序設(shè)計方法,(1) 主程序、子程序,如:發(fā)送、接收、 延時、打印和顯示等。,(2) 模塊化的優(yōu)點, 便于程序設(shè)計和調(diào)試; 便于程序優(yōu)化和分工; 提高程序閱讀性和可靠性。,2. 盡量采用循環(huán)結(jié)構(gòu)和子程序,(1) 長度減少、內(nèi)存空間減少;,(2) 避免 “死循環(huán),注意循環(huán)初值和結(jié)束條件;,(3) 子程序用到的寄存器內(nèi)容應(yīng)壓棧保護(hù), 并注意堆棧操作的壓入和
7、彈出的平衡;,(4) 中斷處理子程序除了要保護(hù)程序中用到的 寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。,1手工匯編 手工匯編是通過手工方式查指令編碼表,逐個把助記符指令“翻譯”成機器碼的過程。 2機器匯編 機器匯編是在機器上使用匯編程序自動地進(jìn)行源程序的匯編,最后得到機器碼表示的目標(biāo)程序。匯編與反匯編過程如圖4.1所示。,4.2.4 源程序的匯編,匯編(匯編程序) 源程序 目標(biāo)碼 (匯編語言) (機器語言) 反匯編(匯編程序),圖4.1 匯編和反匯編示意圖,4.3 匯編語言程序設(shè)計,4.3.1 順序程序設(shè)計 順序程序指無分支、無循環(huán)結(jié)構(gòu)的程序。其設(shè)計是最基本的程序設(shè)計。它是按照指令排列的先后順序依次執(zhí)行,
8、每條指令都必須執(zhí)行,且只執(zhí)行一遍。順序程序設(shè)計一般比較單一、簡單,常常作為復(fù)雜程序的一部分。,1. 數(shù)據(jù)傳送 例4.2 內(nèi)部RAM的2AH2EH單元中存儲的數(shù)據(jù)如圖4.2所示。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。,圖4.2 數(shù)據(jù)傳送示意圖,方法1: MOV A,2EH ;2字節(jié),1個機器周期 MOV 2EH,2DH ;3字節(jié),2個機器周期 MOV 2DH,2CH ;3字節(jié),2個機器周期 MOV 2CH,2BH ;3字節(jié),2個機器周期 MOV 2BH,#00H ;3字節(jié),2個機器周期,方法2: CLR A ;1字節(jié),1個機器周期 XCH A,2BH ;2字節(jié),1個機器周期 XCH A,2CH ;2
9、字節(jié),1個機器周期 XCH A,2DH ;2字節(jié),1個機器周期 XCH A,2EH ;2字節(jié),1個機器周期,方法1:14個字節(jié),9個機器周期; 方法2:9個字節(jié),5個機器周期。,2. 查表程序 例4.3 在片內(nèi)RAM的20H單元有一變量,其取值范圍為00H05H。試編程,根據(jù)變量值求其平方值,并存入片內(nèi)RAM的21H單元。程序如下: ORG 1000H START:MOV DPTR,#TAB MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000H TAB:DB 00,01,04,09,16,25 END,圖4.3 查表程序框圖,(1) MOVC A
10、,A+ DPTR,用DPTR指向表首址,則變量與DPTR之和的地址單元中的內(nèi)容就是變量的平方值。,(2) MOVC A,A+PC 不破壞DPTR的內(nèi)容,從而可以減少保護(hù) DPTR的內(nèi)容所需的開銷。 表格存放在該指令后的256字節(jié)內(nèi)。,也可采用如下專用指令實現(xiàn)查表功能,3. 簡單運算 對于多字節(jié)的相加運算必須從低位字節(jié)開始分字節(jié)進(jìn)行。除最低字節(jié)可以使用ADD指令外,其他字節(jié)相加時要使用ADDC指令。,例4.4 現(xiàn)將兩個雙字節(jié)無符號數(shù)相加。設(shè)被加數(shù)存放在內(nèi)部RAM的51H、50H單元,加數(shù)存放在內(nèi)部RAM的61H、60H單元,相加的結(jié)果存放在內(nèi)部RAM的51H、50H單元,進(jìn)位存放在位尋址區(qū)的00
11、H位中。(程序見下頁),ORG 0100H MOV R0,50H ;被加數(shù)的低字節(jié)地址 MOV R1,60H ;加數(shù)的低字節(jié)地址 MOV A,R0 ;取被加數(shù)低字節(jié) ADD A,R1 ;加上加數(shù)低字節(jié) MOV R0,A ;保存低字節(jié)相加結(jié)果 INC R0 ;指向被加數(shù)高字節(jié) INC R1 ;指向加數(shù)高字節(jié) MOV A,R0 ;取被加數(shù)高字節(jié) ADDC A,R1 ;加上加數(shù)高字節(jié)(帶進(jìn)位加) MOV R0,A ;存高字節(jié)相加結(jié)果 MOV 00H,C ;保存進(jìn)位 。 END,4.3.2 分支程序設(shè)計,可分成a)單分支、b)雙分支和c)多分支幾種 :,條件成立?,程序段A,下條指令,程序段B,條件成
12、立?,程序段A,K=0?,K=1?,K=2?,Y,分支0,Y,分支1,Y,分支2,N,N,N,a),b),c),圖4.4 分支程序結(jié)構(gòu)示意圖,例4.5 片外RAM 2000H、2001H單元分別存放兩個數(shù),判斷這兩個數(shù)是否相等,如果相等,則位地址7FH置1,否則清零。 若判斷兩個數(shù)相等使用比較轉(zhuǎn)移指令很容易實現(xiàn)該題中的要求,程序流程如圖4.5所示。,圖4.5 判斷兩個數(shù)相等的程序流程圖,程序如下: ORG 0100H MOV DPTR,#2000H;地址指針指向片外2000H單元 MOVX A,DPTR;(2000H)A MOV R0,A;AR0 MOV DPTR,#2001H ;地址指針指向
13、2001H單元 MOVX A,DPTR;(2001H)A MOV 30H,R0 CJNE A,30H,NE;若兩個數(shù)不相等,則轉(zhuǎn)NE SETB 7FH ;若兩個數(shù)相等,則7FH單元置1 AJMP OVER ;轉(zhuǎn)OVER NE: CLR 7FH;7FH單元清零 OVER:RET,例4.6 設(shè)VAR 單元內(nèi)有一自變量X,請按如下條件編程求函數(shù)值Y并存入FUNC單元中。,1 X0 Y = 0 X = 0 -1 X0,圖4.6 按條件求函數(shù)Y的流程圖,程序如下: ORG 0100H VAR EQU 30H FUNC EQU 31H MOV A, VAR ; XA JZ DONE ; 若X=0,則轉(zhuǎn)DO
14、NE JNB ACC.7,POSI ; 若X0,則轉(zhuǎn)POSI MOV A,#0FFH ; 若X0,則-1A, FFH為-1的補碼 SJMP DONE ; 轉(zhuǎn)DONE POSI: MOV A,#01H ; 1A DONE: MOV FUNC ,A ; 存Y值 RET,循環(huán)程序一般由四個主要部分組成: (1) 初始化部分: 為循環(huán)程序做準(zhǔn)備, 如規(guī)定循環(huán)次數(shù)、 給各變量和地址指針預(yù)置初值。 (2) 處理部分: 為反復(fù)執(zhí)行的程序段, 是循環(huán)程序的實體, 也是循環(huán)程序的主體。 (3) 循環(huán)控制部分: 這部分的作用是修改循環(huán)變量和控制變量, 并判斷循環(huán)是否結(jié)束, 直到符合結(jié)束條件時, 跳出循環(huán)為止。 (
15、4) 結(jié)束部分: 這部分主要是對循環(huán)程序的結(jié)果進(jìn)行分析、 處理和存放。,4.3.3 循環(huán)程序,循環(huán)程序的結(jié)構(gòu),有先執(zhí)行后判斷和先判斷后執(zhí)行兩種結(jié)構(gòu) :,圖4.7 循環(huán)程序結(jié)構(gòu)示意圖,例4.7 試編制一個 50ms延時程序。設(shè)晶振頻率為12Hz, 則一個機器周期為1s。執(zhí)行一條DJNZ 指令需要 2個機器周期,即 2s。采用循環(huán)計數(shù)法實現(xiàn)延 時,循環(huán)次數(shù)可以通過計算獲得,并選擇先執(zhí)行后 判斷的循環(huán)結(jié)構(gòu)。程序段如下: DEL: MOV R7,#200 ;1 s DEL1:MOV R6,#123 ;1 s NOP ;1 s DEL2:DJNZ R6,DEL2 ;2s,計(2123)s DJNZ R7
16、,DEL1 ;2s, RET 共計 (21232 2)200+1 s,即50.001ms,例4.8 將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)$ 字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。 MOV R0,#data MOV DPTR,#buffer LOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判是否為 $ 字符 SJMP LOOP2 ;是 $ 字符,轉(zhuǎn)結(jié)束 LOOP1:MOVX DPTR,A ;不是 $ 字符,執(zhí)行傳送 INC R0 INC DPTR SJ
17、MP LOOP0 ;傳送下一數(shù)據(jù) LOOP2: ,4.3.4 子程序設(shè)計及其調(diào)用,子程序是指能完成明確任務(wù)、具有獨立功能且能被其它程序反復(fù)調(diào)用的程序段。調(diào)用子程序的源程序稱為主程序。,將通用性問題設(shè)計成子程序形式,可使程序結(jié)構(gòu)緊湊、縮短程序長度,同時也方便程序調(diào)試。,1. 子程序設(shè)計要點,(1) 子程序的首地址必須要用標(biāo)號,該標(biāo)號就是 這個子程序的名稱。子程序的最后一定要設(shè)置 一條返回指令RET。 (2) 盡可能編成浮動地址程序,以便于存放在存儲 區(qū)的任意位置。 (3) 為了方便使用,每個子程序都要有使用說明: 如子程序功能的簡要說明、入口參數(shù)、出口參數(shù)及所占用的寄存器和存儲單元等。,2. 子
18、程序調(diào)用注意事項,用戶在調(diào)用子程序時,應(yīng)注意現(xiàn)場保護(hù) 和主程序與子程序的參數(shù)傳遞兩個問題。,(1) 現(xiàn)場保護(hù)與恢復(fù) 子程序經(jīng)常用到R0R7、A、DPTR,以及PSW 等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進(jìn)行保護(hù)(即現(xiàn)場保護(hù))。,在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱為現(xiàn)場恢復(fù)。保護(hù)與恢復(fù)的方法有兩種: 一是 在主程序中實現(xiàn);二是在子程序中實現(xiàn)。, 在主程序中實現(xiàn) PUSH PSW ;保護(hù)現(xiàn)場 PUSH ACC PUSH B MOV PSW,#10H ;換當(dāng)前工作寄存器組 LCALL addr16 ;子程序調(diào)用 POP B ;恢復(fù)現(xiàn)場 POP ACC POP
19、 PSW 特點是結(jié)構(gòu)靈活。, 在子程序中實現(xiàn) SUB1:PUSH PSW ;保護(hù)現(xiàn)場 PUSH ACC PUSH B MOV PSW,#10H ;換當(dāng)前工作寄存器組 POP B ;恢復(fù)現(xiàn)場 POP ACC POP PSW RET 程序規(guī)范、清晰。要注意保護(hù)與恢復(fù)的順序。,(2) 參數(shù)傳遞 傳遞參數(shù)的方法有三種:, 利用累加器或寄存器 先把子程序需要的數(shù)據(jù)送入A或指定的工作 寄存器中; 當(dāng)子程序執(zhí)行時,可從指定的單元中取得 數(shù)據(jù),執(zhí)行運算子程序也可以用同樣的方法 把結(jié)果傳送給主程序。,例4.9 編寫程序,實現(xiàn)c=a2+b2 。設(shè)a,b,c分別存 于內(nèi)部RAM的30H,31H,32H三個單元中。
20、START:MOV A,30H ;取a ACALL SQR ;調(diào)用查平方表 MOV R1,A ;a2 暫存于R1中 MOV A,31H ;取b ACALL SQR ;調(diào)用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存結(jié)果 SJMP $ SQR : MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR RET TAB : DB 0,1,4,9,16 ,25,36,49,64,81, 利用存儲器 數(shù)據(jù)量比較大時,利用存儲器實現(xiàn)參數(shù)的傳遞, 先建立一個參數(shù)表,用指針指示參數(shù)表所在位置。 a) 參數(shù)表建立在內(nèi)部RAM時,用R0或R1作指針。 b) 參數(shù)表建立在
21、外部RAM時,用DPTR作指針。,例4.10 將R0和R1指向的內(nèi)部RAM 中兩個3字節(jié)無符號整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部RAM中。入口時,R0和R1分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時,R0指向結(jié)果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。,實現(xiàn)程序: NADD:MOV R7,#3 ;三字節(jié)加法 CLR C NADD1:MOV A,R0 ;取加數(shù)低字節(jié) ADDC A,R1 ;被加數(shù)低字節(jié)加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 RET,利用堆棧 堆棧傳遞參數(shù)是在子程序嵌套中常采用的一種方法。 例4.11 把內(nèi)部RAM中20H單
22、元中的1個字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。,MAIN:MOV A,20H SWAP A PUSH ACC ;參數(shù)入棧 ACALL HEASC POP ACC MOV R0,A ;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 INC R0 ;修改指針 PUSH 20H ;參數(shù)入棧 ACALL HEASC POP ACC MOV R0,A ;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 SJMP $,HEASC:MOV R1,SP ;借用R1為堆棧指針 DEC R1 DEC R1 ;R1指向被轉(zhuǎn)換數(shù)據(jù) XCH A,R1 ;取被轉(zhuǎn)換數(shù)據(jù) ANL A,#0FH ;取一位十六進(jìn)制數(shù) ADD A,#2 ; 所加
23、值為MOVC與DB間字節(jié)數(shù) MOVC A,A+PC ;查表 XCH A,R1 ;1字節(jié)指令,存結(jié)果于堆棧 RET ;1字節(jié)指令 ASCTAB:DB 30H,31H,32H,33H, 34H DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H,(1)數(shù)據(jù)較少時,采用寄存器傳遞方式 可以獲得較快的傳遞速度; (2)數(shù)據(jù)較多時,宜采用存儲器或堆棧 方式傳遞; (3)若是子程序嵌套,宜采用堆棧方式。,參數(shù)傳遞三種方法的選用原則,4.4 實用程序舉例,4.4.1 算術(shù)運算程序 1. 多字節(jié)數(shù)的加、減運算 合理地運用進(jìn)位(借位)標(biāo)志,例4.12 多字節(jié)無符號
24、數(shù)的加法運算舉例。 設(shè)兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部 RAM中以DATA1和DATA2開始的單元中。相加 后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。,MOV R0,#DATA1 MOV R1,#DATA2 MOV R7,#N ;置字節(jié)數(shù) CLR C LOOP: MOV A,R0 ADDC A,R1 ;求和 MOV R1,A ;存結(jié)果 INC R0 ;修改指針 INC R1 DJNZ R7, LOOP,點擊觀看仿真演示,例4.13 多字節(jié)無符號數(shù)的減法運算舉例。 設(shè)兩N字節(jié)數(shù)分別放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相減后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。 MOV R0,#DATA
25、1 MOV R1,#DATA2 MOV R7,#N ;置字節(jié)數(shù) CLR C LOOP:MOV A,R0 ;被減數(shù)送A SUBB A,R1 ;求差 MOV R1,A ;存結(jié)果 INC R0 ;修改指針 INC R1 DJNZ R7,LOOP,2雙字節(jié)無符號數(shù)乘法運算程序 例4.14 已知在寄存器R4R5和R2R3中分別存放有雙字節(jié)的被乘數(shù)和乘數(shù)(R5、R3存放低8位,R4、R2存放高8位),試編程求積并存入BLOCK開始的連續(xù)四個存儲單元(低字節(jié)在前,高字節(jié)在后)。 AT89C51乘法指令只能完成兩個8位無符號數(shù)相乘,因此16位無符號數(shù)求積必須將它們分解成四個8位數(shù)相乘來實現(xiàn),其方法是邊乘邊加。
26、原理和過程如圖4.8所示。,圖4.8 雙字節(jié)無符號數(shù)乘法原理圖,圖中ab為16位被乘數(shù),cd為16位乘數(shù)(a、c代表高8位,b、d代表低8位),而其后跟H表示乘積后的高8位,跟L表示乘積后的低8位。 ORG 1000H BLOCK EQU 30H MOV R0,#BLOCK ; 指向積單元首址 MOV A,R5 MOV B,R3 MUL AB ; bd MOV R0,A ; 保存bdL MOV A,B INC R0 MOV R0,A ; 保存 bdH,MOV A,R4 MOV B,R3 MUL AB ; ad ADD A,R0 ; bdH+adL MOV R0,A INC R0 MOV A,B
27、 ADDC A,#00H ; adH+進(jìn)位 MOV R0,A DEC R0 MOV A,R5 MOV B,R2,MUL AB ; bc ADD A,R0 ; bcL與bdh、adL、進(jìn)位累加 MOV R0,A MOV A,B INC R0 ADDC A,R0;bcH與adH、進(jìn)位累加 MOV R0,A INC R0 CLR A ADDC A,#00H MOV R0,A ;保存進(jìn)位,MOV A,R4 MOV B,R2 MUL AB;ac DEC R0 ADD A,R0;acL與adH、bcH、進(jìn)位累加 MOV R0,A MOVA,B INC R0 ADDC A,R0;ac與進(jìn)位累加 MOV R0
28、,A RET,1. 十六進(jìn)制數(shù)與ASCII碼間的轉(zhuǎn)換 十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼間的算法: (1)數(shù)在09之間時,ASCII碼值為該數(shù)加30H (2)數(shù)在AF之間時,ASCII碼值為該數(shù)加37H,4.4.2 碼型轉(zhuǎn)換,例4.15 將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。設(shè)十六進(jìn)制數(shù)存放在R0中,轉(zhuǎn)換后的ASCII 碼存放于R2中。,HASC:MOV A,R0 ;取4位二進(jìn)制數(shù) ANL A,#0FH ;屏蔽掉高4位 PUSH ACC ;4位二進(jìn)制數(shù)入棧 CLR C ;清進(jìn)(借)位位 SUBB A,#0AH ;用借位位的狀態(tài)判斷該數(shù)在09 ;還是AF之間 POP ACC ;彈出原4位二進(jìn)制數(shù)
29、JC LOOP ;借位位為1,跳轉(zhuǎn)至LOOP ADD A,#07H ;借位位為0,該數(shù)在AF之間, ;加37H LOOP:ADD A,#30H ;該數(shù)在09之間,加30H MOV R2,A ; ASCII碼存于R2 RET,2單字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù) 例4.16 已知20H單元存放一個二進(jìn)制數(shù),編程將它轉(zhuǎn)換為BCD數(shù),百位送入FIRST單元的低4位,十位和個位分別送入SECOND單元的高4位和低4位。 算法:只需將20H單元中的內(nèi)容除以100,得到的商就是百位BCD數(shù),然后用余數(shù)除以10,其結(jié)果中,商為十位BCD數(shù),余數(shù)為個位BCD數(shù)。,ORG0100H FIRSTDATA 30H SEC
30、ONDDATA 31H MOV A,20H ;被除數(shù)送A MOV B,#64H;除數(shù)100送B DIV AB;A除以B MOV FIRST,A;百位BCD數(shù)送FIRST MOV A,B;余數(shù)送A MOV B,#0AH;除數(shù)10送B DIV AB;A除以B SWAP A;十位BCD數(shù)送高4位 ORL A,B ;十位和個位BCD數(shù)組合 ; 成一個字節(jié) MOV SECOND,A ;送入SECOND單元 SJMP $ ;結(jié)束 END,4.4.3 數(shù)據(jù)處理 1查詢 例4.17 在外部RAM 1000H開始的地址單元中存放30個數(shù)據(jù),找出其中的奇數(shù)存入內(nèi)部RAM 20H開始的存儲單元中,并統(tǒng)計奇數(shù)的個數(shù),
31、存入3FH單元。 用位操作指令對操作數(shù)最低位進(jìn)行判斷,若為1即為奇數(shù)。本題中,DPTR是片外數(shù)據(jù)緩沖區(qū)地址指針,R0是片內(nèi)數(shù)據(jù)緩沖區(qū)地址指針。,ORG 0030H MOV DPTR,#1000H ;指向片外緩沖區(qū)首地址 MOV R0,#20H;指向片內(nèi)緩沖區(qū)首地址 MOV R7,#30H;循環(huán)次數(shù)送入R7 MOV 3FH,#00H;清零 LP:MOVX A,DPTR;取數(shù) JNB ACC.0,EVEN ;偶數(shù)轉(zhuǎn)EVEN MOV R0,A;奇數(shù)保存 INC R0;修改片內(nèi)地址 INC 3FH;修改統(tǒng)計個數(shù) EVEN:INC DPTR ;修改片外地址 DJNZ R7,LP ;控制循環(huán) RET,2排
32、序 例4.18 將片內(nèi)RAM 30H開始的連續(xù)16個單元的數(shù)據(jù)按從小到大的順序排序。 此題采用的是冒泡排序法,即對這16個數(shù)據(jù)組成的數(shù)據(jù)串,依次將相鄰兩數(shù)分別進(jìn)行比較,若后面的數(shù)小于前面的數(shù),則比較的相鄰兩數(shù)互換,且置位地址單元7FH為1。若這組數(shù)據(jù)比較完后,相鄰兩數(shù)有交換(即交換標(biāo)志位7FH為1),則再重新進(jìn)行兩兩比較,直到16個數(shù)已從小到大排序,相鄰兩數(shù)比較后不再交換為止。交換標(biāo)志位7FH用來控制是否再需要重新兩兩比較。程序流程如圖4. 8所示。,圖4.9 排序程序流程圖,程序如下: ORG 2000H SORT: MOV R1,#30H ;指向數(shù)據(jù)塊首地址 MOV R7,#10H ;數(shù)據(jù)
33、塊長度送R7 CLR 7FH ;交換標(biāo)志位清零 DEC R7 ;塊長減1為比較次數(shù) LOOP1:MOV A,R1 ;取相鄰兩數(shù)中的前一個數(shù) MOV 20H,A INC R1 MOV A,R1 ;取相鄰兩數(shù)中的后一個數(shù) CJNE A,20H,LOOP ;相鄰兩數(shù)比較,LOOP: JNC NEXT ;前者小于后者轉(zhuǎn)至NEXT XCH A,20H ;前者大于后者,相鄰兩數(shù)互換 MOV R1,A DEC R1 MOV R1,20H INC R1 ;恢復(fù)數(shù)據(jù)塊指針 SETB 7FH ;置1標(biāo)志位 NEXT: DJNZ R7,LOOP1 ;所有相鄰兩數(shù)未比較完, ;轉(zhuǎn)至LOOP1 JB 7FH,SORT
34、;交換標(biāo)志位為1,轉(zhuǎn)至SORT RET,4.5 實訓(xùn)指導(dǎo),實訓(xùn)4 .1 順序程序設(shè)計(拆字和拼字) 1. 實訓(xùn)目的 掌握匯編語言程序設(shè)計和調(diào)試方法,以及拆字和拼字程序的作用與編程實現(xiàn)。 2. 實訓(xùn)內(nèi)容 (1) 拆字:把7000H單元中的內(nèi)容拆開,高4位送7001H的低4位,低4位送7002H的低4位,7001H、7002H的高4位清零。例如:若(7000H)=34H,程序執(zhí)行后,(7001H)=03H,(7002H)=04H。一般本程序用于把數(shù)據(jù)送顯示緩沖區(qū)。,(2) 拼字:把7000H、7001H的低4位相拼后送入 7002H單元,即7002H單元的高4位為7000H的低4 位,7002H的
35、低4位為7001H的低4位。拼字與拆字的 過程恰好相反。一般本程序用于把顯示緩沖區(qū)的數(shù) 據(jù)取出拼裝成一個字節(jié)。 3.程序框圖(如圖4.10、圖4.11所示),4實訓(xùn)步驟 (1) 連接并啟動實驗儀與PC機。運行DVCC 實驗軟件,編寫源程序; (2) 按實訓(xùn)內(nèi)容的要求,分別給相應(yīng)單元預(yù) 置數(shù); (3) 運行程序,檢查相應(yīng)單元的內(nèi)容是否達(dá) 到實訓(xùn)內(nèi)容的要求。 5. 參考源程序 (見后附) (1) 拆字程序 (2) 拼字程序 6. 編寫實訓(xùn)報告,(1) 拆字程序 ORG 0050H CORD:MOV DPTR, #7000H MOVX A, DPTR MOV B, A SWAP A ANL A, #
36、0FH INC DPTR MOVX DPTR, A INC DPTR MOV A, B ANL A, #0FH MOVX DPTR, A SJMP $ END,拼字程序 ORG 0100H PORD:MOV DPTR, #7000H MOVX A, DPTR SWAP A ANL A, #0F0H MOV B, A INC DPTR MOVX A, DPTR, ANL A, #0FH ORL A, B INC DPTR MOVX DPTR, A SJMP $ END,實訓(xùn)4 .2 循環(huán)程序設(shè)計(流水燈) 1. 實訓(xùn)目的 掌握P1口的簡單使用,及延時子程序的 編寫和應(yīng)用。 2. 實訓(xùn)內(nèi)容 編寫程
37、序,使P1口所接的8個發(fā)光二極管 逐個循環(huán)點亮,形成跑馬燈。每個發(fā)光二極 管點亮?xí)r間約100200ms。,3. 實訓(xùn)連線 4. 實訓(xùn)步驟 (1) 連接并啟動實驗儀與PC機,按實驗 連線要求進(jìn)行連接;,P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7,L1 L2 L3 L4 L5 L6 L7 L8,(2) 運行DVCC實驗軟件,編寫源程序; (3) 運行程序,查看實驗儀發(fā)光二極管 L1L8的點亮次序。 5. 思考題 (1) 如要使流水燈的點亮次序相反,程序應(yīng) 如何修改? (2) 假如要將流水燈的流動速度(每個發(fā)光二 極管點亮?xí)r間)升高或降低,應(yīng)如何修改程序? 6. 編寫實訓(xùn)報告,
38、附:流水燈參考源程序 ORG 0100H MOV A,#01H LOOP: MOV P1, A ;循環(huán)程序 LCALL DEY RL A SJMP LOOP DEY: MOV R7,#100 ; 100ms延時子程序 LP1: MOV R6,#50 DJNZ R6 $ DJNZ R7 LP1 RET END,實訓(xùn)4.3 代碼轉(zhuǎn)換程序設(shè)計與實現(xiàn) 1. 實訓(xùn)目的 (1)了解代碼間轉(zhuǎn)換原理。 (2)掌握代碼轉(zhuǎn)換程序的設(shè)計方法和技巧。 (3)掌握編寫和運行子程序的方法。 (4)進(jìn)一步實踐程序的調(diào)試和運行。 2. 實訓(xùn)內(nèi)容 (1)將任意一位16進(jìn)制數(shù)的ASCII碼轉(zhuǎn)換為4位 二進(jìn)制數(shù)。,圖4.12 AS
39、CII碼轉(zhuǎn)成二進(jìn)制數(shù)流程圖,3. 轉(zhuǎn)換流程圖,4實訓(xùn)步驟 (1) 將任意一個0F的16進(jìn)制ASCII碼數(shù)轉(zhuǎn)換為 4位二進(jìn)制數(shù),可參考以下步驟: 根據(jù)流程圖4.12 編寫程序,檢查無誤經(jīng)匯編 后輸入單片機內(nèi)存。 在20H單元中送入一個數(shù)37H,即7的ASCII碼。 執(zhí)行上述程序,核對結(jié)果,若有問題,則用單 步運行或設(shè)置斷點的方法反復(fù)調(diào)試程序,直到程序完 全正確。 在20H單元送入41H(A的ASCII碼),重復(fù)第 步。,參考源程序:(設(shè)待轉(zhuǎn)換數(shù)存于片內(nèi)RAM20H單 元,轉(zhuǎn)換結(jié)果存到B中。) ORG 0100H CRL C ;進(jìn)位位清0 MOV A, 20H ;取待轉(zhuǎn)換數(shù) SUBB A, #30
40、H ;待轉(zhuǎn)換數(shù)30H CJNE A, #0AH, M1 ;A 1010,轉(zhuǎn)M1 M1: JC M2 ;C =1(A10)轉(zhuǎn)M2 SUBB A, #07H ;(A 10),再減7H M2: MOV B, A ;存轉(zhuǎn)換結(jié)果 RET,本章小結(jié),1. 匯編語言的語句結(jié)構(gòu)由4個部分組成:標(biāo)號:操作碼 (目的操作數(shù)),(源操作數(shù));注釋。其中標(biāo)號是指令的符號地址;操作碼表示指令的操作功能,它是匯編語言指令中唯一不可缺省的部分;操作數(shù)是參加操作的數(shù)據(jù)或數(shù)據(jù)地址;注釋是指令功能的說明。在匯編語言指令中,除操作碼之外,其它3個部分有時可缺省。,2.用匯編語言編寫的源程序不能為單片機所接受,必須將其轉(zhuǎn)換為由二進(jìn)制代碼組成的目標(biāo)程序后才能被單片機識別和執(zhí)行。完成匯編任務(wù)有手工匯編和機器匯編兩種方法。了解手工匯編、計算偏移量及轉(zhuǎn)移地址的方法有助于進(jìn)一步理解匯編語言程序設(shè)計。,3.分析問題,確定算法或解題思路、畫流程圖、編寫源程序,是程序設(shè)計中最關(guān)鍵的幾步。其中確定設(shè)計方案,是程序設(shè)計的基礎(chǔ);采用由各種圖形、符號及指向線來說明程序執(zhí)行過程的流程圖能充分表達(dá)程序的設(shè)計思路,可幫助設(shè)計程序、閱讀程序和查找程序中的錯誤;用匯編語言指令實現(xiàn)流程圖的每一個具體步驟,也即編寫出具體的匯編語言源程序是能否充分發(fā)揮單片機各種優(yōu)越功能的
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度制造業(yè)職業(yè)健康防護(hù)與環(huán)保合規(guī)合同3篇
- 摩托車駕駛培訓(xùn)中心加盟合同20253篇
- 二零二五版內(nèi)墻涂料市場調(diào)研與分析服務(wù)合同4篇
- 2025年度農(nóng)業(yè)資源調(diào)查與評價合同3篇
- 2025年陜西西安經(jīng)發(fā)置業(yè)有限公司招聘筆試參考題庫含答案解析
- 2025年湖北武漢地鐵運營有限公司招聘筆試參考題庫含答案解析
- 2025年江西大展文化傳播有限公司招聘筆試參考題庫含答案解析
- 2025年山東威海遠(yuǎn)遙漁港有限公司招聘筆試參考題庫含答案解析
- 2025年甘肅信達(dá)通信技術(shù)有限公司招聘筆試參考題庫含答案解析
- 2025年度個人網(wǎng)絡(luò)購物分期付款合同模板4篇
- 大學(xué)生職業(yè)規(guī)劃大賽生涯發(fā)展報告
- 旅居管家策劃方案
- GB/T 26316-2023市場、民意和社會調(diào)查(包括洞察與數(shù)據(jù)分析)術(shù)語和服務(wù)要求
- 春節(jié)值班安全教育培訓(xùn)
- 鋰離子電池生產(chǎn)工藝流程圖
- 帶狀皰疹護(hù)理查房
- 平衡計分卡-化戰(zhàn)略為行動
- 幼兒園小班下學(xué)期期末家長會PPT模板
- 維克多高中英語3500詞匯
- 幼兒教師干預(yù)幼兒同伴沖突的行為研究 論文
- 湖南省省級溫室氣體排放清單土地利用變化和林業(yè)部分
評論
0/150
提交評論