匯編語言程序設(shè)計_第1頁
匯編語言程序設(shè)計_第2頁
匯編語言程序設(shè)計_第3頁
匯編語言程序設(shè)計_第4頁
匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計第1頁,共87頁,2023年,2月20日,星期日

4.1概述一、匯編語言和高級語言相比具有下列優(yōu)點:①占用的內(nèi)存單元和CPU資源少②執(zhí)行速度快③有效的利用計算機的專有特性。④適合實時控制上頁下頁回目錄第2頁,共87頁,2023年,2月20日,星期日第3頁,共87頁,2023年,2月20日,星期日二、匯編語言程序設(shè)計的步驟:①建立數(shù)學模型②確定算法③制定流程圖④確定數(shù)據(jù)結(jié)構(gòu)⑤寫出源程序⑥上機調(diào)試三、匯編語言程序的結(jié)構(gòu)①定義有關(guān)變量字符名②定義程序的起始地址③程序主體④匯編結(jié)束標志上頁下頁回目錄第4頁,共87頁,2023年,2月20日,星期日開始問題定義軟件結(jié)構(gòu)設(shè)計建立數(shù)學模型畫出程序流程圖編寫程序匯編在線仿真調(diào)試程序錯否?修改程序結(jié)束始固化NY圖10-8單片機軟件研制過程第5頁,共87頁,2023年,2月20日,星期日軟件任務(wù)分析1、軟件任務(wù)分析和硬件電路設(shè)計結(jié)合進行2、軟件任務(wù)分析:

※執(zhí)行軟件:

※監(jiān)控軟件:單片機應(yīng)用系統(tǒng)程序設(shè)計是在系統(tǒng)裸機條件下開發(fā)的,而且隨應(yīng)用系統(tǒng)的不同而不同。完成各種實質(zhì)性功能,如測量、計算、顯示、打印、輸出控制、通訊等;設(shè)計偏重算法效率。進行功能定義、接口定義、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型等定義。專門用來協(xié)調(diào)各執(zhí)行模塊和操作者的關(guān)系。著眼全局,邏輯嚴密。根據(jù)系統(tǒng)功能和鍵盤設(shè)置選擇監(jiān)控程序結(jié)構(gòu)。第6頁,共87頁,2023年,2月20日,星期日數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)規(guī)劃數(shù)據(jù)類型:※邏輯型※數(shù)值型:☆定點型☆浮點型數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)存放格式問題。大多采用線性結(jié)構(gòu)。第7頁,共87頁,2023年,2月20日,星期日資源劃分系統(tǒng)資源主要包括ROM、RAM、T/C、中斷源等。主要工作是進行RAM資源的分配。片外RAM:容量大,存放批量大的數(shù)據(jù)。片內(nèi)RAM:認真考慮。☆00H~1FH:工作積存器區(qū)。主程序用0區(qū),中斷、子程序用1區(qū)、2區(qū)、3區(qū)?!?0H~2FH:位尋址區(qū),存放各種軟件標志、邏輯變量、位輸入信息、位輸出信息副本、狀態(tài)變量、邏輯運算中間結(jié)果等。保留1~2個字節(jié)備用,剩下作其它用途?!?0H~7FH(30H~FFH):堆棧空間、數(shù)據(jù)緩沖區(qū)、各種參數(shù)、指針、中間結(jié)果等。列出RAM資源詳細分配清單,作為編程依據(jù)。第8頁,共87頁,2023年,2月20日,星期日;字節(jié)定義區(qū)X EQU 30HY EQU 31HZ EQU 32H

;40H~4FH,沒有使用 SIOBUFEQU50H;50H~5FH,串行通信緩沖區(qū)16字節(jié) ;0E0H~0FFH32字節(jié)堆棧空間 ;位變量、位標志變量定義TIMOUTBIT 00HOVER BIT 01HKEYFBIT 02H第9頁,共87頁,2023年,2月20日,星期日編程及調(diào)試軟件設(shè)計方法:☆自上而下☆自下而上基本過程:用編輯軟件編輯源程序、編譯軟件生成目標代碼、程序測試、仿真運行、代碼固化、樣機試用、產(chǎn)品定型磨刀不誤砍柴功:前期調(diào)研細致、軟硬件論證充分、指標吃準、數(shù)據(jù)格式定好、模塊功能和接口條件落實、操作規(guī)范要和用戶談妥、最后才開始設(shè)計程序設(shè)計、焊PCB板、調(diào)試樣機。第10頁,共87頁,2023年,2月20日,星期日MCS-51單片機匯編程序一般格式內(nèi)存變量定義ORG0000HLJMPMAIN中斷向量地址區(qū)

ORG0030HMAIN:MOVSP,#XXH;設(shè)置堆棧CPU資源和內(nèi)部變量初始化外部擴展功能部件初始化監(jiān)控主程序(死循環(huán)程序)子程序區(qū)中斷服務(wù)子程序區(qū)項表區(qū)(DBXXH,XXH,……END第11頁,共87頁,2023年,2月20日,星期日例1:內(nèi)部RAM從DATA1單元有一數(shù)據(jù)塊,存放若干無符號數(shù),第一單元為數(shù)據(jù)塊長度,求這些無符號數(shù)之和。;首址送R0;長度送R1;檢查長度是否為零;為零則結(jié)束;不為零則開始運算;加一個數(shù);長度減1不為零則轉(zhuǎn)移;存和起始地址程序主體匯編結(jié)束標志標號注釋上頁下頁回目錄MOVR1,DATA1

CJNER1,#0,NEXTORG0000H

