




已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章:匯編語言程序設(shè)計(jì),本章基本要求: 匯編語言的構(gòu)成 源程序的設(shè)計(jì)與匯編* 應(yīng)用程序設(shè)計(jì)*,4.1 匯編語言的構(gòu)成,4.1.1 程序設(shè)計(jì)語言 用戶要使計(jì)算機(jī)能完成各式各樣的任務(wù),就要設(shè)計(jì)各種相應(yīng)的應(yīng)用程序, 而設(shè)計(jì)程序就要用到程序設(shè)計(jì)語言。程序設(shè)計(jì)語言有3種: 機(jī)器語言 匯編語言 高級(jí)語言。,4.1 匯編語言的構(gòu)成,表4-1 機(jī)器語言和匯編語言的形式,機(jī)器語言中二進(jìn)制形式不便記憶,常采用十六進(jìn)制形式記憶,4.1 匯編語言的構(gòu)成,在Keil調(diào)試環(huán)境下反匯編程序,1、匯編源程序:,2、反匯編程序:,地址,機(jī)器碼,反匯編程序,匯編源程序,4.1 匯編語言的構(gòu)成,1、機(jī)器語言 計(jì)算機(jī)能直接識(shí)別和執(zhí)行的二進(jìn)制代碼形式的指令稱為機(jī)器指令, 而該類指令的集合稱為計(jì)算機(jī)的機(jī)器語言, 或稱指令系統(tǒng)。機(jī)器語言是面向計(jì)算機(jī)系統(tǒng)的。由于各種計(jì)算機(jī)內(nèi)部結(jié)構(gòu), 線路的不同, 每種計(jì)算機(jī)系統(tǒng)都有它自己的機(jī)器語言, 即使執(zhí)行同一操作, 其指令也不相同。,4.1 匯編語言的構(gòu)成,2、匯編語言 計(jì)算機(jī)所能執(zhí)行的每條指令都對(duì)應(yīng)一組二進(jìn)制代碼。為了容易理解和記憶計(jì)算機(jī)的指令,人們用一些英語的單詞和字符以及數(shù)字作為助記符來描述每一條指令的功能。用助記符描述的指令系統(tǒng),稱為機(jī)器的匯編語言系統(tǒng),簡稱匯編語言。 匯編語言也是面向機(jī)器的,每種計(jì)算機(jī)系統(tǒng)也都有它自己的匯編語言,用匯編語言編寫的程序,稱為匯編語言源程序或匯編源程序。,4.1 匯編語言的構(gòu)成,3、高級(jí)語言 高級(jí)語言(如:PASCAL、C、FORTRAN、BASIC等)克服了匯編語言的缺點(diǎn),是一種面向問題或過程的語言。它是一種接近于自然語言和數(shù)學(xué)算法的語言,與機(jī)器的硬件無關(guān),用戶編程時(shí)不必仔細(xì)了解所用計(jì)算機(jī)的具體性能和指令系統(tǒng)。高級(jí)語言不但直觀、易學(xué)、易懂,而且通用性強(qiáng),可以在不同的計(jì)算機(jī)上運(yùn)行,因此可移植性好。,4.1 匯編語言的構(gòu)成,4.1.2 匯編語言格式 MCS51系列單片機(jī)是用51系列單片機(jī)的指令系統(tǒng)來編程的,其匯編語言的語句格式,也就是單片機(jī)的指令格式,即: 標(biāo)號(hào):操作碼 操作數(shù) ;注釋 說明: 1、 內(nèi)的部分為可選項(xiàng); 2、標(biāo)號(hào)是一條指令在存儲(chǔ)器存放的地址,是以字母開頭的字母數(shù)字串,不可以是保留字; 3、操作碼和操作數(shù)必須按照指令格式書寫;,4.1 匯編語言的構(gòu)成,舉例: ORG 0060H START: MOV A,#00H ;A0 MOV R2,#0AH ;R210 MOV R1,#03H ;R13 LOOP: ADD A,R1 ;AA+R1 DJNZ R2,LOOP ;若R2-10,則跳到LOOP NOP SJMP $ END,4.1 匯編語言的構(gòu)成,4、操作數(shù)可以寫成以下形式(5種-128頁): 二進(jìn)制、十進(jìn)制、十六進(jìn)制形式 工作寄存器、特殊功能寄存器 地址標(biāo)號(hào) 帶加減算符的表達(dá)式 采用符,4.1 匯編語言的構(gòu)成,舉例: MOV A,#00110101B ;A53 MOV A,#20D ;A20 MOV A,#20 ;A20 MOV R0,#20H ;R020H MOV R1,#0BFH ;R1BFH SJMP $ ;原地跳轉(zhuǎn) MOV R7,R2 ;R7R2 MOV A,LABLE ;A標(biāo)號(hào)地址 MOV A,LABLE+1 ;A標(biāo)號(hào)地址+1,4.1 匯編語言的構(gòu)成,4.1.3 匯編語言構(gòu)成 匯編語言語句分為:指令性語句、指示性語句兩類。 1、指令性語句 包括指令系統(tǒng)中的全部指令,每條指令有對(duì)應(yīng)的機(jī)器代碼,并可由CPU執(zhí)行。 2、指示性語句 在匯編源程序的過程中,還有一些指令不要求CPU進(jìn)行任何操作,也沒有對(duì)應(yīng)的機(jī)器碼,不影響程序的執(zhí)行,僅僅是能夠指導(dǎo)匯編進(jìn)行處理的一些指令,稱之為偽指令。,4.1 匯編語言的構(gòu)成,偽指令的主要功能是:用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的確定地址,或?yàn)橹虚g運(yùn)算結(jié)果保留一部分存儲(chǔ)空間以及表示源程序結(jié)束等等。 不同版本的匯編語言,偽指令的符號(hào)和含義可能有所不同, 但是基本用法是相似的。 下面介紹幾種常用的基本偽指令。,MCS-51單片機(jī)偽指令,1、起點(diǎn)指令 ORG,格式:,ORG H (16位地址或標(biāo)號(hào)),功能:,給程序起始地址或數(shù)據(jù)塊的起始地址賦值,例:,用法:,一般出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始 一個(gè)源程序可多次出現(xiàn)ORG指令,首地址,首地址,2、結(jié)束命令 END,格式:END,功能:匯編程序結(jié)束標(biāo)志,附在一個(gè)源程序的結(jié)尾 一個(gè)源程序只能出現(xiàn)一次END指令,用法:,MCS-51單片機(jī)偽指令,3、等值命令 EQU,格式:,字符名稱 EQU 數(shù)據(jù)或匯編符號(hào),功能:,將一個(gè)數(shù)據(jù)或匯編符號(hào)賦予標(biāo)號(hào)段規(guī)定的字符名稱,例:,;AA與R6等值,MCS-51單片機(jī)偽指令,例:,A10 EQU 10 DELY EQU 07EBH MOV A,A10 LCALL DELY,;A10 = 10,;DELY = 07EBH,;轉(zhuǎn)向入口地址 07EBH,使用EQU指令,須先賦值后使用,不能反之,4、數(shù)據(jù)地址賦值等值命令 DATA,格式:,字符名稱 DATA 數(shù)據(jù)或表達(dá)式,功能:,此命令把數(shù)據(jù)/代碼地址賦予標(biāo)號(hào)段所規(guī)定的字符名稱。定義的字符名稱可先使用后定義,INDEXJ DATA 8096H,;INDEXJ這個(gè)字符名稱的地址為8096H,例:,等價(jià)于,MCS-51單片機(jī)偽指令,EQU與 DATA的區(qū)別,(1) DATA與EQU相似,但DATA定義的字符名稱, 可先使用后定義 ,EQU則不能,(2) EQU指令可把匯編符號(hào)賦給字符名稱, DATA則不能,(3) DATA可把表達(dá)式的值賦給字符名稱, EQU則不能,DATA常在程序中定義數(shù)據(jù)地址 EQU常在程序中定義字符數(shù)據(jù),MCS-51單片機(jī)偽指令,5、定義字節(jié)命令 DB,格式:,功能:,標(biāo)號(hào):DB 字節(jié)常數(shù)或字符串 (8位),定義字節(jié)的內(nèi)容,匯編程序把DB定義的字節(jié)依次存入標(biāo)號(hào)開始的存儲(chǔ)單元,有定義的內(nèi)存單元地址,項(xiàng)或項(xiàng)表,例:,偽指令ORG 定義了TAB的起始地址為8000H, 偽指令DB定義了8000H8003單元的內(nèi)容依次為:,(8000H)= 45H,(8001H)= 49H,(8002H)= 35H,(8003H)= 41H,(8004H)= 05H,TAB,TAB1,(1) 由 ORG定義,(2) 跟在其他源程序之后,6、定義字命令DW,格式:,功能:,標(biāo)號(hào):DW 字或字表,定義若干個(gè)字(雙字節(jié)),例:,ORG 8000H,TAB:DW 7234H,8AH,10,(8000H)= 72H,(8001H)= 34H,(8002H)= 00H,(8003H)= 8AH,(8005H)= 0AH,匯編后:,(8004H)= 00H,MCS-51單片機(jī)偽指令,7、定義空間命令 DS,格式:,功能:,標(biāo)號(hào):DS 數(shù)據(jù)或字符及表達(dá)式,例:,(8008H)=30H,(8009H)=8AH,從指定單元地址開始,由數(shù)據(jù)或字符及表達(dá)式的值來定義應(yīng)保留的單元數(shù),備用,即:8000H8007H單元保留備用,定義空間,MCS-51單片機(jī)偽指令,8、位地址符號(hào)命令 BIT,格式:,字符名稱 BIT 位地址,功能:,把位地址賦予標(biāo)號(hào)段的字符名稱,;P1.0, P2.0賦予位地址字符名稱 A1、A2,在編程時(shí)可以直接把 A1、A2 當(dāng)成位地址使用,MCS-51單片機(jī)偽指令,匯編程序的操作,分兩次掃描(匯編),第一次掃描(匯編),檢查語法結(jié)構(gòu),對(duì)源程序 中的符號(hào)、表達(dá)式、標(biāo)號(hào) 進(jìn)行定義,處理偽指令, 建立符號(hào)表,顯示 ERROR,并提示行號(hào),顯示 ERROR,并提示行號(hào),修改!,修改!,第二次掃描(匯編),匯編成目標(biāo)代碼和匯編程序 清單,可執(zhí)行的代碼(機(jī)器碼),4.2 匯編源程序的設(shè)計(jì)與匯編,4.2.1 匯編程序設(shè)計(jì)步驟 1、確定方案和計(jì)算方法 2、了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo)。 3、建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟。 4、畫程序流程圖,表示程序結(jié)構(gòu)和程序功能。 5、編制源程序 合理分配存儲(chǔ)器單元和了解I/O接口地址。 按功能設(shè)計(jì)程序,明確各程序之間的相互關(guān)系。 用注釋行說明程序,便于閱讀和修改調(diào)試和修改。 6、上機(jī)調(diào)試,對(duì)程序的正確性作最后的確定。,4.2 匯編源程序的設(shè)計(jì)與匯編,程序設(shè)計(jì)步驟流程:,Y,N,Y,Y,Y,N,N,N,4.2 匯編源程序的設(shè)計(jì)與匯編,4.2.2 源程序的匯編 CPU可以執(zhí)行的只能是機(jī)器碼程序。稱:把源程序翻譯成機(jī)器碼的過程為匯編。匯編可:人工匯編和機(jī)器匯編兩類。 1、人工匯編 由人工直接將匯編源程序翻譯成機(jī)器碼。 2、機(jī)器匯編 使用計(jì)算機(jī)執(zhí)行“匯編程序”來代替人工實(shí)現(xiàn)將匯編源程序翻譯成機(jī)器碼。,匯編語言 源程序,機(jī)器語言,匯編,反匯編,交叉 匯編,例4.1 設(shè)在內(nèi)部RAM的BLOCK單元內(nèi)有一無符號(hào)數(shù)據(jù)塊的長度,無符號(hào)數(shù)據(jù)塊起始地址是BLOCK+1。試編程求無符號(hào)數(shù)據(jù)塊種數(shù)據(jù)的累加和(不考慮進(jìn)位加法之和),并把它存入SUM單元。 程序: ORG 1000H SUM DATA 1FH BLOCK DATA 20H START: MOV R0,#BLOCK ;數(shù)據(jù)塊長度地址送R0 MOV A,R0 ;數(shù)據(jù)塊長度送A CJNE A,#00H,LOOP ;若數(shù)據(jù)塊長度0,則LOOP HERE: SJMP $ ;若數(shù)據(jù)塊長度=0,則結(jié)束 LOOP: CLR A NEXT: INC R0 ;修改數(shù)據(jù)指針 ADD A,R0 ;加一個(gè)數(shù) DJNZ BLOCK,NEXT ;若(BLOCK)-1 0,則NEXT MOV SUM,A ;存累加和 SJMP HERE END,匯編程序經(jīng)兩次匯編得機(jī)器碼 第一次匯編 第二次匯編,轉(zhuǎn)移 地址 計(jì)算,LOOP=1008H-1003H-3=02H; NEXT=1009H-100BH-3=-5=0FBH $=1006H-1006H-2=-2=0FEH; HERE=1006H-1010H-2=-12=0F4H,偏移地址=指令所在地址-跳轉(zhuǎn)地址-指令字節(jié)數(shù),4.3 簡單程序與分支程序設(shè)計(jì),4.3.1 簡單程序設(shè)計(jì) 例4.2請(qǐng)編寫能把20H單元內(nèi)兩個(gè)BCD數(shù)變成相應(yīng)的ASCII碼并放在21H(高位BCD數(shù)的ASCII碼)和22H (高位BCD數(shù)的ASCII碼)單元的程序。 程序: ORG 0500H MOV R0,#22H ;R0=22H MOV R0,#00H ;(22H)=0 MOV A,20H ;A (20H) BCD碼 XCHD A,R0 ;低位BCD碼與22H半字節(jié)交換 ORL 22H,#30H ;加30H完成ASCII碼變換 SWAP A ;高位BCD碼高低位半字節(jié)交換 ORL A,#30H ;加30H完成ASCII碼變換 MOV 21H,A ;存入21H單元 SJMP $,例4.3已知一個(gè)補(bǔ)碼形式的16位二進(jìn)制(低8位在NUM單元,高8位在NUM+1單元),試編寫能求該16位二進(jìn)制數(shù)原碼的絕對(duì)值得程序。 程序: ORG 0300H NUM DATA 20H MOV R0,#NUM ;R0=NUM MOV R0,A ;低8位送入A CPL A ;A求反 ADD A,#01H ;A中內(nèi)容變補(bǔ),保留CY MOV R0,A ;存數(shù) INC R0 ;地址加1,指向高8位 MOV R0,A ;高8位送入A CPL A ;取反 ADDC A,#00H ;加進(jìn)位 ANL A,#7FH ;去掉符號(hào)位 MOV R0,A ;存數(shù) SJMP $,4.3 簡單程序與分支程序設(shè)計(jì),例4.4已知20H單元中有一個(gè)8位二進(jìn)制數(shù),請(qǐng)編程把它轉(zhuǎn)換為3位BCD數(shù),把百位數(shù)存入FIRST單元的低4位,十位和個(gè)位BCD數(shù)放在SECOND單元,十位BCD數(shù)在SECOND單元的高4位。 程序: ORG 0200H FIRST DATA 30H SECOND DATA 31H MOV A,20H ;A=(20H) MOV B,#64H ;除數(shù)100 DIV AB ;A/100 MOV FIRST,A ;低8位送入A MOV A,B ;余數(shù)送A MOV B,#0AH ;除數(shù)10 DIV AB ;A/10 SWAP A ;十位BCD送高4位 ORL A,B ;完成十位和個(gè)位裝配 MOV SECOND,A ;存入SECOND單元 SJMP $,4.3 簡單程序與分支程序設(shè)計(jì),4.3.2 分支程序設(shè)計(jì) 可分為無條件和有條件分支程序兩類。重點(diǎn)以條件分支舉例。 例4.5 已知VAR單元內(nèi)有一自變量,請(qǐng)按如下條件編出求函數(shù)值Y,并將它存入FUNC單元的程序。 1 X0 Y= 0 X=0 -1 X0 解:這是一個(gè)三分支歸一的條件轉(zhuǎn)移問題。 兩種求解方法:“先分支后賦值” “先賦值后先分”,4.3 簡單程序與分支程序設(shè)計(jì),“先分支后賦值”,程序: ORG 0100H VAR DATA 30H FUNC DATA 31H MOV A,VAR ;AX JZ DONE ;若=0,則轉(zhuǎn)DONE JNB ACC.7,POSI;若0,則轉(zhuǎn)POSI MOV A,#0FFH ;若0,則A -1 SJMP DONE ;轉(zhuǎn)DONE POSI:MOV A,#01H ;則A 1 DONE:MOV FUNC,A ;存結(jié)果 SJMP $ END,Y,Y,N,N,一個(gè)判斷決策框,程序有兩條出路。兩種分支結(jié)構(gòu):,例: 求R2中補(bǔ)碼絕對(duì)值,正數(shù)不變,負(fù)數(shù)變補(bǔ)。 MOV A,R2 JNB ACC.7,NEXT ;為正數(shù)? CPL A ;負(fù)數(shù)變補(bǔ) INC A MOV R2,A NEXT: SJMP NEXT ;結(jié)束,例如 行李計(jì)價(jià):當(dāng)重量G5公斤,價(jià)格M=G3(元); 當(dāng)重量G5公斤,價(jià)格M=G3+(G-5)2 (元),FRT: MOV A,40H ;取行李重量計(jì)價(jià)單位G MOV R3,A MOV B,#03H ;M=G3 MUL AB MOV R2,A ;暫存3G MOV A,R3 ;取回G CJNE A,#05H,L1 ;G5 ? SJMP WETC L1: JC WETC ; 是,轉(zhuǎn)至WETC SUBB A,#05H ;否則M=3G+2(G-5) RLC A ADD A,R2 WETC:MOV 41H,A ;存結(jié)果M RET,一、按分支號(hào)轉(zhuǎn)移,如:當(dāng)分支號(hào)=0,程序轉(zhuǎn)移到ADDR0處; 當(dāng)分支號(hào)=1,程序轉(zhuǎn)移到ADDR1處; 。,(1)用地址表法。設(shè)分支號(hào)已存入A。 MTJS: MOV DPTR,#TAB ;取表首地址 CLR C ;分支號(hào)2 RLC A MOV R2,A MOVC A,A+DPTR;取分支地址低位 PUSH ACC ;入棧保存 MOV A,R2 INC A MOVC A,A+DPTR;取分支地址高位 PUSH ACC ;入棧保存 RET ;分支地址PC,轉(zhuǎn)移 TAB: DW ADDR0 ;分支地址表 DW ADDR1 ADDR0: ;程序段0 ,(2)轉(zhuǎn)移表法。用分支轉(zhuǎn)移指令 JMP A+DPTR。設(shè)R7R6=分支號(hào),MTJS: MOV DPTR,#TAB;指向表首地址 MOV A,R7 ;分支號(hào)高字節(jié)3 MOV B,#03H MUL AB ;乘積不超過1字節(jié) ADD A,DPH MOV DPH,A MOV A,R6 ;分支號(hào)低字節(jié)3 MOV B,#03H MUL AB XCH A,B ADD A,DPH ;DPHDPH+(R7、R6)3)高字節(jié) MOV DPH,A XCH A,B ;A(R7、R6)3)低字節(jié) JMP A+DPTR ;實(shí)現(xiàn)多分支轉(zhuǎn)移 TAB: LJMP ADDR0 ;轉(zhuǎn)移表 LJMP ADDR1 LJMP ADDRN ADDR0: ;程序段0 ,4.4 循環(huán)與查表程序設(shè)計(jì),4.4.1 循環(huán)程序設(shè)計(jì) 循環(huán)程序一般由四部分組成:循環(huán)初始化、循環(huán)處理、循環(huán)控制、循環(huán)結(jié)束。 循環(huán)程序一般使用兩種結(jié)構(gòu),如下圖:,循環(huán)程序的構(gòu)成,各個(gè)環(huán)節(jié)任務(wù): 一初始化部分 循環(huán)準(zhǔn)備工作。如:清結(jié)果單元、設(shè)指針、設(shè)循環(huán)控制變量初值等。,二循環(huán)體 循環(huán)工作部分:需多次重復(fù)處理的工作。 循環(huán)控制部分: 1.修改指針和循環(huán)控制變量。 2.檢測(cè)循環(huán)條件:滿足循環(huán)條件,繼續(xù)循環(huán),否則退出循環(huán)。 三.結(jié)束部分 處理和保存循環(huán)結(jié)果。 允許0次循環(huán)的循環(huán)結(jié)構(gòu):在循環(huán)工作之前檢測(cè)循環(huán)條件。,4.4 循環(huán)與查表程序設(shè)計(jì),一、單重循環(huán),例:求n個(gè)單字節(jié)數(shù)據(jù)的累加,設(shè)數(shù)據(jù)串已在43H起始單元,數(shù)據(jù)串長度在42H單元,累加和不超過2個(gè)字節(jié)。,SUM: MOV R0,#42H ;設(shè)指針 MOV A,R0 MOV R2,A ;循環(huán)計(jì)數(shù)器n CLR A ;結(jié)果單元清0 MOV R3,A ADD1: INC R0 ;修改指針 ADD A,R0 ;累加 JNC NEXT ;處理進(jìn)位 INC R3 ;有進(jìn)位,高字節(jié)加1 NEXT: DJNZ R2,ADD1 ;循環(huán)控制:數(shù)據(jù)是否加完? MOV 40H,A ;循環(huán)結(jié)束,保存結(jié)果 MOV 41H,R3 RET,簡單循環(huán)結(jié)構(gòu):循環(huán)體中不套循環(huán)。,循環(huán)控制方法:計(jì)數(shù)控制、特征標(biāo)志控制。,1、計(jì)數(shù)控制: 設(shè)循環(huán)計(jì)數(shù)器,控制循環(huán)次數(shù)。正計(jì)數(shù)和倒計(jì)數(shù)兩種方式。 例:為一串7位ASCII碼數(shù)據(jù)的D7位加上奇校驗(yàn),設(shè)數(shù)據(jù)存放在片外RAM的2101H起始單元,數(shù)據(jù)長度在2100H單元。,MOV DPTR,#2100H MOVX A,DPTR MOV R2,A NEXT: INC DPTR MOVX A,DPTR ORL A,#80H JNB P,PASS MOVX DPTR,A PASS: DJNZ R2,NEXT DONE: SJMP DONE,2、特征控制:設(shè)定循環(huán)結(jié)束標(biāo)志實(shí)現(xiàn)循環(huán)控制。,例:找正數(shù)表最小值。正數(shù)表存在片外RAM中以LIST為起始單元,用-1作為結(jié)束標(biāo)志。,START: MOV DPTR,#LIST ;數(shù)表首地址 MOV B,#127 ;預(yù)置最小值 NEXT: MOVX A,DPTR ;取數(shù) INC DPTR ;修改指針 CJNE A,#-1,NEXT1 ;是否為數(shù)表結(jié)尾? SJMP DONE ;循環(huán)結(jié)束 NEXT1: CJNE A,B,NEXT2 ;比較 NEXT2: JNC NEXT MOV B,A ;保存較小值 SJMP NEXT DONE: SJMP DONE,二、多重循環(huán),例將內(nèi)存一串單字節(jié)無符號(hào)數(shù)升序排序。 步驟: 每次取相鄰單元的兩個(gè)數(shù)比較,決定是否需要交換數(shù)據(jù)位置。 第一次循環(huán),比較N-1次,取到數(shù)據(jù)表中最大值。 第二次循環(huán),比較N-2次,取到次大值。 第N-1次循環(huán):比較一次,排序結(jié)束。,循環(huán)體中套循環(huán)結(jié)構(gòu)。以雙重循環(huán)使用較多。,SORT: MOV A,#N-1 ;N個(gè)數(shù)據(jù)排序 MOV R4,A ;外循環(huán)次數(shù) LOOP1: MOV A,R4 MOV R3,A ;內(nèi)循環(huán)次數(shù) MOV R0,#TAB ;設(shè)數(shù)據(jù)指針 LOOP2: MOV A,R0 ;取二數(shù) MOV B,A INC R0 MOV A,R0 CJNE A,B,L1 ;比較 L1: JNC UNEX ;AB,不交換 DEC R0 ;否則交換數(shù)據(jù) XCH A ,R0 INC R0 MOV R0,A UNEX: DJNZ R3,LOOP2 ;內(nèi)循環(huán)結(jié)束? DJNZ R4,LOOP1 ;外循環(huán)結(jié)束? RET,4.4 循環(huán)與查表程序設(shè)計(jì),4.4.2 查表程序設(shè)計(jì) 所謂查表是依據(jù)ROM中的數(shù)據(jù)表格的項(xiàng)數(shù)來查找與之對(duì)應(yīng)的表中數(shù)值。 有兩條專門的查表指令: MOVC A,A+DPTR MOVC A,A+PC 查表指令一般用于代碼轉(zhuǎn)換、顯示、散轉(zhuǎn)等應(yīng)用場合。,當(dāng)用DPTR作基址寄存器時(shí),查表的步驟分三步: 基址值(表格首地址)DPTR; 變址值(表中要查的項(xiàng)與表格首地址之間的 間隔字節(jié)數(shù))A; 執(zhí)行MOVC A,A+DPTR。,當(dāng)用PC作基址寄存器時(shí),其表格首地址與PC值間距不能超過256字節(jié),且編程要事先計(jì)算好偏移量,比較麻煩。因此,一般情況下用DPTR作基址寄存器。,例: 在單片機(jī)應(yīng)用系統(tǒng)中,常用LED數(shù)碼管顯示數(shù)碼,但顯 示數(shù)字(9)與顯示數(shù)字編碼并不相同,需要將顯示數(shù) 字轉(zhuǎn)換為顯示字段碼,通常是用查表的方法?,F(xiàn)要求 將30H中的顯示數(shù)字轉(zhuǎn)換為顯示字段碼并存入30H。已 知共陰字段碼表首址為TABD。,程序如下: CHAG: MOV DPTR,#TABD ;置共陰字段碼表首址 MOV A,30H ;讀顯示數(shù)字 MOVC A,A+DPTR ;查表,轉(zhuǎn)換為顯示字段碼 MOV 30H,A ;存顯示字段碼 RET ; TABD: DB 3FH,06H,5BH,4FH,66H ;04共陰字段碼表 DB 6DH,7DH,07H,7FH,6FH ;59共陰字段碼表,程序如下: CUBE: MOV DPTR,#TAB ;置立方表首址 MOV A,30H ;讀數(shù)據(jù) ADD A,30H ;數(shù)據(jù)2A MOV 30H,A ;暫存立方表數(shù)據(jù)序號(hào) MOVC A, A+DPTR ;讀立方數(shù)據(jù)高8位 XCH A,30H ;存立方數(shù)據(jù)高8位,立方表數(shù)據(jù)序號(hào)A INC A ;指向立方數(shù)據(jù)低8位 MOVC A,A+DPTR ;讀立方數(shù)據(jù)低8位 MOV 31H,A ;存立方數(shù)據(jù)低8位 RET ; TAB: DW 0,1,8,27,64,125,216,343,512,729,1000 ;040立方表 DW 1331,1728,2197,2744,3375,4096,64000; 說明: 數(shù)據(jù)2A原因是立方表數(shù)據(jù)為雙字節(jié),例:用查表程序求040之間整數(shù)的立方。已知該整數(shù)存在內(nèi)RAM 30H中,查得立方數(shù)存內(nèi)RAM 30H(高8位)31H。已知立方表(雙字節(jié))首地址為TAB。,4.5 子程序與運(yùn)算程序設(shè)計(jì),4.5.1 子程序設(shè)計(jì) 回顧子程序的作用、結(jié)構(gòu)、以及與主程序的關(guān)系。匯編程序設(shè)計(jì)中子程序調(diào)用方法、程序要求。設(shè)計(jì)子程序時(shí)注意: 1、子程序的第一條指令的地址為入口地址。一般使用標(biāo)號(hào)代替,該標(biāo)號(hào)也叫做子程序名。 2、子程序中必須使用RET指令。 3、主程序調(diào)用子程序、子程序返回主程序時(shí)的操作。 4、在子程序中注意保護(hù)CPU的狀態(tài)。 5、子程序入口參數(shù)的傳送可以使用:指定RAM單元、R0R7寄存器、堆棧、位地址等來傳送。,子程序設(shè)計(jì) 一子程序入口用標(biāo)號(hào)作為子程序名。 二調(diào)用子程序之前設(shè)置好堆棧。 三用返回指令RET結(jié)束子程序,并保證堆棧棧頂為調(diào)用程序的返回地址。 四.子程序嵌套須考慮堆棧容量。 五.提供足夠的調(diào)用信息: 如:子程序名、子程序功能、入口參數(shù)和出口參數(shù)、子程序占用的硬件資源、子程序中調(diào)用的其他子程序名。,子程序: 能完成某項(xiàng)特定功能的獨(dú)立程序段,可被反復(fù)調(diào)用。,子程序的類型:按子程序與主程序之間傳遞參數(shù)的方式分類。,入口參數(shù):調(diào)用子程序之前,需要傳給子程序的參數(shù)。 出口參數(shù):子程序送回調(diào)用程序的結(jié)果參數(shù)。,選用不同的參數(shù)傳遞方式。 1.寄存器傳送參數(shù) 2.存儲(chǔ)器傳送參數(shù) 3.堆棧傳送參數(shù),設(shè)計(jì)子程序應(yīng)滿足通用性的要求,不針對(duì)具體數(shù)據(jù)編程。 例如:1.子程序功能為求單字節(jié)數(shù)的立方: AA3,入口參數(shù)和出口參數(shù)為A。 2.子程序功能為求單字節(jié)數(shù)的n次方: (41H)(42H)(40H)A,入口參數(shù)為(40H)和A, 出口參數(shù)為(42H)(41H)。,例:將R4R5R6中三個(gè)字節(jié)數(shù)據(jù)對(duì)半分解,變成6個(gè)字節(jié), 存入顯示緩沖區(qū)(DISMEM0DISMEM5)。,1)子程序UFOR1的功能:將A累加器中單字節(jié)數(shù)據(jù),對(duì)半分解成兩個(gè)字節(jié),存入R0所指向的相鄰兩個(gè)單元 UFOR1:MOV R0,#0 XCHD A,R0 ;保存低半字節(jié) INC R0 ;修改指針 MOV R0,#0 SWAP A XCHD A,R0 ;保存高半字節(jié) RET 2)調(diào)用子程序UFOR1之前,將待分解的內(nèi)容送A,存放地址送R0。,例 比較兩個(gè)數(shù)據(jù)串是否完全相等,若完全相等,A=0;否則A=FFH。,PMT: MOV R2,A ;設(shè)數(shù)串長度 CHC: MOV A,R0 ;各取數(shù)串中的一個(gè)數(shù) MOV 42H,R1 CJNE A,42H,NOM ;是否相等?不相等轉(zhuǎn)移 INC R0 ;相等,修改指針 INC R1 DJNZ R2,CHC ;全部比較完? MOV A,#0 ;完全相等 SJMP PEND NOM: MOV A,#0FFH ;不完全相等 PEND:RET,例:查表求出數(shù)據(jù)的ASCII碼,再以字符形式輸出。,1)子程序HEXASC功能:取出堆棧中數(shù)據(jù),查表將低半字節(jié)轉(zhuǎn)換成ASCII碼送累加器A。 2)分別將待轉(zhuǎn)換數(shù)據(jù)入棧,然后調(diào)用子程序HEXASC。,MOV SP,#30H PUSH 40H ;入口參數(shù)入棧 LCALL HEXASC POP ACC HEXASC: DEC SP ;跳過返回地址 DEC SP POP ACC ;取入口參數(shù) ;查表求ASCII碼 PUSH ACC ;保存出口參數(shù) INC SP ;指向返回地址 INC SP RET DB 0,1, ;ASCII碼表,4.5 子程序與運(yùn)算程序設(shè)計(jì),例:設(shè)計(jì)100 ms延時(shí)程序。 說明: 計(jì)算機(jī)執(zhí)行一條指令需
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嘀友管車:網(wǎng)約車與租賃公司全業(yè)務(wù)管理平臺(tái)解決方案
- 《智能家居系統(tǒng)介紹》課件
- 園林綠化工藝流程
- 大班健康活動(dòng)《貝貝換牙》教案設(shè)計(jì)
- 杭州至德清市域鐵路工程涉及220kV窯鐵2R09線48#-50#遷改工程報(bào)告表
- 《下肢康復(fù)》課件
- 《兒童推拿教學(xué)課件》
- 《社區(qū)康復(fù)護(hù)理改進(jìn)》課件
- VBSE實(shí)訓(xùn)成本會(huì)計(jì)流程
- 課件物體在重力作用下的運(yùn)動(dòng)
- 公司勞務(wù)管理綜合考評(píng)表
- 變更戶主情況登記表(填寫樣式)
- 山東省醫(yī)院護(hù)理服務(wù)質(zhì)量評(píng)價(jià)細(xì)則簡介
- 遼寧本溪國家地質(zhì)公園環(huán)境保護(hù)自查報(bào)告
- 手衛(wèi)生相關(guān)知識(shí)考核試題與答案
- 中國工農(nóng)紅軍長征教學(xué)課件
- “釣魚法”鋼管樁沉樁施工
- 噴(烤)漆房VOCs治理設(shè)施日常運(yùn)行臺(tái)賬
- 南方測(cè)繪_平差易2005說明書
- 動(dòng)靜脈內(nèi)瘺的穿刺與護(hù)理-PPT課件
- 開姆洛克指南
評(píng)論
0/150
提交評(píng)論