第四匯編語言程序設計春_第1頁
第四匯編語言程序設計春_第2頁
第四匯編語言程序設計春_第3頁
第四匯編語言程序設計春_第4頁
第四匯編語言程序設計春_第5頁
已閱讀5頁,還剩83頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第4章章 匯編語言程序設計匯編語言程序設計 4.1 匯編語言程序設計方法匯編語言程序設計方法 4.2 匯編語言源程序的基本結構匯編語言源程序的基本結構順序、循環、分支、子程序順序、循環、分支、子程序 4.3 常用程序設計舉例常用程序設計舉例 4.1.1 程序的設計步驟與方法程序的設計步驟與方法 匯編和高級語言程序設計的過程:匯編和高級語言程序設計的過程: 首先對問題進行分析,然后確定算法,再根據算法首先對問題進行分析,然后確定算法,再根據算法流程編寫程序,最后是調試程序。流程編寫程序,最后是調試程序。 匯編語言程序設計的匯編語言程序設計的獨特點獨特點在于:在于: (1) 用匯編語言進行程序設

2、計時,對用匯編語言進行程序設計時,對數據的存放、寄存器數據的存放、寄存器和工作單元的使用等要由設計者安排和工作單元的使用等要由設計者安排。而高級語言程序設計。而高級語言程序設計時,這些工作都由計算機軟件安排,程序設計者不必考慮。時,這些工作都由計算機軟件安排,程序設計者不必考慮。(2) 匯編語言程序設計要求設計人員必須對所使用的匯編語言程序設計要求設計人員必須對所使用的計算機的硬件結構有較為詳細的了解計算機的硬件結構有較為詳細的了解。特別是對。特別是對各類各類寄存器、端口、定時器寄存器、端口、定時器/計數器、中斷等計數器、中斷等內容要熟悉,內容要熟悉,以便在程序設計時能熟練使用。以便在程序設計

3、時能熟練使用。匯編語言程序的設計步驟:匯編語言程序的設計步驟:(1)分析問題,抽象出描述問題的數學模型)分析問題,抽象出描述問題的數學模型(2)確定解決問題的算法)確定解決問題的算法(3)分配存儲空間及工作單元)分配存儲空間及工作單元(4)根據算法繪制流程圖)根據算法繪制流程圖(5)編寫源程序)編寫源程序(6)上機調試)上機調試程序質量的判斷標準:程序質量的判斷標準:程序的執行時間短;占用的內存單元少;程序的語句行程序的執行時間短;占用的內存單元少;程序的語句行數少。數少。4.1.2 匯編語言源程序的編輯和匯編匯編語言源程序的編輯和匯編 1. 匯編語言源程序的編輯匯編語言源程序的編輯 編輯好的

4、源程序應以“. ASM”擴展名存盤 2. 匯編語言源程序的匯編匯編語言源程序的匯編 源程序經機器匯編之后,若無語法錯誤,一般將生成兩個新文件,它們的擴展名分別是.OBJ和.LST。 例例4-1 將內部將內部RAM從從30H開始的開始的10個單元的內容個單元的內容相加,其和保存于相加,其和保存于A(假設其和仍為(假設其和仍為8位數)。位數)。列表文件(列表文件(.LST)信息如下:)信息如下:地址地址 機器碼機器碼 匯編語言源程序匯編語言源程序 注釋注釋 ORG2000H ;定義程序起始地址;定義程序起始地址2000 7830 START:MOVR0,#30H;初始地址送;初始地址送R02002

5、 7A0A MOVR2,#10;循環初始值送;循環初始值送R22004 7400 MOVA,#00H;累加和初始值送;累加和初始值送A2006 26 LOOP:ADDCA,R0;完成累加;完成累加2007 08 INCR0 ;修改地址;修改地址2008 DAFC DJNZR2,LOOP;循環判斷;循環判斷200A 80FE SJMP$;暫停;暫停 END ;程序結束;程序結束INCLUDE IN HASHTABSTART:2000LOOP:2006目標文件(目標文件(.OBJ)信息如下:)信息如下:2000200C78307A0A74002608DAFC80FE 4.2 4.2 匯編語言源程序

6、的基本結構匯編語言源程序的基本結構 共有四種結構形式:共有四種結構形式: 順序結構、循環結構、分支結構和子程順序結構、循環結構、分支結構和子程序結構。序結構。方法一:用邏輯指令將高、低半字節分開,對數字方法一:用邏輯指令將高、低半字節分開,對數字09加上加上30H即可得到即可得到所對應的所對應的ASCII碼碼30H39H。 ORG2000HMOVA,40H;取數;取數ANLA,#0FH;分離出低半字節;分離出低半字節ADDA,#30H;變為;變為ASCII碼碼MOV42H,A;保存;保存MOVA,40H;重新取數;重新取數SWAPA;高、低半字節交換;高、低半字節交換ANLA,#0FH;分離出

7、高半字節;分離出高半字節ADDA,#30H;變為;變為ASCII碼碼MOV41H,A;保存;保存END例例4-2 將將40H單元的高、低半字節的兩個單元的高、低半字節的兩個BCD碼拆開并變碼拆開并變成其成其ASCII碼,并分別存入碼,并分別存入41H和和42H單元單元 4.2.1 4.2.1 順序結構順序結構方法二:采用方法二:采用BCD數除以數除以10H的方法,可把處于高、低半字節的兩個的方法,可把處于高、低半字節的兩個BCD碼分別移到碼分別移到A和和B的低的低4位,然后再各自與位,然后再各自與30H相相“或或”即變為即變為ASCII碼。參碼。參考程序如下:考程序如下:ORG2000HMOV

