【大學(xué)課件】單片機(jī)原理與接口技術(shù)課件-MCS-51匯編語言程序設(shè)計(jì)_第1頁
【大學(xué)課件】單片機(jī)原理與接口技術(shù)課件-MCS-51匯編語言程序設(shè)計(jì)_第2頁
【大學(xué)課件】單片機(jī)原理與接口技術(shù)課件-MCS-51匯編語言程序設(shè)計(jì)_第3頁
【大學(xué)課件】單片機(jī)原理與接口技術(shù)課件-MCS-51匯編語言程序設(shè)計(jì)_第4頁
【大學(xué)課件】單片機(jī)原理與接口技術(shù)課件-MCS-51匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1*單片機(jī)原理與接口技術(shù)第4章 MCS-51匯編語言程序設(shè)計(jì)/sundae_meng1*單片機(jī)原理與接口技術(shù)第4章 MCS-51匯編語言程序2*(1) 了解匯編語言編程的基礎(chǔ)知識。(2) 了解匯編語言程序設(shè)計(jì)的基本步驟和方法。(3) 了解匯編語言目標(biāo)程序效率高、占存儲空間少、運(yùn)行速度快、實(shí)時(shí)性強(qiáng)等特點(diǎn)。(4) 掌握MCS-51匯編語言的順序、分支、循環(huán)、查表及子程序的結(jié)構(gòu)。(5) 掌握算術(shù)運(yùn)算、數(shù)制轉(zhuǎn)換及標(biāo)度變換等實(shí)用匯編程序的編程方法。本章教學(xué)要求 2*(1) 了解匯編語言編程的基礎(chǔ)知識。本章教學(xué)要求 3*4.1 程序設(shè)計(jì)概述4.1.1 程序設(shè)計(jì)的步驟4.1.2 程序設(shè)計(jì)的方法4.1.3 匯

2、編語言的規(guī)范4.1.4 匯編語言程序編輯和匯編4.2 結(jié)構(gòu)化程序設(shè)計(jì)方法本 章 目 錄4.2.1 順序結(jié)構(gòu)程序4.2.2 分支結(jié)構(gòu)程序4.2.3 循環(huán)結(jié)構(gòu)程序4.2.4 查表程序4.2.5 子程序4.3 匯編語言程序設(shè)計(jì)實(shí)例習(xí)題與思考題3*4.1 程序設(shè)計(jì)概述本 章 目 錄4.2.1 順序結(jié)4*4.1 程序設(shè)計(jì)概述本章介紹使用MCS-51指令系統(tǒng)編寫匯編程序的方法。與高級語言相比,匯編語言具有實(shí)時(shí)性好、代碼效率高、執(zhí)行速度快以及節(jié)約內(nèi)存空間等優(yōu)點(diǎn),同時(shí)還可以充分利用機(jī)器的硬件結(jié)構(gòu)與功能來操作硬件端口。本章介紹匯編語言程序編寫的一般知識、程序設(shè)計(jì)的基本步驟和格式,以及各種類型的程序設(shè)計(jì),包括順序

3、程序、分支程序、循環(huán)程序、查表程序和子程序等。4*4.1 程序設(shè)計(jì)概述本章介紹使用MCS-51指令系統(tǒng)編5*4.1.1 程序設(shè)計(jì)的步驟MCS-51單片機(jī)提供111條指令,它們以指令助記符的形式出現(xiàn),指令助記符的集合稱為匯編語言。由匯編語言編寫的程序稱為匯編語言源程序。匯編語言源程序必須翻譯成機(jī)器代碼組成的目標(biāo)程序,機(jī)器才能執(zhí)行。用匯編語言編制程序的過程,稱為匯編語言程序設(shè)計(jì)。5*4.1.1 程序設(shè)計(jì)的步驟MCS-51單片機(jī)提供1116*使用匯編語言設(shè)計(jì)一個(gè)程序,大致可分為以下幾個(gè)步驟: 1) 分析題意,明確要求。2) 確定算法。3) 畫程序流程圖,用圖解來描述和說明解題步驟。4) 分配內(nèi)存單元

4、,確定程序與數(shù)據(jù)區(qū)的存放地址。5) 編寫源程序。6) 程序優(yōu)化。7) 上機(jī)調(diào)試、修改和最后確定源程序。4.1.1 程序設(shè)計(jì)的步驟6*使用匯編語言設(shè)計(jì)一個(gè)程序,大致可分為以下幾個(gè)步驟: 4.7*4.1.2 程序設(shè)計(jì)的方法1模塊化程序設(shè)計(jì)2盡量采用循環(huán)及子程序結(jié)構(gòu)3自上而下的程序設(shè)計(jì)7*4.1.2 程序設(shè)計(jì)的方法1模塊化程序設(shè)計(jì)8*4.1.3 匯編語言的規(guī)范匯編語言源程序由匯編指令和偽指令兩者構(gòu)成。用匯編語言編寫的源程序通常需經(jīng)過微機(jī)匯編程序編譯(匯編)成機(jī)器碼后才能被單片機(jī)執(zhí)行。為了對源程序匯編,在源程序中必須使用一些“偽指令”。偽指令是便于程序閱讀和編寫的指令,它即不控制機(jī)器的操作也不能被匯編

