第4章匯編程序設(shè)計(jì)_第1頁(yè)
第4章匯編程序設(shè)計(jì)_第2頁(yè)
第4章匯編程序設(shè)計(jì)_第3頁(yè)
第4章匯編程序設(shè)計(jì)_第4頁(yè)
第4章匯編程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章MCS-51匯編語(yǔ)言程序設(shè)計(jì)

匯編語(yǔ)言是面向機(jī)器硬件的語(yǔ)言,要求程序設(shè)計(jì)者對(duì)MCS-51單片機(jī)具有很好的“軟、硬結(jié)合”的功底。

介紹程序設(shè)計(jì)的基本知識(shí)及如何使用匯編語(yǔ)言來(lái)進(jìn)行基本的程序設(shè)計(jì)。4.1匯編語(yǔ)言程序設(shè)計(jì)概述

4.1.1機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言用于程序設(shè)計(jì)的語(yǔ)言基本上分為3種:機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言。

1.機(jī)器語(yǔ)言

二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡(jiǎn)稱為機(jī)器語(yǔ)言不易懂,難記憶,易出錯(cuò)。

2.匯編語(yǔ)言

英文助記符表示的指令稱為符號(hào)語(yǔ)言或匯編語(yǔ)言將匯編語(yǔ)言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語(yǔ)言程序稱為匯編程序經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語(yǔ)言程序稱為目標(biāo)程序,原來(lái)的匯編語(yǔ)言程序稱為源程序。匯編語(yǔ)言特點(diǎn):面向機(jī)器的語(yǔ)言,程序設(shè)計(jì)員須對(duì)MCS-51的硬件有相當(dāng)深入的了解。助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語(yǔ)言編寫的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,用匯編語(yǔ)言能編寫出最優(yōu)化的程序。

能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問(wèn)存儲(chǔ)器及I/O接口電路。匯編語(yǔ)言和機(jī)器語(yǔ)言都脫離不開(kāi)具體機(jī)器的硬件,均是面向“機(jī)器”的語(yǔ)言,缺乏通用性。3.高級(jí)語(yǔ)言不受具體機(jī)器的限制,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語(yǔ),非常擅長(zhǎng)于科學(xué)計(jì)算。常用的如BASIC、FORTRAN以及C語(yǔ)言等。高級(jí)語(yǔ)言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。使用C語(yǔ)言(C51)、PL/M語(yǔ)言來(lái)進(jìn)行MCS-51的應(yīng)用程序設(shè)計(jì)。

對(duì)于程序的空間和時(shí)間要求很高的場(chǎng)合,匯編語(yǔ)言仍是必不可缺的。

C語(yǔ)言和匯編語(yǔ)言混合編程

在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用匯編語(yǔ)言不可使用匯編語(yǔ)言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一4.1.2匯編語(yǔ)言語(yǔ)句的種類和格式兩種基本類型:指令語(yǔ)句和偽指令語(yǔ)句(1)指令語(yǔ)句已在第3章介紹每一條指令語(yǔ)句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼——機(jī)器代碼(2)偽指令語(yǔ)句

是為匯編服務(wù)的。在匯編時(shí)沒(méi)有機(jī)器代碼與之對(duì)應(yīng)。

MCS-51的匯編語(yǔ)言的四分段格式如下:標(biāo)號(hào)字段操作碼字段操作數(shù)字段注釋字段規(guī)則:(1)標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔;(2)操作碼字段和操作數(shù)字段間的分界符是空格;(3)雙操作數(shù)之間用逗號(hào)相隔;(4)操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相隔。操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。例4-1

下面是一段匯編語(yǔ)言程序的四分段書寫格式

標(biāo)號(hào)字段操作碼字段操作數(shù)字段注釋字段

START:MOVA,#00H;0→AMOVR1,#10;10→R1 MOVR2,#00000011B;3→R2 LOOP:ADDA,R2;(A)+(R2)→A DJNZR1,LOOP;R1內(nèi)容減1不 為零,則循環(huán)

NOP HERE:SJMPHERE基本語(yǔ)法規(guī)則:1.標(biāo)號(hào)字段是語(yǔ)句所在地址的標(biāo)志符號(hào)

(1)標(biāo)號(hào)后邊必須跟以冒號(hào)“:”(2)由1~8個(gè)ASCII字符組成(3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次(4)不能使用匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)2.操作碼字段

是匯編語(yǔ)言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來(lái)生成機(jī)器代碼的。3.操作數(shù)字段

