




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
MCS-51系列單片機(jī)的程序設(shè)計(jì),第四章,交叉匯編語言MASM51,單片機(jī)匯編語言程序設(shè)計(jì)方法及技巧,了解交叉匯編語言MASM51的特點(diǎn),掌握順序程序、分支程序、循環(huán)程序、查表程序、子程序的基本設(shè)計(jì)方法和技巧,掌握匯編語言程序設(shè)計(jì)的一般步驟,4.1 交叉匯編語言MASM51,匯編語言源程序是由匯編指令和偽指令組成的文件,其擴(kuò)展名為“ASM”。,1)人工匯編 人工匯編是通過人工查出源程序中所有匯編指令的機(jī)器碼,并依次將機(jī)器碼輸入單片機(jī)中,使之成為單片機(jī)能直接執(zhí)行的目標(biāo)程序。,2)機(jī)器匯編 機(jī)器匯編是指在計(jì)算機(jī)上通過匯編程序?qū)υ闯绦蜻M(jìn)行匯編,即從源程序到目標(biāo)程序的轉(zhuǎn)換過程是由計(jì)算機(jī)上的匯編程序自動(dòng)完成的。,3)交叉匯編 是指用一種計(jì)算機(jī)上的匯編程序去匯編另一種計(jì)算機(jī)的源程序,為另一種計(jì)算機(jī)產(chǎn)生目標(biāo)程序。,單片機(jī)MCS-51匯編語言程序設(shè)計(jì)步驟: 1 分析問題 2 確定算法 3 設(shè)計(jì)程序流程圖 4 分配內(nèi)存單元 5 編寫匯編語言源程序 6 調(diào)試程序,4.2 程序設(shè)計(jì)方法及技巧,4.2.1 順序程序設(shè)計(jì),分析:應(yīng)注意片內(nèi)和片外的尋址指令不同,ORG 1000H MOV R0 ,#68H MOV A ,R0 ; 片內(nèi)RAM104單元內(nèi)容送累加器 MOV DPTR ,#0104H MOVX DPTR ,A ; 完成片內(nèi)RAM104單元內(nèi)容送片 ; 外104H單元中 INC R0 MOV A ,R0 ; 片內(nèi)RAM105單元內(nèi)容送累加器 INC DPTR MOVX DPTR ,A ; 完成片內(nèi)RAM105單元內(nèi)容送片 ; 外105H單元中 SJMP $ END,1. 簡單分支程序,4.2.2 分支程序設(shè)計(jì),圖4.1 簡單分支程序轉(zhuǎn)移,分析:只要將兩數(shù)進(jìn)行比較,用比較的結(jié)果作為分支轉(zhuǎn)移的條件就很容易地找出其中的大數(shù)。,ORG 1000H CLR C MOV R0 , #FIRST ;第一個(gè)數(shù)地址送R0中 MOV A , R0 ;取第一個(gè)數(shù) INC R0 ;R0指向第二個(gè)數(shù)地址 SUBB A , R0 ;兩數(shù)比較 JC BIG ;第二個(gè)數(shù)大轉(zhuǎn)BIG DEC R0 ;R0指向第一個(gè)數(shù)地址 BIG: MOV SECOND , R0 ;存大數(shù) SJMP $ END,參考程序,2)多路分支程序(散轉(zhuǎn)程序),圖4.2 多路分支程序轉(zhuǎn)移,1)把AJMP或LJMP指令組成一個(gè)分支程序的 轉(zhuǎn)移表,表的首地址放入DPTR中; 2)調(diào)整后的出口信息放入累加器A中; 3)執(zhí)行JMP A+DPTR轉(zhuǎn)向?qū)?yīng)的分支程序。,可通過間接轉(zhuǎn)移指令JMP A+DPTR和 無條件轉(zhuǎn)移指令中的AJMP或LJMP指令來實(shí)現(xiàn) 多路分支轉(zhuǎn)移:,例 4.3,已知R0中存放有一數(shù)字關(guān)鍵碼,要求根據(jù)碼值的不同,分別轉(zhuǎn)向?qū)?yīng)的碼值程序段去執(zhí)行。即當(dāng)R0=K時(shí),便執(zhí)行CODEK程序。,ORG 1000H MOV DPTR ,#TAB ;表首址送DPTR MOV A ,R0 ;取數(shù)字關(guān)鍵碼 ADD A ,R0 ;每條AJMP指令占用兩個(gè)字 ;節(jié),將關(guān)鍵碼乘以2 JNC LESS ;關(guān)鍵碼小于128轉(zhuǎn)LESS INC DPH LESS: JMP A+DPTR TAB: AJMP CODE0 ;關(guān)鍵碼為0,轉(zhuǎn)CODE0執(zhí)行 AJMP CODE1 ;關(guān)鍵碼為1,轉(zhuǎn)CODE1執(zhí)行 AJMP CODE255 ;關(guān)鍵碼為255,轉(zhuǎn)CODE255 ;執(zhí)行,AJMP指令的轉(zhuǎn)移范圍不超出所在的2KB字節(jié)區(qū)間,如各小段程序較長,在2KB字節(jié)內(nèi)無法全部容納,上面的程序應(yīng)該怎樣修改?,思考,1)循環(huán)初始化 設(shè)置循環(huán)的初始狀態(tài),位于循環(huán)程序的開頭位置 2)循環(huán)處理 循環(huán)程序的主體部分,是通過反復(fù)執(zhí)行來完成數(shù)據(jù)的具體處理,它位于循環(huán)體內(nèi)。,4.2.3 循環(huán)程序設(shè)計(jì),循環(huán)程序由4部分組成:,3)循環(huán)控制 也在循環(huán)體內(nèi),是用于控制循環(huán)的繼續(xù)與否。 4)循環(huán)結(jié)束 通常位于循環(huán)體后,是用來存放循環(huán)處理的最終結(jié)果及恢復(fù)各寄存器與工作單元的原始值。,設(shè)MCS-51單片機(jī)內(nèi)部RAM從40H開始的連續(xù)16個(gè)單元中,每個(gè)單元中分別存放有單字節(jié)的帶符號(hào)數(shù)。要求將其中的正數(shù)存入50H開始的連續(xù)單元中,負(fù)數(shù)存入60H開始的連續(xù)單元中,并將正數(shù)、負(fù)數(shù)和零的個(gè)數(shù)分別存入70H、71H、72H單元中。,例 4.4,1)帶符號(hào)數(shù)的最高位為符號(hào)位,可通過 最高位來判斷正負(fù)。 2)程序中需要分別從40H、50H 和60H單 元開始取源數(shù)、存放正數(shù)和負(fù)數(shù),故需要三 個(gè)地址指針來指向?qū)?yīng)的內(nèi)存單元;設(shè)對應(yīng) 的地址指針分別為R0、R1和R2,由于R2 不 能用間接尋址方式,故R2需要同R1或R0進(jìn)行 交換后,才能進(jìn)行負(fù)數(shù)的存放。,分析,圖4.3 程序流程圖,參考程序: ORG 1000H CLR A MOV 70H , A ; 存放正數(shù)的個(gè)數(shù)單元清0 MOV 71H , A ; 存放負(fù)數(shù)的個(gè)數(shù)單元清0 MOV 72H , A ; 存放零的個(gè)數(shù)單元清0 MOV R3 , #10H ; 設(shè)循環(huán)計(jì)數(shù)器初值 MOV R0 , #40H ;設(shè)源數(shù)地址指針 MOV R1 , #50H ;設(shè)正數(shù)地址指針 MOV R2 , #60H ;設(shè)負(fù)數(shù)地址指針,LOOP:MOV A , R0 ; 取源數(shù) JZ ZERO ; 源數(shù)為0,轉(zhuǎn)ZER0 JNB ACC.7 , POSI ; 源數(shù)為正,轉(zhuǎn)POSI INC 71H ; 負(fù)數(shù)個(gè)數(shù)加1 MOV R4 , A ; 暫存源數(shù) MOV A , R2 XCH A , R1 ; R1與R2中的內(nèi)容交換 XCH A , R4 MOV R1 , A ;存負(fù)數(shù) XCH A , R4 XCH A , R1 ; R1與R2中的內(nèi)容交換 INC R2 ;調(diào)整負(fù)數(shù)地址指針 SJMP LOOP1 ; 轉(zhuǎn)循壞控制,POSI: INC 70H ;正數(shù)個(gè)數(shù)加1 MOV R1 , A ;存正數(shù) INC R1 ;調(diào)整正數(shù)地址指針 SJMP LOOP1 ZERO: INC 72H ;零的個(gè)數(shù)加1 LOOP1:INC R0 ;調(diào)整源數(shù)地址指針 DJNZ R3 , LOOP ;未送完,繼續(xù) SJMP $ END,查表就是把事先計(jì)算或測得的數(shù)據(jù)按照一定的順序編制成表格存放在存儲(chǔ)器中,然后根據(jù)輸入的數(shù)據(jù),從表格中查出所需的結(jié)果。,4.2.4 查表程序設(shè)計(jì),片內(nèi)RAM的EGA單元中有一個(gè)大寫的英文字母,要求將此字母在英文字母表中的位置送入片內(nèi)的COUNT單元中,如EGA單元中字母為I時(shí),則COUNT單元中需送入數(shù)字9。,例 4.6,如果將26個(gè)英文字母按照順序編成一個(gè)表,通過查表法得到一個(gè)字母與EGA單元中的字母比較,若不相等再查,同時(shí)記錄查表的次數(shù)。查完后,將記錄次數(shù)送COUNT單元。,分析,ORG 1000H EGA EQU 50H COUNT EQU 60H MOV COUNT,#00H MOV A , #16 ;調(diào)整地址 LOOP: PUSH A MOVC A , A+PC ;查表 CJNZ A , EGA , NF ;所查字母與EGA中字母比較 SJMP LAST ;相等則轉(zhuǎn)到LAST NF: POP A INC A ;調(diào)整地址 INC COUNT ;記數(shù)值加1 SJMP LOOP ;繼續(xù)查 LAST: INC COUNT ;記數(shù)值加1 SJMP $ ;等待 ALPT: DBA,B,Y,Z,求y= n! (n=0,1,9),已知n的值在片內(nèi)RAM的NUM單元中,求得的y 值用BCD碼表示且存放到片內(nèi)GETY開始的單元中。,例 4.6,分析:可將函數(shù)值列成表,采用查表法求y= n! 當(dāng)n= 9時(shí),y= 362880H,需要三個(gè)單元存放結(jié)果。設(shè)每個(gè)n對應(yīng)的y值都用3個(gè)單元來存放,則y值在表格中的首地址的計(jì)算公式為: y地址=函數(shù)表首址+ n*3,參考程序 ORG 1000H NUM EQU 50H GETY EQU 60H MOV R1,#03H MOV R0,#GETY MOV A ,NUM ; 取n值 MOV B ,#03H MUL AB ; n*3 MOV R2 ,A ; 暫存 MOV DPTR ,#TAB ; 表的首地址送DPTR中,LOOP: MOVC A ,A+DPTR ;查表 MOV R0 , A ;存結(jié)果 INC R0 ;調(diào)整存放結(jié)果地址指針 INC DPTR ;修正表地址指針 MOV A , R2 ;恢復(fù)n*3 DJNZ R1 , LOOP ;未查完,繼續(xù) SJMP $ TAB: DB 01H , 00H , 00H , 01H , 00H , 00H DB 02H , 00H , 00H , 06H , 00H , 00H DB 24H , 00H , 00H , 20H , 01H , 00H DB 20H , 07H , 00H , 40H , 50H , 00H DB 20H , 03H , 04H , 80H , 28H , 36H,編寫子程序時(shí)應(yīng)注意: a.子程序的第一條指令之前必須有標(biāo)號(hào); b.子程序中需要保護(hù)現(xiàn)場; c.主程序和子程序之間的參數(shù)傳遞。,4.2.5 子程序設(shè)計(jì),1) 數(shù)碼轉(zhuǎn)換子程序,例4.7 二進(jìn)制碼轉(zhuǎn)換為ASCII碼,二進(jìn)制數(shù)與ASCII碼的對應(yīng)關(guān)系: 四位二進(jìn)制 ASCII 0000 (0) 30H 0001 (1) 31H 1001 (9) 39H 1010 (A) 41H 1111 (F) 46H,ORG 1000 BTOASC: PUSH A PUSH PSW MOV A , R0 ANL A , #0FH ;取四位二進(jìn)制數(shù) MOV R0 , A ;暫存 CLR C SUBB A , #0AH ;與10比較 MOV A , R0 ;恢復(fù)四位二進(jìn)制數(shù) JC LOOP ;小于10轉(zhuǎn)LOOP ADD A , #07H ;大于10先加07H LOOP: ADD A , #30H ;加30H MOV R0 , A ;存結(jié)果 POP PSW POP A RET,已知片內(nèi)BLOCKB單元開始處有一數(shù)據(jù)塊,塊長在R2中,在此數(shù)據(jù)塊的每個(gè)單元中存放有一個(gè)未組合的BCD碼,要求將每個(gè)BCD碼轉(zhuǎn)換為ASCAII碼,并存放在片內(nèi)BLOCKA開始的連續(xù)單元中。,例4.8 BCD碼轉(zhuǎn)換為ASCAII碼,主程序: ORG 1000H MOV R2 ,#L MOV R0 ,#BLOCKB ;設(shè)BCD碼的地址指針 MOV R1 ,#BLOCKA ;設(shè)ASCAII的地址指針 LOOP:ACALL TRANS ;調(diào)用TRANS子程序 DJNZ R2 ,LOOP ;未轉(zhuǎn)換完,繼續(xù) SJMP $,將一位BCD碼轉(zhuǎn)換為ASCAII碼的子程序: TRANS: MOV A , R0 ;取BCD碼 ADD A , #30H MOV R1 , A ;送ASCAII碼 INC R0 INC R1 RET ;返回,分析:將一位BCD碼轉(zhuǎn)換為相應(yīng)的ASCAII碼只 需加上30H即可。,設(shè)片內(nèi)40H單元中有一組合的BCD碼,要求將其轉(zhuǎn)換為二進(jìn)制數(shù)存回原處。 分析: 1)組合的BCD碼為兩位十進(jìn)制數(shù),需將十位 數(shù)和個(gè)位數(shù)分開處理。 2)十位數(shù)轉(zhuǎn)換時(shí)只要累加0AH就能將其轉(zhuǎn)換 為相應(yīng)的二進(jìn)制數(shù),然后再將個(gè)位數(shù)直接 加到轉(zhuǎn)換后的十位數(shù)上就可完成整個(gè)數(shù)的 轉(zhuǎn)換。,例4.9 BCD碼轉(zhuǎn)換為二進(jìn)制數(shù),ORG 1000H BCDTOB: MOV A , 40H ANL A ,#F0H ;取十位數(shù) SWAP A ;將十位數(shù)換到低4位 JZ DONE ;十位數(shù)為0,返回 MOV R3 ,#00H ;累加和寄存器清0 LOOP: DEC A ACALL ADD0AH ;調(diào)用加10子程序 JNZ LOOP ;未加完繼續(xù) MOV A ,40H ANL A ,#0FH ;取個(gè)位數(shù) ADD A,R3 ;與十位相加 MOV 40H , A ;轉(zhuǎn)換完,存結(jié)果 DONE: RET ;(書上此處有錯(cuò)),加10子程序:,已知8位二進(jìn)制數(shù)在R0中,要求將其轉(zhuǎn)換為BCD碼并存放在片內(nèi)30H、31H單元中。,分析:8位二進(jìn)制數(shù)轉(zhuǎn)換成3位BCD碼數(shù),用壓縮BCD碼存放,百位數(shù)放31H單元,十位、個(gè)位數(shù)放30H單元。,例4.10 二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼,程序流程圖為:,ORG 1000H BTOBCD: MOV A,R0 ;取二進(jìn)制數(shù) MOV B,#100 DIV AB ;除以100 MOV R1,#31H MOV R1 , A ;百位的BCD碼數(shù)存31H單元 DEC R1 XCH A ,B ; 二進(jìn)制數(shù)除以100的余數(shù)送累加器中 MOV B , #10 DIV AB ; 除以10 SWAP A ADD A ,B ;十位與個(gè)位的BCD碼進(jìn)行組合 MOV R1 ,A ;組合的BCD碼送30H中 RET,已知片內(nèi)RAM ADR1開始的單元依次從低位到高位存放有L個(gè)字節(jié)的無符號(hào)數(shù),片外RAM ADR2開始的單元也依次從低位到高位存放有L個(gè)字節(jié)的無符號(hào)數(shù)。請編一個(gè)加法程序,將他們的和存放在ADR1開始的連續(xù)單元中。,2) 算術(shù)運(yùn)算子程序,例4.11 多字節(jié)無符號(hào)數(shù)相加,程序流程框圖:,ORG 1000H NSADD: MOV R0,#ADDR1 ;設(shè)被加數(shù)的地址指針 MOV DPTR ,#ADDR2 ;設(shè)加數(shù)的地址指針 MOV R2 ,#L ;設(shè)循環(huán)計(jì)數(shù)器初值 CLR C LOOP: MOVX A ,DPTR ;取加數(shù) ADDC A , R0 ;兩數(shù)相加 MOV R0 , A ;存和 INC R0 ;調(diào)整被加數(shù)地址指針 INC DPTR ;調(diào)整加數(shù)地址指針 DJNZ R2 , LOOP ;未加完,繼續(xù) RET ;返回,已知被乘數(shù)和乘數(shù)分別為雙字節(jié)的無符號(hào)數(shù),被乘數(shù)的高字節(jié)和低字節(jié)分別存放在R7和R6中,乘數(shù)的高字節(jié)和低字節(jié)分別存放在R5和R4中。要求乘積存放在片內(nèi)RAM以ADR開始的單元中。 分析:由于只有單字節(jié)乘法指令,雙字節(jié)的乘法需要分作4次乘法運(yùn)算才能實(shí)現(xiàn)。,例4.15 兩雙字節(jié)無符號(hào)數(shù)相乘,ORG 1000H MUL1: MOV 40H ,#00H ;統(tǒng)計(jì)bdH+adL+bcL ;的進(jìn)位單元清0 MOV 41H ,#00H ;統(tǒng)計(jì)adH+bcH+acL ;的進(jìn)位單元清0 MOV R0 ,#50H ;積的首地址送R0中 MOV A ,R6 ;b送A MOV B ,R4 ;d送B MUL AB ;bd MOV R0 , A ;bdL送50H單元中 MOV R1 , B ;bdH送R1中,MOV A , R7 ; a送A MOV B , R4 ; d送B MUL AB ; ad MOV R2 , A ; adL送R2中 MOV R3 , B ; adH送R3中 MOV A , R6 ; b送A MOV B , R5 ; c送B MUL AB ; bc ADD A , R2 ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際貿(mào)易代理基礎(chǔ)知識(shí)考核試卷
- 珠寶首飾表面處理技術(shù)考核試卷
- 玻璃制品耐候性測試與優(yōu)化考核試卷
- 稻谷種植農(nóng)業(yè)氣象服務(wù)需求與供給考核試卷
- 新材料新技術(shù)引領(lǐng)可持續(xù)發(fā)展的新方向考核試卷
- 果蔬汁飲料的企業(yè)文化與品牌建設(shè)考核試卷
- 紡織企業(yè)成本分析與控制考核試卷
- 勞務(wù)派遣企業(yè)招聘渠道分析與優(yōu)化考核試卷
- 濟(jì)南大學(xué)《模特經(jīng)紀(jì)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西服裝學(xué)院《嬰幼兒護(hù)理與急救》2023-2024學(xué)年第二學(xué)期期末試卷
- 《水泥窯爐富氧(全氧)燃燒技術(shù)規(guī)范》
- 第37章 主要病原性真菌課件
- 2023年小型水庫雨水情測報(bào)和大壩安全監(jiān)測設(shè)施項(xiàng)目-實(shí)施方案
- 2024年福建省高中生物學(xué)業(yè)水平考試生物試卷試題(含答案詳解)
- 工程施工材料采購方案工程材料采購方案
- DZ∕T 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬(正式版)
- 蘇教版高中化學(xué)實(shí)驗(yàn)一覽表
- MOOC 隧道工程-中南大學(xué) 中國大學(xué)慕課答案
- 學(xué)校校服采購應(yīng)急預(yù)案范文
- 第一單元 《分?jǐn)?shù)乘法》整單元(教案)西師大版六年級(jí)上冊數(shù)學(xué)
- (2024年)面神經(jīng)炎課件完整版
評論
0/150
提交評論