5、成機(jī)器代碼,只是為匯編程序所識別的常用符號,并指導(dǎo)匯編如何進(jìn)行,故稱為偽指令。8*4.1.3 匯編語言的規(guī)范匯編語言源程序由匯編指令和偽9*標(biāo)號: 助記符 操作數(shù)1 ,操作數(shù)2 ,操作數(shù)3 ;注釋標(biāo)號:標(biāo)號是指令地址的標(biāo)識符號。有了標(biāo)號,程序中的其它語句才能訪問該語句。有關(guān)標(biāo)號的規(guī)定如下。1) 標(biāo)號由18個(gè)ASCII字符組成。第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其它特定字符;2) 標(biāo)號不能使用該匯編語言已經(jīng)定義了的符號。如指令助記符、偽指令以及寄存器符號名稱等;3) 標(biāo)號后邊必須跟以冒號。1匯編指令格式4.1.3 匯編語言的規(guī)范-標(biāo)號9*標(biāo)號: 助記符 操作數(shù)1 ,操作數(shù)2 ,操作

6、10*操作數(shù):操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語句中操作數(shù)可能是空白的,也可能包括兩項(xiàng)或三項(xiàng)。各操作數(shù)間用逗號分隔。操作數(shù)字段的內(nèi)容可能包括工作寄存器、特殊功能寄存器、標(biāo)號、常數(shù)和表達(dá)式。注釋:對程序加以說明,是不可執(zhí)行部分。注釋字段必須以分號“;”開頭,長度不限,當(dāng)一行書寫不下時(shí),可以換行接著書寫,但換行時(shí)應(yīng)注意在開頭使用分號“;”。4.1.3 匯編語言的規(guī)范-操作數(shù)10*操作數(shù):操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯11*MCS-51系列單片機(jī)的常用偽指令有:ORG、 END、EQU、DB、DW、DS和BIT等。2偽指令4.1.3 匯編語言的規(guī)范-偽指令ORG格式:

7、標(biāo)號: ORG 16位地址功能:規(guī)定程序塊或數(shù)據(jù)塊存放的起始地址。如:ORG8000H;規(guī)定下面的第一條指令從地址8000H單元開始存放,即標(biāo)號START的值為8000HSTART:MOVA, #30H.(1) 匯編起始偽指令ORG11*MCS-51系列單片機(jī)的常用偽指令有:ORG、 12*格式:標(biāo)號:END 表達(dá)式功能:結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯 編程序不予處理。(2)匯編結(jié)束偽指令END4.1.3 匯編語言的規(guī)范-偽指令END如: ORG2000HSTART: MOVA, #00H END START;表示標(biāo)號START開始的程序段結(jié)束。 12

8、*格式:標(biāo)號:END 表達(dá)式(2)匯編結(jié)束偽13*格式:字符名稱 EQU 操作數(shù)功能:將操作數(shù)賦予規(guī)定的字符名稱。(3)等值偽指令EQU4.1.3 匯編語言的規(guī)范-偽指令EQU如:ABEQU 16HDELYEQU 1234HMOV A, ABLCALL DELY13*格式:字符名稱 EQU 操作數(shù)(3)等值偽指令EQ14*格式:標(biāo)號:DB 8位二進(jìn)制數(shù)表功能:DB指令是在程序存儲器(ROM)中,從指定的地址單元開始,定義若干個(gè)8位內(nèi)存單元的內(nèi)容。用來在程序存儲器的某一部分存入一組8位二進(jìn)制數(shù),或者是將一個(gè)數(shù)據(jù)表格存入程序存儲器。這個(gè)偽指令在匯編以后,將影響程序存儲器的內(nèi)容。(4)定義字節(jié)偽指令

9、DB4.1.3 匯編語言的規(guī)范-偽指令DB14*格式:標(biāo)號:DB 8位二進(jìn)制數(shù)表(4)定15*以上偽指令經(jīng)匯編以后,將從1010H開始的若干內(nèi)存單元賦值: (1010H)=20H (1011H)=43H (1012H)=25H (1013H)=FFH其中43H是字符C的ASCII碼,F(xiàn)FH是數(shù)值-1的補(bǔ)碼,十進(jìn)制數(shù)32也換算為16進(jìn)制數(shù)20H。4.1.3 匯編語言的規(guī)范-偽指令DB的應(yīng)用如:ORG1010H TAB:DB32, C, 25H, -115*以上偽指令經(jīng)匯編以后,將從 (1010H)=20H其中16*標(biāo)號:DW 16位二進(jìn)制數(shù)表功能:DW指令是在程序存儲器(ROM)中,從指定的地址

10、單元開始,定義若干個(gè)16位數(shù)據(jù)。一個(gè)16位數(shù)要占兩個(gè)存儲單元,其中高8位存入低地址單元,低8位存入高地址單元。例如:ORG 1100HTAB: DW1234H, 0ABH 10以上偽指令經(jīng)匯編以后,將對從1100H開始的若干內(nèi)存單元賦值。(5)定義字偽指令DW4.1.3 匯編語言的規(guī)范-偽指令DW16*標(biāo)號:DW 16位二進(jìn)制數(shù)表(5)定義字偽指令17*(1100H)=12H(1101H)=34H(1102H)=00H(1103H)=ABH(1104H)=00H(1105H)=0AH其數(shù)據(jù)存儲格式如右表所示。DB、DW偽指令都只對程序存儲器(ROM)起作用,不能對數(shù)據(jù)存儲器(RAM)的內(nèi)容進(jìn)行