通常有單操作數(shù)、雙操作數(shù)和無(wú)操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開(kāi)。(1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示

采用十六進(jìn)制形式來(lái)表示,某些特殊場(chǎng)合才采用二進(jìn)制或十進(jìn)制的表示形式。十六進(jìn)制,后綴“H”

。二進(jìn)制,后綴“B”

。十進(jìn)制,后綴“D”,也可省略。若十六進(jìn)制的操作數(shù)以字符A~F中的某個(gè)開(kāi)頭時(shí),則需在它前面加一個(gè)“0”,以便在匯編時(shí)把它和字符A~F區(qū)別開(kāi)來(lái)。(2)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號(hào)來(lái)表示,也可用其地址來(lái)表示。例如,累加器可用A(或Acc)表示。也可用0E0H來(lái)表示,0E0H為累加器A的地址。(3)美元符號(hào)$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:

JNBF0,$與如下指令是等價(jià)的:

HERE:JNBF0,HERE

再如:

HERE:SJMPHERE可寫為:

SJMP$4.注釋字段

必須以分號(hào)“;”開(kāi)頭,換行書寫,但必須注意也要以分號(hào)“;”開(kāi)頭。匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼。4.1.3偽指令在MCS-51匯編語(yǔ)言源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過(guò)使用偽指令來(lái)實(shí)現(xiàn)的。也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過(guò)匯編得到目標(biāo)程序(機(jī)器代碼)后,偽指令已無(wú)存在的必要,所以“偽”體現(xiàn)在匯編時(shí),偽指令沒(méi)有相應(yīng)的機(jī)器代碼產(chǎn)生。常用的偽指令:

1.ORG(ORiGin)匯編起始地址命令

在匯編語(yǔ)言源程序的開(kāi)始,通常都用一條ORG偽指令來(lái)實(shí)現(xiàn)規(guī)定程序的起始地址。如不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開(kāi)始。例如:

ORG2000HSTART: MOVA,#00H ┋規(guī)定標(biāo)號(hào)START代表地址為2000H開(kāi)始。在一個(gè)源程序中,可多次使用ORG指令,來(lái)規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。例如:

ORG2000H ┇

ORG2500H ┇ ORG3000H ┇2.END(ENDofassembly)匯編終止命令匯編語(yǔ)言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。在整個(gè)源程序中只能有一條END命令,且位于程序的最后。3.DB(DefineByte)定義字節(jié)命令在程序存儲(chǔ)器的連續(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碼)DB功能是從指定單元開(kāi)始定義(存儲(chǔ))若干個(gè)字節(jié),10進(jìn)制數(shù)自然轉(zhuǎn)換成16進(jìn)制數(shù),字母按ASCII碼存儲(chǔ)。4.DW(DefineWord)定義數(shù)據(jù)字命令從指定的地址開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如:

ORG2000H DW1246H,7BH,10匯編后:(2000H)=12H ;第1個(gè)字(2001H)=46H(2002H)=00H ;第2個(gè)字(2003H)=7BH(2004H)=00H ;第3個(gè)字(2005H)=0AH(2005H)=0AH5.EQU(EQUate)賦值命令用于給標(biāo)號(hào)賦值。賦值以后,其標(biāo)號(hào)值在整個(gè)程序有效。例如:TESTEQU2000H

表示標(biāo)號(hào)TEST=2000H,在匯編時(shí),凡是遇到標(biāo)號(hào)TEST時(shí),均以2000H來(lái)代替。

4.1.4匯編語(yǔ)言程序設(shè)計(jì)步驟(1)分析問(wèn)題,確定算法(2)根據(jù)算法,畫出程序框圖(3)分配內(nèi)存工作區(qū)及有關(guān)端口地址----與硬件相關(guān)(4)編寫程序養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。(5)上機(jī)調(diào)試編寫完畢的程序,必須“匯編”成機(jī)器代碼,才能調(diào)試和運(yùn)行,調(diào)試與硬件有關(guān)程序還要借助于仿真開(kāi)發(fā)工具并與硬件連接。4.2匯編語(yǔ)言源程序的匯編匯編語(yǔ)言源程序“翻譯”成機(jī)器代碼(指令代碼)的過(guò)程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類:4.2.1手工匯編人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,且容易出錯(cuò)。4.2.2機(jī)器匯編用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCII碼文件,擴(kuò)展名為“.ASM”。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語(yǔ)言源程序翻譯成機(jī)器代碼。交叉匯編—匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)(這里是單片機(jī))上運(yùn)行。

MCS-51單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)過(guò)三個(gè)步驟;(1)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的輸入和編輯;(2)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;(3)通過(guò)微計(jì)算機(jī)的串行口(或并行口)把機(jī)器代碼傳送到用戶樣機(jī)(或在線仿真器)進(jìn)行程序的調(diào)試和運(yùn)行。第(1)步,只需在微計(jì)算機(jī)上使用通用的編輯軟件即可完成。第(2)步的交叉匯編所用的匯編程序可在購(gòu)買單片機(jī)的仿真開(kāi)發(fā)工具時(shí),由廠商提供。第(3)步驟的實(shí)現(xiàn)要借助于單片機(jī)仿真開(kāi)發(fā)工具進(jìn)行。4.3.1程序結(jié)構(gòu)設(shè)計(jì)的基本方法匯編語(yǔ)言程序設(shè)計(jì)基本要求:

高質(zhì)量、可讀性好、存儲(chǔ)容量小和執(zhí)行速度快匯編程序結(jié)構(gòu)設(shè)計(jì)的基本方法:

1.簡(jiǎn)單程序的設(shè)計(jì)

2.分支程序設(shè)計(jì)3.循環(huán)程序設(shè)計(jì)4.子程序設(shè)計(jì)5.查表程序設(shè)計(jì)6.散轉(zhuǎn)程序設(shè)計(jì)4.3匯編語(yǔ)言實(shí)用程序設(shè)計(jì)4.3.2簡(jiǎn)單和分支程序設(shè)計(jì)1簡(jiǎn)單程序設(shè)計(jì)[例4.1]

請(qǐng)用51匯編指令編寫程序,將外部RAM單元中40H單元2位BCD數(shù)轉(zhuǎn)換成ASCII碼,送到內(nèi)部RAM單元60H61H之中。簡(jiǎn)單程序:是指程序設(shè)計(jì)中沒(méi)有使用轉(zhuǎn)移類指令的程序段。也稱順序程序或直線程序。程序執(zhí)行:按照指令存儲(chǔ)位置的先后順序依次執(zhí)行,中間不會(huì)有任何分支程序、循環(huán)程序等。程序特點(diǎn):結(jié)構(gòu)簡(jiǎn)單,易于閱讀理解,大量使用數(shù)據(jù)傳送指令。解:根據(jù)ASCII字符表,十進(jìn)制數(shù)09的ASCII碼和它的BCD碼之間僅相差30H,本題需要把一個(gè)字節(jié)的兩位BCD數(shù)進(jìn)行拆分,然后分別和30H相加,即得到相應(yīng)的ASCII碼。參考設(shè)計(jì)程序如下:

ORG1000HADDR1DATA0040HADDR2EQU60H

MOVDPTR,#ADDR1;源地址=>DPTRMOVR0,#ADDR2;目標(biāo)地址=>R0

MOV@R0,#00H;目標(biāo)地址單元清零MOVXA,@DPTR;源地址單元中BCD數(shù)送AMOVB,AANLA,#0FHORLA,#30H;完成低位BCD數(shù)轉(zhuǎn)換MOV@R0,A;存入60HINCR0MOVA,BANLA,#0F0HSWAPA;高位BCD數(shù)送低4位ORLA,#30H;完成高位BCD數(shù)轉(zhuǎn)換

