單片機(jī)原理及接口技術(shù) 第四章 匯編語(yǔ)言程序設(shè)計(jì)-4學(xué)習(xí)資料_第1頁(yè)
單片機(jī)原理及接口技術(shù) 第四章 匯編語(yǔ)言程序設(shè)計(jì)-4學(xué)習(xí)資料_第2頁(yè)
單片機(jī)原理及接口技術(shù) 第四章 匯編語(yǔ)言程序設(shè)計(jì)-4學(xué)習(xí)資料_第3頁(yè)
單片機(jī)原理及接口技術(shù) 第四章 匯編語(yǔ)言程序設(shè)計(jì)-4學(xué)習(xí)資料_第4頁(yè)
單片機(jī)原理及接口技術(shù) 第四章 匯編語(yǔ)言程序設(shè)計(jì)-4學(xué)習(xí)資料_第5頁(yè)
已閱讀5頁(yè),還剩54頁(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)介

第四章匯編語(yǔ)言程序設(shè)計(jì)程序編制的方法4.1源程序的編輯和匯編4.2程序基本結(jié)構(gòu)4.3常用程序舉例4.41程序設(shè)計(jì):

為完成特定的工作任務(wù)而組織起來(lái)的指令序列稱為程序,編排這一指令序列的過(guò)程稱為程序設(shè)計(jì)。第四章匯編語(yǔ)言程序設(shè)計(jì)*34.1

程序編制的方法4.1.1程序編制的步驟一、任務(wù)分析二、確定算法及優(yōu)化三、程序總體設(shè)計(jì)及流程圖繪制4.1

程序編制的方法4.1程序編制的方法四、合理分配寄存器和存儲(chǔ)空間

寄存器定義具體用途,堆棧的設(shè)置,程序及數(shù)據(jù)存放的區(qū)域。五、編制匯編源程序

正確使用各種指令,層次分明的編寫匯編源程序*64.1.2匯編語(yǔ)言的語(yǔ)句格式語(yǔ)句行由四個(gè)字段組成:

[標(biāo)號(hào):]操作碼操作數(shù)

[;注釋]

LOOP1:MOVA,20H;A←(20H)

括號(hào)內(nèi)的部分可以根據(jù)實(shí)際情況取舍;每個(gè)字段之間要用分隔符分隔;分隔符可以有冒號(hào)、空格、逗號(hào)、分號(hào)等。4.1

程序編制的方法*7一、標(biāo)號(hào)

標(biāo)號(hào)是語(yǔ)句地址的標(biāo)志符號(hào),用于引導(dǎo)對(duì)該語(yǔ)句的非順序訪問(wèn)。有關(guān)標(biāo)號(hào)的規(guī)定為:二、操作碼、操作數(shù)由指令助記符表示形式?jīng)Q定。

由1~8個(gè)ASCII字符組成。第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;不能使用已經(jīng)定義了的符號(hào)作為標(biāo)號(hào)。如指令助記符、寄存器符號(hào)名稱等;4.1

程序編制的方法*8三、數(shù)據(jù)的表示形式數(shù)據(jù)可以有以下幾種表示形式二進(jìn)制數(shù),末尾以字母B標(biāo)識(shí)。如:10001111B;

十進(jìn)制數(shù),末尾以字母D標(biāo)識(shí)或省略。如:88D,66;

十六進(jìn)制數(shù),末尾以字母H標(biāo)識(shí)。如:78H,0A8H;注意:十六進(jìn)制數(shù)以字母開頭時(shí)應(yīng)在其前面加上數(shù)字“0”;

ASCII碼以單引號(hào)括起來(lái)標(biāo)識(shí)。如:‘AB’,‘1245’

四、注釋

注釋只是對(duì)語(yǔ)句的說(shuō)明。注釋可增加程序的可讀性。注釋必須以分號(hào)開頭,長(zhǎng)度不限;換行書寫,新行開頭也要使用分號(hào)“;”。4.1

程序編制的方法*94.2源程序的編輯和匯編

