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

下載本文檔

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

文檔簡介

會計學(xué)1第04章匯編語言程序設(shè)計第4章匯編語言程序設(shè)計第一節(jié)匯編語言概述4.1匯編語言概述匯編語言是面向機(jī)器硬件的語言,要求程序設(shè)計者對MCS-51單片機(jī)具有很好的“軟,硬結(jié)合”的功底。第1頁/共67頁第4章匯編語言程序設(shè)計1.匯編語言與匯編的概念

1.機(jī)器語言(machinelanguage)2.匯編語言(assemblylanguage)由助記符、保留字和偽指令等組成,容易被人們識別、記憶和讀寫,也稱為符號語言或匯編語言。將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語言程序稱為匯編程序。經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語言程序稱為目標(biāo)程序,原來的匯編語言程序稱為源程序。3.高級語言(high-levellanguage)

第一節(jié)匯編語言概述第2頁/共67頁第4章匯編語言程序設(shè)計2.匯編語言源程序的格式

采用匯編語言編寫的程序稱為匯編語言源程序。程序不能被計算機(jī)直接識別和執(zhí)行,需人工或機(jī)器翻譯成機(jī)器語言才能被計算機(jī)執(zhí)行。為了使機(jī)器能識別和正確匯編,用戶在程序設(shè)計時必須嚴(yán)格遵循匯編語言格式和語法規(guī)則,才能編寫符合要求的匯編語言源程序。

對MCS-51來說,匯編語言源程序有兩種基本類型:指令語句和偽指令語句。

第一節(jié)匯編語言概述第3頁/共67頁第4章匯編語言程序設(shè)計(1)指令語句

已在第3章介紹每一條指令語句在匯編時都產(chǎn)生一個指令代碼――機(jī)器代碼。

(2)偽指令語句

是為匯編服務(wù)的,在匯編時沒有機(jī)器代碼與之對應(yīng)。第一節(jié)匯編語言概述第4頁/共67頁第4章匯編語言程序設(shè)計(3)MCS-51的匯編語言中每條語句典型的四分段格式

標(biāo)號字段:操作碼字段,操作數(shù)字段;注釋字段規(guī)則:標(biāo)號字段和操作字碼段之間要有冒號“:”相隔;2)操作碼字段和操作數(shù)字段間的分界符是空格;3)雙操作數(shù)之間用逗號相隔;4)操作數(shù)字段和注釋字段之間的分界符用分號“;”相隔。操作碼字段為必選項,其余各段為任選項。

第一節(jié)匯編語言概述第5頁/共67頁第4章匯編語言程序設(shè)計(3)MCS-51的匯編語言中每條語句典型的四分段格式

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

NOPHERE:SJMPHEREEND程序共由9條語句組成,第1、9兩條是指示性語句(偽指令),其余為指令性語句。第2、5兩條是四分段齊全的語句,第3、4、6、7等四條是缺省標(biāo)號段的語句,第7、9兩條只有操作碼字段。第一節(jié)匯編語言概述第6頁/共67頁第4章匯編語言程序設(shè)計(4)基本語法規(guī)則

1)標(biāo)號字段位于一條語句的開頭,是語句所在內(nèi)存單元地址的標(biāo)志符號。(1)標(biāo)號后邊必須跟以冒號“:”;(2)由1~8個ASCII字符組成(3)同一標(biāo)號在一個程序中只能定義一次(4)不能使用匯編語言已經(jīng)定義的符號作為標(biāo)號

第一節(jié)匯編語言概述第7頁/共67頁第4章匯編語言程序設(shè)計(4)基本語法規(guī)則

2)操作碼字段是指令的保留字(如上述程序中的MOV、ADD和NOP等),也可以是偽指令和宏指令的助記符(如ORG和END)。匯編語言指令中唯一不能空缺的部分,匯編程序就是根據(jù)這一字段來生成機(jī)器代碼的。

第一節(jié)匯編語言概述第8頁/共67頁第4章匯編語言程序設(shè)計(4)基本語法規(guī)則

3)操作數(shù)字段用于存放指令的操作數(shù)或操作數(shù)地址,可以采用字母和數(shù)字等形式。通常有單操作數(shù),雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。(1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示。(2)工作寄存器和特殊功能寄存器的表示。采用工作寄存器和特殊功能寄存器的代號來表示,也可用其地址來表示。(3)采用符號$。美元符號$常在轉(zhuǎn)移類指令的操作數(shù)字段中使用用于表示該轉(zhuǎn)移指令操作碼所在的存儲單元地址。4)注釋字段

第一節(jié)匯編語言概述第9頁/共67頁第4章匯編語言程序設(shè)計3.偽指令