START:MOVR0,#DATA1HERE:

SJMP$

NEXT:

CLRALOOP:

INCR0

ADDA,@R0

DJNER1,LOOP

MOVSUM,A

SJMPHEREDATA1

DATA20HSUMDATA1FH

END第12頁,共87頁,2023年,2月20日,星期日上頁下頁回目錄四、評價程序質(zhì)量的標準:①程序的執(zhí)行時間②程序所占用的內(nèi)存字節(jié)數(shù)目③程序的邏輯性、可讀性④程序的兼容性、可擴展性⑤程序的可靠性時間空間概念第13頁,共87頁,2023年,2月20日,星期日4.2簡單程序簡單程序的特點:既無分支,又無循環(huán),按照順序執(zhí)行例4-2:將一個字節(jié)內(nèi)的壓縮BCD碼拆開并變成ASCII碼,存入兩個RAM單元。BCD碼放在內(nèi)部RAM的20H,轉(zhuǎn)換后高半字節(jié)放到21H,低字節(jié)放22H。

BCDHBCDL00110011ROM21H22H20H方法1:BCD碼0~9對應(yīng)的ASCII碼為30H~39H轉(zhuǎn)換時,將20H中的BCD碼拆開,高四位置為“0011”即可。BCDHBCDL上頁下頁回目錄可完成一定的基本功能,是編寫復(fù)雜程序的基礎(chǔ)ASCII碼附錄1:ASCII碼字符表第14頁,共87頁,2023年,2月20日,星期日程序:0011BCDH00000000BCDHBCDLBCDL00000011BCDHBCDLROM21H22H20H0000BCDH0011A上頁下頁回目錄ORG 0000HAJMP MAINORG 0030HMAIN:MOVA,20H ANLA,#0FH ORL A,#30H MOV 22H,A MOV A,20H SWAP A ANL A,#0FH ORLA,#30H MOV 21H,AHERE:SJMPHERE END第15頁,共87頁,2023年,2月20日,星期日方法2:采用除10H取余法將兩個BCD數(shù)拆開BCDHBCDLA000100000000BCDH0000BCDLBABDIVAB上頁下頁回目錄ORL,#30HAB第16頁,共87頁,2023年,2月20日,星期日0011BCDH0011BCDL

程序:

MOVA,20H

MOVB,#10H

DIVAB

ORLB,#30H

MOV22H,B

ORLA,#30H

ORG0000H

MOV21H,A

SJMP$

END;取BCD碼至A;完成轉(zhuǎn)換;存ASCII碼;完成轉(zhuǎn)換;存ASCII碼;除10H取余,使BCDHA、BCDLBBCDHBCDLA000100000000BCDH0000BCDLBABDIVAB00110011BCDHBCDLROM21H22H20H上頁下頁回目錄第17頁,共87頁,2023年,2月20日,星期日方法2小結(jié):以上程序用了7條指令,

16個內(nèi)存字節(jié),執(zhí)行時間為13個機器周期。雙字節(jié)求補設(shè):兩個字節(jié)原碼數(shù)存在R1、R0中求補后結(jié)果,存在R3、R2中。例4-3:方法:求補采用“模-

原碼”的方法上頁下頁回目錄即用“0”去減“原碼”R0R1原碼-)R2R300H00H存在借位同樣的功能,有不同的編程思路,出現(xiàn)不同的效果,影響程序的實時性及存儲空間大小。第18頁,共87頁,2023年,2月20日,星期日

程序:

CLRC

CLRA

SUBBA,R0

MOVR2,A

CLRA

SUBBA,R1

ORG0000H

MOVR3,A

SJMP$

END;CY0;A0;低字節(jié)求補;送R2;A清零;高字節(jié)求補;送R311111111R00000000011111111R100000000R300000001R2CY

000000001

100000000

000000000A上頁下頁回目錄第19頁,共87頁,2023年,2月20日,星期日將內(nèi)部RAM的20H單元中的8位無符號二進制數(shù),轉(zhuǎn)換為3位BCD碼,并將結(jié)果存放在BAI(百位)、SHI(十位)、GE(個位)單元中。例4-4:編程思路:可將被轉(zhuǎn)換數(shù)除以100,得百位數(shù);余數(shù)除以10得十位數(shù);最后余數(shù)即為個位數(shù)。編程如下:例如:255(十進制)除以100,得2(百位數(shù))余數(shù)除以10,得5(十位數(shù))最后余數(shù)5即為個位數(shù)上頁下頁回目錄第20頁,共87頁,2023年,2月20日,星期日

BCDEQU20HBAIEQU21HSHIEQU22HGEEQU23H

ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60HMOVA,BCDMOVB,#100DIVABMOVBAI,AMOVA,BMOVB,#10DIVABMOVSHI,AMOVGE,BNOPLJMP$END;除100,得百位;余數(shù)除10,得十位、個位碼制轉(zhuǎn)換程序:HEXASCII碼;BINASCII碼第21頁,共87頁,2023年,2月20日,星期日4.3分支程序當執(zhí)行完某一條指令時,為完成某些功能,根據(jù)某些條件判斷,使程序或順序執(zhí)行,或轉(zhuǎn)移到其它指令處執(zhí)行,這就是分支程序。編程思路這是一個簡單分支程序,可以使兩數(shù)相減,若CY=1,則被減數(shù)小于減數(shù)。用JC指令進行判斷。例4-5

