《微機原理匯編語言程序設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《微機原理匯編語言程序設(shè)計(42頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、微機原理及應(yīng)用MCS-51單片機 第四章 匯編語言程序設(shè)計程序設(shè)計語言簡介程序設(shè)計的步驟和方法匯編語言程序設(shè)計l分支程序用cjne實現(xiàn)三分支用 jmp A+DPTR 實現(xiàn)多分支 l循環(huán)程序l子程序及其調(diào)用程序設(shè)計舉例 機器語言l計算機唯一能夠識別和執(zhí)行的語言匯編語言l“符號語言”,用指令助記符代表機器語言指令高級語言 l面向算法、過程、對象微機原理匯編語言程序設(shè)計實驗報告,類似自然語言,可移植性好,須經(jīng)解釋或翻譯后才能被執(zhí)行程序設(shè)計語言簡介匯編機器語言目標程序匯編語言源程序 程序設(shè)計的步驟和方法程序設(shè)計的步驟程序設(shè)計的方法常用偽指令匯編語言格式 程序設(shè)計的步驟分析課題,確定算法和思路根據(jù)算法和思路畫出流程圖根據(jù)流程圖編寫程序
2、上機調(diào)試,排除錯誤 流程圖圖例起止框處理框判斷框連線開 始結(jié) 束XX+1Y Y-1F5?Y N 程序設(shè)計的方法結(jié)構(gòu)化設(shè)計模塊化設(shè)計開發(fā)方法l自底向上開發(fā)先底層開發(fā) l自頂向下開發(fā)先頂層開發(fā)l混合方法 常用偽指令定義:僅向匯編程序發(fā)出的,并僅由匯編程序在匯編程序中識別和執(zhí)行的一種匯編控制命令,它本身在目標程序中不產(chǎn)生機器碼。匯編起始偽指令:ORG匯編結(jié)束偽指令:END定義字節(jié)偽指令:DB定義字偽指令: DW定義位偽指令: BIT賦值偽指令: EQU 匯編起始偽指令格式: ORG 功能:指定匯編源程序編譯成機器語言程序 的起始地址l例如: ORG 0000H ljmp 0100H ORG 0100
3、H Start: mov A,#5Ah sjmp $ END 匯編結(jié)束偽指令格式: END 起始地址功能:停止匯編示例:ORG 0000H ljmp 0100H ORG 0100H Start: mov A,#5Ah sjmp $ END mov A,#0A5h 定義字節(jié)偽指令格式: DB 功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表可以是一個字節(jié)、數(shù)或以引號括起來的字符串。 ORG : DB 11h,22h,A,”BCD” END 定義字偽指令格式: DW 功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表是一個字(兩字節(jié))。 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標號:助記符 參數(shù),參數(shù);注釋偽指令格式:l名字 定義符 參數(shù),參數(shù);注釋 參數(shù)類型常數(shù):l ;12D,12;0F1H,59Hl 67Q;A,a操作數(shù):l A微機原理匯編語言程序設(shè)計實驗報告,B,DPTR表達式 l mov A,#(12H-03H) 用c
5、jne實現(xiàn)三分支 cjne R0,#0,MP1 mov R1,#0 sjmp :mov A,R0 jnb ACC.7,MP2 mov R1,#0FFh sjmp :mov R1,#:sjmp $y= xxx開始結(jié)束y0 y-1 y+1x=0? x0?Y Y NN R0 xR1y 用 jmp A+DPTR 實現(xiàn)多分支KeyB5: mov DPTR,# clr C subb A,#0Ah rl A JMP A+:ajmp AAA ajmp BBB ajmp CCC ajmp DDD 循環(huán)程序循環(huán)程序結(jié)構(gòu)單循環(huán)程序l例
6、1:多字節(jié)求和l例2:內(nèi)部數(shù)據(jù)區(qū)清零多重循環(huán)程序 l例3:50ms延時程序 循環(huán)程序結(jié)構(gòu)循環(huán)初始化:循環(huán)控制變量的初始化、 數(shù)據(jù)變量的初始化循環(huán)工作部分:循環(huán)主體,重復(fù)執(zhí)行的計算循環(huán)控制部分:循環(huán)變量的修改、終止控制 例1:多字節(jié)求和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:內(nèi)部數(shù)據(jù)區(qū)清零 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 子程序及其調(diào)用子程序調(diào)用與返回指令子程序設(shè)計方法子程序的調(diào)用過程與子程序嵌套調(diào)用過程中的參數(shù)傳遞 l通過寄存器傳遞l通過堆棧傳遞l通過數(shù)據(jù)指針(DPTR)傳遞 子程序調(diào)用與返回指令絕對調(diào)用指令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舉例: 子程序調(diào)用與返回指令舉例 ORG : mov A,#0 acall Sub1 mov A,#0 lcall Sub2 sjmp Sub1:inc A :dec A ret END 子程序設(shè)計方法 格式: ;子程序名 ;子程序功能: ;入口參數(shù): ;出口參數(shù): ;占用資
9、源:子程序名:. . . 子程序的調(diào)用過程與子程序嵌套主程序要使用子程序時通過call 指令子程序執(zhí)行完后通過ret 指令返回防止自然進入子程序和自然退出子程序子程序嵌套正在執(zhí)行主程序CPU正在執(zhí)行子程序SubA CPU正在執(zhí)行子程序SubB 通過寄存器傳遞方法簡單、參數(shù)有限例: ORG :mov R0,#40h mov R7,#10H lcall Zero sjmp $ ;子程序名:Zero;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):R0內(nèi)部數(shù)據(jù)區(qū); R7內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源: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;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):70內(nèi)部數(shù)據(jù)區(qū)地址; 71h內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源: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 通過數(shù)據(jù)指針(DPTR)傳遞將待傳遞參數(shù)緊跟在調(diào)用
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 程序設(shè)計舉例算術(shù)運算程序 多字節(jié)加法 多字節(jié)BCD碼減法邏輯運算程序 ASCII碼二進制排序程序 冒泡法排序查表程序 以PC為指針 以DPTR為指針散轉(zhuǎn)程序 轉(zhuǎn)移指令表 地址偏移量表 轉(zhuǎn)向地址表
12、 多字節(jié)加法 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 多字節(jié)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 數(shù)據(jù)的拼裝 (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 . 使用轉(zhuǎn)移指令表的散轉(zhuǎn)程序 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 使用地址偏移量表的散轉(zhuǎn)程序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 $ 使用轉(zhuǎn)向地址表的散轉(zhuǎn)程序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 $