一、源程序的編輯

源程序的編寫要依據(jù)80C51匯編語(yǔ)言的基本規(guī)則,特別要用好常用的匯編命令(即偽指令)。例如:

ORG0040HMOVA,#7FHMOVR1,#44HEND

這里的ORG和END是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程序應(yīng)以“.ASM”擴(kuò)展名存盤,以備匯編程序調(diào)用。

4.2.1源程序的編輯與匯編*10二、源程序的匯編

將匯編語(yǔ)言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形式的目標(biāo)程序的過(guò)程叫匯編。常用的方法有兩種:手工匯編:通過(guò)手工方式查指令編碼表,逐個(gè)把助記符指令翻譯成機(jī)器碼。機(jī)器匯編:使用交叉匯編程序?qū)R編語(yǔ)言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。4.2源程序的編輯和匯編*11

偽指令是匯編程序能夠識(shí)別并對(duì)匯編過(guò)程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒(méi)有對(duì)應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會(huì)再出現(xiàn)偽指令。4.2.2偽指令一、起始地址設(shè)定ORG格式為:ORG

表達(dá)式

功能:向匯編程序說(shuō)明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。

4.2源程序的編輯和匯編*12二、匯編結(jié)束END格式為:

END

功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?.2源程序的編輯和匯編*13

源程序經(jīng)過(guò)機(jī)器匯編后,形成的若干文件中含有兩個(gè)主要文件,一是列表文件,另一個(gè)是目標(biāo)碼文件。但主要信息如下:列表文件:地址目標(biāo)碼匯編程序

ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標(biāo)碼文件:首地址末地址目標(biāo)碼0040H0044H747F79444.2源程序的編輯和匯編*14三、定義字節(jié)DB[標(biāo)號(hào):]DB

字節(jié)數(shù)據(jù)表

功能是從標(biāo)號(hào)指定的地址開始,在ROM中定義字節(jié)數(shù)據(jù)。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的單元中。例如:

5000H:DB-2,-4,-6,8,10,18把6個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制表示(FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H),并連續(xù)地存放在以5000H為起始地址的6個(gè)單元中。

4.2源程序的編輯和匯編*15四、定義字DW[標(biāo)號(hào):]DW

字?jǐn)?shù)據(jù)表

功能是從標(biāo)號(hào)指定的地址單元開始,在ROM中定義字。該偽指令將字或字表中的數(shù)據(jù)按從左到右的順序依次存放在指定的存儲(chǔ)單元中。注意:高8位存放在低地址單元,低8位存放在高地址單元。例如:

ORG1400HDATA:DW324AH,3CH……

匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。4.2源程序的編輯和匯編*16五、空間定義DS[標(biāo)號(hào):]DS

表達(dá)式

功能是從標(biāo)號(hào)指定的地址單元開始,在程序存儲(chǔ)器中保留由表達(dá)式所指定個(gè)數(shù)的存儲(chǔ)單元作為備用的空間,并都填以零值。例如:

ORG3000HBUF:DS50……

匯編后,從地址3000H開始保留50個(gè)存儲(chǔ)單元作為備用單元。

4.2源程序的編輯和匯編*17六、賦值EQU符號(hào)名EQU

表達(dá)式功能是將表達(dá)式的值或特定的某個(gè)匯編符號(hào)定義為一個(gè)指定的符號(hào)名。例如:

4.2源程序的編輯和匯編

LENEQU

10SUMEQU

21HBLOCKEQU

22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,AEND

該程序的功能是,把BLOCK單元開始存放的10個(gè)無(wú)符號(hào)數(shù)進(jìn)行求和,并將結(jié)果存入SUM單元中。*18七、位地址符號(hào)定義偽指令BIT格式為:符號(hào)名

BIT

位地址表達(dá)式

功能是將位地址賦給指定的符號(hào)名。其中,位地址表達(dá)式可以是絕對(duì)地址,也可以是符號(hào)地址。例如:

STBITP1.0將P1.0的位地址賦給符號(hào)名ST,在其后的編程中就可以用ST來(lái)代替P1.0。4.2源程序的編輯和匯編1.順序程序2.分支程序3.循環(huán)程序4.子程序及其調(diào)用5.運(yùn)算程序4.3基本程序結(jié)構(gòu)*204.3基本程序結(jié)構(gòu)

4.3.1

順序程序

順序程序也稱為簡(jiǎn)單程序,其特點(diǎn)是按照程序中指令的排列順序逐條從頭至尾地執(zhí)行,程序流向不變。順序程序是最基本的程序形式,其雖然簡(jiǎn)單,但它是構(gòu)成復(fù)雜大型程序的基礎(chǔ)。

例:內(nèi)部RAM的2AH~2EH單元中存儲(chǔ)的數(shù)據(jù)如圖所示。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。

*21方法一:MOVA,2EH;2字節(jié),1個(gè)機(jī)器周期MOV2EH,2DH;3字節(jié),2個(gè)機(jī)器周期MOV2DH,2CH;3字節(jié),2個(gè)機(jī)器周期MOV2CH,2BH;3字節(jié),2個(gè)機(jī)器周期MOV2BH,#00H;3字節(jié),2個(gè)機(jī)器周期4.3基本程序結(jié)構(gòu)*22方法二:CLRA;1字節(jié),1個(gè)機(jī)器周期XCHA,2BH;2字節(jié),1個(gè)機(jī)器周期XCHA,2CH;2字節(jié),1個(gè)機(jī)器周期XCHA,2DH;2字節(jié),1個(gè)機(jī)器周期XCHA,2EH;2字節(jié),1個(gè)機(jī)器周期以上兩種方法均可以實(shí)現(xiàn)所要求的傳送任務(wù)。方法一使用14個(gè)字節(jié)的指令代碼,執(zhí)行時(shí)間為9個(gè)機(jī)器周期;方法二僅用了9個(gè)字節(jié)的代碼,執(zhí)行時(shí)間也減少到了5個(gè)機(jī)器周期。實(shí)際應(yīng)用中應(yīng)盡量采用指令代碼字節(jié)數(shù)少、執(zhí)行時(shí)間短的高效率程序,即注意程序的優(yōu)化。4.3基本程序結(jié)構(gòu)*23例有一變量存放在片內(nèi)RAM的20H單元,其取值范圍為:00H~05H。要求編制一段程序,根據(jù)變量值求其平方值,并存入片內(nèi)RAM的21H單元。4.3基本程序結(jié)構(gòu)程序如下:

ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END。

23*24例雙字節(jié)無(wú)符號(hào)數(shù)加法。

設(shè)被加數(shù)存放在內(nèi)部RAM的51H、50H單元,加數(shù)存放在內(nèi)部RAM的61H、60H單元,相加的結(jié)果存放在內(nèi)部RAM的51H、50H單元,進(jìn)位存放在位尋址區(qū)的00H位中。4.3基本程序結(jié)構(gòu)24*程序段如下:MOVR0,#50H;被加數(shù)的低字節(jié)地址 MOVR1,#60H;加數(shù)的低字節(jié)地址 MOVA,@R0;取被加數(shù)低字節(jié)ADDA,@R1;加上加數(shù)低字節(jié)MOV@R0,A;保存低字節(jié)相加結(jié)果INCR0;指向被加數(shù)高字節(jié)INCR1;指向加數(shù)高字節(jié)MOVA,@R0;取被加數(shù)高字節(jié)ADDCA,@R1;加上加數(shù)高字節(jié)(帶進(jìn)位加)MOV@R0,A;存高字節(jié)相加結(jié)果MOV00H,C;保存進(jìn)位。

4.3基本程序結(jié)構(gòu)25分支程序是具有兩個(gè)或兩個(gè)以上流向的程序。特點(diǎn)是程序中含有轉(zhuǎn)移指令。轉(zhuǎn)移指令包含無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移。無(wú)條件分支程序十分簡(jiǎn)單,這里重點(diǎn)介紹應(yīng)用十分普遍的條件分支程序。