11、賦值或進(jìn)行初始化工作。例如:ORG1100HTAB:DW1234H, 0ABH 104.1.3 匯編語言的規(guī)范-偽指令DW的應(yīng)用17*(1100H)=12H其數(shù)據(jù)存儲格式如右表所示。例如:18*標(biāo)號:DS 表達(dá)式功能:從指定(標(biāo)號)地址開始(無標(biāo)號時(shí)從順序地址開始),保留指定數(shù)目(表達(dá)式的值)的字節(jié)單元作為備用存儲區(qū),供程序運(yùn)行使用(用于程序存儲器)。這些單元的初值均為0。例如: ORG 2000H TAB: DS 05H經(jīng)匯編后,從地址2000H開始預(yù)留5個(gè)存儲單元。(6)定義存儲區(qū)偽指令DS4.1.3 匯編語言的規(guī)范-偽指令DS18*標(biāo)號:DS 表達(dá)式(6)定義存儲區(qū)偽指令DS419*字符

12、名稱BIT 位地址功能:將位地址賦給字符名稱。例如:SBITP1.0經(jīng)匯編后,S符號的值是P1.0的地址90H。(7)位定義偽指令BIT4.1.3 匯編語言的規(guī)范-偽指令BIT19*字符名稱BIT 位地址(7)位定義偽指令BIT4.20*4.1.4 匯編語言程序編輯和匯編1匯編語言源程序編輯-編寫規(guī)范 DATA0EQU 30H ;將30H賦予字符名稱DATA0ORG4000H ;規(guī)定下面程序從4000H單元開始存放MOVR0, #DATA0 ;30HR0MOVR1, DATA0 ;(30H)R1CJNER1, #00H, NEXT;R1000H,則轉(zhuǎn)NEXTHERE:SJMPHERENEXT:

13、CLRA;0ALOOP:INCR0;(R0)+1R0ADDA, R0;(A)+(R0)ADJNZR1, LOOP;(R1)-1R1,R1 0,則轉(zhuǎn)LOOPSJMPHEREEND;匯編到此結(jié)束20*4.1.4 匯編語言程序編輯和匯編1匯編語言源程序21*源程序 地址 目標(biāo)碼DATA0EQU30HORG4000HMOVR0, #DATA0 ;40007830MOVR1, DATA0 ;4002A930CJNER1, #00H, NEXT;4004B90002HERE:SJMPHERE ;400780FENEXT:CLRA ;4009E4LOOP:INCR0 ;400A08ADDA, R0 ;400

14、B26DJNZR1, LOOP ;400CD9FCSJMPHERE ;400E80F7END2匯編語言源程序的匯編4.1.4 匯編語言程序編輯和匯編-源程序匯編21*源程序 地址 22*4.2 結(jié)構(gòu)化程序設(shè)計(jì)方法在匯編語言程序設(shè)計(jì)中,普遍采用結(jié)構(gòu)化程序設(shè)計(jì)方法。采用這種設(shè)計(jì)方法的主要依據(jù)是任何復(fù)雜的程序都可由順序結(jié)構(gòu)、分支結(jié)構(gòu)及循環(huán)結(jié)構(gòu)程序等構(gòu)成。每種結(jié)構(gòu)只有一個(gè)入口和出口,整個(gè)程序也只有一個(gè)入口和出口。結(jié)構(gòu)程序設(shè)計(jì)的特點(diǎn)是程序的結(jié)構(gòu)清晰、易于讀寫和驗(yàn)證、可靠性高。下面主要介紹結(jié)構(gòu)化程序設(shè)計(jì)的基本程序設(shè)計(jì)方法。-程序結(jié)構(gòu)22*4.2 結(jié)構(gòu)化程序設(shè)計(jì)方法在匯編語言程序設(shè)計(jì)中,普遍23*4.2.1

15、 順序結(jié)構(gòu)程序例4-1 將片內(nèi)RAM的20H單元中的壓縮BCD碼拆成兩個(gè)ACSII碼存入21H、22H單元。低4位存在21H單元,高4位存在22H單元。-順序結(jié)構(gòu)實(shí)例ORG2000HMOVA, 20HMOVB, #10H ;除以10HDIVABORLB, #30H ;低4位BCD碼轉(zhuǎn)換為ASCII碼MOV21H, BORLA, #30H ;高4位BCD碼轉(zhuǎn)換為ASCII碼MOV22H, AEND23*4.2.1 順序結(jié)構(gòu)程序例4-1 將片內(nèi)RAM的2024*例4-2 設(shè)有16位二進(jìn)制數(shù)存放在內(nèi)部RAM的50H及51H單元中,要求將其算術(shù)左移一位(即原數(shù)各位均向左移1位,最低位移入0)后仍存放在