指示性語句又稱偽指令,簡稱偽指令。每種匯編語言都有自己的偽指令,偽指令和指令是完全不同的,偽指令不是真正的指令。是用來對匯編語言過程進(jìn)行某種控制,或者對符號和標(biāo)號進(jìn)行賦值等,也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令,經(jīng)過匯編得到目標(biāo)程序(機(jī)器代碼),偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。

第一節(jié)匯編語言概述第10頁/共67頁第4章匯編語言程序設(shè)計(1)匯編起始地址偽指令ORG(ORiGin)

指令格式:ORG16位地址或標(biāo)號;規(guī)定下面的目標(biāo)程序的起始地址常用于匯編語言源程序或數(shù)據(jù)塊的開頭,用一條ORG偽指令來實現(xiàn)規(guī)定程序的起始地址。在一個源程序中,可以多次使用ORG指令,用來規(guī)定不同程序段的起始地址。但,規(guī)定的地址必須是從小到大,不容許各程序段之間地址重疊。一個源程序如不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。

例:

ORG3000HSTART:MOVA,#12H;規(guī)定標(biāo)號START代表地址為3000H開始存放。

第一節(jié)匯編語言概述第11頁/共67頁第4章匯編語言程序設(shè)計(2)

匯編結(jié)束偽指令END(ENDofassembly)

指令格式:END;

END標(biāo)號;END指令是匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。一個源程序只能有一個END命令,且位于程序的最后,在END以后寫的指令,匯編程序都不給予處理。第一節(jié)匯編語言概述第12頁/共67頁第4章匯編語言程序設(shè)計(3)定義字節(jié)命令DB(DefineByte)

指令格式:[標(biāo)號:]DB八位二進(jìn)制數(shù)表;從標(biāo)號指定的地址單元開始,定義若干個8位內(nèi)存單元的內(nèi)容。

例:

ORG3000HTABL:DB30H,31H,32H,33H,34H;0~4的ASCII碼匯編后:3000H=30H,3001H=31H,3002H=32H,3003H=33H,3004H=34H。第一節(jié)匯編語言概述第13頁/共67頁第4章匯編語言程序設(shè)計(4)定義數(shù)據(jù)字命令DW(DefineWord)

指令格式:[標(biāo)號:]DW十六位二進(jìn)制數(shù)表;從標(biāo)號指定的地址單元開始,定義若干個16位數(shù)據(jù)。一個16位數(shù)占據(jù)兩個內(nèi)存單元,其中,高8位存入低地址字節(jié),低8位存入高地址字節(jié)。

例:

ORG3010HTAB:DW1234H,5678H,2010H匯編后從3010H開始連續(xù)6個存儲單元的內(nèi)容為:3010H=12H,3011H=34H,3012H=56H,3013H=78H,3014H=20H,3015H=10H。

第一節(jié)匯編語言概述第14頁/共67頁第4章匯編語言程序設(shè)計(5)

賦值命令EQU(EQUate)

指令格式:變量名稱EQU數(shù)或匯編符號;將一個數(shù)或者特定的匯編符號賦予規(guī)定的變量名稱。

“變量名稱”不是標(biāo)號,不能用“:”來做分隔符。用EQU賦值以后的變量可以用做數(shù)據(jù)地址、代碼地址、位地址或者單做一個立即數(shù)來用。變量需賦值以后方可以使用,不能先使用后賦值。同時,變量名稱不能和匯編語言關(guān)鍵字同名。例:TESTEQU2010H表示標(biāo)號TEST=2010H,在匯編時,凡是遇到標(biāo)號TEST時,均以2000H來代替。

第一節(jié)匯編語言概述第15頁/共67頁第4章匯編語言程序設(shè)計4.源程序的匯編

匯編語言源程序“翻譯”成機(jī)器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類:(1)手工匯編

人工查表翻譯指令。但遇到的相對轉(zhuǎn)移指令的偏移量的計算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計算偏移量,不但麻煩,且容易出錯。兩次匯編過程。第一次匯編:確定地址,翻譯成各條機(jī)器碼,字符標(biāo)號原樣寫出;第二次匯編:標(biāo)號代真,將字符標(biāo)號用所計算出的具體地址值或偏移量代換。

第一節(jié)匯編語言概述第16頁/共67頁第4章匯編語言程序設(shè)計(2)機(jī)器匯編

