《微機原理匯編語言程序設計》由會員分享,可在線閱讀,更多相關《微機原理匯編語言程序設計(42頁珍藏版)》請在裝配圖網上搜索。
1、微機原理及應用MCS-51單片機 第四章 匯編語言程序設計程序設計語言簡介程序設計的步驟和方法匯編語言程序設計l分支程序用cjne實現三分支用 jmp A+DPTR 實現多分支 l循環程序l子程序及其調用程序設計舉例 機器語言l計算機唯一能夠識別和執行的語言匯編語言l“符號語言”,用指令助記符代表機器語言指令高級語言 l面向算法、過程、對象微機原理匯編語言程序設計實驗報告,類似自然語言,可移植性好,須經解釋或翻譯后才能被執行程序設計語言簡介匯編機器語言目標程序匯編語言源程序 程序設計的步驟和方法程序設計的步驟程序設計的方法常用偽指令匯編語言格式 程序設計的步驟分析課題,確定算法和思路根據算法和思路畫出流程圖根據流程圖編寫程序
2、上機調試,排除錯誤 流程圖圖例起止框處理框判斷框連線開 始結 束XX+1Y Y-1F5?Y N 程序設計的方法結構化設計模塊化設計開發方法l自底向上開發先底層開發 l自頂向下開發先頂層開發l混合方法 常用偽指令定義:僅向匯編程序發出的,并僅由匯編程序在匯編程序中識別和執行的一種匯編控制命令,它本身在目標程序中不產生機器碼。匯編起始偽指令:ORG匯編結束偽指令:END定義字節偽指令:DB定義字偽指令: DW定義位偽指令: BIT賦值偽指令: EQU 匯編起始偽指令格式: ORG 功能:指定匯編源程序編譯成機器語言程序 的起始地址l例如: ORG 0000H ljmp 0100H ORG 0100
3、H Start: mov A,#5Ah sjmp $ END 匯編結束偽指令格式: END 起始地址功能:停止匯編示例:ORG 0000H ljmp 0100H ORG 0100H Start: mov A,#5Ah sjmp $ END mov A,#0A5h 定義字節偽指令格式: DB 功能:把項或項表的數值存入從標號開始的連續單元,其中項或項表可以是一個字節、數或以引號括起來的字符串。 ORG : DB 11h,22h,A,”BCD” END 定義字偽指令格式: DW 功能:把項或項表的數值存入從標號開始的連續單元,其中項或項表是一個字(兩字節)。 ORG
4、t: DW 1122h,3344h END 定義位偽指令格式: BIT 功能:定義位變量地址U BIT 20H.0V BIT 20H.1W BIT 20H.2X BIT 20H.3Y BIT 20H.4Z BIT 20H.5Q BIT 20H.6 賦值偽指令格式: EQU 功能:定義符號變量值 X EQU 05H Y EQU 06H 匯編語言格式指令格式:l標號:助記符 參數,參數;注釋偽指令格式:l名字 定義符 參數,參數;注釋 參數類型常數:l ;12D,12;0F1H,59Hl 67Q;A,a操作數:l A微機原理匯編語言程序設計實驗報告,B,DPTR表達式 l mov A,#(12H-03H) 用c
5、jne實現三分支 cjne R0,#0,MP1 mov R1,#0 sjmp :mov A,R0 jnb ACC.7,MP2 mov R1,#0FFh sjmp :mov R1,#:sjmp $y= xxx開始結束y0 y-1 y+1x=0? x0?Y Y NN R0 xR1y 用 jmp A+DPTR 實現多分支KeyB5: mov DPTR,# clr C subb A,#0Ah rl A JMP A+:ajmp AAA ajmp BBB ajmp CCC ajmp DDD 循環程序循環程序結構單循環程序l例
6、1:多字節求和l例2:內部數據區清零多重循環程序 l例3:50ms延時程序 循環程序結構循環初始化:循環控制變量的初始化、 數據變量的初始化循環工作部分:循環主體,重復執行的計算循環控制部分:循環變量的修改、終止控制 例1:多字節求和ORG :mov R3,#0 mov R4,#0 mov R0,#50H mov R2,#5Loop:mov A,R4 add A,R0 mov R4,A inc R0 clr A addc A,R3 mov R3,A djnz R2,Loop sjmp $ END 例2:內部數據區清零 ORG :mov R0,#30H mov
7、R7,#10 mov A,#:mov R0,A inc R0 djnz R7,Loop sjmp $ END 例3:50ms延時程序Delay:mov R7,#: mov R6,#123 : djnz R6,Del2 djnz R7,Del1 sjmp $ ;1us;1us;1us;2us;2us 子程序及其調用子程序調用與返回指令子程序設計方法子程序的調用過程與子程序嵌套調用過程中的參數傳遞 l通過寄存器傳遞l通過堆棧傳遞l通過數據指針(DPTR)傳遞 子程序調用與返回指令絕對調用指令l acall ;(PC) (PC)+2 ,(SP)
8、(SP)+1 (SP) (PC07) ,(SP) (SP)+1,(SP) (PC815) ,(PC010) ,() 不變l lcall 返回指令 l ret; (PC815)(SP),(SP) (SP)-1 (PC07)(SP),(SP) (SP)-1舉例: 子程序調用與返回指令舉例 ORG : mov A,#0 acall Sub1 mov A,#0 lcall Sub2 sjmp Sub1:inc A :dec A ret END 子程序設計方法 格式: ;子程序名 ;子程序功能: ;入口參數: ;出口參數: ;占用資
9、源:子程序名:. . . 子程序的調用過程與子程序嵌套主程序要使用子程序時通過call 指令子程序執行完后通過ret 指令返回防止自然進入子程序和自然退出子程序子程序嵌套正在執行主程序CPU正在執行子程序SubA CPU正在執行子程序SubB 通過寄存器傳遞方法簡單、參數有限例: ORG :mov R0,#40h mov R7,#10H lcall Zero sjmp $ ;子程序名:Zero;功能:對內部數據區清零;入口參數:R0內部數據區; R7內部數據區長度;出口參數:無;占用資源:A,R0,:clr ALoop:mov R0,A inc R0 djnz,R
10、7,Loop ret 通過堆棧傳遞 ORG :mov 70H,#40h mov 71H,#10H push 70h push 71h lcall Zero sjmp $ ;子程序名:Zero;功能:對內部數據區清零;入口參數:70內部數據區地址; 71h內部數據區長度;出口參數:無;占用資源:A,R0,R7,70h,:pop DPH pop DPL pop 07h;R7 pop 00h;R0 clr ALoop:mov R0,A inc R0 djnz,R7,Loop push DPL push DPH ret 通過數據指針(DPTR)傳遞將待傳遞參數緊跟在調用
11、指令之后 ORG :nop acall : ”THIS IS AN ”DB:0AH,0DH,: nop sjmp $ END Print:pop DPH pop :mov A,#00h movc A,A+DPTR inc DPTR jz :mov P1,A sjmp :jmp A+DPTR 程序設計舉例算術運算程序 多字節加法 多字節BCD碼減法邏輯運算程序 ASCII碼二進制排序程序 冒泡法排序查表程序 以PC為指針 以DPTR為指針散轉程序 轉移指令表 地址偏移量表 轉向地址表
12、 多字節加法 2F 5B A7 C3 H (43 42 41 40) H+ 14 DF 35 B8 H (53 52 51 50) H ORG : mov R0,#40h mov R1,#50h mov R2,#4 clr CJia1:mov A,R1 addc A,R0 mov R0,A inc R0 inc R1 djnz R2,Jia1 mov F0,C sjmp $ END 多字節BCD碼減法 99 88 77 66 H (43 42 41 40) H- 44 55 66 77 H (53 52 51 50) H ORG : mov R0,#40h mo
13、v R1,#50h mov R2,#4 clr CJia1:mov A,#9Ah subb A,R1 add A,R0 da A mov R0,A cpl C inc R0 inc R1 djnz R2,Jia1 mov F0,C sjmp $ END 數據的拼裝 (20H) (21H) (30H) ORG : mov 30h,20h anl 30h,# mov A,21h swap A rl A anl A,# orl 30h,A sjmp
14、 $ END ASCII碼二進制 ORG : mov A,#A clr C subb A,#30h cjne A,#0Ah,NEQ sjmp : jc : subb A,#:sjmp $ END ORG : mov A,#0Bh add A,#90h da A addc A,#40h da A sjmp $ END 冒泡法排序ORG PSW,# P2,# R2,#100-:mov R0,# R1,# 03h,R2clr :mo
15、vx A,R0mov 30h,Amovx A,R1 cjne A,30h, :jc R0,Axch A, R1,Asetb 7FhL1: inc R0inc R3, 7Fh, R2,:sjmp $END 以PC為指針查表程序TB1: mov A,R2 add A,R2 mov R3,A add A,#06H movc A,A+PC xch A,R3 add A,#03H movc A,A+PC mov R4,A sjmp $ TAB1:DW 1520,3721,426
16、4 ,3483,32657 DW 883,9943,1000 DW 4051,6785,8931 DW 4468,5871 DW 13284,27808 END 以DPTR為指針查表程序LTB2: mov DPTR,#TAB2 mov A,R3 clr C rlc A mov R3,A xch A,R2 rlc A xch R2,A add A,DPL mov DPL,A mov A,DPH addc A,R2 mov DPH,A clr A movc A,A+DPTR mov R2,A clr A inc DPTR movc A,A+DPTR mov R3,A :
17、DW . 使用轉移指令表的散轉程序 ORG 0000H mov R2,#2Main:mov DPTR,#TBJ1 mov A,R2 add A,R2 jnc NADD inc :jmp A+:ajmp PRG0 ajmp PRG1 ajmp PRG2 ajmp PRG3 sjmp $ PRG0:mov A,#0 sjmp :mov A,#1 sjmp :mov A,#2 sjmp :mov A,#3Halt: sjmp $ END 使用地址偏移量表的散轉程序JMP3: mov R2,#2 mov A,R2 mov D
18、PTR,#TBJ3 movc A,A+DPTR jmp A+: DB PRG0-TBJ3 DB PRG1-TBJ3 DB PRG2-TBJ3 DB PRG3-TBJ3 DB PRG4-TBJ3 DB PRG5-TBJ3 PRG0:mov R0,#0 sjmp :mov R0,#1 sjmp :mov R0,#2 sjmp :mov R0,#3 sjmp :mov R0,#4 sjmp :mov R0,#5Halt: sjmp $ 使用轉向地址表的散轉程序JMP4: mov R2,#1 mov DPTR,#TBL4 mov A,R2 add A,R2 jnc NADD inc :mov R3,A movc A,A+DPTR xch A,R3 inc A movc A,A+DPTR mov DPL,A mov DPH,R3 clr A jmp A+:DW PRG0 DW PRG1 DW PRG2 DW :mov R0,#0 sjmp :mov R0,#1 sjmp :mov R0,#2 sjmp :mov R0,#3Halt: sjmp $