




已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章:匯編語言程序設(shè)計,本章基本要求: 匯編語言的構(gòu)成 源程序的設(shè)計與匯編* 應(yīng)用程序設(shè)計*,4.1 匯編語言的構(gòu)成,4.1.1 程序設(shè)計語言 用戶要使計算機能完成各式各樣的任務(wù),就要設(shè)計各種相應(yīng)的應(yīng)用程序, 而設(shè)計程序就要用到程序設(shè)計語言。程序設(shè)計語言有3種: 機器語言 匯編語言 高級語言。,4.1 匯編語言的構(gòu)成,表4-1 機器語言和匯編語言的形式,機器語言中二進制形式不便記憶,常采用十六進制形式記憶,4.1 匯編語言的構(gòu)成,在Keil調(diào)試環(huán)境下反匯編程序,1、匯編源程序:,2、反匯編程序:,地址,機器碼,反匯編程序,匯編源程序,4.1 匯編語言的構(gòu)成,1、機器語言 計算機能直接識別和執(zhí)行的二進制代碼形式的指令稱為機器指令, 而該類指令的集合稱為計算機的機器語言, 或稱指令系統(tǒng)。機器語言是面向計算機系統(tǒng)的。由于各種計算機內(nèi)部結(jié)構(gòu), 線路的不同, 每種計算機系統(tǒng)都有它自己的機器語言, 即使執(zhí)行同一操作, 其指令也不相同。,4.1 匯編語言的構(gòu)成,2、匯編語言 計算機所能執(zhí)行的每條指令都對應(yīng)一組二進制代碼。為了容易理解和記憶計算機的指令,人們用一些英語的單詞和字符以及數(shù)字作為助記符來描述每一條指令的功能。用助記符描述的指令系統(tǒng),稱為機器的匯編語言系統(tǒng),簡稱匯編語言。 匯編語言也是面向機器的,每種計算機系統(tǒng)也都有它自己的匯編語言,用匯編語言編寫的程序,稱為匯編語言源程序或匯編源程序。,4.1 匯編語言的構(gòu)成,3、高級語言 高級語言(如:PASCAL、C、FORTRAN、BASIC等)克服了匯編語言的缺點,是一種面向問題或過程的語言。它是一種接近于自然語言和數(shù)學算法的語言,與機器的硬件無關(guān),用戶編程時不必仔細了解所用計算機的具體性能和指令系統(tǒng)。高級語言不但直觀、易學、易懂,而且通用性強,可以在不同的計算機上運行,因此可移植性好。,4.1 匯編語言的構(gòu)成,4.1.2 匯編語言格式 MCS51系列單片機是用51系列單片機的指令系統(tǒng)來編程的,其匯編語言的語句格式,也就是單片機的指令格式,即: 標號:操作碼 操作數(shù) ;注釋 說明: 1、 內(nèi)的部分為可選項; 2、標號是一條指令在存儲器存放的地址,是以字母開頭的字母數(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頁): 二進制、十進制、十六進制形式 工作寄存器、特殊功能寄存器 地址標號 帶加減算符的表達式 采用符,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標號地址 MOV A,LABLE+1 ;A標號地址+1,4.1 匯編語言的構(gòu)成,4.1.3 匯編語言構(gòu)成 匯編語言語句分為:指令性語句、指示性語句兩類。 1、指令性語句 包括指令系統(tǒng)中的全部指令,每條指令有對應(yīng)的機器代碼,并可由CPU執(zhí)行。 2、指示性語句 在匯編源程序的過程中,還有一些指令不要求CPU進行任何操作,也沒有對應(yīng)的機器碼,不影響程序的執(zhí)行,僅僅是能夠指導(dǎo)匯編進行處理的一些指令,稱之為偽指令。,4.1 匯編語言的構(gòu)成,偽指令的主要功能是:用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的確定地址,或為中間運算結(jié)果保留一部分存儲空間以及表示源程序結(jié)束等等。 不同版本的匯編語言,偽指令的符號和含義可能有所不同, 但是基本用法是相似的。 下面介紹幾種常用的基本偽指令。,MCS-51單片機偽指令,1、起點指令 ORG,格式:,ORG H (16位地址或標號),功能:,給程序起始地址或數(shù)據(jù)塊的起始地址賦值,例:,用法:,一般出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始 一個源程序可多次出現(xiàn)ORG指令,首地址,首地址,2、結(jié)束命令 END,格式:END,功能:匯編程序結(jié)束標志,附在一個源程序的結(jié)尾 一個源程序只能出現(xiàn)一次END指令,用法:,MCS-51單片機偽指令,3、等值命令 EQU,格式:,字符名稱 EQU 數(shù)據(jù)或匯編符號,功能:,將一個數(shù)據(jù)或匯編符號賦予標號段規(guī)定的字符名稱,例:,;AA與R6等值,MCS-51單片機偽指令,例:,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ù)或表達式,功能:,此命令把數(shù)據(jù)/代碼地址賦予標號段所規(guī)定的字符名稱。定義的字符名稱可先使用后定義,INDEXJ DATA 8096H,;INDEXJ這個字符名稱的地址為8096H,例:,等價于,MCS-51單片機偽指令,EQU與 DATA的區(qū)別,(1) DATA與EQU相似,但DATA定義的字符名稱, 可先使用后定義 ,EQU則不能,(2) EQU指令可把匯編符號賦給字符名稱, DATA則不能,(3) DATA可把表達式的值賦給字符名稱, EQU則不能,DATA常在程序中定義數(shù)據(jù)地址 EQU常在程序中定義字符數(shù)據(jù),MCS-51單片機偽指令,5、定義字節(jié)命令 DB,格式:,功能:,標號:DB 字節(jié)常數(shù)或字符串 (8位),定義字節(jié)的內(nèi)容,匯編程序把DB定義的字節(jié)依次存入標號開始的存儲單元,有定義的內(nèi)存單元地址,項或項表,例:,偽指令ORG 定義了TAB的起始地址為8000H, 偽指令DB定義了8000H8003單元的內(nèi)容依次為:,(8000H)= 45H,(8001H)= 49H,(8002H)= 35H,(8003H)= 41H,(8004H)= 05H,TAB,TAB1,(1) 由 ORG定義,(2) 跟在其他源程序之后,6、定義字命令DW,格式:,功能:,標號:DW 字或字表,定義若干個字(雙字節(jié)),例:,ORG 8000H,TAB:DW 7234H,8AH,10,(8000H)= 72H,(8001H)= 34H,(8002H)= 00H,(8003H)= 8AH,(8005H)= 0AH,匯編后:,(8004H)= 00H,MCS-51單片機偽指令,7、定義空間命令 DS,格式:,功能:,標號:DS 數(shù)據(jù)或字符及表達式,例:,(8008H)=30H,(8009H)=8AH,從指定單元地址開始,由數(shù)據(jù)或字符及表達式的值來定義應(yīng)保留的單元數(shù),備用,即:8000H8007H單元保留備用,定義空間,MCS-51單片機偽指令,8、位地址符號命令 BIT,格式:,字符名稱 BIT 位地址,功能:,把位地址賦予標號段的字符名稱,;P1.0, P2.0賦予位地址字符名稱 A1、A2,在編程時可以直接把 A1、A2 當成位地址使用,MCS-51單片機偽指令,匯編程序的操作,分兩次掃描(匯編),第一次掃描(匯編),檢查語法結(jié)構(gòu),對源程序 中的符號、表達式、標號 進行定義,處理偽指令, 建立符號表,顯示 ERROR,并提示行號,顯示 ERROR,并提示行號,修改!,修改!,第二次掃描(匯編),匯編成目標代碼和匯編程序 清單,可執(zhí)行的代碼(機器碼),4.2 匯編源程序的設(shè)計與匯編,4.2.1 匯編程序設(shè)計步驟 1、確定方案和計算方法 2、了解應(yīng)用系統(tǒng)的硬件配置、性能指標。 3、建立系統(tǒng)數(shù)學模型,確定控制算法和操作步驟。 4、畫程序流程圖,表示程序結(jié)構(gòu)和程序功能。 5、編制源程序 合理分配存儲器單元和了解I/O接口地址。 按功能設(shè)計程序,明確各程序之間的相互關(guān)系。 用注釋行說明程序,便于閱讀和修改調(diào)試和修改。 6、上機調(diào)試,對程序的正確性作最后的確定。,4.2 匯編源程序的設(shè)計與匯編,程序設(shè)計步驟流程:,Y,N,Y,Y,Y,N,N,N,4.2 匯編源程序的設(shè)計與匯編,4.2.2 源程序的匯編 CPU可以執(zhí)行的只能是機器碼程序。稱:把源程序翻譯成機器碼的過程為匯編。匯編可:人工匯編和機器匯編兩類。 1、人工匯編 由人工直接將匯編源程序翻譯成機器碼。 2、機器匯編 使用計算機執(zhí)行“匯編程序”來代替人工實現(xiàn)將匯編源程序翻譯成機器碼。,匯編語言 源程序,機器語言,匯編,反匯編,交叉 匯編,例4.1 設(shè)在內(nèi)部RAM的BLOCK單元內(nèi)有一無符號數(shù)據(jù)塊的長度,無符號數(shù)據(jù)塊起始地址是BLOCK+1。試編程求無符號數(shù)據(jù)塊種數(shù)據(jù)的累加和(不考慮進位加法之和),并把它存入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 ;加一個數(shù) DJNZ BLOCK,NEXT ;若(BLOCK)-1 0,則NEXT MOV SUM,A ;存累加和 SJMP HERE END,匯編程序經(jīng)兩次匯編得機器碼 第一次匯編 第二次匯編,轉(zhuǎn)移 地址 計算,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è)計,4.3.1 簡單程序設(shè)計 例4.2請編寫能把20H單元內(nèi)兩個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已知一個補碼形式的16位二進制(低8位在NUM單元,高8位在NUM+1單元),試編寫能求該16位二進制數(shù)原碼的絕對值得程序。 程序: ORG 0300H NUM DATA 20H MOV R0,#NUM ;R0=NUM MOV R0,A ;低8位送入A CPL A ;A求反 ADD A,#01H ;A中內(nèi)容變補,保留CY MOV R0,A ;存數(shù) INC R0 ;地址加1,指向高8位 MOV R0,A ;高8位送入A CPL A ;取反 ADDC A,#00H ;加進位 ANL A,#7FH ;去掉符號位 MOV R0,A ;存數(shù) SJMP $,4.3 簡單程序與分支程序設(shè)計,例4.4已知20H單元中有一個8位二進制數(shù),請編程把它轉(zhuǎn)換為3位BCD數(shù),把百位數(shù)存入FIRST單元的低4位,十位和個位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 ;完成十位和個位裝配 MOV SECOND,A ;存入SECOND單元 SJMP $,4.3 簡單程序與分支程序設(shè)計,4.3.2 分支程序設(shè)計 可分為無條件和有條件分支程序兩類。重點以條件分支舉例。 例4.5 已知VAR單元內(nèi)有一自變量,請按如下條件編出求函數(shù)值Y,并將它存入FUNC單元的程序。 1 X0 Y= 0 X=0 -1 X0 解:這是一個三分支歸一的條件轉(zhuǎn)移問題。 兩種求解方法:“先分支后賦值” “先賦值后先分”,4.3 簡單程序與分支程序設(shè)計,“先分支后賦值”,程序: 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,一個判斷決策框,程序有兩條出路。兩種分支結(jié)構(gòu):,例: 求R2中補碼絕對值,正數(shù)不變,負數(shù)變補。 MOV A,R2 JNB ACC.7,NEXT ;為正數(shù)? CPL A ;負數(shù)變補 INC A MOV R2,A NEXT: SJMP NEXT ;結(jié)束,例如 行李計價:當重量G5公斤,價格M=G3(元); 當重量G5公斤,價格M=G3+(G-5)2 (元),FRT: MOV A,40H ;取行李重量計價單位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,一、按分支號轉(zhuǎn)移,如:當分支號=0,程序轉(zhuǎn)移到ADDR0處; 當分支號=1,程序轉(zhuǎn)移到ADDR1處; 。,(1)用地址表法。設(shè)分支號已存入A。 MTJS: MOV DPTR,#TAB ;取表首地址 CLR C ;分支號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=分支號,MTJS: MOV DPTR,#TAB;指向表首地址 MOV A,R7 ;分支號高字節(jié)3 MOV B,#03H MUL AB ;乘積不超過1字節(jié) ADD A,DPH MOV DPH,A MOV A,R6 ;分支號低字節(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 ;實現(xiàn)多分支轉(zhuǎn)移 TAB: LJMP ADDR0 ;轉(zhuǎn)移表 LJMP ADDR1 LJMP ADDRN ADDR0: ;程序段0 ,4.4 循環(huán)與查表程序設(shè)計,4.4.1 循環(huán)程序設(shè)計 循環(huán)程序一般由四部分組成:循環(huán)初始化、循環(huán)處理、循環(huán)控制、循環(huán)結(jié)束。 循環(huán)程序一般使用兩種結(jié)構(gòu),如下圖:,循環(huán)程序的構(gòu)成,各個環(huán)節(jié)任務(wù): 一初始化部分 循環(huán)準備工作。如:清結(jié)果單元、設(shè)指針、設(shè)循環(huán)控制變量初值等。,二循環(huán)體 循環(huán)工作部分:需多次重復(fù)處理的工作。 循環(huán)控制部分: 1.修改指針和循環(huán)控制變量。 2.檢測循環(huán)條件:滿足循環(huán)條件,繼續(xù)循環(huán),否則退出循環(huán)。 三.結(jié)束部分 處理和保存循環(huán)結(jié)果。 允許0次循環(huán)的循環(huán)結(jié)構(gòu):在循環(huán)工作之前檢測循環(huán)條件。,4.4 循環(huán)與查表程序設(shè)計,一、單重循環(huán),例:求n個單字節(jié)數(shù)據(jù)的累加,設(shè)數(shù)據(jù)串已在43H起始單元,數(shù)據(jù)串長度在42H單元,累加和不超過2個字節(jié)。,SUM: MOV R0,#42H ;設(shè)指針 MOV A,R0 MOV R2,A ;循環(huán)計數(shù)器n CLR A ;結(jié)果單元清0 MOV R3,A ADD1: INC R0 ;修改指針 ADD A,R0 ;累加 JNC NEXT ;處理進位 INC R3 ;有進位,高字節(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)控制方法:計數(shù)控制、特征標志控制。,1、計數(shù)控制: 設(shè)循環(huán)計數(shù)器,控制循環(huán)次數(shù)。正計數(shù)和倒計數(shù)兩種方式。 例:為一串7位ASCII碼數(shù)據(jù)的D7位加上奇校驗,設(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é)束標志實現(xiàn)循環(huán)控制。,例:找正數(shù)表最小值。正數(shù)表存在片外RAM中以LIST為起始單元,用-1作為結(jié)束標志。,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é)無符號數(shù)升序排序。 步驟: 每次取相鄰單元的兩個數(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個數(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è)計,4.4.2 查表程序設(shè)計 所謂查表是依據(jù)ROM中的數(shù)據(jù)表格的項數(shù)來查找與之對應(yīng)的表中數(shù)值。 有兩條專門的查表指令: MOVC A,A+DPTR MOVC A,A+PC 查表指令一般用于代碼轉(zhuǎn)換、顯示、散轉(zhuǎn)等應(yīng)用場合。,當用DPTR作基址寄存器時,查表的步驟分三步: 基址值(表格首地址)DPTR; 變址值(表中要查的項與表格首地址之間的 間隔字節(jié)數(shù))A; 執(zhí)行MOVC A,A+DPTR。,當用PC作基址寄存器時,其表格首地址與PC值間距不能超過256字節(jié),且編程要事先計算好偏移量,比較麻煩。因此,一般情況下用DPTR作基址寄存器。,例: 在單片機應(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ù)序號 MOVC A, A+DPTR ;讀立方數(shù)據(jù)高8位 XCH A,30H ;存立方數(shù)據(jù)高8位,立方表數(shù)據(jù)序號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 子程序與運算程序設(shè)計,4.5.1 子程序設(shè)計 回顧子程序的作用、結(jié)構(gòu)、以及與主程序的關(guān)系。匯編程序設(shè)計中子程序調(diào)用方法、程序要求。設(shè)計子程序時注意: 1、子程序的第一條指令的地址為入口地址。一般使用標號代替,該標號也叫做子程序名。 2、子程序中必須使用RET指令。 3、主程序調(diào)用子程序、子程序返回主程序時的操作。 4、在子程序中注意保護CPU的狀態(tài)。 5、子程序入口參數(shù)的傳送可以使用:指定RAM單元、R0R7寄存器、堆棧、位地址等來傳送。,子程序設(shè)計 一子程序入口用標號作為子程序名。 二調(diào)用子程序之前設(shè)置好堆棧。 三用返回指令RET結(jié)束子程序,并保證堆棧棧頂為調(diào)用程序的返回地址。 四.子程序嵌套須考慮堆棧容量。 五.提供足夠的調(diào)用信息: 如:子程序名、子程序功能、入口參數(shù)和出口參數(shù)、子程序占用的硬件資源、子程序中調(diào)用的其他子程序名。,子程序: 能完成某項特定功能的獨立程序段,可被反復(fù)調(diào)用。,子程序的類型:按子程序與主程序之間傳遞參數(shù)的方式分類。,入口參數(shù):調(diào)用子程序之前,需要傳給子程序的參數(shù)。 出口參數(shù):子程序送回調(diào)用程序的結(jié)果參數(shù)。,選用不同的參數(shù)傳遞方式。 1.寄存器傳送參數(shù) 2.存儲器傳送參數(shù) 3.堆棧傳送參數(shù),設(shè)計子程序應(yīng)滿足通用性的要求,不針對具體數(shù)據(jù)編程。 例如:1.子程序功能為求單字節(jié)數(shù)的立方: AA3,入口參數(shù)和出口參數(shù)為A。 2.子程序功能為求單字節(jié)數(shù)的n次方: (41H)(42H)(40H)A,入口參數(shù)為(40H)和A, 出口參數(shù)為(42H)(41H)。,例:將R4R5R6中三個字節(jié)數(shù)據(jù)對半分解,變成6個字節(jié), 存入顯示緩沖區(qū)(DISMEM0DISMEM5)。,1)子程序UFOR1的功能:將A累加器中單字節(jié)數(shù)據(jù),對半分解成兩個字節(jié),存入R0所指向的相鄰兩個單元 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。,例 比較兩個數(shù)據(jù)串是否完全相等,若完全相等,A=0;否則A=FFH。,PMT: MOV R2,A ;設(shè)數(shù)串長度 CHC: MOV A,R0 ;各取數(shù)串中的一個數(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 子程序與運算程序設(shè)計,例:設(shè)計100 ms延時程序。 說明: 計算機執(zhí)行一條指令需
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國畜產(chǎn)品行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國電池鍍鎳鋼板行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國電子實驗室筆記本行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國電動機械試驗儀器行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國電冰箱行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國特高筋面粉行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展報告
- 2025至2030中國牲畜屠宰行業(yè)發(fā)展前景預(yù)測和投融資分析報告
- 網(wǎng)絡(luò)平臺合作協(xié)議條款說明
- 旅游度假村投資建設(shè)協(xié)議
- 農(nóng)業(yè)生產(chǎn)中的無人機技術(shù)運用協(xié)議
- IgG4腎病的診斷和治療
- 中國啤酒籃行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告2025-2028版
- 2025年中國直接結(jié)合鎂鉻磚數(shù)據(jù)監(jiān)測研究報告
- 會議流程規(guī)劃能力試題及答案
- 中藥硬膏熱貼敷操作流程
- 西安歷年美術(shù)中考題及答案
- 國家開放大學《管理學基礎(chǔ)》形考任務(wù)1-4答案
- 眩暈中醫(yī)臨床路徑解讀
- 2025年山東省威海市市屬事業(yè)單位招聘(綜合類)考試筆試高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2020年預(yù)防艾滋病、梅毒和乙肝(三病)母嬰傳播培訓
- 中國音樂學院《藥學分子生物學》2023-2024學年第二學期期末試卷
評論
0/150
提交評論