8、A,40H;取數;取數MOVB,#10H;送被除數;送被除數DIVAB;分離高、低半字節;分離高、低半字節ORLB,#30H;低;低4位調整為位調整為ASCII碼碼MOV42H,BORLA,#30H;高;高4位調整為位調整為ASCII碼碼MOV41H,AEND例例4-2 將將40H單元的高、低半字節的兩個單元的高、低半字節的兩個BCD碼拆開并變碼拆開并變成其成其ASCII碼,并分別存入碼,并分別存入41H和和42H單元單元 例(附例(附1 1) 求兩個求兩個8 8位無符號數的和。位無符號數的和。設兩個設兩個8 8位無符號數分別存放在內部位無符號數分別存放在內部RAM RAM 20H20H和和2

9、1H21H單元,所求和(不超過單元,所求和(不超過255255)存放)存放在在22H22H單元。單元。ORG 2000HSTART:MOV R0,#20HMOVA,R0INCR0ADDA,R0INC R0MOVR0,ASJMP$END只只有有這這一一種種方方法法嗎?嗎?例(附例(附2 2) 求兩個求兩個8 8位無符號數的和。位無符號數的和。設兩個設兩個8 8位無符號數分別存放在內部位無符號數分別存放在內部RAM RAM 20H20H和和21H21H單元,所求和(不超過單元,所求和(不超過255255)存放)存放在在22H22H單元。單元。ORG 2000HSTART:MOV A, 20HADD

10、A,21HMOV 23H,ASJMP $END4.2.2 循環程序設計循環程序設計 循環初態循環初態圖圖a a為先執行后判斷,相當于為先執行后判斷,相當于直到(直到(untiluntil)型循環)型循環。圖圖b b為先判斷后執行,相當于為先判斷后執行,相當于當(當(do-whiledo-while)型循環)型循環。 循環程序一般由四個主要部分組成循環程序一般由四個主要部分組成: (1) 初始化部分初始化部分: 為循環程序做準備為循環程序做準備, 如規定循環次數、如規定循環次數、 給給各變量和地址指針預置初值。各變量和地址指針預置初值。 (2) 處理部分處理部分: 為反復執行的程序段為反復執行的

11、程序段, 是循環程序的實體是循環程序的實體, 也也是循環程序的主體。是循環程序的主體。 (3) 循環控制部分循環控制部分: 這部分的作用是修改循環變量和控制變這部分的作用是修改循環變量和控制變量量, 并判斷循環是否結束并判斷循環是否結束, 直到符合結束條件時直到符合結束條件時, 跳出循環為止。跳出循環為止。 (4) 結束部分結束部分: 這部分主要是對循環程序的結果進行分析、這部分主要是對循環程序的結果進行分析、 處理和存放。處理和存放。 循環:單重循環循環:單重循環 多重循環(二重以上)循環嵌套。多重循環(二重以上)循環嵌套。 在多重循環程序中,只允許外重循環嵌套內重循環程在多重循環程序中,只

12、允許外重循環嵌套內重循環程序,而不允許循環體互相交叉,另外,也不允許從循環程序序,而不允許循環體互相交叉,另外,也不允許從循環程序的外部跳入循環程序的內部。的外部跳入循環程序的內部。例例4-3 4-3 把外部把外部RAM 5000H50FFHRAM 5000H50FFH單元的內容清零單元的內容清零。ORG 2000HSTART1:MOV DPTR,#5000H ;循環初始化;循環初始化MOV R0,#00HMOV A,#00HLOOP1:MOVXDPTR, A;循環體;循環體INCDPTRINCR0DJNZ R0,LOOP1 ;循環控制;循環控制END例例4-4 4-4 將內部將內部RAMRA

13、M從從40H40H開始連續單元的數據傳送到開始連續單元的數據傳送到外部外部RAMRAM從從2000H2000H開始的連續單元中,當所傳送的數據開始的連續單元中,當所傳送的數據為為0FFH0FFH時,傳送停止。時,傳送停止。解:解: ORG2000H MOV R0,#40H ;循環初始化;循環初始化MOVDPTR,#2000HLOOP:MOVA,R0 CJNE A,#0FFH,LOOP1 ;循環控制循環控制 SJMPNEXTLOOP1:MOVX DPTR,A ;循環體;循環體 INC R0 INC DPTR SJMP LOOP NEXT:SJMP$END 例例4-5 4-5 從從P1P1口重復口

14、重復256256次讀數并取平均值,平均值次讀數并取平均值,平均值的整數和小數部分分別保存于內部的整數和小數部分分別保存于內部RAMRAM的的30H30H和和31H31H單元單元中。中。解:假設將解:假設將R2 R3作為作為16位寄存器以保存連續位寄存器以保存連續 256次讀數的累加和次讀數的累加和 ORG 4000HINTEGER EQU30HDECIMAL EQU31HAVR:MOV R2,#0 ;循環初始化;循環初始化 MOV R3,#0 MOV R4, #0;累加次數為;累加次數為256AVR1:MOV A,P1;循環體;循環體 ADD A,R3;累加至低;累加至低 8位位 JNC AV

