彙編語言程序設計
彙編語言是用助記符(英文字母縮寫)來表示的面向機器的程序設計語言,每條助記符指令都有相對應的機器碼,即彙編語言是機器語言的符號表示。
格式
彙編語言語句一般由4個字段組成,即標號、操作碼、操作數和註釋,它們之間應用分隔符隔開,常用的分隔符有空格“ ”、冒號“:”和分號“;”,而且空格的數目可以不止一個。
[標號:] 操作碼 [操作數] [;註釋]
上述格式中,[ ]中的項爲任選項,其中標號與操作碼之間用“:”分隔,操作碼與操作數之間用空格分隔,操作數與註釋之間用“;”分隔,有多個操作數時,操作數和操作數之間用“,”分隔。
-
標號規定如下:
① 標號由1~8個ASCII碼字符組成,第一個字符必須是字母。
② 同一標號在一個程序中只 能定義一次,不能重複定義。
③ 不能使用彙編語言已經定義的符號作爲標號,如指令助記符、僞指令及寄存器的符號名稱等。
④ 標號的有無,取決於本程序中的其他語句是否訪問該條語句。如無其他語句訪問,則該語句前不需要標號。 -
操作碼字段
操作碼是指令的助記符,表示指令的性質,用於指示CPU執行何種操作。操作碼是彙編語言指令中唯一不能空缺的部分。 -
操作數字段
操作數字段用於存放指令的操作數或操作數的地址。- 即數:#data和#data16。
- 直接地址:direct,如30H;僞指令定義的符號地址,如SUM;表達式,如SUM+1,特殊功能寄存器的名字等。
-
註釋字段
註釋是爲便於讀者的閱讀和理解而對語句或程序段的說明,彙編時不被翻譯成機器碼,機器也不執行。
僞指令
僞指令是在“機器彙編”過程中,用來對彙編過程進行某種控制或者對符號和標號進行賦值。這些指令不屬於指令系統中的指令,彙編時也不產生機器代碼,因此稱爲“僞指令”。
-
ORG(彙編起始地址僞指令)
ORG用來定義彙編以後的目標程序的起始地址。其格式如下:
[標號:] ORG addr16
例如: ORG 2000H
START: MOV A,#34H
ORG規定了標號START的地址爲2000H,也就是說該程序應從2000H開始存放。在一個彙編語言源程序中,可以多次使用ORG命令,以規定不同程序段的起始地址,地址一般應從小到大且不能重複。 -
END(彙編結束僞指令)
END用來表示彙編語言源程序結束,它只能出現在程序的末尾,且只有一個。其指令格式如下:
[標號:] END -
EQU(賦值僞指令)
EQU用來對程序中出現的標號進行賦值。其格式如下:
字符名稱 EQU 數或彙編符號
在機器彙編時,彙編語言會自動將EQU後面的數或彙編符號賦給左側的字符名稱。例如,
AA EQU R1 ;AA等同於R1
K1 EQU 40H ;K1代表40H
使用該指令必須注意以下幾點:
(1)該指令中的字符名稱不是轉移指令中出現的標號,而是出現在操作數中的字符名稱。
(2)EQU僞指令中的字符名稱必須先定義後使用。
(3)EQU定義的字符名稱不能出現在表達式中,例如語句MOV A,A10+1是錯誤的。 -
DATA(數據地址賦值僞指令)
DATA對數據地址或代碼地址賦予規定的字符名稱。其格式如下:
標號名稱 DATA 表達式 -
B、DW、DS(定義字節、字、空間僞指令)
DB:從指定的地址單元開始,存放若干字節。
DW:從指定的地址單元開始,存放若干字(16位二進制數,高8位在前,低8位在後)。
DS:從指定的地址單元開始,保留若干單元備用。指令格式如下:
[標號:] DB 字節常數 ;用逗號分隔開的若干項,每項都是一個字節)
[標號:] DW 字常數 ;用逗號分隔開的若干項,每項都是一個字)
[標號:] DS 表達式 ;其值表示保留的單元個數)
分析下段程序。
ORG 2000H
DS 08H
DB 30H,8AH,10,‘B’
DW 54H,1F80H
解:該程序的DS僞指令定義8個存儲單元(2000H~2007H)備用;DB僞指令定義了從地址2008H開始的4個單元的內容;DW僞指令定義了後續4個單元的內容。結果如下:
(2008H) = 30H, (2009H) = 8AH
(200AH) = 0AH, (200BH) = 42H
(200CH) = 00H, (200DH) = 54H
(200EH) = 1FH, (200FH) = 80H
- BIT(位地址符號僞指令)
BIT用來將位地址賦給字符名稱。其格式爲:
字符名稱 BIT 位地址
例如:
KEY BIT P1.0 ;將P1.0的位地址賦給符號名KEY
ST BIT 0D7H ;將位地址爲D7H的位定義爲符號名
注意:位地址既可以是絕對地址,也可以是符號地址。另外,用BIT定義的“符號名”一經定義便不能重新定義和改變。
彙編程序
步驟
彙編語言程序設計的一般步驟
彙編語言程序設計大致可分成以下幾步:
(1)明確設計要求。
(2)確定算法。
(3)繪製程序流程圖。
(4)按程序流程圖編寫源程序。
(5)上機調試。
(6)優化程序。
結構
#####順序
將片內RAM的20H單元中的壓縮BCD碼拆成兩個ACSII碼存入21H、22H單元。低4位存在21H單元,高4位存 在22H單元。
ORG 2000H
MOV A,20H
MOV B,#10H ;除以10H
DIV AB
ORL B,#30H ;低4位BCD碼轉換爲ASCII碼
MOV 21H,B
ORL A,#30H ;高4位BCD碼轉換爲ASCII碼
MOV 22H,A
END
#####分支
求單字節有符號數的二進制補碼。
GCMPT:JNB ACC.7,RETURN ;(A) > 0,不需轉換
MOV C,ACC.7 ;符號位保存
CPL A ;(A)求反,加1
ADD A,#1
MOV ACC.7,C ;符號位回存A的最高位
RETURN:RET
循環
設有100個單字節數。連續存放在內部M單元開始的數據存儲器中,且總和也爲單字節數,存放到N單元。試編寫求這100個數之和的程序。
參考程序:
N EQU 30H
M EQU 31H
ORG 2020H
MOV A,#00H
MOV R0,#M
MOV R1,#64H
LOOP:ADD A,@R0
INC R0
DJNZ R1,LOOP
MOV N,A
SJMP $
END
現場保護與恢復工作
由於主調程序和子程序經常是分開編制的,所以它們所使用的寄存器或存儲單元往往會發生衝突。爲避免子程序在運行過程中,修改主調程序中使用的寄存器/存儲單元的原有內容,在子程序開始運行時應進行相應寄存器/存儲單元內容的保存,在子程序運行結束,再將這些寄存器/存儲單元的內容進行恢復,以保證調用程序的正常運行。
在主程序中實現
現場保護與恢復工作在主程序中實現,特點是結構靈活。例如,
PUSH PSW ;保護現場(含當前工作寄存器組號)
PUSH ACC
PUSH B
MOV PSW,#10H ;切換當前工作寄存器組
LCALL addr16 ;子程序調用
POP B ;恢復現場
POP ACC
POP PSW ;含當前工作寄存器組切換
在子程序中實現
現場保護與恢復工作在子程序中實現,特點是程序結構規範、清晰。例如,
SUB1: PUSH PSW ;保護現場(含當前工作寄存器組號)
PUSH ACC
PUSH B
MOV PSW,#10H ;切換當前工作寄存器組
…
POP B ;恢復現場
POP ACC
POP PSW ;內含當前工作寄存器組切換
RET
###習題
- 用於程序設計的語言分爲哪幾種?它們各有什麼特點?
答:51系列單片機的編程語言可以分爲彙編語言和高級語言(如C語言)兩種,各自的特點如下:
名稱 | 特點 | 缺點 | 優點 | 適用場合 |
---|---|---|---|---|
彙編語言 | 用符號書寫指令(用助記符表示操作碼,特殊符號表示操作數) | 機器不能直接識別;程序員必須瞭解機器的結構和指令系統,不易推廣和普及;不能移植,不具備通用性 | 較易爲人們識別、記憶和讀寫 | 實時控制系統 |
高級語言 | 用以英語爲基礎的語句編程 | 機器不能直接識別;執行時間長 | 易於推廣和交流;不依賴於機器,具有通用性 | 科學運算和數據處理 |
- 設常量和數據標號的定義爲:
ORG 2000H
DAT1: DB 1, 2, 3, 4, 5
DAT2: DB ‘ABCD’
DAT3: DW 1200H,-2
TAB: DW DAT1, DAT3
補充:A爲65,也就是十六進制的41H
(1)畫出上述數據或地址的存儲形式。
(2)寫出各標號的地址。
答:(1)
地址 | 內容(H) |
---|---|
2000H | 01 |
02 | |
03 | |
04 | |
05 | |
2005H | 41 |
42 | |
43 | |
44 | |
2009H | 12 |
00 | |
FF | |
FE | |
200DH | 20 |
00 | |
20 | |
09 |
(2)DAT1=2000H; DAT2=2005H; DAT3=2009H; TAB =200DH
- 試編寫程序,找出片內RAM 30H~5FH單元中無符號數的最大數,並將結果存入60H單元。
答:
ORG 0000H
MOV R0, #30H
MOV R7, #2FH
MOV A, @R0
AGAIN: INC R0
MOV B, A
CLR C
SUBB A, @R0
JNC L1
MOV A, @R0
AJMP L2
L1: MOV A, B
L2: DJNZ R7, AGAIN
MOV 60H, A
SJMP $
END
6.試編寫程序,統計片內RAM的20H~5FH單元中出現55H的次數,並將統計結果送60H單元。
答:
TAB EQU 20H
ORG 0000H
START: MOV 60H, #0
MOV R0, #TAB
LOOP2: MOV A, #55H
CLR C
SUBB A, @R0
JNZ NEXT
INC 60H
NEXT: INC R0
CJNE R0, #60H, LOOP2
SJMP $
END
7.編寫程序,將片外數據存儲區中3000H~30FFH單元全部清零。
答:
ORG 0000H
START: MOV A, #0
MOV R7, #0
MOV DPTR, #3000H
LOOP: MOVX @DPTR, A
INC DPTR
DJNZ R7, LOOP
SJMP $
END