設(shè)內(nèi)部RAM30H,31H存放兩個無符號數(shù),試比較兩數(shù)的大小,較小的數(shù)存入30H單元,較大的數(shù)存入31H單元。程序的流程圖如下:上頁下頁回目錄第22頁,共87頁,2023年,2月20日,星期日程序:;做減法比較兩數(shù)CLRC

MOVA,30H

SUBBA,31HJCNEXT

MOVA,30H

XCHA,31HORG0000H

MOV30H,ANEXT

:NOPSJMP$END;CY0;若(30H)小,則轉(zhuǎn)移;交換兩數(shù)(30H)-(31H)CY=1?交換兩數(shù)ENDSTART

Y

N流程圖:上頁下頁回目錄第23頁,共87頁,2023年,2月20日,星期日多重分支程序舉例例4-7:設(shè)片內(nèi)30H單元存放的是一元二次方程ax2+bx+c=0根的判別式△=b2–4ac的值。試根據(jù)30H單元的值,編寫程序,判斷方程根的三種情況,存入片內(nèi)31H內(nèi)。在31H中存放“0”代表無實根,存放“1”代表有相同的實根,存放“2”代表兩個不同的實根。編程思路△為有符號數(shù),有三種情況,即小于零,等于零、大于零??梢杂脙蓚€條件轉(zhuǎn)移指令來判斷,首先判斷符號位,用指令JNBACC.7,rel判斷,若ACC.7=1,則一定為負數(shù);此時0

若ACC.7=0,則△≥0。此時再用指令JNZrel判斷若△≠0,則△>0,否則△=0上頁下頁回目錄0△=0△>0第24頁,共87頁,2023年,2月20日,星期日上頁下頁回目錄流程圖:A←△ACC.7=0?ENDSTART

N

Y(A)=0?31H←031H←2

Y

N31H←1△0△=0△0第25頁,共87頁,2023年,2月20日,星期日程序:

ORG0000HSTART:MOVA,30HJNBACC.7,YESMOV31H,#0SJMPFINISHYES:JNZTOWMOV31H,#1SJMPFINISHTOW:MOV31H,#2FINISH:SJMP$END;△值送A;△≥0轉(zhuǎn)YES;△<0無實根;△=0有相同實根;△>0轉(zhuǎn)TOW;有兩個不同實根上頁下頁回目錄第26頁,共87頁,2023年,2月20日,星期日4.3.3N路分支程序根據(jù)前面程序運行結(jié)果,可以有N種選擇,并轉(zhuǎn)向其中任一處程序。例4-10128路分支程序:根據(jù)R3值轉(zhuǎn)向128個目的地址。編程方法:順序程序

MOVA,R3CJNEA,#00H,FZ1AJMPFZ00FZ1:CJNEA,#01H,FZ2AJMPFZ01FZ2:CJNEA,#02H,FZ3AJMPFZ02FZ3:….. 煩瑣,程序太長。如作10000個分支程序…….第27頁,共87頁,2023年,2月20日,星期日使用JMP@A+DPTR指令實現(xiàn):JMP128: MOVA,R3 CLRC SUBBA,#128 JNC ERROR MOV A,R3 MOVB,#3 MUL AB MOVDPTR,#PRGTAL

ADD A,DPL MOV DPL,A MOV A,DPH ADDCA,B MOV DPH,A CLR A JMP @A+DPTRPRGTAL: LJMP ROUT00 LJMP ROUT01 ……. LJMP ROUT127 ;入口條件檢查

;分支跳轉(zhuǎn);LJMP指令占3字節(jié)例4-10:128分支程序第28頁,共87頁,2023年,2月20日,星期日JMP256:MOVA,R3;取N值MOVDPTR,#PRGTBL;DPTR指向分支地址表首址CLRC;RLCA;(A)×2JNCLOW128;是前128個分支程序,則轉(zhuǎn)移INCDPH;否基址加256LOW128:MOVTEMP,A;暫存AINCA;指向地址低8位MOVCA,@A+DPTR;查表,讀分支地址低8位PUSHACC;地址低8位入棧MOVA,TEMP;恢復(fù)A,指向地址高8位MOVCA,@A+DPTR;查表,讀分支地址高8位PUSHACC;地址高8位入棧RET;分支地址彈入PC實現(xiàn)轉(zhuǎn)移PRGTBL:DWROUT00;256個分支程序首地址DWROUT01

…;占用512個單元DWROUTFF;例4-11:256分支程序第29頁,共87頁,2023年,2月20日,星期日分支程序應(yīng)用場所:1、鍵盤按鍵處理程序根據(jù)所按功能鍵轉(zhuǎn)到相應(yīng)的功能子程序2、通信協(xié)議處理程序例:某鍵盤如下:通信編號設(shè)置采樣時間設(shè)置

+

-確認

MOV A,BCLR CSUBB A,#3JC FOUNRETFOUN:MOVA,B RL AADD A,B MOV DPTR,#KEYF JMP @A+DPTRKEYF:LJMPTONGXIN LJMPBIANHAOLJMPCAIYANG ;鍵編號第30頁,共87頁,2023年,2月20日,星期日4.4循環(huán)程序循環(huán)程序:一些有規(guī)可循而又反復(fù)處理的問題利用比較轉(zhuǎn)移指令CJNE、減1不為“0”轉(zhuǎn)移指令DJNZ等實現(xiàn)例4-13:在內(nèi)部RAM30H~4FH