4.3基本程序結(jié)構(gòu)4.3.2分支程序*27

分支結(jié)構(gòu)可以分成單分支、雙分支和多分支幾種情況:4.3基本程序結(jié)構(gòu)*28一、單分支程序例求雙字節(jié)補(bǔ)碼。設(shè)在內(nèi)部RAM的addr1和addr1+1單元存有一個(gè)雙字節(jié)數(shù)(高位字節(jié)存于高地址單元)。編寫程序?qū)⑵渥x出取補(bǔ)后再存入addr2和addr2+1單元。4.3基本程序結(jié)構(gòu)方法:首先對(duì)低字節(jié)取補(bǔ),然后判其結(jié)果是否為全“0”。若是,則高字節(jié)取補(bǔ),否則高字節(jié)取反。

*29ORG2000HSTART:MOVR0,#addr1;原碼低字節(jié)地址送R0 MOVR1,#addr2;補(bǔ)碼低字節(jié)地址送R1 MOVA,@R0;原碼低字節(jié)送A CPLA;A內(nèi)容取補(bǔ)

INCAMOV@R1,A;存補(bǔ)碼低字節(jié)

INCR0;調(diào)整地址,指向下一單元

INCR1JZZERO;(A)=0時(shí)轉(zhuǎn)ZEROMOVA,@R0;原碼高字節(jié)送A CPLASJMPLOOP1ZERO:MOVA,@R0;高字節(jié)取補(bǔ)存入addr2+1單元

CPLAINCALOOP1:MOV@R1,A;高字節(jié)反碼存入addr2+1單元

SJMP$END4.3基本程序結(jié)構(gòu)*30二、雙分支程序例設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x大于0時(shí),y=x;當(dāng)x=0時(shí),y=20H;當(dāng)x小于0時(shí),y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。程序如下:ORG2000HSTART:MOVA,30HJZNEXTANLA,#80H;判斷符號(hào)位

JZLPMOVA,#05HADDA,30HMOV30H,ASJMPLPNEXT:MOV30H,#20HLP:SJMP$

END4.3基本程序結(jié)構(gòu)*314.3.3循環(huán)程序按某種控制規(guī)律重復(fù)執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序有先執(zhí)行后判斷和先判斷后執(zhí)行兩種基本結(jié)構(gòu):4.3基本程序結(jié)構(gòu)*32一、先執(zhí)行后判斷例50ms延時(shí)程序。

若晶振頻率為12MHz,則一個(gè)機(jī)器周期為1μs。執(zhí)行一條DJNZ指令需要2個(gè)機(jī)器周期,即2μs。采用循環(huán)計(jì)數(shù)法實(shí)現(xiàn)延時(shí),循環(huán)次數(shù)可以通過(guò)計(jì)算獲得,并選擇先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。子程序如下:4.3基本程序結(jié)構(gòu)ORG2100HDEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP ;1μsDEL2:DJNZR6,DEL2;2μs,計(jì)(2×123)μsDJNZR7,DEL1;2μs,

RET共計(jì)[(2×123+2+2)×200+1]μs,即50.001ms*33

例無(wú)符號(hào)數(shù)排序程序。在片內(nèi)RAM中,起始地址為30H的8個(gè)單元中存放有8個(gè)無(wú)符號(hào)數(shù)。試對(duì)這些無(wú)符號(hào)數(shù)進(jìn)行升序排序。數(shù)據(jù)排序常用的方法是冒泡排序法。(方法!)(程序框圖!)設(shè)R7為比較次數(shù)計(jì)數(shù)器,初始值為07H,位地址00H為數(shù)據(jù)互換標(biāo)志位。