16、原單元。試編制相應(yīng)的程序。4.2.1 順序結(jié)構(gòu)程序-順序結(jié)構(gòu)實(shí)例 ORG 4000HBIHROL: CLR C ;Cy清零 MOV A, 51H ;低8位向左環(huán)移1位 RLC A MOV 51H, A MOV A, 50H ;高8位向左環(huán)移1位 RLC A MOV 50H, A END24*例4-2 設(shè)有16位二進(jìn)制數(shù)存放在內(nèi)部RAM的50H及25*4.2.2 分支程序分支程序可根據(jù)要求無條件或有條件地改變程序執(zhí)行流向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令。分支程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散轉(zhuǎn))。編寫程序,根據(jù)x的值求y的值,并放回原單元中。-分支結(jié)構(gòu)例4-3 設(shè)變量x以補(bǔ)碼形

17、式存放在片內(nèi)RAM的30H單元中,變量y與x的關(guān)系是:25*4.2.2 分支程序分支程序可根據(jù)要求無條件或有條件26*4.2.2 分支程序-分支結(jié)構(gòu)實(shí)例 ORG1000HSTART: MOV A, 30H JZ NEXT ;x=0,轉(zhuǎn)移 ANL A, #80H ;保留符號位 JZ ED ;x 0 ,轉(zhuǎn)移MOV A, #05H ;x A,那么將x送A;如果Ax,那么A值不變,直到最后一個(gè)單元內(nèi)容與A比較、操作完畢,則A中就是該數(shù)組中的最大數(shù),這里需要解決如何判別兩個(gè)帶符號數(shù)A和x的大小。通??梢圆捎萌缦碌姆椒ǎ菏紫扰袛郃和x是否同號,若是同號則進(jìn)行A-X操作,如差0,那么AX;如果差0,那么AX

18、(或A);如為負(fù),則A(或x)x(或A)。程序如下:-循環(huán)結(jié)構(gòu)實(shí)例4.2.3 循環(huán)程序31*分析:-循環(huán)結(jié)構(gòu)實(shí)例4.2.3 循環(huán)程序32*-循環(huán)結(jié)構(gòu)實(shí)例4.2.3 循環(huán)程序 ORG1000HSCMPPMA:MOVR0, #20H;置取數(shù)指針R0初值 MOVB, #59H;置循環(huán)計(jì)數(shù)器B初值 MOVA, R0;第一個(gè)數(shù)送ASCLOOP: INCR0;修改指針 MOVR1, A;暫存 XRLA, R0;兩數(shù)符號相同? JBACC.7, RESLAT;若相異,則轉(zhuǎn)RESLAT:MOVA, R1;若相同,則恢復(fù)A中原來值 CLRC;C清零 SUBBA, R0 ;兩數(shù)相減,以判斷兩者的大小32*-循環(huán)結(jié)

19、構(gòu)實(shí)例4.2.3 循環(huán)程序 33*-循環(huán)結(jié)構(gòu)實(shí)例4.2.3 循環(huán)程序 JNB ACC.7, SMEXT1 ;若A中值為大,則轉(zhuǎn)SMEXT1CXAHER:MOV A, R0 ;若A中值為小,則將大數(shù)送入A SJMP SMEXT2RESLAT: XRL A, R0 ;恢復(fù)A中原值 JNB ACC.7, SMEXT2 ;若A中值為正,側(cè)轉(zhuǎn)SMEXT2 SJMP CXAHER ;若A中值為負(fù),則轉(zhuǎn)CXAHERSMEXT1: MOV R1,A ;恢復(fù)A中原值SMEXT2: DJNZ B, SCLOOP MOV 1FH, A ;最大者送1FH單元 END33*-循環(huán)結(jié)構(gòu)實(shí)例4.2.3 循環(huán)程序 34*例4

20、-6 將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buf的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)“$”字符停止傳送。本例結(jié)束條件為找到“$”停止傳送。程序如下:4.2.3 循環(huán)程序-循環(huán)結(jié)構(gòu)實(shí)例34*例4-6 將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送35*4.2.3 循環(huán)程序 ORG8000HMOVR0, #DATA ;置源數(shù)據(jù)區(qū)首地址MOVDPTR, #BUF ;置目的數(shù)據(jù)區(qū)首地址LOOP0:MOV A, R0;取數(shù)據(jù)CJNEA, #24H, LOOP1;判斷是否為$字符SJMPLOOP2;是$,轉(zhuǎn)結(jié)束LOOP1:MOVX DPTR, A;不是$,執(zhí)行傳送INCR0 ;修改源地址I

21、NCDPTR ;修改目的地址SJMPLOOP0 ;傳送下一個(gè)數(shù)據(jù)LOOP2:END-循環(huán)結(jié)構(gòu)實(shí)例35*4.2.3 循環(huán)程序 ORG36*例4-7 設(shè)8031單片機(jī)使用12MHz晶振(機(jī)器周期T為ls),試設(shè)計(jì)延遲100ms的延時(shí)程序。4.2.3 循環(huán)程序 ORG4000HDEYPRG:MOV R5, #100 ;置外循環(huán)計(jì)數(shù)器R5初值為100LOOP1: MOV R6, #200 ;置2層循環(huán)計(jì)數(shù)器R6初值為200LOOP2: MOV R7, #248 ;置3層循環(huán)計(jì)數(shù)器R7初值為248LOOP3: DJNZ R7, LOOP3 ;3層循環(huán)計(jì)數(shù)結(jié)束否? DJNZ R6, LOOP2 ;2層循環(huán)