連續(xù)32個單元中存放了單字節(jié)無符號數(shù),求32個無符號數(shù)之和,并存入內(nèi)部RAM51H,50H中。編程思路:這是重復(fù)相加問題,要設(shè)置一些工作單元設(shè):R0做加數(shù)地址指針,R7做循環(huán)次數(shù)計數(shù)器,R3做和數(shù)的高字節(jié)寄存器。A做和數(shù)的低字節(jié)寄存器程序的流程圖如下:上頁下頁回目錄地址指針循環(huán)次數(shù)計數(shù)器第31頁,共87頁,2023年,2月20日,星期日流程圖:31→R7#0→R3(30H)→A#31H→R0CY=0?ENDSTART

(R7)-1=0?

51H←(R3)50H←(A)

Y

N(A)+((R0))→A(R0+1)→R0(R3)+1→R3上頁下頁回目錄NY第32頁,共87頁,2023年,2月20日,星期日

程序:;R7作循環(huán)次數(shù)計數(shù)器;R3作和數(shù)高字節(jié)寄存器;取被加數(shù);R0作加數(shù)地址指針;CY=0,和<256,則轉(zhuǎn);作加法;CY=1,加到高字節(jié);修改R0指針;未完,重復(fù)加;存和數(shù)初始化部分循環(huán)體部分結(jié)束部分

ORG0000HSTART:MOVR7,#31MOVR3,#0MOVA,30HMOVR0,#31HLOOP:ADDA,@R0JNCNEXTINCR3NEXT:INCR0DJNZR7,LOOPMOV51H,R3MOV50H,ASJMP$END上頁下頁回目錄循環(huán)執(zhí)行直到R7=0循環(huán)控制第33頁,共87頁,2023年,2月20日,星期日例4-14:從外部RAMBLOCK單元開始有一無符號數(shù)數(shù)據(jù)塊,數(shù)據(jù)塊長度存入LEN單元,求出其中最大數(shù)存入MAX單元。為了方便進行比較,我們使用CY標志來判斷兩數(shù)的大小,使用B寄存器作比較與交換的寄存器,使用DPTR作外部RAM地址指針。解:這是一個基本搜索問題,采用兩兩比較法。取兩者較大的數(shù)再與下一個數(shù)進行比較,若數(shù)據(jù)塊長度LEN=n則應(yīng)比較n-1次,最后較大的數(shù)就是數(shù)據(jù)塊中的最大數(shù)。程序的流程圖如下:上頁下頁回目錄第34頁,共87頁,2023年,2月20日,星期日流程圖:DPTR←#BLOCKLEN←LEN-1A←(DPTR)CY=0?ENDSTART

Y

NLEN-1=0?

MAX←最大數(shù)

Y

NCY←0B←(A)DPTR+1A←(DPTR)A←(A)-(B)若(A)<(B)則A←(B)若(A)>(B)則A←(B)+(A)上頁下頁回目錄A中的數(shù)較大較大數(shù)交換至A恢復(fù)較大數(shù)初始化工作單元第35頁,共87頁,2023年,2月20日,星期日編程:;定義數(shù)據(jù)塊首址;定義最大數(shù)暫存單元;定義長度計數(shù)單元上頁下頁回目錄FMAX:MOV

DPTR,#BLOCKORG0000HBLOCKDATA0100HMAXDATA31HLENDATA30HSJMP

NEXT1NEXT:ADDA,BNEXT1:DJNZLEN,LOOPMOVMAX,ASJMP$END

DECLENMOVXA,@DPTRLOOP:CLRCMOV

B,AINC

DPTRMOVXA,@DPTRSUBB

A,BJNC

NEXTMOVA,B;數(shù)據(jù)塊首址送DPTR;長度減1;取數(shù)至A;0→CY;修改指針;暫存于B;取下一數(shù);大者送A;若(A)>(B)則恢復(fù)A;未完繼續(xù)比較;存最大數(shù);*若用RET指令結(jié)尾則該程序可作子程序調(diào)用;作減法比較RET第36頁,共87頁,2023年,2月20日,星期日例4-15:從外部RAMBLOCK單元開始有一數(shù)據(jù)塊,數(shù)據(jù)塊長度存入LEN單元,試統(tǒng)計其中正數(shù)、負數(shù)和零的個數(shù),分別存入PCOUNT、MCOUNT、ZCOUNT單元。解:這是一個多重分支的單循環(huán)問題。數(shù)據(jù)塊中是帶符號數(shù)先用JBACC.7,rel指令判斷符號位。程序的流程圖如下:若ACC.7=1,則該數(shù)一定是負數(shù),MCOUNT單元加1;若ACC.7=0,則該數(shù)可能是正數(shù),也可能是零;用JNZrel判斷A是否為零若A≠0,則一定是正數(shù),PCOUNT單元加1;若既不為正也不為負,則一定是零,ZCOUNT單元加1;上頁下頁回目錄第37頁,共87頁,2023年,2月20日,星期日流程圖:DPTR←#BLOCKPCOUNT←0MCOUNT←0ZCOUNT←0ACC.7=0?ENDSTART

Y

N(A)=0?

DPTR+1

Y

N

A←(DPTR)ZCOUNT+1MCOUNT+1LEN-1=0?PCOUNT+1

Y

N上頁下頁回目錄第38頁,共87頁,2023年,2月20日,星期日程序:ORG0200HBLOCKDATA2000HLENDATA30HPCOUNTDATA31HMCOUNTDATA32HZCOUNTDATA33H;定義數(shù)據(jù)塊首址;定義長度計數(shù)單元;定義正計數(shù)單元;定義負計數(shù)單元;定義零計數(shù)單元上頁下頁回目錄第39頁,共87頁,2023年,2月20日,星期日;數(shù)據(jù)塊首址送DPTR;計數(shù)單元清零;若ACC.7=1轉(zhuǎn)負計數(shù);取數(shù);若(A)≠0,轉(zhuǎn)正計數(shù);若(A)=0,則零的個數(shù)加1;負計數(shù)單元加1;正計數(shù)單元加1;修正指針;未完繼續(xù)NEXT:INCDPTR

