專題3程序設計o_第1頁
專題3程序設計o_第2頁
專題3程序設計o_第3頁
專題3程序設計o_第4頁
專題3程序設計o_第5頁
已閱讀5頁,還剩48頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第4章 匯編語言程序設計簡介 4.1 程序設計與匯編 4.2 匯編語言程序設計 4.3 實用程序舉例4.1 程序設計與匯編 一、程序設計步驟 分析確定算法流程圖源代碼調試仿真二、匯編與反匯編 匯編語言機器語言 手工 機器三、偽指令 1、 匯編起始指令 ORG 指令格式為: ORG nn 該指令的作用是指明后面的程序或數據塊的起始地址, 它總是出現在每段源程序或數據塊的開始。 式中, nn為 16 位地址, 匯編時nn確定了此語句后面第一條指令或第一個數據的地址,此后的源程序或數據塊就依次連續存放在以后的地址內, 直到遇到另一個ORG指令為止。 例: ORG 2000H MOV SP, 60H

2、MOV R0, 2FH MOV R2, 0FFH ORG偽指令說明其后面程序的目標代碼在存儲器中存放的起始地址是2000H, 即 存儲器地址 目標程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF 2、等值指令EQU 指令格式: 字符名稱 EQU 數字或匯編符號 功能: 使指令中的字符名稱等價于給定的數字或匯編符號。 使用等值指令可給程序的編制、調試、修改帶來方便, 如果在程序中要多次使用到某一地址,由EQU指令將其賦值給一個字符名稱, 一旦需要對其進行變動, 只要改變EQU命令后面的數字即可, 而不需要對程序中涉及到該地址的所有指令逐句進行修改。 但要注意,

3、由 EQU等值的字符名稱必須先賦值后使用, 且在同一個源程序中, 同一個標號只能賦值一次。 例: PA8155 EQU 8001H;即給標號PA8155賦值為8001H。 3、 定義字節指令DB 指令格式: 標號: DB 8位二進制數表 功能: 把 8 位二進制數表依次存入從標號開始的連續的存儲單元中。 格式中, 標號區段可有可無, DB指令之后的 8 位二進制數表是字節常數或用逗號隔開的字節串, 也可以是用引號括起來的ASCII碼字符串 (一個 ASCII字符相當于一個字節)。 例: ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG偽指

4、令指定了標號BUF1的地址為1000H, 而DB偽指令是將其后的二進制數表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 個連續單元之中, BUF2也是一個標號, 其地址與前一條偽指令連續, 即1003H, 1004H地址單元中依次存放 45H, 66H。 4、 定義字指令DW 指令格式: 標號: DW 16 位數據表 該指令的功能與DB相似, 區別僅在于從指定地址開始存放的是指令中的 16 位數據, 而不是字節串。每個 16 位數據要占兩個存儲單元, 高8 位先存, 低 8 位后存, 這和MCS -51指令中的16位數據存放順序是一致的。 5、 匯編結束指令E

5、ND 指令格式: 標號: END 地址或標號 格式中標號以及END后面的地址或標號可有可無。 功能: 提供匯編結束標志。匯編程序遇到 END后就停止匯編, 對 END以后的語句不予處理, 故 END應放在程序的結束處。 4.2 匯編語言程序設計 4.2.1 順序程序設計 例 1 兩個雙字節數相加。 設有兩個16位的雙字節數,低8位分別存放在片內20H、30H單元中,高8位分別存放在片內21H、31H單元中,求這兩個數的和,結果存放在22H、21H、20H單元中。 ORG0030H ;設置程序存放的起始地址MOV22H,#00H ;22H單元清零MOVA,20H ;20H中的低 8位數送入AAD

6、DA,30H ;兩個數的低8位相加MOV20H,A ;低8位相加的結果送入20H中MOVA,21H ;21H中的高8位數送入A中ADDCA,31H ;兩數高8位數相加并加低8位進位MOV21H,A ;高8位相加的結果送入21H中CLRA ;A清零ADDCA,#00H ;加上高位進位MOV22H,A ;保存最高位進位RET 例 2 將兩個半字節數合并成一個一字節數。 設內部RAM 40H, 41H單元中分別存放著 8 位二進制數 要求取出兩個單元中的低半字節, 并成一個字節后, 存入 50H單元中。 程序如下: START: MOV R1, 40H ; 設置R1為數據指針MOV A, R1 ;

