單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)
1、匯編語(yǔ)言源程序的格式1.內(nèi)部數(shù)據(jù)傳送指令
匯編語(yǔ)言是面向機(jī)器的,因此,語(yǔ)言格式因機(jī)器不同而異。對(duì)MCS-51系統(tǒng)來(lái)說(shuō),匯編語(yǔ)言中每條語(yǔ)句的格式包括下列4項(xiàng)內(nèi)容:
標(biāo)號(hào): 操作碼 操作數(shù); 注釋
匯編語(yǔ)句中,標(biāo)號(hào)和操作碼要用冒號(hào)“:”隔開(kāi);操作碼和操作數(shù)之間的分隔符是空格,多個(gè)操作數(shù)之間用“,”分隔;操作數(shù)與注釋之間用“;”分隔;操作碼是必選項(xiàng),其余都是可選項(xiàng),即任何語(yǔ)句都必須包含操作碼,其他部分因語(yǔ)句不同而異。
1.ORG偽指令
ORG偽指令稱為起始匯編偽指令,一般用于匯編語(yǔ)言源程序或某數(shù)據(jù)塊的開(kāi)頭,格式為:
[標(biāo)號(hào)]:ORG 16位的地址或標(biāo)號(hào)
2.END偽指令
END偽指令稱為匯編結(jié)束偽指令,經(jīng)常用在匯編語(yǔ)言源程序的末尾,用來(lái)指示源程序結(jié)束匯編的位置。即表明程序的結(jié)束。一般格式為:
[標(biāo)號(hào)]:END
3.EQU偽指令
EQU偽指令稱為賦值偽指令,用于給左邊的“字符名”賦值。此偽指令的格式為:
字符名 EQU 數(shù)據(jù)或匯編符號(hào)
4.DATA偽指令
DATA偽指令稱為數(shù)據(jù)地址賦值偽指令,它用來(lái)給左邊的“字符名”賦值。其一般格式為:
字符名 DATA 數(shù)據(jù)或表達(dá)式
5.BIT偽指令
BIT偽指令稱為位地址符號(hào)偽指令,用來(lái)給符號(hào)形式的位地址賦值,此偽指令的格式為:
字符名 BIT 位地址
6.DB偽指令
DB偽指令稱為定義字節(jié)偽指令,它的功能是從指定單元開(kāi)始定義(存儲(chǔ))若干個(gè)字節(jié)的數(shù)據(jù)或字符,字符若用引號(hào)括起來(lái)則表示ASCII碼。其一般格式為:
標(biāo)號(hào):DB 字節(jié)常數(shù)或字符
7.DW偽指令
DW偽指令稱為定義字偽指令,其功能為在程序存儲(chǔ)器中從指定單元開(kāi)始,定義若干個(gè)字,一個(gè)字相當(dāng)于兩個(gè)字節(jié)。此偽指令的一般格式為:
標(biāo)號(hào): DW 字常數(shù)或字表
8.DS偽指令
DS偽指令稱為定義存儲(chǔ)空間偽指令,格式為:
標(biāo)號(hào): DS 表達(dá)式
2、MCS—51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)舉例
1. 簡(jiǎn)單程序設(shè)計(jì)
例:將一個(gè)字節(jié)內(nèi)的兩位壓縮BCD碼拆開(kāi)并轉(zhuǎn)換成相應(yīng)的ASCH碼,存入兩個(gè)RAM單元。
解:設(shè)兩位壓縮BCD碼已放在內(nèi)部RAM的20H單元,轉(zhuǎn)換后的ASCII碼放在21H和22H單元。根據(jù)ASCII碼表,字符0~9對(duì)應(yīng)的ASCII碼為30H~39H,之間僅相差30H。因此,轉(zhuǎn)換時(shí),只需把20H單元中兩位壓縮BCD碼拆開(kāi)后,將BCD的高四位置成“0011”即可。相應(yīng)程序如下:
ORG 1000H
MOV R0, #20H
MOV A, @R0 ;兩位BCD碼送A
PUSH ACC
ANL A, #0FH ;取低位BCD碼
ORL A, #30H ;完成低位轉(zhuǎn)換
INC R0
MOV @R0, A ;低位BCD碼的轉(zhuǎn)換結(jié)果存入21H中
POP ACC
ANL A ,#0F0H ;取高位BCD碼
SWAP A
ORL A, #30H ;完成高位轉(zhuǎn)換
INC R0
MOV @R0, A ;存數(shù)
SJMP $ ;結(jié)束
END
2. 分支程序設(shè)計(jì)
例:設(shè)變量X存放于R2,函數(shù)值Y存放在R3。試按照下式的要求給Y賦值:
ORG 0500H
MOV A, R2 ;自變量→(A)
CJNE A,#10,L1 ;(A)與10比較
L1:JC L2 ;若X<10,則轉(zhuǎn)L2
ADD A, #01H
MOV R3, A ; 設(shè)X>20,Y=1
CJNE A,#21,L3
L3:JNC L4 ;X>20,則轉(zhuǎn)L4
MOV R3,#0 ;20≥X≥10,Y=0
SJMP L4
L2:MOV R3,#0FFH
L4:SJMP $
END
3. 循環(huán)程序設(shè)計(jì)
循環(huán)程序一般由以下幾部分組成:
1)循環(huán)初始化部分
2)循環(huán)體部分
3)循環(huán)結(jié)束部分
例:在內(nèi)部RAM的20H~2FH連續(xù)16個(gè)單元中存放單字節(jié)無(wú)符號(hào)數(shù)。求16個(gè)無(wú)符號(hào)數(shù)之和。
解 這是重復(fù)相加問(wèn)題。16個(gè)單字節(jié)數(shù)的和最大不會(huì)超過(guò)兩個(gè)字節(jié),設(shè)和存放在31H,30H中。用R0作加數(shù)指針,R7作循環(huán)次數(shù)計(jì)數(shù)器。程序流程如圖3-11所示。
ORG 1000H
MOV R7,#0FH
MOV R0,#21H
MOV 31H,#00H
MOV A,20H
LOOP1: ADD A,@R0
MOV 30H, A
JNC LOOP2
INC 31H
LOOP2: INC R0
DJNZ R7, LOOP1
SJMP $
END
4.查表程序設(shè)計(jì)
查表程序是根據(jù)查表算法設(shè)計(jì)的。它有兩條專門的查表指令:
例:設(shè)計(jì)一個(gè)將16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼的子程序。設(shè)16進(jìn)制數(shù)存放在R0中的低4位,要求將轉(zhuǎn)換后的ASCII碼送回R0中。
解:給出二種方案。
①計(jì)算求解。由ASCII碼字符表可知0~9的ASCII碼為30H~39H,A~F的ASCII碼為41H~46H。因此,計(jì)算求解的思路是:若(R0)≤9,則R0內(nèi)容只需加30H;若(R0)>9,則R0需加37H。相應(yīng)程序?yàn)椋?BR> ORG 1000H
MOV A,R0 ;取轉(zhuǎn)換值到A
ANL A,#0FH ;屏蔽高4位
CJNE A,#10,NEXTl
NEXTl:JNC NEXT2 ;若A>9,則轉(zhuǎn)NEXT2
ADD A,#30H ;若A<10,則A (A)+30H
SJMP DONE
NEXT2:ADD A,#37H ;A (A)+37H
DONE: MOV R0,A ;存結(jié)果
SJMP $
END
②查表求解。求解時(shí),兩條查表指令任選其一,F(xiàn)以“MOVC A,@A+PC”指令為例,給出相應(yīng)程序:
地址 機(jī)器碼 ORG 1000H
1000 E8 MOV A,R0 ;取轉(zhuǎn)換值
1001 54 0F ANL A,#0FH ;屏蔽高4位
1003 24 03 ADD A,#03H ;計(jì)算偏移量
1005 83 MOVC A,@A+PC ;查表
1006 F8 MOV R0,A ;存結(jié)果
1007 80 FE SIMP $
1008 30 31 32 33 ASCTAB: DB 30H,31H,32H,33H
100C 34 35 36 37 DB 34H,35H,36H,37H
1010 38 39 41 42 DB 38H,39H,41H,42H
1014 43 44 45 46 DB 43H,44H,45H,46H
END
5. 子程序設(shè)計(jì)
子程序在結(jié)構(gòu)上應(yīng)具有通用性和獨(dú)立性,在編寫子程序時(shí)應(yīng)注意:
①程序第一條指令的地址稱為入口地址,該指令前必須有標(biāo)號(hào),最好以子程序任務(wù)名作為標(biāo)號(hào),例如顯示程序常以DIR作為標(biāo)號(hào);
②調(diào)用子程序指令設(shè)在主程序中,在子程序的末尾一定要有返回指令。一般說(shuō)來(lái),子程序調(diào)用指令和子程序返回指令要成對(duì)使用,子程序應(yīng)只有一個(gè)出口;
③子程序調(diào)用和返回指令能自動(dòng)保護(hù)和恢復(fù)斷點(diǎn)地址,但對(duì)需要保護(hù)的寄存器和內(nèi)存單元的內(nèi)容,必須在子程序開(kāi)始和末尾(RET指令前)安排保護(hù)和恢復(fù)它們的指令;
④調(diào)用子程序時(shí),要了解子程序的“入口信息”和“出口信息”,即進(jìn)入子程序前應(yīng)給哪些變量賦值,子程序返回時(shí)結(jié)果存在何處,以便主程序應(yīng)用這些結(jié)果。這就是所謂的參數(shù)傳遞。一般稱傳入子程序的參數(shù)為入口參數(shù),由子程序返回的參數(shù)為出口參數(shù)。
例:用程序?qū)崿F(xiàn)C=a2+b2。設(shè)a、b均小于10。a存在21H單元,b存在22H單元,結(jié)果C存在20H單元。
解:因本題中兩次用到求平方的運(yùn)算,故此把求平方運(yùn)算編成子程序。依題意編寫主程序和子程序如下:
ORG 1000H
MAIN: MOV SP,#60H ;設(shè)堆棧指針
MOV A,21H ;取a值
LCALL SQR ;求a2
MOV 20H,A ;a2值送入20H單元
MOV A,22H ;取b值
LCALL SQR ;求b2
ADD A,20H ;求a2+b2
MOV 20H,A ;結(jié)果存入20H單元
SJMP $
ORG 2000H
SQR: MOV B,A ;求平方子程序
MUL AB
RET
編輯:admin 最后修改時(shí)間:2018-05-08