22、計(jì)數(shù)結(jié)束否? DJNZ R5, LOOP1 ;外循環(huán)計(jì)數(shù)結(jié)束否? RET36*例4-7 設(shè)8031單片機(jī)使用12MHz晶振(機(jī)器周期37*在上例程序中采用了多重循環(huán)程序,即在一個(gè)循環(huán)體中又包含了其他的循環(huán)程序,這種方法是實(shí)現(xiàn)延時(shí)程序的常用方法。使用多重循環(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)方式。4.2.3 循環(huán)程序37*在上例程序中采用了多重循環(huán)程序,即在一個(gè)循環(huán)體中又包含38*4.2.4 查表程序查表程序是一種常用

23、的程序,它廣泛使用于LED顯示器控制、打印以及數(shù)據(jù)補(bǔ)償、計(jì)算、轉(zhuǎn)換等功能程序中,具有程序簡單、執(zhí)行速度快等優(yōu)點(diǎn)。查表,就是根據(jù)變量x在表格中查找y,使y=f (x)。例4-8 試編寫程序,將16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。分析:16進(jìn)制09的ASCII碼為3039H,AF的ASCII碼為41H46H,ASCII碼表的首地址為ASCTAB。入口:HEX單元的低四位存放16進(jìn)制數(shù)。出口:轉(zhuǎn)換后的ASCII碼送回HEX單元。-查表程序38*4.2.4 查表程序查表程序是一種常用的程序,它廣泛39*-查表程序4.2.4 查表程序 ORG0200HHEXEQU33HHEXASC:MOVA, HEXANLA

24、, #0FHMOVDPTR, #ASCTABMOVCA, A+DPTRMOVHEX, ARETASCTAB:DB30H, 31H, 32H, 33HDB34H, 35H, 36H, 37HDB38H, 39H, 41H, 42HDB43H, 44H, 45H, 46HEND39*-查表程序4.2.4 查表程序 40*例4-9 設(shè)有一個(gè)巡回檢測報(bào)警裝置,需對16路輸入進(jìn)行檢測,每路有一個(gè)最大允許值,它為雙字節(jié)。檢測時(shí)需根據(jù)測量的路數(shù),找出該路的最大允許值。再判斷輸入值是否大于最大允許值,如大于則報(bào)警。這里只考慮查找最大值。分析:設(shè)x為路數(shù),放在R2中。y為最大允許值,放在表格中。查表后,最大值放

25、在R3、R4中。4.2.4 查表程序-查表程序40*例4-9 設(shè)有一個(gè)巡回檢測報(bào)警裝置,需對16路輸入進(jìn)行41* ORG4000HPM1:MOVA, R2;其值范圍為00H0FH(如04) ADDA, R2;A(R2)2,因最大允許值占兩個(gè)字節(jié)(如08) MOVR3, A;R3(R2)2(如08) ADDA, #06H;加偏移量,(如400CH-4006H=#06H) MOVCA, A+PC ;查第1字節(jié)(如地址=400CH+8=4015H) XCHA, R3;存第1字節(jié)(如33),準(zhǔn)備取第2字節(jié) ADDA, #03H;加偏移量(如400CH-400AH+01H=#03H) MOVC A, A

26、+PC ;查第2字節(jié)(如400AH+0BH=4016H) MOVR4, A;存第2字節(jié)(如88) RETTABI: DW2520, 3721, 4264, 7560, 3388, 3265, 7883, 9943 ;最大值表DW1050, 4051, 6785, 8931, 5468, 5871, 3284, 66884.2.4 查表程序-查表程序41* ORG4000H4.2.4 查表42*4.2.5 子程序同一個(gè)程序中,往往有許多地方都需要執(zhí)行同樣的一項(xiàng)任務(wù),這時(shí)可以對這項(xiàng)任務(wù)進(jìn)行獨(dú)立的編寫,形成一個(gè)子程序。在原來的主程序中需要執(zhí)行該任務(wù)時(shí),調(diào)用該子程序,執(zhí)行完后又返回主程序,繼續(xù)以后的操

27、作,這就是所謂的子程序結(jié)構(gòu)。在程序設(shè)計(jì)過程中,適當(dāng)?shù)厥褂米映绦蚓哂幸韵聝?yōu)點(diǎn):1) 不必重復(fù)編寫同樣的程序,提高了編碼的效率。2) 縮短了源程序和目標(biāo)程序的長度,節(jié)省了程序存儲器的空間。3) 使程序模塊化、通用化,便于閱讀、交流和共享。4) 便于分塊調(diào)試。-子程序42*4.2.5 子程序同一個(gè)程序中,往往有許多地方都需要43*在子程序調(diào)用過程中須解決以下兩個(gè)方面的問題:1) 保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。2) 調(diào)用程序與被調(diào)用程序之間的參數(shù)傳遞。保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場方法就是在進(jìn)入子程序時(shí),將需要保護(hù)的數(shù)據(jù)推入堆棧,而空出這些數(shù)據(jù)所占用的工作單元,供子程序中使用。在返回調(diào)用程序之前,再將推入堆棧的數(shù)據(jù)彈出到原

