【學(xué)習(xí)課件】第4章匯編程序設(shè)計(jì)_第1頁
【學(xué)習(xí)課件】第4章匯編程序設(shè)計(jì)_第2頁
【學(xué)習(xí)課件】第4章匯編程序設(shè)計(jì)_第3頁
【學(xué)習(xí)課件】第4章匯編程序設(shè)計(jì)_第4頁
【學(xué)習(xí)課件】第4章匯編程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第4章MCS-51匯編語言程序設(shè)計(jì) 4.1簡單程序設(shè)計(jì)4.2分支程序設(shè)計(jì)4.3循環(huán)程序設(shè)計(jì)4.4散轉(zhuǎn)程序設(shè)計(jì)4.5子程序和參數(shù)傳遞方法4.6查表程序設(shè)計(jì)4.7數(shù)制轉(zhuǎn)換習(xí)題與思考題程序設(shè)計(jì)是為了解決某一個(gè)問題而將指令有序地組合在一起的過程。 程序有簡有繁, 但復(fù)雜程序往往是由簡單的基本程序所構(gòu)成的。 本章將通過一些基本程序, 介紹部分常用的程序設(shè)計(jì)方法。 程序設(shè)計(jì)的過程大致可以分為以下幾個(gè)步驟: (1) 編制要解決問題的程序框圖。 (2) 確定數(shù)據(jù)結(jié)構(gòu)、 算法、 工作單元、 變量設(shè)定。 (3) 根據(jù)所用計(jì)算機(jī)的指令系統(tǒng), 按照已編制的程序框圖用匯編語言編制出源程序。 (4) 將編制的程序在計(jì)算機(jī)

2、上調(diào)試, 直至實(shí)現(xiàn)預(yù)定的功能。一、匯編程序功能 源程序 (匯編指令程序) 匯編 目標(biāo)程序(機(jī)器碼指令程序) 匯編指令與機(jī)器碼指令有一一對應(yīng)的關(guān)系。匯編程序是一種翻譯程序,將源程序翻譯成目標(biāo)程序。 二、匯編程序的匯編過程 匯編有兩種方法:手工匯編、機(jī)器匯編。 1、手工匯編:第一次匯編:確定地址,翻譯成各條機(jī)器碼,字符標(biāo)號原樣寫出;第二次匯編:標(biāo)號代真,將字符標(biāo)號用所計(jì)算出的具體地址值或偏移量代換。 源程序 目標(biāo)程序 地址 ORG 1000H START:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJ

3、NE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END 第一次匯編第二次匯編1000 A82F1002 7A001004 E61005 FB1006 0B1007 80NEXT1009 08100A B644NEXT100D 0A100E DBLOOP1010 8A2A1012 80FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE2、機(jī)器匯編兩次掃描過程。第一次掃描:檢查語法錯(cuò)誤,確定符號名字; 建立使用的全部符號名字表; 每一符號名字后跟一對應(yīng)值(地址或數(shù))。第二次掃描:是在第一次掃描基

4、礎(chǔ)上,將符號地址轉(zhuǎn)換成 地址(代真); 利用操作碼表將助記符轉(zhuǎn)換成相應(yīng)的目標(biāo)碼。 三、偽指令 偽指令是告訴匯編程序,如何匯編源程序的指令。 偽指令既不控制機(jī)器的操作,也不能被匯編成機(jī)器代碼, 故稱為偽指令。 1、起始地址偽指令 ORG ORG addr16 用于規(guī)定目標(biāo)程序段或數(shù)據(jù)塊的起始地址, 設(shè)置在程序開始處。 2、匯編結(jié)束偽指令 END 告訴匯編程序,對源程序的匯編到此結(jié)束。 一個(gè)程序中只出現(xiàn)一 次,在末尾。 3、賦值偽指令 EQU 告訴匯編程序,將匯編語句操作數(shù)的值賦予本語句的標(biāo)號。 格式: 標(biāo)號名稱 EQU 數(shù)值或匯編符號 “標(biāo)號名稱”在源程序中可以作數(shù)值使用,也可以作數(shù)據(jù)地址、 位

