第次課匯編語(yǔ)言設(shè)計(jì)_第1頁(yè)
第次課匯編語(yǔ)言設(shè)計(jì)_第2頁(yè)
第次課匯編語(yǔ)言設(shè)計(jì)_第3頁(yè)
第次課匯編語(yǔ)言設(shè)計(jì)_第4頁(yè)
第次課匯編語(yǔ)言設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1匯編程序設(shè)計(jì)二14.2.4 查表程序 對(duì)一些復(fù)雜的函數(shù)運(yùn)算如sinx等,事先把其全部可能范圍的函數(shù)值按一定的規(guī)律編成表格存放在計(jì)算機(jī)的程序存儲(chǔ)器中。當(dāng)用戶(hù)程序中需要用到這些函數(shù)時(shí),直接按編排好的索引值(或程序號(hào))尋找答案。在控制應(yīng)用場(chǎng)合或智能儀器儀表中,經(jīng)常使用查表法。這種方法的不足是要占用較多的存儲(chǔ)單元。兩條極為有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC2例4.11 根據(jù)累加器A中的數(shù)x(09之間)查x的平方表,根據(jù)x的值查出相應(yīng)的平方放回A中。 ORG 0100HSQR1: MOV DPTR ,#TABLE MOVC A,A+DPTR RETTABLE DB 0

2、0H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H ORG 0100H0100H SQR2: INC A0101H MOVC A,A+PC0102H RET0103H TABLE DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H第1條指令 INC A的作用是加上偏移量,可以根據(jù)A的內(nèi)容查出X對(duì)應(yīng)的平方。34.2.5 子程序設(shè)計(jì)一個(gè)程序中有許多相同的運(yùn)算或操作時(shí),常把這些多次使用的程序段,按一定結(jié)構(gòu)編好,存放在內(nèi)存中,當(dāng)需要時(shí),程序可以去調(diào)用這些獨(dú)立的程序段。在編寫(xiě)子程序時(shí)應(yīng)注意以下問(wèn)題:1子程序的第一條指令的地址稱(chēng)為子程

3、序的入口地址。該指令前必須有標(biāo)號(hào)。2注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù)。3. 在子程序調(diào)用時(shí),注意參數(shù)傳遞的問(wèn)題.4子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性,操作采用地址和寄存器的形式。5子程序可以嵌套,即子程序可以調(diào)用子程序41.利用工作寄存器或累加器傳送參數(shù) 把入口參數(shù)存放到工作寄存器(Rn)或累加器中傳送給子程序,出口參數(shù)存放到工作寄存器(Rn)或累加器中傳送給主程序。2.利用寄存器傳送參數(shù)的地址 把存放入口參數(shù)的地址通過(guò)寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)的地址找到入口參數(shù)并對(duì)它們進(jìn)行相應(yīng)操作;出口參數(shù)的地址也可通過(guò)寄存器傳送給主程序。3.利用堆棧傳送參數(shù) 用壓棧指令PUSH把入口參數(shù)

4、壓入堆棧傳送給子程序,使用壓棧指令PUSH把出口參數(shù)壓入堆棧傳送給主程序。 傳送子程序參數(shù)的方法5子程序的基本結(jié)構(gòu) MAIN ;MAIN為主程序或調(diào)用程序標(biāo)號(hào) LCALL SUB ;調(diào)用子程序SUB SUB: PUSH PSW;現(xiàn)場(chǎng)保護(hù) PUSH ACC; 子程序處理程序段POP ACC;現(xiàn)場(chǎng)恢復(fù)POP PSW; RET;最后一條指令必須為RET 6利用工作寄存器或累加器傳送參數(shù)例 用程序?qū)崿F(xiàn) y x12x22。子程序名: SQR1 ORG 0000H x1 EQU 30H x2 EQU 40H Y EQU 50HSTART: MOV A,X1 ACALL SQR1 MOV R1,A ;X12

