版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章:MCS-51程序設(shè)計(jì)計(jì)算機(jī)與通信工程學(xué)院李耀明一、匯編語言概述1、指令系統(tǒng)語句格式[<標(biāo)號(hào)>]:<操作碼>[<操作數(shù)>];[<注釋>]指令編碼長(zhǎng)短:?jiǎn)巫止?jié),雙字節(jié),三字節(jié)執(zhí)行周期:一個(gè)機(jī)器周期占12個(gè)振蕩周期,單周期指令,雙周期,4周期尋址方式:指令中所規(guī)定的尋找操作地址的方式立即、直接、寄存器、寄存器間接尋址、基址加變址、相對(duì)尋址、位尋址指令分類:數(shù)據(jù)傳送、算術(shù)、邏輯、位操作、控制轉(zhuǎn)移2、程序設(shè)計(jì)的步驟(1)分析問題,編制說明要解決問題的程序框圖。(2)確定數(shù)據(jù)結(jié)構(gòu)、算法、工作單元、變量設(shè)定(與高級(jí)語言不同)(3)根據(jù)所用的指令系統(tǒng),按照已編制的程序框圖用匯編語言編制出源程序。(4)將編制出的程序在計(jì)算機(jī)上調(diào)試,直至實(shí)現(xiàn)預(yù)定的功能。二、程序設(shè)計(jì)分類1、順序程序:執(zhí)行時(shí)按順序一條條地執(zhí)行指令2、分支程序:當(dāng)程序不再順序執(zhí)行,而向一個(gè)方向或多個(gè)方向轉(zhuǎn)移時(shí),叫分支程序。3、循環(huán)程序:對(duì)于需要反復(fù)的程序段,常采用循環(huán)辦法,以縮短程序。4、子程序及其調(diào)用程序主程序使用子程序時(shí),用調(diào)用指令(ACALL),子程序最后放一條RET指令。三、程序設(shè)計(jì)準(zhǔn)則結(jié)構(gòu)清晰:便于分析層次分明:便于閱讀語言簡(jiǎn)潔:便于分析易于理解:便于閱讀4.1簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序又稱順序程序。計(jì)算機(jī)是按指令在存儲(chǔ)器中存放的先后次序來順序執(zhí)行程序的。除非用特殊指令讓它跳轉(zhuǎn),不然它會(huì)在PC控制下執(zhí)行。例4-1兩個(gè)8位無符號(hào)數(shù)相加ORG0000HAJMPBEGINORG0030HBEGIN:MOV40H,#01HMOV41H,#02HLOOP:MOVR0,#40HMOVA,@R0INCR0ADDA,@R0INCR0MOV@R0,AJMPLOOPEND開始R0←40HA←(R0)A送(42H)(40H)+(41H)和送A返回圖4-1例1流程圖例:將加數(shù)和被加數(shù)分別送入40H、41H單元,加完后和送入42H單元例4-2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)單字節(jié)數(shù)程序ORG0000HAJMPstartORG0030HSTART:MOVsp,#60HMOV40h,#01hMOV41h,#02hloop:MOVR1,#40HMOVA,@R1ANLA,#0FH;取第一個(gè)半字節(jié)SWAPAINCR1XCHA,@R1;取第二字節(jié)ANLA,#0FH;取第二個(gè)半字節(jié)ORLA,@R1;拼字INCR1MOV@R1,A;存放結(jié)果AJMP$END執(zhí)行完后如何不改變內(nèi)存和寄存器的值?開始(40H)內(nèi)容送A,屏蔽高位,交換高低位A←(R0)A與(R1)或后送(42H)?。?1H)內(nèi)容,屏蔽高位,送A返回圖4-2例2流程圖4.2分支程序設(shè)計(jì)在處理實(shí)際事務(wù)中,只用簡(jiǎn)單程序設(shè)計(jì)的方法是不夠的。因?yàn)榇蟛糠殖绦蚩偘信袛?、比較等情況。根據(jù)判斷、比較的結(jié)果轉(zhuǎn)向不同的分支例4-3:兩個(gè)無符號(hào)數(shù)比較大小設(shè)兩個(gè)連續(xù)外部RAM單元ST1和ST2中存放不帶符號(hào)的二進(jìn)制數(shù),找出其中的大數(shù)存入ST3單元中。ST1EQU8040HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#ST1MOVA,#12HMOVX@DPTR,AINCDPTRMOVA,#34HMOVX@DPTR,ALOOP:CLRC;進(jìn)位位清零MOVDPTR,#ST1;設(shè)數(shù)據(jù)指針MOVXA,@DPTR;取第一數(shù)MOVR2,A;暫存R2INCDPTRMOVXA,@DPTR;取第二個(gè)數(shù)SUBBA,R2;兩數(shù)比較JNCBIG1XCHA,R2;第一數(shù)大BIG0:INCDPTRMOVX@DPTR,A;存大數(shù)SJMP$BIG1:MOVXA,@DPTR;第二數(shù)大SJMPBIG0END開始設(shè)置指針DPTR初始值取第一個(gè)數(shù)存入R2取第二個(gè)數(shù)后者減前者進(jìn)位標(biāo)志是否為0?存后者結(jié)束存前者YN圖5-3例4流程例4-4:編制計(jì)算符號(hào)函數(shù)y=SGN(x)的程序AREEQU8040HBUFEQU8060HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#AREMOVA,#0F0HMOVX@DPTR,ALOOP:MOVDPTR,#ARE;進(jìn)位位清零MOVXA,@DPTR;取第一數(shù)JZSULJBACC.7,NEGMOVA,#01HSUL:MOVDPTR,#BUFMOVX@DPTR,AJMPLOOPNEG:MOVA,#0FFHSJMPSULEND4.3循循環(huán)程序設(shè)計(jì)計(jì)簡(jiǎn)單程序,每每條指令只執(zhí)執(zhí)行一次分支程序則根根據(jù)條件的不不同,會(huì)跳過過一些指令,,執(zhí)行另一些些指令。它們的特點(diǎn)是是,每一條指指令至多執(zhí)行行一次。在處理實(shí)際事事務(wù)時(shí),有時(shí)時(shí)會(huì)遇到多次次重復(fù)處理的的問題,用循循環(huán)程序的方方法來解決就就比較合適。。循環(huán)程序中中的某些指令令可以反復(fù)執(zhí)執(zhí)行多次。采用循環(huán)程序序,使程序縮縮短,節(jié)省存存儲(chǔ)單元。重重復(fù)次數(shù)越多多,循環(huán)程序序的優(yōu)越性就就越明顯。程序的執(zhí)行時(shí)時(shí)間并不節(jié)省省。由于要有有循環(huán)準(zhǔn)備、、結(jié)束判斷等等指令,速度度要比簡(jiǎn)單程程序稍慢些。。循環(huán)程序組成成循環(huán)程序一般般由五部分組組成:1、初始化部部分:為循環(huán)程序做做準(zhǔn)備。如:設(shè)置循環(huán)環(huán)次數(shù)計(jì)數(shù)器器的初值,地地址指針置初初值,為循環(huán)環(huán)變量賦初值值等。2、處理部分分:為反復(fù)執(zhí)行的的程序段,是是循環(huán)程序的的實(shí)體。3、修改部分分:每執(zhí)行一次循循環(huán)體后,對(duì)對(duì)指針作一次次修改,使指指針指向下一一數(shù)據(jù)所在位位置,為進(jìn)入入下一輪處理理作準(zhǔn)備。4、控制部部分:根據(jù)循環(huán)次次數(shù)計(jì)數(shù)器器的狀態(tài)或或循環(huán)條件件,檢查循循環(huán)是否能能繼續(xù)進(jìn)行行,若循環(huán)環(huán)次數(shù)到或或循環(huán)條件件不滿足,,應(yīng)控制退退出循環(huán),,否則繼續(xù)續(xù)循環(huán)。通常2、3、4部分分又稱為循循環(huán)體。5、結(jié)束部部分:分析及存放放執(zhí)行結(jié)果果。循環(huán)程序的的結(jié)構(gòu)循環(huán)程序的的結(jié)構(gòu)一般般有兩種形形式:先進(jìn)入處理理部分,再再控制循環(huán)環(huán)。至少執(zhí)執(zhí)行一次循循環(huán)體。先控制循環(huán)環(huán),后進(jìn)入入處理部分分。即先根根據(jù)判斷結(jié)結(jié)果,控制制循環(huán)的執(zhí)執(zhí)行與否,,有時(shí)可以以不進(jìn)入循循環(huán)體就退退出循環(huán)程程序。主要語句尋址方式寄存器間接接尋址MOVA,@RiMOVXA,@DPTRMOVXA,@Ri基址寄存器器+變址寄寄存器間接接尋址MOVCA,@A+DPTRMOVCA,@A+PC循環(huán)計(jì)數(shù)DJNZRn,relDJNEA,direct,relJZ(JNZ,JC,JNC,JB,JNB)rel例4-5工作單元清清零將40H為為起點(diǎn)的8個(gè)單元清清“0”O(jiān)RG0000HCLEAR:CLRA;;A清0MOVR0,#40H;;確確定清0單單元起始地地址MOVR7,#08;;確確定要清除除的單元個(gè)個(gè)數(shù)LOOP::MOV@R0,A;;清單單元INCR0;;指向下下一個(gè)單元元DJNZR7,,LOOP;控制制循環(huán)END例4-5工作單元清清零例如:設(shè)有有50個(gè)外外部RAM單元要清清“0”,,即為循環(huán)環(huán)次數(shù)存放放在R2寄寄存器中,,其首址存存放在DPTR中,,設(shè)為2000HORG0000HMOVDPTR,#2000HCLEAR:CLRAMOVR2,#32H;;置置計(jì)數(shù)值LOOP::MOVX@DPTR,AINCDPTR;;修修改地地址指針DJNZR2,,LOOP;;控制制循環(huán)END例4-5工作單元清清零寫成通用子子程序形式式:CLEAR:CLRALOOP::MOVX@DPTR,AINCDPTR;;修改改地址指針針DJNZR2,LOOP;;控控制循環(huán)RET完整調(diào)用ORG0000HMOVDPTR,#2000HMOVR2,#50ACALLCLEARSJMP$CLEAR:CLRALOOP::MOVX@DPTR,,AINCDPTR;;修改改地址指針針DJNZR2,LOOP;;控控制循環(huán)RETEND例4-6多個(gè)單字節(jié)節(jié)數(shù)據(jù)求和和已知有n個(gè)個(gè)單字節(jié)數(shù)數(shù)據(jù),依次次存放在內(nèi)內(nèi)部RAM40H單元開始始的連續(xù)單單元中。要要求把計(jì)算算結(jié)果存入入R2,R3中(高高位存R2,低位存存R3)。。程序如下::ORG8000HSAD:MOVR0,,#40H;;設(shè)數(shù)據(jù)據(jù)指針MOVR5,#NUM;;計(jì)計(jì)數(shù)值0AH→R5SAD1::MOVR2,,#0;;和和的高8位位清零MOVR3,#0;;和的的低8位清清零LOOP::MOVA,R3;;取加加數(shù)ADDA,@R0MOVR3,A;;存和的的低8位JNCLOP1;;無無進(jìn)位,直直接計(jì)算高高8位INCR2;;有有進(jìn)位,,和的高8位+1LOP1::INCR0;;指向下下一數(shù)據(jù)地地址DJNZR5,,LOOPRETNUMEQU0AHEND上述程序中中,用R0作間址寄寄存器,每每作一次加加法,R0加1,數(shù)數(shù)據(jù)指針指指向下一數(shù)數(shù)據(jù)地址,,R5為循循環(huán)次數(shù)計(jì)計(jì)數(shù)器,控控制循環(huán)的的次數(shù)。例4-7測(cè)試字符串串長(zhǎng)度設(shè)有一串字字符依次存存放在從50H單元元開始的連連續(xù)單元中中,該字符符串以回車車符(0DH)為結(jié)結(jié)束標(biāo)志,,測(cè)得的字字符串長(zhǎng)度度存入R2中。測(cè)字符串長(zhǎng)長(zhǎng)度程序是是將該字符符串中的每每一個(gè)字符符依次與回回車符相比比,若比較較不相等,,則統(tǒng)計(jì)字字符串長(zhǎng)度度的計(jì)數(shù)器器加1。繼繼續(xù)比較,,若比較相相等,則表表示該字符符串結(jié)束,,計(jì)數(shù)器中中的值就是是字符串的的長(zhǎng)度。程序如下::ORG0000HCONT::MOVR2,,#00H;;初始長(zhǎng)長(zhǎng)度設(shè)置MOVR0,#50H;;數(shù)據(jù)指針針R0置初初值NEXT::CJNE@R0,#0DH,,LOOP1RETLOOP1:INCR0INCR2SJMPNEXTEND待測(cè)字符以以ASCII碼形式式存放在RAM中,,回車符的的ASCII碼為0DH,程程序中用一一條CJNE@R0,#0DH,LOOP指指令實(shí)現(xiàn)字字符比較及及控制循環(huán)環(huán)的任務(wù),,當(dāng)循環(huán)結(jié)結(jié)束時(shí),R2的內(nèi)容容為字符串串長(zhǎng)度例4-910秒延延時(shí)程序延時(shí)程序與與MCS-51執(zhí)行行指令的時(shí)時(shí)間有關(guān),,如果使用用6MHz晶振,一一個(gè)機(jī)器周周期為2μμs,計(jì)算算出執(zhí)行一一條指令以以至一個(gè)循循環(huán)所需要要的時(shí)間,,給出相應(yīng)應(yīng)的循環(huán)次次數(shù),便能能達(dá)到延時(shí)時(shí)的目的。。程序如下::DEL:MOVR5,,#100DEL0::MOVR6,,#200DEL1::MOVR7,,#248DEL2::DJNZR7,DEL2;;248*2+4DJNZR6,DEL1;;(248*2+4)*200+4DJNZR5,DEL0;;(248*2+4)*200+4)*100+4RET上例延時(shí)程程序?qū)嶋H延延時(shí)為10.000406秒秒。它是一一個(gè)三重循循環(huán)程序,,利用程序序嵌套的方方法對(duì)時(shí)間間實(shí)行延遲遲是程序設(shè)設(shè)計(jì)中常用用的方法。。使用多重重循環(huán)程序序時(shí),必須須注意以下下幾點(diǎn):(1)循環(huán)環(huán)嵌套,必必須層次分分明,不允允許產(chǎn)生內(nèi)內(nèi)外層循環(huán)環(huán)交叉。(2)外循循環(huán)可以一一層層向內(nèi)內(nèi)循環(huán)進(jìn)入入,結(jié)束時(shí)時(shí)由里往外外一層層退退出。(3)內(nèi)循循環(huán)體可以以直接轉(zhuǎn)入入外循環(huán)體體,實(shí)現(xiàn)一一個(gè)循環(huán)由由多個(gè)條件件控制的循循環(huán)結(jié)構(gòu)方方式。例4-10冒冒泡泡程程序序MOVR6,#CNTDECR6LOOPA:MOVR0,#30HMOVA,R6MOVR7,ACLR20H.0NEXT:MOVA,@R0INCR0CLRCSUBBA,@R0JCNXCHMOVA,@R0DECR0XCHA,@R0INCR0MOV@R0,ASETB20H.0CNTEQU07HORG0000HAJMPSTARTORG0030HSTART:MOVDPTR,#LISTMOVR0,#30HMOVR7,#CNTLOOPD:CLRAMOVCA,@A+DPTRMOV@R0,AINCDPTRINCR0DJNZR7,LOOPDNXCH:DJNZR7,NEXTJNB20H.0,OVERDJNZR6,LOOPAOVER:AJMP$LIST:DB70H,13H,3H,90H,27H,32H,11Hend例4-13無無符號(hào)數(shù)雙雙字節(jié)乘法R2R3×R6R7--------------------------------R3×R7R2×R7R3×R6R2×R6-------------------------------------R4R5R6R7例4-13無無符號(hào)數(shù)雙雙字節(jié)乘法ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60HSTART:MOVR2,#0FFHMOVR3,#0FFHMOVR6,#0FFHMOVR7,#0FFHLCALLDBMULAJMPSTARTDBMUL:MOVA,R3MOVB,R7MULABXCHA,R7MOVR5,BMOVB,R2MULABADDA,R5MOVR4,ACLRAADDCA,BMOVA,R5MOVA,R6MOVB,R3MULABADDA,R4XCHA,R6XCHA,BADDCA,R5MOVR5,AMOVF0,CMOVA,R2MULABADDA,R5MOVR5,ACLRAMOVACC.0,CMOVC,F0ADDCA,BMOVR4,ARETEND4.4散轉(zhuǎn)轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序是分分支程序的一一種。它由輸入條件件或運(yùn)算結(jié)果果來確定轉(zhuǎn)入入各自的處理理程序。有多種方法能能實(shí)現(xiàn)散轉(zhuǎn)程程序,但通常常用逐次比較較法,即把所所有各個(gè)情況況逐一進(jìn)行比比較,若有符符合便轉(zhuǎn)向?qū)?duì)應(yīng)的處理程程序。由于每一個(gè)情情況都有判斷斷和轉(zhuǎn)移,如如對(duì)n個(gè)情況況,需要n個(gè)個(gè)判斷和轉(zhuǎn)移移,因此它的的缺點(diǎn)是程序序比較長(zhǎng)。MCS-51指令系統(tǒng)中中有一條跳轉(zhuǎn)轉(zhuǎn)指JMP@A+DPTR,用它它可以容易地地實(shí)現(xiàn)散轉(zhuǎn)功功能。該指令是把累累加器A的8位無符號(hào)數(shù)數(shù)(作地址的的低8位)與與16位數(shù)據(jù)據(jù)指針的內(nèi)容容相加,其和和送入程序計(jì)計(jì)數(shù)器,作為為轉(zhuǎn)移指令的的地址。執(zhí)行JMP@A+DPTR指令后后,累加器和和16位數(shù)據(jù)據(jù)指針的內(nèi)容容均不受影響響。例4-16用轉(zhuǎn)移指令表表實(shí)現(xiàn)散轉(zhuǎn)根據(jù)某一單元元的值0,1,2,…,,n分別轉(zhuǎn)向向處理程序0,處理程序序1,……處處理程序n。。這時(shí)可以用轉(zhuǎn)轉(zhuǎn)移指令A(yù)JMP(或LJMP)組組成一個(gè)轉(zhuǎn)移移表例4-16::根據(jù)R6的內(nèi)內(nèi)容,轉(zhuǎn)向各各個(gè)處理程序序MOVDPTR,#TAB1MOVA,R6ADDA,R6PAD:JMP@A+DPTRTAB1:AJMPLOP0AJMPLOP1AJMPLOP2本例僅適用于于散轉(zhuǎn)表首地地址TAB1和處理程序序入口地址LOP0,LOP1,………LOPn在同一個(gè)2K范圍的存存儲(chǔ)區(qū)的情況況。如果一個(gè)2K范圍的存儲(chǔ)儲(chǔ)區(qū)內(nèi)放不下下所有的處理理程序時(shí),把把一些較長(zhǎng)的的處理程序放放在其他存儲(chǔ)儲(chǔ)區(qū)域,只要要在該處理程程序的入口地地址內(nèi)用LJMP指令即即可。例4-16用LJMP指指令組成轉(zhuǎn)移移表PJ2:MOVDPTR,,#TAB2CLRCMOVR5,,#0MOVA,R6RLCA;;R6*2JNCAD1INCR5;;有進(jìn)進(jìn)位,,高8位加加1AD1:ADDA,R6;;R6*3JNCAD2INCR5;;有進(jìn)進(jìn)位,,高8位加加1AD2:MOVA,,R5ADDA,DPH;;DPTR高高8位位調(diào)整整MOVA,R6JMP@A+DPTR;;得得散轉(zhuǎn)轉(zhuǎn)地址址TAB2::LJMBLOP0LJMPLOP1……LJMPLOPnEND用AJMP組成成的散散轉(zhuǎn)表表為二二字節(jié)節(jié)一項(xiàng)項(xiàng),而而用LJMP組組成的的散轉(zhuǎn)轉(zhuǎn)表則則為三三字節(jié)節(jié)一項(xiàng)項(xiàng),根根據(jù)R6中中的內(nèi)內(nèi)容或或乘2,或或乘3得每每一處處理程程序的的入口口地址址表指指針。。PJ2:MOVDPTR,,#TAB2CLRCMOVR5,,#0MOVA,R6RLCA;;R6*2JNCAD1INCDPH;;AD1:ADDA,R6;;R6*3JNCAD2INCDPH;;AD2:JMP@A+DPTRTAB2::LJMBLOP0LJMPLOP1……LJMPLOPnEND例4-17用轉(zhuǎn)移移地址址表實(shí)實(shí)現(xiàn)散散轉(zhuǎn)例4-17:根據(jù)R3的的內(nèi)容容轉(zhuǎn)向向?qū)?yīng)應(yīng)處理理程序序。處處理程程序的的入口口分別別是LOP0~~LOP2。PJ3:MOVDPTR,#TAB3MOVA,R3ADDA,R3;;R3*2JNCCADINCDPH;;有進(jìn)進(jìn)位DPTR高高位加加1CAD:MOVR2,,A;;暫存存R2MOVCA,,@A+DPTRXCHA,R2;;處處理程程序入入口地地址高高8位位暫存存R2INCAMOVCA,,@A+DPTRMOVDPL,,A;;處處理程程序入入口地地址低低8位位暫存存DPLMOVDPH,,R2CLRAJMP@A+DPTRTAB3::DWLOP0DWLOP1DWLOP24.5子子程序序和參參數(shù)傳傳遞方方法在程序序中,,會(huì)多多次進(jìn)進(jìn)行一一些相相同的的計(jì)算算和操操作,,一般般把他他們寫寫成子子程序序如數(shù)制制轉(zhuǎn)換換、函函數(shù)式式計(jì)算算等。。一些常常用的的程序序段,,以子子程序序的形形式,,事先先存放放在存存儲(chǔ)器器的某某一區(qū)區(qū)域主程序序在運(yùn)運(yùn)行時(shí)時(shí),需需要用用子程程序時(shí)時(shí),只只要執(zhí)執(zhí)行調(diào)調(diào)用子子程序序的指指令,,使程程序轉(zhuǎn)轉(zhuǎn)至子子程序序。子程序序處理理完畢畢,返返回主主程序序,繼繼續(xù)進(jìn)進(jìn)行以以后的的操作作。調(diào)用子子程序序有幾幾個(gè)優(yōu)優(yōu)點(diǎn)::1、避避免對(duì)對(duì)相同同程序序段的的重復(fù)復(fù)編制制。2、簡(jiǎn)簡(jiǎn)化程程序的的邏輯輯結(jié)構(gòu)構(gòu),同同時(shí)也也便于于子程程序調(diào)調(diào)試。。3、節(jié)節(jié)省存存儲(chǔ)器器空間間。有兩條條調(diào)用用子程程序指指令A(yù)CALL及LCALL,和和一條條返回回主程程序的的指令令RET。。子程序序的調(diào)調(diào)用,,一般般包含含兩個(gè)個(gè)部分分:保保護(hù)現(xiàn)現(xiàn)場(chǎng)和和恢復(fù)復(fù)現(xiàn)場(chǎng)場(chǎng)。參數(shù)的的傳遞遞調(diào)用子子程序序時(shí),,主程程序先先把有有關(guān)的的參數(shù)數(shù)(入入口參參數(shù)))存放放在約約定的的位置置,子程序序在執(zhí)執(zhí)行時(shí)時(shí),從從約定定的位位置取取得參參數(shù),,當(dāng)子程程序執(zhí)執(zhí)行完完,將將得到到的結(jié)結(jié)果((出口口參數(shù)數(shù))存存入約約定的的位置置,返回主主程序序后,,主程程序可可以從從這些些約定定的位位置上上取到到需要要的結(jié)結(jié)果。。1、工工作寄寄存器器或累累加器器傳遞遞參數(shù)數(shù)把入口口參數(shù)數(shù)或出出口參參數(shù)放放工作作寄存存器或或累加加器中中。使用這這種方方法程程序最最簡(jiǎn)單單,運(yùn)運(yùn)算速速度也也最高高。缺點(diǎn)工作寄寄存器器數(shù)量量有限限,不不能傳傳遞太太多的的數(shù)據(jù)據(jù);主程序序必須須先把把數(shù)據(jù)據(jù)送到到工作作寄存存器;;參數(shù)個(gè)個(gè)數(shù)固固定,,不能能由主主程序序任意意改定定。例:請(qǐng)編編出能能把R5單單元內(nèi)內(nèi)兩個(gè)個(gè)BCD數(shù)數(shù)變換換成相相應(yīng)ASCII碼放放在R6((高位位BCD數(shù)數(shù)的ASCII碼))和R7((低位位BCD數(shù)數(shù)的ASCII碼))單元元的程程序。。根據(jù)ASCII字符符表,,0--9的的BCD數(shù)數(shù)和它它們的的ASCII碼碼之間間僅相相差30H。因因此,,僅需需把R5單單元中中兩個(gè)個(gè)BCD數(shù)數(shù)拆開開,分分別和和30H相相加就就行了了,可可以編編出程程序如如下::ASCH::MOVA,R5ANLA,#0F0HORLA,#30HMOVR6,AMOVA,R5ANLA,#0FHORLA,#30HMOVR7,ARET2、用用指針針寄存存器來來傳遞遞參數(shù)數(shù)由于數(shù)數(shù)據(jù)一一般存存放在在存貯貯器中中,而而不是是工作作寄存存器中中,故故可用用指針針來指指示數(shù)數(shù)據(jù)的的位置置,可以節(jié)節(jié)省傳傳遞數(shù)數(shù)據(jù)的的工作作量,,并可可實(shí)現(xiàn)現(xiàn)可變變長(zhǎng)度度運(yùn)算算。一般如如參數(shù)數(shù)在內(nèi)內(nèi)部RAM中,,可用用R0或R1作作指針針??勺冮L(zhǎng)度運(yùn)運(yùn)算時(shí),可可用一個(gè)寄寄存器來指指出數(shù)據(jù)長(zhǎng)長(zhǎng)度,也可可在數(shù)據(jù)中中指出其長(zhǎng)長(zhǎng)度(如使使用結(jié)束標(biāo)標(biāo)記符)。。例:將(R0)和((R1)指指出的內(nèi)部部RAM中中兩個(gè)3字字節(jié)無符號(hào)號(hào)整數(shù)相加加,結(jié)果送送(R0))指出的內(nèi)內(nèi)部RAM中。入口口時(shí),(R0),((R1)分分別指向加加數(shù)和被加加數(shù)的低位位字節(jié),出出口時(shí)(R0)指向向結(jié)果的高高位字節(jié)。。利用MS-51的的帶進(jìn)位加加法指令,,可以直接接編寫出下下面的程序序。NADD::MOVR7,,#3CLRCNADD1:MOVA,,@R0ADDCA,,@R1MOV@R0,ADECR0DECR1DJNZR7,NADD1INCR0INCR0INCR0RET3、用堆棧棧來傳遞參參數(shù)堆??梢杂糜糜趥鬟f參參數(shù)。調(diào)用時(shí),主主程序用PUSH指指令把參數(shù)數(shù)壓入堆棧棧子程序可按按棧指針訪訪問堆棧中中的參數(shù),,同時(shí)可把把結(jié)果參數(shù)數(shù)送回堆棧棧中。返回主程序序后,可用用POP指指令得到這這些結(jié)果參參數(shù)。這種方法的的優(yōu)點(diǎn)是簡(jiǎn)簡(jiǎn)單,能傳傳遞大量參參數(shù),不必必為特定的的參數(shù)分配配存貯單元元。使用這種方方法時(shí),由由于參數(shù)在在堆棧中,,故大大簡(jiǎn)簡(jiǎn)化了中斷斷響應(yīng)時(shí)的的現(xiàn)場(chǎng)保護(hù)護(hù)。例4-19一位十六進(jìn)進(jìn)制數(shù)轉(zhuǎn)換換為ASCII碼子子程序HASC::MOVR0,SPDECR0DECR0;;R0為為參數(shù)指針針XCHA,@R0;;保護(hù)護(hù)ACC,,取出參數(shù)數(shù)ANLA,#0FHADDA,#2;;加加偏移量MOVCA,@A+PCXCHA,@R0;;查表表結(jié)果放回回堆棧中RETDB‘‘0123456789’;;十六進(jìn)進(jìn)制數(shù)的ASCII字符表DB‘‘ABCDEF’例4-21一個(gè)字節(jié)的的兩位十六六進(jìn)制數(shù)為為轉(zhuǎn)換為兩兩個(gè)ASCII碼子子程序ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#60HMOV40H,#7FHPUSH40HMOVA,#78hLCALLHTA2AJMPSTARTHTA2:MOVR0,SPDECR0DECR0PUSHACC;保保護(hù)累加器器內(nèi)容(?????)MOVA,@R0;取出參參數(shù)ANLA,#0FHMOVDPTR,#DATA1MOVCA,@A+DPTRXCHA,@R0;低低位HEX的ASCII碼放放入堆棧中中SWAPAANLA,#0FHMOVCA,@A+DPTRINCR0XCHA,@R0;高位HEX的ASCII碼碼放入堆棧棧中INCR0XCHA,@R0;高位返回回地址放入入堆棧,并并恢復(fù)累加加器內(nèi)容RETDATA1:DB'0123456789'DB'ABCDEF'END例22將內(nèi)部RAM中50H、51H中的內(nèi)內(nèi)容以4位位十六進(jìn)制制數(shù)的ASCII形形式在串行行發(fā)送出去去,可如下下調(diào)用HTA2程序序:ORG0000HSCOT4:PUSH50HACALLHTA2POPACCACALLCOUTPOPACCACALLCOUTPUSH51HACALLHTA2POPACCACALLCOUTPOPACCACALLCOUTCOUT::JNBTI,,COUT;;字符發(fā)送送子程序CLRTIMOVSBUF,ARETEND4、程序段段參數(shù)傳遞遞參數(shù)傳遞方方法,多數(shù)數(shù)是在調(diào)用用子程序前前,把值裝裝入適當(dāng)?shù)牡募拇嫫鱾鱾鬟f參數(shù)。。如果有許多多常數(shù)參數(shù)數(shù),這種技技術(shù)不太有有效,每個(gè)個(gè)參數(shù)需要要一個(gè)寄存存器傳遞,,并且在每每次調(diào)用子子程序時(shí)需需分別用指指令把它們們裝入寄存存器中。如果需要大大量參數(shù),,并且這些些參數(shù)均為為常數(shù)時(shí),,程序段參參數(shù)傳遞方方法(有時(shí)時(shí)也稱為直直接參數(shù)傳傳遞)是傳傳遞常數(shù)的的有效方法法。調(diào)用時(shí),常常數(shù)作為程程序代碼的的一部分,,緊跟在調(diào)調(diào)用子程序序后面。子程序根據(jù)據(jù)棧內(nèi)的返返回地址,,決定從何何處找到這這些常數(shù)然后在需要要時(shí),從程程序存貯器器中讀出這這些參數(shù)。。例22字符串發(fā)送送子程序。。實(shí)際應(yīng)用中中,需要發(fā)發(fā)送各種字字符串。這這些字符串串,通常放放在EPROM(程程序存貯器器)中。按通常方法法,需要先先把這些字字符裝入RAM中,,然后用傳傳遞指針的的方法來實(shí)實(shí)現(xiàn)參數(shù)傳傳遞。為了簡(jiǎn)便,,也可把字字符串放在在EPROM獨(dú)立區(qū)區(qū)域中,然然后用傳遞遞字符串首首地址的方方法來傳遞遞參數(shù)。子程序可按按該地址用用MOVC指令從EPROM中讀出并并發(fā)送該字字符串。最簡(jiǎn)單的方方法是采用用程序段參參數(shù)傳遞方方法。下例中,字字符串全以以0結(jié)束。。SOUT::POPDPH;;棧中指指針POPDPLSOT1::CLRAMOVCA,,@A+DPTRINCDPTRJZSENDJNBTI,,$;;$為本條條指令地址址CLRTIMOVSBUF,ASJMPSOT1SEND::JMP@A+DPTRRET下面從發(fā)送送字符串‘‘MCS-51CONTROLLER’為例例,說明該該子程序使使用方法。。ACALLSOUTDB‘‘MCS-51CONTROLLER’DB0AH,,0DH,,0后面緊接其其他程序。。例22:總總結(jié)上面子程序序有幾個(gè)特特點(diǎn):它不以一般般的返回指指令結(jié)尾,,而是采用用基寄存器加加變址寄存存器間接轉(zhuǎn)轉(zhuǎn)移指令來來返回到參參數(shù)表后的的第一條指指令。一開始的的POP指指令已調(diào)整整了棧指針針的內(nèi)容。。它可適用與與ACALL或LCALL,,因?yàn)檫@兩兩種調(diào)用指指令均把下下一條指令令或數(shù)據(jù)字字節(jié)的地址址壓入棧中中。調(diào)用程程序可位于于MCS-51全部部地址空間間的任何地地方,因?yàn)闉镸OVC指令能訪訪問所有64K字節(jié)節(jié)。傳遞到子程程序的參數(shù)數(shù)可按最方方便的次序序列表,而而不必按使使用的次序序排列。子子程序在每每一條MOVC指指令前累加加器裝入適適當(dāng)?shù)膮?shù)數(shù),這樣基基本上可““隨機(jī)訪問問”參數(shù)表表。子程序只使使用累加器器A和數(shù)據(jù)據(jù)指針DPTR,應(yīng)應(yīng)用程序可可以在調(diào)用用前,把這這些寄存器器壓入堆棧棧中,保護(hù)護(hù)它們的內(nèi)內(nèi)容。4.6查表表程序設(shè)計(jì)計(jì)查表程序是是一種常用用程序,它它廣泛使用用于LED顯示器控控制、打印印機(jī)打印以以及數(shù)據(jù)補(bǔ)補(bǔ)償,計(jì)算算、轉(zhuǎn)換等等功能程序序中,具有有程序簡(jiǎn)單單、執(zhí)行速速度快等優(yōu)優(yōu)點(diǎn)。查表,就是是根據(jù)變量量x在表格格中查找y,使y=f(x))。1、用MOVCA,@A+PC查表表指令編程程例:用查表方法法編寫彩燈燈控制程序序,編程使使彩燈先順順次點(diǎn)亮,,再逆次點(diǎn)點(diǎn)亮,然后后連閃三下下,反復(fù)循循環(huán)。TAB:DB01H,02H,04H,08H,10H,20H,40H,80HDB80H,40H,20H,10H,08H,04H,02H,01HDB00H,0FFH,,00H,,0FFH,00H,0FFH,03HDEL:MOVR7,#0FFHDEL1:MOVR6,#0FFHDEL2:DJNZR6,DEL2DJNZR7,DEL1RETENDORG0000HSTART:MOVR0,,#00HLOOP:CLRAMOVA,,R0ADDA,,#0CHMOVCA,@A+PCCJNEA,#03H,,LOOP1JMPSTARTLOOP1:MOVP1,AACALLDELINCR0JMPLOOP2、用MOVCA,@A+DPTR查表指令令編程例:用查表方法法編寫彩燈
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 呼吸系統(tǒng)慢病管理新進(jìn)展
- 智能安全設(shè)備的人性化設(shè)計(jì)
- 機(jī)械安全事故案例
- 第三章 運(yùn)動(dòng)和力的關(guān)系-教材實(shí)驗(yàn)4 探究加速度與力、質(zhì)量的關(guān)系 2025年高考物理基礎(chǔ)專項(xiàng)復(fù)習(xí)
- 3.3.2鹽類水解的影響因素及常數(shù) 課件高二上學(xué)期化學(xué)人教版(2019)選擇性必修1
- 智慧園區(qū)產(chǎn)品方案
- 《Excel數(shù)據(jù)獲取與處理實(shí)戰(zhàn)》 課件 陳青 第1、2章 Excel 2016概述、外部數(shù)據(jù)的獲取
- 輿情應(yīng)急演練桌面推演
- 保暖小幫手教案及反思
- 好餓的毛毛蟲說課稿
- 湖北省武漢市漢陽區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期中語文卷
- 2024年廣東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 浙江省杭州市2025屆高三上學(xué)期一模英語試題 含答案
- 2025屆高三化學(xué)一輪復(fù)習(xí) 原電池 化學(xué)電源(第一課時(shí))課件
- 黑龍江省 哈爾濱市第四十七中學(xué)校2024-2025學(xué)年七年級(jí)上學(xué)期期中考試語文試題
- 泵站機(jī)組預(yù)調(diào)試運(yùn)行方案
- 初中英語閱讀教學(xué)中滲透德育的路徑例析
- 2024年軟裝公司合同模板
- 2024-2030年智慧環(huán)保行業(yè)市場(chǎng)發(fā)展分析及競(jìng)爭(zhēng)形勢(shì)與投資發(fā)展前景研究報(bào)告
- 部編版語文四年級(jí)上冊(cè)習(xí)作《記一次游戲》精美課件
- 期中(1-4單元)(試題)-2024-2025學(xué)年六年級(jí)數(shù)學(xué)上冊(cè)西師大版
評(píng)論
0/150
提交評(píng)論