MOV@R0,A;

存入61HSJMP$

END2分支程序設(shè)計(jì)

分支程序的特點(diǎn)是程序中含有轉(zhuǎn)移指令。由于轉(zhuǎn)移指令有無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移之分,因此分支程序也可分為無(wú)條件分支程序和條件分支程序兩類。無(wú)條件分支程序中含有無(wú)條件轉(zhuǎn)移指令,因簡(jiǎn)單這里不作專門討論;條件分支程序中含有條件轉(zhuǎn)移指令,是我們討論的重點(diǎn)。條件分支程序體現(xiàn)了計(jì)算機(jī)執(zhí)行程序時(shí)的分析判斷能力。若某種條件滿足,則機(jī)器就轉(zhuǎn)移到另一分支上執(zhí)行程序;若條件不滿足,則機(jī)器就按原程序繼續(xù)執(zhí)行。

MCS-51中,條件轉(zhuǎn)移指令共有13條,分為累加器A判零條件轉(zhuǎn)移、比較條件轉(zhuǎn)移、減1條件轉(zhuǎn)移和位控制條件轉(zhuǎn)移等四類。[例4.2]

已知VAR單元內(nèi)有一自變量X,請(qǐng)按如下條件編出求函數(shù)值Y并將它存入FUNC單元的程序。Y=

解:這是一個(gè)三分支歸一的條件轉(zhuǎn)移問(wèn)題,程序?qū)崿F(xiàn)通??煞譃椤跋确种Ш筚x值”和“先賦值后分支”兩種求解辦法?,F(xiàn)分述如下:1.先分支后賦值。題意告訴我們,自變量X是個(gè)帶符號(hào)數(shù),可采用累加器判零條件轉(zhuǎn)移和位控制條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn),程序流程如圖4-1(a)所示。相應(yīng)程序?yàn)椋?/p>

ORG1000HVAR DATA30HFUNCDATA31HMOVA,VAR ;X送A JZDONE ;若X=0,則轉(zhuǎn)DONEJNBACC.7,POSI ;若X>0,則轉(zhuǎn)POSIMOVA,#0FFH ;若X<0,則-1送ASJMPDONE

;轉(zhuǎn)DONEPOSI: MOVA,#01H ;1送ADONE:MOVFUNC,A

;存Y值

SJMP$

END

A←XA=0?A>0?

A

1

存結(jié)果A

1(a)先分支后賦值

YN

N

Y

圖4-1[例4.2]流程圖

2.先賦值后分支。

先把X調(diào)入累加器A,并判斷它是否為零?

若X=0,則A中內(nèi)容送FUNC單元;

若X≠0,則先給R0賦值(如-1),然后判斷A<0?

若A<0,則R0送FUNC單元;

若A>0,則把R0修改成1后送FUNC單元,

程序流程如圖4-1(b)所示。

(b)先賦值后分支

A←X,R0←0

R0←1

存結(jié)果

R0←–1A=0?

A>0?YN

YN

圖4-1[例4.2]流程圖

相應(yīng)程序?yàn)椋?/p>

ORG1000HVARDATA30HFUNCDATA31HMOVR0,#00HMOVA,

VAR;X送AJZDONE;若X=0,則轉(zhuǎn)DONEMOVR0,#0FFH;若X0,則-1送R0JBACC.7,DONE;若X<0,則轉(zhuǎn)DONEMOVR0,#01H;若X>0,則1送R0DONE:MOVFUNC,R0;存Y值

SJMP$

END

[例4.3]

某系有200名學(xué)生參加外語(yǔ)統(tǒng)考,若成績(jī)已存放在MCS-51外部RAM始地址為ENGLISH的連續(xù)存儲(chǔ)單元,現(xiàn)決定給成績(jī)?cè)?5分~100分之間學(xué)生頒發(fā)A級(jí)合格證書和成績(jī)?cè)?0分~94分之間學(xué)生頒發(fā)B級(jí)合格證書。試編制一個(gè)程序,可以統(tǒng)計(jì)A級(jí)和B級(jí)證書的學(xué)生人數(shù),并把統(tǒng)計(jì)結(jié)果存入內(nèi)部RAM的GRADA和GRADB單元。

解:這是一個(gè)循環(huán)和分支相結(jié)合程序,

程序流程圖如圖4-2所示。

A≥95?

A≥90?完成否?GRADB單元內(nèi)容加1修改DPTR指針

結(jié)束GRADA單元內(nèi)容加1GRADA和GRADB單元清零、DPTR置初值ENGLISH、循環(huán)計(jì)數(shù)器R2置初值200取某學(xué)生外語(yǔ)成績(jī)圖4-2[例4.3]程序流程圖

相應(yīng)程序?yàn)椋?/p>

ORG1000HENGLISHDATA2000HGRADADATA20HGRADBDATA21HMOVGRADA,#00H

;GRADA單元清零

MOVGRADB,#00H

;GRADB單元清零

MOVR2,#0C8H

;參考總?cè)藬?shù)送R2

MOVDPTR,#ENGLISH;學(xué)生成績(jī)始地址送DPTRLOOP:

MOVXA,@DPTR

;取某學(xué)生成績(jī)到A

CJNEA,#5FH,LOOP1;和95作比較,形成CyLOOP1:JNCNEXT1

;若A95,則NEXT1CJNEA,#5AH,LOOP2;和90作比較LOOP2:JCNEXT

;A<90,NEXTINCGRADB

;為B級(jí),則GRADB單元內(nèi)容加1SJMPNEXTNEXT1:

INCGRADA

;A95,則GRADA單元內(nèi)容加1NEXT:

INCDPTR

;修改學(xué)生成績(jī)指針

DJNZR2,LOOP

;未完,則LOOPSJMP$

;結(jié)束