5、值暫存R1 MOV A,X2 ;X2取值 ACALL SQR1 ; ADD A,R1 ;求X12X22 MOV Y,A ;存入7 子程序 (例4.11) ORG 0100H0100 SQR1:INC A0101 MOVC A,APC0102 RET 0103 TABLE: DB 0,1, 4, 9,16 0108 DB 25,36,49,64,818用指針寄存器傳遞參數(shù)例:將片內(nèi)RAM中30H單元開(kāi)始的10個(gè)數(shù)據(jù)取反后送到片內(nèi)RAM40H開(kāi)始的單元中主程序: ORG 0100H MOV R2, #0AH MOV R0, #30H MOV R1, #40H ACALL TRAN子程序 ORG 0

6、200HTRAN: PUSH ACCTRAN1: MOV A, R0 CPL A MOV R1, A INC R0 INC R1 DJNZ R2, TRAN1 MOV A, R1 CLR C SUBB A, #0AH XCH A, R1 POP ACC RET9利用堆棧傳送參數(shù)例4.14 將R1中的低半字節(jié)一個(gè)十六進(jìn)制的數(shù)轉(zhuǎn)換為ASCII碼,再放回R1。 子程序名:H-ASC主程序 ORG 0000H AJMP STARSTAR: MOV SP ,#50H MOV A, R1 PUSH ACC LCALL H-ASC POP ACC MOV R1 ,A子程序: ORG 0E0HH_ASC MO

7、V R1 ,SP DEC R1 DEC R1 XCH A, R1 ANL A,0FH 保留低4位 MOV DPTR,TAB ; MOVC A,ADPTR;查表 XCH A, R1 RETTAB DB 30H,31H,32H,33H, 34H, 35H ,36H, 37H,38H,39H DB 41H,42H,43H, 44H,45H,46H104.3 MCS-51匯編語(yǔ)言實(shí)用程序舉例 4.3.1 運(yùn)算類(lèi)程序 4.3.2 數(shù)值轉(zhuǎn)換類(lèi)程序結(jié)束返回114.3.1運(yùn)算類(lèi)程序例4.21:多字節(jié)無(wú)符號(hào)數(shù)乘法。相乘原理如例4.19。入口:R1(被乘數(shù)低位字節(jié)地址指針); R0(乘數(shù)低位字節(jié)地址指針); R2

8、(被乘數(shù)字節(jié)數(shù)); R3(乘數(shù)字節(jié)數(shù))。出口:R4(積的低位字節(jié)地址指針); R5(積的字節(jié)數(shù))。 結(jié)束返回124.3.1運(yùn)算類(lèi)程序程序清單如下: DOMUL:MOVA,R1;復(fù)制被乘數(shù)地址指針 MOVR6,A MOVA,R0;復(fù)制乘數(shù)地址指針 MOVR5,A MOVA,R2;計(jì)算清零需要的循環(huán)次數(shù) ADDA,R3 MOV26H,A MOVR7,A MOVA,R4;復(fù)制積首地址到R0 MOVR0,A CLEAR: MOVR0,#00H;積單元清0 結(jié)束返回134.3.1運(yùn)算類(lèi)程序 INCR0 DJNZR7,CLEARMOVA,R4;保存積的低位地址 MOVR7,A MOV27H,R7 MOV2

9、0H,R2;保存被乘數(shù)字節(jié)數(shù) LP0:MOVA,R5;恢復(fù)乘數(shù)首地址 MOVR0,A MOVA,R0 MOVB,R1 MULAB ACALLADDM;調(diào)用部分積相加程序 INCR1 ;被乘數(shù)地址加一結(jié)束返回144.3.1運(yùn)算類(lèi)程序 DJNZR2,LP0 MOVR2,20H;恢復(fù)被乘數(shù)字節(jié)數(shù) MOVA,R6 MOVR1,A MOVA,R7;下次部分和累加開(kāi)始地址 INCA MOVR7,A MOVR4,A;子程序會(huì)用到下次累加地址 INCR5;乘數(shù)首地址加1 DJNZR3,LP0 MOVR4,27H;恢復(fù)地址指針 結(jié)束返回154.3.1運(yùn)算類(lèi)程序 MOVR5,26H RET ADDM: MOV21

