版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第4章 匯編言語程序設(shè)計計算機在完成一項任務(wù)時,必需按照順序執(zhí)行各項操作。這些操作是計算機程序設(shè)計人員按照處理問題的步驟事先描畫好的算法,設(shè)計出相應(yīng)的程序,然后由計算機去執(zhí)行。程序設(shè)計就是用計算機所能接受的方式把處理問題的步驟描畫出來。本章引見匯編言語程序設(shè)計的根底知識,經(jīng)過實例讓學(xué)習(xí)匯編言語程序的設(shè)計方法。本章總體要求: 熟練掌握匯編言語語句的格式、常用的偽指令和程序流程圖熟練掌握匯編言語語句的格式、常用的偽指令和程序流程圖1掌握匯編言語程序設(shè)計的步驟和技巧掌握匯編言語程序設(shè)計的步驟和技巧 2熟習(xí)順序、分支、循環(huán)構(gòu)造和子程序調(diào)用等程序的運用特征熟習(xí)順序、分支、循環(huán)構(gòu)造和子程序調(diào)用等程序的運用
2、特征3可以獨立完本錢章作業(yè)可以獨立完本錢章作業(yè)4本章重點:本章重點: 匯編言語程序設(shè)計中常用偽指令的運用匯編言語程序設(shè)計中常用偽指令的運用 1匯編言語程序設(shè)計的步驟匯編言語程序設(shè)計的步驟 2分支與循環(huán)描畫的了解與實現(xiàn)分支與循環(huán)描畫的了解與實現(xiàn) 3綜合程序的設(shè)計綜合程序的設(shè)計 4本章難點:本章難點: 匯編言語程序設(shè)計算法確實定及繪制程序流程圖匯編言語程序設(shè)計算法確實定及繪制程序流程圖 1多重循環(huán)程序設(shè)計及子程序設(shè)計與調(diào)用多重循環(huán)程序設(shè)計及子程序設(shè)計與調(diào)用2綜合運用程序設(shè)計的實現(xiàn)綜合運用程序設(shè)計的實現(xiàn)34.1.1 程序設(shè)計言語程序設(shè)計言語1機器言語:機器言語是直接面向硬件的二機器言語:機器言語是直
3、接面向硬件的二進制代碼指令。進制代碼指令。2匯編言語:匯編言語是機器言語的符號表匯編言語:匯編言語是機器言語的符號表示,與機器言語一一對應(yīng),編程效率高,示,與機器言語一一對應(yīng),編程效率高,實時性好,但也不能跨平臺任務(wù)。實時性好,但也不能跨平臺任務(wù)。3高級言語:高級言語是一種面向算法和過高級言語:高級言語是一種面向算法和過程的言語程的言語 。4.1.2 匯編言語格式 匯編言語語句格式為:匯編言語語句格式為:標號:操作碼標號:操作碼 操作數(shù)操作數(shù) ;注釋;注釋 1.標號是由用戶定義的符號地址,指明該指標號是由用戶定義的符號地址,指明該指令的起始地址。令的起始地址。 標號是由英文字母開頭的標號是由英
4、文字母開頭的18個字母和數(shù)字個字母和數(shù)字組成的字符串,以冒號組成的字符串,以冒號“:結(jié)尾。:結(jié)尾。2操作碼操作碼操作碼表示該語句要執(zhí)行的操作內(nèi)容,是操作碼表示該語句要執(zhí)行的操作內(nèi)容,是每一條匯編言語必有的部分。操作碼用助每一條匯編言語必有的部分。操作碼用助記符表示,在操作碼后面至少要有一個空記符表示,在操作碼后面至少要有一個空格,使它與操作數(shù)分開。格,使它與操作數(shù)分開。3操作數(shù)操作數(shù)操作數(shù)是該指令操作所需求的數(shù)據(jù)。操作數(shù)是該指令操作所需求的數(shù)據(jù)。 留意:這一字段能夠有也能夠沒有,當(dāng)多于留意:這一字段能夠有也能夠沒有,當(dāng)多于一個操作數(shù)時,操作數(shù)之間用逗號分隔。一個操作數(shù)時,操作數(shù)之間用逗號分隔。
5、 操作數(shù)字段的內(nèi)容可以包括以下幾項:操作數(shù)字段的內(nèi)容可以包括以下幾項:1任務(wù)存放器名;任務(wù)存放器名;2特殊功能存放器名;特殊功能存放器名;3標號名;標號名;4常數(shù);常數(shù);5$:該符號用來表示程序計數(shù)器的當(dāng):該符號用來表示程序計數(shù)器的當(dāng)前值。該符號常出如今轉(zhuǎn)移指令中;前值。該符號常出如今轉(zhuǎn)移指令中;6表達式:在匯編時,計算出表達式的表達式:在匯編時,計算出表達式的值,并把該值填入目的碼中。值,并把該值填入目的碼中。 4注釋注釋注釋不是匯編言語的功能部分,它是語句注釋不是匯編言語的功能部分,它是語句的闡明部分,用于改善程序的可讀性,它的闡明部分,用于改善程序的可讀性,它以分號以分號“;開場。注釋可
6、為一行或多行;開場。注釋可為一行或多行每行均以分號開場。每行均以分號開場。 4.1.3 偽指令偽指令 所謂偽指令又稱為偽操作,它不象機器指所謂偽指令又稱為偽操作,它不象機器指令那樣是在程序運轉(zhuǎn)期間由計算機來執(zhí)行令那樣是在程序運轉(zhuǎn)期間由計算機來執(zhí)行的,它是在匯編程序?qū)υ闯绦騾R編時,由的,它是在匯編程序?qū)υ闯绦騾R編時,由匯編程序處置的操作,它們可以完成如數(shù)匯編程序處置的操作,它們可以完成如數(shù)據(jù)定義、分配存儲器、指示程序終了等功據(jù)定義、分配存儲器、指示程序終了等功能。能。1匯編起始地址命令匯編起始地址命令 格式:格式:ORG nn 功能:規(guī)定此命令之后的程序或數(shù)據(jù)的存功能:規(guī)定此命令之后的程序或數(shù)據(jù)
7、的存放起始地址。放起始地址。 ORG偽指令總是出如今每段源程序或數(shù)據(jù)偽指令總是出如今每段源程序或數(shù)據(jù)塊的開場。塊的開場。2定義字節(jié)偽指令定義字節(jié)偽指令格式:格式:標號:標號: DB X1,X2,Xn功能:從指定地址開場,存放假設(shè)干字節(jié)數(shù)據(jù)。功能:從指定地址開場,存放假設(shè)干字節(jié)數(shù)據(jù)。留意:在程序存儲器空間定義留意:在程序存儲器空間定義8位單字節(jié)數(shù)據(jù),位單字節(jié)數(shù)據(jù),通常用于定義一個常數(shù)表。通常用于定義一個常數(shù)表。Xi為單字節(jié)數(shù)據(jù),為單字節(jié)數(shù)據(jù),它為二進制、八進制、十進制或十六進制數(shù),它為二進制、八進制、十進制或十六進制數(shù),也可以為一個表達式,還可以是由兩個單引也可以為一個表達式,還可以是由兩個單引
8、號所括起來的一個字符串,或單引號括起來號所括起來的一個字符串,或單引號括起來的字符。的字符。3字定義偽指令字定義偽指令格式:格式:標號:標號: DW Y1,Y2,Yn功能:從指定地址開場,存放假設(shè)干字數(shù)據(jù)。功能:從指定地址開場,存放假設(shè)干字數(shù)據(jù)。留意:在程序存儲器空間定義雙字節(jié)數(shù)據(jù),留意:在程序存儲器空間定義雙字節(jié)數(shù)據(jù),經(jīng)常用于定義一個地址表。經(jīng)常用于定義一個地址表。Yi為雙字節(jié)數(shù)為雙字節(jié)數(shù)據(jù),它可以為十進制或十六進制的數(shù),也據(jù),它可以為十進制或十六進制的數(shù),也可以為一個表達式。高位數(shù)在前,低位數(shù)可以為一個表達式。高位數(shù)在前,低位數(shù)在后。在后。 例如:例如: ORG 1000H DATA:DW
9、 3241H,1234H,78H 上述程序?qū)纳鲜龀绦驅(qū)?000H單元開場的單元開場的6個單個單元賦值,賦值情況如何呢?元賦值,賦值情況如何呢? 1000H=32H,1001H=41H,1002H=12H,1003H=34H,1004H=00H,1005H=78H。4匯編終了偽指令匯編終了偽指令 END 該偽指令指出終了匯編,即使后面還有指令,該偽指令指出終了匯編,即使后面還有指令,匯編程序也不處置。匯編程序也不處置。5賦值偽指令賦值偽指令格式:標號格式:標號 EQU 表達式表達式功能:將表達式的值數(shù)據(jù)或地址賦給標功能:將表達式的值數(shù)據(jù)或地址賦給標 號。號。 留意:標號為字符稱號,其后無
10、冒留意:標號為字符稱號,其后無冒號。在一個程序中對于某一個標號號。在一個程序中對于某一個標號只能賦一次值,一旦賦值在本程序只能賦一次值,一旦賦值在本程序的恣意位置就可以援用該標號。的恣意位置就可以援用該標號。 例如:例如:ORG 3000HSTA EQU 80HTAB EQU 10MUL EQU 4000HMOV A,STAMOV B,TABLCALL MUL定義了三個標號:定義了三個標號:STA=80H,TAB=10,MUL=4000H,在程,在程序中直接援用這三個序中直接援用這三個標號來替代標號來替代80H、10、4000H。6位定義偽指令位定義偽指令格式:格式:標號標號 BIT 位地址位
11、地址功能:將位地址賦給標號。功能:將位地址賦給標號。其中,標號為字符稱號,其后無冒號。其中,標號為字符稱號,其后無冒號。例如:例如:A1 BIT P0.1A2 BIT PSW.34.2 匯編言語程序設(shè)計匯編言語程序設(shè)計4.2.1 匯編程序設(shè)計根底匯編程序設(shè)計根底1匯編言語程序設(shè)計的步驟:匯編言語程序設(shè)計的步驟: 1分析問題,明確義務(wù)分析問題,明確義務(wù)2確定算法確定算法 3畫出程序流程圖畫出程序流程圖 4編寫源程序編寫源程序5匯編和調(diào)試匯編和調(diào)試2匯編言語程序的格式匯編言語程序的格式ORG 起始地址起始地址 ;數(shù)據(jù)存放;數(shù)據(jù)存放 ;程序代碼;程序代碼SJMP $ ;原地踏步;原地踏步END3匯編
12、言語源程序的匯編匯編言語源程序的匯編 匯編言語源程序必需轉(zhuǎn)換成計算機能過識匯編言語源程序必需轉(zhuǎn)換成計算機能過識別的目的程序后才干執(zhí)行,匯編方法通常別的目的程序后才干執(zhí)行,匯編方法通常有機器匯編和手工匯編兩種方法。有機器匯編和手工匯編兩種方法。4匯編言語程序設(shè)計的技巧匯編言語程序設(shè)計的技巧1盡量采用模塊化、構(gòu)造化的程序設(shè)計方盡量采用模塊化、構(gòu)造化的程序設(shè)計方法。法。 2合理地繪制程序流程圖合理地繪制程序流程圖 3少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)構(gòu)少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)構(gòu)造和子程序構(gòu)造。造和子程序構(gòu)造。4充分利用累加器。充分利用累加器。 5精心設(shè)計主要程序段。精心設(shè)計主要程序段。 6對于
13、中斷要留意維護和恢復(fù)現(xiàn)場。對于中斷要留意維護和恢復(fù)現(xiàn)場。4.2.2 順序程序設(shè)計順序程序設(shè)計 順序構(gòu)造程序又稱為簡單構(gòu)造程序,是指順序構(gòu)造程序又稱為簡單構(gòu)造程序,是指一種順序執(zhí)行的程序,程序從第一條指令一種順序執(zhí)行的程序,程序從第一條指令到最后一條指令的整個執(zhí)行過程中既無分到最后一條指令的整個執(zhí)行過程中既無分支又無循環(huán)。支又無循環(huán)。【例【例4.1】兩個】兩個8位無符號數(shù)相加,和仍為位無符號數(shù)相加,和仍為8位。位。分析:假設(shè)兩個無符號數(shù)分析:假設(shè)兩個無符號數(shù)X、Y分別存放于內(nèi)部分別存放于內(nèi)部RAM的的60H、61H單元中,求和并存于單元中,求和并存于62H單元單元中。中。 程序如下:程序如下:O
14、RG 2000HMOVR0,#60H;設(shè);設(shè)R0為數(shù)據(jù)指針為數(shù)據(jù)指針MOVA, R0;將;將X值送入值送入A中中INCR0ADDA,R0;X+YINCR0MOVR0,A;保管結(jié)果;保管結(jié)果SJMP $ ;原地踏步;原地踏步END【例【例4.2】假設(shè)兩個雙字節(jié)無符號數(shù),分別存】假設(shè)兩個雙字節(jié)無符號數(shù),分別存放在放在R1R0和和R3R2中,高字節(jié)在前,低字中,高字節(jié)在前,低字節(jié)在后。編程使兩數(shù)相加,用節(jié)在后。編程使兩數(shù)相加,用R2R1R0存放存放和。和。 對多字節(jié)的加法,存在最高位的進位問題。對多字節(jié)的加法,存在最高位的進位問題。假設(shè)最高位有進位,那么和的字節(jié)數(shù)要比假設(shè)最高位有進位,那么和的字節(jié)數(shù)
15、要比加數(shù)或被加數(shù)的字節(jié)數(shù)多一個。加數(shù)或被加數(shù)的字節(jié)數(shù)多一個。ORG 1000HCLR CMOV A,R0;取被加數(shù)低字節(jié);取被加數(shù)低字節(jié)AADD A,R2;與加數(shù)低字節(jié)相加;與加數(shù)低字節(jié)相加MOV R0,A;存和數(shù)低字節(jié);存和數(shù)低字節(jié)MOV A,Rl;取被加數(shù)高字節(jié);取被加數(shù)高字節(jié)AADDC A,R3;與加數(shù)高字節(jié)相加;與加數(shù)高字節(jié)相加MOV R1,A;存和數(shù)高字節(jié);存和數(shù)高字節(jié)MOV A,#0ADDC A,#0;加進位位;加進位位MOV R2,A ;存和數(shù)進位位;存和數(shù)進位位SJMP $ ; END【例【例4.3】16位二進制數(shù)求補,設(shè)兩個字節(jié)原位二進制數(shù)求補,設(shè)兩個字節(jié)原碼數(shù)存在碼數(shù)存在R
16、1R0中,求補后結(jié)果存在中,求補后結(jié)果存在R3R2中。中。分析:二進制數(shù)求補操作,可采用分析:二進制數(shù)求補操作,可采用“原碼求反原碼求反+1的方法來實現(xiàn),可運用求反指令和加的方法來實現(xiàn),可運用求反指令和加法指令來實現(xiàn)。法指令來實現(xiàn)。程序如下:程序如下:ORG 1000HMOVA,R0 ;低;低8位送位送ACPLA;ADDA,#01H;MOVR2,A;送結(jié)果低位;送結(jié)果低位MOVA,R1 ;高;高8位送位送ACPLA;ADDCA,#00H;加進位;加進位MOVR3,A;送結(jié)果高位;送結(jié)果高位SJMP$END【例【例4.4】將內(nèi)部】將內(nèi)部RAM的的60H單元中的無符號單元中的無符號二進制數(shù)轉(zhuǎn)換為二
17、進制數(shù)轉(zhuǎn)換為3位位BCD碼,并將結(jié)果按由碼,并將結(jié)果按由高位到低位的順序存放到高位到低位的順序存放到63H、62H、61H單元中。單元中。分析:分析:8位無符號二進制數(shù)表示的數(shù)據(jù)范圍位無符號二進制數(shù)表示的數(shù)據(jù)范圍0255,所以用,所以用BCD碼,最多碼,最多3位??蓪⒈晃弧?蓪⒈晦D(zhuǎn)換的數(shù)除以轉(zhuǎn)換的數(shù)除以100,商即百位數(shù);余數(shù)再除,商即百位數(shù);余數(shù)再除以以10得十位數(shù);最后余數(shù)即為個位數(shù)。得十位數(shù);最后余數(shù)即為個位數(shù)。編程如下:編程如下:ORG 1000HHBCD: MOV A,60H;取原數(shù)據(jù);取原數(shù)據(jù)MOV B,#100;除數(shù);除數(shù)100BDIV AB ;除;除100MOV 63H,A ;
18、百位;百位BCDMOV A,BMOV B,#10 ;除數(shù);除數(shù)10BDIV AB ;MOV 62H,A ;存十位;存十位BCD MOV 61H,B;存?zhèn)€位;存?zhèn)€位BCDSJMP $END4.2.3 分支程序設(shè)計圖圖4-1 4-1 分支程序流程圖分支程序流程圖【例【例4.5】設(shè)內(nèi)部】設(shè)內(nèi)部RAM 60H和和61H單元中存放單元中存放兩個無符號數(shù),試比較它們的大小。將較兩個無符號數(shù),試比較它們的大小。將較小的數(shù)存放在小的數(shù)存放在60H單元,較大的數(shù)存放在單元,較大的數(shù)存放在61H單元中。單元中。分析:這是一個簡單分支程序,可以使兩數(shù)分析:這是一個簡單分支程序,可以使兩數(shù)相減,用相減,用JC指令進展
19、判別。假設(shè)指令進展判別。假設(shè)CY=1,那,那么被減數(shù)小于減數(shù)。么被減數(shù)小于減數(shù)。 ORG1000HSTART:CLR C ;0CY MOVA,60H SUBBA,61H;做減法比較兩數(shù);做減法比較兩數(shù) JC NEXT;假設(shè);假設(shè)(60H)小,那么小,那么轉(zhuǎn)移轉(zhuǎn)移 MOVA,60H XCH A, 61H;交換兩數(shù);交換兩數(shù) MOV 60H,A NEXT: NOP SJMP $ END【例【例4.6】將】將R2中的一位十六進制數(shù)轉(zhuǎn)換為中的一位十六進制數(shù)轉(zhuǎn)換為ASCII碼,結(jié)果仍存放于碼,結(jié)果仍存放于R2中。中。分析:數(shù)字分析:數(shù)字09的的ASCII碼分別是碼分別是30H39H,英文大寫字母英文大寫
20、字母AF的的ASCII碼分別是碼分別是4146H。因此,假設(shè)該十六進制數(shù)小于。因此,假設(shè)該十六進制數(shù)小于10,要轉(zhuǎn)換為要轉(zhuǎn)換為ASCII碼應(yīng)加碼應(yīng)加30H,假設(shè)該十六進,假設(shè)該十六進制數(shù)大于制數(shù)大于10,那么加,那么加37H。 ORG 1000HMOV A,R2CJNE A,#0AH,L1L1:JNC ADD37ADD30:ADD A,#30HMOV R2,ASJMP FINISHADD37:ADD A,#37HMOV R2,AFINISH:SJMP $END【例【例4.7】設(shè)變量】設(shè)變量x存入存入30H單元,求得函數(shù)單元,求得函數(shù)y存入存入31H單元。按下式要求給單元。按下式要求給y賦值:賦
21、值: x+1 (10 x) y= 0 (5x10) x-1 (x10時,采用時,采用CJNE和和JC以及以及CJNE和和JNC指令進展判別。指令進展判別。程序如下:程序如下:ORG 1000HMOV A,30H ;?。蝗CJNE A,#5,NEXTl;與;與5比較比較NEXT1:JC NEXT2 ;X5,那么轉(zhuǎn),那么轉(zhuǎn)NEXT2MOV R0,A ;INC R0 ;設(shè);設(shè)1010,那么轉(zhuǎn),那么轉(zhuǎn)NEXT4 MOV R0, #0 ;5X10,Y=0 SJMP NEXT4NEXT2:MOV R0,A DEC R0 ;X5,Y=X-1NEXT4:MOV 31H,R0 ;存結(jié)果;存結(jié)果SJMP $EN
22、D4.2.4 循環(huán)程序設(shè)計循環(huán)程序設(shè)計循環(huán)程序普通包括以下循環(huán)程序普通包括以下5部分:部分:初始化部分:循環(huán)程序的預(yù)備部分,把初始參數(shù)賦初始化部分:循環(huán)程序的預(yù)備部分,把初始參數(shù)賦給控制變量。給控制變量。循環(huán)處置部分:循環(huán)程序反復(fù)執(zhí)行的部分,這是循循環(huán)處置部分:循環(huán)程序反復(fù)執(zhí)行的部分,這是循環(huán)程序的實體。環(huán)程序的實體。修正部分:修正控制變量的值,為進入下一輪循環(huán)修正部分:修正控制變量的值,為進入下一輪循環(huán)做預(yù)備。做預(yù)備??刂撇糠郑焊鶕?jù)循環(huán)終了條件,判別循環(huán)能否終了。控制部分:根據(jù)循環(huán)終了條件,判別循環(huán)能否終了。終了部分:分析、處置及存放程序執(zhí)行結(jié)果。終了部分:分析、處置及存放程序執(zhí)行結(jié)果。 循
23、環(huán)程序的構(gòu)造普通由兩種方式:1單循環(huán)程序設(shè)計單循環(huán)程序設(shè)計【例【例4.8】循環(huán)次數(shù)知的單重循環(huán)?!垦h(huán)次數(shù)知的單重循環(huán)。 在內(nèi)部在內(nèi)部RAM的的 20H2FH延續(xù)延續(xù)16個單元中個單元中存放單字節(jié)無符號數(shù)。求這存放單字節(jié)無符號數(shù)。求這16個無符號數(shù)個無符號數(shù)之和,并存入內(nèi)部之和,并存入內(nèi)部RAM 61H和和60H中。中。分析:這是反復(fù)相加問題,且事先知道循環(huán)分析:這是反復(fù)相加問題,且事先知道循環(huán)次數(shù),故采用計數(shù)器控制的循環(huán)程序設(shè)計次數(shù),故采用計數(shù)器控制的循環(huán)程序設(shè)計方法。設(shè)用方法。設(shè)用R0作加數(shù)地址指針,作加數(shù)地址指針,R7作循環(huán)作循環(huán)次數(shù)計數(shù)器,次數(shù)計數(shù)器,R3作和數(shù)的高字節(jié)存放器。作和數(shù)的
24、高字節(jié)存放器。 ORG 0200HSTART:MOV R7,#15 ;循環(huán)次數(shù);循環(huán)次數(shù) MOV R3,#0 ;裝和的高字節(jié);裝和的高字節(jié)MOV A, 20H ;MOV R0,#21H ;加數(shù)的地址;加數(shù)的地址 LOOP:ADD A,R0 ;累加和在;累加和在A中中 JNC NEXT ;沒進位那么跳;沒進位那么跳NEXT INC R3 ;有進位,那么高位加;有進位,那么高位加1 NEXT:INC R0 ;加數(shù)地址加;加數(shù)地址加1 DJNZ R7,LOOP MOV 61H,R3;將和的高位傳;將和的高位傳51H中中MOV 60H,A ;將和的低位傳;將和的低位傳50H中中SJMP $ END 【
25、例【例4.9】循環(huán)次數(shù)未知的單重循環(huán)?!垦h(huán)次數(shù)未知的單重循環(huán)。設(shè)有一字符串存放在內(nèi)部設(shè)有一字符串存放在內(nèi)部RAM 21H開場的單開場的單元中,并以元中,并以“$作為終了標志,請計算該作為終了標志,請計算該字符串的長度,并將其存入字符串的長度,并將其存入20H單元。單元。分析:該字符串長度事先未知,但知道終了分析:該字符串長度事先未知,但知道終了條件,故采用條件控制的循環(huán)程序設(shè)計方條件,故采用條件控制的循環(huán)程序設(shè)計方法。法。 程序如下:程序如下:ORG 0200HMOV A, #0MOV R0, #21HLOOP:CJNE R0, #24H, NEXTSJMP EXITNEXT:INCAINC
26、R0SJMP LOOPEXIT:MOV 20H, ASJMP $ END 2多重循環(huán)程序設(shè)計多重循環(huán)程序設(shè)計【例【例4.11】設(shè)單片機運用】設(shè)單片機運用12MHz晶振機器晶振機器周期周期T為為1s,設(shè)計延時,設(shè)計延時1s的程序。的程序。分析:由于執(zhí)行每條指令都需求一定的時間,分析:由于執(zhí)行每條指令都需求一定的時間,其時間長短由指令周期和晶振頻率決議其時間長短由指令周期和晶振頻率決議t=機器周期數(shù)機器周期數(shù)12振蕩周期。單條指振蕩周期。單條指令的執(zhí)行時間只需令的執(zhí)行時間只需1到幾個微秒,假設(shè)需求到幾個微秒,假設(shè)需求較長時間的延時就需求執(zhí)行多條指令,在較長時間的延時就需求執(zhí)行多條指令,在單片機運用
27、中普通采用多重循環(huán)方式來實單片機運用中普通采用多重循環(huán)方式來實現(xiàn)?,F(xiàn)。 程序如下:ORG 200HDEL1s:MOV R3,#10;單周期,1TDEL1: MOV R4,#200;單周期,1TDEL2: MOV R5,#248;單周期,1TDEL3: DJNZR5,DEL3;雙周期,2TNOP;單周期,1TDJNZR4,DEL2;雙周期,2TDJNZR3,DEL1;雙周期,2TRET;雙周期,2TEND【例【例4.12】將片內(nèi)】將片內(nèi)RAM 40H4FH單元的單元的16個無符個無符號數(shù)按從大到小的順序陳列,排序后仍存放在原號數(shù)按從大到小的順序陳列,排序后仍存放在原數(shù)據(jù)區(qū)中。數(shù)據(jù)區(qū)中。分析:這是
28、一個數(shù)據(jù)排序問題。分析:這是一個數(shù)據(jù)排序問題。 數(shù)據(jù)排序常用的方法有數(shù)據(jù)排序常用的方法有“冒泡法和冒泡法和“選擇法選擇法。下面采用。下面采用“冒泡法設(shè)計程序。冒泡法設(shè)計程序。 所謂所謂“冒泡法是指依次將兩個相鄰單元的內(nèi)冒泡法是指依次將兩個相鄰單元的內(nèi)容進展比較,假設(shè)符合由大到小的順序,數(shù)據(jù)堅容進展比較,假設(shè)符合由大到小的順序,數(shù)據(jù)堅持原狀,否那么相鄰單元的數(shù)據(jù)互換。經(jīng)過一輪持原狀,否那么相鄰單元的數(shù)據(jù)互換。經(jīng)過一輪比較以后,這一組數(shù)中最小的數(shù)曾經(jīng)找出,存放比較以后,這一組數(shù)中最小的數(shù)曾經(jīng)找出,存放于數(shù)據(jù)區(qū)的最后位置。然后再進展第二輪的比較,于數(shù)據(jù)區(qū)的最后位置。然后再進展第二輪的比較,循環(huán)終了時
29、找出次小數(shù)。繼續(xù)循環(huán),直到原數(shù)據(jù)循環(huán)終了時找出次小數(shù)。繼續(xù)循環(huán),直到原數(shù)據(jù)區(qū)中存放的是從大到小的排序的數(shù)組。區(qū)中存放的是從大到小的排序的數(shù)組。 例4.12程序流程圖 ORG1000HSORT:MOV R0,#40H;置數(shù)組首地址;置數(shù)組首地址MOVR7,#10H;數(shù)據(jù)塊長度;數(shù)據(jù)塊長度CLRF0;交換標志清;交換標志清0DECR7;循環(huán)次數(shù);循環(huán)次數(shù)SORT1:MOV A,R0;取前數(shù);取前數(shù)MOV20H,A;把前數(shù)暫存在;把前數(shù)暫存在20H單元單元INCR0MOV21H,R0;后數(shù)暫存于;后數(shù)暫存于21H單元單元CJNEA,21H,SORT2;相鄰兩數(shù)比較;相鄰兩數(shù)比較SORT2:JNC S
30、ORT3 ;假設(shè)前數(shù)大于等于后數(shù),轉(zhuǎn);假設(shè)前數(shù)大于等于后數(shù),轉(zhuǎn)SORT3MOVA,R0 ;假設(shè)前數(shù)小于后數(shù),兩者交換;假設(shè)前數(shù)小于后數(shù),兩者交換MOVR0,20HDECR0MOVR0,AINCR0;恢復(fù);恢復(fù)R0原值原值SETBF0;置交換標志位為;置交換標志位為1SORT3 :DJNZ R7,SORT1;如計數(shù)器長度不為;如計數(shù)器長度不為0,那么繼續(xù)比較,那么繼續(xù)比較JB F0,SORT;假設(shè)判別標志位為;假設(shè)判別標志位為1,那么繼續(xù)循環(huán),否終了,那么繼續(xù)循環(huán),否終了循環(huán)循環(huán) SJMP$END留意:對于循環(huán)構(gòu)造程序設(shè)計,需求留意:留意:對于循環(huán)構(gòu)造程序設(shè)計,需求留意:1在進入循環(huán)之前,應(yīng)合理
31、設(shè)置循環(huán)初始變量。在進入循環(huán)之前,應(yīng)合理設(shè)置循環(huán)初始變量。2循環(huán)體只能執(zhí)行有限次,假設(shè)無限執(zhí)行的話,稱之為循環(huán)體只能執(zhí)行有限次,假設(shè)無限執(zhí)行的話,稱之為“死循環(huán),這是該當(dāng)防止的。死循環(huán),這是該當(dāng)防止的。3不能破壞或修正循環(huán)體,要特別留意的是防止從循環(huán)不能破壞或修正循環(huán)體,要特別留意的是防止從循環(huán)體外直接跳轉(zhuǎn)到循環(huán)體內(nèi)。體外直接跳轉(zhuǎn)到循環(huán)體內(nèi)。4多重循環(huán)的嵌套是從外層向內(nèi)層一層層進入,從內(nèi)層多重循環(huán)的嵌套是從外層向內(nèi)層一層層進入,從內(nèi)層向外層一層層退出。不要在外層循環(huán)中用跳轉(zhuǎn)指令直接轉(zhuǎn)向外層一層層退出。不要在外層循環(huán)中用跳轉(zhuǎn)指令直接轉(zhuǎn)到內(nèi)層循環(huán)休內(nèi)。到內(nèi)層循環(huán)休內(nèi)。5循環(huán)體內(nèi)可以直接轉(zhuǎn)到循環(huán)體外
32、或外層循環(huán)中,實現(xiàn)循環(huán)體內(nèi)可以直接轉(zhuǎn)到循環(huán)體外或外層循環(huán)中,實現(xiàn)一個循環(huán)由多個條件控制終了的構(gòu)造。一個循環(huán)由多個條件控制終了的構(gòu)造。6對循環(huán)體的編程要仔細琢磨,合理安排,對其進展優(yōu)對循環(huán)體的編程要仔細琢磨,合理安排,對其進展優(yōu)化時,應(yīng)主要放在縮短執(zhí)行時間上,其次是程序的長度?;瘯r,應(yīng)主要放在縮短執(zhí)行時間上,其次是程序的長度。4.2.5 子程序調(diào)用設(shè)計子程序調(diào)用設(shè)計1子程序的構(gòu)造子程序的構(gòu)造 在在MCS-51指令系統(tǒng)中,提供了兩條子指令系統(tǒng)中,提供了兩條子程序指令程序指令A(yù)CALL、LCALL以及一條前往主以及一條前往主程序的指令程序的指令RET。 一個子程序在運轉(zhuǎn)的過程中還可以調(diào)一個子程序在運
33、轉(zhuǎn)的過程中還可以調(diào)用其它的子程序,這稱為子程序嵌套。用其它的子程序,這稱為子程序嵌套。 2子程序設(shè)計時的本卷須知子程序設(shè)計時的本卷須知1每個子程序都應(yīng)有獨一的入口,子程序的每個子程序都應(yīng)有獨一的入口,子程序的第一條指令的地址稱為入口地址。該指令前必需第一條指令的地址稱為入口地址。該指令前必需有標號,最好以子程序的義務(wù)定名,以便主程序有標號,最好以子程序的義務(wù)定名,以便主程序正確的調(diào)用它。正確的調(diào)用它。2調(diào)用子程序的指令在主程序中,子程序以調(diào)用子程序的指令在主程序中,子程序以RET指令終了,這樣才干前往主程序。指令終了,這樣才干前往主程序。3子程序調(diào)用和前往指令能自動維護和恢復(fù)子程序調(diào)用和前往指
34、令能自動維護和恢復(fù)斷點,但對于需求維護的存放器和內(nèi)存單元的內(nèi)斷點,但對于需求維護的存放器和內(nèi)存單元的內(nèi)容,必需在子程序開場和末尾安排維護和恢復(fù)他容,必需在子程序開場和末尾安排維護和恢復(fù)他們的指令。們的指令。4為使所編的子程序可以放在為使所編的子程序可以放在64KB程序存儲程序存儲器的任何地方并能被主程序調(diào)用,子程序內(nèi)部必器的任何地方并能被主程序調(diào)用,子程序內(nèi)部必需運用相對轉(zhuǎn)移指令而不運用其它轉(zhuǎn)移指令,以需運用相對轉(zhuǎn)移指令而不運用其它轉(zhuǎn)移指令,以便匯編時生成浮動代碼。便匯編時生成浮動代碼。3參數(shù)傳送方法參數(shù)傳送方法 在調(diào)用子程序時會遇到主程序和子程在調(diào)用子程序時會遇到主程序和子程序之間參數(shù)如何傳
35、送的問題。序之間參數(shù)如何傳送的問題。 入口參數(shù):主程序調(diào)用子程序時,傳入口參數(shù):主程序調(diào)用子程序時,傳入子程序的參數(shù)稱為入口參數(shù)。入子程序的參數(shù)稱為入口參數(shù)。 出口參數(shù):子程序運算出的結(jié)果稱為出口參數(shù):子程序運算出的結(jié)果稱為出口參數(shù)。出口參數(shù)。 常用的參數(shù)傳送方法有:任務(wù)存放器常用的參數(shù)傳送方法有:任務(wù)存放器或累加器、指針存放器、堆棧和程序段等。或累加器、指針存放器、堆棧和程序段等。 【例【例4.13】用子程序調(diào)用的方法實現(xiàn)】用子程序調(diào)用的方法實現(xiàn)C=a2 + b2 ,假設(shè),假設(shè)a、b均小于均小于10。a存于存于31H單元,單元,b存于存于32H單元單元 ,結(jié)果,結(jié)果C存于存于30H單元。單元。分析:由于分析:由于a、b均小于均小于10,那么它們的平方,那么它們的平方和為單字節(jié)數(shù),由于此題兩次用到平方的和為單字節(jié)數(shù),由于此題兩次用到平方的運算,所以把求平方運算設(shè)計成子程序。運算,所以把求平方運算設(shè)計成子程序。 子程序和主程序如下:子程序和主程序如下:ORG 1000HMAIN:MOV SP,#60H;設(shè)置堆棧指針;設(shè)置堆棧指針MOV A,31H;??;取a的值的值LCALL SQR;調(diào)子程序,求;調(diào)子程序,求a2MOV 30
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機械原與設(shè)計課程設(shè)計
- 組織員培訓(xùn)班課程設(shè)計
- 米酒蒸餾的課程設(shè)計
- 綜合地質(zhì)學(xué)課程設(shè)計
- 研學(xué)課程設(shè)計動物
- 幼兒園語言整合課程設(shè)計
- 維族特色早教課程設(shè)計
- 巖石力學(xué)與工程課程設(shè)計
- 文字動畫講解課程設(shè)計
- (期末押題卷)廣東省廣州市期末重難點高頻易錯培優(yōu)卷(試題)-2024-2025學(xué)年三年級上冊數(shù)學(xué)人教版
- 父愛深深 閱讀附答案
- 在小學(xué)語文教學(xué)中彰顯人文情懷 人文情懷
- 讀書分享 《被討厭的勇氣》
- 急性呼吸衰竭的診斷和處理
- GB/T 9846.4-2004膠合板第4部分:普通膠合板外觀分等技術(shù)條件
- 2021屆虹口區(qū)高三英語一模
- GB/T 337.1-2014工業(yè)硝酸濃硝酸
- 小學(xué)語文課程標準(2023年版)
- 第十一章英國自然風(fēng)景式園林
- 涉稅風(fēng)險防范課件
- 燃氣鍋爐安全檢查表分析(SCL)+評價記錄
評論
0/150
提交評論