(分配寄存器?。┏绦蛉缦拢海ň庉嫞。㎡RG2300H4.3基本程序結(jié)構(gòu)*34

START:CLR00H;互換標(biāo)志清0 MOVR7,#07H;各次冒泡比較次數(shù)

MOVR0,#30H;數(shù)據(jù)區(qū)首址

LOOP:MOVA,@R0;取前數(shù)

MOV2BH,A;暫存

INCR0MOV2AH,@R0;取后數(shù)

CLRCSUBBA,@R0;前數(shù)減后數(shù)

JCNEXT;前數(shù)小于后數(shù),不互換

MOV@R0,2BHDECR0MOV@R0,2AH;兩數(shù)交換

INCR0;準(zhǔn)備下一次比較

SETB00H;置互換標(biāo)志

NEXT:DJNZR7,LOOP;進(jìn)行下一次比較

JB00H,START;進(jìn)行下一輪冒泡

SJMP$END4.3基本程序結(jié)構(gòu)*35二、先判斷后執(zhí)行

例將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)‘$’字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測(cè)試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。程序段如下

MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判斷是否為‘$’字符

SJMPLOOP2;是‘$’字符,轉(zhuǎn)結(jié)束LOOP1:MOVX@DPTR,A;不是‘$’字符,執(zhí)行傳送

INCR0INCDPTRSJMPLOOP0;傳送下一數(shù)據(jù)

LOOP2:……4.3基本程序結(jié)構(gòu)*364.3.4子程序及其調(diào)用一、子程序的調(diào)用

實(shí)際中經(jīng)常會(huì)遇到帶有通用性的問(wèn)題,例碼制轉(zhuǎn)換、數(shù)值計(jì)算等,在一個(gè)程序中可能要使用多次。這時(shí)可以將其設(shè)計(jì)成通用的子程序供隨時(shí)調(diào)用。

子程序特點(diǎn),在執(zhí)行過(guò)程中需要由其它程序來(lái)調(diào)用,執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用該子程序的主程序。子程序調(diào)用注意:一是現(xiàn)場(chǎng)的保護(hù)和恢復(fù);二是主程序與子程序的參數(shù)傳遞。4.3基本程序結(jié)構(gòu)*37二、現(xiàn)場(chǎng)保護(hù)與恢復(fù)

在子程序執(zhí)行過(guò)程中常常要用到單片機(jī)的一些通用單元,如工作寄存器R0~R7、累加器A、數(shù)據(jù)指針DPTR,以及有關(guān)標(biāo)志和狀態(tài)等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進(jìn)行保護(hù),稱為現(xiàn)場(chǎng)保護(hù)。

在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱為現(xiàn)場(chǎng)恢復(fù)。保護(hù)與恢復(fù)的方法有以下兩種:在主程序中實(shí)現(xiàn);在子程序中實(shí)現(xiàn)。4.3基本程序結(jié)構(gòu)*38

1、在主程序中實(shí)現(xiàn)示例如下:

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

PUSHACC;

PUSHB;

MOVPSW,#10H;換當(dāng)前工作寄存器組

LCALLaddr16;子程序調(diào)用

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

POPACC;

POPPSW;

……

其特點(diǎn)是結(jié)構(gòu)靈活。4.3基本程序結(jié)構(gòu)*39

2、在子程序中實(shí)現(xiàn)示例如下:SUB1:PUSHPSW;保護(hù)現(xiàn)場(chǎng)

PUSHACC;

PUSHB;MOVPSW,#10H;換當(dāng)前工作寄存器組

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

POPACC;

POPPSW;

RET其特點(diǎn)是程序規(guī)范、清晰。注意,無(wú)論哪種方法保護(hù)與恢復(fù)的順序要對(duì)應(yīng)。4.3基本程序結(jié)構(gòu)*40三、參數(shù)傳遞

由于子程序是主程序的一部分,所以,在程序的執(zhí)行時(shí)必然要發(fā)生數(shù)據(jù)上的聯(lián)系。在調(diào)用子程序時(shí),主程序應(yīng)通過(guò)某種方式把有關(guān)參數(shù)(即子程序的入口參數(shù))傳給子程序,當(dāng)子程序執(zhí)行完畢后,又需要通過(guò)某種方式把有關(guān)參數(shù)(即子程序的出口參數(shù))傳給主程序。在8051單片機(jī)中,傳遞參數(shù)的方法有三種:

1、利用累加器或寄存器

2、利用存儲(chǔ)器3、利用堆棧4.3基本程序結(jié)構(gòu)*41

例編寫程序,實(shí)現(xiàn)c=a2+b2

。設(shè)a,b,c分別存于內(nèi)部RAM的30H,31H,32H三個(gè)單元中。程序如下:ORG1000HSTART:MOVA,30H;取aLCALLSQR;調(diào)用查平方表

MOVR1,A;a2暫存于R1中

MOVA,31H;取bLCALLSQR;調(diào)用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存結(jié)果

SJMP$SQR:MOVDPTR,#TAB;子程序

MOVCA,@A+DPTR;

RETTAB:DB0,1,4,9,16,25,36,49,64,81END

4.3基本程序結(jié)構(gòu)*

42

例將R0和R1指向的內(nèi)部RAM中兩個(gè)3字節(jié)無(wú)符號(hào)整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部RAM中。低字節(jié)在低地址,高字節(jié)在高地址。(入口,R0和R1分別指向加數(shù)和被加數(shù)的低位字節(jié);出口,R0指向結(jié)果的高位字節(jié)。)

4.3基本程序結(jié)構(gòu)實(shí)現(xiàn)程序:ORG2200HNADD:MOVR7,#3;三字節(jié)加法

CLRC;NADD1:MOVA,@R0;取加數(shù)低字節(jié)

ADDCA,@R1;被加數(shù)低字節(jié)加AMOV@R0,A;存結(jié)果

INCR0;指向高字節(jié)

INCR1DJNZR7,NADD1

MOV@R0,#00H

ADDCA,@R0

MOV@R0,ARET

*43例把內(nèi)部RAM中20H單元中的1個(gè)字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個(gè)單元。

4.3基本程序結(jié)構(gòu)

ORG2300H

MAIN:MOVA,20H;

SWAPAPUSHACC;參數(shù)入棧

ACALLHEASCPOPACCMOV@R0,A;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果

INCR0;修改指針

PUSH20H;參數(shù)入棧

ACALLHEASCPOPACCMOV@R0,A;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果

SJMP$

*44

;轉(zhuǎn)換子程序

ORG2310HHEASC:MOVR1,SP;借用R1為堆棧指針

DECR1DECR1;R1指向被轉(zhuǎn)換數(shù)據(jù)

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

ANLA,#0FH;取一位十六進(jìn)制數(shù)

ADDA,#2;所加值為MOVC與DB間字節(jié)數(shù)

MOVCA,@A+PC;查表

XCHA,@R1;1字節(jié)指令,存結(jié)果于堆棧

RET;1字節(jié)指令A(yù)SCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H

4.3基本程序結(jié)構(gòu)*45

一般說(shuō)來(lái):當(dāng)相互傳遞的數(shù)據(jù)較少時(shí),采用寄存器傳遞方式可以獲得較快的傳遞速度;當(dāng)相互傳遞的數(shù)據(jù)較多時(shí),宜采用存儲(chǔ)器或堆棧方式傳遞;如果是子程序嵌套時(shí),最好是采用堆棧方式。4.3基本程序結(jié)構(gòu)*464.4常用程序舉例4.4.1算術(shù)運(yùn)算程序一、多字節(jié)數(shù)的加、減運(yùn)算

8051單片機(jī)的指令系統(tǒng)提供的是字節(jié)運(yùn)算指令,所以在處理多字節(jié)數(shù)的加減運(yùn)算時(shí),要合理地運(yùn)用進(jìn)位(借位)標(biāo)志。

例多字節(jié)無(wú)符號(hào)數(shù)的加法。

設(shè)兩個(gè)N字節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相加后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。*47MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N; 置字節(jié)數(shù)

CLRC;LOOP:MOVA,@R0;

ADDCA,@R1

;求和

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

INCR0;修改指針

INCR1;

