第四章程序設(shè)計_第1頁
第四章程序設(shè)計_第2頁
第四章程序設(shè)計_第3頁
第四章程序設(shè)計_第4頁
第四章程序設(shè)計_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第四章:MCS-51程序設(shè)計計算機(jī)與通信工程學(xué)院李耀明一、匯編語言概述1、指令系統(tǒng)語句格式[<標(biāo)號>]:<操作碼>[<操作數(shù)>];[<注釋>]指令編碼長短:單字節(jié),雙字節(jié),三字節(jié)執(zhí)行周期:一個機(jī)器周期占12個振蕩周期,單周期指令,雙周期,4周期尋址方式:指令中所規(guī)定的尋找操作地址的方式立即、直接、寄存器、寄存器間接尋址、基址加變址、相對尋址、位尋址指令分類:數(shù)據(jù)傳送、算術(shù)、邏輯、位操作、控制轉(zhuǎn)移2、程序設(shè)計的步驟(1)分析問題,編制說明要解決問題的程序框圖。(2)確定數(shù)據(jù)結(jié)構(gòu)、算法、工作單元、變量設(shè)定(與高級語言不同)(3)根據(jù)所用的指令系統(tǒng),按照已編制的程序框圖用匯編語言編制出源程序。(4)將編制出的程序在計算機(jī)上調(diào)試,直至實現(xiàn)預(yù)定的功能。二、程序設(shè)計分類1、順序程序:執(zhí)行時按順序一條條地執(zhí)行指令2、分支程序:當(dāng)程序不再順序執(zhí)行,而向一個方向或多個方向轉(zhuǎn)移時,叫分支程序。3、循環(huán)程序:對于需要反復(fù)的程序段,常采用循環(huán)辦法,以縮短程序。4、子程序及其調(diào)用程序主程序使用子程序時,用調(diào)用指令(ACALL),子程序最后放一條RET指令。三、程序設(shè)計準(zhǔn)則結(jié)構(gòu)清晰:便于分析層次分明:便于閱讀語言簡潔:便于分析易于理解:便于閱讀4.1簡單程序設(shè)計簡單程序又稱順序程序。計算機(jī)是按指令在存儲器中存放的先后次序來順序執(zhí)行程序的。除非用特殊指令讓它跳轉(zhuǎn),不然它會在PC控制下執(zhí)行。例4-1兩個8位無符號數(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將兩個半字節(jié)數(shù)合并成一個單字節(jié)數(shù)程序ORG0000HAJMPstartORG0030HSTART:MOVsp,#60HMOV40h,#01hMOV41h,#02hloop:MOVR1,#40HMOVA,@R1ANLA,#0FH;取第一個半字節(jié)SWAPAINCR1XCHA,@R1;取第二字節(jié)ANLA,#0FH;取第二個半字節(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è)計在處理實際事務(wù)中,只用簡單程序設(shè)計的方法是不夠的。因為大部分程序總包含有判斷、比較等情況。根據(jù)判斷、比較的結(jié)果轉(zhuǎn)向不同的分支例4-3:兩個無符號數(shù)比較大小設(shè)兩個連續(xù)外部RAM單元ST1和ST2中存放不帶符號的二進(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;取第二個數(shù)SUBBA,R2;兩數(shù)比較JNCBIG1XCHA,R2;第一數(shù)大BIG0:INCDPTRMOVX@DPTR,A;存大數(shù)SJMP$BIG1:MOVXA,@DPTR;第二數(shù)大SJMPBIG0END開始設(shè)置指針DPTR初始值取第一個數(shù)存入R2取第二個數(shù)后者減前者進(jìn)位標(biāo)志是否為0?存后者結(jié)束存前者YN圖5-3例4流程例4-4:編制計算符號函數(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è)計計簡單程序,每每條指令只執(zhí)執(zhí)行一次分支程序則根根據(jù)條件的不不同,會跳過過一些指令,,執(zhí)行另一些些指令。它們的特點是是,每一條指指令至多執(zhí)行行一次。在處理實際事事務(wù)時,有時時會遇到多次次重復(fù)處理的的問題,用循循環(huán)程序的方方法來解決就就比較合適。。循環(huán)程序中中的某些指令令可以反復(fù)執(zhí)執(zhí)行多次。采用循環(huán)程序序,使程序縮縮短,節(jié)省存存儲單元。重重復(fù)次數(shù)越多多,循環(huán)程序序的優(yōu)越性就就越明顯。程序的執(zhí)行時時間并不節(jié)省省。由于要有有循環(huán)準(zhǔn)備、、結(jié)束判斷等等指令,速度度要比簡單程程序稍慢些。。循環(huán)程序組成成循環(huán)程序一般般由五部分組組成:1、初始化部部分:為循環(huán)程序做做準(zhǔn)備。如:設(shè)置循環(huán)環(huán)次數(shù)計數(shù)器器的初值,地地址指針置初初值,為循環(huán)環(huán)變量賦初值值等。2、處理部分分:為反復(fù)執(zhí)行的的程序段,是是循環(huán)程序的的實體。3、修改部分分:每執(zhí)行一次循循環(huán)體后,對對指針作一次次修改,使指指針指向下一一數(shù)據(jù)所在位位置,為進(jìn)入入下一輪處理理作準(zhǔn)備。4、控制部部分:根據(jù)循環(huán)次次數(shù)計數(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í)行與否,,有時可以以不進(jìn)入循循環(huán)體就退退出循環(huán)程程序。主要語句尋址方式寄存器間接接尋址MOVA,@RiMOVXA,@DPTRMOVXA,@Ri基址寄存器器+變址寄寄存器間接接尋址MOVCA,@A+DPTRMOVCA,@A+PC循環(huán)計數(shù)DJNZRn,relDJNEA,direct,relJZ(JNZ,JC,JNC,JB,JNB)rel例4-5工作單元清清零將40H為為起點的8個單元清清“0”O(jiān)RG0000HCLEAR:CLRA;;A清0MOVR0,#40H;;確確定清0單單元起始地地址MOVR7,#08;;確確定要清除除的單元個個數(shù)LOOP::MOV@R0,A;;清單單元INCR0;;指向下下一個單元元DJNZR7,,LOOP;控制制循環(huán)END例4-5工作單元清清零例如:設(shè)有有50個外外部RAM單元要清清“0”,,即為循環(huán)環(huán)次數(shù)存放放在R2寄寄存器中,,其首址存存放在DPTR中,,設(shè)為2000HORG0000HMOVDPTR,#2000HCLEAR:CLRAMOVR2,#32H;;置置計數(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多個單字節(jié)節(jié)數(shù)據(jù)求和和已知有n個個單字節(jié)數(shù)數(shù)據(jù),依次次存放在內(nèi)內(nèi)部RAM40H單元開始始的連續(xù)單單元中。要要求把計算算結(jié)果存入入R2,R3中(高高位存R2,低位存存R3)。。程序如下::ORG8000HSAD:MOVR0,,#40H;;設(shè)數(shù)據(jù)據(jù)指針MOVR5,#NUM;;計計數(shù)值0AH→R5SAD1::MOVR2,,#0;;和和的高8位位清零MOVR3,#0;;和的的低8位清清零LOOP::MOVA,R3;;取加加數(shù)ADDA,@R0MOVR3,A;;存和的的低8位JNCLOP1;;無無進(jìn)位,直直接計算高高8位INCR2;;有有進(jìn)位,,和的高8位+1LOP1::INCR0;;指向下下一數(shù)據(jù)地地址DJNZR5,,LOOPRETNUMEQU0AHEND上述程序中中,用R0作間址寄寄存器,每每作一次加加法,R0加1,數(shù)數(shù)據(jù)指針指指向下一數(shù)數(shù)據(jù)地址,,R5為循循環(huán)次數(shù)計計數(shù)器,控控制循環(huán)的的次數(shù)。例4-7測試字符串串長度設(shè)有一串字字符依次存存放在從50H單元元開始的連連續(xù)單元中中,該字符符串以回車車符(0DH)為結(jié)結(jié)束標(biāo)志,,測得的字字符串長度度存入R2中。測字符串長長度程序是是將該字符符串中的每每一個字符符依次與回回車符相比比,若比較較不相等,,則統(tǒng)計字字符串長度度的計數(shù)器器加1。繼繼續(xù)比較,,若比較相相等,則表表示該字符符串結(jié)束,,計數(shù)器中中的值就是是字符串的的長度。程序如下::ORG0000HCONT::MOVR2,,#00H;;初始長長度設(shè)置MOVR0,#50H;;數(shù)據(jù)指針針R0置初初值NEXT::CJNE@R0,#0DH,,LOOP1RETLOOP1:INCR0INCR2SJMPNEXTEND待測字符以以ASCII碼形式式存放在RAM中,,回車符的的ASCII碼為0DH,程程序中用一一條CJNE@R0,#0DH,LOOP指指令實現(xiàn)字字符比較及及控制循環(huán)環(huán)的任務(wù),,當(dāng)循環(huán)結(jié)結(jié)束時,R2的內(nèi)容容為字符串串長度例4-910秒延延時程序延時程序與與MCS-51執(zhí)行行指令的時時間有關(guān),,如果使用用6MHz晶振,一一個機(jī)器周周期為2μμs,計算算出執(zhí)行一一條指令以以至一個循循環(huán)所需要要的時間,,給出相應(yīng)應(yīng)的循環(huán)次次數(shù),便能能達(dá)到延時時的目的。。程序如下::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上例延時程程序?qū)嶋H延延時為10.000406秒秒。它是一一個三重循循環(huán)程序,,利用程序序嵌套的方方法對時間間實行延遲遲是程序設(shè)設(shè)計中常用用的方法。。使用多重重循環(huá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é)束時時由里往外外一層層退退出。(3)內(nèi)循循環(huán)體可以以直接轉(zhuǎn)入入外循環(huán)體體,實現(xiàn)一一個循環(huán)由由多個條件件控制的循循環(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無無符號數(shù)雙雙字節(jié)乘法R2R3×R6R7--------------------------------R3×R7R2×R7R3×R6R2×R6-------------------------------------R4R5R6R7例4-13無無符號數(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è)計散轉(zhuǎn)程序是分分支程序的一一種。它由輸入條件件或運算結(jié)果果來確定轉(zhuǎn)入入各自的處理理程序。有多種方法能能實現(xiàn)散轉(zhuǎn)程程序,但通常常用逐次比較較法,即把所所有各個情況況逐一進(jìn)行比比較,若有符符合便轉(zhuǎn)向?qū)?yīng)的處理程程序。由于每一個情情況都有判斷斷和轉(zhuǎn)移,如如對n個情況況,需要n個個判斷和轉(zhuǎn)移移,因此它的的缺點是程序序比較長。MCS-51指令系統(tǒng)中中有一條跳轉(zhuǎn)轉(zhuǎn)指JMP@A+DPTR,用它它可以容易地地實現(xiàn)散轉(zhuǎn)功功能。該指令是把累累加器A的8位無符號數(shù)數(shù)(作地址的的低8位)與與16位數(shù)據(jù)據(jù)指針的內(nèi)容容相加,其和和送入程序計計數(shù)器,作為為轉(zhuǎn)移指令的的地址。執(zhí)行JMP@A+DPTR指令后后,累加器和和16位數(shù)據(jù)據(jù)指針的內(nèi)容容均不受影響響。例4-16用轉(zhuǎn)移指令表表實現(xiàn)散轉(zhuǎn)根據(jù)某一單元元的值0,1,2,…,,n分別轉(zhuǎn)向向處理程序0,處理程序序1,……處處理程序n。。這時可以用轉(zhuǎn)轉(zhuǎn)移指令A(yù)JMP(或LJMP)組組成一個轉(zhuǎn)移移表例4-16::根據(jù)R6的內(nèi)內(nèi)容,轉(zhuǎn)向各各個處理程序序MOVDPTR,#TAB1MOVA,R6ADDA,R6PAD:JMP@A+DPTRTAB1:AJMPLOP0AJMPLOP1AJMPLOP2本例僅適用于于散轉(zhuǎn)表首地地址TAB1和處理程序序入口地址LOP0,LOP1,………LOPn在同一個2K范圍的存存儲區(qū)的情況況。如果一個2K范圍的存儲儲區(qū)內(nèi)放不下下所有的處理理程序時,把把一些較長的的處理程序放放在其他存儲儲區(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é)一項項,而而用LJMP組組成的的散轉(zhuǎn)轉(zhuǎn)表則則為三三字節(jié)節(jié)一項項,根根據(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)移移地址址表實實現(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ù)傳傳遞方方法在程序序中,,會多多次進(jìn)進(jìn)行一一些相相同的的計算算和操操作,,一般般把他他們寫寫成子子程序序如數(shù)制制轉(zhuǎn)換換、函函數(shù)式式計算算等。。一些常常用的的程序序段,,以子子程序序的形形式,,事先先存放放在存存儲器器的某某一區(qū)區(qū)域主程序序在運運行時時,需需要用用子程程序時時,只只要執(zhí)執(zhí)行調(diào)調(diào)用子子程序序的指指令,,使程程序轉(zhuǎn)轉(zhuǎn)至子子程序序。子程序序處理理完畢畢,返返回主主程序序,繼繼續(xù)進(jìn)進(jìn)行以以后的的操作作。調(diào)用子子程序序有幾幾個優(yōu)優(yōu)點::1、避避免對對相同同程序序段的的重復(fù)復(fù)編制制。2、簡簡化程程序的的邏輯輯結(jié)構(gòu)構(gòu),同同時也也便于于子程程序調(diào)調(diào)試。。3、節(jié)節(jié)省存存儲器器空間間。有兩條條調(diào)用用子程程序指指令A(yù)CALL及LCALL,和和一條條返回回主程程序的的指令令RET。。子程序序的調(diào)調(diào)用,,一般般包含含兩個個部分分:保保護(hù)現(xiàn)現(xiàn)場和和恢復(fù)復(fù)現(xiàn)場場。參數(shù)的的傳遞遞調(diào)用子子程序序時,,主程程序先先把有有關(guān)的的參數(shù)數(shù)(入入口參參數(shù)))存放放在約約定的的位置置,子程序序在執(zhí)執(zhí)行時時,從從約定定的位位置取取得參參數(shù),,當(dāng)子程程序執(zhí)執(zhí)行完完,將將得到到的結(jié)結(jié)果((出口口參數(shù)數(shù))存存入約約定的的位置置,返回主主程序序后,,主程程序可可以從從這些些約定定的位位置上上取到到需要要的結(jié)結(jié)果。。1、工工作寄寄存器器或累累加器器傳遞遞參數(shù)數(shù)把入口口參數(shù)數(shù)或出出口參參數(shù)放放工作作寄存存器或或累加加器中中。使用這這種方方法程程序最最簡單單,運運算速速度也也最高高。缺點工作寄寄存器器數(shù)量量有限限,不不能傳傳遞太太多的的數(shù)據(jù)據(jù);主程序序必須須先把把數(shù)據(jù)據(jù)送到到工作作寄存存器;;參數(shù)個個數(shù)固固定,,不能能由主主程序序任意意改定定。例:請編編出能能把R5單單元內(nèi)內(nèi)兩個個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單單元中中兩個個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ù)的的工作作量,,并可可實現(xiàn)現(xiàn)可變變長度度運算算。一般如如參數(shù)數(shù)在內(nèi)內(nèi)部RAM中,,可用用R0或R1作作指針針??勺冮L度運運算時,可可用一個寄寄存器來指指出數(shù)據(jù)長長度,也可可在數(shù)據(jù)中中指出其長長度(如使使用結(jié)束標(biāo)標(biāo)記符)。。例:將(R0)和((R1)指指出的內(nèi)部部RAM中中兩個3字字節(jié)無符號號整數(shù)相加加,結(jié)果送送(R0))指出的內(nèi)內(nèi)部RAM中。入口口時,(R0),((R1)分分別指向加加數(shù)和被加加數(shù)的低位位字節(jié),出出口時(R0)指向向結(jié)果的高高位字節(jié)。。利用MS-51的的帶進(jìn)位加加法指令,,可以直接接編寫出下下面的程序序。NADD::MOVR7,,#3CLRCNADD1:MOVA,,@R0ADDCA,,@R1MOV@R0,ADECR0DECR1DJNZR7,NADD1INCR0INCR0INCR0RET3、用堆棧棧來傳遞參參數(shù)堆??梢杂糜糜趥鬟f參參數(shù)。調(diào)用時,主主程序用PUSH指指令把參數(shù)數(shù)壓入堆棧棧子程序可按按棧指針訪訪問堆棧中中的參數(shù),,同時可把把結(jié)果參數(shù)數(shù)送回堆棧棧中。返回主程序序后,可用用POP指指令得到這這些結(jié)果參參數(shù)。這種方法的的優(yōu)點是簡簡單,能傳傳遞大量參參數(shù),不必必為特定的的參數(shù)分配配存貯單元元。使用這種方方法時,由由于參數(shù)在在堆棧中,,故大大簡簡化了中斷斷響應(yīng)時的的現(xiàn)場保護(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一個字節(jié)的的兩位十六六進(jìn)制數(shù)為為轉(zhuǎn)換為兩兩個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ù)不太有有效,每個個參數(shù)需要要一個寄存存器傳遞,,并且在每每次調(diào)用子子程序時需需分別用指指令把它們們裝入寄存存器中。如果需要大大量參數(shù),,并且這些些參數(shù)均為為常數(shù)時,,程序段參參數(shù)傳遞方方法(有時時也稱為直直接參數(shù)傳傳遞)是傳傳遞常數(shù)的的有效方法法。調(diào)用時,常常數(shù)作為程程序代碼的的一部分,,緊跟在調(diào)調(diào)用子程序序后面。子程序根據(jù)據(jù)棧內(nèi)的返返回地址,,決定從何何處找到這這些常數(shù)然后在需要要時,從程程序存貯器器中讀出這這些參數(shù)。。例22字符串發(fā)送送子程序。。實際應(yīng)用中中,需要發(fā)發(fā)送各種字字符串。這這些字符串串,通常放放在EPROM(程程序存貯器器)中。按通常方法法,需要先先把這些字字符裝入RAM中,,然后用傳傳遞指針的的方法來實實現(xiàn)參數(shù)傳傳遞。為了簡便,,也可把字字符串放在在EPROM獨立區(qū)區(qū)域中,然然后用傳遞遞字符串首首地址的方方法來傳遞遞參數(shù)。子程序可按按該地址用用MOVC指令從EPROM中讀出并并發(fā)送該字字符串。最簡單的方方法是采用用程序段參參數(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é)上面子程序序有幾個特特點:它不以一般般的返回指指令結(jié)尾,,而是采用用基寄存器加加變址寄存存器間接轉(zhuǎn)轉(zhuǎn)移指令來來返回到參參數(shù)表后的的第一條指指令。一開始的的POP指指令已調(diào)整整了棧指針針的內(nèi)容。。它可適用與與ACALL或LCALL,,因為這兩兩種調(diào)用指指令均把下下一條指令令或數(shù)據(jù)字字節(jié)的地址址壓入棧中中。調(diào)用程程序可位于于MCS-51全部部地址空間間的任何地地方,因為為MOVC指令能訪訪問所有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è)計計查表程序是是一種常用用程序,它它廣泛使用用于LED顯示器控控制、打印印機(jī)打印以以及數(shù)據(jù)補(bǔ)補(bǔ)償,計算算、轉(zhuǎn)換等等功能程序序中,具有有程序簡單單、執(zhí)行速速度快等優(yōu)優(yōu)點。查表,就是是根據(jù)變量量x在表格格中查找y,使y=f(x))。1、用MOVCA,@A+PC查表表指令編程程例:用查表方法法編寫彩燈燈控制程序序,編程使使彩燈先順順次點亮,,再逆次點點亮,然后后連閃三下下,反復(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等.壓縮文件請下載最新的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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論