

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、單片機原理及應(yīng)用,第二章 匯編語言和匯編程序,匯編語言的基本概念,程序 一條指令只能完成有限的功能,要完成比較復(fù)雜的功能,就要有一組按一定順序排列的指令,即程序。程序是指令的有序集合。本章介紹MCS-51單片機的匯編語言程序設(shè)計。因為實現(xiàn)某一功能的程序并不是唯一的,程序有簡有繁,占用內(nèi)存單元有多有少,執(zhí)行時間有長有短,所以我們應(yīng)根據(jù)單片機的指令系統(tǒng),力求編制簡潔、占內(nèi)存少、執(zhí)行時間短的程序。在程序設(shè)計中,只有精心設(shè)計、選擇合適
2、的指令和合理的結(jié)構(gòu),才能達到上述的目標。,第二章 匯編語言和匯編程序,程序設(shè)計語言,計算機程序設(shè)計語言是計算機能夠理解和執(zhí)行的語言。它隨著計算機的誕生而誕生,它隨著計算機的發(fā)展而發(fā)展。迄今為止,計算機的程序設(shè)計語言很多,但通常分為機器語言、匯編語言、高級語言三種。,1、機器語言 是一種直接為計算機識別和執(zhí)行的機器級語言。有兩種表現(xiàn)形式:一種是二進制形式,一種是十六進制形式。機器語言的二進制形式由二進制代碼“0”和“1”構(gòu)成,可以直接存
3、放在計算機存儲器內(nèi)。機器語言的十六進制形式,由十六個數(shù)字符0-F組成。機器語言難讀、難寫、難記、難改,一般不用來編寫程序。2、匯編語言 是人們用來替代機器語言進行程序設(shè)計的語言。由助記符、保留字和偽指令組成。3、高級語言 是面向過程和問題并能獨立于機器的通用程序設(shè)計語言。,第二章 匯編語言和匯編程序,匯編語言概述,用助記符編寫的程序設(shè)計語言稱為匯編語言。匯編語言是面向機器的語言,和CPU有關(guān),不同的CPU的機器有不同的匯編語言
4、;匯編語言屬于低級語言;程序設(shè)計就是編寫計算機程序的過程;特點:用匯編程序設(shè)計單片機程序時,對數(shù)據(jù)的存放、寄存器和工作單元的使用等具體工作要由設(shè)計者來安排。而設(shè)計高級語言時,這些工作都由計算機自動安排,程序設(shè)地者不必過問。,第二章 匯編語言和匯編程序,程序設(shè)計步驟,分析問題,確定算法,繪制程序流程圖,分配內(nèi)存單元,編寫匯編源代碼,調(diào)試,,,,,,第二章 匯編語言和匯編程序,程序設(shè)計步
5、驟,分析問題 首先,要對需要解決的問題進行分析,以求對問題有正確的理解,明確任務(wù)和要求。例如,解決問題的目的是什么,最終要達到什么要求,現(xiàn)有的條件,已知的數(shù)據(jù),對運算精度各速度方面的要求等。確定算法 解決一個問題,常常有幾種可選擇的方法。從數(shù)學(xué)角度來描述,可能有幾種不同的算法。在編制程序前,先對不同的算法進行分析比較,找出最適宜的算法。,第二章 匯編語言和匯編程序,程序設(shè)計步驟,繪制程序流程圖程序設(shè)計工作往往很復(fù)雜,為了把復(fù)
6、雜的工作條理化,經(jīng)常使用流程圖使設(shè)計思路清晰、直觀;(工具Visio)流程圖是一些規(guī)定的幾何圖形,通過帶箭頭的線條有機地連在一起而組成的,是對程序執(zhí)行過程的一種形象描述;橢圓框:表示程序的起始或結(jié)束;矩形框:表示要進行的工作;菱形框:表示要判斷的事情,菱形框的表達式表示要判斷的內(nèi)容;圓圈:表示連接點;流程線:表示程序的走向;子程序框:表示調(diào)用子程序。,準備,開始/結(jié)束,判斷,調(diào)用,,,過程,第二章 匯編語言和匯編程序,程序
7、設(shè)計步驟,分配內(nèi)存單元 分配內(nèi)存單元,確定程序和數(shù)據(jù)區(qū)的其實地址;編寫源程序 按流程圖要求編寫指令,所編程序力求簡潔明了,層次清晰,運算迅速,少占內(nèi)存。調(diào)試程序 程序編制好后,必須經(jīng)過上機調(diào)試檢查。先將匯編程序通過匯編生成目標程序,消除語法錯誤;再可以通過仿真軟件模擬調(diào)試,如觀看寄存器的值的變化;最后在實際系統(tǒng)進行聯(lián)調(diào),直到達到預(yù)定要求。,第二章 匯編語言和匯編程序,程序設(shè)計的基本技術(shù),第二章 匯編語言和匯編程序,程序設(shè)計
8、的基本技術(shù),順序程序:是最簡單的程序,它的執(zhí)行順序和程序中指令的排列順序完全一致。分支程序:執(zhí)行順序和指令存儲順序失去了完全的一致性。把不同的處理方法編制成各自的處理程序,運行時由計算機根據(jù)不同的條件自動做出選擇判別,繞過某些指令,僅執(zhí)行相應(yīng)的處理程序段。循環(huán)程序:重復(fù)地執(zhí)行某些指令?!跋葓?zhí)行,后判斷”;“先判斷,后執(zhí)行”兩種。子程序:不同的程序中或同一個程序中的不同位置常常用到功能完全一致的程序段。這種被獨立出來的程序段被稱為子
9、程序。,第二章 匯編語言和匯編程序,3.1 順序程序設(shè)計,順序結(jié)構(gòu)流程圖,準備,結(jié)束,,過程1,過程2,,,例:將內(nèi)部RAM 40H單元中一壓縮BCD數(shù)轉(zhuǎn)換為二進制數(shù)。關(guān)鍵知識點:壓縮BCD數(shù):例,98H表示10進制數(shù)98。十位9存放在40H的高4位,個位8存放在40H的低4位;十位乘以10,再加上個位,為二進制數(shù),即可實現(xiàn)轉(zhuǎn)換;100的10進制數(shù),為二進制的64H;,第二章 匯編語言和匯編程序,,3.1 順序程序設(shè)計,MO
10、V A, 40H;將BCD數(shù)的十位放A的低4位SWAP AANL A, #0FHMOV B, #10MUL AB;十位乘以10ANL 40H, #0FH;將BCD數(shù)的個位保留在40H單元中ADD A, 40H;10位乘以10加個位MOV 40H, A,第二章 匯編語言和匯編程序,3.1 順序程序設(shè)計,例: 設(shè)一個非壓縮BCD數(shù)(0~9)放在內(nèi)部RAM 60H單元中,求
11、其平方值并放入內(nèi)部RAM 61H單元中。關(guān)鍵知識點:查找表方法實現(xiàn),運算速度快。0~9的平方值,建表放入存儲器(劃分)中;最大值81,用BCD數(shù)構(gòu)造,均為1個字節(jié)因此,平方表的首地址與任意BCD數(shù)之和正是該BCD數(shù)平方值的存放地址。,第二章 匯編語言和匯編程序,,3.1 順序程序設(shè)計,MOV DPTR, #SQTABMOV A, 60HMOVC A, @A+DPTRMOV 61H, A …SQ
12、TAB: DB 0,1,4,9,16,25,36,49,64,81,第二章 匯編語言和匯編程序,3.2 分支程序設(shè)計,分支結(jié)構(gòu)流程圖,,,單分支,多分支,第二章 匯編語言和匯編程序,3.2 分支程序設(shè)計,例:內(nèi)部RAM40H和41H單元中各有一無符號數(shù),比較其大小,將大數(shù)存放于內(nèi)部RAM60H單元,小數(shù)存放于內(nèi)部RAM61H單元,如兩數(shù)相等,則分別送往這2個單元。要點:用比較不等轉(zhuǎn)移指令CJNE比較這2個無符號數(shù),先確定它們是否
13、相等,若不相等時在根據(jù)借位標志確定這2個數(shù)的大小。,第二章 匯編語言和匯編程序,3.2 分支程序設(shè)計,,MOV A, 40H MOV 61H, 41H CJNE A, 41H, $+3 JNC AGEQ;A≥(41H)則無借位 XCH A, 61H;A<(41H)有借位AGEQ: MOV 60H,A;A與(61H)交換 SJMP $ END,第二章 匯編語
14、言和匯編程序,3.2 分支程序設(shè)計,,MOV A, 40H MOV B, 41H CJNE A, B, NOT_EQU MOV 61H, A;相等 MOV 60H, A AJMP DONENOT_EQU: JC SMALL MOV 60H, A;大于
15、 MOV 61H, B AJMP DONESMALL: MOV 61H, A;小于 MOV 60H, BDONE: SJMP $,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,循環(huán)結(jié)構(gòu)流程圖,,,先執(zhí)行,后判斷,先判斷,后執(zhí)行,,,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,例:計數(shù)控制的循環(huán)程序 有20字節(jié)無符
16、號數(shù)存放在內(nèi)部RAM50H開始的單元中,求它們的和,將和放內(nèi)部RAM4EH和4FH單元中。要點:加法共計進行20 次,用R7計數(shù),用R0間(接尋)址。4EH和4FH兩單元既存放最終結(jié)果也存放中間結(jié)果,開始時將它們清零。,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV 4EH, #0MOV 4FH, #0MOV R7, #20;設(shè)置計數(shù)器MOV R0, #50;設(shè)置間接地址指針
17、LOOP: MOV A, 4FHADD A, @R0;加一單元的內(nèi)容MOV 4FH, ACLR A ADDC A, 4EH;加累加時產(chǎn)生的進位,存在4EH中MOV 4EH, AINC R0;修改間址指針DJNZ R7, LOOPSJMP $ END,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV 4EH, #0
18、 MOV 4FH, #0 MOV R0, #50H;設(shè)置間接地址指針 MOV R7, #20;設(shè)置計數(shù)器LOOP: MOV A, @R0 ADD A, 4FH;加一單元的內(nèi)容 MOV 4FH, A MOV A, #0H ADDC A, 4EH;加累加時產(chǎn)生的進位,存在4EH中 MOV 4
19、EH, A INC R0;修改間址指針 DJNZ R7, LOOP SJMP $,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,例:條件控制的循環(huán)程序 將內(nèi)部RAM 30H中的無符號數(shù)轉(zhuǎn)換為十進制數(shù),結(jié)果放入R6和R7中。要點:,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV 31H, #0;31H~33H 3單元清零MOV 32H, #0
20、MOV 33H, #0MOV R0, #33H;設(shè)置間址寄存器MOV A, 30H;無符號數(shù)送ALOOP:MOV B, #10;置除數(shù)10CJNE A, #0, NEZ;被除數(shù)為0?MOV A, 32H;為0,將31H~33H中的ASCII BCD數(shù)SWAP A;拼為壓縮BCD數(shù)放入R6和R7中ORL A, 33HMOV
21、 R7, AMOV R6, 31HSJMP $NEZ:DIV AB;被除數(shù)不為0,除以10MOV @R0, B;存余數(shù),逐漸存入33H~31HDEC R0;修改間址指針SJMP LOOP END,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV 31H, #0;31H~33H 3單元清零 MOV 32H, #0 M
22、OV 33H, #0 MOV R0, #33H;設(shè)置間址寄存器 MOV A, 30H;無符號數(shù)送ALOOP: JZ DONE;被除數(shù)為0 MOV B, #10;置除數(shù)10 DIV AB MOV @R0, B DEC R0 SJMP LOOPDONE: MOV
23、A, 32H;為0,將31H~33H中的ASCII BCD SWAP A;數(shù)拼為壓縮BCD數(shù)放入R6和R7中 ORL A, 33H MOV R7, A MOV R6, 31H SJMP $,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,例:雙重控制的循環(huán)程序 把內(nèi)部RAM中起始地址為30H的字節(jié)數(shù)據(jù)串傳送到外部RAM1000H
24、為首地址的區(qū)域,直到發(fā)現(xiàn)‘$’字符的ASCII碼為止。數(shù)據(jù)串的最大長度為32個字節(jié)。要點:這是計數(shù)(32個)控制和條件控制(‘$’)雙重控制的循環(huán)程序。,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV R0, #30H ;內(nèi)部RAM字節(jié)串間址指針MOV DPTR, #1000H ;外部RAM字節(jié)串間址指針MOV R7, #32 ;設(shè)置計數(shù)循環(huán)計數(shù)器LOOP:CJNE @R0, #‘
25、$’,ISO;是‘$’嗎?不是轉(zhuǎn)移去ISOSJMP $ ;是,結(jié)束ISO:MOV A, @R0 ;從內(nèi)部RAM中取數(shù)MOVX @DPTR,A ;送外部RAMINC R0 ;修改內(nèi)部RAM間址指針I(yè)NC DPTR ;修改外部RAM間址指針DJNZ R7, LOOP ;已傳送32個嗎?沒有,循環(huán)SJMP $ ;傳送32個,結(jié)束END,第二章 匯編語言和匯編程
26、序,3.3 循環(huán)程序設(shè)計,,MOV R0,#30H;內(nèi)部RAM字節(jié)串間址指針MOV DPTR,#1000H;外部RAM字節(jié)串間址指針MOV R7,#0;設(shè)置計數(shù)循環(huán)計數(shù)器LOOP:MOV A, @R0CJNE A,#'$',NOT_EQU;是‘$’嗎?不是轉(zhuǎn)移去NOT_EQUAJMP FINISH;是,結(jié)束NOT_EQU:MOVX @DPTR,A;送外部RAM
27、INC R0;修改內(nèi)部RAM間址指針I(yè)NC DPTR ;修改外部RAM間址指針I(yè)NC R7;修改計數(shù)值CJNE R7, #32, LOOP;已傳送32個嗎?沒有,循環(huán)FINISH:SJMP $;傳送32個,結(jié)束,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,例:編制將連續(xù)存放在內(nèi)部RAM20H為首地址存儲器區(qū)域中的n各無符號字節(jié)數(shù)據(jù)的排序的程序。要點:排序問題可以采取
28、逐一比較法和兩兩比較法。,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,1,3,4,8,9,5,7,6,2,0,1,1,1,4,8,9,5,7,6,2,0,3,1,1,3,8,9,5,7,6,2,0,4,1,1,3,4,9,5,7,6,2,0,8,1,1,3,4,8,5,7,6,2,0,9,1,1,3,4,8,5,7,6,2,0,9,1,1,3,4,8,5,7,6,2,0,9,1,1,3,4,8,5,7,6,2,0,9,1,1,3
29、,4,8,5,7,6,2,0,9,9,1,3,4,8,5,7,6,2,0,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,逐一比較法:MOV R0, #20H;R0指向數(shù)據(jù)區(qū)MOV R7, #19;置外循環(huán)計數(shù)器R7,(n=20)OUT:MOV R6, R7;置內(nèi)循環(huán)計數(shù)器R6PUSH 00H ;0組的R0進棧MOV A, @R0;取內(nèi)循環(huán)環(huán)間址指針I(yè)N:
30、INC R0MOV B, @R0CJNE A, B, $+3;比較A≥@R0?JNC NXCHG;大于等于不交換XCH A, @R0;小于交換NXCHG:DJNZ R6, IN;判斷內(nèi)循環(huán)是否結(jié)束POP 00H;內(nèi)循環(huán)結(jié)束R0出棧MOV @R0,A;存內(nèi)循環(huán)的最大值INC R0;修改外循環(huán)間址指針DJNZ
31、 R7, OUT;判斷外循環(huán)是否結(jié)束?SJMP $END,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,MOV R0, #20H;R0指向數(shù)據(jù)區(qū) MOV R7, #19;置外循環(huán)計數(shù)器R7,(n=20)OUT: MOV R6, 07H ;置內(nèi)循環(huán)計數(shù)器R6 MOV A, @R0;取外循環(huán)間址指針
32、 MOV R1, 00H INC 01H;取內(nèi)循環(huán)間址指針I(yè)N: MOV B, @R1 CJNE A, B, NOT_EQU AJMP OVERNOT_EQU: JC SMALL AJMP OVERSMALL: XCH A, @R1
33、OVER: INC R1 DJNZ R6, IN MOV @R0, A INC R0 DJNZ R7, OUT SJMP $,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,1,3,4,8,9,5,7,6,2,0,3,1,4,8,9,5,7,6,2,0,3,4,1,8,9,5,7,6,2,
34、0,3,4,8,1,9,5,7,6,2,0,3,4,8,9,1,5,7,6,2,0,3,4,8,9,5,1,7,6,2,0,3,4,8,9,5,7,1,6,2,0,3,4,8,9,5,7,6,1,2,0,3,4,8,9,5,7,6,2,1,0,3,4,8,9,5,7,6,2,1,0,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,CLR F0;清交換標志MOV R7, #19;設(shè)置外循環(huán)計數(shù)器OUT:MOV
35、R0, #20H;R0指向數(shù)據(jù)區(qū) MOV R7, #19;設(shè)置外循環(huán)計數(shù)器MOV R6, R7IN:MOV A, @R0;取一數(shù)據(jù)到AINC R0MOV B, @R0;取下一單元數(shù)據(jù)到BCJNE A, B,$+3;A≥@R0JNC NEXCHG;大于等于不交換XCH A, @R0;小于交換DEC R0MOV @R0,AINC
36、R0SETB F0;置交換標志NEXCHG:DJNE R6, IN;內(nèi)循環(huán)結(jié)束?DEC R7;下次的內(nèi)循環(huán)少一次JBC F0, OUT;交換發(fā)生繼續(xù)外循環(huán),并清交換標志SJMP $;未交換結(jié)束循環(huán)END,兩兩比較法,第二章 匯編語言和匯編程序,3.3 循環(huán)程序設(shè)計,,OUT: CLR F0;清交換標志 MOV R0,#20H
37、 ;R0指向數(shù)據(jù)區(qū) MOV R1,#21H ;R1指向數(shù)據(jù)區(qū) MOV R6,#19IN: MOV A,@R0 MOV B,@R1 CJNE A,B,NOT_EQU AJMP OVERNOT_EQU: JC SMALL A
38、JMP OVERSMALL: XCH A,@R1 MOV @R0,A SETB F0OVER: INC R0 INC R1 DJNZ R6,IN JNB F0,FINISH AJMP OUTFINISH: SJMP $,兩兩比較法,第二章 匯編語言和匯編程
39、序,3.4 子程序設(shè)計,子程序是具有完整功能的程序段。子程序在結(jié)構(gòu)上應(yīng)具有通用性和獨立性,在編寫子程序應(yīng)注意以下幾點:子程序的第一條指令地址稱為子程序的入口地址。該指令必須有標號,標號應(yīng)以子程序的任務(wù)定名,以便一看就一目了然;主程序調(diào)用子程序是通過安排在主程序的調(diào)用指令實現(xiàn)的,子程序返回主程序必須執(zhí)行安排在子程序末尾的一條RET返回指令;主程序調(diào)用子程序和子程序返回主程,計算機能自動保護和恢復(fù)主程序的斷點地址(PC值)。但對于各
40、工作寄存器、特殊功能寄存器和內(nèi)存單元中的內(nèi)容,如果需要保護和恢復(fù)必須在子程序開頭和末尾(RET指令前)安排一些能夠保護和恢復(fù)它們的指令。,第二章 匯編語言和匯編程序,3.4 子程序設(shè)計,例:求內(nèi)部RAM中兩個無符號數(shù)字節(jié)串(串長小于16)的最大值的乘積。要點:因為要求兩個串中的字節(jié)數(shù)據(jù)的最大值,故將查找最大值的程序段編制為子程序。兩個字節(jié)串均存放在內(nèi)部RAM中,首地址分別為60H和70H。入口參數(shù):串首地址存放在R0中,串長度存
41、放在R7中;出口參數(shù):串中的字節(jié)數(shù)據(jù)的最大值存放在A中。,第二章 匯編語言和匯編程序,3.4 子程序設(shè)計,,MOV R0, #60HMOV R7, #N6;N6為串長ACALL MAXMOV B, A;存入一乘數(shù)MOV R0, #70HMOV R7, #N7;N7為另一串長ACALL MAXMUL ABMOV 5EH,B;乘積的高字節(jié)放5EH單元MOV 5FH,A;乘積的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論