7、取出第一個單元中的內容ANL A, 0FH ; 取第一個數的低半字節SWAP A ; 移至高半字節INC R1; 修改數據指針XCH A, R1 ; 取第二個單元中的內容ANL A, 0FH ; 取第二個數的低半字節ORL A, R1 ; 拼字MOV 50H, A ; 存放結果RET ANL40H,#0FHANL41H,#0FHMOVA,40HSWAPAORLA,41HMOV50H,A4.2.2 分支程序設計 圖 4.1 分支結構框圖(a) 單分支流程; (b) 多分支流程 例 3 x, y均為8位二進制數, 設 x存入R0, y存入R1, 求解: 程序如下: START: CJNE R0,

8、00H, SUL1; R0中的數與00比較 不等轉移 MOV R1, 00H; 相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 兩數不等, 若(R0)0, 則 R101H SJMP SUL2 NEG: MOV R1, 0FFH ;(R0)0, 則 R1=0FF SUL2: RET 例 4 比較兩個無符號數的大小。 設外部 RAM 的存儲單元 ST1和 ST2中存放兩個不帶符號的二進制數, 找出其中的大數存入外部 RAM 中的ST3單元中。 程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR

9、 C ; 清零Cy MOV DPTR, ST1 ; 第一個數的指針 MOVX A, DPTR ; 取第一個數 MOV R2, A ; 保存 MOV DPTR, ST2 ; 第二個數的指針 MOVX A, DPTR ; 取第二個數 CLR C SUBB A, R2; 兩數比較JNC BIG1 ; 若第二個數大, 則轉XCH A, R2; 第一個數大BIG0: MOV DPTR, ST3 MOVX DPTR, A ; 存大數RETBIG1: MOVX A, DPTR; 第二個數大SJMP BIG0RET 散轉程序 散轉程序是分支程序的一種, 它可根據運算結果或輸入數據將程序轉入不同的分支。 JMP

10、 A+DPTR 該指令把8 位無符號數與 16 位數據指針內容相加, 并把結果裝入PC, 控制程序轉向目標地址去執行。此指令的特點在于, 轉移的目標地址是在程序運行過程中動態地確定的。 目標地址由 DPTR的內容決定分支轉移程序的首地址, 由累加器A的內容來動態選擇其中的某一個分支轉移程序。 例 11 根據工作寄存器R0 內容的不同, 使程序轉入相應的分支。 (R0)=0 對應的分支程序標號為PR0; (R0)=1 對應的分支程序標號為PR1; (R0)=N 對應的分支程序標號為PRN。 程序如下: LP0: MOV DPTR, TAB ; 取表頭地址 MOV A, R0 ADD A, R0

11、; R0內容乘以2 JNC LP1 ; 無進位轉移 INC DPH ; 加進位位LP1: JMP A+DPTR; 跳至散轉表中相應位置 TAB: AJMP PR0 AJMP PR1 AJMP PRn 本例程序僅適用于散轉表首地址TAB和處理程序入口地址 PR0, PR1, , PRn在同一個 2 KB范圍的存儲區內的情形。若超出 2 KB范圍可在分支程序入口處安排一條長跳轉指令, 可采用如下程序: MOV DPTR, TABMOV A, R0 MOV B, 03H ; 長跳轉指令占 3 個字節MUL ABXCH A, B ADD A, DPH MOV DPH, A XCH A, B JMP A

12、+DPTR; 跳至散轉表中相應的位置 TAB: LJMP PR0; 跳至不同的分支 LJMP PR1 LJMP PRn 4.2.3 循環程序設計 循環程序一般由四個主要部分組成: (1) 初始化部分: 為循環程序做準備, 如規定循環次數、 給各變量和地址指針預置初值。 (2) 處理部分: 為反復執行的程序段, 是循環程序的實體, 也是循環程序的主體。 (3) 循環控制部分: 這部分的作用是修改循環變量和控制變量, 并判斷循環是否結束, 直到符合結束條件時, 跳出循環為止。 (4) 結束部分: 這部分主要是對循環程序的結果進行分析、 處理和存放。 例 5 工作單元清零。 在應用系統程序設計時,

