版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 匯編言語(yǔ)程序設(shè)計(jì)計(jì)算機(jī)在完成一項(xiàng)任務(wù)時(shí),必需按照順序執(zhí)行各項(xiàng)操作。這些操作是計(jì)算機(jī)程序設(shè)計(jì)人員按照處理問題的步驟事先描畫好的算法,設(shè)計(jì)出相應(yīng)的程序,然后由計(jì)算機(jī)去執(zhí)行。程序設(shè)計(jì)就是用計(jì)算機(jī)所能接受的方式把處理問題的步驟描畫出來。本章引見匯編言語(yǔ)程序設(shè)計(jì)的根底知識(shí),經(jīng)過實(shí)例讓學(xué)習(xí)匯編言語(yǔ)程序的設(shè)計(jì)方法。本章總體要求: 熟練掌握匯編言語(yǔ)語(yǔ)句的格式、常用的偽指令和程序流程圖熟練掌握匯編言語(yǔ)語(yǔ)句的格式、常用的偽指令和程序流程圖1掌握匯編言語(yǔ)程序設(shè)計(jì)的步驟和技巧掌握匯編言語(yǔ)程序設(shè)計(jì)的步驟和技巧 2熟習(xí)順序、分支、循環(huán)構(gòu)造和子程序調(diào)用等程序的運(yùn)用特征熟習(xí)順序、分支、循環(huán)構(gòu)造和子程序調(diào)用等程序的運(yùn)用
2、特征3可以獨(dú)立完本錢章作業(yè)可以獨(dú)立完本錢章作業(yè)4本章重點(diǎn):本章重點(diǎn): 匯編言語(yǔ)程序設(shè)計(jì)中常用偽指令的運(yùn)用匯編言語(yǔ)程序設(shè)計(jì)中常用偽指令的運(yùn)用 1匯編言語(yǔ)程序設(shè)計(jì)的步驟匯編言語(yǔ)程序設(shè)計(jì)的步驟 2分支與循環(huán)描畫的了解與實(shí)現(xiàn)分支與循環(huán)描畫的了解與實(shí)現(xiàn) 3綜合程序的設(shè)計(jì)綜合程序的設(shè)計(jì) 4本章難點(diǎn):本章難點(diǎn): 匯編言語(yǔ)程序設(shè)計(jì)算法確實(shí)定及繪制程序流程圖匯編言語(yǔ)程序設(shè)計(jì)算法確實(shí)定及繪制程序流程圖 1多重循環(huán)程序設(shè)計(jì)及子程序設(shè)計(jì)與調(diào)用多重循環(huán)程序設(shè)計(jì)及子程序設(shè)計(jì)與調(diào)用2綜合運(yùn)用程序設(shè)計(jì)的實(shí)現(xiàn)綜合運(yùn)用程序設(shè)計(jì)的實(shí)現(xiàn)34.1.1 程序設(shè)計(jì)言語(yǔ)程序設(shè)計(jì)言語(yǔ)1機(jī)器言語(yǔ):機(jī)器言語(yǔ)是直接面向硬件的二機(jī)器言語(yǔ):機(jī)器言語(yǔ)是直
3、接面向硬件的二進(jìn)制代碼指令。進(jìn)制代碼指令。2匯編言語(yǔ):匯編言語(yǔ)是機(jī)器言語(yǔ)的符號(hào)表匯編言語(yǔ):匯編言語(yǔ)是機(jī)器言語(yǔ)的符號(hào)表示,與機(jī)器言語(yǔ)一一對(duì)應(yīng),編程效率高,示,與機(jī)器言語(yǔ)一一對(duì)應(yīng),編程效率高,實(shí)時(shí)性好,但也不能跨平臺(tái)任務(wù)。實(shí)時(shí)性好,但也不能跨平臺(tái)任務(wù)。3高級(jí)言語(yǔ):高級(jí)言語(yǔ)是一種面向算法和過高級(jí)言語(yǔ):高級(jí)言語(yǔ)是一種面向算法和過程的言語(yǔ)程的言語(yǔ) 。4.1.2 匯編言語(yǔ)格式 匯編言語(yǔ)語(yǔ)句格式為:匯編言語(yǔ)語(yǔ)句格式為:標(biāo)號(hào):操作碼標(biāo)號(hào):操作碼 操作數(shù)操作數(shù) ;注釋;注釋 1.標(biāo)號(hào)是由用戶定義的符號(hào)地址,指明該指標(biāo)號(hào)是由用戶定義的符號(hào)地址,指明該指令的起始地址。令的起始地址。 標(biāo)號(hào)是由英文字母開頭的標(biāo)號(hào)是由英
4、文字母開頭的18個(gè)字母和數(shù)字個(gè)字母和數(shù)字組成的字符串,以冒號(hào)組成的字符串,以冒號(hào)“:結(jié)尾。:結(jié)尾。2操作碼操作碼操作碼表示該語(yǔ)句要執(zhí)行的操作內(nèi)容,是操作碼表示該語(yǔ)句要執(zhí)行的操作內(nèi)容,是每一條匯編言語(yǔ)必有的部分。操作碼用助每一條匯編言語(yǔ)必有的部分。操作碼用助記符表示,在操作碼后面至少要有一個(gè)空記符表示,在操作碼后面至少要有一個(gè)空格,使它與操作數(shù)分開。格,使它與操作數(shù)分開。3操作數(shù)操作數(shù)操作數(shù)是該指令操作所需求的數(shù)據(jù)。操作數(shù)是該指令操作所需求的數(shù)據(jù)。 留意:這一字段能夠有也能夠沒有,當(dāng)多于留意:這一字段能夠有也能夠沒有,當(dāng)多于一個(gè)操作數(shù)時(shí),操作數(shù)之間用逗號(hào)分隔。一個(gè)操作數(shù)時(shí),操作數(shù)之間用逗號(hào)分隔。
5、 操作數(shù)字段的內(nèi)容可以包括以下幾項(xiàng):操作數(shù)字段的內(nèi)容可以包括以下幾項(xiàng):1任務(wù)存放器名;任務(wù)存放器名;2特殊功能存放器名;特殊功能存放器名;3標(biāo)號(hào)名;標(biāo)號(hào)名;4常數(shù);常數(shù);5$:該符號(hào)用來表示程序計(jì)數(shù)器的當(dāng):該符號(hào)用來表示程序計(jì)數(shù)器的當(dāng)前值。該符號(hào)常出如今轉(zhuǎn)移指令中;前值。該符號(hào)常出如今轉(zhuǎn)移指令中;6表達(dá)式:在匯編時(shí),計(jì)算出表達(dá)式的表達(dá)式:在匯編時(shí),計(jì)算出表達(dá)式的值,并把該值填入目的碼中。值,并把該值填入目的碼中。 4注釋注釋注釋不是匯編言語(yǔ)的功能部分,它是語(yǔ)句注釋不是匯編言語(yǔ)的功能部分,它是語(yǔ)句的闡明部分,用于改善程序的可讀性,它的闡明部分,用于改善程序的可讀性,它以分號(hào)以分號(hào)“;開場(chǎng)。注釋可
6、為一行或多行;開場(chǎng)。注釋可為一行或多行每行均以分號(hào)開場(chǎng)。每行均以分號(hào)開場(chǎng)。 4.1.3 偽指令偽指令 所謂偽指令又稱為偽操作,它不象機(jī)器指所謂偽指令又稱為偽操作,它不象機(jī)器指令那樣是在程序運(yùn)轉(zhuǎn)期間由計(jì)算機(jī)來執(zhí)行令那樣是在程序運(yùn)轉(zhuǎn)期間由計(jì)算機(jī)來執(zhí)行的,它是在匯編程序?qū)υ闯绦騾R編時(shí),由的,它是在匯編程序?qū)υ闯绦騾R編時(shí),由匯編程序處置的操作,它們可以完成如數(shù)匯編程序處置的操作,它們可以完成如數(shù)據(jù)定義、分配存儲(chǔ)器、指示程序終了等功據(jù)定義、分配存儲(chǔ)器、指示程序終了等功能。能。1匯編起始地址命令匯編起始地址命令 格式:格式:ORG nn 功能:規(guī)定此命令之后的程序或數(shù)據(jù)的存功能:規(guī)定此命令之后的程序或數(shù)據(jù)
7、的存放起始地址。放起始地址。 ORG偽指令總是出如今每段源程序或數(shù)據(jù)偽指令總是出如今每段源程序或數(shù)據(jù)塊的開場(chǎng)。塊的開場(chǎng)。2定義字節(jié)偽指令定義字節(jié)偽指令格式:格式:標(biāo)號(hào):標(biāo)號(hào): DB X1,X2,Xn功能:從指定地址開場(chǎng),存放假設(shè)干字節(jié)數(shù)據(jù)。功能:從指定地址開場(chǎng),存放假設(shè)干字節(jié)數(shù)據(jù)。留意:在程序存儲(chǔ)器空間定義留意:在程序存儲(chǔ)器空間定義8位單字節(jié)數(shù)據(jù),位單字節(jié)數(shù)據(jù),通常用于定義一個(gè)常數(shù)表。通常用于定義一個(gè)常數(shù)表。Xi為單字節(jié)數(shù)據(jù),為單字節(jié)數(shù)據(jù),它為二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制數(shù),它為二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制數(shù),也可以為一個(gè)表達(dá)式,還可以是由兩個(gè)單引也可以為一個(gè)表達(dá)式,還可以是由兩個(gè)單引
8、號(hào)所括起來的一個(gè)字符串,或單引號(hào)括起來號(hào)所括起來的一個(gè)字符串,或單引號(hào)括起來的字符。的字符。3字定義偽指令字定義偽指令格式:格式:標(biāo)號(hào):標(biāo)號(hào): DW Y1,Y2,Yn功能:從指定地址開場(chǎng),存放假設(shè)干字?jǐn)?shù)據(jù)。功能:從指定地址開場(chǎng),存放假設(shè)干字?jǐn)?shù)據(jù)。留意:在程序存儲(chǔ)器空間定義雙字節(jié)數(shù)據(jù),留意:在程序存儲(chǔ)器空間定義雙字節(jié)數(shù)據(jù),經(jīng)常用于定義一個(gè)地址表。經(jīng)常用于定義一個(gè)地址表。Yi為雙字節(jié)數(shù)為雙字節(jié)數(shù)據(jù),它可以為十進(jìn)制或十六進(jìn)制的數(shù),也據(jù),它可以為十進(jìn)制或十六進(jìn)制的數(shù),也可以為一個(gè)表達(dá)式。高位數(shù)在前,低位數(shù)可以為一個(gè)表達(dá)式。高位數(shù)在前,低位數(shù)在后。在后。 例如:例如: ORG 1000H DATA:DW
9、 3241H,1234H,78H 上述程序?qū)?duì)從上述程序?qū)?duì)從1000H單元開場(chǎng)的單元開場(chǎng)的6個(gè)單個(gè)單元賦值,賦值情況如何呢?元賦值,賦值情況如何呢? 1000H=32H,1001H=41H,1002H=12H,1003H=34H,1004H=00H,1005H=78H。4匯編終了偽指令匯編終了偽指令 END 該偽指令指出終了匯編,即使后面還有指令,該偽指令指出終了匯編,即使后面還有指令,匯編程序也不處置。匯編程序也不處置。5賦值偽指令賦值偽指令格式:標(biāo)號(hào)格式:標(biāo)號(hào) EQU 表達(dá)式表達(dá)式功能:將表達(dá)式的值數(shù)據(jù)或地址賦給標(biāo)功能:將表達(dá)式的值數(shù)據(jù)或地址賦給標(biāo) 號(hào)。號(hào)。 留意:標(biāo)號(hào)為字符稱號(hào),其后無
10、冒留意:標(biāo)號(hào)為字符稱號(hào),其后無冒號(hào)。在一個(gè)程序中對(duì)于某一個(gè)標(biāo)號(hào)號(hào)。在一個(gè)程序中對(duì)于某一個(gè)標(biāo)號(hào)只能賦一次值,一旦賦值在本程序只能賦一次值,一旦賦值在本程序的恣意位置就可以援用該標(biāo)號(hào)。的恣意位置就可以援用該標(biāo)號(hào)。 例如:例如:ORG 3000HSTA EQU 80HTAB EQU 10MUL EQU 4000HMOV A,STAMOV B,TABLCALL MUL定義了三個(gè)標(biāo)號(hào):定義了三個(gè)標(biāo)號(hào):STA=80H,TAB=10,MUL=4000H,在程,在程序中直接援用這三個(gè)序中直接援用這三個(gè)標(biāo)號(hào)來替代標(biāo)號(hào)來替代80H、10、4000H。6位定義偽指令位定義偽指令格式:格式:標(biāo)號(hào)標(biāo)號(hào) BIT 位地址位
11、地址功能:將位地址賦給標(biāo)號(hào)。功能:將位地址賦給標(biāo)號(hào)。其中,標(biāo)號(hào)為字符稱號(hào),其后無冒號(hào)。其中,標(biāo)號(hào)為字符稱號(hào),其后無冒號(hào)。例如:例如:A1 BIT P0.1A2 BIT PSW.34.2 匯編言語(yǔ)程序設(shè)計(jì)匯編言語(yǔ)程序設(shè)計(jì)4.2.1 匯編程序設(shè)計(jì)根底匯編程序設(shè)計(jì)根底1匯編言語(yǔ)程序設(shè)計(jì)的步驟:匯編言語(yǔ)程序設(shè)計(jì)的步驟: 1分析問題,明確義務(wù)分析問題,明確義務(wù)2確定算法確定算法 3畫出程序流程圖畫出程序流程圖 4編寫源程序編寫源程序5匯編和調(diào)試匯編和調(diào)試2匯編言語(yǔ)程序的格式匯編言語(yǔ)程序的格式ORG 起始地址起始地址 ;數(shù)據(jù)存放;數(shù)據(jù)存放 ;程序代碼;程序代碼SJMP $ ;原地踏步;原地踏步END3匯編
12、言語(yǔ)源程序的匯編匯編言語(yǔ)源程序的匯編 匯編言語(yǔ)源程序必需轉(zhuǎn)換成計(jì)算機(jī)能過識(shí)匯編言語(yǔ)源程序必需轉(zhuǎn)換成計(jì)算機(jī)能過識(shí)別的目的程序后才干執(zhí)行,匯編方法通常別的目的程序后才干執(zhí)行,匯編方法通常有機(jī)器匯編和手工匯編兩種方法。有機(jī)器匯編和手工匯編兩種方法。4匯編言語(yǔ)程序設(shè)計(jì)的技巧匯編言語(yǔ)程序設(shè)計(jì)的技巧1盡量采用模塊化、構(gòu)造化的程序設(shè)計(jì)方盡量采用模塊化、構(gòu)造化的程序設(shè)計(jì)方法。法。 2合理地繪制程序流程圖合理地繪制程序流程圖 3少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)構(gòu)少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)構(gòu)造和子程序構(gòu)造。造和子程序構(gòu)造。4充分利用累加器。充分利用累加器。 5精心設(shè)計(jì)主要程序段。精心設(shè)計(jì)主要程序段。 6對(duì)于
13、中斷要留意維護(hù)和恢復(fù)現(xiàn)場(chǎng)。對(duì)于中斷要留意維護(hù)和恢復(fù)現(xiàn)場(chǎng)。4.2.2 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 順序構(gòu)造程序又稱為簡(jiǎn)單構(gòu)造程序,是指順序構(gòu)造程序又稱為簡(jiǎn)單構(gòu)造程序,是指一種順序執(zhí)行的程序,程序從第一條指令一種順序執(zhí)行的程序,程序從第一條指令到最后一條指令的整個(gè)執(zhí)行過程中既無分到最后一條指令的整個(gè)執(zhí)行過程中既無分支又無循環(huán)。支又無循環(huán)?!纠纠?.1】?jī)蓚€(gè)】?jī)蓚€(gè)8位無符號(hào)數(shù)相加,和仍為位無符號(hào)數(shù)相加,和仍為8位。位。分析:假設(shè)兩個(gè)無符號(hào)數(shù)分析:假設(shè)兩個(gè)無符號(hào)數(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è)兩個(gè)雙字節(jié)無符號(hào)數(shù),分別存】假設(shè)兩個(gè)雙字節(jié)無符號(hào)數(shù),分別存放在放在R1R0和和R3R2中,高字節(jié)在前,低字中,高字節(jié)在前,低字節(jié)在后。編程使兩數(shù)相加,用節(jié)在后。編程使兩數(shù)相加,用R2R1R0存放存放和。和。 對(duì)多字節(jié)的加法,存在最高位的進(jìn)位問題。對(duì)多字節(jié)的加法,存在最高位的進(jìn)位問題。假設(shè)最高位有進(jìn)位,那么和的字節(jié)數(shù)要比假設(shè)最高位有進(jìn)位,那么和的字節(jié)數(shù)
15、要比加數(shù)或被加數(shù)的字節(jié)數(shù)多一個(gè)。加數(shù)或被加數(shù)的字節(jié)數(shù)多一個(gè)。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;加進(jìn)位位;加進(jìn)位位MOV R2,A ;存和數(shù)進(jìn)位位;存和數(shù)進(jìn)位位SJMP $ ; END【例【例4.3】16位二進(jìn)制數(shù)求補(bǔ),設(shè)兩個(gè)字節(jié)原位二進(jìn)制數(shù)求補(bǔ),設(shè)兩個(gè)字節(jié)原碼數(shù)存在碼數(shù)存在R
16、1R0中,求補(bǔ)后結(jié)果存在中,求補(bǔ)后結(jié)果存在R3R2中。中。分析:二進(jìn)制數(shù)求補(bǔ)操作,可采用分析:二進(jìn)制數(shù)求補(bǔ)操作,可采用“原碼求反原碼求反+1的方法來實(shí)現(xiàn),可運(yùn)用求反指令和加的方法來實(shí)現(xiàn),可運(yùn)用求反指令和加法指令來實(shí)現(xiàn)。法指令來實(shí)現(xiàn)。程序如下:程序如下:ORG 1000HMOVA,R0 ;低;低8位送位送ACPLA;ADDA,#01H;MOVR2,A;送結(jié)果低位;送結(jié)果低位MOVA,R1 ;高;高8位送位送ACPLA;ADDCA,#00H;加進(jìn)位;加進(jìn)位MOVR3,A;送結(jié)果高位;送結(jié)果高位SJMP$END【例【例4.4】將內(nèi)部】將內(nèi)部RAM的的60H單元中的無符號(hào)單元中的無符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為二
17、進(jìn)制數(shù)轉(zhuǎn)換為3位位BCD碼,并將結(jié)果按由碼,并將結(jié)果按由高位到低位的順序存放到高位到低位的順序存放到63H、62H、61H單元中。單元中。分析:分析:8位無符號(hào)二進(jìn)制數(shù)表示的數(shù)據(jù)范圍位無符號(hào)二進(jìn)制數(shù)表示的數(shù)據(jù)范圍0255,所以用,所以用BCD碼,最多碼,最多3位。可將被位??蓪⒈晦D(zhuǎn)換的數(shù)除以轉(zhuǎn)換的數(shù)除以100,商即百位數(shù);余數(shù)再除,商即百位數(shù);余數(shù)再除以以10得十位數(shù);最后余數(shù)即為個(gè)位數(shù)。得十位數(shù);最后余數(shù)即為個(gè)位數(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è)計(jì)圖圖4-1 4-1 分支程序流程圖分支程序流程圖【例【例4.5】設(shè)內(nèi)部】設(shè)內(nèi)部RAM 60H和和61H單元中存放單元中存放兩個(gè)無符號(hào)數(shù),試比較它們的大小。將較兩個(gè)無符號(hào)數(shù),試比較它們的大小。將較小的數(shù)存放在小的數(shù)存放在60H單元,較大的數(shù)存放在單元,較大的數(shù)存放在61H單元中。單元中。分析:這是一個(gè)簡(jiǎn)單分支程序,可以使兩數(shù)分析:這是一個(gè)簡(jiǎn)單分支程序,可以使兩數(shù)相減,用相減,用JC指令進(jìn)展
19、判別。假設(shè)指令進(jìn)展判別。假設(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中的一位十六進(jìn)制數(shù)轉(zhuǎn)換為中的一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,結(jié)果仍存放于碼,結(jié)果仍存放于R2中。中。分析:數(shù)字分析:數(shù)字09的的ASCII碼分別是碼分別是30H39H,英文大寫字母英文大寫
20、字母AF的的ASCII碼分別是碼分別是4146H。因此,假設(shè)該十六進(jìn)制數(shù)小于。因此,假設(shè)該十六進(jìn)制數(shù)小于10,要轉(zhuǎn)換為要轉(zhuǎn)換為ASCII碼應(yīng)加碼應(yīng)加30H,假設(shè)該十六進(jìn),假設(shè)該十六進(jìn)制數(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時(shí),采用時(shí),采用CJNE和和JC以及以及CJNE和和JNC指令進(jìn)展判別。指令進(jìn)展判別。程序如下:程序如下:ORG 1000HMOV A,30H ;??;取XCJNE 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è)計(jì)循環(huán)程序設(shè)計(jì)循環(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)程序的實(shí)體。環(huán)程序的實(shí)體。修正部分:修正控制變量的值,為進(jìn)入下一輪循環(huán)修正部分:修正控制變量的值,為進(jì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è)計(jì)單循環(huán)程序設(shè)計(jì)【例【例4.8】循環(huán)次數(shù)知的單重循環(huán)?!垦h(huán)次數(shù)知的單重循環(huán)。 在內(nèi)部在內(nèi)部RAM的的 20H2FH延續(xù)延續(xù)16個(gè)單元中個(gè)單元中存放單字節(jié)無符號(hào)數(shù)。求這存放單字節(jié)無符號(hào)數(shù)。求這16個(gè)無符號(hào)數(shù)個(gè)無符號(hào)數(shù)之和,并存入內(nèi)部之和,并存入內(nèi)部RAM 61H和和60H中。中。分析:這是反復(fù)相加問題,且事先知道循環(huán)分析:這是反復(fù)相加問題,且事先知道循環(huán)次數(shù),故采用計(jì)數(shù)器控制的循環(huán)程序設(shè)計(jì)次數(shù),故采用計(jì)數(shù)器控制的循環(huán)程序設(shè)計(jì)方法。設(shè)用方法。設(shè)用R0作加數(shù)地址指針,作加數(shù)地址指針,R7作循環(huán)作循環(huán)次數(shù)計(jì)數(shù)器,次數(shù)計(jì)數(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 ;沒進(jìn)位那么跳;沒進(jìn)位那么跳NEXT INC R3 ;有進(jìn)位,那么高位加;有進(jìn)位,那么高位加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)。】循環(huán)次數(shù)未知的單重循環(huán)。設(shè)有一字符串存放在內(nèi)部設(shè)有一字符串存放在內(nèi)部RAM 21H開場(chǎng)的單開場(chǎng)的單元中,并以元中,并以“$作為終了標(biāo)志,請(qǐng)計(jì)算該作為終了標(biāo)志,請(qǐng)計(jì)算該字符串的長(zhǎng)度,并將其存入字符串的長(zhǎng)度,并將其存入20H單元。單元。分析:該字符串長(zhǎng)度事先未知,但知道終了分析:該字符串長(zhǎng)度事先未知,但知道終了條件,故采用條件控制的循環(huán)程序設(shè)計(jì)方條件,故采用條件控制的循環(huán)程序設(shè)計(jì)方法。法。 程序如下:程序如下:ORG 0200HMOV A, #0MOV R0, #21HLOOP:CJNE R0, #24H, NEXTSJMP EXITNEXT:INCAINC
26、R0SJMP LOOPEXIT:MOV 20H, ASJMP $ END 2多重循環(huán)程序設(shè)計(jì)多重循環(huán)程序設(shè)計(jì)【例【例4.11】設(shè)單片機(jī)運(yùn)用】設(shè)單片機(jī)運(yùn)用12MHz晶振機(jī)器晶振機(jī)器周期周期T為為1s,設(shè)計(jì)延時(shí),設(shè)計(jì)延時(shí)1s的程序。的程序。分析:由于執(zhí)行每條指令都需求一定的時(shí)間,分析:由于執(zhí)行每條指令都需求一定的時(shí)間,其時(shí)間長(zhǎng)短由指令周期和晶振頻率決議其時(shí)間長(zhǎng)短由指令周期和晶振頻率決議t=機(jī)器周期數(shù)機(jī)器周期數(shù)12振蕩周期。單條指振蕩周期。單條指令的執(zhí)行時(shí)間只需令的執(zhí)行時(shí)間只需1到幾個(gè)微秒,假設(shè)需求到幾個(gè)微秒,假設(shè)需求較長(zhǎng)時(shí)間的延時(shí)就需求執(zhí)行多條指令,在較長(zhǎng)時(shí)間的延時(shí)就需求執(zhí)行多條指令,在單片機(jī)運(yùn)用
27、中普通采用多重循環(huán)方式來實(shí)單片機(jī)運(yùn)用中普通采用多重循環(huán)方式來實(shí)現(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個(gè)無符個(gè)無符號(hào)數(shù)按從大到小的順序陳列,排序后仍存放在原號(hào)數(shù)按從大到小的順序陳列,排序后仍存放在原數(shù)據(jù)區(qū)中。數(shù)據(jù)區(qū)中。分析:這是
28、一個(gè)數(shù)據(jù)排序問題。分析:這是一個(gè)數(shù)據(jù)排序問題。 數(shù)據(jù)排序常用的方法有數(shù)據(jù)排序常用的方法有“冒泡法和冒泡法和“選擇法選擇法。下面采用。下面采用“冒泡法設(shè)計(jì)程序。冒泡法設(shè)計(jì)程序。 所謂所謂“冒泡法是指依次將兩個(gè)相鄰單元的內(nèi)冒泡法是指依次將兩個(gè)相鄰單元的內(nèi)容進(jìn)展比較,假設(shè)符合由大到小的順序,數(shù)據(jù)堅(jiān)容進(jìn)展比較,假設(shè)符合由大到小的順序,數(shù)據(jù)堅(jiān)持原狀,否那么相鄰單元的數(shù)據(jù)互換。經(jīng)過一輪持原狀,否那么相鄰單元的數(shù)據(jù)互換。經(jīng)過一輪比較以后,這一組數(shù)中最小的數(shù)曾經(jīng)找出,存放比較以后,這一組數(shù)中最小的數(shù)曾經(jīng)找出,存放于數(shù)據(jù)區(qū)的最后位置。然后再進(jìn)展第二輪的比較,于數(shù)據(jù)區(qū)的最后位置。然后再進(jìn)展第二輪的比較,循環(huán)終了時(shí)
29、找出次小數(shù)。繼續(xù)循環(huán),直到原數(shù)據(jù)循環(huán)終了時(shí)找出次小數(shù)。繼續(xù)循環(huán),直到原數(shù)據(jù)區(qū)中存放的是從大到小的排序的數(shù)組。區(qū)中存放的是從大到小的排序的數(shù)組。 例4.12程序流程圖 ORG1000HSORT:MOV R0,#40H;置數(shù)組首地址;置數(shù)組首地址MOVR7,#10H;數(shù)據(jù)塊長(zhǎng)度;數(shù)據(jù)塊長(zhǎng)度CLRF0;交換標(biāo)志清;交換標(biāo)志清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;置交換標(biāo)志位為;置交換標(biāo)志位為1SORT3 :DJNZ R7,SORT1;如計(jì)數(shù)器長(zhǎng)度不為;如計(jì)數(shù)器長(zhǎng)度不為0,那么繼續(xù)比較,那么繼續(xù)比較JB F0,SORT;假設(shè)判別標(biāo)志位為;假設(shè)判別標(biāo)志位為1,那么繼續(xù)循環(huán),否終了,那么繼續(xù)循環(huán),否終了循環(huán)循環(huán) SJMP$END留意:對(duì)于循環(huán)構(gòu)造程序設(shè)計(jì),需求留意:留意:對(duì)于循環(huán)構(gòu)造程序設(shè)計(jì),需求留意:1在進(jìn)入循環(huán)之前,應(yīng)合理
31、設(shè)置循環(huán)初始變量。在進(jì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)層一層層進(jìn)入,從內(nèi)層多重循環(huán)的嵌套是從外層向內(nèi)層一層層進(jìn)入,從內(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)中,實(shí)現(xiàn)循環(huán)體內(nèi)可以直接轉(zhuǎn)到循環(huán)體外或外層循環(huán)中,實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制終了的構(gòu)造。一個(gè)循環(huán)由多個(gè)條件控制終了的構(gòu)造。6對(duì)循環(huán)體的編程要仔細(xì)琢磨,合理安排,對(duì)其進(jìn)展優(yōu)對(duì)循環(huán)體的編程要仔細(xì)琢磨,合理安排,對(duì)其進(jìn)展優(yōu)化時(shí),應(yīng)主要放在縮短執(zhí)行時(shí)間上,其次是程序的長(zhǎng)度?;瘯r(shí),應(yīng)主要放在縮短執(zhí)行時(shí)間上,其次是程序的長(zhǎng)度。4.2.5 子程序調(diào)用設(shè)計(jì)子程序調(diào)用設(shè)計(jì)1子程序的構(gòu)造子程序的構(gòu)造 在在MCS-51指令系統(tǒng)中,提供了兩條子指令系統(tǒng)中,提供了兩條子程序指令程序指令A(yù)CALL、LCALL以及一條前往主以及一條前往主程序的指令程序的指令RET。 一個(gè)子程序在運(yùn)轉(zhuǎn)的過程中還可以調(diào)一個(gè)子程序在運(yùn)
33、轉(zhuǎn)的過程中還可以調(diào)用其它的子程序,這稱為子程序嵌套。用其它的子程序,這稱為子程序嵌套。 2子程序設(shè)計(jì)時(shí)的本卷須知子程序設(shè)計(jì)時(shí)的本卷須知1每個(gè)子程序都應(yīng)有獨(dú)一的入口,子程序的每個(gè)子程序都應(yīng)有獨(dú)一的入口,子程序的第一條指令的地址稱為入口地址。該指令前必需第一條指令的地址稱為入口地址。該指令前必需有標(biāo)號(hào),最好以子程序的義務(wù)定名,以便主程序有標(biāo)號(hào),最好以子程序的義務(wù)定名,以便主程序正確的調(diào)用它。正確的調(diào)用它。2調(diào)用子程序的指令在主程序中,子程序以調(diào)用子程序的指令在主程序中,子程序以RET指令終了,這樣才干前往主程序。指令終了,這樣才干前往主程序。3子程序調(diào)用和前往指令能自動(dòng)維護(hù)和恢復(fù)子程序調(diào)用和前往指
34、令能自動(dòng)維護(hù)和恢復(fù)斷點(diǎn),但對(duì)于需求維護(hù)的存放器和內(nèi)存單元的內(nèi)斷點(diǎn),但對(duì)于需求維護(hù)的存放器和內(nèi)存單元的內(nèi)容,必需在子程序開場(chǎng)和末尾安排維護(hù)和恢復(fù)他容,必需在子程序開場(chǎng)和末尾安排維護(hù)和恢復(fù)他們的指令。們的指令。4為使所編的子程序可以放在為使所編的子程序可以放在64KB程序存儲(chǔ)程序存儲(chǔ)器的任何地方并能被主程序調(diào)用,子程序內(nèi)部必器的任何地方并能被主程序調(diào)用,子程序內(nèi)部必需運(yùn)用相對(duì)轉(zhuǎn)移指令而不運(yùn)用其它轉(zhuǎn)移指令,以需運(yùn)用相對(duì)轉(zhuǎn)移指令而不運(yùn)用其它轉(zhuǎn)移指令,以便匯編時(shí)生成浮動(dòng)代碼。便匯編時(shí)生成浮動(dòng)代碼。3參數(shù)傳送方法參數(shù)傳送方法 在調(diào)用子程序時(shí)會(huì)遇到主程序和子程在調(diào)用子程序時(shí)會(huì)遇到主程序和子程序之間參數(shù)如何傳
35、送的問題。序之間參數(shù)如何傳送的問題。 入口參數(shù):主程序調(diào)用子程序時(shí),傳入口參數(shù):主程序調(diào)用子程序時(shí),傳入子程序的參數(shù)稱為入口參數(shù)。入子程序的參數(shù)稱為入口參數(shù)。 出口參數(shù):子程序運(yùn)算出的結(jié)果稱為出口參數(shù):子程序運(yùn)算出的結(jié)果稱為出口參數(shù)。出口參數(shù)。 常用的參數(shù)傳送方法有:任務(wù)存放器常用的參數(shù)傳送方法有:任務(wù)存放器或累加器、指針存放器、堆棧和程序段等?;蚶奂悠?、指針存放器、堆棧和程序段等。 【例【例4.13】用子程序調(diào)用的方法實(shí)現(xiàn)】用子程序調(diào)用的方法實(shí)現(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ù),由于此題兩次用到平方的運(yùn)算,所以把求平方運(yùn)算設(shè)計(jì)成子程序。運(yùn)算,所以把求平方運(yùn)算設(shè)計(jì)成子程序。 子程序和主程序如下:子程序和主程序如下: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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年駕駛員試用期間聘用合同版B版
- 17 記金華的雙龍洞(說課稿)-2023-2024學(xué)年統(tǒng)編版語(yǔ)文四年級(jí)下冊(cè)
- 專業(yè)康復(fù)服務(wù)協(xié)議樣式2024版A版
- 20XX年航空貨運(yùn)代理合作合同(2024版)一
- 2024法律規(guī)定離婚合同書樣例版B版
- 專業(yè)化冷凍倉(cāng)庫(kù)施工合同合同下載版
- 2024汽車展場(chǎng)地租賃及品牌贊助商權(quán)益合作協(xié)議3篇
- 福建省南平市五夫中學(xué)2020-2021學(xué)年高二數(shù)學(xué)文模擬試題含解析
- 福建省南平市渭田中學(xué)2020-2021學(xué)年高二語(yǔ)文月考試卷含解析
- 2024月子中心消防報(bào)警系統(tǒng)采購(gòu)與安裝服務(wù)合同3篇
- 中建項(xiàng)目實(shí)施策劃書編制指南(附表)
- 餐飲服務(wù)投標(biāo)文件
- 城投公司的債務(wù)風(fēng)險(xiǎn)及化解方式
- 設(shè)備運(yùn)行售后故障響應(yīng)方案
- 我會(huì)聽 (課件)-2021-2022學(xué)年心理健康教育一年級(jí)上冊(cè)
- 亞馬遜品牌授權(quán)書(英文模板)
- 污水處理廠新建項(xiàng)目工程監(jiān)理實(shí)施細(xì)則
- DB52∕T 046-2018 貴州省建筑巖土工程技術(shù)規(guī)范
- 壓力容器壁厚計(jì)算軟件
- 紅色簡(jiǎn)約年終工作總結(jié)新征程再出發(fā)PPT模板
評(píng)論
0/150
提交評(píng)論