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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

已在第3章介紹每一條指令語句在匯編時都產生一個指令代碼――機器代碼。

(2)偽指令語句

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

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

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

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

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

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

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

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

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

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

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

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

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

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

例:

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

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

匯編結束偽指令END(ENDofassembly)

指令格式:END;

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

指令格式:[標號:]DB八位二進制數表;從標號指定的地址單元開始,定義若干個8位內存單元的內容。

例:

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

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

例:

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

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

賦值命令EQU(EQUate)

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

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

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

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

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

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

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

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

1)分析題意,明確要求。解決問題之前,首先要明確所要解決的問題和要達到的目的、技術指標等。

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

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

上機調試、修改和最后確定源程序。

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

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

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

第20頁/共67頁第4章匯編語言程序設計2.順序程序結構

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

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

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

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

解:程序流程圖如圖所示,為選擇結構程序中的單分支程序流程圖。匯編語言程序如下:

第23頁/共67頁第4章匯編語言程序設計3.分支程序結構第二節(jié)匯編語言程序的結構解: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 ;作減法比較兩數

JC NEXT ;31H≥30H轉

MOV A,30H ;30H大則

XCH A,31H;大數存入31H中

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

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

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

ORG2000H

SUM:MOVR0,#40H;設地址指針

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

MOVR2,A

LP:ADDA,@R0

JNCLP1

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

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

MOVR3,A;存和的低八位

END

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

ORG2000H

SUM:MOVR0,#40H;設地址指針

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

MOVR2,A

LP:ADDA,@R0

JNCLP1

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

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

MOVR3,A;存和的低八位

END

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

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

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

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

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

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

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

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

SJMP$END第33頁/共67頁第4章匯編語言程序設計5.主程序調用子程序結構

匯編語言編程時,應考慮到恰當地使用子程序,使整個程序的結構清楚,而且閱讀和理解方便。使用子程序還可以減少源程序和目標程序的長度。在多次調用同樣的程序段時,采用子程序就不必每次重復書寫同樣的指令,而只需書寫一次。當然從程序的執(zhí)行來看,每調用一次子程序都要附加保護斷點、進棧和出棧等操作,增加程序的執(zhí)行時間。但一般來說,付出這些代價總是值得的。

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

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

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

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

第36頁/共67頁第4章匯編語言程序設計5.主程序調用子程序結構

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

RLA;左移

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

NOP;延時

MOVPL,#0FFH;熄滅

NOP ;延時

DJNZR2,SHY1;循環(huán)

RET ;子程序返回

END第37頁/共67頁第4章匯編語言程序設計5.主程序調用子程序結構

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

第38頁/共67頁第4章匯編語言程序設計5.主程序調用子程序結構

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

MAIN:MOVSP,#55H

MOVR1,#41H;R1為存結果指針

MOVA,40H;取要轉換的數據

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

PUSHACC;壓棧

LCALLHEASC;調用低半字節(jié)轉換成

第39頁/共67頁第4章匯編語言程序設計5.主程序調用子程序結構

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

POPACC;要轉換的數據出棧

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

INCR1

PUSH40H

LCALLHEASC

POPACC

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

ENDHEASC:MOVR0,SP

DECR0

DECR0

XCHA,@R0;取被轉換數據

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

ADDA,#2;修改A

MOVCA,@A+PC;查表

XCHA,@R0;結果送回堆棧

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

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

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

0000H

CLR

C;將C清零

MOV

R0,#41H;送被加數首址

MOV

R1,#51H;送加數首址

MOV

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

ADD

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

MOV

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

DEC

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

DEC

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

MOV

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

ADDC

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

MOV

@R0,A;存結果

END

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

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

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

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

MOVPSW,#08H MOVR0,#BLOCK;R0指向一個加數

MOVR1,#SUM;R1指向和單元

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

MOVR3,#00HMOVA,@R0;一個加數

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

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

MOV@R1,A;存低8位和

INCR1;R1指向SUM+1單元

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

MOV@R1,A;存高8位和

POPPSW;恢復現場

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

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

MOVA,@R0;被減數送ASUBBA,@R1;相減

MOV@R0,A;存差

INCR0;修改被減數地址指針

INCR1;修改減數地址指針

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

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

SUBBA,@R0ADDA,@R1;補碼相加

DAA;十進制相加調整

MOV@R0,A;存結果

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

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

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

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

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

JNBSBIT1,NCH1;若它為正,則轉NCH1CPLA;若它為負,則求補得絕對值

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

JNBSBIT1,NCH1;若它為正,則轉NCH1CPLA;若它為負,則求補得絕對值

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

JNBSBIT2,NCH2;若它為正,則轉NCH2CPLA;若它為負,則求補得絕對值

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

JNBSBIT,NCH3;若它為正,則轉NCH3CPLA;若它為負,則低字節(jié)求補

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

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

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

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

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

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

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

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

JNZDIV2;除數非0,轉DIV2INCR0;除數為0,轉DIV4,返回主程序

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

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

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

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

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

MOV B,#100 ;100作為除數送入B中

DIV AB ;十六進制除以100 MOV R3,A ;百位數送R3,余數在B中

MOV A,#10 ;分離十位和個位數

XCH A,B;余數送入A中,除數10在B中

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

SWAP A ;十位數交換到A中的高

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論