DJNZLEN,LOOPSJMP$ENDSTART:MOVDPTR,#BLOCK

MOVPCOUNT,#0LOOP:MOVXA,@DPTRJBACC.7,MCONJNZPCONINCZCOUNTAJMPNEXTMCON:INC

MCOUNT

MOV

MCOUNT,#0

MOVZCOUNT,#0AJMPNEXTPCON:INCPCOUNT上頁下頁回目錄第40頁,共87頁,2023年,2月20日,星期日4.5查表程序上頁下頁回目錄對于復(fù)雜參數(shù)的計算如:非線性參數(shù)對數(shù)、指數(shù)、三角函數(shù)微分、積分等用匯編編程十分困難甚至無法建立數(shù)學模型用查表的方法簡單容易查表:把事先計算或測得的數(shù)據(jù)按一定順序編制成表格,存放在程序存儲器中。查表程序的任務(wù)就是根據(jù)被測數(shù)據(jù),查出最終所需要的結(jié)果。第41頁,共87頁,2023年,2月20日,星期日例4-20:一個十六進制數(shù)放在HEX單元的低四位,將其轉(zhuǎn)換成ASCII碼查表程序:編程思路十六進制0~9的ASCII碼為30H~39H,

A~F的ASCII碼為41H~46H,

查表指令:MOVCA,@A+DPTRMOVCA,@A+PC表格定義:用偽指令DB或DW把表格的數(shù)據(jù)存入ROM上頁下頁回目錄來獲得數(shù)據(jù)ASCII碼表格的首址為ASCIITAB不連續(xù)的第42頁,共87頁,2023年,2月20日,星期日ASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46H

END上頁下頁回目錄編程1:

0123

456789

ABCDEFAJMP$

ORG0000HHEXEQU30HHEXASC:MOVA,HEXMOVDPTR,#ASCTABMOVCA,@A+DPTRMOVHEX,AANLA,#0FH第43頁,共87頁,2023年,2月20日,星期日編程2:

ORG0000HHEXEQU30HHEXASC:MOVA,HEXANLA,#0FHADDA,MOVCA,@A+PCMOVHEX,AAJMP$ASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46HEND;變址調(diào)整;2字節(jié);2字節(jié)PCPC#4上頁下頁回目錄;變址調(diào)整第44頁,共87頁,2023年,2月20日,星期日4.6子程序的設(shè)計及調(diào)用一、子程序的概念把能完成某種基本操作并具有相同操作的程序段單獨編成子程序。如:函數(shù)、±、×、運算、代碼轉(zhuǎn)換、延時等子程序調(diào)用ACALL、LCALL子程序返回RET使用子程序的優(yōu)點⑴不必重復(fù)書寫同樣的程序,提高編程效率⑵程序的邏輯結(jié)構(gòu)簡單,便于閱讀⑶縮短了源程序和目標程序的長度,節(jié)省了存儲器空間⑷使程序模塊化、通用化、便于交流共享資源⑸便于按某種功能調(diào)試上頁下頁回目錄操作第45頁,共87頁,2023年,2月20日,星期日二、調(diào)用子程序的要點⑴子程序的名字:子程序開頭的標號段,也是其入口地址,供主程序調(diào)用。例如:調(diào)用延時子程序主程序指令:LCALLDELAY⑵子程序返回:結(jié)尾必須使用一條從子程序返回指令RET,它具有恢復(fù)斷點的功能RET;PC15~8((SP)),(SP)(SP)

-1;PC7~0((SP)),(SP)(SP)

-1主程序LCALL斷點子程序RET1、子程序的結(jié)構(gòu)上頁下頁回目錄子程序:DELAY:MOVR7,#100 DJNZ R7,$ RET 子程序名稱第46頁,共87頁,2023年,2月20日,星期日2、參數(shù)傳遞子程序入口條件:在調(diào)用一個子程序時,主程序應(yīng)先把有關(guān)參數(shù)放到某些約定的位置,子程序運行時,可以從約定的位置得到有關(guān)參數(shù)。子程序出口條件:子程序結(jié)束前,也應(yīng)把處理結(jié)果送到約定位置參數(shù)傳遞的方法:⑴子程序無須傳遞參數(shù)這類子程序中所需要的參數(shù)是子程序賦予,不需要主程序給出上頁下頁回目錄第47頁,共87頁,2023年,2月20日,星期日主程序:...LCALLDELY...子程序:不需主程序提供入口參數(shù),從子程序開始到子程序返回,大約為20ms例4-23

調(diào)用延時子程序DELYDELY:MOVR7,#100DLY0:MOVR6,#98NOPDLY1:DJNZR6,DLY1DJNZR7,DLY0RET子程序開始的標號子程序返回指令調(diào)用子程序上頁下頁回目錄98×2=196μs1μs1μs設(shè):主頻為12MHZ2μs(196+2+2)×100+3=20003μs=20.003ms2μs1μs+3第48頁,共87頁,2023年,2月20日,星期日⑵用累加器和工作寄存器傳遞參數(shù)入口參數(shù):放在累加器A和工作寄存器中R0~R7中出口參數(shù):放在累加器A和工作寄存器中R0~R7中例4-24