5、地址使用。 先定義后使用,放在程序開頭。4、定義字節(jié)偽指令 DB 告訴匯編程序從指定的地址單元開始,定義若干字節(jié)存儲單 元并賦初值。 格式: 標(biāo)號: DB 字節(jié)數(shù)據(jù)或字節(jié)數(shù)據(jù)表例、 ORG 1000H PIOI:DW 7654H,40H、12、AB 6、數(shù)據(jù)地址賦值偽指令 DATA 將表達(dá)式指定的數(shù)據(jù)地址賦予規(guī)定的字符名稱 格式: 字符名稱 DATA 表達(dá)式注:該指令與EQU指令相似,只是,可先使用后定義, 放于程序開頭、結(jié)尾均可。5、定義字偽指令 DW 從指定地址開始,定義若干個(gè)16個(gè)位數(shù)據(jù),高八位存入低地址;低八位存入高地址。7、定義空間偽指令 DS 從指定地址開始,保留由表達(dá)式指定的若干

6、字節(jié)空間作 為備用空間。 格式: 標(biāo)號: DS 表達(dá)式例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;從100BH開始存放 ;71H11H、11H。 注:DB、DW、DS 只能用于程序存儲器; 而不能用于數(shù)據(jù)存儲器。 8、位地址賦值偽指令 BIT將位地址賦予規(guī)定的字符名稱。格式: 字符名稱 BIT 位地址 例3、 X1 BIT P12 相當(dāng)于 X1 EQU 92H 程序設(shè)計(jì)有時(shí)是一件很復(fù)雜的工作,但往往有些程序結(jié)構(gòu)是很典型的。采用結(jié)構(gòu)化編程時(shí),有規(guī)律性極強(qiáng)、簡單清晰、容易讀寫、可靠性高等特點(diǎn)。根據(jù)結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn),功能復(fù)雜的程序結(jié)構(gòu)由基本算法結(jié)構(gòu)組成,基本結(jié)構(gòu)有三

7、種:順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和分支結(jié)構(gòu)。 語句 3語句 2順序結(jié)構(gòu) 入口語句 1 出口分支結(jié)構(gòu)入口條件滿足否? 分支 1 出口YN 分支 2循環(huán)結(jié)構(gòu)入口 處理 修改條件條件滿足否?Y 出口N4.1簡單程序設(shè)計(jì)簡單程序又稱順序程序。 計(jì)算機(jī)是按指令在存儲器中存放的先后次序來順序執(zhí)行程序的。 【例4-1】兩個(gè)8位的無符號數(shù)相加的和仍是8位。 設(shè)內(nèi)部 RAM的40H、 41H單元中分別存放8位數(shù)N1、 N2, 兩數(shù)相加的結(jié)果送42H單元。 程序如下: AD1: MOV R0, #40H ; 設(shè)R0為數(shù)據(jù)指針 MOV A, R0 ; 取N1 INC R0 ; 修改指針 ADD A, R0 ; N1 + N2

8、 INC R0 MOV R0, A ; 存結(jié)果 END【例4-2】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。 設(shè)內(nèi)部RAM的40H、 41H單元中分別存放著8位二進(jìn)制數(shù), 要求取出兩個(gè)單元中的低半字節(jié), 并將其合并成一個(gè)字節(jié)后存放在42H單元。 程序如下: START: MOV R1, #40HMOV A, R1 ANL A, #0FH ; 取第一個(gè)半字節(jié) SWAP A ; 移至高4位 INC R1 XCH A, R1 ; 取第二個(gè)字節(jié) ANL A, #0FH ; 取第二個(gè)半字節(jié) ORL A, R1 ; 拼字 INC R1 MOV R1, A ; 存放結(jié)果 END以上程序均采用了寄存器尋址方式, 可以