15、R2;無進位則暫存結果;無進位則暫存結果 INC R2;有進位則高;有進位則高8位加增位加增 1AVR2:MOV R3,A ;暫存低;暫存低 8位位 DJNZ R4,AVR1;循環控制;循環控制 MOV INTEGER,R2MOVDECIMAL,R3END例例( (附附2 2)設單片機外部數據存儲器起始地址為)設單片機外部數據存儲器起始地址為3000H3000H的數據塊中有的數據塊中有100100個補碼,要求逐一檢查,若為負數則個補碼,要求逐一檢查,若為負數則求補后放回,正數則不變。求補后放回,正數則不變。ORG 1000HSTART1:MOVR7, #64H;設置循環初始值;設置循環初始值M

16、OVDPTR, #3000HLOOP1:MOVX A , DPTR JNBACC.7,LOOP2CPLAINCAMOVX DPTR,ALOOP2:INCDPTR;外部;外部RAM單元加單元加1DJNZ R7,LOOP1END例(附例(附3 3)有)有1010個無符號數依次存放在內部個無符號數依次存放在內部RAM 30HRAM 30H開始的單元中,求其開始的單元中,求其和,并將結果放在和,并將結果放在R2R2和和R3R3中。中。ORG 2000HMOVR0,#30HMOVR2,#00HMOVR3,#00HMOVR7,#0AHNEXT:MOVA, R0;設置循環初始值;設置循環初始值ADDA,R3

17、MOVR3,AMOVA,R2ADDCA,#00HMOVR2,AINCR0DJNZR7,NEXTSJMP$END例例4.64.6設設MCS-51MCS-51單片機的時鐘頻率為單片機的時鐘頻率為fosc = 12 MHzfosc = 12 MHz,試設計,試設計延時延時50ms50ms的延時程序的延時程序。 延時程序所花費的時間是該程序指令的總機器周期數與機延時程序所花費的時間是該程序指令的總機器周期數與機器周期的乘積。器周期的乘積。通常,延時程序采用通常,延時程序采用MOV和和DJNZ指令來實現。指令來實現。單循環延時程序,最大的循環次數位單循環延時程序,最大的循環次數位256,則程序段為:,則

18、程序段為: MOV R0,#00H ;機器周期數為;機器周期數為1 DJNZ R0,$ ;機器周期數為;機器周期數為2若單片機晶振為若單片機晶振為12MHz,則一個機器周期為,則一個機器周期為1us。延時時間:(延時時間:(1+2562)1s513s。 需采用多重循環。需采用多重循環。 MOV R1,#M LOOP:MOV R2,#NNOPDJNZ R2,$ DJNZ R1,LOOP內層循環的機器周期數為內層循環的機器周期數為Tn=1+1+2*N,總機器周期數為總機器周期數為Tm(Tn+2)*M+1.設設N=123,M=200,則延時時間為,則延時時間為50.001ms。修改后程序清單:修改后

19、程序清單:ORG 2000HMOV R1,#0C8H(200) LOOP:MOV R2,#7BH(123)NOPDJNZ R2,$ DJNZ R1,LOOPSJMP $END補充例補充例4 4 設三字節無符號數相加設三字節無符號數相加被加數:內部被加數:內部RAM 22H20H單元(低位在低字節),單元(低位在低字節),加數:加數: 內部內部RAM 32H30H單元(低位在低字節),單元(低位在低字節),結果:存于內部結果:存于內部RAM 22H20H單元,進位位存于單元,進位位存于23H單單元。元。 利用利用ADDC指令進行多字節加法運算。指令進行多字節加法運算。ORG 4200H MOV

20、R0,#20H;被加數的低字節地址;被加數的低字節地址MOV R1,#30H;加數的低字節地址;加數的低字節地址MOV R2,#03H;循環次數;循環次數CLRCLOOP: MOV A, R0ADDC A, R1;低字節相加;低字節相加MOV R0,A;存放字節相加結果;存放字節相加結果INC R0INC R1DJNZ R2, LOOP;循環控制;循環控制MOV A, #00HADDC A,#00HMOV R0, A;進位位送;進位位送23HEND4.2.3 分支程序分支程序 分支程序的基本結構:單分支和多分支。分支程序的基本結構:單分支和多分支。其特點是:各處理模塊是相互排斥的。其特點是:各

21、處理模塊是相互排斥的。13條條件轉移指令,條條件轉移指令,分別為分別為: JZ,JNZ: 累加器判零轉移指令累加器判零轉移指令;CJNE: 比較條件轉移指令比較條件轉移指令;DJNZ: 減減1條件轉移指令條件轉移指令; JC, JNC , JB,JNB,JBC: 位控制條件轉移指令等四類。位控制條件轉移指令等四類。(1)單重分支結構單重分支結構例例4-7 4-7 片內片內RAM DATA1RAM DATA1和和DATA2DATA2兩個單元中各存有一個無符兩個單元中各存有一個無符號數字,將兩個數中的小者存入號數字,將兩個數中的小者存入MINMIN單元。單元。ORG 4000HMINEQU30HD