END3散轉(zhuǎn)程序設(shè)計(jì)在利用MCS-51單片機(jī)指令設(shè)計(jì)匯編程序時(shí),有時(shí)會(huì)遇到一類多分支程序的設(shè)計(jì)。分支轉(zhuǎn)移的目標(biāo)地址不是匯編或編程時(shí)確定的,而是在程序運(yùn)行時(shí)動(dòng)態(tài)決定的。

MCS-51單片機(jī)提供了間接轉(zhuǎn)移指令JMP@A+DPTR,恰好可以實(shí)現(xiàn)這一類轉(zhuǎn)移。其中,DPTR裝入多分支轉(zhuǎn)移程序的首地址,用累加器A的內(nèi)容來(lái)動(dòng)態(tài)選擇其中的某一個(gè)分支予以轉(zhuǎn)移。這樣一條指令可實(shí)現(xiàn)以DPTR內(nèi)容為起始地址的256個(gè)字節(jié)范圍的選擇轉(zhuǎn)移。[例4.4]

已知通過(guò)調(diào)用鍵盤控制程序KEYREAD可將按下的按鍵鍵值0~15之一讀到累加器A,要求編寫程序?qū)ψx入的不同鍵值,分別轉(zhuǎn)入對(duì)應(yīng)的鍵控程序段KEY0~KEY15執(zhí)行。

即要求:當(dāng)(A)=0時(shí),轉(zhuǎn)鍵控處理程序KEY0;

當(dāng)(A)=1時(shí),轉(zhuǎn)鍵控處理程序KEY1;

…………………

當(dāng)(A)=15時(shí),轉(zhuǎn)鍵控處理程序KEY15。

解:

對(duì)于上述要求的問(wèn)題,編寫程序如下:ORG

1000HACALLKEYREAD;讀鍵值程序

RL

A

;調(diào)整

MOV

DPTR,#TABLE;表首址送DPTRJMP

@A+DPTR

;以A中內(nèi)容為偏移量跳轉(zhuǎn)

……………TABLE:AJMPK0

;讀入鍵為第1個(gè)鍵,轉(zhuǎn)K0執(zhí)行

AJMPK1

;讀入鍵為第2個(gè)鍵,轉(zhuǎn)K1執(zhí)行

……………AJMPK15

;讀入鍵為第16個(gè)鍵,轉(zhuǎn)K15執(zhí)行

……………K0:[第1鍵處理程序段]K1:[第2鍵處理程序段]………

K15:[第16鍵處理程序段]4.4循環(huán)和查表程序設(shè)計(jì)4.4.1循環(huán)程序設(shè)計(jì)

循環(huán)程序的特點(diǎn)是程序中含有可以重復(fù)執(zhí)行的程序段,該程序段通常稱為循環(huán)體。例如,求100個(gè)數(shù)的累加和是沒(méi)有必要連續(xù)安排100條加法指令的,可以只用一條加法指令并使之循環(huán)執(zhí)行100次。循環(huán)程序的組成(四部分):1.循環(huán)初始化循環(huán)初始化程序段位于循環(huán)程序開(kāi)頭,用于完成循環(huán)前的準(zhǔn)備工作,例如:循環(huán)體中循環(huán)計(jì)數(shù)器和各工作寄存器設(shè)置初值,其中循環(huán)計(jì)數(shù)器用于控制循環(huán)次數(shù)。

循環(huán)程序設(shè)計(jì)不僅可以大大縮短所編程序長(zhǎng)度和使程序所占存儲(chǔ)單元數(shù)最少,也能使程序結(jié)構(gòu)緊湊和可讀性變好。

應(yīng)注意循環(huán)程序設(shè)計(jì)并不能縮短完成任務(wù)的程序執(zhí)行時(shí)間。2.循環(huán)處理這部分程序位于循環(huán)體內(nèi),是循環(huán)程序的工作程序,需要重復(fù)執(zhí)行。要求編寫得盡可能簡(jiǎn)練,提高程序執(zhí)行速度。3.循環(huán)控制循環(huán)控制程序也在循環(huán)體內(nèi),常常由修改循環(huán)計(jì)數(shù)器內(nèi)容的語(yǔ)句和條件轉(zhuǎn)移語(yǔ)句等組成,用于控制循環(huán)執(zhí)行次數(shù)。4.循環(huán)結(jié)束這部分程序用于存放執(zhí)行循環(huán)程序所得結(jié)果以及恢復(fù)各工作單元循環(huán)前的初值。循環(huán)程序通常有兩種編制方法:一種是先循環(huán)處理后循環(huán)控制(即先處理后判斷),如圖4-3(a)所示;另一種是先循環(huán)控制后循環(huán)處理(即先判斷后處理),如圖4-3(b)所示。初始化循環(huán)處理循環(huán)控制循環(huán)結(jié)束

完成?初始化循環(huán)處理循環(huán)控制完成?循環(huán)結(jié)束

(a)先處理后判斷

(b)

先判斷后處理

圖4-3循環(huán)程序結(jié)構(gòu)類型解:為了使大家對(duì)兩種循環(huán)結(jié)構(gòu)有一個(gè)全面了解,以便進(jìn)行分析比較,現(xiàn)給出兩種設(shè)計(jì)方案。

1.先判斷后處理(見(jiàn)圖4-4(a))[例4.5]

已知內(nèi)部RAM的BLOCK單元開(kāi)始有一無(wú)符號(hào)數(shù)據(jù)塊,塊長(zhǎng)在LEN單元。請(qǐng)編出求數(shù)據(jù)塊中各數(shù)累加和、并存入SUM單元的程序。A←0R2←塊長(zhǎng)+1R1←BLOCK

完成?A←A+(R1)R1←R1+1SUM←和A←A+(R1)R1←(R1)+1SUM←和完成?A←0R2←塊長(zhǎng)R1←BLOCK

(a)先判斷后處理

(b)先處理后判斷

圖4-4[例4.5]程序流程圖求累加和參考程序:

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;塊長(zhǎng)送R2MOVR1,#BLOCK;塊始地址送R1INCR2;塊長(zhǎng)+1