雙字節(jié)求補子程序CPLD解:采用“取反加1”的方法,十六位數(shù)取反加1,不僅低字節(jié)要加1,高字節(jié)要加低字節(jié)的進位。故采用ADD指令,不采用INC指令。

INC指令不影響CY位上頁下頁回目錄第49頁,共87頁,2023年,2月20日,星期日入口參數(shù):(R7R6)=16位數(shù)出口參數(shù):(R7R6)=求補后的16位數(shù)

CPLD:

MOVA,R6CPLA

ADDA,#1

MOVR6,A

MOVA,R7

CPLA

ADDCA,#0

MOVR7,A

RET上頁下頁回目錄Cy+Cy第50頁,共87頁,2023年,2月20日,星期日@R0@R0@R0⑶通過操作數(shù)地址傳遞參數(shù)入口參數(shù):(R0)=求補數(shù)低字節(jié)指針,(R7)=n-1出口參數(shù):(R0)=求補后高字節(jié)指針例4-25n字節(jié)求補子程序CPLNCPLN:

MOVA,@R0CPLAADD

A,#1MOV@R0,AMOVA,@R0CPLAADDCA,#0MOV@R0,ARETNEXT:INCR0DJNZR7,NEXT上頁下頁回目錄內(nèi)部RAM字節(jié)1字節(jié)2字節(jié)3……字節(jié)n@R0@R0地址第51頁,共87頁,2023年,2月20日,星期日⑷通過堆棧傳遞參數(shù)例4-26

在HEX單元存放兩個十六進制數(shù),將它們分別轉(zhuǎn)換成ASCII碼并存入ASC和ASC+1單元解:由于要進行兩次轉(zhuǎn)換,故可調(diào)用查表子程序完成MAIN:...PUSHHEX

LCALLHASCPOPASCMOVA,HEXSWAPAPUSHACCLCALLHASCPOPASC+1...;轉(zhuǎn)子;壓入被轉(zhuǎn)換數(shù);ASCL→ASC;取被轉(zhuǎn)換數(shù);處理高四位;壓入;轉(zhuǎn)子程序;ASC→ASC+1主程序*PCH*PCL

HEXSPSP+1SP+2SP+3棧底*PC斷點地址上頁下頁回目錄盡量少用第52頁,共87頁,2023年,2月20日,星期日MOVCA,@A+PC

HASC:

DECSPDECSPPOPACCANLA,#0FHADDA,#5PUSHACCINCSPINCSPRETASCTAB:DB‘012…7’DB‘89A…F’;彈出;修改SP指向HEX;屏蔽高四位;變址調(diào)整;查表;結(jié)果入棧;修改SP指向斷點位置;;;子程序上頁下頁回目錄*PCH*PCL

HEXSPSP+1SP+2SP+3棧底AHEXResultResultSP+1SP+2SP+3PC第53頁,共87頁,2023年,2月20日,星期日

HEX

SPSPSPSP

...PUSHHEX

LCALLHASCPOPASCMOVA,HEXSWAPAPUSHACCLCALLHASCPOPASC+1...MOVCA,@A+PCHASC:

DECSPDECSPPOPACCANLA,#0FHADDA,#5PUSHACCINCSPINCSPRETASCTAB:DB‘012…7’

DB‘89A…F’60H61H62H63H64H

HEX*PCL*PCHPC斷點SP0000HEXL

ASCAASCSPSPSPSP主程序子程序上頁下頁回目錄第54頁,共87頁,2023年,2月20日,星期日3、現(xiàn)場保護

現(xiàn)場保護:

如果子程序使用的寄存器與主程序使用的寄存器有沖突,在轉(zhuǎn)入子程序前,特別是進行中斷服務(wù)子程序時,要進行現(xiàn)場保護。保護內(nèi)容:內(nèi)部RAM內(nèi)容, 各工作寄存器內(nèi)容,主程序正在使用累加器A、BDPTRPSW保護方式:將要保護的單元壓入堆棧。還可以用RS1RS0來選擇其他通用寄存器組,以便保護主程序現(xiàn)場。上頁下頁回目錄第55頁,共87頁,2023年,2月20日,星期日例如:某子程序的現(xiàn)場保護BCDCB:PUSHACCPUSHPSWPUSHDPLPUSHDPH...POPDPHPOPDPLPOPPSWPOPACCRET推入與彈出應(yīng)按照“先進后出”,或“后進先出”的順序;;保護現(xiàn)場;;子程序功能語句;;恢復(fù)現(xiàn)場;;;上頁下頁回目錄第56頁,共87頁,2023年,2月20日,星期日三、子程序的調(diào)用及嵌套1、子程序的調(diào)用上頁下頁回目錄2、子程序的嵌套子程序的嵌套:子程序中可調(diào)用其他子程序匯編語言子程序,可否自己調(diào)用自己?第57頁,共87頁,2023年,2月20日,星期日常見MCS-51子程序:1、算術(shù)運算子程序 多字節(jié)BCD碼加法、減法、求補、移位;雙字節(jié)二進制無符號數(shù)乘法、平方、除法、開平方;平均值2、代碼轉(zhuǎn)換子程序 單字節(jié)HEX數(shù)轉(zhuǎn)雙字節(jié)ASCII碼、ASCII碼轉(zhuǎn)HEX;單字節(jié)HEX數(shù)轉(zhuǎn)BCD碼等3、查找 單字節(jié)HEX無(有)符號數(shù)據(jù)塊極值;查表;排序;第58頁,共87頁,2023年,2月20日,星期日4.7程序設(shè)計舉例例4-29

