版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第四章-1 本章重點(diǎn):本章重點(diǎn):匯編語言的構(gòu)成匯編語言的構(gòu)成 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 講授內(nèi)容:講授內(nèi)容:程序設(shè)計(jì)方法和算法分析程序設(shè)計(jì)方法和算法分析 應(yīng)用程序設(shè)計(jì)舉例應(yīng)用程序設(shè)計(jì)舉例 第四章第四章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)一、匯編語言的語句類型一、匯編語言的語句類型 MCS-51單片機(jī)匯編語言,包含兩類不同性質(zhì)的指單片機(jī)匯編語言,包含兩類不同性質(zhì)的指令語句。令語句。(1)指令性語句指令性語句:采用指令助記符構(gòu)成的匯編語言語:采用指令助記符構(gòu)成的匯編語言語句,必須符合匯編語言的語法規(guī)則。它們都是機(jī)器能句,必須符合匯編語言的語法規(guī)則。它們都是機(jī)器能夠執(zhí)行的指令,每一條指令語句在
2、匯編時(shí)都有對(duì)應(yīng)的夠執(zhí)行的指令,每一條指令語句在匯編時(shí)都有對(duì)應(yīng)的機(jī)器碼。機(jī)器碼。(2)偽指令語句:偽指令語句:匯編時(shí)用于控制匯編的指令語句。匯編時(shí)用于控制匯編的指令語句。它們都是機(jī)器不執(zhí)行的指令語句,匯編時(shí)不產(chǎn)生對(duì)應(yīng)它們都是機(jī)器不執(zhí)行的指令語句,匯編時(shí)不產(chǎn)生對(duì)應(yīng)的機(jī)器碼。的機(jī)器碼。 第四章-2 4.1 4.1 匯編語言的構(gòu)成匯編語言的構(gòu)成二、匯編語言的偽指令二、匯編語言的偽指令1. ORG匯編起始地址偽指令匯編起始地址偽指令 指令格式:指令格式: ORG m m為十六進(jìn)制數(shù)或十進(jìn)制。它規(guī)定了它下面的程序或數(shù)表應(yīng)從為十六進(jìn)制數(shù)或十進(jìn)制。它規(guī)定了它下面的程序或數(shù)表應(yīng)從ROM的的m地址處開始存放。一個(gè)
3、匯編語言源程序中,可以多次使用地址處開始存放。一個(gè)匯編語言源程序中,可以多次使用ORG命令,命令,地址一般應(yīng)從小到大,且不能使各程序段出現(xiàn)重疊現(xiàn)象。地址一般應(yīng)從小到大,且不能使各程序段出現(xiàn)重疊現(xiàn)象。2END 匯編結(jié)束偽指令匯編結(jié)束偽指令 指令格式:指令格式: END END指令用于終止源程序的匯編工作。一般一個(gè)源程序只能有一個(gè)指令用于終止源程序的匯編工作。一般一個(gè)源程序只能有一個(gè)END。 3EQU賦值偽指令賦值偽指令 指令格式:指令格式: 字符名稱字符名稱 EQU 匯編符號(hào)或數(shù)據(jù)匯編符號(hào)或數(shù)據(jù) EQU是將一個(gè)數(shù)據(jù)或匯編符號(hào)賦予規(guī)定的字符名稱,匯編程序會(huì)自是將一個(gè)數(shù)據(jù)或匯編符號(hào)賦予規(guī)定的字符名稱
4、,匯編程序會(huì)自動(dòng)將動(dòng)將EQU右邊的數(shù)據(jù)或匯編符號(hào)(地址或常數(shù))賦給左邊的字符名稱。右邊的數(shù)據(jù)或匯編符號(hào)(地址或常數(shù))賦給左邊的字符名稱。字符名稱應(yīng)該先定義后使用,所以該偽指令通常應(yīng)在源程序的開頭。字符名稱應(yīng)該先定義后使用,所以該偽指令通常應(yīng)在源程序的開頭。 第四章-34DB定義字節(jié)偽指令定義字節(jié)偽指令指令格式:指令格式:標(biāo)號(hào):標(biāo)號(hào):DB 字節(jié)常數(shù)或數(shù)表。表明從該標(biāo)號(hào)地址單元開始字節(jié)常數(shù)或數(shù)表。表明從該標(biāo)號(hào)地址單元開始定義一個(gè)或若干個(gè)字節(jié)的數(shù)。例如:定義一個(gè)或若干個(gè)字節(jié)的數(shù)。例如: ORG 1000H TAB:DB 12H,34H,56H;從;從1000H單元開始存放數(shù)單元開始存放數(shù) DB 78
5、H,9AH,00H;換行,仍要先寫;換行,仍要先寫DB5DW定義字偽指令定義字偽指令指令格式:標(biāo)號(hào):指令格式:標(biāo)號(hào):DW 字常數(shù)或字?jǐn)?shù)表字常數(shù)或字?jǐn)?shù)表類似類似DB,但,但DW指從該標(biāo)號(hào)地址單元開始,存放一個(gè)或若干個(gè)字的數(shù)。指從該標(biāo)號(hào)地址單元開始,存放一個(gè)或若干個(gè)字的數(shù)。例如:例如: ORG 1500H TAB1:DW 1234H,9AH,10 偽指令偽指令DW則定義則定義1500H1505H單元的內(nèi)容依次為單元的內(nèi)容依次為12H、34H、00H、9AH、00H、0AH。第四章-46DATA數(shù)據(jù)地址賦值偽指令數(shù)據(jù)地址賦值偽指令指令格式:指令格式: 字符名稱字符名稱 DATA 表達(dá)式表達(dá)式作用類似
6、于作用類似于EQU,但是,但是EQU必須先定義后使用,而可以必須先定義后使用,而可以DATA先使用后定先使用后定義。義。7DS預(yù)留空間偽指令預(yù)留空間偽指令指令格式:指令格式:標(biāo)號(hào):標(biāo)號(hào): DS表達(dá)式表達(dá)式DS指定從標(biāo)號(hào)地址單元開始,保留若干字節(jié)單元備用。例如:指定從標(biāo)號(hào)地址單元開始,保留若干字節(jié)單元備用。例如: TAB2: DS100;通知匯編程序從;通知匯編程序從TAB2開始保留開始保留100個(gè)字節(jié)單元,以備源程序另用。個(gè)字節(jié)單元,以備源程序另用。8BIT位地址賦值偽指令位地址賦值偽指令指令格式:指令格式:字符名稱字符名稱 BIT 位地址位地址一般用來將位地址賦給字符名稱,以用戶編程和程序閱
7、讀。例如:一般用來將位地址賦給字符名稱,以用戶編程和程序閱讀。例如: M0 BIT 20H.0 MOV C, M0第四章-5 用匯編語言編寫程序,一般可分為以下幾個(gè)步驟:用匯編語言編寫程序,一般可分為以下幾個(gè)步驟: 1) 擬定設(shè)計(jì)任務(wù)書;擬定設(shè)計(jì)任務(wù)書; 2) 建立數(shù)學(xué)模型;建立數(shù)學(xué)模型; 3) 分析被控對(duì)象,確定算法分析被控對(duì)象,確定算法; 4) 繪制程序流程圖繪制程序流程圖; 5) 確定數(shù)據(jù)結(jié)構(gòu):合理分配內(nèi)存單元及工作寄存器確定數(shù)據(jù)結(jié)構(gòu):合理分配內(nèi)存單元及工作寄存器; 6) 編寫匯編語言源程序;編寫匯編語言源程序; 7) 上機(jī)調(diào)試程序。上機(jī)調(diào)試程序。 4.2 4.2 匯編語言程序設(shè)計(jì)方法匯
8、編語言程序設(shè)計(jì)方法 第四章-6一、簡單程序設(shè)計(jì)一、簡單程序設(shè)計(jì)例例4-1 :將:將30H單元內(nèi)的兩位壓縮單元內(nèi)的兩位壓縮BCD碼拆開并轉(zhuǎn)換成碼拆開并轉(zhuǎn)換成ASCII碼,存入碼,存入RAM的的31H、32H兩個(gè)單元中。兩個(gè)單元中。ORG1000HMOVA,30H ;取值;取值A(chǔ)NLA,#0FH ;取低;取低4位位ADDA,#30H ;轉(zhuǎn)換成;轉(zhuǎn)換成ASCII碼碼MOV32H,A ;保存結(jié)果;保存結(jié)果MOVA,30H ;取值;取值SWAPA ;高;高4位與低位與低4位互換位互換ANLA,#0FH ;取低;取低4位(原來的高位(原來的高4位)位)ADDA,#30H ;轉(zhuǎn)換成;轉(zhuǎn)換成ASCII碼碼MO
9、V31H,A ;保存結(jié)果;保存結(jié)果 SJMP$ END 結(jié)束取數(shù)據(jù)低4位轉(zhuǎn)換成ASCII碼存ASCII碼取數(shù)據(jù)高4位轉(zhuǎn)換成ASCII碼存ASCII碼開始第四章-7例例4-2 :將兩個(gè)三字節(jié)無符號(hào)數(shù)相加,其中一個(gè)加數(shù)在內(nèi)部:將兩個(gè)三字節(jié)無符號(hào)數(shù)相加,其中一個(gè)加數(shù)在內(nèi)部RAM的的32H, 31H和和30H單元;另一個(gè)加數(shù)在內(nèi)部單元;另一個(gè)加數(shù)在內(nèi)部RAM的的35H, 34H和和33H單元,要求相加后的和存入單元,要求相加后的和存入32H, 31H和和30H單元,單元,進(jìn)位存到位尋址區(qū)的進(jìn)位存到位尋址區(qū)的20H單元。單元。ORG2000HMOVR0,#30H ;取值;取值MOVR1,#33HMOVA
10、,R0ADDA,R1MOVR0 ,A ;保存結(jié)果;保存結(jié)果INCR0 ;取中間字節(jié);取中間字節(jié)INCR1MOVA,R0 第四章-8ADDCA, R1MOVR0 ,A ;保存結(jié)果;保存結(jié)果INCR0 ;取高字節(jié);取高字節(jié)INCR1MOVA,R0 ADDCA,R1MOVR0,A ;保存結(jié)果;保存結(jié)果MOV 20H, CEND 條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0K=1K=nK=?二、分支程序設(shè)計(jì)二、分支程序設(shè)計(jì) 第四章-9例例4-3 :求單字節(jié)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼。:求單字節(jié)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼。解:正數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是除去符號(hào)位的其余各位取反加解:正
11、數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是除去符號(hào)位的其余各位取反加1。因此程序首先判斷被轉(zhuǎn)換數(shù)的符號(hào)。設(shè)二進(jìn)制數(shù)放在累加器因此程序首先判斷被轉(zhuǎn)換數(shù)的符號(hào)。設(shè)二進(jìn)制數(shù)放在累加器A中,其補(bǔ)碼中,其補(bǔ)碼結(jié)果放回結(jié)果放回A中。中。 ORG2000H JNBACC.7,NEG ;(A)0,不需轉(zhuǎn)換,不需轉(zhuǎn)換 MOVC,ACC.7 ;保存符號(hào)位;保存符號(hào)位 MOV00H,C CPLA ADDA,#01H MOVC,00H MOVACC.7, C ;恢復(fù)符號(hào)位;恢復(fù)符號(hào)位 NEG: SJMP $ END第四章-10例例4-4:設(shè):設(shè)X,Y均為帶符號(hào)數(shù),均為帶符號(hào)數(shù),存放在地址為存放在地址為M和和N單元中單元中, 編程
12、計(jì)算編程計(jì)算Y=f(x) 1 當(dāng)當(dāng)x0 Y = 0 當(dāng)當(dāng)x=0 -1 當(dāng)當(dāng)x0?存結(jié)果1AYN圖3-8 計(jì)算 y=f(x)程序流程圖第四章-11 M EQU 40H ;定義數(shù)據(jù)地址;定義數(shù)據(jù)地址 N EQU 41H ORG 0100H MOV A,M ;取出;取出X JZ NEXT2 ;當(dāng);當(dāng)X=0,則跳轉(zhuǎn)到,則跳轉(zhuǎn)到NEXT2 JNB ACC.7,NEXT1 ;當(dāng);當(dāng)X0,則跳轉(zhuǎn)到,則跳轉(zhuǎn)到NEXT1 MOV A,#0FFH ;當(dāng);當(dāng)X0,01H送送ANEXT2: MOV N,A ;存結(jié)果;存結(jié)果 SJMP $ END程序清單:程序清單:第四章-12當(dāng)程序出現(xiàn)多重分支時(shí),常用變址尋址轉(zhuǎn)移指令
13、實(shí)現(xiàn)散轉(zhuǎn)當(dāng)程序出現(xiàn)多重分支時(shí),常用變址尋址轉(zhuǎn)移指令實(shí)現(xiàn)散轉(zhuǎn)。JMP A+DPTR MOV DPTR, #JTAB ;轉(zhuǎn)移指令表首地址送轉(zhuǎn)移指令表首地址送DPTR MOV A, NAMBER ;轉(zhuǎn)移分支編號(hào)(轉(zhuǎn)移分支編號(hào)(04)送)送A MOV B, #03H MUL AB JMP A+DPTR下面是一個(gè)實(shí)現(xiàn)下面是一個(gè)實(shí)現(xiàn)5種分支轉(zhuǎn)移的程序:種分支轉(zhuǎn)移的程序:JTAB: LJMP CASE0 LJMP CASE1 LJMP CASE2 LJMP CASE3 LJMP CASE4第四章-13u 循環(huán)程序一般包括如下循環(huán)程序一般包括如下四個(gè)部分四個(gè)部分: 1)初始化)初始化 2)循環(huán)體)循環(huán)體 3)
14、循環(huán)控制)循環(huán)控制 4)結(jié)束)結(jié)束u 循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán);在多循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán);在多重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán),不允許循環(huán)相重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán),不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部?;ソ徊妫膊辉试S從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。u 循環(huán)程序通常有兩種結(jié)構(gòu):一種為直到型循環(huán)結(jié)構(gòu);循環(huán)程序通常有兩種結(jié)構(gòu):一種為直到型循環(huán)結(jié)構(gòu);一種為當(dāng)型循環(huán)結(jié)構(gòu),如圖所示:一種為當(dāng)型循環(huán)結(jié)構(gòu),如圖所示:第四章-14三、循環(huán)程序設(shè)計(jì)三、循環(huán)程序設(shè)計(jì) 開始初始化部分修改控制變量結(jié)束部分循環(huán)結(jié)束?其他:.結(jié)束YN循環(huán)
15、控制循環(huán)體部分圖3-10 記數(shù)循環(huán)程序流程圖開 始初 始 化 部 分修 改 控 制 變 量循 環(huán) 結(jié) 束 ?YN循 環(huán) 體 部 分結(jié) 束 部 分其 他 : . . .結(jié) 束循 環(huán)控 制第四章-15例例4-5:在內(nèi):在內(nèi)RAM 40H開始存放了一串單字節(jié)數(shù),串長度為開始存放了一串單字節(jié)數(shù),串長度為8,編程求其中,編程求其中最大值并送最大值并送R7中。中。解題思路:對(duì)數(shù)據(jù)塊中的數(shù)逐一兩兩相比較,較大值暫存于解題思路:對(duì)數(shù)據(jù)塊中的數(shù)逐一兩兩相比較,較大值暫存于A中,直到整中,直到整 串比完,串比完,A中的值就為最大值。中的值就為最大值。 MOV R0,#40H ;數(shù)據(jù)塊首址送地址指針;數(shù)據(jù)塊首址送地
16、址指針R0 MOV R2,#7 ;循環(huán)次數(shù)送;循環(huán)次數(shù)送R2 MOV A,R0 ;取第一個(gè)數(shù),當(dāng)作極大值;取第一個(gè)數(shù),當(dāng)作極大值 LOOP: INC R0 ;修改地址指針;修改地址指針 MOV B,R0 ;暫存;暫存B中中 CJNE A,B,NEXT ;比較后產(chǎn)生標(biāo)志(;比較后產(chǎn)生標(biāo)志(CY) NEXT: JNC NEXT1 ;CY=0? MOV A,R0 ;更大數(shù)送;更大數(shù)送A NEXT1:DJNZ R2,LOOP ; 循環(huán)次數(shù)結(jié)束?循環(huán)次數(shù)結(jié)束? MOV R7,A ;存最大值;存最大值1. 單循環(huán)程序單循環(huán)程序第四章-16練習(xí):外部練習(xí):外部RAM3000H 開始有開始有5050個(gè)數(shù)傳送到
17、內(nèi)部個(gè)數(shù)傳送到內(nèi)部RAM 30H開始的區(qū)域開始的區(qū)域算法分析:取地址指針?biāo)惴ǚ治觯喝〉刂分羔楧PTR=3000H、 R0=30H、計(jì)數(shù)器、計(jì)數(shù)器R7=50 ORG 2000H MOV DPTP,#3000H MOV R0,#30H MOV R7,# 32HLOOP:MOVX A,DPTR MOV R0,A INC DPTR INC R0 DJNZ R7,LOOP SJMP $ END第四章-17例例4-6:設(shè)在外部:設(shè)在外部RAM的的TAB處開始有一個(gè)處開始有一個(gè)ASCII字符串,字符串,該字符串以該字符串以0結(jié)尾,編程把它們從結(jié)尾,編程把它們從8051的的P1口輸出??谳敵觥?ORG 100
18、0H MOV DPTR,#TAB ;設(shè)字符串首地址指針;設(shè)字符串首地址指針 SOUT:MOVX A,DPTR ;取字符;取字符 JZ NEXT ;整串結(jié)束則轉(zhuǎn)跳;整串結(jié)束則轉(zhuǎn)跳 MOV P1, A INC DPTR ;修改地址指針;修改地址指針 SJMP SOUT ;沒結(jié)束繼續(xù)取數(shù)發(fā)送;沒結(jié)束繼續(xù)取數(shù)發(fā)送 NEXT: ;結(jié)束處理;結(jié)束處理 ORG 2000H TAB: DB XXH,XXH, ;定義定義ASCII字符串字符串 DB XXH,00H ;以;以0結(jié)尾結(jié)尾 END第四章-182. 2. 多重循環(huán)程序多重循環(huán)程序 多重循環(huán)程序就是循環(huán)的嵌套,既一個(gè)循環(huán)程序包含了其它循環(huán)程多重循環(huán)程序就
19、是循環(huán)的嵌套,既一個(gè)循環(huán)程序包含了其它循環(huán)程序,即循環(huán)內(nèi)套循環(huán)的結(jié)構(gòu)形式,也稱多重循環(huán)。一般內(nèi)層循環(huán)完成后,序,即循環(huán)內(nèi)套循環(huán)的結(jié)構(gòu)形式,也稱多重循環(huán)。一般內(nèi)層循環(huán)完成后,外層才執(zhí)行一次,然后再逐次類推,層次分明。外層才執(zhí)行一次,然后再逐次類推,層次分明。 外循環(huán)外循環(huán)中循環(huán)中循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)外循環(huán)外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)外循環(huán)外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)(a)嵌套正確)嵌套正確(b)嵌套正確)嵌套正確(c)交叉不正確)交叉不正確第四章-19例例4-7:2ms延時(shí)程序延時(shí)程序,已知晶振頻率為已知晶振頻率為12MHZ,則機(jī)器周期為,則機(jī)器周期為1s。解:解:DELAY2ms:MOV R7,#10 ;
20、1T DL1:MOV R6,#48 ;1T DL2:NOP ;1T NOP ;1T DJNZ R6,DL2 ;2T DJNZ R7,DL1 ;2T RET ;2T該段程序耗時(shí)為該段程序耗時(shí)為: 1+1+(1+1+2)48+210+2 = 1953 (s)第四章-20四、子程序及其調(diào)用程序設(shè)計(jì)四、子程序及其調(diào)用程序設(shè)計(jì) 所謂調(diào)用子程序,就是暫時(shí)中斷主程序的執(zhí)行,而轉(zhuǎn)到子程序的入口所謂調(diào)用子程序,就是暫時(shí)中斷主程序的執(zhí)行,而轉(zhuǎn)到子程序的入口地址去執(zhí)行子程序,子程序執(zhí)行完后返回主程序繼續(xù)執(zhí)行。地址去執(zhí)行子程序,子程序執(zhí)行完后返回主程序繼續(xù)執(zhí)行。子程序的形式與要求:子程序的形式與要求:1)名稱、地址、
21、功用()名稱、地址、功用(標(biāo)明子程序的入口地址或名稱,以方便調(diào)用);標(biāo)明子程序的入口地址或名稱,以方便調(diào)用);2)指出入口與出口參數(shù),以正確進(jìn)行)指出入口與出口參數(shù),以正確進(jìn)行參數(shù)傳遞參數(shù)傳遞; 參數(shù)傳遞參數(shù)傳遞 在調(diào)用子程序前,主程序應(yīng)先把有關(guān)參數(shù)(即入口參在調(diào)用子程序前,主程序應(yīng)先把有關(guān)參數(shù)(即入口參數(shù))放到某些約定的位置,子程序在運(yùn)行結(jié)束返回前,也應(yīng)該把運(yùn)算結(jié)果數(shù))放到某些約定的位置,子程序在運(yùn)行結(jié)束返回前,也應(yīng)該把運(yùn)算結(jié)果(出口參數(shù))送到約定的位置(出口參數(shù))送到約定的位置/單元。單元。常采常采用累加器或工作寄存器、地址指針用累加器或工作寄存器、地址指針寄存器或堆棧來傳遞參數(shù)。寄存器或
22、堆棧來傳遞參數(shù)。3 3)注意保護(hù)現(xiàn)場(chǎng);)注意保護(hù)現(xiàn)場(chǎng);4 4)子程序的末尾用)子程序的末尾用RET指令結(jié)束。指令結(jié)束。 第四章-21 有關(guān)指令:有關(guān)指令:1. 進(jìn)棧操作進(jìn)棧操作 PUSH direct;2. 出棧操縱出棧操縱 POP direct;3. 子程序的調(diào)用子程序的調(diào)用 1 1)絕對(duì)調(diào)用指令)絕對(duì)調(diào)用指令 ACALL addr11;PC PC+2,SPSP+1,(SP)PC70 SP SP+1,(,(SP) PC158,PC100addr11 2)長調(diào)用指令)長調(diào)用指令 LCALL addr16 ;PCPC+3,SPSP+1,(,(SP)PC70 SPSP+1,(,(SP)PC158
23、, PCaddr16 4. 子程序返回指令子程序返回指令 RET ;PC158 (SP),),SPSP-1 ;PC70 (SP),),SPSP-1第四章-221. 1. 用累加器用累加器A A或工作寄存器或工作寄存器RnRn傳遞參數(shù)傳遞參數(shù)例例4-8 :把:把A中一個(gè)十六進(jìn)制數(shù)的中一個(gè)十六進(jìn)制數(shù)的ASCII字符轉(zhuǎn)換為一位十六進(jìn)制數(shù)。字符轉(zhuǎn)換為一位十六進(jìn)制數(shù)。主程序部分:主程序部分:START: MOV A,#34H;設(shè)置入口參數(shù)于;設(shè)置入口參數(shù)于A中中子程序:子程序:ASCH: CLRC SUBB A,#30H CJNE A,#10,$+3 ;$+3為下條指令的首址為下條指令的首址 JC NE
24、XT ;(A)10,轉(zhuǎn),轉(zhuǎn)NEXT SUBB A,#07H ;(A) 0AH,則再減,則再減07H(共減(共減37H)NEXT: NOP RET第四章-23 例例4-9:在片內(nèi):在片內(nèi)RAM40H、50H開始的空間中,分別存有單字節(jié)的無符號(hào)數(shù)據(jù)塊,開始的空間中,分別存有單字節(jié)的無符號(hào)數(shù)據(jù)塊,長度分別為長度分別為12和和8。編程求這兩個(gè)數(shù)據(jù)塊中的最大數(shù),存入。編程求這兩個(gè)數(shù)據(jù)塊中的最大數(shù),存入MAX單元。單元。解題思路:用子程序求某數(shù)據(jù)塊的最大值,解題思路:用子程序求某數(shù)據(jù)塊的最大值,入口參數(shù):數(shù)據(jù)塊的首地址存入入口參數(shù):數(shù)據(jù)塊的首地址存入R0,長度存入,長度存入R2,出口參數(shù)在,出口參數(shù)在A中
25、,即最大數(shù)。中,即最大數(shù)。 ORG 1200HFMAX: MOV A,R0 ;取第一個(gè)數(shù);取第一個(gè)數(shù)LOOP0: INC R0 MOV B,R0 ;取下一個(gè)數(shù);取下一個(gè)數(shù) CJNE A,B,$+3 ;比較;比較 JNC LOOP1 MOV A, B ;把大的數(shù)送;把大的數(shù)送ALOOP1: DJNZ R2,LOOP0 RET ;出口參數(shù)在;出口參數(shù)在A中中第四章-242. 2. 用寄存器作指針來傳遞參數(shù)用寄存器作指針來傳遞參數(shù) 主程序主程序 ORG 1000H MAX EQU 30H MOV R0,#40H;設(shè)置入口參數(shù);設(shè)置入口參數(shù)R0,R2 MOV R2,#11 ACALL FMAX MOV
26、 MAX,A;出口參數(shù)暫存;出口參數(shù)暫存MAX中中 MOV R0,#50H;設(shè)置入口參數(shù);設(shè)置入口參數(shù)R0,R2 MOV R2,#7 ACALL FMAX CJNE A,MAX,$+3;比較兩個(gè)數(shù)中較大值;比較兩個(gè)數(shù)中較大值 JC NEXT MOV MAX,ANEXT:SJMP $ END第四章-25方法:在調(diào)用子程序之前,先把參與運(yùn)算的操作數(shù)壓入堆棧;在執(zhí)行子程方法:在調(diào)用子程序之前,先把參與運(yùn)算的操作數(shù)壓入堆棧;在執(zhí)行子程序過程中,通過堆棧指針序過程中,通過堆棧指針SPSP間接訪問到堆棧中的操作數(shù),取出參加運(yùn)算,間接訪問到堆棧中的操作數(shù),取出參加運(yùn)算,最后把運(yùn)算的結(jié)果壓入堆棧,由主程序再從
27、堆棧中彈出結(jié)果。最后把運(yùn)算的結(jié)果壓入堆棧,由主程序再從堆棧中彈出結(jié)果。注意問題:注意問題:由于調(diào)用子程序時(shí),主程序的斷點(diǎn)地址被自動(dòng)壓入堆棧,占用由于調(diào)用子程序時(shí),主程序的斷點(diǎn)地址被自動(dòng)壓入堆棧,占用了堆棧的兩個(gè)字節(jié),所以在子程序中彈出參數(shù)時(shí)一定要用修改了堆棧的兩個(gè)字節(jié),所以在子程序中彈出參數(shù)時(shí)一定要用修改SPSP指針,指指針,指向該參數(shù);同時(shí),在子程序返回指令向該參數(shù);同時(shí),在子程序返回指令RETRET之前一定要作相應(yīng)修改之前一定要作相應(yīng)修改SPSP指令,指令,以便以便SPSP指向斷點(diǎn)地址,確保能正確返回主程序。指向斷點(diǎn)地址,確保能正確返回主程序。 3. 3. 用堆棧來傳遞函數(shù)用堆棧來傳遞函數(shù)第四章-26解:解: FB: CPL P1.0 ;P1.0取反 ACALL DL10ms SJMPFB DL10ms: ;延時(shí)10ms的子程序 RET第四章-27 4.3 4.3 應(yīng)用程序設(shè)計(jì)舉例應(yīng)用程序設(shè)計(jì)舉例 例例4-10:要求在P1.0腳上產(chǎn)生周期為20ms的方波。例例4-11:如圖所示,編程實(shí):如圖所示,編程實(shí)現(xiàn)當(dāng)按現(xiàn)當(dāng)按K K一次則蜂鳴器一次則蜂鳴器“嘀、嘀、嘀嘀”響二聲。響二聲。 S
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 模具課程設(shè)計(jì)彈簧片
- 2024年高??蒲泻献黜?xiàng)目合同
- 2025年度智能安防監(jiān)控系統(tǒng)日常采購合同(全面安全保障)3篇
- 2024年終止租賃合同協(xié)議3篇
- 2024年版:物業(yè)托管經(jīng)營合同標(biāo)準(zhǔn)文本
- 中國產(chǎn)業(yè)金融服務(wù)行業(yè)發(fā)展運(yùn)行現(xiàn)狀及投資策略研究報(bào)告
- 素描動(dòng)物寫生課程設(shè)計(jì)
- 自動(dòng)清潔式黑板課程設(shè)計(jì)
- 游南京博物館觀后感600字5篇
- 藝術(shù)能力訓(xùn)練課程設(shè)計(jì)
- 中藥硬膏熱貼敷治療
- 2024年人教版三年級(jí)上數(shù)學(xué)教學(xué)計(jì)劃和進(jìn)度安排
- 《電能計(jì)量知識(shí)介紹》課件
- 2023-2024學(xué)年山東省濰坊市高新區(qū)六年級(jí)(上)期末數(shù)學(xué)試卷(含答案)
- 彈性模量自動(dòng)生成記錄
- 老年癡呆患者安全護(hù)理
- 2024年教師師德師風(fēng)工作計(jì)劃(2篇)
- 物流行業(yè)服務(wù)質(zhì)量保障制度
- 2025新外研社版英語七年級(jí)下Unit 1 The secrets of happiness單詞表
- 養(yǎng)老院物資采購流程及制度
- 眼鏡店年終總結(jié)及計(jì)劃
評(píng)論
0/150
提交評(píng)論