10、H,A;加部分積 MOVA,R4 MOVR0,A MOVA,21H;加乘積低8位 ADDA,R0 MOVR0,A MOVA,B;加乘積高8位 INCR0 ADDCA,R0 結(jié)束返回164.3.1運(yùn)算類(lèi)程序 MOVR0,A INCR0;加進(jìn)位 MOVA,R0 ADDCA,#00H MOVR0,A DEC R0 MOVA,R0 MOVR4,A RET結(jié)束返回174.3.1運(yùn)算類(lèi)程序例4.23:BCD碼多字節(jié)加法。編程說(shuō)明:為了將計(jì)算機(jī)所能識(shí)別的二進(jìn)制數(shù)轉(zhuǎn)換成人們習(xí)慣使用的十進(jìn)制數(shù),可利用十進(jìn)制調(diào)整指令,使多字節(jié)加法轉(zhuǎn)換成多字節(jié)BCD碼加法。入口:(R0)=被加數(shù)低位字節(jié)地址指針; (R1)=加數(shù)低

11、位字節(jié)地址指針; R3=字節(jié)數(shù)。出口:(R0)=和值低位字節(jié)地址指針; R3=和值字節(jié)數(shù)。程序清單如下: BCDADD: MOV20H,R0 MOV23H,R3 CLR C 結(jié)束返回184.3.2運(yùn)算類(lèi)程序 LP0: MOVA,R0;取被加數(shù) ADDCA,R1;兩數(shù)相加 DAA;十進(jìn)制調(diào)整 MOVR0,A INCR0;指針加1 INCR1 DJNZR3,LP0;作完加法否 MOVR3,#23H JNCRETURN;有無(wú)進(jìn)位 MOVR0,#01H INCR3 RETURN:MOVR0,#20H RET結(jié)束返回194.3.1運(yùn)算類(lèi)程序例4.29:求最大值(單字節(jié)無(wú)符號(hào)數(shù))。入口:R0(數(shù)據(jù)區(qū)首址指

12、針);R2(字節(jié)數(shù))。出口:R0(最大值存于首址指針?biāo)竼卧?。程序清單如下: MAX: MOVA,R0;存首址指針 MOVR1,A DECR2 MOV A,R1 LP0: MOV R3,A DECR1 返回結(jié)束204.3.1運(yùn)算類(lèi)程序 CLRC SUBB A,R1;比較 JNCLP1 MOV A,R1;換最大值 SJMPLP2 LP1:MOVA,R3 LP2:DJNZR2,LP0 MOVR0,A;存最大值 RET返回結(jié)束214.3.1運(yùn)算類(lèi)程序例4.30:將內(nèi)存中的單字節(jié)無(wú)符號(hào)數(shù)按從小到大的順序排列入口:R0(數(shù)據(jù)區(qū)首地址指針);R2(字節(jié)數(shù))。出口:00H位作為發(fā)生交換的標(biāo)志,當(dāng)無(wú)交換時(shí),

13、排序結(jié)束。程序清單ROLE:MOVA,R0 MOVR1,A MOVA,R2 MOVR5,A CLR00H DECR5 MOV A,R1 LP0:MOVR3,A INCR1 CLRC;比較返回結(jié)束224.3.1運(yùn)算類(lèi)程序 MOV A,R1 SUBBA,R3 JNC LP1 SETB00H;有交換 MOVA,R3 XCH A,R1 DEC R1 XCH A,R1 INC R1 LP1: MOV A,R1 DJNZ R5,LP0 JB 00H,ROLE RET返回結(jié)束234.3.2 數(shù)值轉(zhuǎn)換類(lèi)程序我們?nèi)粘A?xí)慣使用十進(jìn)制數(shù),而計(jì)算機(jī)能識(shí)別和處理的是二進(jìn)制數(shù),計(jì)算機(jī)的輸入/輸出數(shù)據(jù)又常用BCD碼、ASC