多字節(jié)無符號數(shù)減法子程序NSUB功能:n字節(jié)無符號數(shù)減法入口:(R0)=被減數(shù)低字節(jié)指針(R1)=減數(shù)低字節(jié)指針(R7)=字節(jié)數(shù)n出口:(R0)=差數(shù)高字節(jié)地址指針解:的若被減數(shù)大于減數(shù),則差為正數(shù);若被減數(shù)小于減數(shù),則差為補碼數(shù)(負數(shù)),且差數(shù)為n字節(jié)上頁下頁回目錄第59頁,共87頁,2023年,2月20日,星期日流程圖:0←CY

((R0))-((R1))-CY→(R0)RETNSUB(R7)-1=0?修改地址指針(R0)+1→R0,R1+1→R1

NNSUB:CLRCLOOP:MOVA,@R0

MOV@R0,ASUBBA,@R1INCR0INCR1DJNZR7,LOOPDECR0RET程序:上頁下頁回目錄第60頁,共87頁,2023年,2月20日,星期日例4-30

雙字節(jié)無符號數(shù)快速乘法子程序MULD功能:雙字節(jié)無符號數(shù)乘法,積為32位入口:

(R7R6)=

被乘數(shù)ab(R5R4)=

乘數(shù)cd(R0)=

有定義的內(nèi)部RAM地址出口:

(R0)=

乘積的高字節(jié)地址指針解:于兩個雙字節(jié)無符號數(shù)相乘,用8位乘法指令來完成需要四次,每次的乘積為16位,會產(chǎn)生4個部分積,共需要8個單元存放,然后再按“位權(quán)”相加,和即為所求之積。這樣所占存儲單元太多,應(yīng)該采用邊乘邊加的方法。用R3、R2、R1作暫存器或工作單元。上頁下頁回目錄第61頁,共87頁,2023年,2月20日,星期日

R6

b

R7

a

R4

d

R5

c編程思路與手乘法相似:被乘數(shù)乘數(shù)上頁下頁回目錄第62頁,共87頁,2023年,2月20日,星期日

R6

b

R4

dbdHbdL

R7

aadHadL

R5

cbcLbcHacLacHbdLadHbdH+adL+bcLadH+bcH+acL相乘過程上頁下頁回目錄第63頁,共87頁,2023年,2月20日,星期日MULD:MOVA,R6MOVB,R4MULABMOV@R0,AMOVR3,BMOVA,R7MOVB,R4MULABADDA,R3MOVR3,AMOVA,BADDCA,#0MOVR2,AMOVA,R6MOVB,R5MULABADDA,R3程序;;b×d;存積7~0,bdL→(R0);;;adL+bdH;;;暫存,adL+bdH→R3;a×d;adH→A;bcL+adL+cy;adH+cy→A;b×c;暫存,adH+cy→R2;;上頁下頁回目錄第64頁,共87頁,2023年,2月20日,星期日INCR0MOV@R0,AMOVR1,#0MOVA,R2ADDCA,BMOVR2,AJNCLASTINCR1LAST:MOVA,R7MOVB,R5MULABADDA,R2INCR0MOV@R0,AMOVA,BADDCA,R1INCR0MOV@R0,ARET;用R1記錄cy;bcH+adH+cy;存積15~8,bcL+adL+bdH→(R0+1);暫存,bcH+adH+cy→R2;cy=0,則轉(zhuǎn)LAST;;R0+1;;;cy=1,則(R1)=1;a×c;acL+bcH+adH+cy;(R0+3);R0+2;acH+cy;存積23~16,acL+bcH+adH+cy→(R0+2);存積31~24,acH+cy→(R0+3)上頁下頁回目錄第65頁,共87頁,2023年,2月20日,星期日例4-33

多字節(jié)十進制加法子程序BCDADD功能:n字節(jié)十進制加法入口:(R0)=

被加數(shù)低字節(jié)指針(R1)=

加數(shù)低字節(jié)指針(R7)=字節(jié)數(shù)n出口:(R0)=

和數(shù)高字節(jié)地址指針解:兩數(shù)相加,和數(shù)為n+1字節(jié)。若cy=0,則(n+1)字節(jié)為0;若cy=1,則(n+1)字節(jié)為1上頁下頁回目錄第66頁,共87頁,2023年,2月20日,星期日BCDADD:CLRCADDL:MOVA,@R0ADDCA,@R1DAAMOV@R0,AINCR0INCR1DJNZR7,ADDLCLRAMOVACC.0,CMOV@R0,ARET程序:上頁回目錄過“9”補“6”CY

第67頁,共87頁,2023年,2月20日,星期日例4-6:空調(diào)機制冷時,若排出的空氣溫度比吸入的空氣溫度低8℃則認為工作正常,否則便認為是故障,并設(shè)置故障標志。解:為了可靠的監(jiān)控空調(diào)機的工作情況,做兩次減法:第一次(40H)-(41H),若CY=1,則肯定有故障;第二次兩個溫度的差值減去8℃,若CY=1,則肯定有故障程序的流程圖如下:上頁下頁回目錄首先定義一些工作單元內(nèi)部RAM40H41H42H吸入溫度值排出溫度值故障標志第68頁,共87頁,2023年,2月20日,星期日A←(40H)-(41H)CY=1?(A)-8℃ENDSTART

Y

NCY=1?42H←FFH42H←0

Y

N流程圖:上頁下頁回目錄故障正常第69頁,共87頁,2023年,2月20日,星期日