用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個ASCII碼文件,擴(kuò)展名為“.ASM"”。然后在微計算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。兩次掃描過程。第一次掃描:檢查語法錯誤,確定符號名字;建立使用的全部符號名字表;每一符號名字后跟一對應(yīng)值(地址或數(shù))。第二次掃描:是在第一次掃描基礎(chǔ)上,將符號地址轉(zhuǎn)換成地址(代真);利用操作碼表將助記符轉(zhuǎn)換成相應(yīng)的目標(biāo)碼。

第一節(jié)匯編語言概述第17頁/共67頁第4章匯編語言程序設(shè)計第二節(jié)匯編語言程序的結(jié)構(gòu)4.2匯編語言程序的結(jié)構(gòu)1.匯編語言程序設(shè)計步驟匯編語言設(shè)計一個程序大致上可分為以下幾個步驟。

1)分析題意,明確要求。解決問題之前,首先要明確所要解決的問題和要達(dá)到的目的、技術(shù)指標(biāo)等。

2)確定算法。根據(jù)實際問題的要求、給出的條件及特點(diǎn),找出規(guī)律性,最后確定所采用的計算公式和計算方法,這就是一般所說的算法。算法是進(jìn)行程序設(shè)計的依據(jù),它決定了程序的正確性和程序的指令。

第18頁/共67頁第4章匯編語言程序設(shè)計1.匯編語言程序設(shè)計步驟3)畫程序流程圖,用圖解來描述和說明解題步驟。4)分配內(nèi)存工作單元,確定程序與數(shù)據(jù)區(qū)的存放地址。5)編寫源程序。6)程序優(yōu)化。7)

上機(jī)調(diào)試、修改和最后確定源程序。

第二節(jié)匯編語言程序的結(jié)構(gòu)第19頁/共67頁第4章匯編語言程序設(shè)計2.順序程序結(jié)構(gòu)

順序結(jié)構(gòu)程序是一種最簡單、最基本的程序(也稱為簡單程序),它是一種無分支的直線形程序,按照程序編寫的順序依次執(zhí)行。

第二節(jié)匯編語言程序的結(jié)構(gòu)例:編寫程序,將外部RAM單元中40H單元4位BCD數(shù)轉(zhuǎn)換成ASCII碼,送到內(nèi)部RAM單元60H61H之中。解:根據(jù)ASCII字符表,十進(jìn)制數(shù)09的ASCII碼和它的BCD碼之間僅相差30H,本題需要把一個字節(jié)的兩位BCD數(shù)進(jìn)行拆分,然后分別和30H相加,即得到相應(yīng)的ASCII碼。程序如下:

第20頁/共67頁第4章匯編語言程序設(shè)計2.順序程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)

ORG0000HADDR1DATA0040HADDR2EQUMOVDPTR,#ADDR1;源地址=>DPTRMOVR0,#ADDR2;目標(biāo)地址=>R0MOV@R0,#00H;目標(biāo)地址單元清零MOVXA,@DPTR;源地址單元中BCD數(shù)送AMOVB,A;ANLA,#0FH;ORLA,#30H;完成低位BCD數(shù)轉(zhuǎn)換MOV@R0,A;存入60HINCR0MOVA,BANLA,#0F0HSWAPA;高位BCD數(shù)送低4位ORLA,#30H;完成高位BCD數(shù)轉(zhuǎn)換MOV@R0,A;存入61HSJMP$END第21頁/共67頁第4章匯編語言程序設(shè)計3.分支程序結(jié)構(gòu)

分支程序的特點(diǎn)是改變程序的執(zhí)行順序,跳過一些指令,去執(zhí)行另外一些指令。應(yīng)注意:對每一個分支都要單獨(dú)編寫一段程序,每一分支的開始地址賦給一個標(biāo)號。在編寫分支程序時,關(guān)鍵是如何判斷分支的條件。在MCS-51系列單片機(jī)中可以直接用來判斷分支條件的指令并不多,只有累加器為零(或不為零)、比較條件轉(zhuǎn)移指令CJNE等,MCS-51單片機(jī)還提供了位條件轉(zhuǎn)移指令,如JC,JB等。把這些指令結(jié)合在一起使用,就可以完成各種各樣的條件判斷。

第二節(jié)匯編語言程序的結(jié)構(gòu)第22頁/共67頁第4章匯編語言程序設(shè)計3.分支程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:設(shè)計比較兩個無符號8位二進(jìn)制數(shù)大小,并將較大數(shù)存入高地址中的程序。設(shè)兩數(shù)分別存入30H和31H中。并設(shè)30H=42H,31H=30H。

解:程序流程圖如圖所示,為選擇結(jié)構(gòu)程序中的單分支程序流程圖。匯編語言程序如下:

第23頁/共67頁第4章匯編語言程序設(shè)計3.分支程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:ORG 0000H LJMP STAR ORG 2000HSTAR:MOV 30H,#42H ;30H←42H MOV 31H,#30H;31H←30HCLR C ;C←0MOV A,30H ;A←30H SUBB A,31H ;作減法比較兩數(shù)

JC NEXT ;31H≥30H轉(zhuǎn)

MOV A,30H ;30H大則

XCH A,31H;大數(shù)存入31H中

MOV 30H,A ;小數(shù)存入30H中NEXT:SJMP $END第24頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)順序程序和分支程序中的指令,最多只執(zhí)行一次。在實際問題中重復(fù)地做某些事的情況是很多的,用計算機(jī)來做這些事就要重復(fù)地執(zhí)行某些指令。重復(fù)地執(zhí)行某些指令,最好用循環(huán)程序?qū)崿F(xiàn)。第二節(jié)匯編語言程序的結(jié)構(gòu)第25頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)循環(huán)程序一般由4部分組成。(1)置循環(huán)初值。即設(shè)置循環(huán)過程中有關(guān)工作單元的初始值,如置循環(huán)次數(shù)、地址指針及工作單元清零等。(2)循環(huán)體。即循環(huán)的工作部分,完成主要的計算或操作任務(wù),是重復(fù)執(zhí)行的程序段。(3)循環(huán)修改。每循環(huán)一次,就要修改循環(huán)次數(shù)、數(shù)據(jù)及地址指針等。(4)循環(huán)控制。根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。

第二節(jié)匯編語言程序的結(jié)構(gòu)第26頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)第27頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:多個單字節(jié)數(shù)求知。已知有10個單字節(jié)數(shù),依次存放在內(nèi)部RAM40H單元開始的數(shù)據(jù)存儲區(qū)中,求和并將結(jié)果存人寄存器R2、R3中(高位存R2,低位存R3)。解:要重復(fù)進(jìn)行加法運(yùn)算,因此采用循環(huán)結(jié)構(gòu)程序。循環(huán)次數(shù)就是數(shù)據(jù)塊字節(jié)數(shù),這是已知的。在置初值時,將數(shù)據(jù)塊長度置人寄存器R5;將數(shù)據(jù)塊首地址送人寄存器R0,即以R0作為數(shù)據(jù)塊的地址指針,采用間接尋址方式:每做一次加法之后,修改地址指針,以便取出下一個數(shù)來相加,并且使計數(shù)器R5減l。到R5減為0時,求和結(jié)束。

:第28頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:

ORG2000H

SUM:MOVR0,#40H;設(shè)地址指針

MOVR5,#0AH;計數(shù)器初值送R5SUM:MOVA,#00H

MOVR2,A

LP:ADDA,@R0

JNCLP1

INCR2;若有進(jìn)位,和的高八位+1LP1:INCR0;地址指針+1

DJNZR5,LP;判循環(huán)結(jié)束條件

MOVR3,A;存和的低八位

END

第29頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:

ORG2000H

SUM:MOVR0,#40H;設(shè)地址指針

MOVR5,#0AH;計數(shù)器初值送R5SUM:MOVA,#00H

MOVR2,A

LP:ADDA,@R0

JNCLP1

INCR2;若有進(jìn)位,和的高八位+1LP1:INCR0;地址指針+1

DJNZR5,LP;判循環(huán)結(jié)束條件

MOVR3,A;存和的低八位

END

第30頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:已知內(nèi)部RAM的BLOCK單元開始有一無符號數(shù)據(jù)塊,塊長在LEN單元。請編出求數(shù)據(jù)塊中各數(shù)累加和、并存入SUM單元的程序。

為了使讀者對兩種循環(huán)結(jié)構(gòu)有一個全面了解,以便進(jìn)行分析比較,現(xiàn)給出兩種設(shè)計方案。求累加和參考程序:

第31頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:1.先判斷后處理(見圖4-6(a))

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;塊長送R2MOVR1,#BLOCK;塊始地址送R1INCR2;塊長+1SJMPCHECKLOOP:ADDA,@R1;A+(R1)送AINCR1;修改數(shù)據(jù)塊指針R1CHECK:DJNZR2,LOOP;若未完,則轉(zhuǎn)LOOPMOVSUM,A;存累加和

SJMP$END第32頁/共67頁第4章匯編語言程序設(shè)計4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:2.先處理后判斷(見圖4-6(b))

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;塊長送R2MOVR1,#BLOCK;數(shù)據(jù)始地址送R1NEXT:ADDA,@R1;A+(R1)送AINCR1;修改數(shù)據(jù)塊指針R1DJNZR2,NEXT;若未完,則轉(zhuǎn)NEXTMOVSUM,A;存累加和