22、ATA1EQU31HDATA2EQU32HMOVA,DATA1;第一數送;第一數送ACLRCCJNEA,DATA2,UNEQU;兩數比較;兩數比較SJMPSTORE;相等,;相等,DATA1作為小的數作為小的數UNEQU:JCSTORE;有借位,;有借位,DATA1為小為小MOVA,DATA2;無借位,;無借位,DATA2為小為小STORE:MOVMIN,A;小者送;小者送RAMEND例例4-8 4-8 片內片內RAMRAM兩個單元中存有不相等的有符號數字兩個單元中存有不相等的有符號數字X X和和Y Y,比較兩數的大小,并將大數存入比較兩數的大小,并將大數存入MAXMAX單元。單元。 若若X-

23、Y0,則當(,則當(OV)0時,時,XY; 當(當(OV)1時,時,XY;若若X-Y0,則當(,則當(OV)0時,時,XY; 當(當(OV)1時,時,XY。圖4-6 例4-8的流程圖X送MAXX=Y ?Y分支0N(X-Y)0?YOV=1?NOV=1 ?Y送MAXNNYYORG1000HXDEQU31HYDEQU32HMAXEQU30HCLRCMOVA,XDSUBBA,YD;X-Y,形成,形成OV標志標志JZXMAX;若;若X=Y,則轉向,則轉向FINISH JBACC.7,NEG;若;若(X-Y)X, 存存YSJMPFINISHXMAX:MOVA,XD;XY, 存存XFINISH:MOVMAX

24、,A;大數送;大數送MAX單元單元END例例4-8 4-8 片內片內RAMRAM兩個單元中存有不相等的有符號數字兩個單元中存有不相等的有符號數字X X和和Y Y,比較兩數的大小,并將大數存入比較兩數的大小,并將大數存入MAXMAX單元。單元。 (2)多重分支結構)多重分支結構例附例附5 5 設設x,yx,y分別存放在內部分別存放在內部RAM 30HRAM 30H和和40H40H中,根據中,根據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)散轉結構散轉結構例例 設設R7的內容為的內容為0n,對應的處理程序入口地址分別為,對應的處理程序入口地址分別為PROG0PROGn,編寫散轉程序。,編寫散轉程序。 跳轉方法:逐個比較,類似跳轉方法:逐個比較,類似CASE。 使用散轉指令使用散轉指令JMP A+DPTR 。 設(設(R7) 0 n,對應的處理程序入口地址分別為,對應的處理程序入口地址分別為 PROG0PROGn,且按照一定的規律排列,且按照一定的規律排列。 ORG 2000H MOV DPTR,

26、#TAB ;設置處理程序入口首地址;設置處理程序入口首地址 MOV A,R7 CLRC RLC A ; JNCNEXT INCDPHNEXT:JMP A+DPTR ;轉向形成的散轉地址入口;轉向形成的散轉地址入口 TAB:AJMP PROG0 ;直接轉移地址表;直接轉移地址表 AJMP PROG1 AJMP PROGn例例4-9 4-9 在內部在內部RAM 20HRAM 20H和和21H21H單元中有兩個無符號的數,由單元中有兩個無符號的數,由22H22H中中的值決定對該數完成加、減、乘或除運算(的值決定對該數完成加、減、乘或除運算(20H20H單元的數為被減單元的數為被減數或被除數),運算規

27、則及結果保存處見表數或被除數),運算規則及結果保存處見表4-14-1。 表表4-1 例例4-9說明說明(22H)操作操作結果保存處結果保存處0加加30H(低字節),(低字節),31H(高字節高字節) 1減減40H2乘乘50H(低字節),(低字節),51H(高字節高字節)3除除60H(余數),(余數),61H(商商)ORG1000HMOVA,22HMOVB,21HRLAMOVDPTR,#TABJMPA+DPTRNOPTAB:AJMPADDM;散轉表;散轉表AJMPSUBMAJMPMULMAJMPDIVMADDM:MOVA,20H;加法運算;加法運算ADDA,BMOV30H,AMOVA,#0ADD

28、CA,#0MOV31H,ASJMPFINISHSUBM:MOVA,20H;減法運算;減法運算SUBBA,BMOV40H,ASJMPFINISHMULM:MOVA,20H;乘法運算;乘法運算MULABMOV51H,B MOV50H,ASJMPFINISHDIVM: MOVA,20H;除法運算;除法運算DIVABMOV61H,AMOV60H,BFINISH:END 4.2.4 子程序設計子程序設計 子程序與一般程序的主要區別是在子程序的末尾有一條子程序返回子程序與一般程序的主要區別是在子程序的末尾有一條子程序返回指令(指令(RET),其功能是執行完子程序后通過將堆棧內的斷點地址彈出到),其功能是執

29、行完子程序后通過將堆棧內的斷點地址彈出到PC而返回到主程序中。而返回到主程序中。 在編寫子程序時應注意以下幾點:在編寫子程序時應注意以下幾點: (1) 要給每個子程序賦一個名字。要給每個子程序賦一個名字。 實際上是一個入口地址的代號。實際上是一個入口地址的代號。 (2)在子程序的末尾必須有子程序返回指令)在子程序的末尾必須有子程序返回指令RET。 (3)要能正確地傳遞參數。要能正確地傳遞參數。 首先要有入口條件,說明進入子程序時它所要處理的數據如何得首先要有入口條件,說明進入子程序時它所要處理的數據如何得到,另外,要有出口條件,即處理的結果是如何存放的。到,另外,要有出口條件,即處理的結果是如

30、何存放的。(4) 注意保護現場和恢復現場。注意保護現場和恢復現場。 注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和單元的內容。和單元的內容。 保護現場:保護現場: PUSH 恢復現場:恢復現場:POP(5) 注意子程序的通用性。注意子程序的通用性。主程序調用子程序的指令:主程序調用子程序的指令: “LCALL”,“ACALL”。 子程序返回指令:子程序返回指令:RET。子程序可以嵌套,子程序可以嵌套,嵌套次數從理論上說是無限的,但實際上由于受堆棧深嵌套次數從理論上說是無限的,但實際上由于受堆棧深度的影響,嵌套次數是有限的。

31、度的影響,嵌套次數是有限的。例例4-10 4-10 在圖在圖3-11 3-11 的的P1P1口與口與LEDLED的連接示意圖中,若使得的連接示意圖中,若使得LED0LED7LED0LED7依次點亮,其延時時間分別從依次點亮,其延時時間分別從1s1s至至8s8s,LED7LED7點亮之點亮之后又從后又從LED0LED0開始循環。編寫匯編語言源程序實現該功能開始循環。編寫匯編語言源程序實現該功能。 ORG1000HMOVA,#1;主程序;主程序NEXT1: MOV20H,#0MOV R3,#8NEXT:INC20H MOV R4,20HMOVP1,AACALL DELAYRLA DJNZ R3,N

32、EXTSJMPNEXT1DELAY:MOV R7,#10;1s延時子程序延時子程序DELAY3:MOVR6,#200 DELAY2:MOV R5,#125DELAY1:DJNZR5,DELAY1;1254500s0.5msDJNZR6,DELAY2;0.5 ms2000.1sDJNZR7,DELAY3;0.1s2001sDJNZR4,DELAYRETEND例例4-11 4-11 兩個無符號數據塊的首地址分別為兩個無符號數據塊的首地址分別為30H30H和和40H40H,每,每個數據塊的第一個字節都存放著數據塊的長度(小于個數據塊的第一個字節都存放著數據塊的長度(小于1515),求各數據塊中最大值

33、的乘積,并將結果存入),求各數據塊中最大值的乘積,并將結果存入50H50H(乘積低字節)和(乘積低字節)和51H51H(乘積高字節)。(乘積高字節)。解:可將求最大值的過程編寫成一個子程序,子程序的入口參數是解:可將求最大值的過程編寫成一個子程序,子程序的入口參數是數據塊的首地址,存放在數據塊的首地址,存放在R1中,返回參數即為最大值,存放在中,返回參數即為最大值,存放在A中,參考程中,參考程序如下:序如下:ORG 1000H;主程序;主程序MOV R1,#30H;置入口條件參數;置入口條件參數ACALL FMAX;調用求最大值子程序;調用求最大值子程序MOV B,A;第一個最大值存放于;第一