9、方便地取數(shù)、 存數(shù)。 例4-2 中用XCH A, R1指令, 既取出了數(shù), 又保存了中間結(jié)果。 4.2分支程序設(shè)計(jì)在處理實(shí)際事務(wù)中, 只用簡單程序設(shè)計(jì)的方法是不夠的, 因?yàn)榇蟛糠殖绦蚩偘信袛唷?比較等情況, 程序?qū)⒏鶕?jù)判斷、 比較的結(jié)果轉(zhuǎn)向不同的分支。 下面舉兩個(gè)分支程序的例子。 【例4-3】兩個(gè)無符號數(shù)比較大小。 設(shè)存儲單元ST1和ST2中存放著兩個(gè)不帶符號的二進(jìn)制數(shù), 找出其中的大數(shù)存入ST3單元中。 流程圖如圖4-1所示。 圖4-1兩個(gè)無符號數(shù)的比較流程 程序如下: ST1: EQU 8040HORG 8000HSTART1: CLR C ; 進(jìn)位位清0 MOV DPTR, #ST1

10、 ; 設(shè)數(shù)據(jù)指針 MOVX A, DPTR ; 取第一個(gè)數(shù) MOV R2, A ; 暫存于R2 INC DPTR MOVX A, DPTR ; 取第二個(gè)數(shù) SUBB A, R2 ; 兩數(shù)比較 JNC BIG1 XCH A, R2 ; 第一個(gè)數(shù)大BIG0: INC DPTR MOVX DPTR, A ; 存大數(shù) RET BIG1: MOVX A, DPTR ; 第二個(gè)數(shù)大 SJMP BIG0 END上面程序中, 用減法指令SUBB來比較兩數(shù)的大小。 由于這是一條帶借位的減法指令, 因此在執(zhí)行該指令前, 應(yīng)先把進(jìn)位位清0。 用減法指令通過借位(CY)的狀態(tài)判別兩數(shù)的大小, 是兩個(gè)無符號數(shù)比較大小時(shí)

11、常用的方法。 設(shè)有兩數(shù)x, y, 執(zhí)行x-y, 當(dāng)xy 時(shí), 結(jié)果無借位產(chǎn)生, 則CY=0; 反之, 則CY=1, 表示x0, 1A SJMP FINISHSUL: MOV A, #0 SJMP FINISH NEG1: MOV A, #FFH ; x0, -1A FINISH: MOV DPTR, #BUF MOVX DPTR, A END4.3循環(huán)程序設(shè)計(jì)在程序設(shè)計(jì)中, 只有簡單程序和分支程序是不夠的。 因?yàn)楹唵纬绦蛎織l指令只執(zhí)行一次, 而分支程序則根據(jù)條件的不同, 會跳過一些指令, 執(zhí)行另一些指令。 它們的特點(diǎn)是, 每一條指令至多執(zhí)行一次。 在處理實(shí)際事務(wù)時(shí), 有時(shí)會遇到多次重復(fù)處理的問

12、題, 用循環(huán)程序的方法來解決就比較合適。 循環(huán)程序中的某些指令可以反復(fù)執(zhí)行多次。 采用循環(huán)程序, 可以縮短程序, 節(jié)省存儲單元。 當(dāng)重復(fù)次數(shù)越多時(shí), 循環(huán)程序的優(yōu)越性就越明顯。 但是程序的執(zhí)行時(shí)間并不節(jié)省。 由于要有循環(huán)準(zhǔn)備、 結(jié)束判斷等指令, 速度要比簡單程序稍慢些。 循環(huán)程序一般由五部分組成: (1) 初始化部分: 為循環(huán)程序做準(zhǔn)備。 如設(shè)置循環(huán)次數(shù)計(jì)數(shù)器的初值、 地址指針置初值、 為循環(huán)變量賦初值等。(2) 處理部分: 為反復(fù)執(zhí)行的程序段, 是循環(huán)程序的實(shí)體。 (3) 修改部分: 每執(zhí)行一次循環(huán)體后, 對指針作一次修改, 使指針指向下一數(shù)據(jù)所在位置, 為進(jìn)入下一輪處理做準(zhǔn)備。 (4) 控