28、有的工作單元,恢復(fù)其原來的狀態(tài),使調(diào)用程序可以繼續(xù)往下執(zhí)行。 4.2.5 子程序-子程序43*在子程序調(diào)用過程中須解決以下兩個(gè)方面的問題:4.2.544*參數(shù)傳遞子程序調(diào)用時(shí),要特別注意主程序與子程序之間的信息交換問題。在調(diào)用一個(gè)子程序時(shí),主程序應(yīng)先把有關(guān)參數(shù)(子程序入口條件)放到某些約定的位置,子程序在運(yùn)行時(shí),可以從約定的位置得到有關(guān)參數(shù)。同樣子程序結(jié)束前,也應(yīng)把處理結(jié)果(出口條件)送到約定位置。返回后,主程序便可從這些位置得到需要的結(jié)果,這就是參數(shù)傳遞。4.2.5 子程序-參數(shù)傳遞44*參數(shù)傳遞4.2.5 子程序-參數(shù)傳遞45*參數(shù)傳遞大致可分為以下幾種方法:1) 傳遞數(shù)據(jù) 將數(shù)據(jù)通過工作

29、寄存器R0R7和累加器來傳送。即主程序和子程序在交接處,通過上述寄存器和累加器存儲同一參數(shù)。2) 傳送地址 數(shù)據(jù)存放在數(shù)據(jù)存儲器中,參數(shù)傳遞時(shí)只通過R0、R1或DPTR傳遞數(shù)據(jù)所存放的地址。3) 通過堆棧傳遞參數(shù) 在調(diào)用之前,先把要傳送的參數(shù)壓入堆棧,進(jìn)入子程序之后,再將壓入堆棧的參數(shù)彈出到工作寄存器或者其他內(nèi)存單元。4.2.5 子程序-參數(shù)傳遞45*參數(shù)傳遞大致可分為以下幾種方法:4.2.5 子程序-46*例4-10 試編寫程序,計(jì)算分析:a1、a2、.、a10存放在內(nèi)部RAM的20H開始的存儲區(qū)域內(nèi),計(jì)算所得結(jié)果存放在R3、R2中。要求:平方運(yùn)算編寫成子程序SORT,主程序通過調(diào)用SORT

30、并求和完成運(yùn)算。參數(shù)的傳遞用累加器。4.2.5 子程序-子程序應(yīng)用46*例4-10 試編寫程序,計(jì)算分析:a1、a2、.47*ORG8000HMAIN: MOVR0, #20H;置數(shù)據(jù)指針MOVR7, #10;置計(jì)數(shù)初值MOVR3, #0;結(jié)果單元清零MOVR2, #0LOOP: MOVA, R0;取數(shù)ACALLSORT;調(diào)用求平方子程序ADDA, R2;累加平方和MOVR2, AADDCA, #0 ;加進(jìn)位CyINCR0 ;修改指針DJNZR7, LOOP;未完,繼續(xù)4.2.5 子程序-子程序應(yīng)用47*ORG8000H4.2.5 子程序-48* SJMPENSORT: MOVDPTR, #T

31、AB ;進(jìn)入子程序查平方表 MOVCA, A+DPTR RET ;返主程序TAB: DB0, 1, 4, 9, 16 DB25, 36, 49, 64, 81EN: NOP END4.2.5 子程序-子程序應(yīng)用48* SJMPEN4.2.5 子程序-子程49*例4-11 設(shè)有50個(gè)用ASCII碼表示的16進(jìn)制數(shù)存放在內(nèi)部RAM以30H為首址的連續(xù)單元中。要求將其轉(zhuǎn)換成相應(yīng)的16進(jìn)制數(shù)并存放到外部RAM以4100H為首址的25個(gè)連續(xù)單元中。根據(jù)上述要求,使用堆棧傳遞參數(shù)的方法編寫程序。4.2.5 子程序-子程序應(yīng)用49*例4-11 設(shè)有50個(gè)用ASCII碼表示的16進(jìn)制數(shù)存50* ORG 400

32、0HMAIASH: MOV R0, #2FH;置取數(shù)指針R0初值,從30H開始 MOV DPTR, #40FFH;置數(shù)據(jù)指針DPTR MOV SP, #20H;置堆棧指針SP初值 MOV R2, #19H;置循環(huán)計(jì)數(shù)器R2初值為25NELOOP: INC R0;修改R0 INC DPTR;修改DPTR指下一個(gè) MOV A, R0;取被轉(zhuǎn)換的ASCII碼并壓入堆棧 PUSH ACC ACALL SUBASH;調(diào)用SUBASH子程序 POP 1FH;相應(yīng)的16進(jìn)制數(shù)送1FH單元4.2.5 子程序-子程序應(yīng)用50* ORG 4000H4.251* INCR0;修改R0 MOVA, R0;取被轉(zhuǎn)換的A