34、個最大值存放于BMOV R1,#40H;置入口條件參數;置入口條件參數ACALL FMAX;調用求最大值子程序;調用求最大值子程序MUL AB;求乘積;求乘積MOV 50H,A;存乘積低字節;存乘積低字節MOV 51H,B;存乘積低高字節;存乘積低高字節SJMP $ORG 1200H;子程序;子程序FMAX:MOV A,R1;取數據塊長度;取數據塊長度 MOV R2,A;R2中存放數據塊的長度中存放數據塊的長度 INCR1;改變地址指針;改變地址指針MOVA,R1;將第一個數放入;將第一個數放入ADECR2;數據個數減;數據個數減1LOOP1:INC R1;修改地址指針;修改地址指針 CLR

35、C SUBB A,R1;相減比較大小;相減比較大小 JNC LOOP2;A中的數為大,跳向中的數為大,跳向 MOV A,R1;否則,更換大數到;否則,更換大數到A SJMP LOOP3LOOP2:ADD A,R1;恢復原最大值;恢復原最大值LOOP3:LOOP3:DJNZ R2,LOOP1;若未比較完,則循環;若未比較完,則循環 RET END例:將例:將R0R0和和R1R1所指的內部所指的內部RAMRAM中兩個多字節無符號數相加,結果存入中兩個多字節無符號數相加,結果存入R0R0所指的內部所指的內部RAMRAM中。中。NADD:CLRCNADD1:MOV A,R0ADDC A,R1MOVR0

36、,AINC R0INCR1DJNZR7,NADD1JNCNADD2MOVR0,#01HINCR0NADD2:DEC R0RET4.3 常用程序設計舉例常用程序設計舉例4.3.1 代碼轉換類程序代碼轉換類程序 計算機內部的運算一般都是用二進制,而在計算機與計算機內部的運算一般都是用二進制,而在計算機與外設的數據傳送中常采用外設的數據傳送中常采用BCD碼、碼、ASCII碼和其它代碼,因此碼和其它代碼,因此,就存在代碼轉換的問題。在程序設計中常采用,就存在代碼轉換的問題。在程序設計中常采用算法處理和查算法處理和查表方式表方式來實現代碼轉換。來實現代碼轉換。1. 十六進制數與十六進制數與ASCII碼之