13、制部分: 根據(jù)循環(huán)次數(shù)、 計(jì)數(shù)器的狀態(tài)或循環(huán)條件等檢查循環(huán)是否能繼續(xù)進(jìn)行, 若循環(huán)次數(shù)到或循環(huán)條件不滿足時(shí), 應(yīng)退出循環(huán), 否則繼續(xù)循環(huán)。 通常(2)、 (3)、 (4)部分又稱為循環(huán)體。 (5) 結(jié)束部分: 分析及存放執(zhí)行結(jié)果。 循環(huán)程序的結(jié)構(gòu)一般有兩種形式: (1) 先進(jìn)入處理部分, 再控制循環(huán), 即至少執(zhí)行一次循環(huán)體, 如圖4-3(a)所示。 (2) 先控制循環(huán), 后進(jìn)入處理部分, 即根據(jù)判斷結(jié)果控制循環(huán)的執(zhí)行與否, 有時(shí)可以不進(jìn)入循環(huán)體就退出循環(huán)程序, 如圖4-3(b)所示。 圖4-3循環(huán)程序的結(jié)構(gòu)形式 循環(huán)結(jié)構(gòu)的程序, 不論是先處理后判斷, 還是先判斷后處理, 其關(guān)鍵是控制循環(huán)的次數(shù)

14、。 根據(jù)需解決問題的實(shí)際情況, 對循環(huán)次數(shù)的控制有多種: 循環(huán)次數(shù)已知的,用計(jì)數(shù)器控制循環(huán); 循環(huán)次數(shù)未知的, 可以按條件控制循環(huán), 也可以用邏輯尺控制循環(huán)。 循環(huán)程序又分單循環(huán)程序和多重循環(huán)程序。 下面舉例說明循環(huán)程序的使用。 1. 單循環(huán)程序1) 循環(huán)次數(shù)已知的循環(huán)程序下面舉幾個(gè)循環(huán)次數(shù)已知的循環(huán)程序例子。【例4-5】工作單元清0。在程序設(shè)計(jì)時(shí), 有時(shí)需要將存儲器中的部分地址作為工作單元, 存放程序執(zhí)行的中間值和結(jié)果。 工作單元清0工作常常放在程序的初始化部分中。 設(shè)有50個(gè)工作單元, 其首址存放在DPTR中, 循環(huán)次數(shù)存放在R2寄存器中, 每執(zhí)行一次循環(huán), R2的內(nèi)容減1, 直至R2=0

15、時(shí), 循環(huán)程序結(jié)束。 流程圖見圖4-4 圖4-4工作單元清0流程圖 CLEAR: CLR A MOV R2, #32H ; 置計(jì)數(shù)值LOOP: MOVX DPTR, A INC DPTR ; 修改地址指針 DJNZ R2, LOOP ; 控制循環(huán) END本例中循環(huán)次數(shù)是已知的。 用R2作循環(huán)次數(shù)計(jì)數(shù)器, 用DJNZ指令修改計(jì)數(shù)器值, 控制循環(huán)的結(jié)束與否。 【例4-6】多個(gè)單字節(jié)數(shù)據(jù)求和。 已知有n個(gè)單字節(jié)數(shù)據(jù), 依次存放在內(nèi)部RAM的40H單元開始的連續(xù)單元中, 要求把計(jì)算結(jié)果存入R2、 R3中(高位存R2, 低位存R3)。 流程圖見圖4-5 。 圖4-5多個(gè)單字節(jié)數(shù)據(jù)求和流程圖 程序如下:

16、NUM EQU 0AHORG 8000H SAD: MOV R0, #40H ; 設(shè)數(shù)據(jù)指針 MOV R5, #NUN ; 計(jì)數(shù)值0AHR5 SAD1: MOV R2, #0 ; 和的高8位清0 MOV R3, #0 ; 和的低8位清0 CLR A LOOP: ADD A, R0; 取加數(shù) MOV R3, A ; 存和的低8位 JNC LOP1 INC R2 ; 有進(jìn)位, 和的高8位+1 LOP1: INC R0 ; 指向下一數(shù)據(jù)地址 DJNZ R5, LOOP END 上述程序中, 用R0作間址寄存器, 每做一次加法, R0加1, 數(shù)據(jù)指針指向下一數(shù)據(jù)地址, R5為循環(huán)次數(shù)計(jì)數(shù)器, 控制循環(huán)