SJMP$END第33頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

匯編語言編程時,應(yīng)考慮到恰當(dāng)?shù)厥褂米映绦颍拐麄€程序的結(jié)構(gòu)清楚,而且閱讀和理解方便。使用子程序還可以減少源程序和目標(biāo)程序的長度。在多次調(diào)用同樣的程序段時,采用子程序就不必每次重復(fù)書寫同樣的指令,而只需書寫一次。當(dāng)然從程序的執(zhí)行來看,每調(diào)用一次子程序都要附加保護(hù)斷點(diǎn)、進(jìn)棧和出棧等操作,增加程序的執(zhí)行時間。但一般來說,付出這些代價總是值得的。

在匯編語言源程序中使用子程序時,一般要注意兩個問題:參數(shù)傳遞和現(xiàn)場保護(hù)第二節(jié)匯編語言程序的結(jié)構(gòu)第34頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)參數(shù)傳遞一般可采用以下方法:·傳遞數(shù)據(jù)?!魉偷刂贰!ねㄟ^堆棧傳遞參數(shù)?!ねㄟ^位地址傳送參數(shù)。第35頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)例:設(shè)計一程序,由它的主程序循環(huán)調(diào)用子程序SHY。子程序SHY使連接到單片機(jī)P1口上的8個LED燈中的某個閃爍5次。主程序中的指令RLA將確定某個LED燈閃爍。

解:本例中的子程序入口地址是標(biāo)號SHY地址,子程序返回指令是RET,主程序調(diào)用該子程序的調(diào)用指令是ACALLSKY。為觀察到LED燈的閃爍,要求狀態(tài)時鐘信號頻率低,為此,單片機(jī)可采用頻率很低的外部振蕩器信號。

第36頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)解:ORG0000HMOVA,#0FEH;燈亮初值STAR:ACALLSKY ;調(diào)用閃爍子程序

RLA;左移

SJMPSTAR;短跳到STAR,循環(huán);以上程序段為主程序,以下程序段為子程序,標(biāo)號SHY為其入口SKY:MOVR2,#5;閃爍子程序,閃爍5次計數(shù)SKY1:MOVP1,A;點(diǎn)亮

NOP;延時

MOVPL,#0FFH;熄滅

NOP ;延時

DJNZR2,SHY1;循環(huán)

RET ;子程序返回

END第37頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)例:將內(nèi)部數(shù)據(jù)存儲器某一單元中的一個字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部數(shù)據(jù)存儲器的兩個連續(xù)單元中。假設(shè)一個字節(jié)的十六進(jìn)制數(shù)在內(nèi)部數(shù)據(jù)存儲器40H單元,結(jié)果存于41H、42H單元中,用堆棧進(jìn)行參數(shù)傳遞。

第38頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)解:

MAIN:MOVSP,#55H

MOVR1,#41H;R1為存結(jié)果指針

MOVA,40H;取要轉(zhuǎn)換的數(shù)據(jù)

SWAPA;先轉(zhuǎn)換高位字節(jié)

PUSHACC;壓棧

LCALLHEASC;調(diào)用低半字節(jié)轉(zhuǎn)換成

第39頁/共67頁第4章匯編語言程序設(shè)計5.主程序調(diào)用子程序結(jié)構(gòu)

第二節(jié)匯編語言程序的結(jié)構(gòu)解:ASCII碼程序

POPACC;要轉(zhuǎn)換的數(shù)據(jù)出棧

MOV@R1,A;存高半字節(jié)轉(zhuǎn)換結(jié)果

INCR1

PUSH40H

LCALLHEASC

POPACC

MOV@R1,A;存低半字節(jié)轉(zhuǎn)換結(jié)果

ENDHEASC:MOVR0,SP

DECR0

DECR0

XCHA,@R0;取被轉(zhuǎn)換數(shù)據(jù)

ANDA,#0FH;保留低半字節(jié)

ADDA,#2;修改A

MOVCA,@A+PC;查表

XCHA,@R0;結(jié)果送回堆棧

RETTAB:DB30H,31H,32H,…第40頁/共67頁第4章匯編語言程序設(shè)計第三節(jié)算術(shù)運(yùn)算程序設(shè)計4.3算術(shù)運(yùn)算程序設(shè)計1.加法程序51指令系統(tǒng)中有加、減、乘、除、加1、減1等指令,可通過設(shè)計程序來處理一般不大復(fù)雜的算術(shù)運(yùn)算。設(shè)計中要注意程序執(zhí)行對PSW的影響。