DJNZR7,LOOP;SJMP$4.4常用程序舉例*48例多字節(jié)無(wú)符號(hào)數(shù)的減法。

設(shè)兩個(gè)N字節(jié)的無(wú)符號(hào)數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相減后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。

MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N;置字節(jié)數(shù)

CLRC;LOOP:MOVA,@R0;

SUBBA,@R1

;求差

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

INCR0;修改指針

INCR1;

DJNZR7,LOOP;SJMP$4.4常用程序舉例*49二、多字節(jié)數(shù)乘法運(yùn)算例雙字節(jié)無(wú)符號(hào)數(shù)的乘法。設(shè)雙字節(jié)的無(wú)符號(hào)被乘數(shù)存放在R3、R2中,乘數(shù)存放在R5、R4中,R0指向積的高位。

4.4常用程序舉例*50主程序段如下:ORG1000HMULTB:MOVR7,#04

MOVR0,#33HLOOP:MOV@R0,#00H;結(jié)果單元清0

DECR0

DJNZR7,LOOP;

ACALLBMUL;

SJMP$另有2段子程序:

BMULRADD(在BMUL中被調(diào)用)4.4常用程序舉例*51ORG1100HBMUL:MOVA,R2;

MOVB,R4;

MULAB;低位乘

ACALLRADD;

MOVA,R2;

MOVB,R5;

MULAB;交叉乘

DECR0

ACALLRADD;

MOVA,R4;

MOVB,R3;

MULAB;交叉乘

DECR0;

DECR0

;

ACALLRADD;

MOVA,R5;

MOVB,R3;

MULAB;高字節(jié)乘

DECR0

ACALLRADD;

DECR0(?)RET4.4常用程序舉例*52子程序:ORG1200H

RADD:ADDA,@R0;

MOV@R0,A;

MOVA,B;

INCR0

;

ADDCA,@R0;

MOV@R0,A;

INCR0

MOVA,@R0;

ADDCA,#00H;加進(jìn)位

MOV@R0,A;

RET4.4常用程序舉例*53一、十六進(jìn)制數(shù)與ASCII碼間的轉(zhuǎn)換

十六進(jìn)制數(shù)與ASCII碼的對(duì)應(yīng)關(guān)系如表所示。當(dāng)十六進(jìn)制數(shù)在0~9之間時(shí),其對(duì)應(yīng)的ASCII碼值為該十六進(jìn)制數(shù)加30H;當(dāng)十六進(jìn)制數(shù)在A~F之間時(shí),其對(duì)應(yīng)的ASCII碼值為該十六進(jìn)制數(shù)加37H。4.4.2碼型轉(zhuǎn)換

4.4常用程序舉例*54例將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。設(shè)十六進(jìn)制數(shù)存放在R0中,轉(zhuǎn)換后的ASCII碼存放于R2中。實(shí)現(xiàn)程序如下:ORG2400HHASC:MOVA,R0;取4位二進(jìn)制數(shù)

ANLA,#0FH;屏蔽掉高4位

PUSHACC;4位二進(jìn)制數(shù)入棧

CLRC;清進(jìn)(借)位位

SUBBA,#0AH;用借位位的狀態(tài)判斷該數(shù)在0~9還是A~F之間

POPACC;彈出原4位二進(jìn)制數(shù)

JCLOOP;借位位為1,跳轉(zhuǎn)至LOOPADDA,#07H;借位位為0,該數(shù)在A~F之間,加37HLOOP:ADDA,#30H;該數(shù)在0~9之間,加30HMOVR2,A;ASCII碼存于R2RET

4.4常用程序舉例*55例將多位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。

設(shè)地址指針R0指向十六進(jìn)制數(shù)低位,R2中存放字節(jié)數(shù),轉(zhuǎn)換后地址指針R0指向十六進(jìn)制數(shù)的高位。R1指向要存放的ASCII碼的高位地址。實(shí)現(xiàn)程序如下:4.4常用程序舉例*56HTASC:MOVA,@R0;取低4位二進(jìn)制數(shù)

溫馨提示

  • 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)論