17、的次數(shù)。 2) 循環(huán)次數(shù)未知的循環(huán)程序以上介紹的幾個(gè)循環(huán)程序例子, 它們的循環(huán)次數(shù)是已知的, 適合用計(jì)數(shù)器置初值的方法。 而有些循環(huán)程序事先不知道循環(huán)次數(shù), 不能用以上方法。 這時(shí)需要根據(jù)判斷循環(huán)條件的成立與否, 或用建立標(biāo)志的方式控制循環(huán)程序的結(jié)束。 【例4-7】測試字符串長度。 設(shè)有一串字符依次存放在內(nèi)部RAM的從50H單元開始的連續(xù)單元中。 該字符串以回車符為結(jié)束標(biāo)志。 測字符串長度程序, 即將該字符串中的每一個(gè)字符依次與回車符相比; 若比較不相等, 則統(tǒng)計(jì)字符串長度的計(jì)數(shù)器加1; 若比較相等, 則表示該字符串結(jié)束, 計(jì)數(shù)器中的值就是字符串的長度。 程序如下: CONT: MOV R2,

18、 #0FFHMOV R0, #4FH ; 數(shù)據(jù)指針R0置初值LOOP: INC R0INC R2CJNE R0, #0DH, LOOPEND 待測字符以ASCII碼形式存放在RAM中, 回車符的ASCII碼為0DH, 程序中用一條CJNZ R0, #0DH, LOOP指令實(shí)現(xiàn)字符比較及控制循環(huán)的任務(wù), 當(dāng)循環(huán)結(jié)束時(shí), R2的內(nèi)容為字符串長度。 3) 用邏輯尺控制循環(huán)次數(shù)的循環(huán)程序在實(shí)際應(yīng)用中, 有時(shí)并不要求按一定的固有順序執(zhí)行循環(huán)處理, 而要求處理部分是不規(guī)則的循環(huán)過程。 如調(diào)用處理部分的子程序PRG0、 PRG1共8次。 調(diào)用順序?yàn)椋?第1、 3、 4、 7次是調(diào)用PRG1; 其余是調(diào)用PR

19、G0。 程序的設(shè)計(jì)方法是: 設(shè)總的調(diào)用次數(shù)為循環(huán)次數(shù), 并且另設(shè)一個(gè)標(biāo)志, 用來識別調(diào)用哪個(gè)子程序。 兩個(gè)子程序可以用0和1兩種邏輯狀態(tài)識別, 如用0狀態(tài)表示調(diào)用PRG0, 用1狀態(tài)表示調(diào)用PRG1。 由于總共調(diào)用8次, 因此用一個(gè)寄存器的8位作為8個(gè)標(biāo)志位, 按調(diào)用子程序的順序, 把0、 1存放在寄存器的不同位上。 當(dāng)執(zhí)行程序時(shí), 由寄存器的第0位或第7位起逐位測試, 根據(jù)此位的狀態(tài)決定調(diào)用哪個(gè)子程序。 因此該寄存器好像一把“尺”, 它的內(nèi)容猶如“尺”的“刻度”, 作為識別調(diào)用子程序的標(biāo)志, 人們稱它為“邏輯尺”。 “邏輯尺”的長寬視需要而定, 一個(gè)字節(jié)不夠用, 可以把相鄰的字節(jié)串聯(lián)起來,

20、或者設(shè)定n把“邏輯尺” 。 【例4-8】邏輯尺使用。設(shè)R0為原始數(shù)首地址, R1存放結(jié)果首地址, R3為邏輯尺, 流程圖如圖4-6所示。 圖4-6邏輯尺程序流程圖 程序如下: PRG0 EQU 8360H PRG1 EQU 8200H ORG 8000H TEST: MOV R2, #08H ; 邏輯尺長度 MOV R3, #10110010B ; 設(shè)定邏輯尺 LOOP:MOV A, R0 ; 取數(shù)據(jù) XCH A, R3 RLC A ;左移, 讀尺刻度 XCH A, R3 JC LOOP1 ; 轉(zhuǎn)調(diào)用PRG1 LCALL PRG0 ; 是0, 調(diào)用PRG0 SJMP RELTLOOP1: LC

