匯編語言程序設計2.ppt_第1頁
匯編語言程序設計2.ppt_第2頁
匯編語言程序設計2.ppt_第3頁
匯編語言程序設計2.ppt_第4頁
匯編語言程序設計2.ppt_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第4章 匯編語言程序設計,4.1 匯編語言程序設計方法 4.2 匯編語言程序的基本結構 順序、循環、分支、子程序 4.3 常用程序設計舉例 代碼轉換、查表、邏輯運算、極值查找等,4.1 匯編語言程序設計,程序: 計算機的一系列指令的有序集合 程序設計: 編制程序的過程 機器語言程序:目標程序 直接由機器語言(指令代碼)編寫的程序 匯編語言程序: 用匯編語言編寫的程序,4.1 匯編語言程序設計方法 4.1.1 程序的設計步驟與方法 匯編語言程序設計的特點在于: (1) 用匯編語言進行程序設計時,對數據的存放、寄存器和工作單元的使用等要由設計者安排。而高級語言程序設計時,這些工作都由計算機軟件安排,程序設計者不必考慮。 (2) 匯編語言程序設計要求設計人員必須對所使用的計算機的硬件結構有較為詳細的了解。特別是對各類寄存器、端口、定時器/計數器、中斷等內容要熟悉,以便在程序設計時能熟練使用。,匯編語言程序的設計步驟: (1)分析問題,抽象出描述問題的數學模型 (2)確定解決問題的算法 (3)分配存儲空間及工作單元 (4)根據算法繪制流程圖 (5)編寫源程序 (6)匯編和調試 程序質量的判斷: 程序執行時間短;占用的內存單元少;程序的邏輯性,可讀性;程序的兼容性,可擴展性;程序的可靠性。,4.1.2 匯編語言源程序的編輯和匯編 匯編語言源程序的編輯 編寫完成的源程序應以“.ASM”的擴展名保存,以備匯編程序調用。 匯編語言源程序的匯編 匯編語言源程序必須轉換為機器碼表示的目標程序,計算機才能執行,這種轉換過程稱為匯編。對單片機來說,有手工匯編和機器匯編兩種匯編方法。鑒于現在PC機的使用非常普遍,這種交叉匯編通常都是在PC機上進行的。匯編完成后,再由PC機把生成的目標程序加載到用戶樣機上。由于proteus軟件有單片機仿真功能,所以我們完全可以通過軟件來進行單片機的仿真。,源程序編輯是在微型計算機上,借助編輯軟件,編寫匯編語言源程序。可供使用的編輯工具很多。 例如,在文本區編寫一個源程序如下: ORG 0030 MOVX DPTR,A MOV A,#41H END 編輯結束后,存盤退出。 接下來是使用交叉匯編軟件,對編輯完成的源程序進行匯編。 匯編完成后,如果沒有錯誤則形成目標碼文件,格式為: 0030 0033 F07441 首地址 末地址 目標碼,4.2 匯編語言源程序的基本結構,共有四種基本結構形式: 順序結構 循環結構 分支結構 子程序結構,4.2.1 順序結構程序設計 順序結構的程序是指既無循環又無分支(不產生跳轉),按程序中指令書寫的順序執行的程序,又稱直線程序。這種結構的程序雖然簡單,但它是構成任何結構程序的基礎。,例: 兩個1位十進制數相加,結果存于工作寄存器R6、R4中。設兩個加數分別在工作寄存器R0和R2中。 源程序清單: ORG 1000H MAIN: CLR PSW.4 ; 選定工作寄存器區 CLR PSW.3 MOV A, R0 ; 取第一個數 ADD A, R2 DA A ; 十進制調整 MOV R4, A ; 低位保存 MOV A, #0 ADDC A, #0 MOV R6, A ; 高位保存 END,例: 已知X、Y、Z分別為片內RAM 30H、31H、32H單元的內容,設XY,試編程完成下式的算術運算:S=(X-Y)*Z, 并將計算結果S存入片內RAM 34H(高字節)、35H(低字節)單元中。 由于XY,所以X-Y0,不需要借位;(X-Y)*Z的結果最多占用兩個字節。實現該要求的程序流程圖如圖所示。,程序清單如下: ORG 0030H START: MOV A, 30H ; (A)X SUBB A, 31H ; (A)(A)-Y MOV B, 32H ; (B)Z MUL AB MOV 34H, B ; (34H)A*B的高字節 MOV 35H, A ; (35H)A*B的低字節 SJMP $ END,4.2.2 循環程序 循環程序一般由四個主要部分組成: (1) 初始化部分:設置循環過程工作單元的初始值,例如循環次數、各變量初值、和地址指針初值等。 (2) 處理部分:為反復執行的程序段,是循環程序的主體部分(簡稱循環體),一般用于完成主要的計算與操作、地址指針修改等。 (3) 循環控制部分:用于控制循環的執行和結束。當循環結束條件不滿足時,修改控制變量,繼續循環;當條件滿足時停止循環。 (4) 結束部分:對循環程序的結果進行分析、處理和存放。,有先執行后判斷和先判斷后執行兩種結構:,循環程序分為單重循環和多重循環。 若循環程序的循環體中不再包含循環程序,則稱之為單重循環;如果在循環體中還有其他循環程序,即循環嵌套,這樣的程序則稱為多重循環(二重以上)。 在多重循環程序中,只允許外重循環嵌套內重循環程序,而不允許循環體互相交叉,另外,也不允許從循環程序的外部跳入循環程序的內部。,例: 把外部RAM 5000H50FFH單元的內容清零。 ORG 2000H START1: MOV DPTR, #5000H ; 循環初始化 MOV R0, #00H MOV A, #00H LOOP1: MOVX DPTR, A ; 循環體 INC DPTR INC R0 CJNZ R0,#00H,LOOP1 ; 循環控制 END,INC R0 - DEC R0 ?,如果改為先判斷后執行?,例:將內部RAM從40H開始連續單元的數據傳送到外部RAM從2000H開始的連續單元中,當所傳送的數據為0FFH時,傳送停止。 ORG 2000H MAIN: MOV R0,#40H ;循環初始化 MOV DPTR,#2000H LOOP: MOV A,R0 CJNE A,#0FFH,LOOP1 ;循環控制 SJMP NEXT LOOP1: MOVX DPTR,A ;循環體 INC R0 INC DPTR SJMP LOOP NEXT: SJMP $ END,例:設MCS-51單片機的時鐘頻率為fosc = 12 MHz,試設計延時50ms的延時程序。 延時程序所花費的時間是該程序指令的總機器周期數與機器周期的乘積。 通常,延時程序采用MOV和DJNZ指令來實現。 單循環延時程序,最大的循環次數位256,則程序段為: MOV R0, #00H ; 機器周期數為1 DJNZ R0, $ ; 機器周期數為2 若單片機晶振為12MHz,則一個機器周期為1us。 延時時間:(1+2562)1s513s。 需采用多重循環。,多重循環:在一個循環體中又包含了其它的循環程序。 這種方式是實現延時程序的常用方法。 使用多重循環時,必須注意: (1) 循環嵌套, 必須層次分明, 不允許產生內外層循環交叉。 (2) 外循環可以一層層向內循環進入, 結束時由里往外一層層退出。 (3) 內循環可以直接轉入外循環, 實現一個循環由多個條件控制的循環結構方式。,MOV R1, #M ; 1 Tosc LOOP:MOV R2, #N ; 1 Tosc NOP ; 1 Tosc DJNZ R2, $ ; 2 Tosc DJNZ R1, LOOP ; 2 Tosc 內層循環的機器周期數為Tn=1+1+2*N, 總機器周期數為Tm(Tn+2)*M+1. 設N=123,M=200,則延時時間為50.001ms。,程序清單: ORG 2000H M EQU 200 N EQU 123 MOV R1,#M ; #200 LOOP: MOV R2,#N ; #123 NOP DJNZ R2,$ DJNZ R1,LOOP SJMP $ END,4.2.3 分支結構程序設計 在實際應用中,不可能所有程序都是直線運行的,相反,多數情況都需要根據不同的條件進行不同的處理,這就會使程序跳轉到不同位置去執行,這種結構的程序稱為分支結構程序。 MCS-51單片機中條件轉移指令、比較轉移指令、位轉移指令等都可實現程序分支。,分支程序基本結構分為單分支和多分支兩種。 多分支結構特點是:各處理模塊是相互排斥的。,條件轉移指令,分別為: JZ,JNZ: 累加器判零轉移指令; CJNE: 比較條件轉移指令; DJNZ: 減1條件轉移指令; JC, JNC , JB,JNB,JBC: 位控制條件轉移指令等。 散轉指令:JMP A+DPTR (雙字節字節),例:片外RAM 2000H、2001H單元分別存放兩個數,判斷這兩個數是否相等,如果相等,則位地址7FH置1,否則清零。 若判斷兩個數相等使用比較轉移指令很容易實現該題中的要求,程序流程如圖所示。,程序流程圖,程序如下: ORG 0100H MOV DPTR,#2000H ;地址指針指向片外2000H單元 MOVX A,DPTR ;(2000H)A MOV R0,A ;AR0 MOV DPTR,#2001H ;地址指針指向2001H單元 MOVX A,DPTR ;(2001H)A MOV 30H,R0 CJNE A,30H,NE ;若兩個數不相等,則轉NE SETB 7FH ;若兩個數相等,則7FH單元置1 AJMP OVER ;轉OVER NE: CLR 7FH ;7FH單元清零 OVER: RET,散轉結構 例: 在內部RAM 20H和21H單元中有兩個無符號的數,由22H中的值決定對該數完成加、減、乘或除運算(20H單元的數為被減數或被除數),運算規則及結果保存處見下表。,ORG 1000H MOV A,22H MOV B,21H RL A ;AJMP為雙字節指令,乘2改變偏移量 MOV DPTR,#TAB JMP A+DPTR NOP TAB: AJMP ADDM ; 散轉表 AJMP SUBM AJMP MULM AJMP DIVM ADDM: MOV A,20H ; 加法運算 ADD A,B MOV 30H,A MOV A,#0 ADDC A,#0 MOV 31H,A SJMP FINISH,SUBM: MOV A,20H ;減法運算 SUBB A,B MOV 40H,A SJMP FINISH MULM: MOV A,20H ;乘法運算 MUL AB MOV 51H,B MOV 50H,A SJMP FINISH DIVM: MOV A,20H ;除法運算 DIV AB MOV 61H,A MOV 60H,B FINISH: END,例:假定R0中存放的是采集到的被按鍵鍵值,共有128個鍵值(0127),根據該鍵值轉向不同鍵的處理程序中去。 跳轉方法: 逐個比較,類似CASE。 使用散轉指令JMP A+DPTR 。 設(R0)= 0 n,對應的處理程序入口地址分別為 PROG0PROGn,且按照一定的規律排列。,ORG 2000H MOV DPTR, #TAB ; 設置處理程序入口首地址 MOV A,R0 ; R0 = 0127 RL A ; ? NEXT:JMP A+DPTR ; 轉向形成的散轉地址入口 TAB:AJMP PROG0 ; 直接轉移地址表 AJMP PROG1 AJMP PROGn ,4.2.4 子程序設計 子程序的概念 通常把一些基本操作功能編制為程序段作為獨立的子程序,以供不同程序或同一程序反復調用。在程序中需要執行這種操作的地方放置一條調用指令,當程序執行到調用指令,就轉到子程序中完成規定的操作,并返回到原來的程序繼續執行下去。,子程序的調用 調用子程序的指令有“ACALL”和“LCALL”, 執行調用指令時, 先將程序地址指針PC改變(“ACALL”加2, “LCALL”加3), 然后 PC值壓入堆棧, 用新的地址值代替。執行返回指令(RET或RETI)時, 再將 PC值彈出。 子程序調用中,主程序應先把有關的參數存入約定的位置,子程序在執行時,可以從約定的位置取得參數,當子程序執行完,將得到的結果再存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取得需要的結果,這就是參數的傳遞。,在編寫子程序時應注意以下幾點: (1) 要給每個子程序賦一個名字。 子程序的第一條指令的地址被稱為子程序的地址或入口地址,該指令前的標號就是該子程序的名稱,也是子程序入口地址的代號。 (2) 在子程序的末尾必須有子程序返回指令RET / RETI。 (3) 要能正確地傳遞參數。 首先要有入口條件,說明進入子程序時它所要處理的數據如何得到,另外,要有出口條件,即處理的結果是如何存放的。,(4) 注意保護現場和恢復現場。 注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和單元的內容。 保護現場: PUSH, 恢復現場:POP (5) 注意子程序的通用性。 子程序中操作對象盡量采用地址或寄存器形式,而不用立即數。 主程序調用子程序的指令:“LCALL”,“ACALL”。 子程序返回指令:RET / RETI。 子程序可以嵌套,嵌套次數從理論上說是無限的,但實際上由于受堆棧深度的影響,嵌套次數是有限的。,子程序調用與返回過程示意圖,例:設有a,b,c三個數(09),存于內部RAM的DataA、DataB和DataC三個單元。 編程實現: c = a2 + b2。 設DataA、DataB、DataC分別對應內部RAM的40H、41H和42H單元。,ORG 5000H DataA EQU 40H DataB EQU 41H DataC EQU 42H START: MOV A, DataA ;取第一操作數 ACALL SQR ;調用查表子程序 MOV R1,A ;a2暫存R1 MOV A,DataB ;取第二操作數 ACALL SQR ;調用查表子程序 ADD A,R1 ;Aa2b2 MOV DataC,A ; 保存結果,子程序: SQR: INC A ;偏移量調整 MOVC A, A+PC ;查平方表 RET TAB:DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 END,4.3 常用程序設計舉例 4.3.1 代碼轉換類程序 計算機能識別和處理的僅僅是二進制數,而計算機外設(顯示器、LED數碼管、打印機等)常使用ASCII碼和BCD碼,因此,經常需要通過程序完成二進制到BCD碼/ASCII碼的轉換。 程序設計中常采用算法處理和查表方式來實現代碼轉換。,1. 十六進制數與ASCII碼之間的轉換 例:將從30H單元開始的連續8個單元中存放的十六進制數轉換成其所對應的ASCII碼,并分別存放在從40H開始的16個單元中。,; 十六進制數(0F)轉換成ASCII碼子程序 HEXAS: CLR C SUBB A,#10 JC LOOP ADD A, #7 LOOP: ADD A, #10 ; 補償減掉的10 ADD A, #30H RET,; 完整程序 ORG 2000H MOV R0, #30H ; 設定地址指針 MOV R1, #40H MOV R7, #8 ; 循環次數 NEXT:MOV A, R0 ; 高字節轉換 SWAP A ANL A, #0FH ACALL HEXAS MOV R1, A INC R1 ; 修改存儲地址指針 MOV A, R0 ; 低字節轉換 ANL A, #0FH ACALL HEXAS MOV R1, A,INC R1 INC R0 DJNZ R7, NEXT NOP SJMP $ ; $表示當前PC值 HEXAS: CLR C SUBB A,#10 JC LOOP ADD A, #7 LOOP: ADD A, #10 ; 補償減掉的10 ADD A, #30H RET END,2. 十六進制數與BCD碼的轉換 例. 將累加器A中0FFH范圍內的二進制數轉換為非壓縮的BCD數(0255),并分別保存于40H、41H和42H單元(低位在前)。 非壓縮的BCD碼:一個字節放一位BCD碼 壓縮的BCD碼:一個字節放兩個BCD碼 例: (A)0FEH255 0000 0010 0000 0101 0000 0101 應用:常用于需要數碼顯示的場合。 分離方法: 將A中的內容分別除以100和10。,; 子程序: HEXBCD:MOV B,#100 DIV AB ; A中為百位數 MOV 42H,A ; 保存百位 MOV A,B MOV B,#10 DIV AB ; A中為十位; B中為個位 MOV 41H,A ;保存十位 MOV 40H,B ;保存個位 RET,4.3.2 查表程序 常用于非線性修正、非線性函數轉換以及代碼轉換等。 專用的查表指令(2條): (1) MOVC A, A+DPTR ; 遠程查表, 64KB (2) MOVC A, A+PC ;近程查表,0+256B 1. 遠程查表通過以下三步操作實現查表。 將所查表格的首地址送入DPTR; 將要查找的數據序號,即數據在表中的位置送入累加器A中; 執行查表指令 MOVC A,A+DPTR 進行讀數并存結果存于累加器A。,(2) MOVC A, A+PC ;近程查表,0+256B 2. 近程查表也可通過以下三步操作來完成。 將要查找的數據序號,即數據在表中的位置送入累加器A中; 把從查表指令到表的首地址間的偏移量與A值相加; 執行查表指令 MOVC A,A+PC 進行讀數,查表結果送累加器A。,例4.13 若累加器A中存放的是一位BCD碼。通過查表將其轉換成為相應的七段顯示碼,并存入寄存器B中。 七段數碼顯示管連接方式:共陽極和共陰極兩種。 共陽極是低電平為有效輸入, 共陰極為高電平為有效輸入。,3FH,09的七段碼: 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。,假設數碼顯示管為共陰極。,由于代碼沒有規律,一般采用查表完成。,若以DPTR為基址(遠程查表),程序段如下: MOV A, #05H MOV DPTR, #TAB MOVC A, A+DPTR TAB: DB 3FH,06H,5BH,4FH,66H, DB 6DH,7DH,07H,7FH,6FH ,若以PC為基地址(近程查表),則程序段如下: MOV A, #05H ADD A, ? MOVC A, A+PC NOP ;

溫馨提示

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

最新文檔

評論

0/150

提交評論