




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第4章章 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì) 4.1 匯編語(yǔ)言程序設(shè)計(jì)方法匯編語(yǔ)言程序設(shè)計(jì)方法 4.2 匯編語(yǔ)言源程序的基本結(jié)構(gòu)匯編語(yǔ)言源程序的基本結(jié)構(gòu)順序、循環(huán)、分支、子程序順序、循環(huán)、分支、子程序 4.3 常用程序設(shè)計(jì)舉例常用程序設(shè)計(jì)舉例 4.1.1 程序的設(shè)計(jì)步驟與方法程序的設(shè)計(jì)步驟與方法 匯編和高級(jí)語(yǔ)言程序設(shè)計(jì)的過(guò)程:匯編和高級(jí)語(yǔ)言程序設(shè)計(jì)的過(guò)程: 首先對(duì)問(wèn)題進(jìn)行分析,然后確定算法,再根據(jù)算法首先對(duì)問(wèn)題進(jìn)行分析,然后確定算法,再根據(jù)算法流程編寫(xiě)程序,最后是調(diào)試程序。流程編寫(xiě)程序,最后是調(diào)試程序。 匯編語(yǔ)言程序設(shè)計(jì)的匯編語(yǔ)言程序設(shè)計(jì)的獨(dú)特點(diǎn)獨(dú)特點(diǎn)在于:在于: (1) 用匯編語(yǔ)言進(jìn)行程序設(shè)
2、計(jì)時(shí),對(duì)用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)時(shí),對(duì)數(shù)據(jù)的存放、寄存器數(shù)據(jù)的存放、寄存器和工作單元的使用等要由設(shè)計(jì)者安排和工作單元的使用等要由設(shè)計(jì)者安排。而高級(jí)語(yǔ)言程序設(shè)計(jì)。而高級(jí)語(yǔ)言程序設(shè)計(jì)時(shí),這些工作都由計(jì)算機(jī)軟件安排,程序設(shè)計(jì)者不必考慮。時(shí),這些工作都由計(jì)算機(jī)軟件安排,程序設(shè)計(jì)者不必考慮。(2) 匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解。特別是對(duì)。特別是對(duì)各類(lèi)各類(lèi)寄存器、端口、定時(shí)器寄存器、端口、定時(shí)器/計(jì)數(shù)器、中斷等計(jì)數(shù)器、中斷等內(nèi)容要熟悉,內(nèi)容要熟悉,以便在程序設(shè)計(jì)時(shí)能熟練使用。以便在程序設(shè)計(jì)
3、時(shí)能熟練使用。匯編語(yǔ)言程序的設(shè)計(jì)步驟:匯編語(yǔ)言程序的設(shè)計(jì)步驟:(1)分析問(wèn)題,抽象出描述問(wèn)題的數(shù)學(xué)模型)分析問(wèn)題,抽象出描述問(wèn)題的數(shù)學(xué)模型(2)確定解決問(wèn)題的算法)確定解決問(wèn)題的算法(3)分配存儲(chǔ)空間及工作單元)分配存儲(chǔ)空間及工作單元(4)根據(jù)算法繪制流程圖)根據(jù)算法繪制流程圖(5)編寫(xiě)源程序)編寫(xiě)源程序(6)上機(jī)調(diào)試)上機(jī)調(diào)試程序質(zhì)量的判斷標(biāo)準(zhǔn):程序質(zhì)量的判斷標(biāo)準(zhǔn):程序的執(zhí)行時(shí)間短;占用的內(nèi)存單元少;程序的語(yǔ)句行程序的執(zhí)行時(shí)間短;占用的內(nèi)存單元少;程序的語(yǔ)句行數(shù)少。數(shù)少。4.1.2 匯編語(yǔ)言源程序的編輯和匯編匯編語(yǔ)言源程序的編輯和匯編 1. 匯編語(yǔ)言源程序的編輯匯編語(yǔ)言源程序的編輯 編輯好的
4、源程序應(yīng)以“. ASM”擴(kuò)展名存盤(pán) 2. 匯編語(yǔ)言源程序的匯編匯編語(yǔ)言源程序的匯編 源程序經(jīng)機(jī)器匯編之后,若無(wú)語(yǔ)法錯(cuò)誤,一般將生成兩個(gè)新文件,它們的擴(kuò)展名分別是.OBJ和.LST。 例例4-1 將內(nèi)部將內(nèi)部RAM從從30H開(kāi)始的開(kāi)始的10個(gè)單元的內(nèi)容個(gè)單元的內(nèi)容相加,其和保存于相加,其和保存于A(假設(shè)其和仍為(假設(shè)其和仍為8位數(shù))。位數(shù))。列表文件(列表文件(.LST)信息如下:)信息如下:地址地址 機(jī)器碼機(jī)器碼 匯編語(yǔ)言源程序匯編語(yǔ)言源程序 注釋注釋 ORG2000H ;定義程序起始地址;定義程序起始地址2000 7830 START:MOVR0,#30H;初始地址送;初始地址送R02002
5、 7A0A MOVR2,#10;循環(huán)初始值送;循環(huán)初始值送R22004 7400 MOVA,#00H;累加和初始值送;累加和初始值送A2006 26 LOOP:ADDCA,R0;完成累加;完成累加2007 08 INCR0 ;修改地址;修改地址2008 DAFC DJNZR2,LOOP;循環(huán)判斷;循環(huán)判斷200A 80FE SJMP$;暫停;暫停 END ;程序結(jié)束;程序結(jié)束INCLUDE IN HASHTABSTART:2000LOOP:2006目標(biāo)文件(目標(biāo)文件(.OBJ)信息如下:)信息如下:2000200C78307A0A74002608DAFC80FE 4.2 4.2 匯編語(yǔ)言源程序
6、的基本結(jié)構(gòu)匯編語(yǔ)言源程序的基本結(jié)構(gòu) 共有四種結(jié)構(gòu)形式:共有四種結(jié)構(gòu)形式: 順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序結(jié)構(gòu)。序結(jié)構(gòu)。方法一:用邏輯指令將高、低半字節(jié)分開(kāi),對(duì)數(shù)字方法一:用邏輯指令將高、低半字節(jié)分開(kāi),對(duì)數(shù)字09加上加上30H即可得到即可得到所對(duì)應(yīng)的所對(duì)應(yīng)的ASCII碼碼30H39H。 ORG2000HMOVA,40H;取數(shù);取數(shù)ANLA,#0FH;分離出低半字節(jié);分離出低半字節(jié)ADDA,#30H;變?yōu)椋蛔優(yōu)锳SCII碼碼MOV42H,A;保存;保存MOVA,40H;重新取數(shù);重新取數(shù)SWAPA;高、低半字節(jié)交換;高、低半字節(jié)交換ANLA,#0FH;分離出
7、高半字節(jié);分離出高半字節(jié)ADDA,#30H;變?yōu)椋蛔優(yōu)锳SCII碼碼MOV41H,A;保存;保存END例例4-2 將將40H單元的高、低半字節(jié)的兩個(gè)單元的高、低半字節(jié)的兩個(gè)BCD碼拆開(kāi)并變碼拆開(kāi)并變成其成其ASCII碼,并分別存入碼,并分別存入41H和和42H單元單元 4.2.1 4.2.1 順序結(jié)構(gòu)順序結(jié)構(gòu)方法二:采用方法二:采用BCD數(shù)除以數(shù)除以10H的方法,可把處于高、低半字節(jié)的兩個(gè)的方法,可把處于高、低半字節(jié)的兩個(gè)BCD碼分別移到碼分別移到A和和B的低的低4位,然后再各自與位,然后再各自與30H相相“或或”即變?yōu)榧醋優(yōu)锳SCII碼。參碼。參考程序如下:考程序如下:ORG2000HMOV
8、A,40H;取數(shù);取數(shù)MOVB,#10H;送被除數(shù);送被除數(shù)DIVAB;分離高、低半字節(jié);分離高、低半字節(jié)ORLB,#30H;低;低4位調(diào)整為位調(diào)整為ASCII碼碼MOV42H,BORLA,#30H;高;高4位調(diào)整為位調(diào)整為ASCII碼碼MOV41H,AEND例例4-2 將將40H單元的高、低半字節(jié)的兩個(gè)單元的高、低半字節(jié)的兩個(gè)BCD碼拆開(kāi)并變碼拆開(kāi)并變成其成其ASCII碼,并分別存入碼,并分別存入41H和和42H單元單元 例(附例(附1 1) 求兩個(gè)求兩個(gè)8 8位無(wú)符號(hào)數(shù)的和。位無(wú)符號(hào)數(shù)的和。設(shè)兩個(gè)設(shè)兩個(gè)8 8位無(wú)符號(hào)數(shù)分別存放在內(nèi)部位無(wú)符號(hào)數(shù)分別存放在內(nèi)部RAM RAM 20H20H和和2
9、1H21H單元,所求和(不超過(guò)單元,所求和(不超過(guò)255255)存放)存放在在22H22H單元。單元。ORG 2000HSTART:MOV R0,#20HMOVA,R0INCR0ADDA,R0INC R0MOVR0,ASJMP$END只只有有這這一一種種方方法法嗎?嗎?例(附例(附2 2) 求兩個(gè)求兩個(gè)8 8位無(wú)符號(hào)數(shù)的和。位無(wú)符號(hào)數(shù)的和。設(shè)兩個(gè)設(shè)兩個(gè)8 8位無(wú)符號(hào)數(shù)分別存放在內(nèi)部位無(wú)符號(hào)數(shù)分別存放在內(nèi)部RAM RAM 20H20H和和21H21H單元,所求和(不超過(guò)單元,所求和(不超過(guò)255255)存放)存放在在22H22H單元。單元。ORG 2000HSTART:MOV A, 20HADD
10、A,21HMOV 23H,ASJMP $END4.2.2 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 循環(huán)初態(tài)循環(huán)初態(tài)圖圖a a為先執(zhí)行后判斷,相當(dāng)于為先執(zhí)行后判斷,相當(dāng)于直到(直到(untiluntil)型循環(huán))型循環(huán)。圖圖b b為先判斷后執(zhí)行,相當(dāng)于為先判斷后執(zhí)行,相當(dāng)于當(dāng)(當(dāng)(do-whiledo-while)型循環(huán))型循環(huán)。 循環(huán)程序一般由四個(gè)主要部分組成循環(huán)程序一般由四個(gè)主要部分組成: (1) 初始化部分初始化部分: 為循環(huán)程序做準(zhǔn)備為循環(huán)程序做準(zhǔn)備, 如規(guī)定循環(huán)次數(shù)、如規(guī)定循環(huán)次數(shù)、 給給各變量和地址指針預(yù)置初值。各變量和地址指針預(yù)置初值。 (2) 處理部分處理部分: 為反復(fù)執(zhí)行的程序段為反復(fù)執(zhí)行的
11、程序段, 是循環(huán)程序的實(shí)體是循環(huán)程序的實(shí)體, 也也是循環(huán)程序的主體。是循環(huán)程序的主體。 (3) 循環(huán)控制部分循環(huán)控制部分: 這部分的作用是修改循環(huán)變量和控制變這部分的作用是修改循環(huán)變量和控制變量量, 并判斷循環(huán)是否結(jié)束并判斷循環(huán)是否結(jié)束, 直到符合結(jié)束條件時(shí)直到符合結(jié)束條件時(shí), 跳出循環(huán)為止。跳出循環(huán)為止。 (4) 結(jié)束部分結(jié)束部分: 這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、 處理和存放。處理和存放。 循環(huán):?jiǎn)沃匮h(huán)循環(huán):?jiǎn)沃匮h(huán) 多重循環(huán)(二重以上)循環(huán)嵌套。多重循環(huán)(二重以上)循環(huán)嵌套。 在多重循環(huán)程序中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)程在多重循環(huán)程序中,只
12、允許外重循環(huán)嵌套內(nèi)重循環(huán)程序,而不允許循環(huán)體互相交叉,另外,也不允許從循環(huán)程序序,而不允許循環(huán)體互相交叉,另外,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。的外部跳入循環(huán)程序的內(nèi)部。例例4-3 4-3 把外部把外部RAM 5000H50FFHRAM 5000H50FFH單元的內(nèi)容清零單元的內(nèi)容清零。ORG 2000HSTART1:MOV DPTR,#5000H ;循環(huán)初始化;循環(huán)初始化MOV R0,#00HMOV A,#00HLOOP1:MOVXDPTR, A;循環(huán)體;循環(huán)體INCDPTRINCR0DJNZ R0,LOOP1 ;循環(huán)控制;循環(huán)控制END例例4-4 4-4 將內(nèi)部將內(nèi)部RAMRA
13、M從從40H40H開(kāi)始連續(xù)單元的數(shù)據(jù)傳送到開(kāi)始連續(xù)單元的數(shù)據(jù)傳送到外部外部RAMRAM從從2000H2000H開(kāi)始的連續(xù)單元中,當(dāng)所傳送的數(shù)據(jù)開(kāi)始的連續(xù)單元中,當(dāng)所傳送的數(shù)據(jù)為為0FFH0FFH時(shí),傳送停止。時(shí),傳送停止。解:解: ORG2000H MOV R0,#40H ;循環(huán)初始化;循環(huán)初始化MOVDPTR,#2000HLOOP:MOVA,R0 CJNE A,#0FFH,LOOP1 ;循環(huán)控制循環(huán)控制 SJMPNEXTLOOP1:MOVX DPTR,A ;循環(huán)體;循環(huán)體 INC R0 INC DPTR SJMP LOOP NEXT:SJMP$END 例例4-5 4-5 從從P1P1口重復(fù)口
14、重復(fù)256256次讀數(shù)并取平均值,平均值次讀數(shù)并取平均值,平均值的整數(shù)和小數(shù)部分分別保存于內(nèi)部的整數(shù)和小數(shù)部分分別保存于內(nèi)部RAMRAM的的30H30H和和31H31H單元單元中。中。解:假設(shè)將解:假設(shè)將R2 R3作為作為16位寄存器以保存連續(xù)位寄存器以保存連續(xù) 256次讀數(shù)的累加和次讀數(shù)的累加和 ORG 4000HINTEGER EQU30HDECIMAL EQU31HAVR:MOV R2,#0 ;循環(huán)初始化;循環(huán)初始化 MOV R3,#0 MOV R4, #0;累加次數(shù)為;累加次數(shù)為256AVR1:MOV A,P1;循環(huán)體;循環(huán)體 ADD A,R3;累加至低;累加至低 8位位 JNC AV
15、R2;無(wú)進(jìn)位則暫存結(jié)果;無(wú)進(jìn)位則暫存結(jié)果 INC R2;有進(jìn)位則高;有進(jìn)位則高8位加增位加增 1AVR2:MOV R3,A ;暫存低;暫存低 8位位 DJNZ R4,AVR1;循環(huán)控制;循環(huán)控制 MOV INTEGER,R2MOVDECIMAL,R3END例例( (附附2 2)設(shè)單片機(jī)外部數(shù)據(jù)存儲(chǔ)器起始地址為)設(shè)單片機(jī)外部數(shù)據(jù)存儲(chǔ)器起始地址為3000H3000H的數(shù)據(jù)塊中有的數(shù)據(jù)塊中有100100個(gè)補(bǔ)碼,要求逐一檢查,若為負(fù)數(shù)則個(gè)補(bǔ)碼,要求逐一檢查,若為負(fù)數(shù)則求補(bǔ)后放回,正數(shù)則不變。求補(bǔ)后放回,正數(shù)則不變。ORG 1000HSTART1:MOVR7, #64H;設(shè)置循環(huán)初始值;設(shè)置循環(huán)初始值M
16、OVDPTR, #3000HLOOP1:MOVX A , DPTR JNBACC.7,LOOP2CPLAINCAMOVX DPTR,ALOOP2:INCDPTR;外部;外部RAM單元加單元加1DJNZ R7,LOOP1END例(附例(附3 3)有)有1010個(gè)無(wú)符號(hào)數(shù)依次存放在內(nèi)部個(gè)無(wú)符號(hào)數(shù)依次存放在內(nèi)部RAM 30HRAM 30H開(kāi)始的單元中,求其開(kāi)始的單元中,求其和,并將結(jié)果放在和,并將結(jié)果放在R2R2和和R3R3中。中。ORG 2000HMOVR0,#30HMOVR2,#00HMOVR3,#00HMOVR7,#0AHNEXT:MOVA, R0;設(shè)置循環(huán)初始值;設(shè)置循環(huán)初始值A(chǔ)DDA,R3
17、MOVR3,AMOVA,R2ADDCA,#00HMOVR2,AINCR0DJNZR7,NEXTSJMP$END例例4.64.6設(shè)設(shè)MCS-51MCS-51單片機(jī)的時(shí)鐘頻率為單片機(jī)的時(shí)鐘頻率為fosc = 12 MHzfosc = 12 MHz,試設(shè)計(jì),試設(shè)計(jì)延時(shí)延時(shí)50ms50ms的延時(shí)程序的延時(shí)程序。 延時(shí)程序所花費(fèi)的時(shí)間是該程序指令的總機(jī)器周期數(shù)與機(jī)延時(shí)程序所花費(fèi)的時(shí)間是該程序指令的總機(jī)器周期數(shù)與機(jī)器周期的乘積。器周期的乘積。通常,延時(shí)程序采用通常,延時(shí)程序采用MOV和和DJNZ指令來(lái)實(shí)現(xiàn)。指令來(lái)實(shí)現(xiàn)。單循環(huán)延時(shí)程序,最大的循環(huán)次數(shù)位單循環(huán)延時(shí)程序,最大的循環(huán)次數(shù)位256,則程序段為:,則
18、程序段為: MOV R0,#00H ;機(jī)器周期數(shù)為;機(jī)器周期數(shù)為1 DJNZ R0,$ ;機(jī)器周期數(shù)為;機(jī)器周期數(shù)為2若單片機(jī)晶振為若單片機(jī)晶振為12MHz,則一個(gè)機(jī)器周期為,則一個(gè)機(jī)器周期為1us。延時(shí)時(shí)間:(延時(shí)時(shí)間:(1+2562)1s513s。 需采用多重循環(huán)。需采用多重循環(huán)。 MOV R1,#M LOOP:MOV R2,#NNOPDJNZ R2,$ DJNZ R1,LOOP內(nèi)層循環(huán)的機(jī)器周期數(shù)為內(nèi)層循環(huán)的機(jī)器周期數(shù)為T(mén)n=1+1+2*N,總機(jī)器周期數(shù)為總機(jī)器周期數(shù)為T(mén)m(Tn+2)*M+1.設(shè)設(shè)N=123,M=200,則延時(shí)時(shí)間為,則延時(shí)時(shí)間為50.001ms。修改后程序清單:修改后
19、程序清單:ORG 2000HMOV R1,#0C8H(200) LOOP:MOV R2,#7BH(123)NOPDJNZ R2,$ DJNZ R1,LOOPSJMP $END補(bǔ)充例補(bǔ)充例4 4 設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加被加數(shù):內(nèi)部被加數(shù):內(nèi)部RAM 22H20H單元(低位在低字節(jié)),單元(低位在低字節(jié)),加數(shù):加數(shù): 內(nèi)部?jī)?nèi)部RAM 32H30H單元(低位在低字節(jié)),單元(低位在低字節(jié)),結(jié)果:存于內(nèi)部結(jié)果:存于內(nèi)部RAM 22H20H單元,進(jìn)位位存于單元,進(jìn)位位存于23H單單元。元。 利用利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。指令進(jìn)行多字節(jié)加法運(yùn)算。ORG 4200H MOV
20、R0,#20H;被加數(shù)的低字節(jié)地址;被加數(shù)的低字節(jié)地址MOV R1,#30H;加數(shù)的低字節(jié)地址;加數(shù)的低字節(jié)地址MOV R2,#03H;循環(huán)次數(shù);循環(huán)次數(shù)CLRCLOOP: MOV A, R0ADDC A, R1;低字節(jié)相加;低字節(jié)相加MOV R0,A;存放字節(jié)相加結(jié)果;存放字節(jié)相加結(jié)果INC R0INC R1DJNZ R2, LOOP;循環(huán)控制;循環(huán)控制MOV A, #00HADDC A,#00HMOV R0, A;進(jìn)位位送;進(jìn)位位送23HEND4.2.3 分支程序分支程序 分支程序的基本結(jié)構(gòu):?jiǎn)畏种Ш投喾种А7种С绦虻幕窘Y(jié)構(gòu):?jiǎn)畏种Ш投喾种АF涮攸c(diǎn)是:各處理模塊是相互排斥的。其特點(diǎn)是:各
21、處理模塊是相互排斥的。13條條件轉(zhuǎn)移指令,條條件轉(zhuǎn)移指令,分別為分別為: JZ,JNZ: 累加器判零轉(zhuǎn)移指令累加器判零轉(zhuǎn)移指令;CJNE: 比較條件轉(zhuǎn)移指令比較條件轉(zhuǎn)移指令;DJNZ: 減減1條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令; JC, JNC , JB,JNB,JBC: 位控制條件轉(zhuǎn)移指令等四類(lèi)。位控制條件轉(zhuǎn)移指令等四類(lèi)。(1)單重分支結(jié)構(gòu)單重分支結(jié)構(gòu)例例4-7 4-7 片內(nèi)片內(nèi)RAM DATA1RAM DATA1和和DATA2DATA2兩個(gè)單元中各存有一個(gè)無(wú)符兩個(gè)單元中各存有一個(gè)無(wú)符號(hào)數(shù)字,將兩個(gè)數(shù)中的小者存入號(hào)數(shù)字,將兩個(gè)數(shù)中的小者存入MINMIN單元。單元。ORG 4000HMINEQU30HD
22、ATA1EQU31HDATA2EQU32HMOVA,DATA1;第一數(shù)送;第一數(shù)送ACLRCCJNEA,DATA2,UNEQU;兩數(shù)比較;兩數(shù)比較SJMPSTORE;相等,;相等,DATA1作為小的數(shù)作為小的數(shù)UNEQU:JCSTORE;有借位,;有借位,DATA1為小為小MOVA,DATA2;無(wú)借位,;無(wú)借位,DATA2為小為小STORE:MOVMIN,A;小者送;小者送RAMEND例例4-8 4-8 片內(nèi)片內(nèi)RAMRAM兩個(gè)單元中存有不相等的有符號(hào)數(shù)字兩個(gè)單元中存有不相等的有符號(hào)數(shù)字X X和和Y Y,比較兩數(shù)的大小,并將大數(shù)存入比較兩數(shù)的大小,并將大數(shù)存入MAXMAX單元。單元。 若若X-
23、Y0,則當(dāng)(,則當(dāng)(OV)0時(shí),時(shí),XY; 當(dāng)(當(dāng)(OV)1時(shí),時(shí),XY;若若X-Y0,則當(dāng)(,則當(dāng)(OV)0時(shí),時(shí),XY; 當(dāng)(當(dāng)(OV)1時(shí),時(shí),XY。圖4-6 例4-8的流程圖X送MAXX=Y ?Y分支0N(X-Y)0?YOV=1?NOV=1 ?Y送MAXNNYYORG1000HXDEQU31HYDEQU32HMAXEQU30HCLRCMOVA,XDSUBBA,YD;X-Y,形成,形成OV標(biāo)志標(biāo)志JZXMAX;若;若X=Y,則轉(zhuǎn)向,則轉(zhuǎn)向FINISH JBACC.7,NEG;若;若(X-Y)X, 存存YSJMPFINISHXMAX:MOVA,XD;XY, 存存XFINISH:MOVMAX
24、,A;大數(shù)送;大數(shù)送MAX單元單元END例例4-8 4-8 片內(nèi)片內(nèi)RAMRAM兩個(gè)單元中存有不相等的有符號(hào)數(shù)字兩個(gè)單元中存有不相等的有符號(hào)數(shù)字X X和和Y Y,比較兩數(shù)的大小,并將大數(shù)存入比較兩數(shù)的大小,并將大數(shù)存入MAXMAX單元。單元。 (2)多重分支結(jié)構(gòu))多重分支結(jié)構(gòu)例附例附5 5 設(shè)設(shè)x,yx,y分別存放在內(nèi)部分別存放在內(nèi)部RAM 30HRAM 30H和和40H40H中,根據(jù)中,根據(jù)x x的值,的值,給給y y賦值為賦值為01H,00H,0FFH(-1).01H,00H,0FFH(-1).011y000 xxxORG 2000H MOV A,30HJZDONE JBACC.7,LOO
25、PMOV A,#01HSJMP DONELOOP:MOV A, #0FFHDONE:MOV 40H , ASJMP $ END (3)散轉(zhuǎn)結(jié)構(gòu)散轉(zhuǎn)結(jié)構(gòu)例例 設(shè)設(shè)R7的內(nèi)容為的內(nèi)容為0n,對(duì)應(yīng)的處理程序入口地址分別為,對(duì)應(yīng)的處理程序入口地址分別為PROG0PROGn,編寫(xiě)散轉(zhuǎn)程序。,編寫(xiě)散轉(zhuǎn)程序。 跳轉(zhuǎn)方法:逐個(gè)比較,類(lèi)似跳轉(zhuǎn)方法:逐個(gè)比較,類(lèi)似CASE。 使用散轉(zhuǎn)指令使用散轉(zhuǎn)指令JMP A+DPTR 。 設(shè)(設(shè)(R7) 0 n,對(duì)應(yīng)的處理程序入口地址分別為,對(duì)應(yīng)的處理程序入口地址分別為 PROG0PROGn,且按照一定的規(guī)律排列,且按照一定的規(guī)律排列。 ORG 2000H MOV DPTR,
26、#TAB ;設(shè)置處理程序入口首地址;設(shè)置處理程序入口首地址 MOV A,R7 CLRC RLC A ; JNCNEXT INCDPHNEXT:JMP A+DPTR ;轉(zhuǎn)向形成的散轉(zhuǎn)地址入口;轉(zhuǎn)向形成的散轉(zhuǎn)地址入口 TAB:AJMP PROG0 ;直接轉(zhuǎn)移地址表;直接轉(zhuǎn)移地址表 AJMP PROG1 AJMP PROGn例例4-9 4-9 在內(nèi)部在內(nèi)部RAM 20HRAM 20H和和21H21H單元中有兩個(gè)無(wú)符號(hào)的數(shù),由單元中有兩個(gè)無(wú)符號(hào)的數(shù),由22H22H中中的值決定對(duì)該數(shù)完成加、減、乘或除運(yùn)算(的值決定對(duì)該數(shù)完成加、減、乘或除運(yùn)算(20H20H單元的數(shù)為被減單元的數(shù)為被減數(shù)或被除數(shù)),運(yùn)算規(guī)
27、則及結(jié)果保存處見(jiàn)表數(shù)或被除數(shù)),運(yùn)算規(guī)則及結(jié)果保存處見(jiàn)表4-14-1。 表表4-1 例例4-9說(shuō)明說(shuō)明(22H)操作操作結(jié)果保存處結(jié)果保存處0加加30H(低字節(jié)),(低字節(jié)),31H(高字節(jié)高字節(jié)) 1減減40H2乘乘50H(低字節(jié)),(低字節(jié)),51H(高字節(jié)高字節(jié))3除除60H(余數(shù)),(余數(shù)),61H(商商)ORG1000HMOVA,22HMOVB,21HRLAMOVDPTR,#TABJMPA+DPTRNOPTAB:AJMPADDM;散轉(zhuǎn)表;散轉(zhuǎn)表AJMPSUBMAJMPMULMAJMPDIVMADDM:MOVA,20H;加法運(yùn)算;加法運(yùn)算ADDA,BMOV30H,AMOVA,#0ADD
28、CA,#0MOV31H,ASJMPFINISHSUBM:MOVA,20H;減法運(yùn)算;減法運(yùn)算SUBBA,BMOV40H,ASJMPFINISHMULM:MOVA,20H;乘法運(yùn)算;乘法運(yùn)算MULABMOV51H,B MOV50H,ASJMPFINISHDIVM: MOVA,20H;除法運(yùn)算;除法運(yùn)算DIVABMOV61H,AMOV60H,BFINISH:END 4.2.4 子程序設(shè)計(jì)子程序設(shè)計(jì) 子程序與一般程序的主要區(qū)別是在子程序的末尾有一條子程序返回子程序與一般程序的主要區(qū)別是在子程序的末尾有一條子程序返回指令(指令(RET),其功能是執(zhí)行完子程序后通過(guò)將堆棧內(nèi)的斷點(diǎn)地址彈出到),其功能是執(zhí)
29、行完子程序后通過(guò)將堆棧內(nèi)的斷點(diǎn)地址彈出到PC而返回到主程序中。而返回到主程序中。 在編寫(xiě)子程序時(shí)應(yīng)注意以下幾點(diǎn):在編寫(xiě)子程序時(shí)應(yīng)注意以下幾點(diǎn): (1) 要給每個(gè)子程序賦一個(gè)名字。要給每個(gè)子程序賦一個(gè)名字。 實(shí)際上是一個(gè)入口地址的代號(hào)。實(shí)際上是一個(gè)入口地址的代號(hào)。 (2)在子程序的末尾必須有子程序返回指令)在子程序的末尾必須有子程序返回指令RET。 (3)要能正確地傳遞參數(shù)。要能正確地傳遞參數(shù)。 首先要有入口條件,說(shuō)明進(jìn)入子程序時(shí)它所要處理的數(shù)據(jù)如何得首先要有入口條件,說(shuō)明進(jìn)入子程序時(shí)它所要處理的數(shù)據(jù)如何得到,另外,要有出口條件,即處理的結(jié)果是如何存放的。到,另外,要有出口條件,即處理的結(jié)果是如
30、何存放的。(4) 注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。 注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和單元的內(nèi)容。和單元的內(nèi)容。 保護(hù)現(xiàn)場(chǎng):保護(hù)現(xiàn)場(chǎng): PUSH 恢復(fù)現(xiàn)場(chǎng):恢復(fù)現(xiàn)場(chǎng):POP(5) 注意子程序的通用性。注意子程序的通用性。主程序調(diào)用子程序的指令:主程序調(diào)用子程序的指令: “LCALL”,“ACALL”。 子程序返回指令:子程序返回指令:RET。子程序可以嵌套,子程序可以嵌套,嵌套次數(shù)從理論上說(shuō)是無(wú)限的,但實(shí)際上由于受堆棧深嵌套次數(shù)從理論上說(shuō)是無(wú)限的,但實(shí)際上由于受堆棧深度的影響,嵌套次數(shù)是有限的。
31、度的影響,嵌套次數(shù)是有限的。例例4-10 4-10 在圖在圖3-11 3-11 的的P1P1口與口與LEDLED的連接示意圖中,若使得的連接示意圖中,若使得LED0LED7LED0LED7依次點(diǎn)亮,其延時(shí)時(shí)間分別從依次點(diǎn)亮,其延時(shí)時(shí)間分別從1s1s至至8s8s,LED7LED7點(diǎn)亮之點(diǎn)亮之后又從后又從LED0LED0開(kāi)始循環(huán)。編寫(xiě)匯編語(yǔ)言源程序?qū)崿F(xiàn)該功能開(kāi)始循環(huán)。編寫(xiě)匯編語(yǔ)言源程序?qū)崿F(xiàn)該功能。 ORG1000HMOVA,#1;主程序;主程序NEXT1: MOV20H,#0MOV R3,#8NEXT:INC20H MOV R4,20HMOVP1,AACALL DELAYRLA DJNZ R3,N
32、EXTSJMPNEXT1DELAY:MOV R7,#10;1s延時(shí)子程序延時(shí)子程序DELAY3:MOVR6,#200 DELAY2:MOV R5,#125DELAY1:DJNZR5,DELAY1;1254500s0.5msDJNZR6,DELAY2;0.5 ms2000.1sDJNZR7,DELAY3;0.1s2001sDJNZR4,DELAYRETEND例例4-11 4-11 兩個(gè)無(wú)符號(hào)數(shù)據(jù)塊的首地址分別為兩個(gè)無(wú)符號(hào)數(shù)據(jù)塊的首地址分別為30H30H和和40H40H,每,每個(gè)數(shù)據(jù)塊的第一個(gè)字節(jié)都存放著數(shù)據(jù)塊的長(zhǎng)度(小于個(gè)數(shù)據(jù)塊的第一個(gè)字節(jié)都存放著數(shù)據(jù)塊的長(zhǎng)度(小于1515),求各數(shù)據(jù)塊中最大值
33、的乘積,并將結(jié)果存入),求各數(shù)據(jù)塊中最大值的乘積,并將結(jié)果存入50H50H(乘積低字節(jié))和(乘積低字節(jié))和51H51H(乘積高字節(jié))。(乘積高字節(jié))。解:可將求最大值的過(guò)程編寫(xiě)成一個(gè)子程序,子程序的入口參數(shù)是解:可將求最大值的過(guò)程編寫(xiě)成一個(gè)子程序,子程序的入口參數(shù)是數(shù)據(jù)塊的首地址,存放在數(shù)據(jù)塊的首地址,存放在R1中,返回參數(shù)即為最大值,存放在中,返回參數(shù)即為最大值,存放在A中,參考程中,參考程序如下:序如下:ORG 1000H;主程序;主程序MOV R1,#30H;置入口條件參數(shù);置入口條件參數(shù)ACALL FMAX;調(diào)用求最大值子程序;調(diào)用求最大值子程序MOV B,A;第一個(gè)最大值存放于;第一
34、個(gè)最大值存放于BMOV R1,#40H;置入口條件參數(shù);置入口條件參數(shù)ACALL FMAX;調(diào)用求最大值子程序;調(diào)用求最大值子程序MUL AB;求乘積;求乘積MOV 50H,A;存乘積低字節(jié);存乘積低字節(jié)MOV 51H,B;存乘積低高字節(jié);存乘積低高字節(jié)SJMP $ORG 1200H;子程序;子程序FMAX:MOV A,R1;取數(shù)據(jù)塊長(zhǎng)度;取數(shù)據(jù)塊長(zhǎng)度 MOV R2,A;R2中存放數(shù)據(jù)塊的長(zhǎng)度中存放數(shù)據(jù)塊的長(zhǎng)度 INCR1;改變地址指針;改變地址指針MOVA,R1;將第一個(gè)數(shù)放入;將第一個(gè)數(shù)放入ADECR2;數(shù)據(jù)個(gè)數(shù)減;數(shù)據(jù)個(gè)數(shù)減1LOOP1:INC R1;修改地址指針;修改地址指針 CLR
35、C SUBB A,R1;相減比較大小;相減比較大小 JNC LOOP2;A中的數(shù)為大,跳向中的數(shù)為大,跳向 MOV A,R1;否則,更換大數(shù)到;否則,更換大數(shù)到A SJMP LOOP3LOOP2:ADD A,R1;恢復(fù)原最大值;恢復(fù)原最大值LOOP3:LOOP3:DJNZ R2,LOOP1;若未比較完,則循環(huán);若未比較完,則循環(huán) RET END例:將例:將R0R0和和R1R1所指的內(nèi)部所指的內(nèi)部RAMRAM中兩個(gè)多字節(jié)無(wú)符號(hào)數(shù)相加,結(jié)果存入中兩個(gè)多字節(jié)無(wú)符號(hào)數(shù)相加,結(jié)果存入R0R0所指的內(nèi)部所指的內(nèi)部RAMRAM中。中。NADD:CLRCNADD1:MOV A,R0ADDC A,R1MOVR0
36、,AINC R0INCR1DJNZR7,NADD1JNCNADD2MOVR0,#01HINCR0NADD2:DEC R0RET4.3 常用程序設(shè)計(jì)舉例常用程序設(shè)計(jì)舉例4.3.1 代碼轉(zhuǎn)換類(lèi)程序代碼轉(zhuǎn)換類(lèi)程序 計(jì)算機(jī)內(nèi)部的運(yùn)算一般都是用二進(jìn)制,而在計(jì)算機(jī)與計(jì)算機(jī)內(nèi)部的運(yùn)算一般都是用二進(jìn)制,而在計(jì)算機(jī)與外設(shè)的數(shù)據(jù)傳送中常采用外設(shè)的數(shù)據(jù)傳送中常采用BCD碼、碼、ASCII碼和其它代碼,因此碼和其它代碼,因此,就存在代碼轉(zhuǎn)換的問(wèn)題。在程序設(shè)計(jì)中常采用,就存在代碼轉(zhuǎn)換的問(wèn)題。在程序設(shè)計(jì)中常采用算法處理和查算法處理和查表方式表方式來(lái)實(shí)現(xiàn)代碼轉(zhuǎn)換。來(lái)實(shí)現(xiàn)代碼轉(zhuǎn)換。1. 十六進(jìn)制數(shù)與十六進(jìn)制數(shù)與ASCII碼之
37、間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 將將A A中存放的一位十六進(jìn)制數(shù)轉(zhuǎn)換成其所對(duì)應(yīng)的中存放的一位十六進(jìn)制數(shù)轉(zhuǎn)換成其所對(duì)應(yīng)的ASCIIASCII碼存入碼存入A A中。中。解:解:HEXAS:CLR C SUBB A,#10JC LOOPADDA, #7LOOP:ADDA, #10 ADDA, #30HEND例例4-12 4-12 將從將從30H30H單元開(kāi)始的連續(xù)單元開(kāi)始的連續(xù)8 8個(gè)單元中存放的十六進(jìn)制數(shù)個(gè)單元中存放的十六進(jìn)制數(shù)轉(zhuǎn)換成其所對(duì)應(yīng)的轉(zhuǎn)換成其所對(duì)應(yīng)的ASCIIASCII碼,并分別存放在從碼,并分別存放在從40H40H開(kāi)始的開(kāi)始的1616個(gè)單個(gè)單元中。元中。解:解:ORG2000HMOVR0, #3
38、0H;設(shè)定地址指針;設(shè)定地址指針MOVR1, #40HMOVR7, #8;循環(huán)次數(shù);循環(huán)次數(shù)NEXT: MOVA, R0;高字節(jié)轉(zhuǎn)換;高字節(jié)轉(zhuǎn)換 SWAPA ANLA, #0FH ACALL HEXAS MOVR1, A INCR1 MOVA, R0;低字節(jié)轉(zhuǎn)換;低字節(jié)轉(zhuǎn)換 ANLA, #0FH ACALL HEXAS MOVR1, A INCR1;修改地址指針;修改地址指針 INCR0 DJNZR7, NEXT NOP SJMP$HEXAS:CLR C ;十六進(jìn)制轉(zhuǎn)換成;十六進(jìn)制轉(zhuǎn)換成ASCII碼子程序碼子程序 SUBBA,#10JCLOOPADDA, #7LOOP:ADDA, #10;補(bǔ)償
39、減掉的;補(bǔ)償減掉的10 ADDA, #30HRETEND 例例 把外部把外部RAM 30H3FH單元中的單元中的ASCII碼依次轉(zhuǎn)換為十六進(jìn)碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并存入內(nèi)部制數(shù),并存入內(nèi)部RAM 60H67H單元之中。單元之中。 假設(shè):假設(shè): 被轉(zhuǎn)換的被轉(zhuǎn)換的ASCII為為十六進(jìn)制數(shù)十六進(jìn)制數(shù)(0F)的的ASCII,則,則, 因?yàn)椋阂驗(yàn)椋?09 ASCII 3039H AFASCII 4146H 若若 (30H)41HA10 41H30H11H17 因?yàn)橐粋€(gè)字節(jié)可裝兩個(gè)轉(zhuǎn)換后得到的十六進(jìn)制數(shù),即兩因?yàn)橐粋€(gè)字節(jié)可裝兩個(gè)轉(zhuǎn)換后得到的十六進(jìn)制數(shù),即兩次轉(zhuǎn)換才能拼裝為一個(gè)字節(jié)。為了避免在程序中重復(fù)出
40、現(xiàn)轉(zhuǎn)次轉(zhuǎn)換才能拼裝為一個(gè)字節(jié)。為了避免在程序中重復(fù)出現(xiàn)轉(zhuǎn)換程序段,因此通常采用子程序結(jié)構(gòu),把轉(zhuǎn)換操作編寫(xiě)為子換程序段,因此通常采用子程序結(jié)構(gòu),把轉(zhuǎn)換操作編寫(xiě)為子程序。程序。 ORG 5000HMAIN: MOV R0,30H ;設(shè)置;設(shè)置 ASCII碼地址指針碼地址指針 MOV R1,60H ;設(shè)置十六進(jìn)制數(shù)地址指針;設(shè)置十六進(jìn)制數(shù)地址指針 MOV R7,08H ;字節(jié)個(gè)數(shù);字節(jié)個(gè)數(shù) AB: ACALL TRAN ;調(diào)用轉(zhuǎn)換子程序;調(diào)用轉(zhuǎn)換子程序 SWAP A ;A高低字節(jié)交換高低字節(jié)交換 MOVXR1, A INC R0 ACALLTRAN ; 調(diào)用轉(zhuǎn)換子程序調(diào)用轉(zhuǎn)換子程序 XCHDA, R
41、1 ;十六進(jìn)制數(shù)拼裝;十六進(jìn)制數(shù)拼裝 INCR0 INCR1 DJNZR7, AB 子程序(子程序(TRAN):):TRAN:CLRC MOVXA, R0;取;取ASCII碼碼 SUBBA, #30H CJNEA, #0AH, BB AJMPBCBB: JCDONEBC: SUBBA,#07H;大于等于;大于等于0AH, 再減再減07HDONE: RET END 例例4-13 將兩字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成三字節(jié)的將兩字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成三字節(jié)的BCD碼。若待轉(zhuǎn)換的雙字節(jié)十六進(jìn)碼。若待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在制整數(shù)在R6、R7中(中(R6中為高位),轉(zhuǎn)換后的三字節(jié)中為高位),轉(zhuǎn)換后的三字節(jié)BC
42、D碼整數(shù)存于碼整數(shù)存于R3、R4和和R5中(中(R3中為高位)。中為高位)。解:二進(jìn)制數(shù)解:二進(jìn)制數(shù)b7b6b5b4b3b2b1b0B所對(duì)應(yīng)的十進(jìn)制數(shù)所對(duì)應(yīng)的十進(jìn)制數(shù)X可按照下式計(jì)算可按照下式計(jì)算因此,只要按照十進(jìn)制運(yùn)算法則,將因此,只要按照十進(jìn)制運(yùn)算法則,將bi(i=7,6,1,0)按權(quán)相加,就可以得到)按權(quán)相加,就可以得到相應(yīng)的十進(jìn)制數(shù)相應(yīng)的十進(jìn)制數(shù)X。參考程序如下:。參考程序如下:ORG 2000HHEBCD:MOVA,#0;BCD碼初始化碼初始化MOVR3, AMOVR4,AMOVR5,A MOV R2, #16 ;循環(huán)次數(shù);循環(huán)次數(shù)NEXT: CLR C MOV A, R7;R7右移
43、一位并送回右移一位并送回 RLC A MOV R7,A MOVA,R6;R6右移一位并送回右移一位并送回RLCAMOVR6,AMOVA,R5;(;(R5)2并調(diào)整為并調(diào)整為BCD碼碼ADDCA,R5DAAMOVR5,AMOVA,R4;(;(R4)2并調(diào)整為并調(diào)整為BCD碼碼ADDCA,R4DAAMOVR4,AMOVA, R3ADDCA,R3MOVR3,A;若萬(wàn)位數(shù)不超過(guò);若萬(wàn)位數(shù)不超過(guò)6,則不用調(diào)整,則不用調(diào)整DJNZR2,NEXT;處理完;處理完16位了嗎?位了嗎? NOP END4.3.2 查表程序查表程序 常用于非線性修正、非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等。常用于非線性修正、非線性函數(shù)轉(zhuǎn)換以
44、及代碼轉(zhuǎn)換等。 專(zhuān)用的查表指令:專(zhuān)用的查表指令: MOVC A,A+DPTR ;遠(yuǎn)程查表,;遠(yuǎn)程查表, 64KB 通過(guò)通過(guò)以下三步操作實(shí)現(xiàn)查表。以下三步操作實(shí)現(xiàn)查表。 將所查表格的將所查表格的首地址送入首地址送入DPTR; 將要查找的將要查找的數(shù)據(jù)序號(hào)數(shù)據(jù)序號(hào),即數(shù)據(jù)在表中的位置送入,即數(shù)據(jù)在表中的位置送入累加器累加器A中中; 執(zhí)行查表指令執(zhí)行查表指令 MOVC A,A+DPTR 進(jìn)行讀數(shù)并存結(jié)果存進(jìn)行讀數(shù)并存結(jié)果存 于累加器于累加器A。MOVC A,A+PC ;近程查表,;近程查表,0+256B其實(shí)現(xiàn)查表也可通過(guò)以下三步操作來(lái)完成。其實(shí)現(xiàn)查表也可通過(guò)以下三步操作來(lái)完成。 將要查找的將要查找的
45、數(shù)據(jù)序號(hào)數(shù)據(jù)序號(hào),即數(shù)據(jù)在表中的位置,即數(shù)據(jù)在表中的位置送入累加器送入累加器A中中; 把從把從查表指令到表的首地址間的偏移量與查表指令到表的首地址間的偏移量與A值相加值相加; 執(zhí)行查表指令執(zhí)行查表指令 MOVC A,A+PC 進(jìn)行讀數(shù),查表結(jié)果送進(jìn)行讀數(shù),查表結(jié)果送累加器累加器A。例例4-14 用查表指令編程實(shí)現(xiàn)將從用查表指令編程實(shí)現(xiàn)將從30H單元開(kāi)始的連續(xù)單元開(kāi)始的連續(xù)8個(gè)單元中存放的十六進(jìn)制數(shù)轉(zhuǎn)個(gè)單元中存放的十六進(jìn)制數(shù)轉(zhuǎn)換成其所對(duì)應(yīng)的換成其所對(duì)應(yīng)的ASCII碼,并分別存放在從碼,并分別存放在從40H開(kāi)始的開(kāi)始的16個(gè)單元中。個(gè)單元中。 ORG2000HASCTAB:DB 30H,31H,3
46、2H,33H,34H,35H,36H,37H;ASCII碼表碼表 DB 38H,39H,41H,42H,43H,44H,45H,46HMOVR0,#30H;設(shè)定地址指針;設(shè)定地址指針MOVR1,#40HMOVR7,#8;循環(huán)次數(shù);循環(huán)次數(shù)MOVDPTR,#ASCTABNEXT: MOVA,R0;高字節(jié)轉(zhuǎn)換;高字節(jié)轉(zhuǎn)換SWAPAANLA,#0FHMOVCA,A+DPTR; 查表查表MOVR1,A INCR1MOVA,R0; 低字節(jié)轉(zhuǎn)換低字節(jié)轉(zhuǎn)換ANLA,#0FHMOVCA,A+DPTR; 查表查表MOVR1,AINCR1;修改地址指針;修改地址指針I(yè)NCR0DJNZR7,NEXTNOPEND 例
47、例4-15 在一個(gè)巡回檢測(cè)系統(tǒng)中,需對(duì)在一個(gè)巡回檢測(cè)系統(tǒng)中,需對(duì)8路輸入進(jìn)行控制,每路都有一最大允許值,路輸入進(jìn)行控制,每路都有一最大允許值,為雙字節(jié)數(shù),且不全相同。控制時(shí),需將輸入值與最大值比較,若超過(guò)則進(jìn)行報(bào)警。為雙字節(jié)數(shù),且不全相同。控制時(shí),需將輸入值與最大值比較,若超過(guò)則進(jìn)行報(bào)警。編寫(xiě)一子程序使其能查找每路的最大允許值。編寫(xiě)一子程序使其能查找每路的最大允許值。解:該查表運(yùn)算中自變量解:該查表運(yùn)算中自變量X是單字節(jié),而因變量是單字節(jié),而因變量Y是兩字節(jié)的數(shù)。假設(shè)被檢測(cè)路數(shù)存是兩字節(jié)的數(shù)。假設(shè)被檢測(cè)路數(shù)存放在放在R7中(入口參數(shù)),中(入口參數(shù)),07路的最大允許值依次存放在路的最大允許值
48、依次存放在ROM中,查詢(xún)得到的最大中,查詢(xún)得到的最大值存放在值存放在30H(低字節(jié))和(低字節(jié))和31H(出口參數(shù))中,則參考程序如下:(出口參數(shù))中,則參考程序如下:ORG1000HMOVDPTR, #TABLEMOVA,R7RLA;乘;乘2進(jìn)行地址修正進(jìn)行地址修正MOVR7,AMOVCA,A+DPTR;查表取高字節(jié);查表取高字節(jié)MOV31H,AINCDPTRMOVA,R7MOVCA,A+DPTR;查表取低字節(jié);查表取低字節(jié)MOV30H,ATABLE: DW 1245H, 2345H, 1022H, 2390H; 最大允許值表最大允許值表DW 3421H, 2388H, 2366H, 214
49、7HRET例例 若累加器若累加器A中存放的是一位中存放的是一位BCD碼。通過(guò)查表將其轉(zhuǎn)換成為碼。通過(guò)查表將其轉(zhuǎn)換成為相應(yīng)的七段顯示碼,并存入寄存器相應(yīng)的七段顯示碼,并存入寄存器B中。中。 七段數(shù)碼顯示管連接方式:共陽(yáng)極和共陰極兩種。七段數(shù)碼顯示管連接方式:共陽(yáng)極和共陰極兩種。 共陽(yáng)極是低電平為有效輸入,共陽(yáng)極是低電平為有效輸入, 共陰極為高電平為有效輸入。共陰極為高電平為有效輸入。 假設(shè)數(shù)碼顯示管為共陰極。假設(shè)數(shù)碼顯示管為共陰極。 09的七段碼為的七段碼為 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 由于代碼沒(méi)有規(guī)律,一般采用查表完成。由于代碼沒(méi)有規(guī)律,一
50、般采用查表完成。hgfedcba00111111acedbgfh3FH若以若以DPTR為基址,程序段如下:為基址,程序段如下: ORG2000HMOVMOVA, #05HA, #05H MOV DPTR, #TAB MOVC A, A+DPTRMOV B,ASJMP $ TAB:DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH 若以若以PC為基地址,則程序段如下:為基地址,則程序段如下: MOVA, #05HADD A, #01H MOVCA, A+PCRET TAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7
51、FH,6FH 例例4-16 若內(nèi)部若內(nèi)部RAM 30H中存放的是一位中存放的是一位BCD碼,通過(guò)查表將其轉(zhuǎn)換成為相碼,通過(guò)查表將其轉(zhuǎn)換成為相應(yīng)的七段顯示碼,并存入寄存器應(yīng)的七段顯示碼,并存入寄存器31H中。中。解:解:09的共陰極字形代碼為的共陰極字形代碼為3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 ORG 1000HMOVA,30H ADD A,#04H;地址修正;地址修正 MOVC A,A+PCMOV31H,A;2字節(jié)指令字節(jié)指令SJMP $;2字節(jié)指令字節(jié)指令 TAB:DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH
52、,6FH END4.2.6 邏輯操作程序邏輯操作程序 例例4-17 寫(xiě)出圖寫(xiě)出圖4-7所示電路的邏輯表達(dá)式,并編程實(shí)現(xiàn)其功能所示電路的邏輯表達(dá)式,并編程實(shí)現(xiàn)其功能解:該電路圖的最簡(jiǎn)邏輯表達(dá)式為,解:該電路圖的最簡(jiǎn)邏輯表達(dá)式為, ORG1000HXBITP1.0;輸入邏輯變量;輸入邏輯變量YBITP1.1ZBITP1.2FBITP1.3;輸出邏輯變量;輸出邏輯變量EXOR:MOVC,XANL C,/YMOV F,C;保存結(jié)果于;保存結(jié)果于F位位MOV C,YANL C,/XORL C,F(xiàn) ANLC,ZMOVF,C;F()MOVC,XANLC,Y;XYORLC,F(xiàn)MOVF,CEND圖4-7 例4-
53、17的邏輯電路圖=1& 11XYZFXYZ)YX(FYXYXYX例例4-18 在圖在圖3-7中,假設(shè)中,假設(shè)K1、K2和和K3分別表示分別表示X、Y和和Z三人對(duì)某一提案的表決,三人對(duì)某一提案的表決,當(dāng)當(dāng)K閉合時(shí),表示其同意該方案;當(dāng)閉合時(shí),表示其同意該方案;當(dāng)K斷開(kāi)時(shí),表示不同意該方案。當(dāng)多數(shù)人同意斷開(kāi)時(shí),表示不同意該方案。當(dāng)多數(shù)人同意時(shí),輸出時(shí),輸出F為為1。假設(shè)。假設(shè)P1.7連接一共陰極連接一共陰極LED,將結(jié)果用,將結(jié)果用LED顯示出來(lái)。編程實(shí)現(xiàn)顯示出來(lái)。編程實(shí)現(xiàn)此功能。此功能。解:根據(jù)數(shù)字電路中組合邏輯電路的設(shè)計(jì)知識(shí),得出該邏輯電路的最簡(jiǎn)邏輯函數(shù)解:根據(jù)數(shù)字電路中組合邏輯電路的
54、設(shè)計(jì)知識(shí),得出該邏輯電路的最簡(jiǎn)邏輯函數(shù)式是式是F=XY+XZ+YZ,據(jù)此設(shè)計(jì)的參考程序如下:,據(jù)此設(shè)計(jì)的參考程序如下:ORG1000HXBITP1.0YBITP1.1ZBITP1.2MOVC,X;實(shí)現(xiàn);實(shí)現(xiàn)XYANLC,YMOV20H,CMOVC,X;實(shí)現(xiàn);實(shí)現(xiàn)XZANLC,ZMOV21H,CMOVC,Y;實(shí)現(xiàn);實(shí)現(xiàn)YZANLC,ZORLC,21HORLC,20HMOVP1.7,C NOP END例例 設(shè)設(shè)P1.0P1.3為準(zhǔn)備就緒信號(hào)輸入端,當(dāng)該為準(zhǔn)備就緒信號(hào)輸入端,當(dāng)該4位輸入全為位輸入全為1時(shí)時(shí)說(shuō)明各項(xiàng)工作已準(zhǔn)備好,單片機(jī)可順序執(zhí)行主程序,否則循環(huán)說(shuō)明各項(xiàng)工作已準(zhǔn)備好,單片機(jī)可順序執(zhí)行主
55、程序,否則循環(huán)等待。等待。ORG 2000HLOOP:MOV A,P1ANLA,#0FHCJNE A,#0FH,LOOPMAIN: 例例 用軟件實(shí)現(xiàn)邏輯函數(shù)用軟件實(shí)現(xiàn)邏輯函數(shù) 。 其中其中 X、Y、Z、W、F均為位變量,分別對(duì)應(yīng)均為位變量,分別對(duì)應(yīng)P1.0、P1.1、P1.2、P1.3和和P1.7。由開(kāi)關(guān)為。由開(kāi)關(guān)為P1.0、P1.1、P1.2、P1.3輸入值,輸入值,而由而由P1.7輸出該邏輯函數(shù)值。輸出該邏輯函數(shù)值。XYZXYZWZYXF ORG 5000HXBITP1.0YBITP1.1ZBITP1.2WBITP1.3FBITP1.7TEMPBIT20H.0MOVC,XANLC,YANL
56、C,Z;CXYZMOVTEMP,C;暫存;暫存XYZANLC,WORLC,TEMP;CXYZWXYZMOVTEMP,CMOVC,XANLC,/YANLC,W;CORLC,/TEMP;CMOVF,C;輸出最后結(jié)果;輸出最后結(jié)果END第 4 章 匯編語(yǔ)言程序設(shè)計(jì) 思考題與習(xí)題思考題與習(xí)題 4-1 把外部把外部RAM 5000H的內(nèi)容拆開(kāi),高位送的內(nèi)容拆開(kāi),高位送5001H,低位送低位送5002H。 4-2 把外部把外部RAM 3000H開(kāi)始的開(kāi)始的100字節(jié)的內(nèi)容傳送到字節(jié)的內(nèi)容傳送到從外部從外部RAM 3500H開(kāi)始的連續(xù)單元中。開(kāi)始的連續(xù)單元中。 4-3 設(shè)有設(shè)有100個(gè)有符號(hào)數(shù),連續(xù)存放在外
57、部個(gè)有符號(hào)數(shù),連續(xù)存放在外部RAM以以2000H為首地址的存儲(chǔ)區(qū)中,編程統(tǒng)計(jì)其中正數(shù)、負(fù)為首地址的存儲(chǔ)區(qū)中,編程統(tǒng)計(jì)其中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù),并分別存放在數(shù)和零的個(gè)數(shù),并分別存放在R5、R6和和R7。 4-4 外部外部RAM 1000H開(kāi)始連續(xù)存放開(kāi)始連續(xù)存放20個(gè)雙字節(jié)無(wú)符號(hào)個(gè)雙字節(jié)無(wú)符號(hào)數(shù),低字節(jié)在前,高字節(jié)在后,編寫(xiě)求和程序,將結(jié)數(shù),低字節(jié)在前,高字節(jié)在后,編寫(xiě)求和程序,將結(jié)果存入內(nèi)部果存入內(nèi)部RAM 30H,31H,32H單元中。單元中。 4-5 編程計(jì)算片內(nèi)編程計(jì)算片內(nèi)RAM40H47H單元中無(wú)符號(hào)數(shù)的算單元中無(wú)符號(hào)數(shù)的算術(shù)平均值(假設(shè)和仍為術(shù)平均值(假設(shè)和仍為8位數(shù)),結(jié)果存放在位
58、數(shù)),結(jié)果存放在50H(商)(商)和和51H(余數(shù))中。(余數(shù))中。4-6 從內(nèi)部從內(nèi)部RAM 30H開(kāi)始存有一無(wú)符號(hào)數(shù)據(jù)塊,其長(zhǎng)開(kāi)始存有一無(wú)符號(hào)數(shù)據(jù)塊,其長(zhǎng)度在度在2FH單元中。求出數(shù)據(jù)塊中最小值和最大值并分別存入單元中。求出數(shù)據(jù)塊中最小值和最大值并分別存入R6和和R7中。中。4-7 將上題中將上題中“無(wú)符號(hào)數(shù)無(wú)符號(hào)數(shù)”改為改為“有符號(hào)數(shù)有符號(hào)數(shù)”,求出,求出其中的最小值和最大值(參考例其中的最小值和最大值(參考例4-8)。)。4-8 從外部從外部RAM首地址為首地址為1000H、長(zhǎng)度為、長(zhǎng)度為50H的數(shù)據(jù)的數(shù)據(jù)塊中找出第一個(gè)塊中找出第一個(gè)ASCII碼碼#,并將其地址送到,并將其地址送到10
59、50H和和1051H單元中,如果沒(méi)有單元中,如果沒(méi)有#,則使,則使1050H和和1051H單元的內(nèi)容為單元的內(nèi)容為0。4-9把外部把外部RAM 30H3FH單元中的單元中的ASCII碼依次轉(zhuǎn)換碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并存入內(nèi)部為十六進(jìn)制數(shù),并存入內(nèi)部RAM 60H67H單元之中。單元之中。4-10假設(shè)晶振頻率假設(shè)晶振頻率fosc =6MHz,根據(jù)圖,根據(jù)圖3-11的線路設(shè)的線路設(shè)計(jì)燈亮程序。要求將計(jì)燈亮程序。要求將8只發(fā)光二極管間隔地分兩組,每組只發(fā)光二極管間隔地分兩組,每組4只,只,兩組交叉輪流發(fā)光,反復(fù)循環(huán)不止,每組燈亮持續(xù)時(shí)間為兩組交叉輪流發(fā)光,反復(fù)循環(huán)不止,每組燈亮持續(xù)時(shí)間為1s。 4
60、-11用軟件實(shí)現(xiàn)邏輯函數(shù)用軟件實(shí)現(xiàn)邏輯函數(shù) 。其中。其中X、Y、Z、W、F均均為位變量,分別對(duì)應(yīng)為位變量,分別對(duì)應(yīng)P1.0、P1.1、P1.2、P1.3和和P1.7。由。由P1.0、P1.1、P1.2、P1.3輸入值,而由輸入值,而由P1.7輸出該邏輯函數(shù)值。輸出該邏輯函數(shù)值。 4-1 把外部把外部RAM 5000H的內(nèi)容拆開(kāi),高位送的內(nèi)容拆開(kāi),高位送5001H,低位,低位送送5002H。MOVDPTR,#5000HMOVXA,DPTRMOVR1,ASWAP AANLA,#0FHINC DPTRMOVXDPTR,AMOVA,R1ANLA,#0FHINC DPTRMOVXDPTR,A 4-2把外部把外部
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西華澳商貿(mào)職業(yè)學(xué)院《臨床檢驗(yàn)儀器》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟(jì)南護(hù)理職業(yè)學(xué)院《嵌入式課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 臨床免疫學(xué)檢驗(yàn)課件 第3章 免疫原和抗血清的制備學(xué)習(xí)資料
- 西安海棠職業(yè)學(xué)院《隸書(shū)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇農(nóng)牧科技職業(yè)學(xué)院《硬筆書(shū)法》2023-2024學(xué)年第一學(xué)期期末試卷
- 鹽城工業(yè)職業(yè)技術(shù)學(xué)院《工商管理級(jí)學(xué)碩》2023-2024學(xué)年第二學(xué)期期末試卷
- 二零二五版資金監(jiān)管委托協(xié)議樣本
- 二零二五全新美食城檔口出租協(xié)議
- 二零二五版學(xué)生托人接送免責(zé)協(xié)議書(shū)范文
- 游戲開(kāi)發(fā)回顧與展望
- 多維數(shù)據(jù)循環(huán)嵌套分析-全面剖析
- 數(shù)學(xué)全等三角形教學(xué)設(shè)計(jì) 2024-2025學(xué)年北師大版數(shù)學(xué)七年級(jí)下冊(cè)
- 《旅游策劃實(shí)務(wù)》課件-《秦嶺北望 千古》長(zhǎng)安西安五天四晚親子家庭定制游方案
- 事故隱患內(nèi)部報(bào)告獎(jiǎng)勵(lì)制度1
- 建設(shè)單位保證安全生產(chǎn)措施方案
- 2025年新音樂(lè)節(jié)明星藝人歌手演出場(chǎng)費(fèi)報(bào)價(jià)單
- 2025年人保應(yīng)聘考試試題及答案
- 新視野大學(xué)英語(yǔ)(第四版)讀寫(xiě)教程2(思政智慧版) 教案 Unit 5 Striving for financial health
- 幼兒園獲獎(jiǎng)公開(kāi)課:大班科學(xué)活動(dòng)《茶》課件
- GB/T 34571-2024軌道交通機(jī)車(chē)車(chē)輛布線規(guī)則
- 認(rèn)知與實(shí)踐:AI技術(shù)在高校圖書(shū)館應(yīng)用現(xiàn)狀調(diào)研分析
評(píng)論
0/150
提交評(píng)論