21、ALL PRG1 RELT: MOV R1, A ; 存結(jié)果 INC R0 INC R1 DJNZ R2, LOOP ;R20, 繼續(xù)循環(huán)END 2. 多重循環(huán)程序如果在一個(gè)循環(huán)體中又包含了其他的循環(huán)程序, 即循環(huán)中還套著循環(huán), 則這種程序稱為多重循環(huán)程序。 【例4-9】10 s延時(shí)程序。 延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān), 如果使用6 MHz晶振, 則一個(gè)機(jī)器周期為2 s, 計(jì)算出執(zhí)行一條指令以及一個(gè)循環(huán)所需要的時(shí)間, 給出相應(yīng)的循環(huán)次數(shù), 便能達(dá)到延時(shí)的目的。 程序如下: DEL: MOV R5, #100DEL0: MOV R6, #200DEL1: MOV R7, #248DE

22、L2: DJNZ R7, DEL2 ;248*2+4 DJNZ R6, DEL1 ; (248*2+4)*200+4 DJNZ R5, DEL0 ; (248*2+4)*200+4)*100+4 RET 上例延時(shí)程序?qū)嶋H延時(shí)為10.000 406 s。 它是一個(gè)三重循環(huán)程序, 利用程序嵌套的方法對時(shí)間實(shí)行延遲是程序設(shè)計(jì)中常用的方法。 使用多重循環(huán)程序時(shí), 必須注意以下幾點(diǎn): (1) 循環(huán)嵌套必須層次分明, 不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2) 外循環(huán)可一層層向內(nèi)循環(huán)進(jìn)入, 結(jié)束時(shí)由里往外一層層退出。 (3) 內(nèi)循環(huán)體可以直接轉(zhuǎn)入外循環(huán)體, 實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。 3. 循環(huán)程序

23、應(yīng)用舉例 1) 不帶符號數(shù)的多字節(jié)加法在處理多字節(jié)運(yùn)算時(shí), 應(yīng)注意低字節(jié)向高字節(jié)的進(jìn)位(或借位)(用進(jìn)位CY判別, 當(dāng)CY=0時(shí), 表示無進(jìn)位或借位, 反之則表示有進(jìn)位或借位)。 在進(jìn)行不帶符號的單字節(jié)二進(jìn)制數(shù)加減運(yùn)算時(shí), 用進(jìn)位CY判別數(shù)的溢出與否。 【例4-11】兩個(gè)多字節(jié)數(shù)P、 Q均以低字節(jié)在前, 高字節(jié)在后的次序, 分別存放在由R0、 R1指出的內(nèi)部RAM中, 相加后存入P數(shù)據(jù)區(qū), 見圖4-8。 圖4-8RAM數(shù)據(jù)存儲示意 程序如下: N1 EQU 0AHORG 8000HSTART1: CLR C ; 清進(jìn)位 MOV R2, #N1 ; 取字節(jié)數(shù)MADD: MOV A, R0 ; 取

24、加數(shù)(一個(gè)字節(jié)) ADDC A, R1; 兩數(shù)相加(由低字節(jié)開始) MOV R0, A INC R0 INC R1 DJNZ R2, MADD ; 兩數(shù)加完? JC ERR ; 和字節(jié)數(shù)大于n, 則溢出錯(cuò) RETERR: END 上例中若將ADDC A, R1指令改為SUBB A, R1指令, 則該程序就是多字節(jié)減法程序。 無符號數(shù)的減法運(yùn)算, 被減數(shù)必須大于減數(shù)。 不帶符號的十進(jìn)制數(shù)加法程序的設(shè)計(jì)思想與上例相同。 MCS-51指令系統(tǒng)中沒有直接的十進(jìn)制數(shù)加法指令, 要做十進(jìn)制BCD碼加減運(yùn)算, 只要在加、 減指令后跟一條DA A指令, 即可使運(yùn)算結(jié)果成為十進(jìn)制數(shù)的形式。 4.4散轉(zhuǎn)程序設(shè)計(jì)散

