版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章MCS-51單片機(jī)匯編語音程序設(shè)計(jì)第一頁,共59頁。內(nèi)容提要★概述★偽指令★匯編語言程序設(shè)計(jì)步驟★順序程序設(shè)計(jì)★分支程序設(shè)計(jì)★循環(huán)程序設(shè)計(jì)★位操作程序設(shè)計(jì)★子程序★小結(jié)第二頁,共59頁。3.1概述 MCS-51單片機(jī)的編程語言可以是匯編語言也可以是高級語言(如C語言),高級語言編程快捷,但程序長,占用存儲(chǔ)空間大,執(zhí)行慢;匯編語言產(chǎn)生的目標(biāo)程序簡短,占用存儲(chǔ)空間小,執(zhí)行快,能充分發(fā)揮計(jì)算機(jī)的硬件功能。無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標(biāo)程序(機(jī)器語言)單片機(jī)才能執(zhí)行。
第三頁,共59頁。連接/定位器L51匯編語言源程序匯編器A51符號(hào)轉(zhuǎn)換程序OHS51絕對地址目標(biāo)程序.BINC語言程序浮動(dòng)地址目標(biāo)程序編譯器C51
·HEX圖3-1兩種語言源程序轉(zhuǎn)換成目標(biāo)程序第四頁,共59頁。
目前很多公司將編輯器、匯編器、編譯器、連接/定位器、符號(hào)轉(zhuǎn)換程序做成集成軟件包,用戶進(jìn)入該集成環(huán)境,編輯好程序后,只需點(diǎn)擊相應(yīng)菜單就可以完成上述的各步,如WAVE、KEIL,WAVE集成軟件的使用見附錄。
匯編:將匯編語言源程序轉(zhuǎn)換成機(jī)器語言目標(biāo)程序的過程稱為匯編。
匯編程序:能將匯編語言源程序轉(zhuǎn)換成機(jī)器語言目標(biāo)程序的系統(tǒng)軟件稱為匯編程序。第五頁,共59頁。匯編的方法:匯編的方法有兩種1.手工匯編:人工查指令表,查出程序中每條指令對應(yīng)的機(jī)器代碼。早期的計(jì)算機(jī)使用。2.機(jī)器匯編:用計(jì)算機(jī)中的匯編程序?qū)τ脩粼闯绦蜻M(jìn)行匯編。用機(jī)器匯編要提供給匯編一些信息,遵循匯編程序的一些約定。這些由偽指令指定。第六頁,共59頁。1.機(jī)器指令:指令系統(tǒng)中的全部指令。每條機(jī)器指令都有對應(yīng)的機(jī)器代碼,可以被CPU執(zhí)行。2.偽指令:匯編控制指令,沒有指令代碼,只用于匯編過程,為匯編程序提供匯編信息。一、匯編語言指令類型3.2偽指令第七頁,共59頁。二.偽指令常用偽指令及功能:1.起始指令ORGnn功能:定義程序或數(shù)據(jù)塊的起始地址。指示此語句后面的程序或數(shù)據(jù)塊以nn為起始地址,連續(xù)存放在程序存儲(chǔ)器中。
指令地址機(jī)器碼 標(biāo)號(hào)字段 源程序 ORG 2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0 … ORG3000H3000H23 TAB:DB23H,100,‘A’3001H643002H41第八頁,共59頁。2.字節(jié)定義標(biāo)號(hào):DB(字節(jié)常數(shù),或字符或表達(dá)式)功能:指示在程序存儲(chǔ)器中以標(biāo)號(hào)為起始地址的單元里存放的數(shù)為字節(jié)數(shù)據(jù)(八位二進(jìn)制數(shù))。例如LN:DB32,’C’,25H,-1;LN~LN+2地址單元依次存放20H,43H,25H,F(xiàn)FH地址
數(shù)據(jù)LN20LN+143LN+225LN+3FF3.字定義標(biāo)號(hào):DW(字常數(shù)或表達(dá)式)作用:指示在程序存儲(chǔ)器中以標(biāo)號(hào)為起始地址的單元里存放的數(shù)為字?jǐn)?shù)據(jù)(即16位的二進(jìn)制數(shù)),例如:GH:DW1234H,5678H,08GH1234GH+25678GH+40008第九頁,共59頁。5.等值指令標(biāo)號(hào)EQU(數(shù)值表達(dá)式)
表示EQU兩邊的量等值,用于為標(biāo)號(hào)或標(biāo)識(shí)符賦值。
例如:X1 EQU2000H
X2 EQU0FH
…
MAIN:MOVDPTR,#X1;DPTR=2000H ADDA,#X2;A=A+0FH4.保留字節(jié)標(biāo)號(hào):DS(數(shù)值表達(dá)式)作用:
指示在程序存儲(chǔ)器中保留以標(biāo)號(hào)為起始地址的若干字節(jié)單元,其單元個(gè)數(shù)由數(shù)值表達(dá)式指定。例如L1:DS32;從L1地址開始保留32個(gè)存儲(chǔ)單元。第十頁,共59頁。6.位定義
標(biāo)號(hào)BIT[位地址]作用:
同EQU指令,不過定義的是位操作地址。例如AICBITP1.1。7.匯編結(jié)束END作用:
指示源程序段結(jié)束。
END指令放在程序的最后。A51匯編程序還有一些其它的偽指令,列在教材表3-1中,以備查閱。第十一頁,共59頁。匯編語言程序設(shè)計(jì)步驟一.確定方案和計(jì)算方法二.了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo)三.建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟四.合理分配存儲(chǔ)器單元和了解I/O接口地址五.編制源程序1.按功能設(shè)計(jì)程序,明確各程序之間的相互關(guān)系2.用流程圖表示程序結(jié)構(gòu)和功能開始1YN?3.程序中用注釋說明指令在程序中的作用,方便閱讀、調(diào)試和修改第十二頁,共59頁。例3-1編程將外部數(shù)據(jù)存儲(chǔ)器的000EH和000FH單元的內(nèi)容相換。分析:外部數(shù)據(jù)存儲(chǔ)器的數(shù)據(jù)操作只能用MOVX指令,且只能和A之間傳送,因此必須用一個(gè)中間環(huán)節(jié)作暫存,設(shè)用20H單元。用R0、R1指示兩單元的低八位地址,高八位地址由P2指示。編程過程如下:
3.3順序程序設(shè)計(jì)順序程序(簡單程序),程序走向只有一條路徑第十三頁,共59頁。
ORG0000HMOVP2,#0H;送地址高八位至P2口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,AMOVA,20HMOVX@R0,A;交換后的數(shù)送各單元SJMP$END第十四頁,共59頁。例3-2:將R4R5雙字節(jié)符號(hào)數(shù)求補(bǔ)程序。 ORG0000HMOVA,R5;取低字節(jié) CPLA ADDA,#1;低字節(jié)變補(bǔ) MOVR5,A MOVA,R4;取高字節(jié) CPLA ADDCA,#0;高字節(jié)變補(bǔ) ORLA,#80H;恢復(fù)負(fù)號(hào)MOVR4,AEND第十五頁,共59頁。例3-3分解壓縮式BCD碼,使其成為非壓縮式BCD碼。ORG0000HMOV R0,#40H ;設(shè)指針MOV A,@R0 ;取一個(gè)字節(jié)MOV R2,A ;暫存ANL A,#0FH ;清0高半字節(jié)INC R0MOV @R0,A ;保存數(shù)據(jù)個(gè)位片內(nèi)RAM42H41H40H65MOV A,R2SWAPA ;十位換到低半字節(jié)ANL A,#0FHINC R0MOV @R0,A ;保存數(shù)據(jù)十位END0506第十六頁,共59頁。例3-4設(shè)內(nèi)部RAM的ONE地址單元存放著一個(gè)八位無符號(hào)二進(jìn)制數(shù),要求將其轉(zhuǎn)化為壓縮的BCD碼,將百位放在HUND地址單元,十位和個(gè)位放在TEN地址單元。ORG0000HMOVA,ONEMOVB,#64HDIVABMOVHUND,AMOVA,#0AHXCHA,BDIVABSWAPAADDA,BMOVTEN,ASJMP$分析:8位無符號(hào)二進(jìn)制數(shù)范圍在0~255之間,將此數(shù)除以100,商即為百位,將其余數(shù)除以10得十位,余數(shù)即為個(gè)位。
ONEEQU20HHUNDEQU22HTENEQU23H第十七頁,共59頁。例3-5
在內(nèi)部RAM的40H和41H地址單元中,有2個(gè)無符號(hào)數(shù),試編程,比較這兩個(gè)數(shù)的大小,將大數(shù)存于內(nèi)部RAM的GR單元,小數(shù)存于LE單元。如果兩數(shù)相等,則分別送入GR和LE地址單元。3.4分支程序的設(shè)計(jì)
由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成分支結(jié)構(gòu)分析:采用CJNE指令,即可以判斷兩數(shù)相等與否,還可以通過C標(biāo)志判斷大小,程序如下:第十八頁,共59頁。 GR EQU 30H LE EQU 31H ORG 0000H MOV A,40H CJNE A,41H,NEQ MOV GR,A MOV LE,A SJMP $NEQ: JC LESS MOV GR,A MOV LE,41H SJMP $LESS: MOV LE,A MOV GR,41H SJMP $ END第十九頁,共59頁。例2用單片機(jī)加重力傳感器作磅秤,秤出重量后算出行李運(yùn)費(fèi)價(jià)格,其秤出的重量以10kg為1個(gè)計(jì)價(jià)單位G,G已存入40H單元。計(jì)價(jià)方法為50kg以內(nèi)按3元,50kg以
上分段計(jì)價(jià):50kg按3元計(jì)價(jià)
,超過部分按2元計(jì)價(jià)。
由此列出算式:
5×3+(G-5)×2;當(dāng)G>5M=G×3;當(dāng)G≤53G因重復(fù)使用,先暫存在R2。流程見左,程序如下:第二十頁,共59頁。ORG0100HFRT:MOVA,40H ;取行李重量計(jì)價(jià)單位G MOVR3,A MOVB,#03H ;運(yùn)費(fèi)M=G×3 MULAB MOVR2,A ;暫存3G MOVA,R3 ;取回G CJNEA,#05H,L1 ;G≤5? SJMPWETC L1:JC WETC ;是,轉(zhuǎn)至WETC SUBBA,#05H ;否則M=15+2(G-5) RLCA ADDA,#15 MOVR2,AWETC:MOV41H,R2 ;存運(yùn)費(fèi)M RET第二十一頁,共59頁。多分支散轉(zhuǎn)程序的設(shè)計(jì)
有一類分支程序,它根據(jù)不同的輸入條件或不同的運(yùn)算結(jié)果,轉(zhuǎn)向不同的處理程序,稱之為散轉(zhuǎn)程序。這類程序通常利用JMP@A+DPTR間接轉(zhuǎn)移指令實(shí)現(xiàn)轉(zhuǎn)移。有如下兩種設(shè)計(jì)方法:
1.查轉(zhuǎn)移地址表:將轉(zhuǎn)移地址列成表格,將表格的內(nèi)容作轉(zhuǎn)移的目標(biāo)地址。2.查轉(zhuǎn)移指令表:將轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令列成表格,判斷條件后查表,轉(zhuǎn)到表中指令執(zhí)行,下面用兩個(gè)例子說明。第二十二頁,共59頁。1.利用轉(zhuǎn)移地址表實(shí)現(xiàn)轉(zhuǎn)移例3-7根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)的程序,R3的內(nèi)容為0~n,處理程序的入口符號(hào)地址分別為PR0~PRn(n<128)。分析:將PR0—PRn入口地址列在表格中,每一項(xiàng)占兩個(gè)單元,PRn在表中的偏移量為2n,因此將R3的內(nèi)容乘2即得PRn在表中的偏移地址,從偏移地址2n和2n+1兩個(gè)單元分別取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即轉(zhuǎn)移到PRn入口執(zhí)行。第二十三頁,共59頁。ORG0000HMOVA,R3;R3→AADDA,ACC;A*2MOVDPTR,#TABPUSHACCMOVCA,@A+DPTR;取地址表中高字節(jié)MOVB,A;暫存于BINCDPLPOPACCMOVCA,@A+DPTR;取地址表中低字節(jié)MOVDPL,AMOVDPH,B;DPTR為表中地址CLRA;A=0JMP@A+DPTR;轉(zhuǎn)移TAB:DWPR0,PR1,PR2,…..,PRn;轉(zhuǎn)移地址表END01100220..TABTAB+2DPHDPL例如R3=1的操作0220第二十四頁,共59頁。2.利用轉(zhuǎn)移指令表實(shí)現(xiàn)轉(zhuǎn)移
例3-8設(shè)有五個(gè)按鍵0、1、2、3、4其編碼分別為3AH、47H、65H、70H、8BH,要求根據(jù)按下的鍵轉(zhuǎn)向不同的處理程序,分別為PR0、PR1、PR2、PR3、PR4,設(shè)按鍵的編碼已在B寄存器中,編出程序。分析:將鍵碼排成表,將鍵碼表中的值和B中的鍵編碼比對,記下在鍵碼表中和B中的鍵編碼相等的序號(hào),另安排一個(gè)轉(zhuǎn)移表,安排AJMP指令(機(jī)器碼),因每條AJMP指令占二字節(jié),將剛才記下的序號(hào)乘2即為轉(zhuǎn)移表的偏移地址,利用JMP@A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實(shí)現(xiàn)多分支轉(zhuǎn)移。設(shè)JPT的地址為001AH、PR0入口地址為0110H、PR1入口地址為0220H,參考2.4.2節(jié),求AJMPPR0的機(jī)器碼0000000100010000
00100001
00010000(2110h)a10a9a8a7a6a5a4a3a2a1a0第二十五頁,共59頁。AJMPPR0的機(jī)器碼為2110H,PR1入口地址為0220HAJMPPR1的機(jī)器碼為4120H,轉(zhuǎn)移指令表JPT的內(nèi)容如下所示。設(shè)B=65H,鍵值為2:2041JPT+42002JPT+21021JPTAJMPPR0AJMPPR1AJMPPR2TAB3AHTAB+147HTAB+265HTAB+370H轉(zhuǎn)移指令表JPT鍵碼表TAB65HA2B2×AA=1A=2A=065H65H第二十六頁,共59頁。ORG0000HMOVDPTR,#TAB;置鍵碼表首址MOVA,#0;表的起始位的偏移量為0NEXT:PUSHACCMOVCA,@A+DPTR;A=鍵碼表的編碼CJNEA,B,AGAN;將B中值和鍵碼表的值比較POPACCRLA;如相等,序號(hào)乘2得分支表內(nèi)偏移量MOVDPTR,#JPT;置分支表首址JMP@A+DPTRAGAN:POPACC;不相等比較下一個(gè)INCA;序號(hào)加1CJNEA,#5,NEXTSJMP$;鍵碼查完還沒有B中按鍵編碼程序結(jié)束JPT:AJMPPR0;分支轉(zhuǎn)移表AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH,47H,65H,70H,8BH;鍵碼表END第二十七頁,共59頁。當(dāng)程序中的某些指令需要反復(fù)執(zhí)行多次時(shí),采用循環(huán)程序的方式,這樣會(huì)使程序縮短,節(jié)省存儲(chǔ)單元(并不節(jié)省執(zhí)行時(shí)間)。循環(huán)次數(shù)的控制,有兩種控制方式:第一種方法先判斷再處理即先判斷滿不滿足循環(huán)條件,如不滿足,就不循環(huán),多以循環(huán)條件控制。第二種方法先處理再判斷,即循環(huán)執(zhí)行一遍后,下一輪還需不需要進(jìn)行,多以計(jì)循環(huán)次數(shù)控制。循環(huán)可以有單重循環(huán)和多重循環(huán),在多重循環(huán)中,內(nèi)外循環(huán)不能交叉,也不允許外循環(huán)跳入內(nèi)循環(huán)。下面通過幾個(gè)實(shí)例說明循環(huán)程序的設(shè)計(jì)方法。3.5循環(huán)程序設(shè)計(jì)第二十八頁,共59頁。例3-9設(shè)計(jì)一個(gè)延時(shí)10ms的延時(shí)子程序,已知單片機(jī)使用的晶振為6MHz。分析:延時(shí)時(shí)間與兩個(gè)因素有關(guān):晶振頻率和循環(huán)次數(shù)。由于晶振采用6MHz,一個(gè)機(jī)器周期是2μs,用單循環(huán)可以實(shí)現(xiàn)1ms延時(shí),外循環(huán)10次即可達(dá)10ms延時(shí)。內(nèi)循環(huán)如何實(shí)現(xiàn)1ms延時(shí)呢,程序中可先以未知數(shù)MT代替,從附錄A查每條指令機(jī)器周期計(jì)算程序的執(zhí)行時(shí)間。
第二十九頁,共59頁。ORG0020HMCMOVR0,#0AH;外循環(huán)10次1DL2:MOVR1,#MT;內(nèi)循環(huán)MT次1DL1:NOP1NOP;空操作指令1DJNZR1,DL12DJNZR0,DL22RET2內(nèi)循環(huán)DL1到指令DJNZR1,DL1的計(jì)算:(1+1+2)×2μS×MT=1000μSMT=125=7DH將7DH代入上面程序的MT,計(jì)算總的延時(shí)時(shí)間:{1+[1+(1+1+2)×125+2]×10+2}×2μS=10064μS=10.064mS若需要延時(shí)更長時(shí)間,可以采用多重循環(huán)。內(nèi)外第三十頁,共59頁。例3-10編寫多字節(jié)數(shù)×10程序。
內(nèi)部RAM以20H為首址的一片單元中存放著一個(gè)多字節(jié)符號(hào)數(shù),字節(jié)數(shù)存放在R7中,存放方式為低位字節(jié)在低地址,高位字節(jié)在高地址,要求乘10后的積仍存放在這一片單元中。
分析用R1作該多字節(jié)的
地址指針,部分積的低位仍
存放于本單元,部分積的高
位存放于R2,以便和下一
位的部分積的低位相加。
以R7作字節(jié)數(shù)計(jì)數(shù)。
編程如下:
345H0AH32H28H2BH1EH20H第三十一頁,共59頁。
ORG0000HMOVR1,#20H;R1指示地址MOVR2,#00H;存積的高八位寄存器R2清0S10:CLRC;清進(jìn)位位CMOVA,@R1;取一字節(jié)送AMOVB,#0AH;10送BMULAB;字節(jié)乘10ADDA,R2;上次積高八位加本次積低八位MOV@R1,A;送原存儲(chǔ)單元CLRAADDCA,B;將低八位的進(jìn)位加入高八位MOVR2,B;積的高八位送R2INCR1;指向下一字節(jié)DJNZR7,S10;未乘完去SH10,否則向下執(zhí)行MOV@R1,B;存最高字節(jié)積的高位SJMP$第三十二頁,共59頁。ORG0000HCLRC;清進(jìn)位位CMOVR1,#20H;R1指示地址MOVR2,#00H;存積的高八位寄存器R2清0S10:MOVA,@R1;取一字節(jié)送AMOVB,#0AH;10送BPUSHPSWMULAB;字節(jié)乘10POPPSWADDCA,R2;上次積高八位加本次積低八位MOV@R1,A;送原存儲(chǔ)單元MOVR2,B;積的高八位送R2INCR1;指向下一字節(jié)DJNZR7,S10;未乘完去SH10,否則向下執(zhí)行MOV@R1,B;存最高字節(jié)積的高位SJMP$第三十三頁,共59頁。例3-12編寫多字節(jié)BCD碼減法程序 ORG 0000HSUBCD: MOV R3,#00H CLR 07H CLR CSUBCD1: MOV A,#9AH SUBB A,@R0 ADD A,@R1 DA A MOV @R0,A INC R0 INC R1 INC R3 CPL C DJNZ R2,SUBCD1 JNC SUBCD2 SETB 07HSUBCD2: SJMP $設(shè)被減數(shù)低字節(jié)地址用R1表示,減數(shù)地址用R0表示,字節(jié)數(shù)用R2表示.差的地址仍用R0表示,差的字節(jié)數(shù)放在R3.用07H位作為結(jié)果的符號(hào)標(biāo)志,”0”為正,”1”為負(fù)。第三十四頁,共59頁。例3-13編寫將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)程序設(shè)十進(jìn)制數(shù)9345以非壓縮BCD碼形式依次存放在內(nèi)部RAM的40H-43H單元中,將其轉(zhuǎn)換為二進(jìn)制數(shù)并存于R2R3中。分析:一個(gè)n位的十進(jìn)制數(shù)Dn-1Dn-2…D0可表示為(((Dn-1×10)+Dn-2)×10+Dn-3)×10+…+D1)×10+D0例如:9345=((9×10+3)×10+4)×10+5R20 9H0AH5AH03H5DH05DH00AH3 A2H03A2H4H×R3+R2R3×++A6H030AH6 7CH1E247CH5HR2R3×++第三十五頁,共59頁。 ORG 0000HDCB: MOV R0,#40H MOV R1,#03H MOV R2,#0 MOV A,@R0 MOV R3,ALOOP: MOV A,R3 MOV B,#10 MUL AB MOV R3,A MOV A,B XCH A,R2 MOV B,#10 MUL AB ADD A,R2 MOV R2,A INC R0 MOV A,R3 ADD A,@R0 MOV R3,A MOV A,R2 ADDC A,#0 MOV R2,A DJNZ R1,LOOP SJMP $ END第三十六頁,共59頁。MCS-51單片機(jī)有著優(yōu)異的位邏輯功能,可以方便的實(shí)現(xiàn)各種復(fù)雜的邏輯運(yùn)算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運(yùn)算時(shí)間。例3-17編寫一程序,以實(shí)現(xiàn)圖3-4中的邏輯運(yùn)算電路.3.6位操作程序設(shè)計(jì)第三十七頁,共59頁。
其中P1.1和P2.2分別是端口線上的信息,TF0和IE1分別是定時(shí)器定時(shí)溢出標(biāo)志和外部中請求標(biāo)志,25H和26H分別是兩個(gè)位地址,運(yùn)算結(jié)果由端口線P1.3輸出。
圖3-4硬件邏輯運(yùn)算電路第三十八頁,共59頁。程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORLC,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$第三十九頁,共59頁。例3-18設(shè)累加器A的各位ACC.0~ACC.7分別記為X0~X7,編制程序用軟件實(shí)現(xiàn)下式:
Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7X0BITACC.0X1BITACC.1X2BITACC.2X3BITACC.3X4BITACC.4X5BITACC.5X6BITACC.6X7BITACC.7MOVC,X2ANLC,01HANLC,X3;X0X1X2X3ORLC,/00HMOV00H,CMOVC,X7ANLC,/X6ANLC,/X5ANLC,/X4;X4X5X6X7ORLC,00H;最終結(jié)果Y→CSJMP$ORG0000HMOVC,X0ANLC,X1ANLC,X2MOV00H,C;X0X1X2MOVC,X0ANLC,/X1MOV01H,C;X0X1ANLC,/X2ORLC,00HMOV00H,C第四十頁,共59頁。子程序是構(gòu)成單片機(jī)應(yīng)用程序必不可少的部分,通過ACALL和LCALL兩條子程序調(diào)用指令,可以十分方便地用來調(diào)用任何地址處的子程序。子程序節(jié)省占用的存儲(chǔ)單元,使程序簡短、清晰,善于靈活的使用子程序,是程序設(shè)計(jì)的重要技巧之一。子程序必須以RET指令結(jié)尾.在調(diào)用子程序時(shí),有以下幾點(diǎn)應(yīng)注意:3.7子程序當(dāng)一段程序需多次應(yīng)用,或?yàn)槎嗳藨?yīng)用時(shí),這段程序編為子程序.第四十一頁,共59頁。1)保護(hù)現(xiàn)場。如果在調(diào)用前主程序已經(jīng)使用了某些存儲(chǔ)單元或寄存器,在調(diào)用時(shí),這些寄存器和存儲(chǔ)單元又有其他用途,就應(yīng)先把這些單元或寄存器中的內(nèi)容壓入堆棧保護(hù),調(diào)用完后再從堆棧中彈出以便加以恢復(fù)。如果有較多的寄存器要保護(hù),應(yīng)使主、子程序使用不同的寄存器組。2)設(shè)置入口參數(shù)和出口參數(shù)。用之前主程序要按子程序的要求設(shè)置好地址單元或存儲(chǔ)器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲(chǔ)器獲得輸入數(shù)據(jù);子程序經(jīng)運(yùn)算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運(yùn)算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。第四十二頁,共59頁。3)子程序中可包括對另外子程序的調(diào)用,稱為子程序嵌套。例3-19用程序?qū)崿F(xiàn)c=a2+b2,設(shè)a,b均小于10。a存放在31H單元,b存放在32H單元,把c存入34H和33H單元。(和要求為BCD碼)。
解:因該算式兩次用到平方值,所以在程序中采用把求平方編為子程序的方法。求平方采用查表法,主程序和子程序編寫如下:第四十三頁,共59頁。主程序:
ORG0000HMOVSP,#3FHMOVA,31H;取aLCALLSQR;求a方MOVR1,AMOVA,32H;取bLCALLSQR;求b方ADDA,R1;求和DAA;調(diào)整MOV33H,AMOVA,#0ADDCA,#0MOV34H,ASJMP$子程序:
ORG0030HSQR:INCAMOVCA,@A+PCRETTAB:DB00H,01H,04HDB09H16H,25H,DB36H,49H64H,81HEND第四十四頁,共59頁。例3-17求兩個(gè)無符號(hào)數(shù)據(jù)塊中的最大值的乘積。數(shù)據(jù)塊的首地址分別為60H和70H,每個(gè)數(shù)據(jù)塊的第一個(gè)字節(jié)都用來存放數(shù)據(jù)塊長度。結(jié)果存入5FH和5EH單元。分析:求兩個(gè)無符號(hào)數(shù)據(jù)塊的最大值,所以可以直接采用減法比較,以0作為第一個(gè)參考數(shù)據(jù)。求最大值的過程可以采用子程序。子程序的入口參數(shù):數(shù)據(jù)塊首地址,存放在R1中;出口參數(shù):最大值存放在A中。第四十五頁,共59頁。主程序:ORG0000HMOV R1,#60HACALLQMAXMOV B,AMOV R1,#70HACALL QMAXMUL ABMOV 5EH,AMOV 5FH,BSJMP $子程序: ORG 0030HQMAX:MOV A,@R1 MOV R2,A CLR ALP1: INC R1CLR CSUBB A,@R1JNC LP3MOV A,@R1SJMP LP4LP3:ADD A,@R1LP4:DJNZ R2,LP1RETEND第四十六頁,共59頁。3.8小結(jié)1、程序設(shè)計(jì)的關(guān)鍵在于指令熟悉和算法(思路)正確、清晰,對復(fù)雜的程序應(yīng)先畫出流程圖。只有多做練習(xí)多上機(jī)調(diào)試,熟能生巧,才能編出高質(zhì)量的程序。2、偽指令是非執(zhí)行指令,提供匯編程序以匯編信息,應(yīng)正確使用。3、本章應(yīng)掌握順序程序、分支程序、循環(huán)程序、子程序等各類程序的設(shè)計(jì)方法,并能熟練應(yīng)用查表技術(shù)簡化程序的設(shè)計(jì)。第四十七頁,共59頁。3.7從內(nèi)部存儲(chǔ)器30H單元開始,有16個(gè)數(shù)據(jù),試編寫一個(gè)程序,把其中的正數(shù)、負(fù)數(shù)分別存入40H和50H開始的存儲(chǔ)單元,并分別將正數(shù)、負(fù)數(shù)和零的個(gè)數(shù)存入R4、R5、R6。分析:R0指示16個(gè)數(shù)據(jù)的地址,R1用于指示正數(shù)、負(fù)數(shù)的存放地址,其中負(fù)數(shù)的地址用B暫存。第三章習(xí)題課第四十八頁,共59頁。 ORG 0000H MOV R4,#0 MOV R5,#0 MOV R6,#0 MOV R0,#30H MOV R1,#40H MOV B,#50H MOV R7,#10HNEXT:MOV A,@R0 JZ ZERO JB ACC.7,NE INC R4 MOV @R1,A INC R1 MOV 60H,R1 AJMP DJNE: INC R5 MOV R1,B MOV @R1,B INC B AJMP DJZERO: INC R6DJ: MOV R1,60H INC R0 DJNZ R7,NEXT SJMP $ (1)第四十九頁,共59頁。(2)分析:R0指示正數(shù)的存放地址,R1用于指示負(fù)數(shù)的存放地址,SP指示源數(shù)據(jù)存放的末地址,POP指令取源數(shù)據(jù),每取一個(gè)數(shù),地址減1。 ORG 0000H MOV R7,#10H MOV A,#0 MOV R4,A MOV R5,A MOV R6,A MOV R0,#40H MOV R1,#50H MOV SP,#3FHNEXT:POP ACC JZ ZERO JB ACC.7,NE INC R4 MOV @R0,A INC R0 AJMP DJNE: INC R5 MOV @R1,A INC R1 AJMP DJZERO:INC R6DJ: DJNZ R7,NEXT SJMP $第五十頁,共59頁。3.8內(nèi)部存儲(chǔ)單元40H中有一個(gè)ASCII字符,試編寫一個(gè)程序,給該數(shù)的高位加上奇校驗(yàn)。 MOV A,40H JB P,EN ORL A,#80HEN: SJMP $第五十一頁,共59頁。3.10以BUF1為起始地址的外存儲(chǔ)區(qū)中,存放有16個(gè)單字節(jié)無符號(hào)二進(jìn)制數(shù),試編寫一個(gè)程序,求其平均值并存入BUF2單元,余數(shù)存在BUF單元。分析:由于16個(gè)單字節(jié)無符號(hào)二進(jìn)制數(shù)之和為雙字節(jié)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電器維修公司服務(wù)員工作總結(jié)
- 埃塞萊米項(xiàng)目安保方案
- 2025年全球及中國乘用車用液力變矩器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國低速型立式加工中心(主軸轉(zhuǎn)速6000-15000rpm)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國屋面高分子防水卷材行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國三箱式冷熱沖擊試驗(yàn)箱行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國工業(yè)機(jī)器人減速馬達(dá)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球智能體測儀行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國1P高功率電芯行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球NRV鋁合金微型蝸桿減速機(jī)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年合資經(jīng)營印刷煙包盒行業(yè)深度研究分析報(bào)告
- 天津市五區(qū)縣重點(diǎn)校2024-2025學(xué)年高一上學(xué)期1月期末聯(lián)考試題 化學(xué) 含答案
- 吉林省吉林市普通中學(xué)2024-2025學(xué)年高三上學(xué)期二模試題 生物 含答案
- 2025年湖南省通信產(chǎn)業(yè)服務(wù)限公司春季校園招聘76人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《電影之創(chuàng)戰(zhàn)紀(jì)》課件
- 2024-2025學(xué)年人教版五年級(上)英語寒假作業(yè)(一)
- 開題報(bào)告-鑄牢中華民族共同體意識(shí)的學(xué)校教育研究
- 2025屆貴州省六盤水市第二中學(xué)高三適應(yīng)性調(diào)研考試數(shù)學(xué)試題含解析
- 浙江省五校鎮(zhèn)海中學(xué)2025屆高考考前模擬數(shù)學(xué)試題含解析
- 2024-2025學(xué)年度高三年級11月聯(lián)考試題及答案
- 公司2025年會(huì)暨員工團(tuán)隊(duì)頒獎(jiǎng)盛典攜手同行共創(chuàng)未來模板
評論
0/150
提交評論