ORG1000HSTART:MOVA,40HCLRCSUBBA,41HJCERRORMOV42H,#0JCERRORSUBBA,#8SJMPEXITERROR:MOV42H,#0FFHEXIT:SJMP$END程序:;吸入溫度值送A;0→CY;A←(40H)-(41H);CY=1,則故障;是則故障;溫度小于8℃?;工作正常標志;轉(zhuǎn)出口;設(shè)置故障標志若CY≠1順序執(zhí)行CY=1轉(zhuǎn)移CY=1轉(zhuǎn)移若CY≠1順序執(zhí)行上頁下頁回目錄第70頁,共87頁,2023年,2月20日,星期日一般軟件的容錯設(shè)計1、堆棧溢出的預(yù)防☆堆棧設(shè)置在片內(nèi)RAM區(qū),片內(nèi)資源有限,使堆棧區(qū)范圍有限?!疃褩R绯?,將引起程序“跑飛”,危害極大?!顪p少系統(tǒng)對堆棧的需求量方法:

1、取消部分子程序

2、盡量不用堆棧來傳遞參數(shù)和結(jié)果

3、根據(jù)需要減少子程序現(xiàn)場保護量☆系統(tǒng)對堆棧的極限需求量計算方法:主程序最大需量+低級中斷最大需量+高級中斷的最大需量第71頁,共87頁,2023年,2月20日,星期日2、狀態(tài)轉(zhuǎn)移的條件審查一般情況下,程序自當前狀態(tài)進入下一狀態(tài),往往取決于一個特定的條件。對重要條件要進行審查,確保安全進入下一個狀態(tài)。如:散轉(zhuǎn)程序的入口條件;如:直線切削控制:當前狀態(tài)為刀架快進,快進量完成后進入下一個狀態(tài),停止快進,開始切削。可靠性設(shè)計中,還要考慮:如冷卻泵運轉(zhuǎn)否?主軸電機運轉(zhuǎn)否?等其它條件。好處:防止軟件設(shè)計錯誤對條件破壞、干擾的結(jié)果 對條件的影響等 第72頁,共87頁,2023年,2月20日,星期日3、重要模塊的安全性措施某些重要模塊的執(zhí)行對系統(tǒng)有重大影響,如果錯誤執(zhí)行將引起嚴重后果。系統(tǒng)受到干擾后,程序有可能彈飛到該模塊中引起非法執(zhí)行,降低系統(tǒng)可靠性。1)、加強模塊入口條件審查;2)、為執(zhí)行模塊配備“密碼”措施:入口例行條件檢查滿足否?操作準備返回密碼檢查符合否?清除密碼實質(zhì)性操作出錯處理返回NYNY第73頁,共87頁,2023年,2月20日,星期日4、軟件算法的冗錯設(shè)計1)、邏輯運算的冗錯設(shè)計思路:畫卡諾圖、邏輯化簡、程序設(shè)計、出錯處理注意必須作邏輯變量的全覆蓋設(shè)計2)、數(shù)值運算的容錯設(shè)計容錯功能從兩個方面考察:一是對入口條件的要求是否苛刻;二是出口信息中是否包括出錯信息⑴、入口條件審查如:雙字節(jié)除單字節(jié)、商存單字節(jié)正整數(shù)的運算子程序的入口條件?考慮:除數(shù)是否為0?商是否超出一個字節(jié)的范圍?第74頁,共87頁,2023年,2月20日,星期日⑵、必須對某些運算的中間結(jié)果和最終結(jié)果進行檢查,并對結(jié)果做出處理如:A=235+√5B-6C,已知:B〈200,

C〈200,A是1字節(jié)的整數(shù)。首先做入口條件檢查:B〈200?C〈200?能否保證結(jié)果正確?☆5B-6C〈0?☆B遠大于C,出現(xiàn)A〉255情況(B=125,C=0,B〉〉C,A=235+25=260)⑶、出錯信息的設(shè)計和使用出錯信息要設(shè)計的豐富一些,便于人們了解出錯的詳細情況,以便對癥處理。第75頁,共87頁,2023年,2月20日,星期日⑷、合理安排運算方案,減少舍入誤差對最終結(jié)果的影響。如計算:9/5*6方法1:MOVA,#9MOV B,#5DIV ABMOV B,#6MUL AB方法2:MOV A,#9MOV B,#6MUL ABMOV B,#5DIV AB結(jié)果:6結(jié)果:101、先進行無偏差或偏差小的運算;2、盡量避免兩數(shù)值相近的數(shù)過早相減;避免用絕對值小的數(shù)作分母等建議:第76頁,共87頁,2023年,2月20日,星期日⑸、將復(fù)雜運算過程用查表來代替。第77頁,共87頁,2023年,2月20日,星期日CPU抗干擾技術(shù)當干擾作用到CPU本身時,CPU有可能將操作數(shù)當做操作碼來執(zhí)行,使其不能按正常狀態(tài)執(zhí)行程序,從而引起混亂。如何及時發(fā)現(xiàn)CPU受到干擾、如何攔截失去控制的程序流向、如何使系統(tǒng)的損失減小、如何盡可能地恢復(fù)系統(tǒng)正常狀態(tài),便是CPU抗干擾技術(shù)研究的課題。1、睡眠抗干擾2、指令冗余;

3、軟件陷阱;

4、程序運行監(jiān)視系統(tǒng)(WATCHDOG)

第78頁,共87頁,2023年,2月20日,星期日CPU抗干擾技術(shù)當干擾作用到CPU本身時,CPU將不能按正常狀態(tài)執(zhí)行程序,從而引起混亂。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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論