多字節(jié)加、減運(yùn)算是應(yīng)用程序設(shè)計中經(jīng)常要進(jìn)行的一種運(yùn)算,加、減運(yùn)算程序可以分為無符號多字節(jié)數(shù)加減運(yùn)算和帶符號多字節(jié)數(shù)加減運(yùn)算程序兩種。第41頁/共67頁第4章匯編語言程序設(shè)計1.加法程序例:兩個無符號雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放在內(nèi)部存儲器40H(高位字節(jié))、41H(低位字節(jié))單元,加數(shù)存放在內(nèi)部存儲器50H(高位字節(jié))、51H(低位字節(jié))單元,和存入40H(高位字節(jié))、41H(低位字節(jié))單元。

第三節(jié)算術(shù)運(yùn)算程序設(shè)計第42頁/共67頁第4章匯編語言程序設(shè)計1.加法程序解:ORG

0000H

CLR

C;將C清零

MOV

R0,#41H;送被加數(shù)首址

MOV

R1,#51H;送加數(shù)首址

MOV

A,@R0;取被加數(shù)低字節(jié)

ADD

A,@R1;兩個低字節(jié)相加

MOV

@R0,A;低字節(jié)和存人被加數(shù)低字節(jié)

DEC

R0;修改指針,指向被加數(shù)高字節(jié)

DEC

R1;修改指針,指向加數(shù)高字節(jié)

MOV

A,@R0;取被加數(shù)高字節(jié)

ADDC

A,@R1;高字節(jié)相加

MOV

@R0,A;存結(jié)果

END

第三節(jié)算術(shù)運(yùn)算程序設(shè)計第43頁/共67頁第4章匯編語言程序設(shè)計1.加法程序例:設(shè)在BLOCK和BLOCK+1單元中有兩個補(bǔ)碼形式的帶符號數(shù)。請編出求兩數(shù)之和,并把它放在SUM和SUM+1單元(低8位在SUM單元)的子程序。

解:在兩個8位二進(jìn)制帶符號數(shù)相加時,其和很可能會超過8位數(shù)能表示的范圍而需要采用16位數(shù)形式來表示,因此,在進(jìn)行加法時,可以預(yù)先把這兩個加數(shù)擴(kuò)張成16位二進(jìn)制補(bǔ)碼形式,然后對它完成雙字節(jié)相加。

因此,一個8位二進(jìn)制正數(shù)擴(kuò)張成16位時只要把它的高8位變成全“0”,一個8位二進(jìn)制負(fù)數(shù)擴(kuò)張成16位時需要把它的高8位變成全“1”。據(jù)此,我們在編程時應(yīng)在加減運(yùn)算前先對加數(shù)和被加數(shù)進(jìn)行擴(kuò)張,然后完成求和。設(shè)R2和R3分別用來存放被加數(shù)和加數(shù)高8位

第三節(jié)算術(shù)運(yùn)算程序設(shè)計第44頁/共67頁第4章匯編語言程序設(shè)計1.加法程序解:ORG1000HSBADD:PUSHACCPUSHPSW;保護(hù)現(xiàn)場

MOVPSW,#08H MOVR0,#BLOCK;R0指向一個加數(shù)

MOVR1,#SUM;R1指向和單元

MOVR2,#00H;高位先令其為零

MOVR3,#00HMOVA,@R0;一個加數(shù)

JNBACC.7,POS1;若為正數(shù),則轉(zhuǎn)POS1MOVR2,#0FFH;若為負(fù)數(shù),則全“1”送R2第三節(jié)算術(shù)運(yùn)算程序設(shè)計第45頁/共67頁第4章匯編語言程序設(shè)計1.加法程序POS1:INCR0;R0指向下一個加數(shù)

MOVB,@R0;取第二加數(shù)到BJNBB.7,POS2;若是正數(shù),則轉(zhuǎn)POS2MOVR3,#0FFH;若是負(fù)數(shù),則全“1”送R3POS2:ADDA,B;低8位相加

MOV@R1,A;存低8位和

INCR1;R1指向SUM+1單元

MOVA,R2ADDCA,R3;完成高8位求和

MOV@R1,A;存高8位和

POPPSW;恢復(fù)現(xiàn)場

POPACCRETEND第三節(jié)算術(shù)運(yùn)算程序設(shè)計第46頁/共67頁第4章匯編語言程序設(shè)計2.減法程序例:已知BLOCK1和BLOCK2為起始地址的存儲區(qū)中分別有5字節(jié)無符號被減數(shù)和減數(shù)(低位在前,高位在后)。請編制一個減法子程序,令它們相減,并把差值放入BLOCK1為起始地址的存儲單元。解:用減法指令從低字節(jié)開始相減。相應(yīng)程序為:

