




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言程序設(shè)計(jì)過(guò)程
4.2簡(jiǎn)單程序設(shè)計(jì)
4.3分支程序設(shè)計(jì)
4.4循環(huán)程序設(shè)計(jì)
4.5查表程序設(shè)計(jì)
4.6散轉(zhuǎn)程序設(shè)計(jì)
4.7子程序設(shè)計(jì)
4.8浮點(diǎn)數(shù)及其程序設(shè)計(jì)4.1匯編語(yǔ)言程序設(shè)計(jì)過(guò)程1.分析問(wèn)題,確定算法或解題思路2.畫(huà)流程圖3.編寫(xiě)程序4.調(diào)試和修改4.1.1匯編語(yǔ)言程序設(shè)計(jì)過(guò)程4.1.2偽指令所謂偽指令是指由匯編程序提供的,在匯編時(shí)起作用,在執(zhí)行時(shí)不起作用的一類指令。其特點(diǎn)是沒(méi)有對(duì)應(yīng)的機(jī)器碼。偽指令提供了像規(guī)定程序地址、建立數(shù)據(jù)表格一類的功能,為匯編語(yǔ)言程序的編寫(xiě)提供了方便。1.定位偽指令格式:ORGnn為十進(jìn)制或十六進(jìn)制常數(shù),代表地址。該偽指令規(guī)定了后面指令的地址,例如: ORG0100H AJMPPRG1AJMP為雙字節(jié)指令,其首字節(jié)放在0100H單元,第二字節(jié)放在0101H單元。2.匯編結(jié)束偽指令格式:END當(dāng)匯編程序遇到該指令后,結(jié)束匯編過(guò)程,其后的指令將不加處理。3.定義字節(jié)偽指令格式:DBx1,x2,…,Xn其中Xi為8位數(shù)據(jù)或ASCII碼。例如:ORG1000HDB01H,02H則(1000H)=01H(1001H)=02HORG1100DB‘01’則(1100H)=30H0的ASCII碼(1101H)=31H1的ASCII碼4.定義雙字節(jié)偽指令格式:DWXl,X2,…,Xn其中Xi為雙字節(jié)數(shù)據(jù)。例如:ORG2000HDW2546H,0178H則(2000H)=25H(2001H)=46H(2002H)=01H(2003H)=78H5.單字節(jié)數(shù)據(jù)賦值偽指令格式:xEQUnx為用戶定義的標(biāo)號(hào),n為常數(shù)、工作寄存器或特殊功能寄存器,為單字節(jié)數(shù)。該偽指令將n的值賦給標(biāo)號(hào)x。x可用于指令中,作為單字節(jié)操作數(shù);包括立即數(shù)和直接地址direct。6.雙字節(jié)數(shù)據(jù)賦值偽指令格式:yEQUny為用戶定義的標(biāo)號(hào),n為雙字節(jié)常數(shù)。該偽指令將n的值賦給標(biāo)號(hào)y。y可作為指令中的雙字節(jié)操作數(shù),或轉(zhuǎn)移指令中的目的地址。需要注意的是,不同的匯編程序提供的偽指令可能不同,使用時(shí)要參考相應(yīng)的說(shuō)明。4.2簡(jiǎn)單程序設(shè)計(jì)
簡(jiǎn)單程序又稱順序程序。計(jì)算機(jī)是按指令在存儲(chǔ)器中存放的先后次序來(lái)順序執(zhí)行程序的。例1求多項(xiàng)式y(tǒng)=a2-b。圖4-1例1流程圖開(kāi)始A←aB←aA*BA←(A)-bR7←(A)A←(B)A←(A)-(C)R6←(A)結(jié)束程序?yàn)椋? MOV A, R2;A←a MOV B, A MUL AB CLR C SUBB A, R3 MOV R7, A ;R7←結(jié)果的低8位 MOV A, B SUBB A, #00H;高八位減進(jìn)位位 MOV R6, A END例2單字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為BCD碼。解:單字節(jié)十六進(jìn)制數(shù)在0~255之間,將其除100后,商即百位數(shù),余數(shù)除以10,商為十位數(shù),余數(shù)即個(gè)位數(shù)。設(shè)單字節(jié)數(shù)在累加器A中,轉(zhuǎn)換結(jié)果的百位數(shù)放在R3中,十位、個(gè)位則放在A中。流程圖如圖4-2所示。開(kāi)始B←100A/BR7←(A)A←(B)B←10A/B結(jié)束A7~4←(A)3~0A3~0←(B)圖4-2例2流程圖程序?yàn)?HBCD: MOV B,#100 ;分離出百位數(shù) DIV AB MOV R3,A ;R3←立即數(shù)MOV A,#10 ;分離十位和各位數(shù)XCH A,BDIV A,BSWAP AADD A,BRET例3無(wú)符號(hào)雙字節(jié)乘法。解:設(shè)乘數(shù)和被乘數(shù)分別放在R2、R3和R6、R7中,計(jì)算結(jié)果放入R4、R5、R6、R7中。雙字節(jié)無(wú)符號(hào)數(shù)的乘法可以采用重復(fù)加法的方法進(jìn)行。MCS-51單片機(jī)有乘法指令,采用乘法指令的程序流程圖如圖4-3所示。(R2 R3)×(R6 R7)(R3*R7)H(R3*R7)L(R2*R7)H(R2*R7)L(R3*R6)H(R3*R6)L+(R2*R6)H(R2*R6)LR4R5R6R7開(kāi)始(R3)*(R7)R7←(R3*R7)LR5←(R3*R7)HR2*R7R4←(R2*R7)L+(R3*R7)HR5←(R2*R7)H+(Cy)R3*R6R6←(R3*R6)L+(R2*R7)L+(R3*R7)HR5←(R3*R6)L+(R2*R7)H+(Cy)R2*R6R5←(R2*R6)L+(R3*R6)L+(R2*R7)H+(Cy)R5←(R2*R6)L+(Cy)
返回圖4-3例3流程圖程序?yàn)椋?/p>
MUL:MOV A, MOV B, R7 MUL AB XCH A, R7MOV R5, B MOV B, R2MUL AB ADD A, R5 MOV R4, ACLR A ADDC A, B MOV R5, A MOV A, R6MOV B, R3 MUL AB ADD A, R4 XCH A, R6 XCH A, B ADDC A, R5 MOV R5, A MOV F0, C MOV A, R2MUL AB ADD A, R5 MOV R5, A CLR A MOV ACC.0, C MOV C, F0 ADDC A, B MOV R4, A RET如果是左規(guī)格化,直至把操作數(shù)變?yōu)橐?guī)格化浮點(diǎn)數(shù)。SUBB A,P31234.MOV A,R2MOV R2,A ;R0中的值即為所求的地址。例24位BCD碼的減法程序。本例中,參數(shù)傳遞是通過(guò)累加器A完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送到A中。圖4-9例2流程圖一般情況下,對(duì)自變量x是有變化規(guī)律的數(shù)據(jù),可以根據(jù)這一規(guī)律形成地址,對(duì)應(yīng)的y則存放于該地址單元中;在許多問(wèn)題中,需多次執(zhí)行一段完全相同的程序,只是參加運(yùn)算(或其它處理過(guò)程)的操作數(shù)不同,這時(shí)就可以采用循環(huán)程序結(jié)構(gòu)。5,所以需進(jìn)行左規(guī)格化處理,使積為規(guī)格化浮點(diǎn)數(shù)。SS: MOV A,R7在這種表示方法中,數(shù)值由四個(gè)部分組成,即尾數(shù)S及符號(hào),階碼P及符號(hào)。將數(shù)據(jù)存儲(chǔ)器中的內(nèi)容取出,分別與X相比較,若相等,當(dāng)前4.3分支程序設(shè)計(jì)
在許多情況下,需要根據(jù)不同的條件轉(zhuǎn)向不同的處理程序,這種結(jié)構(gòu)的程序稱為分支程序。采用條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令可以實(shí)現(xiàn)程序的分支。例1求單字節(jié)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼。解:正數(shù)補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是其反碼加1。因此,程序首先判斷被轉(zhuǎn)換數(shù)符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)即為補(bǔ)碼。設(shè)二進(jìn)制數(shù)放在累加器A中,其補(bǔ)碼放回到A中。其程序框圖如圖所示。圖4-4例1流程圖程序?yàn)椋篊MPT: JNB ACC.7,NCH ;(A)>0,不需要轉(zhuǎn)換 MOV C,ACC.7 ;保存符號(hào) MOV 00H, C ;保存符號(hào) CPL A ADD A,#1 MOV C,OOH MOV ACC.7,C ;恢復(fù)符號(hào)NCH: RET求符號(hào)函數(shù)。1,X>0;Y=0,X=0;-1,X<0。
解:X存放在30H單元,Y存放在31H單元中。流程圖如圖4-5所示。圖4-5例2流程圖X>0Yes開(kāi)始X=0?Y←0Y←1Y←-1結(jié)束NoNoYes解:X存放在30H單元,Y存放在31H單元中。流程圖如圖4-5所示。START: MOV A,30H CJNZ A,#00H AJMP LLNZ: JB ACC.7,MM MOV A,#01H AJMP LLMM: MOV A,#81HLL: MOV 31H, A END例3將ASCII碼轉(zhuǎn)換為十六進(jìn)制數(shù)。如果不是十六進(jìn)制數(shù),用戶標(biāo)志位置1。解:由ASCII碼表可知,30H~39H為0~9的ASCII碼,41H~46H為A~F的ASCII碼,即是將ASCII碼減30H或37H就可以獲得對(duì)應(yīng)的十六進(jìn)制數(shù)。設(shè)ASCII碼放在累加器A中,轉(zhuǎn)換結(jié)果放回A。YesYesYesNo(A)>10H?開(kāi)始A←(A)-30H(A)≥0?(A)≥0AH?A←(A)-07H(A)>09H?F0←1No返回NoNoYes圖4-6例3流程圖程序?yàn)椋篠TART:CLR C SUBB A,#30H JC NASC;(A)<0,不是十六進(jìn)制 CJNE A,#0AH,MMMM: JC ASC ;0≤(A)<0AH,是十六進(jìn)制數(shù) SUBB A,#07HCJNE A,#0AH,NNNN: JC NASC CJNE A,#10H,LLLL: JC ASCNASC: SETB F0ASC :RET4.4循環(huán)程序設(shè)計(jì)循環(huán)程序是指一段反復(fù)執(zhí)行的程序。在許多問(wèn)題中,需多次執(zhí)行一段完全相同的程序,只是參加運(yùn)算(或其它處理過(guò)程)的操作數(shù)不同,這時(shí)就可以采用循環(huán)程序結(jié)構(gòu)。循環(huán)程序可以縮短程序,減少程序所占的存儲(chǔ)空間。圖4-7循環(huán)程序循環(huán)開(kāi)始設(shè)置循環(huán)初值循環(huán)體循環(huán)控制循環(huán)結(jié)束循環(huán)控制循環(huán)開(kāi)始設(shè)置循環(huán)初值循環(huán)體循環(huán)結(jié)束例1將內(nèi)部數(shù)據(jù)存儲(chǔ)器30H~7FH單元的內(nèi)容傳送到外部數(shù)據(jù)存儲(chǔ)器以1000H開(kāi)始的連續(xù)單元中去。解:30H~7FH共計(jì)80個(gè)單元,需傳送80次數(shù)據(jù)。將R7作為循環(huán)計(jì)數(shù)寄存器,流程圖如圖4-8所示開(kāi)始R0←30HDPTR←1000HR7←50HA←((R0))(DPTR←(A)R0←(R0)+1DPTR←(DPTR)+1R7=0?結(jié)束No圖4-8例1流程圖程序?yàn)椋篗OV R0, #30H MOV DPTR,#1000H MOV R7, #50HLOP: MOV A,@RO MOVX @DPTR,A INC R0 ;指向下一指針 INC DPTR DJNZ R7, LOP ;未完繼續(xù) END例2多字節(jié)BCD碼加法。解:設(shè)R7存放著B(niǎo)CD碼的字節(jié)數(shù)(一個(gè)字節(jié)中存2位BCD碼),R0為被加數(shù)和結(jié)果的低位地址寄存器,R1為加數(shù)的低位地址寄存器,Cy保存最高字節(jié)的進(jìn)位位,流程圖如圖4-9所示。開(kāi)始R2←(R7)R6←((R0))A←((R0))A←(A)+((R1))DAAR0←(R0)+1R1←(R1)+1R2=0?R2←(R6)結(jié)束NoYes圖4-9例2流程圖程序?yàn)椋篗ADD: MOV A,R7 MOV R2,A ;保存字節(jié)數(shù) MOV A,R0 ;保存結(jié)果的地址指針 MOV R6, A CLR CLOOP: MOV A,@R0 ADDC A,@R1 DA A MOV @R0, A INC R0 INC R1 DJNZ R2,LOOP MOV A,R6 ;恢復(fù)地址 MOV R0,A RET例3內(nèi)部數(shù)據(jù)存儲(chǔ)器中連續(xù)存放著若干8位二進(jìn)制數(shù)據(jù),其中一個(gè)數(shù)的值為X,試求出該數(shù)的地址。NoA←((R0))YesR6←(R0)R0←(R0)+1R2=0?開(kāi)始R2←(R7)結(jié)束(A)=X?YesNo圖4-10例3流程圖解:設(shè)R0為數(shù)據(jù)區(qū)的首地址寄存器,R7存放數(shù)據(jù)的個(gè)數(shù),R6存放X的地址。將數(shù)據(jù)存儲(chǔ)器中的內(nèi)容取出,分別與X相比較,若相等,當(dāng)前R0中的值即為所求的地址。程序的循環(huán)的次數(shù)是不確定的,一旦找到X,循環(huán)立即結(jié)束。程序?yàn)椋?START: MOV A,R7 ;保存立即數(shù) MOV R2, A LOOP: MOV A,@R0CJNE A,#X,LL SJMJP OUTL LL: INC R0 DJNZ R2,LOOPSJMP MM OUTL: MOV A,R0MOV R6,A MM: RET例4排序程序,是將連續(xù)存放的若干數(shù)據(jù)重新排列,本例要求把內(nèi)部數(shù)據(jù)存儲(chǔ)器的數(shù)據(jù)由小到大排列。解:將兩個(gè)相鄰的數(shù)據(jù)相比較,如果前數(shù)大于后數(shù),兩個(gè)數(shù)的位置互換,否則位置不變。所有數(shù)據(jù)比較完后、找出最大的數(shù),并存在最后一個(gè)單元中。第二次比較在剩余的數(shù)據(jù)中進(jìn)行,找到剩余數(shù)據(jù)中最大的數(shù)。以此類推,即可完成數(shù)據(jù)的排序。設(shè)數(shù)據(jù)的個(gè)數(shù)為n,第一次需比較的次數(shù)為n-1,第二次需n-2次,等等。在理論上.需要進(jìn)行n-1次循環(huán)比較才能完成排序過(guò)程。事實(shí)上,有可能提前完成排序過(guò)程。如果在某次循環(huán)比較過(guò)程中沒(méi)有發(fā)生位置互換,說(shuō)明數(shù)據(jù)的排序已完成。為此在程序中設(shè)置一個(gè)數(shù)據(jù)換位標(biāo)志位,當(dāng)其發(fā)生變化時(shí),排序即告完成。設(shè)R0為數(shù)據(jù)區(qū)的首地址寄存器,R7字節(jié)數(shù)。YesYesNo開(kāi)始R2←(R7)60H←(R0)R2←(R2)-1R3←(R2)R0←(60H)F0←0A←((R0))R0←(R0)+1A←(A)-((R0))A<((R0))?A←((R0))R0←(R0)-1(A)←((R0))R0←(R0)+1(R0)←(A)F0←1R3=0?FO=1?R0←(60H)結(jié)束NoNoYes圖4-11例4流程圖程序?yàn)椋篠S: MOV A,R7 MOV R2, A ;保存字節(jié)數(shù) MOV 60H,R0 ;保存地址指針 NN: DEC R2 MOV A, R2 MOV R3, A ;初始化循環(huán)次數(shù) MOV R0, 60H ;恢復(fù)地址指針 L1: CLR FO MOV A, @R0 ;取前數(shù) INC R0 CLR CSUBB A, @RO ;減后數(shù) JC MM MOV A, @R0 ;位置互換 DEC R0 XCH A, @R0 INC R0 MOV @R0,A SETB F0MM: DJNZ R3, L1 JB F0, NN ;排序未完轉(zhuǎn)NN MOV R0, 60H ;恢復(fù)地址指針RET例5試編寫(xiě)延時(shí)程序。解:計(jì)算機(jī)反復(fù)執(zhí)行一段程序以達(dá)到延時(shí)的目的稱為軟件延時(shí)。通過(guò)控制執(zhí)行指令的數(shù)量可以延時(shí)不同的時(shí)間。要實(shí)現(xiàn)較長(zhǎng)時(shí)間的延時(shí),一般需采用多重循環(huán)。下面是延時(shí)50ms的延時(shí)程序,設(shè)單片機(jī)的晶振為12MHZ。DEL: MOV R7, #200DEL1: MOV R6, #125DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1該程序的延時(shí)時(shí)間實(shí)際為((125×2+4)×200+2)×0.001=50.8ms。4.5查表程序設(shè)計(jì)查表就是根據(jù)自變量x的值,在表中查找y,使y=f(x)。x和y可以是各種類型的數(shù)據(jù)。表的結(jié)構(gòu)也是多種多樣的。表格可以放在程序存儲(chǔ)器中,也可以存放在數(shù)據(jù)存儲(chǔ)器中。一般情況下,對(duì)自變量x是有變化規(guī)律的數(shù)據(jù),可以根據(jù)這一規(guī)律形成地址,對(duì)應(yīng)的y則存放于該地址單元中;對(duì)x是沒(méi)有變化規(guī)律的數(shù)據(jù),在表中存放x及其對(duì)應(yīng)的y值。前者形成的表格是有序的,后者形成的表格可以是無(wú)序的。例1將l位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼。解:在前面的例子中,我們介紹了將ASCII碼轉(zhuǎn)換為十六進(jìn)數(shù)的程序,本例是其逆變換。這里采用查表的方法完成十六進(jìn)制數(shù)到ASCII碼的轉(zhuǎn)換。建立一個(gè)表格,首先確定表格的首地址,在相對(duì)于表首的地址單元中存放ASCII碼。設(shè)十六進(jìn)制存放在R0中,轉(zhuǎn)換結(jié)果存放在R1中。程序?yàn)椋篛RG 0300H MOV A,R0ANL A,#0FH ;屏蔽高位MOV DPTR,#TAB MOVC A,@A+DPTRMOV R1,AORG 0380HTAB: DB ‘01234567’DB ‘89ABCDEF’END程序?yàn)椋?/p>
MOV DPTR,#TAB MOV A,R3 CLR C RLC A ;X*2 MOV R3,A XCH A,R2 RLC A XCH A,R2 ADD A,DPL ;加表首地址 MOV DPL, A MOV A,DPH ADDC A,R2 MOV DPH, A CLR A INC DPTR MOVC A,@A+DPTR MOV R3,A RETTAB: DW
…例3通過(guò)一個(gè)鍵盤輸入一組命令,完成不同的功能。解:設(shè)從鍵盤輸入的命令字符為‘A’、‘D’、‘E’、‘L’、‘M’、‘X’、‘Z’七種,當(dāng)鍵入不同的命令字符時(shí)轉(zhuǎn)向不同的處理程序,對(duì)應(yīng)的處理程序的入口標(biāo)號(hào)為XA、XD、XE、XL、XM、XX、XZ。由于輸入的字符之間很難找到什么規(guī)律,建立表格時(shí)將字符和其對(duì)應(yīng)的處理程序的地址一同存入。查表時(shí)先查找字符,其后就是處理程序的入口地址。表格以0為結(jié)束標(biāo)志。入口條件為:命令字符放在A中。程序:LTB: MOV DPTR,#TAB MOV B,ALOOP: CLR A MOVC A,@A+DPTR JZ LEND INC DPTR CJNZ A,B,LNF CLR A MOVC A,@A+DPTR ;取出入口地址第一個(gè)字節(jié) MOV B,A INC DPTR CLR A MOVC A,@A+DPTR MOV DPL, A MOV DPH, B CLR A JMP @A+DPTR ;轉(zhuǎn)向相應(yīng)處理程序LNF: INC DPTR INC DPTR ;繼續(xù)查 SJMP LOOPLEND: (查不到處理程序)TAB: DB ‘A’ DW XA DB ‘D’ DW XD DB ‘E’ DW XE DB ‘L’ DW XL DB ‘M’ DW XM DB ‘X’ DW XX DB ‘Z’ DW XZ DB 0 ;表格結(jié)束標(biāo)志4.6散轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序是一種并行多分支程序。它根據(jù)系統(tǒng)的某種輸入或運(yùn)算結(jié)果,分別轉(zhuǎn)向各個(gè)處理程序。與分支程序不同的是,散轉(zhuǎn)程序多采用指令:JMP@A+DPTR,根據(jù)輸入或運(yùn)算結(jié)果,確定A或DPTR的內(nèi)容,直接跳轉(zhuǎn)到相應(yīng)的分支程序中去。而分支程序一般是采用條件轉(zhuǎn)移指令或比較轉(zhuǎn)移指令實(shí)現(xiàn)程序的跳轉(zhuǎn)。K=?分支程序0分支程序1分支程序n···圖4-12散轉(zhuǎn)程序的結(jié)構(gòu)例1單片機(jī)四則運(yùn)算系統(tǒng)。解:在單片機(jī)系統(tǒng)中設(shè)置+、-、×、÷四個(gè)運(yùn)算命令鍵,它們的鍵號(hào)分別為0、1、2、3。當(dāng)其中一個(gè)鍵按下時(shí),進(jìn)行相應(yīng)的運(yùn)算。操作數(shù)由P1口和P3口輸入,結(jié)果再由Pl口和P3口輸出。具體如下:P1口輸入被加數(shù)、被減數(shù)、被乘數(shù)和被除數(shù),輸出結(jié)果的低8位或商;P3口輸入加數(shù)、減數(shù)、乘數(shù)和除數(shù),輸出進(jìn)位(借位)、結(jié)果的高8位以及余數(shù)。鍵號(hào)放入A中。程序?yàn)镕OUR: MOV P1,#00FH MOV P3,#00FH MOV DPTR,#TRJ4 RL A ;鍵號(hào)*2 JMP @DPTRTBJ4: AJMP PRG0 AJMP PRG1 AJMP PRG2 AJMP PRG3PROG0: MOV A,P1 ADD A,R3 MOV P1,A CLR A ADDC A,#0 ;進(jìn)位位放入A MOV P3,A RETPROG1: MOV A,P1 CLR C SUBB A,P3 MOV P1,A CLR A RLC A ;借位位放入A MOV P3,A RETPROG2:MOV A,P1 MOV B,P3 MUL AB MOV P1,A MOV P3,B RETPROG3: MOV A,P1 MOV B,P3 DIV AB MOV P1,A MOV P3,B RET例2根據(jù)(R3R2)的內(nèi)容轉(zhuǎn)向不同的處理程序解:程序?yàn)椋篔MPN: MOV DPTR,#TABN MOV A,R3 MOV B,#3 MUL AB ADD A,DPH MOV DPH, A MOV A,R2 MOV B,#3 MUL AB XCH A,B ADD A,DPH XCH A,B JMP @A+DPTRTABN: LJMP PRG0 LJMP PRG1 LJMP PRGN下面的例子是利用查表的方法來(lái)實(shí)現(xiàn)程序散轉(zhuǎn)的。例3根據(jù)R2的內(nèi)容轉(zhuǎn)向不同的處理程序。解:程序?yàn)椋篔MPN: MOV A,R2 MOV DPTR,#TABN MOVC A,@A+DPTR JMP @A+DPTRJBJN: DB PRG0 DB PRG2
DB PRGNPRG0:分支程序0PRG1:分支程序1
PRGN:分支程序n這類程序中,地址表和所有的分支程序必須設(shè)在256個(gè)字節(jié)中。例4根據(jù)R2的內(nèi)容轉(zhuǎn)向不同的處理程序。解:程序?yàn)椋?JMPN: MOV DPTR,#TAB MOV A,R2 MOV B,#2 MUL AB ADD A,DPL MOV DPL, A MOV A,B ADDC A,DPH MOV DPH, A CLR A MOVC A,@A+DPTR MOV R7,A CLR A INC DPTR MOVC A,@A+DPTR MOV DPH,A MOV DPL, R7 CLR A JMP @A+DPTR TABN: DW PRG0 DW PRG1
DW PRGN該散轉(zhuǎn)程序最多可以實(shí)現(xiàn)256個(gè)分支。4.7子程序設(shè)計(jì)在程序設(shè)計(jì)過(guò)程中,經(jīng)常遇到在程序的不同位置需使用完全相同的一段程序的情況。為了避免多次出現(xiàn)同一段程序,節(jié)省程序存儲(chǔ)器空間,可將這段程序?qū)懗瑟?dú)立的程序段,在任何需要的地方都可調(diào)用這段程序,運(yùn)行完這段程序后再返回原程序繼續(xù)運(yùn)行,這樣的獨(dú)立程序段就稱為子程序,而調(diào)用子程序的程序稱為主程序。調(diào)用子程序過(guò)程由調(diào)用指令完成,MCS-51單片機(jī)有二條調(diào)用指令:ACALLaddr11和LCALLaddrl6。指令中的地址為子程序的入口地址,在匯編語(yǔ)言中通常用標(biāo)號(hào)來(lái)代表。在執(zhí)行這二條指令時(shí),單片機(jī)將當(dāng)前的PC值壓入堆棧。子程序的最后是返回指令RET,這條指令將堆棧的內(nèi)容傳入PC中,保證程序返回調(diào)用的地方繼續(xù)運(yùn)行。在子程序調(diào)用時(shí),先將這些內(nèi)容保存起來(lái),子程序返回前再恢復(fù)原來(lái)的內(nèi)容、這一過(guò)程稱為保護(hù)現(xiàn)場(chǎng)。保護(hù)現(xiàn)場(chǎng)通常由堆棧來(lái)完成。在子程序調(diào)用時(shí),主程序應(yīng)先把有關(guān)參數(shù)放到某些約定的位置,子程序運(yùn)行時(shí),可以從約定位置得到這些參數(shù)。在子程序執(zhí)行過(guò)程中調(diào)用其它子程序,這種現(xiàn)象稱為子程序嵌套。MCS-5l單片機(jī)允許多重嵌套。子程序的結(jié)構(gòu)與一般程序沒(méi)有什么差別,最重要的標(biāo)志是在其最后有一條返回指令。另外,在需要保護(hù)現(xiàn)場(chǎng)時(shí),子程序的開(kāi)始和結(jié)束都有入棧和出棧指令。以下例子主要是說(shuō)明子程序的調(diào)用過(guò)程和參數(shù)傳遞的方法。例1單字節(jié)有符號(hào)數(shù)的加、減法程序。解:該程序的功能為(R2)±(R3)→R7,R2和R3中為有符號(hào)數(shù)的原碼,R7中存放計(jì)算結(jié)果的原碼。運(yùn)算結(jié)果溢出時(shí)OV置位。程序?yàn)椋篠UB1: MOV A,R3 CPL ACC.7 ;符號(hào)位取反 MOV R3,AADD1: MOV A,R3 ACALL CMPT ;加數(shù)或減數(shù)求補(bǔ) MOV R3,A MOV A,R2 ACALL CMPT ;被加數(shù)或被減數(shù)求補(bǔ) MOV R7,AOVER: RETSUBl為減法程序入口,ADDl為加法程序入口。CMPT為單字節(jié)有符號(hào)數(shù)求補(bǔ)碼程序,參見(jiàn)4.3節(jié)例1。本例中,參數(shù)傳遞是通過(guò)累加器A完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送到A中。子程序?qū)中的有符號(hào)數(shù)求補(bǔ)后,存于A中。主程序可從A中得到運(yùn)算結(jié)果。例24位BCD碼的減法程序。解:由于BCD碼調(diào)整指令在減法指令后面是不起作用的,因此不能用直接采用BCD碼調(diào)整指令來(lái)完成BCD碼的減法運(yùn)算。本例是BCD碼減法運(yùn)算的一種方法。設(shè)被減數(shù)放在50H和5lH單元中,減數(shù)放在60H和61H中,差放入40H和41中。;主程序 MOV R1,#50H MOV R0,#60H CLR C ACALL BSUB MOV 40H, A ACALL BUSB MOV 41H, A
;子程序BSUB: MOV A,#9AH SUBB A,@R0 ADD A,@R1 DA A INC R0 INC R1 CPL C RET4.8浮點(diǎn)數(shù)及其程序設(shè)計(jì)在單片機(jī)應(yīng)用系統(tǒng)的數(shù)據(jù)處理過(guò)程中,經(jīng)常會(huì)遇到小數(shù)的運(yùn)算問(wèn)題,表示小數(shù)的方法一般有兩種,定點(diǎn)數(shù)和浮點(diǎn)數(shù)。在二進(jìn)制效中,可用類似科學(xué)計(jì)數(shù)法的方法來(lái)表示一個(gè)數(shù),如一般表達(dá)式為N=S×2p在這種表示方法中,數(shù)值由四個(gè)部分組成,即尾數(shù)S及符號(hào),階碼P及符號(hào)。在二進(jìn)制中,通過(guò)定義相應(yīng)字節(jié)或位來(lái)表示這四部分,就形成了二進(jìn)制浮點(diǎn)數(shù)。二進(jìn)制浮點(diǎn)數(shù)可以有多種不同的表示方法,下面是一種常見(jiàn)的三字節(jié)浮點(diǎn)數(shù)的格式:其中尾數(shù)占16位,階碼占6位,階符占1位,數(shù)符占1位。階碼通常用補(bǔ)碼來(lái)表示。在這種表示方法中,小數(shù)點(diǎn)的實(shí)際位置要由階碼來(lái)確定,而階碼又是可變的,因此稱為浮點(diǎn)數(shù)。4.8.2規(guī)格化浮點(diǎn)數(shù)同一個(gè)數(shù)用浮點(diǎn)數(shù)表示可以是不同的,如1234.75=0B9A58H=0C4D2CH=0D2696H雖然這幾種表示其數(shù)值是相同的,但其尾數(shù)的有效數(shù)字的位數(shù)不同,分別為16位、15位和14位。在運(yùn)算過(guò)程中,為了最大限度地保持運(yùn)算精度,應(yīng)盡量增加尾數(shù)的有效位數(shù)。這就需要對(duì)浮點(diǎn)數(shù)進(jìn)行規(guī)格化處理。在只考慮用二進(jìn)制原碼表示尾數(shù)時(shí),尾數(shù)的最高位為l,則該浮點(diǎn)數(shù)為規(guī)格化浮點(diǎn)數(shù)。在規(guī)格化浮點(diǎn)數(shù)中,用尾數(shù)為0和最小階碼表示0,三字節(jié)規(guī)格化浮點(diǎn)數(shù)的0表示為410000H。浮點(diǎn)數(shù)在運(yùn)算之前和運(yùn)算之后都要進(jìn)行規(guī)格化,規(guī)格化過(guò)程包括以下步驟:(1)首先判斷尾是否為0,如果為0,規(guī)格化結(jié)果為410000H;(2)如果尾數(shù)不為0,判斷層數(shù)的最高位是否為1,如果不為1,尾數(shù)左移,階碼減1;(3)再判斷層數(shù)的最高位是否為1,如果不為1,繼續(xù)進(jìn)行規(guī)格化操作,如果為1,則規(guī)格化結(jié)束。4.8.3浮點(diǎn)數(shù)運(yùn)算浮點(diǎn)數(shù)的加、減運(yùn)算浮點(diǎn)數(shù)的運(yùn)算就是求結(jié)果的尾數(shù)、數(shù)符、階碼包括階符的過(guò)程。例1解:132.25+69.75=088444H+078B80H=088444H+0845C0H=08CA00H=202由于兩個(gè)浮點(diǎn)數(shù)的階碼分別為8和7,先將加數(shù)的階碼變?yōu)?,其尾數(shù)右移1位。兩個(gè)數(shù)的階碼相同后,尾數(shù)直接相加即為和的尾數(shù),和的尾數(shù)的最高位為1,為規(guī)格化浮點(diǎn)數(shù)。例2本例中被減數(shù)小于減數(shù),差為負(fù)數(shù),結(jié)果的數(shù)符為1。差的階碼為兩個(gè)數(shù)中較大的階碼2.浮點(diǎn)數(shù)乘法運(yùn)算如果設(shè)參加運(yùn)算的兩個(gè)操作數(shù)分別表示為Na=(-1)SSa×Sa×2PaNb=(-1)SSb×Sb×2Pb它們的積為N=Na×Nb=(-1)SSa+SSb×(Sa×Sb)×2Pa+Pb式中SSa和SSb為兩個(gè)數(shù)的數(shù)符。
乘法運(yùn)算可總結(jié)為:(1)積的數(shù)符為乘數(shù)的符號(hào)位和被乘數(shù)的符號(hào)位按模2求和,即異或;(2)積的階為乘數(shù)和被乘數(shù)的階的和;(3)積的尾數(shù)為被乘數(shù)和乘數(shù)的尾數(shù)的積。參加運(yùn)算的浮點(diǎn)數(shù)一般都是規(guī)格化的浮點(diǎn)數(shù),尾數(shù)的積小于1,不需進(jìn)行右規(guī)格化處理。但有可能小于0.5,所以需進(jìn)行左規(guī)格化處理,使積為規(guī)格化浮點(diǎn)數(shù)。如果乘數(shù)或被乘數(shù)的尾為0、則積為410000H。由于在尾數(shù)相乘時(shí),積的低16位不能反映在結(jié)果中,因此,積可能會(huì)產(chǎn)生一定的誤差。例3算22.4l×4.23。積的階為乘數(shù)和被乘數(shù)的和,即8。尾數(shù)相乘時(shí),積小于0.5,進(jìn)行左規(guī)格化處理,階碼變?yōu)?。例4計(jì)算2586.5×(-6.91)。解:2586.5×(-6.91)=0CA1BOH×83DD13H=8F8BA0H=-17872被乘數(shù)為正數(shù),數(shù)符為0,乘數(shù)為負(fù)數(shù),數(shù)符為1,積的數(shù)符為0⊕1=1,積為負(fù)數(shù)。3.浮點(diǎn)數(shù)的除法運(yùn)算除法運(yùn)算可以表示為N=Na/Nb=[(-1)SSa×Sa×2Pa]/[(-1)SSb×Sb×2Pb]=(-1)SSa-SSb×(Sa/Sb)×2Pa-Pb浮點(diǎn)數(shù)的除法運(yùn)算可以總結(jié)為:(1)商的數(shù)符為被除數(shù)與除數(shù)的符號(hào)位的差;(2)商的階碼為被除數(shù)和除數(shù)的階碼的差;(3)商的尾數(shù)為被除數(shù)和除數(shù)的尾數(shù)的商。規(guī)格化的浮點(diǎn)數(shù)進(jìn)行除法運(yùn)算時(shí),尾數(shù)相除,商不會(huì)小于0.5,不需進(jìn)行左規(guī)格化處理。但有可能大于1,有時(shí)需進(jìn)行右規(guī)格化處理。例5計(jì)算390.67÷14.3l。商的階碼為被除數(shù)與除數(shù)的階碼的差。尾數(shù)相除時(shí),結(jié)果的最高位為1,商為規(guī)格化浮點(diǎn)數(shù)。例6計(jì)算-6.02÷16.157。異號(hào)相除時(shí),商為負(fù)數(shù)。由于被除數(shù)的尾數(shù)大于除數(shù)的尾數(shù),所以被除數(shù)先進(jìn)行右規(guī)格化,階碼變?yōu)?,商的階碼為-1,用補(bǔ)碼來(lái)表示。4.8.4浮點(diǎn)數(shù)運(yùn)算子程序1.浮點(diǎn)數(shù)通用規(guī)格化子程序在浮點(diǎn)數(shù)運(yùn)算過(guò)程中,有時(shí)需要左規(guī)格化,有時(shí)需要右規(guī)格化。通過(guò)規(guī)格化子程序既可實(shí)現(xiàn)左規(guī)格化,又可實(shí)現(xiàn)右規(guī)格化,其具體功能如下:當(dāng)Cy=0時(shí),進(jìn)行右規(guī)格化:F0=0時(shí).對(duì)R6(階)R2R3(尾數(shù))右規(guī)格化1位;F0=1時(shí),對(duì)R7(階)R4R5(尾數(shù))右規(guī)格化1位。當(dāng)Cy=1時(shí),對(duì)R6(階)R3R3(尾數(shù))執(zhí)行左規(guī)格化。程序開(kāi)始時(shí),判斷是執(zhí)行左規(guī)格化還是右規(guī)格化。如果是右規(guī)格化,還要判斷是對(duì)R6(階)R2R3(尾數(shù))還是對(duì)R7(階)R4R5(尾數(shù))進(jìn)行規(guī)格化。如果是左規(guī)格化,直至把操作數(shù)變?yōu)橐?guī)格化浮點(diǎn)數(shù)。開(kāi)始Cy=1?Cy←B34HFO=0?R2R3右移階碼+1R4R5右移階碼+1(R2R3)=0?A←(R2)R6←41HACC.7=1?階碼-1R2R3左移結(jié)束程序框圖
程序?yàn)椋篎SDT: JC LNORMS MOV C,39H ;進(jìn)行右規(guī)格化 JB F0,NR7 MOV A,R2 ;R2R3右移一位 RRC A ;(Cy)移入尾數(shù)最高位 MOV R2,A MOV A,R3 RRC A MOV R3,A INC R6 ;階碼加1RET NR7: MOV A,R4 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A INC R7 RETLNORMS:MOV A,R7 JNZ LSHIFT CJNE R3,#00H,LSBIT8 ;尾數(shù)為0,階碼41H MOV R6,#41HLSEND: RETLSHIFT: JB ACC.7,LSENDLSBIT8: MOV C,F0 MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A CLR F0 DEC R6 SJMP LNORMS2.浮點(diǎn)數(shù)加減運(yùn)算子程序下面是三字節(jié)浮點(diǎn)數(shù)加、減法處理于程序,具體功能為:R6(階)R2R3(尾)±R7(階)R4R5(尾)→R4(階)R2R3(尾);當(dāng)位3AH=0時(shí),執(zhí)行加法;當(dāng)位3AH=1時(shí),執(zhí)行減法。YesNoNoNoYes尾數(shù)相減右規(guī)格化開(kāi)始符號(hào)相同嗎?B3AH←B3AH階相同嗎?B3AH=1?尾數(shù)相加右規(guī)格化返回對(duì)階Yes圖4-14程序框圖
程序如下:FABP:MOV A,R6 MOV 38
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 定點(diǎn)家具采購(gòu)合同協(xié)議
- 建車棚子合同協(xié)議
- 家政衛(wèi)生合同協(xié)議范本
- 2024年衛(wèi)生管理證書(shū)考試試題及答案積極
- 護(hù)士資格證考試考核方式試題及答案
- 2024年衛(wèi)生管理考試調(diào)整內(nèi)容試題及答案
- 護(hù)士資格證面試準(zhǔn)備試題及答案
- 2024年衛(wèi)生管理學(xué)可以試題及答案
- 2024年光電工程師證書(shū)考前模擬試題及答案
- 探討母豬行為特征的試題及答案
- 2025年四川雅安市名山區(qū)茗城有限公司招聘筆試參考題庫(kù)含答案解析
- 2022年湖南省岳陽(yáng)市華容縣小升初語(yǔ)文試卷
- 【北京】《總也倒不了的老屋》名師課件(第二課時(shí))
- 《肺的結(jié)構(gòu)和功能》課件
- 事業(yè)單位考試綜合基礎(chǔ)知識(shí)真題及解析
- 貸款免息申請(qǐng)書(shū)
- 光伏安裝勞務(wù)分包合同
- 長(zhǎng)期護(hù)理保障失能等級(jí)評(píng)估規(guī)范
- 2025年中國(guó)建材集團(tuán)財(cái)務(wù)有限公司招聘筆試參考題庫(kù)含答案解析
- 匯流箱工作原理及日常維護(hù)培訓(xùn)課件
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗(yàn)
評(píng)論
0/150
提交評(píng)論