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