版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章匯編語言程序設(shè)計本章學(xué)習(xí)目標(biāo):了解匯編語言程序設(shè)計步驟。掌握簡單的順序程序設(shè)計。掌握簡單的分支程序設(shè)計。掌握簡單的循環(huán)程序設(shè)計。掌握簡單的子程序設(shè)計。掌握一些常用程序設(shè)計。4.1匯編語言程序設(shè)計概述4.1.1程序設(shè)計語言1.機(jī)器語言機(jī)器語言是計算機(jī)唯一能識別和執(zhí)行的語言,用其編寫的程序執(zhí)行效率最高,速度最快,但由于指令的二進(jìn)制代碼很難記憶和辨認(rèn),給程序的編寫、閱讀和修改帶來很多困難,所以幾乎沒有人直接使用用機(jī)器語言來編寫程序。2.匯編語言為了容易理解和記憶計算機(jī)的指令,人們用英文助記符表示指令,用助記符表示的指令就是符號語言或匯編語言。匯編語言特點:(1)面向機(jī)器的語言,程序設(shè)計員須對MCS-51的硬件有相當(dāng)深入的了解。(2)助記符指令和機(jī)器指令一一對應(yīng),用匯編語言編寫的程序效率高,占用存儲空間小,運(yùn)行速度快,用匯編語言能編寫出最優(yōu)化的程序。能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲器及I/O接口電路。(3)匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,均是面向“機(jī)器”的語言,缺乏通用性。3.高級語言高級語言是一種面向算法、過程和對象的程序設(shè)計語言,它采用更接近人們自然語言和習(xí)慣的數(shù)學(xué)表達(dá)式及直接命令的方法來描述算法、過程和對象。高級語言的語句直觀、易學(xué)、通用性強(qiáng),便于推廣、交流,但高級語言編寫的程序經(jīng)編譯后所產(chǎn)生的目標(biāo)程序大,占用內(nèi)存多,運(yùn)行速度較慢。4.1.2匯編語言程序設(shè)計步驟1.分析題意,明確要求。2.確定算法。根據(jù)實際問題的要求、給出的條件及特點,找出規(guī)律性,最后確定所采用的計算公式和計算方法,這就是一般所說的算法。算法是進(jìn)行程序設(shè)計的依據(jù),它決定了程序的正確性和程序的指令。處理框流程線判斷框起止框3.畫程序流程圖,用圖解來描述和說明解題步驟。4.分配內(nèi)存工作單元,確定程序與數(shù)據(jù)區(qū)存放地址。5.編寫源程序。6.程序優(yōu)化。7.上機(jī)調(diào)試、修改和最后確定源程序。4.1.3匯編語言格式與偽指令1.匯編程序格式[標(biāo)號:]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]例如:CLEAR:MOVA,#00H;將0送入A中2.偽指令偽指令不能命令CPU執(zhí)行某種操作,也沒有對應(yīng)的機(jī)器代碼,它的作用僅用來給匯編程序提供某種信息。(1)ORG匯編起始地址命令在匯編語言源程序的開始,通常都用一條ORG偽指令來實現(xiàn)規(guī)定程序的起始地址。例如ORG2000HSTART: MOVA,#00H ┋規(guī)定標(biāo)號START代表地址為2000H開始。(2)END匯編終止命令
匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。在整個源程序中只能有一條END命令,且位于程序的最后。(3)DB(DefineByte)定義字節(jié)命令在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。例如ORG2000HDB30H,40H,24,“C”,“B”匯編后: (2000H)=30H
(2001H)=40H
(2002H)=18H(10進(jìn)制數(shù)24) (2003H)=43H(字符“C”的ASCII碼) (2004H)=42H(字符“B”的ASCII碼)(4)DW(DefineWord)定義數(shù)據(jù)字命令從指定的地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如ORG2000HDW1246H,7BH,10匯編后:(2000H)=12H ;第1個字(2001H)=46H(2002H)=00H ;第2個字(2003H)=7BH(2004H)=00H ;第3個字(2005H)=0AH(2005H)=0AH(5)EQU(Equate)賦值命令用于給標(biāo)號賦值。賦值以后,其標(biāo)號值在整個程序有效。例如:
TESTEQU2000H
表示標(biāo)號TEST=2000H,在匯編時,凡是遇到標(biāo)號TEST時,均以2000H來代替。(6)BIT(位地址賦值)偽指令該語句的功能是把BIT右邊的位地址賦給它左邊的“字符名稱”。因此,BIT語句定義過的“字符名稱”是一個符號位地址。例如:ORG0030HA1BIT00HA2BITP0.04.2順序程序設(shè)計
例4-1
有兩個三字節(jié)無符號數(shù),其中一個加數(shù)在內(nèi)部RAM的50H、51H、52H單元中,另一個加數(shù)在內(nèi)部RAM的53H、54H和55H單元中,要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)00H位中。解:ORG0010HMOVR0,#52H;一個加數(shù)的低字節(jié)地址
MOVR1,#55H;另一個加數(shù)的低字節(jié)地址
MOVA,@R0ADDA,@R1;低字節(jié)相加
MOV@R0,A;存放低字節(jié)相加結(jié)果
DECR0DECR1MOVA,@R0ADDCA,@R1;中間字節(jié)帶進(jìn)位相加
MOV@R0,A;存放中間字節(jié)相加結(jié)果
DECR0DECR1MOVA,@R0ADDCA,@R1;高字節(jié)帶進(jìn)位相加
MOV@R0,A;存放高字節(jié)相加結(jié)果
MOV00H,C;進(jìn)位送00H位保存
SJMP$END4.3分支程序設(shè)計例4-2
累加器A中有一單字節(jié)有符號數(shù),求其二進(jìn)制補(bǔ)碼。解:正數(shù)補(bǔ)碼是其本身,負(fù)數(shù)補(bǔ)碼是其反碼加1。因此,程序應(yīng)首先判斷被轉(zhuǎn)換數(shù)的符號,負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)即為補(bǔ)碼。
ORG0020HJNBACC.7,RETURN;A>0,不需要轉(zhuǎn)換
MOVC,ACC.7;符號位保存
CPLA;A求反,加1ADDA,#1MOVACC.7,C;符號位存A的最高位RETURN:RET例4-3設(shè)自變量為一無符號數(shù),存放在內(nèi)部RAM的VAX單元,函數(shù)Y存放在FUNC單元。請編寫滿足如下關(guān)系的程序:ORG0200HVARDATA20HFUNCDATA21HMOVA,VAR;A←(20H)
CJNEA,#50,NEXT1;建立CyNEXT1:JNCDONE;若X≥50,則DONECJNEA,#20H,NEXT2;建立CyNEXT2:JCNEXT3;若X<20,則NEXT3RLARLAADDA,20H;A←5XSJMPDONENEXT3:RLA;A←2XDONE:MOVFUNC,A;21H←ASJMP$END4.4循環(huán)程序設(shè)計
例4-4設(shè)單片機(jī)8031內(nèi)部RAM起始地址30H的數(shù)據(jù)塊中有64個無符號數(shù)。試編寫程序使它們按從小到大的順序排列。ORG1000HBUBBLE:MOVR0,#30H;置數(shù)據(jù)塊指針R0MOVR2,#64;塊長送R2CLR7FH;交換標(biāo)志2FH.7清零
DECR2;塊長—1為比較次數(shù)BULOOP:MOV20H,@R0;eN送20HMOVA,@R0;eN送AINCR0MOV21H,@R0;eN-1送21HDECACJNEA,21H,LOOP;(20H)和(21H)比較
LOOP:JCBUNEXT;若(20H)<(21H),則BUNEXTMOV@R0,20H;若(20H)≥(21H),則兩者交換
DECR0MOV@R0,21HINCR0;恢復(fù)數(shù)據(jù)塊指針
SETB7FH;置“1”交換標(biāo)志位BUNEXT:DJNZR2,BULOOP;若一次冒泡未完,則BULOOPJB7FH,BUBBLE;若交換標(biāo)志位為1,則BUBBLESJMP$;停機(jī)
END例4-5
外部RAM從2000H到2100H有一數(shù)據(jù)塊,請編寫將它們傳送到從3000H到3100H區(qū)域的程序。ORG0500HMOVDPTR,#3000H;目標(biāo)地址送3000HPUSHDPL;目標(biāo)地址送棧PUSHDPHMOVDPTR,#2000H;源地址送DPTRMOVR2,#01H;塊長送R3R2MOVR3,#01HLOOP:MOVXA,@DPTR;源數(shù)送AINCDPTRMOVR5,DPH;源針加1后送R5R4MOVR4,DPLPOPDPH;目標(biāo)地址送DPTRPOPDPLMOVX@DPTR,A;送數(shù)INCDPTR;目標(biāo)地址加1PUSHDPL;送棧PUSHDPHMOVDPH,R5;源針?biāo)虳PTRMOVDPL,R4CLRC;Cy清零MOVA,R2;R2-1送R2SUBBA,#01HMOVR2,AMOVA,R3;R3-Cy送R3SUBBA,#00HMOVR3,AORLA,R2;R3∨R2送AJNZLOOP;R3∨R2<>0,則LOOPSJMP$;否則,停機(jī)END例4-6設(shè)晶振頻率為6MHz,試編寫能延時20ms的子程序。解:ORG0D00HDELAY:MOVR7,#49DELAY2:MOVR6,#64HDELAY1:DJNZR6,DELAY1NOPDJNZR7,DELAY2NOPRET4.5子程序的設(shè)計例4-7
設(shè)MDA和MDB內(nèi)有兩數(shù)a和b,請編寫求c=并把c送入MDC的程序。設(shè)a和b皆為小于10的整數(shù)。ORG1000HMDADATA20HMDBDATA21HMDCDATA22HMOVA,MDA;入口參數(shù)a送AACALLSQR;求a2MOVR1,A;a2送R1MOVA,MDB;入口參數(shù)b送AACALLSQR;求a2ADDA,R1;a2+b2送AMOVMDC,A;存入MDCSJMP$;停機(jī)
SQR:ADDA,#01H;地址調(diào)整
MOVCA,@A+PC;查平方表
RET;返回SQRTAB:DB0,1,4,9,16DB25,36,49,64,81END例4-8求兩個無符號數(shù)據(jù)塊中的最大值。數(shù)據(jù)塊的起始地址分別為內(nèi)部RAM20H、30H,20H、30H中存放數(shù)據(jù)塊的長度(長度不大于15),把兩個數(shù)據(jù)塊中的最大值分別存入51H、52H中。ORG2000HMOVSP,#2FH;設(shè)堆棧指針
MOVR1,#20H;取第一數(shù)據(jù)塊起始地址送入R1ACALLQMAX;第一次調(diào)用求最大值子程序
MOV51H,A;第一數(shù)據(jù)塊最大值存入51H中
MOVR1,#30H;取第二數(shù)據(jù)塊起始地址送入R1ACALLQMAX;第二次調(diào)用求最大值子程序
MOV52H,A;第二數(shù)據(jù)塊最大值存入52H中
ORG2200HQMAX:MOVA,@R1;取數(shù)據(jù)塊長度
MOVR2,A;R2做計數(shù)器
CLRA;A清零,準(zhǔn)備作比較LOOP1:INCR1;指向下一個數(shù)據(jù)地址
CLRC;Cy清零,準(zhǔn)備做減法
SUBBA,@R1;用減法作比較
JNCLOOP2;若A大,則轉(zhuǎn)入LOOP3MOVA,@R1;若A小,則將大數(shù)送入A中
SJMPLOOP3;無條件轉(zhuǎn)LOOP3LOOP2:ADDA,@R1;恢復(fù)A中值LOOP3:DJNZR2,LOOP1;計數(shù)器減1,不為零,繼續(xù)比較
RET;比較完,子程序返回4.6常用程序設(shè)計4.6.1查表程序設(shè)計查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。對于MCS-51單片機(jī),數(shù)據(jù)表格一般存放于程序存儲器內(nèi)。采用MCS-51匯編語言進(jìn)行查表尤為方便,它有兩條專門的查表指令:MOVCA,@A+DPTRMOVCA,@A+PC例4-9設(shè)在片外RAM的20H單元中有一數(shù)x,其值范圍為0~9,要求利用查表方法求此數(shù)的平方值y并把結(jié)果存入片外RAM的21H,試編寫相應(yīng)程序。解:ORG0400HMOVR0,#20H;R0←20HMOVXA,@R0;A←xMOVDPTR,#TABMOVCA,@A+DPTR;A←yMOVR0,#21H;R0←21HMOVX@R0,A;y值送21H單元SJMP$;停機(jī)TAB:DB0,1,4,9,16DB25,36,49,64,81END例4-11設(shè)有一個巡回檢測報警裝置,需對16路輸入進(jìn)行檢測,每路有一個最大允許值,為雙字節(jié)。裝置運(yùn)行時,需根據(jù)測量的路數(shù),找出每路的最大允許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就報警。根據(jù)上述要求,編制一個查表程序。解:TB3:MOVA,R2ADDA,R2;A←(R2)×2MOVR3,A;保存指針ADDA,#6;查第一字節(jié)MOVCA,@A+PCXCHA,R3ADDA,#3MOVCA,@A+PC;查第二字節(jié)MOVR4,ARETTAB3:DW1520,3456,2456,2567;最大值表
DW5560,23366,9756,3457DW2694,2567,4753,4673DW2577,8989,25475,365534.6.2運(yùn)算程序設(shè)計例4-12已知以內(nèi)部RAM中BLOCK1和BLOCK2為起始地址的存儲區(qū)中分別有5字節(jié)無符號被減數(shù)和減數(shù)(低位在前,高位在后)。請編寫減法子程序令他們相減,并把差放入BLOCK1為起始地址的存儲單元。解:ORG0A00HSBY:MOVR0,#BLOCK1;被減數(shù)起始地址送R0MOVR1,#BLOCK2;減數(shù)起始地址送R1MOVR2,#05H;字長送R2CLRC;Cy清零LOOP:MOVA,@R0;被減數(shù)送ASUBBA,@R1;相減,形成CyMOV@R0,A;存差
INCR0;修改被減數(shù)地址指針
INCR1;修改減數(shù)地址指針
DJNZR2,LOOP;若未完,則LOOPRETEND例4-13已知兩個8位無符號乘數(shù)分別放在30H和31H單元中,試編出令它們相乘并把積的低8位放入32H單元、積的高8位放入33H單元的程序。解:ORG0100HMOVR0,#30HMOVA,@R0INCR0MOVB,@R0MULABINCR0MOV@R0,AINCR0MOV@R0,BSJMP$END4.6.3碼制轉(zhuǎn)換程序設(shè)計
例4-14已知R0低4位有一個十六進(jìn)制數(shù)(0~F中的一個),請編寫能把它轉(zhuǎn)換成相應(yīng)ASCII碼并送入R0的程序。解:由ASCII碼字符表可知0~9的ASCII碼為30H~39H,A~F的ASCII碼為41H~46H。因此,計算求解的思路是:若R0<=9,則R0內(nèi)容只需要加30H;若R0>9,則R0需加37H。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版軟件系統(tǒng)合同
- 2025年度合伙企業(yè)持股合同糾紛調(diào)解與仲裁規(guī)則3篇
- 2024物流金融服務(wù)框架協(xié)議
- 2025年度寵物活體產(chǎn)業(yè)鏈上下游資源整合合同3篇
- 2025年中國豪華客車行業(yè)市場調(diào)查研究及投資前景預(yù)測報告
- 2025個人虛擬貨幣購買分期還款協(xié)議3篇
- 2025年度個人汽車消費(fèi)貸款標(biāo)準(zhǔn)合同范本4篇
- 2025年度個人公司代持股解除協(xié)議書4篇
- 2025年湖北工業(yè)建筑集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年安徽港口集團(tuán)五河有限公司招聘筆試參考題庫含答案解析
- 《色彩基礎(chǔ)》課程標(biāo)準(zhǔn)
- 人力資源 -人效評估指導(dǎo)手冊
- 大疆80分鐘在線測評題
- 2024屆廣東省廣州市高三上學(xué)期調(diào)研測試英語試題及答案
- 中煤平朔集團(tuán)有限公司招聘筆試題庫2024
- 2023年成都市青白江區(qū)村(社區(qū))“兩委”后備人才考試真題
- 不付租金解除合同通知書
- 區(qū)域合作伙伴合作協(xié)議書范本
- 中學(xué)數(shù)學(xué)教學(xué)設(shè)計全套教學(xué)課件
- 環(huán)衛(wèi)公司年終工作總結(jié)
- 2023年德宏隴川縣人民法院招聘聘用制書記員考試真題及答案
評論
0/150
提交評論