SJMPCHECKLOOP:ADDA,@R1

;A+(R1)送A

INCR1

;修改數(shù)據(jù)塊指針R1CHECK:DJNZR2,LOOP

;若未完,則轉(zhuǎn)LOOPMOVSUM,A

;存累加和

SJMP$

END先判斷后處理2.先處理后判斷(見(jiàn)圖4-4(b))

參考程序?yàn)椋?/p>

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;塊長(zhǎng)送R2MOVR1,#BLOCK;數(shù)據(jù)始地址送R1

NEXT:ADDA,@R1

;A+(R1)送A

INCR1

;修改數(shù)據(jù)塊指針R1

DJNZR2,NEXT

;若未完,則轉(zhuǎn)NEXTMOVSUM,A;存累加和

SJMP$

END先處理后判斷應(yīng)當(dāng)注意:上述兩個(gè)程序是有區(qū)別的。若塊長(zhǎng)≠0,則兩個(gè)程序的執(zhí)行結(jié)果相同;若塊長(zhǎng)=0,則先處理后判斷程序的執(zhí)行結(jié)果是錯(cuò)誤的?;蛘哒f(shuō),先處理后判斷程序至少執(zhí)行一次循環(huán)體內(nèi)程序。[例4.6]

設(shè)單片機(jī)MCS-51內(nèi)部RAM起始地址為30H的數(shù)據(jù)塊中有64個(gè)無(wú)符號(hào)數(shù)。試編制一個(gè)程序能使它們按從小到大數(shù)據(jù)排列。解:設(shè)有64個(gè)無(wú)符號(hào)數(shù),在數(shù)據(jù)塊中序號(hào)為:e1,e2,…,e63,e64,使它們按從小到大順序排列的方法頗多?,F(xiàn)以氣泡分類法為例加以介紹。

氣泡分類法又稱兩兩比較法。它先使e63和e64比較,若e64>e63,則兩個(gè)存貯單元中內(nèi)容交換,反之就不交換;然后使e62和e63相比,按同樣原則決定是否交換;一直比較下去;最后完成e1和e2比較及交換,經(jīng)過(guò)N-1=63次比較(常用內(nèi)循環(huán)63次來(lái)實(shí)現(xiàn))后,e1位置上必然得到數(shù)組中的最大值,猶如一個(gè)氣泡從水底冒到了水頂,如圖4-5所示。第二次冒泡過(guò)程和第一次冒泡過(guò)程完全相同,比較次數(shù)也可以是63次(其實(shí)只需62次),冒泡后可以在e2位置上得到次最大值,如圖4-5所示。

冒泡循環(huán)次數(shù)計(jì)算:(以

64個(gè)數(shù)的排序?yàn)槔┐笱h(huán)(外循環(huán))共63次;內(nèi)循環(huán):共63×63次。完成64個(gè)數(shù)的排序需要外循環(huán)63次、內(nèi)循環(huán)3969次。第一次冒泡排序(比較5次)

N=6時(shí)

比較1

比較2

比較3

比較4

比較5

e144444256e211112564e300025611e44242256000e53625642424242e62563636363636第二次冒泡排序(比較4次)

N=6時(shí)

比較1

比較2

比較3

比較4e1256256256256256256e244444242e31114244e40042111e542420000e6363636363636第三次冒泡排序(比較3次)

N=6時(shí)

比較1

比較2

比較3e1256256256256256256e2424242424242e3444363636e41136444e50361111e63600000第四次冒泡排序(比較2次)

N=6時(shí)

比較1

比較2e1256256256256256256e2424242424242e3363636363636e4444444e5111111e6000000第五次冒泡排序(比較1次)

N=6時(shí)

比較1e1256256256256256256e2424242424242e3363636363636e4444444e5111111e6000000其實(shí),64個(gè)無(wú)符號(hào)數(shù)的數(shù)組排序需要冒泡63次的機(jī)會(huì)是很少的,每次冒泡所需的數(shù)據(jù)比較次數(shù),也是從63逐次減少(每冒一次泡減少一次比較)。為了禁止那些不必要的冒泡次數(shù),人們常常設(shè)置一個(gè)“交換標(biāo)志位”?!敖粨Q標(biāo)志位”在循環(huán)初始化時(shí)清零,在數(shù)據(jù)交換時(shí)置位成1(表示冒泡中進(jìn)行過(guò)數(shù)據(jù)交換)?!敖粨Q標(biāo)志位”用來(lái)控制是否再需要冒泡:若“交換標(biāo)志位”為1,則表明剛剛進(jìn)行的冒泡中發(fā)生過(guò)數(shù)據(jù)交換(即排序尚未完成),應(yīng)繼續(xù)進(jìn)行冒泡;若“交換標(biāo)志位”為0,則表明剛進(jìn)行完的冒泡中未發(fā)生過(guò)數(shù)據(jù)交換(即排序已完成),冒泡應(yīng)該禁止。例如,對(duì)于一個(gè)已經(jīng)排好序的數(shù)組:1,2,3,…,63,64,排序程序只要進(jìn)行一次冒泡便可根據(jù)“交換標(biāo)志位”狀態(tài)而結(jié)束排序程序的再執(zhí)行,這自然可以節(jié)省63-1=62次的冒泡時(shí)間。冒泡程序流程如圖4-6所示。開(kāi)始數(shù)據(jù)塊始址送R0塊長(zhǎng)-1送R2“交換標(biāo)志位”7FH清零

eN送20H和A修改數(shù)據(jù)指針eN-1送21H

eN≥eN-1?“交換標(biāo)志”7FH=1?e和e在數(shù)據(jù)塊中位置交換“交換標(biāo)志”7FH置”1”結(jié)束

R2-1=0?圖4-6冒泡程序流程圖

參考程序?yàn)椋?/p>

ORG1000HBUBBLE:MOVR0,#30H;置數(shù)據(jù)塊指針R0MOVR2,#64;塊長(zhǎng)送R2CLR7FH

;交換標(biāo)志2FH.7清零