13、有時經常需要將存儲器中各部分地址單元作為工作單元, 存放程序執行的中間值或執行結果, 工作單元清零工作常常放在程序的初始化部分中。 設有50個工作單元, 其首址為外部存儲器8000H單元, 則其工作單元清零程序如下: CLEAR: CLR A MOV DPTR, 8000H ; 工作單元首址送指針 MOV R2, 50 ; 置循環次數CLEAR1: MOVX DPTR, A INC DPTR ; 修改指針 DJNZ R2, CLEAR1; 控制循環 RET 例6 設在內部 RAM的BLOCK單元開始處有長度為 LEN個的無符號數據塊, 試編一個求和程序, 并將和存入內部 RAM的 SUM單元(

14、設和不超過 8 位)。 BLOCK EQU 20H LEN EQU 30H SUM EQU 40HSTART: CLR A ; 清累加器A MOV R2, LEN; 數據塊長度送R2 MOV R1, BLOCK ; 數據塊首址送R1 LOOP: ADD A, R1 ; 循環加法 INC R1; 修改地址指針 DJNZ R2, LOOP ; 修改計數器并判斷 MOV SUM, A; 存和 RET 多重循環 例 7、10 秒延時程序。 延時程序與 執行指令的時間有關, 如果使用 6 MHz晶振, 一個機器周期為 2 s, 計算出一條指令以至一個循環所需要的執行時間, 給出相應的循環次數, 便能達到

15、延時的目的。10 秒延時程序如下: DELAY: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET 上例程序中采用了多重循環程序, 即在一個循環體中又包含了其它的循環程序, 這種方式是實現延時程序的常用方法。 使用多重循環時, 必須注意: (1)循環嵌套, 須層次分明, 不允許有內外層循環交叉。 (2)外循環可一層層向內循環進入, 結束時由里往外一層層退出。 (3) 內循環可以直接轉入外循環, 實現一個循環由多個條件控制的循環結構方式。 例10

16、在內部 RAM中從 50H單元開始的連續單元依次存放了一串字符, 該字符串以回車符為結束標志, 要求測試該字符串的長度。 程序如下: START: MOV R2, 0FFH MOV R0, 4FH ; 數據指針R0置初值 LOOP: INC R0 INC R2 CJNE R0, 0DH, LOOP RET 4.2.5 子程序和參數傳遞 一、 子程序的概念 通常把這些基本操作功能編制為程序段作為獨立的子程序, 以供不同程序或同一程序反復調用。在程序中需要執行這種操作的地方放置一條調用指令, 當程序執行到調用指令, 就轉到子程序中完成規定的操作, 并返回到原來的程序繼續執行下去。 二、 子程序的調

17、用 調用子程序的指令有“ACALL”和“LCALL”, 執行調用指令時, 先將程序地址指針PC改變(“ACALL”加 2, “LCALL”加 3), 然后 PC值壓入堆棧, 用新的地址值代替。執行返回指令時, 再將 PC值彈出。 子程序調用中, 主程序應先把有關的參數存入約定的位置, 子程序在執行時, 可以從約定的位置取得參數, 當子程序執行完, 將得到的結果再存入約定的位置, 返回主程序后, 主程序可以從這些約定的位置上取得需要的結果, 這就是參數的傳遞。 4.3.1 查表程序設計 查表程序是一種常用程序, 它廣泛使用于 LED顯示控制、 打印機打印控制、數據補償、數值計算、轉換等功能程序中

18、, 這類程序具有簡單、執行速度快等特點。 所謂查表法, 就是預先將滿足一定精度要求的表示變量與函數值之間關系的一張表求出, 然后把這張表存于單片機的程序存儲器中, 這時自變量值為單元地址, 相應的函數值為該地址單元中的內容。查表, 就是根據變量 X在表格中查找對應的函數值 Y, 使 Y=f(X)。 指令系統中, 有兩條查表指令: MOVC A, A+PC MOVC A, A+DPTR 例 一個十六進制數存放在內部 RAM 的 HEX單元的低 4 位中, 將其轉換成ASCII碼并送回 HEX單元。 十六進制 09的ASCII碼為 30H39H, AF的ASCII碼為41H46H, ASCII碼表