14、II碼和其它代碼,因此,代碼轉(zhuǎn)換十分有用。例4.14:雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)。編程說(shuō)明:因?yàn)?a15a14a1a0)(02a15)2a14)2a0,所以,將二進(jìn)制數(shù)從最高位逐次左移入BCD碼寄存器的最低位,并且,每次都實(shí)現(xiàn)()2ai的運(yùn)算。共循環(huán)16次,由R7控制。入口:R3 R2 (16位無(wú)符號(hào)二進(jìn)制整數(shù))。出口:R6 (萬(wàn)位)、R5 (干位、百位)、R4 (十位、個(gè)位)存放5位BCD碼。 結(jié)束返回24程序清單如下:BCBCD:CLRA;BCD碼寄存器清零 MOVR4,A MOVR5,A MOVR6,A MOVR7,#10H ;設(shè)循環(huán)指針 LP0: CLRC ;左移一位,移入C MOV

15、A,R2 RLCA MOVR2,A MOVA,R3 RLCA 結(jié)束返回25 MOV R3,A MOV A, R4 ADDCA,R4;實(shí)現(xiàn)()2ai DA A MOV R4, A MOV A,R5 ADDCA,R5 DA A MOV R5,A MOV A,R6 ADDCA,R6 DA A MOV R6,A DJNZ R7,LP0 RET結(jié)束返回26例4.15: BCD數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)(雙字節(jié)整數(shù))。入口:R5 (千位,百位)、R4 (十位,個(gè)位)為BCD碼。出口:R5 R4 (16位無(wú)符號(hào)二進(jìn)制整數(shù))。程序清單如下:MOVA,R5 MOVR2,A;給子程序入口參數(shù) ACALLBCD2BIN1;調(diào)

16、用子程序BCD2BIN: MOVB,#64H結(jié)束返回274.3.1數(shù)值轉(zhuǎn)換類(lèi)程序 MULAB MOVR6,A XCHA,B MOVR5,A MOVA,R4 MOVR2,A;給子程序入口參數(shù) ACALLBCD2BINl;調(diào)用子程序 ADDA,R6 MOVR4,A MOVA,R5 ADDCA,#00H MOVR5,A RET結(jié)束返回28子程序如下:;子程序入口R2 BCD2BIN1:MOVA,R2 ANLA,#0F0H;取高位BCD碼,屏蔽低4位 SWAP A MOVB,#0AH MULAB MOVR3,A MOVA,R2 ANLA,#0FH ADDA,R3;加低位BCD碼 MOVR2,A RET

17、結(jié)束返回294.3.1代碼轉(zhuǎn)換類(lèi)程序例4.17:ASCII碼轉(zhuǎn)換為4位二進(jìn)制數(shù),本程序完成的是上例的逆過(guò)程。入口:(R2)ASCII碼。出口:(R2)轉(zhuǎn)換后的二進(jìn)制數(shù)。程序清單如下: ASC2BIN:MOV A,R2 CLR C SUBBA,#30H;ASCII碼減去30H MOVR2,A;得二進(jìn)制數(shù)R2 SUBBA,#0AH JCLOOP MOVA,R2 SUBBA,#07H MOVR2,A LOOP:RET結(jié)束返回30作業(yè)P94-1 將片內(nèi)30H39H單元中的內(nèi)容送到以3000H為首的存儲(chǔ)區(qū)內(nèi)。3000H一定是外部數(shù)據(jù)存儲(chǔ)區(qū) OGR 0000H MAIN1: MOV A, R1 M1 EQU 3000H MOVX DPTR, A M2 EQU 30H INC DPTR AJMP MAIN INC R1 ORG 1000H DJNZ R2, MAIN1MAIN: MOV R2, #10 END MOV DPTR, #M1 MOV R1,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論