DECR2

;塊長(zhǎng)-1為比較次數(shù)

BULOOP:

MOV20H,@R0;e送20HMOVA,@R0

;e送AINCR0MOV21H,@R0

;e送21HCJNEA,21H,LOOP;(20H)和(21H)比較

LOOP:JCBUNEXT

;若(20H)<(21H),則BUNEXTMOV@R0,20H

;若(20H)≥(21H),則兩者交換

DECR0MOV@R0,21HINCR0

;恢復(fù)數(shù)塊指針

SETB7FH

;置“1”交換標(biāo)志位

BUNEXT:DJNZR2,BULOOP

;若一次冒泡未完,則BULOOP… ;R2=0?JB7FH,BUBBLE

;若交換標(biāo)志位為1,則BUBBLESJMP$

;結(jié)束

END在以上循環(huán)程序的實(shí)例中,單循環(huán)程序結(jié)構(gòu)比較簡(jiǎn)單,程序每循環(huán)一次,其循環(huán)體就被執(zhí)行一次。雙循環(huán)(或多循環(huán))程序就不同了,外循環(huán)一次內(nèi)循環(huán)執(zhí)行一圈。因此,在雙重循環(huán)和多重循環(huán)程序設(shè)計(jì)中,內(nèi)層循環(huán)體前應(yīng)注意安排循環(huán)初始化,內(nèi)外循環(huán)間也不應(yīng)相互交叉。4.4.2查表程序設(shè)計(jì)

查表是根據(jù)存放在ROM中數(shù)據(jù)表格的項(xiàng)數(shù)來(lái)查找和它對(duì)應(yīng)的表中值。方法簡(jiǎn)便,可縮短程序長(zhǎng)度和提高程序執(zhí)行效率。

例如:查Y=X2(設(shè)X為0~9)的平方表時(shí),可以預(yù)先計(jì)算出X為0~9時(shí)的Y值作為數(shù)據(jù)表格的內(nèi)容,存放在起始地址為DTAB的ROM存儲(chǔ)器中,并使X的值和數(shù)據(jù)表格的項(xiàng)數(shù)(所查數(shù)據(jù)的實(shí)際地址對(duì)DTAB的偏移量)一一對(duì)應(yīng)。這樣,就可以根據(jù)DTAB+X來(lái)找到X對(duì)應(yīng)的Y值。采用MCS-51匯編語(yǔ)言進(jìn)行查表尤為方便,它有兩條專門的查表指令:MOVCA,@A+DPTR

MOVCA,@A+PC

第一條查表指令采用DPTR存放數(shù)據(jù)表格起始地址,其查表過(guò)程比較簡(jiǎn)單。查表前要把數(shù)據(jù)表格起始地址存入DPTR,然后把要求查表的項(xiàng)數(shù)折算成相對(duì)數(shù)據(jù)表始地址的偏移量,送入累加器A,最后使用MOVCA,@A+DPTR完成查表。采用MOVCA,@A+PC指令查表,其步驟分為如下三步。

(1)使用傳送指令把所查數(shù)據(jù)表格的項(xiàng)數(shù)送入累加器A.(2)使用ADDA,#data指令對(duì)累加器A進(jìn)行修正。data值由下式確定。PC+data=數(shù)據(jù)表起始地址DTAB其中,PC是查表指令MOVCA,@A+PC的下一條指令碼的起始地址。data值實(shí)際等于查表指令和數(shù)據(jù)表存放初始地址之間的字節(jié)數(shù)。(3)采用查表指令MOVCA,@A+PC完成查表。查表程序主要用于線性化處理、代碼轉(zhuǎn)換、代碼顯示、實(shí)時(shí)值的查表計(jì)算和按命令號(hào)實(shí)現(xiàn)轉(zhuǎn)移等。

注意:MOVCA,@A+DPTR指令可以實(shí)現(xiàn)64K地址范圍內(nèi)的數(shù)據(jù)查尋,而MOVCA,@A+PC指令只能實(shí)現(xiàn)256字節(jié)范圍內(nèi)的數(shù)據(jù)查尋。

[例4.7]

已知BLOCK1為起始地址的數(shù)據(jù)塊(數(shù)據(jù)塊長(zhǎng)度在LEN單元),數(shù)塊中每個(gè)存儲(chǔ)單元中的高、低4位分別為兩個(gè)十六進(jìn)制數(shù),請(qǐng)編程把它們轉(zhuǎn)換為相應(yīng)ASCII碼,并存放在BLOCK2開(kāi)始的連續(xù)存儲(chǔ)單元(低4位ASCII碼在前,高4位ASCII碼在后)。解:由于每個(gè)存儲(chǔ)單元中放有兩個(gè)十六進(jìn)制數(shù),因此每個(gè)存儲(chǔ)單元中十六進(jìn)制數(shù)應(yīng)分別轉(zhuǎn)換成ASCII碼。這就需要兩次使用查表指令MOVCA,@A+PC,這兩條查表指令在程序中位置是不相同的,故兩次對(duì)PC調(diào)整的值也不相同。在編程時(shí),可以先把整個(gè)程序編完,然后再計(jì)算兩條加法指令中的data修正值并填入相應(yīng)位置。相應(yīng)參考程序?yàn)椋?/p>

ORG1000HLENDATA30HBLOCK1DATA31HBLOCK2DATA51HMOVR0,#BLOCK1;BLOCK1送R0MOVR1,#BLOCK2;BLOCK2送R1LOOP:MOVA,@R0;取源數(shù)據(jù)塊中數(shù)

ANLA,#0FH;取出低4位

ADDA,#20

;第一次地址調(diào)整

MOVCA,@A+PC;第一次查表

MOV@R1,A;存第一次轉(zhuǎn)換結(jié)果2

MOVA,@R0;重新取出被轉(zhuǎn)換數(shù)2

SWAPA

;高4位調(diào)入低4位1

ANLA,#0FH

;取出低4位2

ADDA,#09

;第二次地址調(diào)整2

MOVCA,@A+PC