25、轉(zhuǎn)程序是分支結(jié)構(gòu)程序中的一種并行分支程序。它是根據(jù)某種輸入或運(yùn)算結(jié)果,分別轉(zhuǎn)向各個(gè)處理程序。在MCS-51單片機(jī)中,散轉(zhuǎn)指令為JMP A+DPTR,它按照程序運(yùn)行時(shí)決定的地址執(zhí)行間接轉(zhuǎn)移指令。例:根據(jù)R7中的內(nèi)容,轉(zhuǎn)向各個(gè)子程序。說明:(1) 采用AJMP即把PC指向子程序的起始地址;(2) R7+R7=R72,與AJMP的機(jī)器碼匹配,因n128,不會進(jìn)位;(3) 如用LJMP,則需R73,程序需要作相應(yīng)修改。圖4.2 散轉(zhuǎn)程序流程圖4.5子程序和參數(shù)傳遞方法在解決實(shí)際問題時(shí),經(jīng)常會遇到一個(gè)程序中多次使用同一個(gè)程序段,例如延時(shí)程序、查表程序、算術(shù)運(yùn)算程序段等功能相對獨(dú)立的程序段。 為了節(jié)約內(nèi)存

26、,我們把這種具有一定功能的獨(dú)立程序段編成子程序。調(diào)用程序稱為主程序,被調(diào)用的程序稱為子程序。調(diào)用子程序有幾個(gè)優(yōu)點(diǎn): (1) 避免了對相同程序段的重復(fù)編制。 (2) 簡化程序的邏輯結(jié)構(gòu), 同時(shí)也便于子程序調(diào)試。 (3) 節(jié)省存儲器空間。 MCS-51指令系統(tǒng)中, 提供了兩條調(diào)用子程序指令: ACALL及LCALL, 并提供了一條返回主程序的指令RET。 子程序的編寫和調(diào)用應(yīng)該做到:(1) 標(biāo)準(zhǔn)化。注釋中應(yīng)該注明程序名、功能、入口、出口和所占用的寄存器和存儲單元。(2) 現(xiàn)場保護(hù)。 如果在調(diào)用前,程序已經(jīng)使用了某些存儲單元或寄存器,在調(diào)用時(shí),這些寄存器和存儲單元又有其它用途,就應(yīng)該先把這些單元和寄

27、存器中的內(nèi)容壓入堆棧進(jìn)行保護(hù)。調(diào)用完后,再從堆棧中彈出,加以恢復(fù)。如果有較多的寄存器需要保護(hù),應(yīng)使主程序和子程序使用不同的寄存器組。例1:從內(nèi)部RAM 22H單元開始存有一個(gè)無符號數(shù)數(shù)據(jù)塊,長度n存于21H中。求出數(shù)據(jù)塊中的最小數(shù),存于20H中。ORG 0030H MOV R0,#22H;數(shù)據(jù)塊起始地址 MOV R1,21H;數(shù)據(jù)個(gè)數(shù)n MOV 20H,#0FFH;初始化最小數(shù)為0FFHLOOP:MOV A,R0;取新數(shù) INC R0 ;為取下一個(gè)新數(shù)做準(zhǔn)備 CJNE A,20H,LOOP1;與原最小數(shù)比較LOOP1:JNC NEXT ;大于等于,原最小數(shù)保留 MOV 20H,A ;小于,改變