33、SCII碼并壓入堆棧 PUSHACC ACALLSUBASH;調(diào)用SUBASH子程序 POPACC;相應(yīng)的16進(jìn)制數(shù)送A SWAPA;作為高4位 ORLA, 1FH;合成兩位16進(jìn)制數(shù) MOVXDPTR, A;送存數(shù)單元 DJNZR2, NELOOP;轉(zhuǎn)換結(jié)束否?若未完,則繼續(xù) SJMPENSUBASH: MOVR0, SP;SP值不能改變,否則不能正確返回4.2.5 子程序-子程序應(yīng)用51* INCR0;修改R04.2.5 52* DEC R0 DEC R0 XCH A, R0 ;從堆棧取出被轉(zhuǎn)換的數(shù)送A CLR C SUBB A, #3AH ;為09的ASCII碼否?小于3AH?共減30H

34、 JC ASCDTG ;若是小于,則轉(zhuǎn)ASCDTG SUBB A, #07H ;若否,則再減去7,(A)-3AH-7H+0AH=(A)-37HASCDTG: ADD A, #0AH ;轉(zhuǎn)換成16進(jìn)制數(shù), XCH A, R0 ;轉(zhuǎn)換后的16進(jìn)制數(shù)壓入堆棧 RETEN: NOP END4.2.5 子程序-子程序應(yīng)用52* DEC R04.2.5 子程53*例4-12 將內(nèi)部RAM的20H單元中的1字節(jié)16進(jìn)制數(shù)轉(zhuǎn)換為兩位ASCII碼,存放在30H和31H兩個(gè)單元中。分析: 將轉(zhuǎn)換ASCII碼的運(yùn)算編寫成子程序HEASC,主程序通過調(diào)用HEASC完成數(shù)據(jù)轉(zhuǎn)換。通過堆棧傳遞參數(shù)。4.2.5 子程序-子

35、程序應(yīng)用53*例4-12 將內(nèi)部RAM的20H單元中的1字節(jié)1654* ORG 8000HMAIN: MOV SP, #40H;建立堆棧指針 MOV R0, #30H;置結(jié)果單元指針 MOV A, 20H;將1字節(jié)16進(jìn)制數(shù)的地址送A SWAP A;1字節(jié)16進(jìn)制數(shù)高、低4位交換 PUSH ACC;參數(shù)壓棧 ACALL HEASC;調(diào)轉(zhuǎn)換子程序HEASC POP ACC;彈出結(jié)果 MOV R0, A;存高位16進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 INC R0;修改指針 PUSH 20H;參數(shù)壓棧 ACALL HEASC;調(diào)轉(zhuǎn)換子程序HEASC POP ACC;彈出結(jié)果 MOV R0, A;存低位16進(jìn)制數(shù)轉(zhuǎn)換結(jié)果

36、 SJMP EN4.2.5 子程序-子程序應(yīng)用54* ORG 8000H4.55*HEASC: MOV R1, SP ;堆棧指針?biāo)蚏1 DEC R1 DEC R1 ;R1指向被轉(zhuǎn)換數(shù)據(jù) XCH A, R1 ;取被轉(zhuǎn)換數(shù)據(jù) ANL A, #0FH ;取一位16進(jìn)制數(shù) ADD A, #2 ;修正ASCII碼表的首地址 MOVC A, A+PC ;查表取對應(yīng)的ASCII碼 XCH A, R1 ;結(jié)果存放在堆棧區(qū) RET ;取出斷點(diǎn),返主程序ASCTAB: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H DB 38H, 39H, 40H, 41H, 42H, 43H

37、, 44H, 45HEN: NOP END MAIN4.2.5 子程序-子程序應(yīng)用55*HEASC: MOV R1, SP 56*4.3 匯編語言程序設(shè)計(jì)實(shí)例例4-13 多字節(jié)無符號數(shù)加法運(yùn)算程序。編程說明:多字節(jié)運(yùn)算一般是按照從低字節(jié)到高字節(jié)的順序依次進(jìn)行的。入口:R0被加數(shù)低位地址指針;R1加數(shù)低位地址指針;R2字節(jié)數(shù)。出口:R0和數(shù)高位地址指針。4.3.1 算術(shù)運(yùn)算程序56*4.3 匯編語言程序設(shè)計(jì)實(shí)例例4-13 多字節(jié)57*4.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序ADDBIN: CLR CLOOP1: MOV A, R0;取被加數(shù) ADDC A, R1;兩數(shù)相加,帶進(jìn)位 MOV R0

38、, A INC R0 INC R1 DJNZ R2, LOOP1;未加完轉(zhuǎn)LOOP1 JNC LOOP2;無進(jìn)位轉(zhuǎn)LOOP2 MOV R0, #01H RETLOOP2: DEC R0 RET57*4.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序AD58*例4-14 實(shí)現(xiàn)下列兩位16進(jìn)制數(shù)乘法運(yùn)算程序。 (R7R6)16(R5R4)16(R3R2R1R0)16編程說明:MCS-51乘法指令只能完成兩個(gè)8位無符號數(shù)相乘,因此16位無符號數(shù)求積必須將它們分解成8位數(shù)相乘來實(shí)現(xiàn)。其方法有“先乘后加”和“邊乘邊加”兩種?,F(xiàn)以“邊乘邊加”為例設(shè)計(jì)。程序如下:4.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序58*例4