19、格的首地址為ASCTAB。編程如下: ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修改指針 MOVC A, A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在這個程序中, 查表指令MOVC A, A+PC到表格首地址有兩條指令, 占用 3 個字節地址空間, 故修改指針應加 3。 例 設有一個巡回檢測報警裝置, 需對 96 路輸入進行控制, 每路有一個額定的最

20、大值, 是雙字節數。當檢測量大于該路對應的最大值時, 就越限報警。假設R2 為保存檢測路數的寄存器, 其對應的最大額定值存放于 31H和 32H單元中。 查找最大額定值的程序如下: FMAX: MOV A, R2 ADD A, R2 ; 表中一個額定值為2個字節 MOV 31H, A MOV DPTR, TAB ; 表首址 MOVC A, A+DPTR; 查表讀取第一個字節 XCH A, 31H ; 第一個字節內容存入31H INC DPTR MOVC A, A+DPTR; 查表讀取第二個字節 MOV 32H, A ; 第二字節的內容存入32H TAB: DW 1230H, 1450H, .

21、DW 2230H, 2440H, . DW 3120H, 3300H, . 例 在一個溫度檢測系統中, 溫度模擬信號由 10 位A/D輸入。將A/D結果轉換為對應溫度值, 可采用查表方法實現。 先由實驗測試出整個溫度量程范圍內的A/D轉換結果, 把A/D轉換結果000H3FFH所對應的溫度值組織為一個表存儲在程序存儲器中, 那么就可以根據檢測到的模擬量的A/D轉換值查找出相應的溫度值。 設測得的A/D轉換結果已存入 20H, 21H單元中(高字節在20H中, 低字節在21H中), 查表得到的溫度值存放在22H,23H單元(高字節在 22H中, 低字節在23H中)。 程序如下: FTMP: MO

22、V DPTR, TAB ; DPTR表首地址 MOVA, 21H ; (20H)(21H)2CLRCRLCAMOV21H, AMOVA, 20HRLCAMOV20H, AMOVA, 21H ; 表首地址+偏移量 ADD A, DPLMOV DPL, AMOV A, 20HADDC A, DPHMOV DPH, ACLR AMOVC A, A+DPTR; 查表得溫度值高位字節MOV 22H, ACLRAINC DPTRMOVC A, A+DPTR; 查表得溫度值低位字節MOV 23H, ARETTAB: DW 4.3.2數制轉換 例 將一個字節二進制數轉換成 3 位非壓縮型BCD碼。 設一個字節

23、二進制數在內部RAM 40H單元, 轉換結果放入內部 RAM 50H, 51H, 52H單元中(高位在前), 程序如下: HEXBCD: MOV A, 40H MOV B, 100 DIV AB MOV 50H, A MOV A, 10 XCH A, B DIV AB MOV 51H, A MOV 52H, B RET 例 設4位BCD碼依次存放在內存RAM中40H43H單元的低4位, 高4位都為0, 要求將其轉換為二進制數, 結果存入 R2R3 中。 一個十進制數可表示為: Dn10n +Dn-110n-1 + + D0100 =(Dn10+Dn-1)10+Dn-2)10+)+D0當n=3時

24、, 上式可表示為: (D310+D2)10+D1)10+D0 BCDHEX: MOV R0, 40H ; R0指向最高位地址MOV R1, 03 ; 計數值送R1MOV R2, 0 ; 存放結果的高位清零MOV A, R0MOV R3, A ;初始化 LOOP: MOV A, R3MOV B, 10MUL ABMOV R3, A ; (R3)10 的低 8 位送R3MOV A, BXCH A, R2 ; (R3)10的高 8 位暫存R2MOV B, 10 MULAB ADD A, R2 MOV R2, A ; R210+( R310)高 8 位送R2 INC R0 ; 取下一個 BCD數 MOV A, R3;加低位 ADD A, R0 MOV R3, A MOV A, R2;處理進位 ADDC A, 0 MOVR2, A DJNZ R1, LOOP RET 例 在外部 RAM中, BLOCK開始的單元中有一無符號數據塊, 其個數為 LEN個字節。試將這些無符號數按遞減次序重新排列, 并存入原存儲區。 ORG 1000H START: M

溫馨提示

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

評論

0/150

提交評論