28、最小數(shù)NEXT:DJNZ R1,LOOP ;判斷循環(huán) END4.6查表程序設(shè)計(jì)查表程序是一種常用程序, 它廣泛使用于LED顯示器控制、 打印機(jī)打印以及數(shù)據(jù)補(bǔ)償、 計(jì)算、 轉(zhuǎn)換等功能程序中, 具有程序簡單、 執(zhí)行速度快等優(yōu)點(diǎn)。 查表, 就是根據(jù)變量x與y的關(guān)系y=f(x), 在表格中查找y。 MCS-51系列單片機(jī)專門提供了兩條查表指令:MOVC A,A+DPTRMOVC A,A+PC例1:設(shè)有一個(gè)巡回檢測報(bào)警裝置,需對16路輸入進(jìn)行控制,每路有一個(gè)最大允許值(為雙字節(jié))。控制時(shí)需根據(jù)測量的通道,找出每路的最大值,高、低8位分放于R3、R4。ORG 0000HSTART:MOVA,R2;待查通道

29、數(shù)送A ADDA,R2;待查通道數(shù)乘2,與數(shù)據(jù)表中的地址相配 MOV R3,A;保存通道數(shù) MOV DPTR, #ADDR8 ;表格首址送DPTR MOVC A,A+DPTR;查出對應(yīng)通道的最大允許值高位字節(jié) INC R3;為指向下一個(gè)地址單元做準(zhǔn)備 XCH A,R3 MOVC A,A+DPTR;查出對應(yīng)通道的最大允許值低位字節(jié) MOV R4,A;存入R4 ADDR8:DW 1520H,3721H,4264H,7850H;最大允許值表 DW 3484H,3265H,8830H,9947HEND例2 在程序中定義一個(gè)09的平方表,利用查表指令找出累加器A=05H的平方值。 (1) 題意分析 所謂

30、表格是指在程序中定義的一串有序的常數(shù),如平方表、字型碼表、鍵碼表等。因?yàn)槌绦蛞话愣际枪袒诔绦虼鎯ζ鳎ㄍǔJ侵蛔x存儲器ROM類型)中,因此可以說表格是預(yù)先定義在程序的數(shù)據(jù)區(qū)中,然后和程序一起固化在ROM中的一串常數(shù)。 查表程序的關(guān)鍵是表格的定義和如何實(shí)現(xiàn)查表。 (2) 匯編語言源程序。 ORG0000H MOV DPTR, #TABLE ;表首地址DPTR(數(shù)據(jù)指針) MOVA,#05 ;05A MOVCA,A+DPTR;查表指令,25A,A=19H SJMP$;程序暫停 TABLE:DB0,1,4,9,16,25,36,49,64,81;定義09平方表 END4.7數(shù)制轉(zhuǎn)換日常生活中, 人們

31、習(xí)慣用十進(jìn)制數(shù)進(jìn)行各種運(yùn)算, 但在計(jì)算機(jī)內(nèi)部卻只能用二進(jìn)制數(shù)運(yùn)算。 用二進(jìn)制編碼的十進(jìn)制數(shù)就是能把十進(jìn)制數(shù)轉(zhuǎn)換成適合計(jì)算機(jī)使用的一種數(shù)制, 稱為BCD碼。 數(shù)制轉(zhuǎn)換、 代碼轉(zhuǎn)換在使用計(jì)算機(jī)時(shí)是必不可少的部分。 下面將介紹幾個(gè)常用的轉(zhuǎn)換程序。 3 十六進(jìn)制數(shù)轉(zhuǎn)換成七段代碼七段發(fā)光二極管顯示一個(gè)數(shù)時(shí), 該數(shù)對應(yīng)的代碼為七段代碼, 圖4-15為七段代碼顯示器的共陽極接法, 當(dāng)相應(yīng)段加上“0”電平時(shí), 該段亮。 圖4-15七段數(shù)碼管顯示器結(jié)構(gòu) 由表4-1的七段代碼表看出, 七段代碼和數(shù)字之間沒有什么規(guī)律, 所以適合用查表的方法進(jìn)行轉(zhuǎn)換。 先把七段代碼按0F的順序存入存儲器, 表首地址為TABS。 利用表首地址相加待轉(zhuǎn)換值, 即得到對應(yīng)代碼所在的單元地址, 從中取得需要的代碼。 表 4-1七 段 代 碼

溫馨提示

  • 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

提交評論