37、間的轉換碼之間的轉換 將將A A中存放的一位十六進制數轉換成其所對應的中存放的一位十六進制數轉換成其所對應的ASCIIASCII碼存入碼存入A A中。中。解:解:HEXAS:CLR C SUBB A,#10JC LOOPADDA, #7LOOP:ADDA, #10 ADDA, #30HEND例例4-12 4-12 將從將從30H30H單元開始的連續單元開始的連續8 8個單元中存放的十六進制數個單元中存放的十六進制數轉換成其所對應的轉換成其所對應的ASCIIASCII碼,并分別存放在從碼,并分別存放在從40H40H開始的開始的1616個單個單元中。元中。解:解:ORG2000HMOVR0, #3

38、0H;設定地址指針;設定地址指針MOVR1, #40HMOVR7, #8;循環次數;循環次數NEXT: MOVA, R0;高字節轉換;高字節轉換 SWAPA ANLA, #0FH ACALL HEXAS MOVR1, A INCR1 MOVA, R0;低字節轉換;低字節轉換 ANLA, #0FH ACALL HEXAS MOVR1, A INCR1;修改地址指針;修改地址指針 INCR0 DJNZR7, NEXT NOP SJMP$HEXAS:CLR C ;十六進制轉換成;十六進制轉換成ASCII碼子程序碼子程序 SUBBA,#10JCLOOPADDA, #7LOOP:ADDA, #10;補償

39、減掉的;補償減掉的10 ADDA, #30HRETEND 例例 把外部把外部RAM 30H3FH單元中的單元中的ASCII碼依次轉換為十六進碼依次轉換為十六進制數,并存入內部制數,并存入內部RAM 60H67H單元之中。單元之中。 假設:假設: 被轉換的被轉換的ASCII為為十六進制數十六進制數(0F)的的ASCII,則,則, 因為:因為: 09 ASCII 3039H AFASCII 4146H 若若 (30H)41HA10 41H30H11H17 因為一個字節可裝兩個轉換后得到的十六進制數,即兩因為一個字節可裝兩個轉換后得到的十六進制數,即兩次轉換才能拼裝為一個字節。為了避免在程序中重復出

40、現轉次轉換才能拼裝為一個字節。為了避免在程序中重復出現轉換程序段,因此通常采用子程序結構,把轉換操作編寫為子換程序段,因此通常采用子程序結構,把轉換操作編寫為子程序。程序。 ORG 5000HMAIN: MOV R0,30H ;設置;設置 ASCII碼地址指針碼地址指針 MOV R1,60H ;設置十六進制數地址指針;設置十六進制數地址指針 MOV R7,08H ;字節個數;字節個數 AB: ACALL TRAN ;調用轉換子程序;調用轉換子程序 SWAP A ;A高低字節交換高低字節交換 MOVXR1, A INC R0 ACALLTRAN ; 調用轉換子程序調用轉換子程序 XCHDA, R

41、1 ;十六進制數拼裝;十六進制數拼裝 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 將兩字節十六進制整數轉換成三字節的將兩字節十六進制整數轉換成三字節的BCD碼。若待轉換的雙字節十六進碼。若待轉換的雙字節十六進制整數在制整數在R6、R7中(中(R6中為高位),轉換后的三字節中為高位),轉換后的三字節BC

42、D碼整數存于碼整數存于R3、R4和和R5中(中(R3中為高位)。中為高位)。解:二進制數解:二進制數b7b6b5b4b3b2b1b0B所對應的十進制數所對應的十進制數X可按照下式計算可按照下式計算因此,只要按照十進制運算法則,將因此,只要按照十進制運算法則,將bi(i=7,6,1,0)按權相加,就可以得到)按權相加,就可以得到相應的十進制數相應的十進制數X。參考程序如下:。參考程序如下:ORG 2000HHEBCD:MOVA,#0;BCD碼初始化碼初始化MOVR3, AMOVR4,AMOVR5,A MOV R2, #16 ;循環次數;循環次數NEXT: CLR C MOV A, R7;R7右移