第三節(jié)算術(shù)運(yùn)算程序設(shè)計第47頁/共67頁第4章匯編語言程序設(shè)計2.減法程序解:ORG1000HSBYTESUB:MOVR0,#BLOCK1;被減數(shù)始址送R0MOVR1,#BLOCK2;減數(shù)始址送R1MOVR2,#05H;字長送R2LOOP:CLRC;Cy清零

MOVA,@R0;被減數(shù)送ASUBBA,@R1;相減

MOV@R0,A;存差

INCR0;修改被減數(shù)地址指針

INCR1;修改減數(shù)地址指針

DJNZR2,LOOP;若未完,則LOOPRETEND第三節(jié)算術(shù)運(yùn)算程序設(shè)計第48頁/共67頁第4章匯編語言程序設(shè)計2.減法程序MCS-51指令系統(tǒng)中只有十進(jìn)制加法調(diào)整指令DAA,也即該指令只有在加法指令(ADD、ADDC)后,才能得到正確的結(jié)果。為了用十進(jìn)制加法調(diào)整指令對十進(jìn)制減法進(jìn)行調(diào)整,必須采用補(bǔ)碼相加的辦法,用9AH減去減數(shù)即得到以十為模的減數(shù)的補(bǔ)碼。例:多字節(jié)十進(jìn)制BCD碼減法子程序如下:

入口:被減數(shù)低字節(jié)地址在R1,減數(shù)低字節(jié)地址在R0,字節(jié)數(shù)在R2。出口:差(補(bǔ)碼)的低字節(jié)地址在R0,字節(jié)數(shù)在R3。07H為符號位,“0”為正,“1”為負(fù)。第三節(jié)算術(shù)運(yùn)算程序設(shè)計第49頁/共67頁第4章匯編語言程序設(shè)計2.減法程序程序為:ORG1000HSBCD:MOVR3,#00H;差字節(jié)數(shù)置0CLR07H;符號位清0CLRC;借位位清0SBCD1:MOVA,#9AH;減數(shù)對100求補(bǔ)碼

SUBBA,@R0ADDA,@R1;補(bǔ)碼相加

DAA;十進(jìn)制相加調(diào)整

MOV@R0,A;存結(jié)果

INCR0;地址值增加1INCR1INCR3;差字節(jié)增加1CPLC;進(jìn)位位求反,以形成正確的借位

DJNZR2,SBCD1;未減完,轉(zhuǎn)SBCD1,繼續(xù)

JNCSBCD2;無借位,轉(zhuǎn)SBCD2SETB07H;有借位,置“1”符號位SBCD2:RET;返回主程序第三節(jié)算術(shù)運(yùn)算程序設(shè)計第50頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序例:設(shè)R0和R1中有兩個補(bǔ)碼形式的帶符號數(shù),試編寫出求兩數(shù)之積并把積送入R3R2(R3內(nèi)為積的高8位)中的程序。

解:MCS-51乘法指令是對兩個無符號數(shù)求積的。若要對兩個帶符號數(shù)求積,則可采用對符號位單獨(dú)處理的辦法。相應(yīng)處理步驟如下:單獨(dú)處理被乘數(shù)和乘數(shù)的符號位。求被乘數(shù)和乘數(shù)的絕對值,并使兩絕對值相乘而獲得積的絕對值。對積進(jìn)行處理。若積為正,則對積不作處理;若它為負(fù),則對積求補(bǔ),使之變?yōu)檠a(bǔ)碼形式。

8位帶符號數(shù)乘法程序如下:第三節(jié)算術(shù)運(yùn)算程序設(shè)計第51頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘數(shù)送ARLCA;被乘數(shù)符號送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘數(shù)送ARLCA;乘數(shù)符號送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;積的符號位送CyMOVSBIT,C;送入SBITMOVA,R0;處理被乘數(shù)

JNBSBIT1,NCH1;若它為正,則轉(zhuǎn)NCH1CPLA;若它為負(fù),則求補(bǔ)得絕對值

INCA第三節(jié)算術(shù)運(yùn)算程序設(shè)計第52頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序續(xù)解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘數(shù)送ARLCA;被乘數(shù)符號送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘數(shù)送ARLCA;乘數(shù)符號送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;積的符號位送CyMOVSBIT,C;送入SBITMOVA,R0;處理被乘數(shù)

JNBSBIT1,NCH1;若它為正,則轉(zhuǎn)NCH1CPLA;若它為負(fù),則求補(bǔ)得絕對值

INCA第三節(jié)算術(shù)運(yùn)算程序設(shè)計第53頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序續(xù):NCH1:MOVB,A;被乘數(shù)絕對值送BMOVA,R1;處理乘數(shù)

