




已閱讀5頁,還剩65頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章 匯編語言程序設計及知識,4.1 編程的步驟、方法和技巧 4.2 匯編語言源程序的編輯和匯編,4.1 編程的步驟、方法和技巧,4.1.1 編程的步驟 4.1.2 編程的方法和技巧 4.1.3 匯編語言程序的基本結構,4.1.1 編程的步驟,一、分析問題 二、確定算法 三、畫程序流程圖 四、編寫程序,一、分析問題,對需要解決的問題進行分析,以求對問題由正確的理解。如, 解決問題的任務是什么? 工作過程? 現有的條件,已知數據,對運算的精度和速度方面的要求? 設計的硬件結構是否方便編程?,二、確定算法,算法是如何將實際問題轉化成程序模塊來處理。 在編程以前,先要對幾種不同的算法進行分析、比較,找出最適宜的算法,三、畫程序流程圖,程序流程圖是使用各種圖形、符號、有向線段等來說明程序設計過程的一種直觀的表示。 流程圖步驟分得越細致,編寫程序是也越方便。 畫流程圖是程序結構設計是采用的一種重要手段。 一個系統軟件有總的流程圖(主程序框圖)和局部的流程圖。 流程圖常采用的圖形和符號。,橢圓框,或桶形框,:表示程序的開始或結束。,矩形框,:表示要進行的工作。,菱形框,:表示要判斷的事情,菱形框內的表達式表示要判斷的內容。,圓圈,:表示連接點,指向線,:表示程序的流向,四、編寫程序,用80C51匯編語言編寫的源程序行(一條語句)包括四個部分,也叫四個字段: 標號:操作碼操作數;注釋 每個字段之間要用分隔符分隔,而每個字段內部不能使用分隔符。可以用作分隔符的符號:空格“ ”、冒號“:”、逗號“,”、分號“;”等。 例:LOOP:MOV A,#00H;立即數00HA,標號,標號是用戶定義的符號地址。 一條指令的標號是該條指令的符號名字,標號的值是匯編這條指令時指令的地址。 標號由以英文字母開始的18個字母或數字組成,以冒號“:”結尾。 標號可以由賦值偽指令賦值,如果沒有賦值,匯編程序把存放該指令目標碼第一字節的存儲單元的地址賦給該標號,所以,標號又叫指令標號。,操作碼,操作碼是必不可少的。 它用一組字母符號表示指令的操作碼。在80C51中,由80C51的指令助記符組成。,操作數,匯編語言指令可能要求或不要求操作數,所以這一字段可能有也可能沒有。 若有兩個操作數,操作數之間用逗號“,”分開。 操作數包括的內容有: (1)工作寄存器:由PSW.3和PSW.4規定的當前工作寄存器區中的R0R7。 (2)特殊功能寄存器:21個SFR的名字。 (3)標號名:賦值標號由匯編指令EQU等賦值的標號;指令標號指令標號指示的指令的第一字節地址是該標號的值。 (4)常數:可用二進制(B)、十進制、十六進制(H),若常數以字符開頭,前面加0。 (5)$:用來表示程序計數器的當前值。 (6)表達式:匯編時,計算出表達式的值填入目標碼。,注釋,注釋部分不是匯編語言的功能部分,只是用語增加程序的可讀性。 良好的注釋是匯編語言程序編寫中的重要組成部分。,4.1.2 編程的方法和技巧,一、模塊化的程序設計方法 二、編程技巧,一、模塊化的程序設計方法,1、程序功能模塊化的優點 2、劃分模塊的原則,1、程序功能模塊化的優點,單個模塊結構的程序功能單一,易于編寫、調試和修改。 便于分工,從而可使多個程序員同時進行程序的編寫和調試工作,加快軟件研制進度。 程序可讀性好,便于功能擴充和版本升級。 對程序的修改可局部進行,其它部分可以保持不變。 對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調用。,2、劃分模塊的原則,每個模塊應具有獨立的功能,能產生一個明確的結果,即單模塊的功能高內聚性。 模塊之間的控制耦合應盡量簡單,數據耦合應盡量少,即模塊間的低耦合性。控制耦合是指模塊進入和退出的條件及方式,數據耦合是指模塊間的信息交換方式、交換量的多少及交換頻繁程度。 模塊長度適中。20條100條的范圍較合適。,二、編程技巧,1、盡量采用循環結構和子程序。 2、盡量少用無條件轉移指令。 3、對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數的寄存器外,子程序中用到的其他寄存器的內容應壓入堆棧(返回前再彈出),即保護現場。 4、在中斷處理程序中,除了要保護處理程序中用到的寄存器外,還要保護標志寄存器。 5、用累加器傳遞入口參數或返回參數比較方便,在子程序中,一般不必把累加器內容壓入堆棧。,4.1.3 匯編語言程序的基本結構,一、順序程序 二、分支程序 三、循環程序,一、順序程序,順序程序是最簡單的程序結構,即順序結構。 程序按順序一條一條地執行指令。 例1:三字節無符號數相加(50H)(51H)(52H)(50H)(51H)(52H)+(53H)(54H)(55H),MOV R0,#52H MOV R1,#55H MOV A,R0 ADD A,R1 MOV R0,A DEC R0 DEC R1 MOV A,R0 ADDC A,R1 MOV R0,A DEC R0 DEC R1,MOV A,R0 ADDC A,R1 MOV R0,A CLR A ADDC A,#00H MOV R0,#20H MOV R0,A 把進位結果送到20H單元,(50H)(51H)(52H)(50H)(51H)(52H)+(53H)(54H)(55H),順序結構 例2、字節分解,FJ: MOV A, 30H ANL A, #0FH MOV 50H, A MOV A, 30H ANL A, #0F0H MOV 51H, A RET 有問題嗎?,二、分支程序,程序分支是通過條件轉移指令實現的,即根據條件對程序的執行進行判斷、滿足條件則進行程序轉移,不滿足條件就順序執行程序。 分支程序又分為單分支和多分支結構。 多分支程序是首先把分支程序按序號排列,然后按序號值進行轉移。,二、分支程序,在MCS-51指令系統中,通過條件判斷實現單分支程序轉移的指令有:JZ、JNZ、CJNE、DJNZ等。此外還有以位狀態作為條件進行程序分支的指令,如JC、JNC、JB、JNB、JBC等。使用這些指令可以完成0、1、正、負,以及相等、不相等作為各種條件判斷依據的程序轉移。 結構如圖4-1所示。,圖4-1,START: CLR C MOV DPTA,#ST1 MOVX A,DPTR MOV R2,A INC DPTR MOVX A,DPTR SUBB A,R2 JNC BIG1 XCH A,R2,BIG0:INC DPTR MOVX DPTR,A RET BIG1: MOVX A,DPTR SJMP BIG0,單分支舉例:外部RAM中有ST1、ST2、ST3共3個連續單元,要求從ST1、ST2兩個單元中找出大數存入ST3中。 (均為無符號數),CJNE A,55H,LOOP1 AJMP FH LOOP1:JNC JW CJNE A,54H,LOOP2 AJMP FH LOOP2:JC SW FH: RET,多重單分支舉例:溫度值Ta在A中,內部RAM54H放溫度下限,55H放溫度上限。根據溫度比較,采取JW、SW、FH。,例: 128種分支轉移程序。 功能:根據入口條件轉移到128個目的地址。 入口:(R3)=轉移目的地址的序號00H7FH。 出口:轉移到相應子程序入口。,通過轉移指令表實現程序多分支舉例,鍵盤上有3個鍵 鍵值放在A中 01執行DS 02執行XS 03執行CR, MOV DPTR,#3000H CLR C RLC A JMP A+DPTR 3000H 3001H 3002H AJMP DS 3003H 3004H AJMP XS 3005H 3006H AJMP CR ,MOV A,R3 MOV DPTR,#brtab MOVC A,A+DPTR JMP A+DPTR BRTAB: DB BR0_BRTAB DB BR1_BRTAB DB BR2_BRTAB DB BR3_BRTAB,BR0:MOV A,R0 SJMP BRE BR1 :MOVX A,R0 SJMP BRE BR2: MOV A,R1 ANL A,#0FH ANL P2,#0FH ORL P2,A MOVX A,R0 BR3: MOV DPL,R0 MOV DPH,R1 MOVX A,DPTR BRE : SJMP $,通過數據表實現程序多分支舉例,分支序號放在R3中,MOV DPTR,#BRTAB MOV A,R0 RL A MOV R1,A INC A MOVC A,A+DPTR PUSH ACC MOV A,R1 MOVC A,A+DPTR PUSH ACC RET BRTAB:DW BR0 DW BR1 DW BR127,通過堆棧實現程序多分支舉例,分支序號放在R0中,分支程序入口地址放在BRATAB表中,子程序返回指令RET、RETI,彈出斷點送給PC,先彈高8位,后彈低8位;DW定義數據字命令:高8位在前,低8位在后,MOV DPTR,#BS RL A MOV R2,A MOVC A,A+DPTR PUSH ACC MOV A,R2 INC A,MOVC A,A+DPTR MOV DPH,A POP DPL CLR A JMP A+DPTR BS:DB RK0L DB RK0H DB RK1L DB RK1H DB RK2L DB RK2H ,鍵碼放在A中 鍵碼 入口地址 0 RK0 1 RK1 2 RK2 ,三、循環程序,在程序運行時,有時需要連續重復執行某段程序,可以使用循環程序。其結構包括四部分: 1、置循環初值 2、循環體(循環工作部分) 3、修改控制變量 4、循環控制部分,1、置循環初值,對于循環程序中所使用的工作單元,在循環開始時應置初值。 例如,工作寄存器設置計數初值,累加器A清0,以及設置地址指針、長度等。,2、循環體(循環工作部分),重復執行的程序段部分,分為循環工作部分和循環控制部分。 循環控制部分每循環一次,檢查結束條件,當滿足條件時,就停止循環,往下繼續執行其他程序,3、修改控制變量,在循環程序中,不許給出循環結束條件。 常見的是計數循環,當循環了一定的次數后,就停止循環。 在單片機中,一般用一個工作寄存器Rn作為計數器,對該計數器賦初值作為循環次數。每循環一次,計數器的值減1,即修改循環控制變量,當計數器的置件為0時,就停止循環。,4、循環控制部分,根據循環結束條件,判斷是否結束循環。 80C51可采用DJNZ指令來自動修改控制變量并能結束循環。,置初值,循環體,循環修改,循環控制,退出循環,未完,完,(a),置初值,循環體,循環修改,循環控制,退出循環,未完,完,(b),圖 循環組織方式流程圖,MOV R2,#0FFH MOV R0,#3FH LOOP:INC R2 INC R0 CJNE R0,#0DH,LOOP RET,字符串存放在內部RAM從40H單元開始的連續單元,以回車符結束。試統計字符串長度。,把內部RAM起始地址為data的數據串傳送到外部RAM以buffer為首的區域,直到發現“$”字符為止,數據串最大長度32字節。,MOV R0,#data MOV DPTR,#buffer MOV R1,#20H LOOP: MOV A,R0 SUBB A,#24H JZ LOOP1 MOVX DPTR,A INC DPTR INC R0 DJNZ R1,LOOP LOOP1:RET (思考本程序有何問題),不帶符號的N個單字節數,依次存放在外部RAM21H開始的單元中,求其和放在R1R2中,R1放高字節。,MOV R0,#21H MOV R3,#N MOV R1,#00H MOV R2,#00H LOOP:MOVX A,R0 ADD A,R2 MOV R2,A JNC LOOP1 INC R1 LOOP1:INC R0 DJNZ R3,LOOP,兩個N字節數分別存放在內部RAM中,低字節在前,高在后,R0指定被減數單元地址,R1指定減數單元地址,差放在被減數單元,CLR C MOV R2,#N LOOP:MOV A,R0 SUBB A,R1 MOV R0,A INC R0 INC R1 DJNZ R2,LOOP JC QAZ RET,三字節無符號數相加,被加數在內部RAM20H22H單元, 加數在2AH2CH單元(低位在前),和放在被加數單元,MOV R0,#20H MOV R1,#2AH MOV R7,#03H CLR C LOOP:MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R7,LOOP CLR A ADDC A,#00H MOV R0,A,單循環定時 MOV R5,#TIME LOOP:NOP NOP DJNZ R5,LOOP 最長定時時間: 25682048us,較長時間定時 MOV R5,#TIME1 LOOP2:MOV R4,#TIME2 LOOP1:NOP NOP DJNZ R4,LOOP1 DJNZ R5,LOOP2 RET 最大定時: (256421)25624 525828us,定時程序舉例(假設晶振頻率6MHz),MOV R0,#TIME LOOP:ADD A,R1 INC DPTR DJNZ R0,LOOP 定時:10TIME(us) 若要求定時24us, 增加NOP指令:啞指令 本程序中ADD、INC均作為啞指令出現,以一個基本延時程序滿足不同的定時要求 比如設計一個1s的延時程序進行調用,數據極值查找程序,MOV R0,#20H MOV R7,#08H MOV A,R0 DEC R7 LOOP:INC R0 MOV 2AH,R0 CJNE A,2AH,CHK CHK: JNC LOOP1 MOV A,R0 LOOP1:DJNZ R7,LOOP MOV 2BH,A HERE: AJMP HERE,內部RAM20H單元開始存放8個無符號8位2進制數,找出其中最大數。 極值查找操作的主要內容就是進行數據大小比較。假定在比較過程中,A放大數,與之比較的另一個數放在2AH單元中,比較結束后,最大數送2BH單元。,四、子程序的設計 步驟: 1、確定子程序名稱,即入口標號。 2、確定子程序的輸入/輸出參數。 3、確定所用的寄存器和存儲單元,以便現場保護。斷點保護由指令自動完成。 4、確定子程序的算法,編寫源程序。 舉例:多字節BCD數加法。,子程序: ADDB: PUSH PSW PUSH ACC CLR C LOOP: MOV A, R0 ADDC A, R1 DA A MOV R0, A INC R0 INC R1 DJNZ R2, LOOP POP ACC POP PSW RET,4字節BCD數相加主程序: MOV R0, #20H MOV R1, #30H MOV R2, #04H LCALL ADDB,五、查表程序 查表用指令 MOVC A, A+DPTR MOVC A, A+PC,MOV DPTR, #TAB MOVC A, A+DPTR RET TAB: DB 00, 01, 04, 09, 16 DB 25, 36, 49, 64, 81,ADD A, #1 MOVC A, A+PC RET TAB: DB 00, 01, 04, 09, 16 DB 25, 36, 49, 64, 81,例:用查表法求(09)的平方,4.2 匯編語言源程序的編輯和匯編,4.2.1 源程序編輯 4.2.2 源程序的匯編 4.2.3 偽指令,4.2.1 源程序編輯,在微型計算機上,借助編輯軟件,編寫或修改匯編語言源程序。如行編輯或屏幕編輯軟件。,4.2.2 源程序的匯編,匯編:將匯編語言源程序轉換為機器碼表示的目標程序的過程。對單片機有: 一、手工匯編 二、機器匯編 三、反匯編,一、手工匯編,通過手工方式查指令編碼表,逐個把助記符指令“翻譯”成機器碼,然后把得到的機器碼程序鍵入單片機,進行調試和運行。 手工匯編的缺點: 1、偏移量的計算容易出錯 2、程序的修改會引起后面指令地址的變化,轉移指令的偏移量也要重新計算。,二、機器匯編,機器匯編是在計算機上使用交叉匯編程序進行源程序的匯編。匯編工作由機器自動完成,最后得到以機器碼表示的目標程序。,三、反匯編,將二進制機器語言程序翻譯成匯編語言程序的過程稱反匯編。 匯編和反匯編的過程如圖所示。,源程序 (匯編語言),目標碼 (機器語言),匯編(匯編程序),反匯編(匯編程序),圖 匯編和反匯編過程,4.2.3 偽指令,偽指令不是真正的指令,無對應的機器碼,在匯編時不產生目標程序,只是用來對匯編過程進行某種控制。,ORG 匯編起始命令,格式:ORG 16位地址 功能:規定該偽指令后面程序的匯編地址,即匯編后生成目標程序存放的起始地址。例如: ORG 2000H START:MOV A,#64H 規定了START的地址是2000H,又規定了匯編后的第一條指令碼從2000H開始存放。,END 匯編結束指令,格式:END 功能:通知匯編程序結束匯編。在END之后所有的匯編指令均不予以處理。,EQU 賦值命令,格式:字符名稱 EQU 項(數或匯編符號) 功能:把“項”賦給“字符名稱”。 注意:字符名稱不等于標號(其后沒有冒號);其中的項,可以是數,也可以是匯編符號。EQU賦值過的符號名可以用作數據、代碼地址、位地址或一個立即數。可以是8位的,也可以是16位的。 例如:,EQU 賦值命令,例1: AA EQU R1 MOV A,AA;AA代表工作寄存器R1 例2: A10 EQU 10 DELY EQU 07EBH MOV A,A10;A10作為片內的一個直接地址 LCALL DELY;DELY作為一個16位子程序的入口地址,DATA 數據地址賦值命令,格式:字符名稱 DATA 表達式 功能:與EQU類似,但有以下差別: 1、EQU定義的字符名必須先定義后使用,而DATA定義的字符名可以后定義先使用。 2、用EQU偽指令可以把一個匯編符號賦給一個名字,而DATA只能把數據賦給字符名。 3、DATA語句可以把一個表達式的值賦給字符名稱,其中的表達式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一活動編花籃活動方案
- 六一活動跳舞蹈活動方案
- 六一演出帶隊活動方案
- 六一童心企劃活動方案
- 六一美餐活動方案
- 六一節活動簽到活動方案
- 六堡鎮植樹活動方案
- 六年級組織植樹活動方案
- 醫護禮儀考試試題及答案
- 冶金教資考試試題及答案
- 2025-2030中國醫療美容行業市場深度調研及競爭格局與投資研究報告
- 安徽省合肥市蜀山區2025年數學五下期末監測試題含答案
- 《基于CREAM方法對某核電站調試階段人因失誤原因分析案例報告》17000字【論文】
- 2025年宿遷中考試題及答案英語
- 2025年麻精藥品考試試題及答案
- DBJ51T062-2016 四川省旋挖孔灌注樁基技術規程
- DB11-T 420-2019 電梯安裝、改造、重大修理和維護保養自檢規則
- 湖南省長沙五中學2025屆中考生物適應性模擬試題含解析
- 《銀行個人理財業務PEST探析和SWOT探析》4000字
- 從細節開始為家人制定科學合理的膳食計劃
- 醫院醫用耗材SPD服務項目投標方案
評論
0/150
提交評論