43、一位并送回右移一位并送回 RLC A MOV R7,A MOVA,R6;R6右移一位并送回右移一位并送回RLCAMOVR6,AMOVA,R5;(;(R5)2并調整為并調整為BCD碼碼ADDCA,R5DAAMOVR5,AMOVA,R4;(;(R4)2并調整為并調整為BCD碼碼ADDCA,R4DAAMOVR4,AMOVA, R3ADDCA,R3MOVR3,A;若萬位數不超過;若萬位數不超過6,則不用調整,則不用調整DJNZR2,NEXT;處理完;處理完16位了嗎?位了嗎? NOP END4.3.2 查表程序查表程序 常用于非線性修正、非線性函數轉換以及代碼轉換等。常用于非線性修正、非線性函數轉換以

44、及代碼轉換等。 專用的查表指令:專用的查表指令: MOVC A,A+DPTR ;遠程查表,;遠程查表, 64KB 通過通過以下三步操作實現查表。以下三步操作實現查表。 將所查表格的將所查表格的首地址送入首地址送入DPTR; 將要查找的將要查找的數據序號數據序號,即數據在表中的位置送入,即數據在表中的位置送入累加器累加器A中中; 執行查表指令執行查表指令 MOVC A,A+DPTR 進行讀數并存結果存進行讀數并存結果存 于累加器于累加器A。MOVC A,A+PC ;近程查表,;近程查表,0+256B其實現查表也可通過以下三步操作來完成。其實現查表也可通過以下三步操作來完成。 將要查找的將要查找的

45、數據序號數據序號,即數據在表中的位置,即數據在表中的位置送入累加器送入累加器A中中; 把從把從查表指令到表的首地址間的偏移量與查表指令到表的首地址間的偏移量與A值相加值相加; 執行查表指令執行查表指令 MOVC A,A+PC 進行讀數,查表結果送進行讀數,查表結果送累加器累加器A。例例4-14 用查表指令編程實現將從用查表指令編程實現將從30H單元開始的連續單元開始的連續8個單元中存放的十六進制數轉個單元中存放的十六進制數轉換成其所對應的換成其所對應的ASCII碼,并分別存放在從碼,并分別存放在從40H開始的開始的16個單元中。個單元中。 ORG2000HASCTAB:DB 30H,31H,3

46、2H,33H,34H,35H,36H,37H;ASCII碼表碼表 DB 38H,39H,41H,42H,43H,44H,45H,46HMOVR0,#30H;設定地址指針;設定地址指針MOVR1,#40HMOVR7,#8;循環次數;循環次數MOVDPTR,#ASCTABNEXT: MOVA,R0;高字節轉換;高字節轉換SWAPAANLA,#0FHMOVCA,A+DPTR; 查表查表MOVR1,A INCR1MOVA,R0; 低字節轉換低字節轉換ANLA,#0FHMOVCA,A+DPTR; 查表查表MOVR1,AINCR1;修改地址指針;修改地址指針INCR0DJNZR7,NEXTNOPEND 例

47、例4-15 在一個巡回檢測系統中,需對在一個巡回檢測系統中,需對8路輸入進行控制,每路都有一最大允許值,路輸入進行控制,每路都有一最大允許值,為雙字節數,且不全相同。控制時,需將輸入值與最大值比較,若超過則進行報警。為雙字節數,且不全相同。控制時,需將輸入值與最大值比較,若超過則進行報警。編寫一子程序使其能查找每路的最大允許值。編寫一子程序使其能查找每路的最大允許值。解:該查表運算中自變量解:該查表運算中自變量X是單字節,而因變量是單字節,而因變量Y是兩字節的數。假設被檢測路數存是兩字節的數。假設被檢測路數存放在放在R7中(入口參數),中(入口參數),07路的最大允許值依次存放在路的最大允許值

48、依次存放在ROM中,查詢得到的最大中,查詢得到的最大值存放在值存放在30H(低字節)和(低字節)和31H(出口參數)中,則參考程序如下:(出口參數)中,則參考程序如下:ORG1000HMOVDPTR, #TABLEMOVA,R7RLA;乘;乘2進行地址修正進行地址修正MOVR7,AMOVCA,A+DPTR;查表取高字節;查表取高字節MOV31H,AINCDPTRMOVA,R7MOVCA,A+DPTR;查表取低字節;查表取低字節MOV30H,ATABLE: DW 1245H, 2345H, 1022H, 2390H; 最大允許值表最大允許值表DW 3421H, 2388H, 2366H, 214

49、7HRET例例 若累加器若累加器A中存放的是一位中存放的是一位BCD碼。通過查表將其轉換成為碼。通過查表將其轉換成為相應的七段顯示碼,并存入寄存器相應的七段顯示碼,并存入寄存器B中。中。 七段數碼顯示管連接方式:共陽極和共陰極兩種。七段數碼顯示管連接方式:共陽極和共陰極兩種。 共陽極是低電平為有效輸入,共陽極是低電平為有效輸入, 共陰極為高電平為有效輸入。共陰極為高電平為有效輸入。 假設數碼顯示管為共陰極。假設數碼顯示管為共陰極。 09的七段碼為的七段碼為 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 由于代碼沒有規律,一般采用查表完成。由于代碼沒有規律,一

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 若內部若內部RAM 30H中存放的是一位中存放的是一位BCD碼,通過查表將其轉換成為相碼,通過查表將其轉換成為相應的七段顯示碼,并存入寄存器應的七段顯示碼,并存入寄存器31H中。中。解:解:09的共陰極字形代碼為的共陰極字形代碼為3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。 ORG 1000HMOVA,30H ADD A,#04H;地址修正;地址修正 MOVC A,A+PCMOV31H,A;2字節指令字節指令SJMP $;2字節指令字節指令 TAB:DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH

52、,6FH END4.2.6 邏輯操作程序邏輯操作程序 例例4-17 寫出圖寫出圖4-7所示電路的邏輯表達式,并編程實現其功能所示電路的邏輯表達式,并編程實現其功能解:該電路圖的最簡邏輯表達式為,解:該電路圖的最簡邏輯表達式為, ORG1000HXBITP1.0;輸入邏輯變量;輸入邏輯變量YBITP1.1ZBITP1.2FBITP1.3;輸出邏輯變量;輸出邏輯變量EXOR:MOVC,XANL C,/YMOV F,C;保存結果于;保存結果于F位位MOV C,YANL C,/XORL C,F ANLC,ZMOVF,C;F()MOVC,XANLC,Y;XYORLC,FMOVF,CEND圖4-7 例4-

53、17的邏輯電路圖=1& 11XYZFXYZ)YX(FYXYXYX例例4-18 在圖在圖3-7中,假設中,假設K1、K2和和K3分別表示分別表示X、Y和和Z三人對某一提案的表決,三人對某一提案的表決,當當K閉合時,表示其同意該方案;當閉合時,表示其同意該方案;當K斷開時,表示不同意該方案。當多數人同意斷開時,表示不同意該方案。當多數人同意時,輸出時,輸出F為為1。假設。假設P1.7連接一共陰極連接一共陰極LED,將結果用,將結果用LED顯示出來。編程實現顯示出來。編程實現此功能。此功能。解:根據數字電路中組合邏輯電路的設計知識,得出該邏輯電路的最簡邏輯函數解:根據數字電路中組合邏輯電路的

54、設計知識,得出該邏輯電路的最簡邏輯函數式是式是F=XY+XZ+YZ,據此設計的參考程序如下:,據此設計的參考程序如下:ORG1000HXBITP1.0YBITP1.1ZBITP1.2MOVC,X;實現;實現XYANLC,YMOV20H,CMOVC,X;實現;實現XZANLC,ZMOV21H,CMOVC,Y;實現;實現YZANLC,ZORLC,21HORLC,20HMOVP1.7,C NOP END例例 設設P1.0P1.3為準備就緒信號輸入端,當該為準備就緒信號輸入端,當該4位輸入全為位輸入全為1時時說明各項工作已準備好,單片機可順序執行主程序,否則循環說明各項工作已準備好,單片機可順序執行主

55、程序,否則循環等待。等待。ORG 2000HLOOP:MOV A,P1ANLA,#0FHCJNE A,#0FH,LOOPMAIN: 例例 用軟件實現邏輯函數用軟件實現邏輯函數 。 其中其中 X、Y、Z、W、F均為位變量,分別對應均為位變量,分別對應P1.0、P1.1、P1.2、P1.3和和P1.7。由開關為。由開關為P1.0、P1.1、P1.2、P1.3輸入值,輸入值,而由而由P1.7輸出該邏輯函數值。輸出該邏輯函數值。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;輸出最后結果;輸出最后結果END第 4 章 匯編語言程序設計 思考題與習題思考題與習題 4-1 把外部把外部RAM 5000H的內容拆開,高位送的內容拆開,高位送5001H,低位送低位送5002H。 4-2 把外部把外部RAM 3000H開始的開始的100字節的內容傳送到字節的內容傳送到從外部從外部RAM 3500H開始的連續單元中。開始的連續單元中。 4-3 設有設有100個有符號數,連續存放在外

57、部個有符號數,連續存放在外部RAM以以2000H為首地址的存儲區中,編程統計其中正數、負為首地址的存儲區中,編程統計其中正數、負數和零的個數,并分別存放在數和零的個數,并分別存放在R5、R6和和R7。 4-4 外部外部RAM 1000H開始連續存放開始連續存放20個雙字節無符號個雙字節無符號數,低字節在前,高字節在后,編寫求和程序,將結數,低字節在前,高字節在后,編寫求和程序,將結果存入內部果存入內部RAM 30H,31H,32H單元中。單元中。 4-5 編程計算片內編程計算片內RAM40H47H單元中無符號數的算單元中無符號數的算術平均值(假設和仍為術平均值(假設和仍為8位數),結果存放在位

58、數),結果存放在50H(商)(商)和和51H(余數)中。(余數)中。4-6 從內部從內部RAM 30H開始存有一無符號數據塊,其長開始存有一無符號數據塊,其長度在度在2FH單元中。求出數據塊中最小值和最大值并分別存入單元中。求出數據塊中最小值和最大值并分別存入R6和和R7中。中。4-7 將上題中將上題中“無符號數無符號數”改為改為“有符號數有符號數”,求出,求出其中的最小值和最大值(參考例其中的最小值和最大值(參考例4-8)。)。4-8 從外部從外部RAM首地址為首地址為1000H、長度為、長度為50H的數據的數據塊中找出第一個塊中找出第一個ASCII碼碼#,并將其地址送到,并將其地址送到10

59、50H和和1051H單元中,如果沒有單元中,如果沒有#,則使,則使1050H和和1051H單元的內容為單元的內容為0。4-9把外部把外部RAM 30H3FH單元中的單元中的ASCII碼依次轉換碼依次轉換為十六進制數,并存入內部為十六進制數,并存入內部RAM 60H67H單元之中。單元之中。4-10假設晶振頻率假設晶振頻率fosc =6MHz,根據圖,根據圖3-11的線路設的線路設計燈亮程序。要求將計燈亮程序。要求將8只發光二極管間隔地分兩組,每組只發光二極管間隔地分兩組,每組4只,只,兩組交叉輪流發光,反復循環不止,每組燈亮持續時間為兩組交叉輪流發光,反復循環不止,每組燈亮持續時間為1s。 4

60、-11用軟件實現邏輯函數用軟件實現邏輯函數 。其中。其中X、Y、Z、W、F均均為位變量,分別對應為位變量,分別對應P1.0、P1.1、P1.2、P1.3和和P1.7。由。由P1.0、P1.1、P1.2、P1.3輸入值,而由輸入值,而由P1.7輸出該邏輯函數值。輸出該邏輯函數值。 4-1 把外部把外部RAM 5000H的內容拆開,高位送的內容拆開,高位送5001H,低位,低位送送5002H。MOVDPTR,#5000HMOVXA,DPTRMOVR1,ASWAP AANLA,#0FHINC DPTRMOVXDPTR,AMOVA,R1ANLA,#0FHINC DPTRMOVXDPTR,A 4-2把外部把外部

溫馨提示

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

評論

0/150

提交評論