;第二次查表2

INCR1

;修改目的數(shù)據(jù)塊指針1

MOV@R1,A

;存第二次轉(zhuǎn)換結(jié)果2

INCR0

;修改源數(shù)據(jù)塊指針1

INCR1

;修改目的數(shù)據(jù)塊指針1

DJNZLEN,LOOP

;若未轉(zhuǎn)換完,則轉(zhuǎn)LOOP2SJMP$1ASCTAB:DB‘0’,’1’,’2’,’3’,’4’DB‘5’,’6’,’7’,’8’,’9’DB‘A’,’B’,’C’,’D’,’E’,’F’

END例:設(shè)有一巡回檢測(cè)報(bào)警裝置,需對(duì)16路輸入量進(jìn)行測(cè)量控制,每路有一個(gè)最大允許值。控制時(shí)根據(jù)測(cè)量的路數(shù),找出該路的最大允許值。測(cè)量的路數(shù)保存在R2中,最大值結(jié)果保存在R3R4中。解:利用查表程序完成。LTB: MOV A,R2 ADD A,R2 MOV R3,A ADD A,#6 MOVC A,@A+PC XCH A,R3 ADD A,#3 MOVC A,@A+PC MOV R4,A RETMAX: DW 1520,3721,445,7850 DW 3483,32657,883,9943 DW 1101,40511,6756,331 DW 4468,5871,13224,9981解:利用查表程序完成。LTB: MOV A,R2 ADD A,R2 MOV R3,A MOV DPTR,#MAX MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR MOV R4,A RETMAX: DW 1520,3721,445,7850 DW 3483,32657,883,9943 DW 1101,40511,6756,331 DW 4468,5871,13224,99814.5子程序和運(yùn)算程序設(shè)計(jì)

子程序和運(yùn)算程序是實(shí)用程序的兩大支柱程序,在匯編語(yǔ)言程序設(shè)計(jì)中占有極其重要的地位。4.5.1子程序設(shè)計(jì)

子程序是指完成確定任務(wù)并能為其他程序反復(fù)調(diào)用的程序段。

調(diào)用子程序的程序叫做主程序或稱調(diào)用程序。

例如:代碼轉(zhuǎn)換、通用算術(shù)及函數(shù)計(jì)算、外部設(shè)備的輸入/輸出驅(qū)動(dòng)程序等等,都可以編成子程序。

只要在主程序中安排程序的主要線索,在需要調(diào)用某個(gè)子程序時(shí)采用LCALL或ACALL調(diào)用指令,便可從主程序轉(zhuǎn)入相應(yīng)子程序執(zhí)行,CPU執(zhí)行到子程序末尾的RET返回指令,即可從子程序返回主程序斷點(diǎn)處執(zhí)行。在工程上,幾乎所有實(shí)用程序都是由許多子程序構(gòu)成的。子程序可以構(gòu)成子程序庫(kù),集中存放在某一存儲(chǔ)空間,任憑主程序隨時(shí)調(diào)用。采用子程序設(shè)計(jì)能使整個(gè)程序結(jié)構(gòu)簡(jiǎn)單,縮短程序設(shè)計(jì)時(shí)間,減少對(duì)存儲(chǔ)空間的占用。例如:如果某一實(shí)用程序需要10次調(diào)用某一子程序,那么只要在主程序的相應(yīng)地安排10條調(diào)用指令就可以避免把同一子程序編寫10遍,內(nèi)存空間幾乎可以減少9倍子程序的長(zhǎng)度。主程序和子程序是相對(duì)的,沒(méi)有主程序也不會(huì)有子程序。同一程序既可以作為另一程序的子程序,也可以有自己的子程序。即子程序是允許嵌套的,嵌套深度和堆棧區(qū)的大小有關(guān)??傊?,子程序是一種能完成某一專用任務(wù)的程序段,其資源需要為所有調(diào)用程序共享,因此,子程序在結(jié)構(gòu)上應(yīng)具有通用性和獨(dú)立性,在編寫子程序時(shí)應(yīng)注意以下問(wèn)題。使用注意事項(xiàng):

1)子程序的第一條指令地址稱為子程序的始地址或入口地址。該指令前必須有標(biāo)號(hào),標(biāo)號(hào)應(yīng)以子程序任務(wù)定名,以便一看就一目了然。例如:延時(shí)程序常以DELAY作為標(biāo)號(hào)。

2)主程序調(diào)用子程序是通過(guò)安排在主程序中的調(diào)用指令實(shí)現(xiàn)的,子程序返回主程序一般執(zhí)行安排在子程序末尾的一條RET返回指令。

3)主程序調(diào)用子程序和從子程序返回主程序,計(jì)算機(jī)能自動(dòng)保護(hù)和恢復(fù)主程序的斷點(diǎn)地址。但對(duì)于各工作寄存器、特殊功能寄存器和內(nèi)存單元中內(nèi)容,如果需要保護(hù)和恢復(fù),就必須在子程序開(kāi)頭和末尾(RET指令前)安排一些能夠保護(hù)和恢復(fù)它們的指令。

4)為使所編子程序可以放在64KB內(nèi)存的任何區(qū)域并能為主程序調(diào)用,子程序內(nèi)部一般使用相對(duì)轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,以便匯編時(shí)生成浮動(dòng)代碼。5)子程序參數(shù)可以分為入口和出口參數(shù)兩類:入口參數(shù)是指子程序需要的原始數(shù),由調(diào)用它的主程序通過(guò)約定的工作寄存器R0~R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧等預(yù)先傳送給子程序使用:出口參數(shù)是由子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù),應(yīng)由子程序通過(guò)約定的R0~R7、SFR、內(nèi)存單元或堆棧等傳遞給主程序使用。

傳送子程序參數(shù)的方法通常有以下幾種:

1)利用寄存器或片內(nèi)RAM傳送子程序參數(shù)對(duì)于某些簡(jiǎn)單子程序、入口參數(shù)和出口參數(shù)通常較少。常可采用本傳送參數(shù)的方式。例如:CPU可以預(yù)先在主程序中把乘數(shù)和被乘數(shù)送入R0~R7,轉(zhuǎn)入乘法子程序執(zhí)行后得到的乘積也可通過(guò)R0~R7傳送給主程序。

2)利用寄存器傳送子程序參數(shù)的地址如果上述方法不太方便,CPU也可在主程序中把子程序入口參數(shù)地址通過(guò)R0~R7傳送給子程序,子程序根據(jù)R0~R7中入口參數(shù)地址便可找到入口參數(shù)并對(duì)它們進(jìn)行相應(yīng)的操作,操作得到的出口參數(shù)也可把它們的地址通過(guò)寄存器R0~R7傳送給主程序。3)利用堆棧傳送子程序參數(shù)任何符合先進(jìn)后出或后進(jìn)先出原則的片內(nèi)RAM區(qū)都可稱為堆棧。堆棧中數(shù)據(jù)的存取是由堆棧指針SP指示的。因此,堆棧也可用來(lái)傳送子程序參數(shù)。例如:CPU可以通過(guò)主程序中的PUSH指令把入口參數(shù)壓入堆棧傳送給子程序,子程序的出口參數(shù)也可通過(guò)堆棧傳送給主程序。4)利用位地址傳送子程序參數(shù)如果子程序的入口參數(shù)是字節(jié)中的某些位,那么利用本方法傳送入口和出口參數(shù)也有方便之處,傳送參數(shù)過(guò)程和上述諸方法類似。子程序參數(shù)的上述傳遞方法也適用于中斷服務(wù)程序的編制。[例4.8]設(shè)MDA和MDB內(nèi)有兩個(gè)數(shù)據(jù)a和b,請(qǐng)編制出求c=a2+b2并把c送入MDC的程序,設(shè)a和b皆為小于10的整數(shù)。解:本程序由兩部分組成:主程序和子程序。主程序通過(guò)累加器A傳送子程序的入口參數(shù)a或b,子程序也通過(guò)累加器A傳送出口參數(shù)a或b給主程序,子程序?yàn)榍笠粋€(gè)數(shù)的平方的通用子程序。相應(yīng)程序如下:

ORG1000HMDADATA20HMDBDATA21HMDCDATA22HMOVA,MDA;入口參數(shù)a送AACALLSQR

;求a2

MOVR1,A

;a2送R1MOVA,MDB

;入口參數(shù)b送AACALLSQR

;求b2

ADDA,R1

;a2

+b2送AMOVMDC,A;存入MDC

SJMP$

;結(jié)束

SQR:ADDA,#01H

;地址調(diào)整

MOVCA,@A+PC;查平方表

RET

;返回

SQRTAB:DB0,1,4,9,16DB25,36,49,64,81

END

上述程序采用了查表法求一個(gè)數(shù)的平方,并且通過(guò)子程序調(diào)用實(shí)現(xiàn)了兩個(gè)數(shù)的平方求和,值得注意的是,上述程序僅適應(yīng)兩個(gè)數(shù)比較小,兩個(gè)數(shù)的平方和不大于用一個(gè)字節(jié)的數(shù)據(jù)表示。

[例4.9]

已知片內(nèi)RAM中有一個(gè)五位BCD碼(高位在前,低位在后),最大不超過(guò)65535,始地址在R0中,BCD碼位數(shù)減1(04H)已在R2中,請(qǐng)編出把BCD碼轉(zhuǎn)換為二進(jìn)制整數(shù)并存入R4R3中(R4中內(nèi)容為高8位)中的程序。解:本題只編出子程序,主程序從略。①算法

開(kāi)始保護(hù)現(xiàn)場(chǎng)R4R3R4R3×10,R0R0+1R4R3R4R3+(R0)R2-1=0?恢復(fù)現(xiàn)場(chǎng)結(jié)束

R4清零,R3萬(wàn)位BCD碼圖4-7例4-7程序流程

②參考程序入口參數(shù):BCD字節(jié)地址指針R0,指數(shù)冪R2中。出口參數(shù):AY值應(yīng)存于R4R3中(R4中為高字節(jié))。

ORG1000HBCDB:PUSHPSW;保護(hù)現(xiàn)場(chǎng)

PUSHACCPUSHBMOVR4,#00H;R4清令

MOVA,@R0MOVR3,A

;萬(wàn)位BCD碼送R3LOOP:MOVA,R3

;R3送AMOVB,#10MULAB

;A×10送BAMOVR3,A ;R3×10低位送R3MOVA,#10XCHA,B XCHA,R4 ;R3×10高位送R4 MUL AB ;R4×10ADDA,R4

XCH A,R3 INC R0 ADD A,@R0 XCH A,R3 ADDCA,#00H MOV

R4,A;完成R4R3R4R3+(R0)

DJNZR2,LOOP

;若未完,則轉(zhuǎn)LOOP執(zhí)行。

POPB

;恢復(fù)現(xiàn)場(chǎng)

POPACCPOPPSWRET

;返回程序中,R2中初值為位數(shù)n減1,對(duì)于五位BCD碼,R2中初值位4。4.5.2運(yùn)算程序設(shè)計(jì)運(yùn)算程序可分為浮點(diǎn)數(shù)運(yùn)算程序和定點(diǎn)數(shù)運(yùn)算程序兩大類。浮點(diǎn)數(shù)就是小數(shù)點(diǎn)不固定的數(shù),其運(yùn)算通常比較麻煩,常由階碼運(yùn)算和數(shù)值運(yùn)算兩部分組成;定點(diǎn)數(shù)就是小數(shù)點(diǎn)固定的數(shù),通常包括整數(shù)、小數(shù)和混合小數(shù)等,其運(yùn)算比較簡(jiǎn)單,但在數(shù)位相同時(shí)定點(diǎn)數(shù)的表示范圍比浮點(diǎn)數(shù)的小。以下只介紹定點(diǎn)數(shù)運(yùn)算程序設(shè)計(jì),若無(wú)特別說(shuō)明,則所有

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論