39、-14 實(shí)現(xiàn)下列兩位16進(jìn)制數(shù)乘法運(yùn)算程序。459*例4-14 乘法運(yùn)算程序 ORG 1000HDMUL: MOV A, R6 ;第1個(gè)因數(shù)的低位送A MOV B, R4 ;第2個(gè)因數(shù)的低位送B MUL AB ;第1個(gè)因數(shù)的低位乘以第2個(gè)因數(shù)的低位 MOV R0, A ;積的低位送R0 MOV R1, B ;積的高位送R1 MOV A, R7 ;第1個(gè)因數(shù)的高位送A MOV B, R4 ;第2個(gè)因數(shù)的低位送B MUL AB ;第1個(gè)因數(shù)的高位乘以第2個(gè)因數(shù)的低位 ADD A, R1 ;部分積相加,形成進(jìn)位Cy MOV R1, A ;部分積相加送R1 MOV A, B ;部分積的進(jìn)位Cy加到高位

40、 ADDC A, #00H MOV R2, A MOV A, R6 ;第1個(gè)因數(shù)的低位送A MOV B, R5 ;第2個(gè)因數(shù)的高位送BMUL AB ;第1個(gè)因數(shù)的低位乘以第2個(gè)因數(shù)的高位(R7R6)16(R5R4)16(R3R2R1R0)1659*例4-14 乘法運(yùn)算程序 60*ADD A, R1 ;部分積相加,形成進(jìn)位CyMOV R1, A ;回送部分積MOV A, R2 ADDC A, B ;部分積相加MOV R2, A ;回送部分積MOV A, #00H ;部分積的進(jìn)位Cy加到高位ADDC A, #00HMOV R3, AMOV A, R7;第1個(gè)因數(shù)的高位送AMOV B, R5;第2個(gè)

41、因數(shù)的高位送BMUL AB;第1個(gè)因數(shù)的高位乘以第2個(gè)因數(shù)的高位ADD A, R2;部分積相加,形成進(jìn)位CyMOV R2, A;回送部分積MOV A, R3ADDC A, B;部分積相加MOV R3, A;回送部分積RETEND(R7R6)16(R5R4)16(R3R2R1R0)16例4-14 乘法運(yùn)算程序60*ADD A, R1 ;部分積相加,61*例4-15 雙字節(jié)無符號數(shù)除法運(yùn)算程序。編程說明:本程序采用移位除法的方法,實(shí)現(xiàn)雙字節(jié)無符號數(shù)相除,并考慮四舍五入。入口:R5(高)、R4(低),被除數(shù);R3(高)、R2(低),非零除數(shù)。出口:R5(高)、R4(低),商;R7(高)、R6(低),

42、余數(shù)。程序清單如下:4.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序61*例4-15 雙字節(jié)無符號數(shù)除法運(yùn)算程序。4.3 62*BINDIV: CLR A ;部分余數(shù) 單元清零 MOV R7, A MOV R6, A MOV R0, 10H ;除法 移位次數(shù)LP: CLR C ;移位 MOV A, R4 RLC A MOV R4, A MOV A, R5 RLC A MOV R5, A MOV A, R64.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序 RLC A MOV R6, A MOV A, R7 RLC A MOV R7, ALP1: MOV A, R6 ;部分余 數(shù)減除數(shù) SUBB A, R2

43、MOV R1, A MOV A, R7 SUBB A, R3 JC SMALL MOV A, R162*BINDIV: CLR A ;部分余數(shù)4.63* MOV R6, A INC R4 ;商加1 SJMP LP1SMALL: DJNZ R0, LP MOV 20H, R7 ;四舍五入 JB 07H, ADD1 CLR C MOV A, R6 RLC A MOV R6, A MOV A, R7 RLC A SUBB A, R34.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序 JC RETURN JNZ ADD1 MOV A, R6 SUBB A, R2 JC RETURN ADD1: MOV A,

44、R4 ;商加1 ADD A, #01H MOV R4, A MOV A, R5 ADDC A, #00H MOV R5, ARETURN: RET63* MOV R6, A64*例4-16 雙字節(jié)BCD碼十進(jìn)制乘法程序。編程說明:從乘數(shù)高位開始進(jìn)行BCD碼移位乘法。入口:R1(高)和R0(低),被乘數(shù); R3(高)和R2(低),乘數(shù)。出口:R7(最高),R6,R5,R4(最低),BCD碼形式的積。程序(略)4.3 匯編語言程序設(shè)計(jì)實(shí)例-算術(shù)運(yùn)算程序64*例4-16 雙字節(jié)BCD碼十進(jìn)制乘法程序。4.3 65*例4-17 數(shù)據(jù)排序程序。設(shè)在外部RAM的4200H數(shù)據(jù)緩沖區(qū)內(nèi)存放一無符號數(shù)數(shù)組,其長度為100,起始地址為4200H。要求將它們按從大到小順序排列,排序后存放在原數(shù)據(jù)緩沖區(qū)中,試編寫相應(yīng)的程序。程序(略)4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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

提交評論