JNBSBIT2,NCH2;若它為正,則轉(zhuǎn)NCH2CPLA;若它為負(fù),則求補(bǔ)得絕對值

ADDA,#01HNCH2:MULAB;求積的絕對值

JNBSBIT,NCH3;若它為正,則轉(zhuǎn)NCH3CPLA;若它為負(fù),則低字節(jié)求補(bǔ)

ADDA,#01HNCH3:MOVR2,A;積的低字節(jié)存入R2MOVA,B;積的高字節(jié)送AJNBSBIT,NCH4;若它為正,則轉(zhuǎn)NCH4CPLA;若它為負(fù),則高字節(jié)求補(bǔ)

ADDCA,#00HNCH4:MOVR3,A;積的高字節(jié)存入R3SJMP$;結(jié)束

END第三節(jié)算術(shù)運(yùn)算程序設(shè)計第54頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序例:多字節(jié)無符號BCD碼除法子程序如下:入口:30H為被除數(shù)低字節(jié)地址

40H為除數(shù)低字節(jié)地址

R3存除數(shù)字節(jié)數(shù)出口:50H為商低字節(jié)地址

30H為余數(shù)低字節(jié)地址

74存商字節(jié)數(shù)第三節(jié)算術(shù)運(yùn)算程序設(shè)計第55頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序解:ORG2000HDIVB:MOVR0,#40H;除數(shù)低字節(jié)地址送R0MOV74H,#01H;商字節(jié)數(shù)賦初值

MOV73H,R3;除數(shù)字節(jié)數(shù)送73HDIV1:MOVA,@R0;判除數(shù)為0?

JNZDIV2;除數(shù)非0,轉(zhuǎn)DIV2INCR0;除數(shù)為0,轉(zhuǎn)DIV4,返回主程序

DJNZR3,DIV1SJMPDIV4DIV2:MOV R3,73H MOV R0,#50HDIV3:MOV@R0,#00H;商單元清0INCR0DJNZR3,DIV3MOVR3,73H;除數(shù)BCD碼取補(bǔ)

MOVR0,#40HMOVR1,#60HCLRCMOVA,#9AH

第三節(jié)算術(shù)運(yùn)算程序設(shè)計第56頁/共67頁第4章匯編語言程序設(shè)計3.乘除法程序續(xù):DIV5:SUBBA,@R0MOV@R1,AINCR1INCR0MOVA,#99HDJNZR3,DIV5DIV6:MOVR0,#30H;被除數(shù)與除數(shù)補(bǔ)碼相加

MOVR3,73HMOVR1,#60HMOVR5,74H第三節(jié)算術(shù)運(yùn)算程序設(shè)計第57頁/共67頁第4章匯編語言程序設(shè)計第四節(jié)非數(shù)值操作程序設(shè)計4.4非數(shù)值操作程序設(shè)計

1.碼制轉(zhuǎn)換程序在單片機(jī)應(yīng)用程序的設(shè)計中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問題。在單片機(jī)系統(tǒng)內(nèi)部進(jìn)行數(shù)據(jù)計算和存儲時,多采用二進(jìn)制碼。二進(jìn)制碼具有運(yùn)算方便、存儲量小的特點(diǎn)。在輸入/輸出中,按照人的習(xí)慣多采用代表十進(jìn)制數(shù)的BCD碼(用4位二進(jìn)制數(shù)表示的十進(jìn)制數(shù))表示。第58頁/共67頁第4章匯編語言程序設(shè)計1.碼制轉(zhuǎn)換程序1)二進(jìn)制(或十六進(jìn)制)數(shù)轉(zhuǎn)換成BCD碼十進(jìn)制數(shù)常用BCD碼表示。而BCD碼又有兩種形式:一種是1個字節(jié)放1位BCD碼,一種是壓縮的BCD碼,【例4-17】將單字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼第四節(jié)非數(shù)值操作程序設(shè)計第59頁/共67頁第4章匯編語言程序設(shè)計1.碼制轉(zhuǎn)換程序解:ORG0000H MOV A,#89H ;十六進(jìn)制數(shù)89H送A中

MOV B,#100 ;100作為除數(shù)送入B中

DIV AB ;十六進(jìn)制除以100 MOV R3,A ;百位數(shù)送R3,余數(shù)在B中

MOV A,#10 ;分離十位和個位數(shù)

XCH A,B;余數(shù)送入A中,除數(shù)10在B中

DIV AB ;分離出十位在A中個位在B中

SWAP A ;十位數(shù)交換到A中的高

溫馨提示

  • 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

提交評論