單片機代理商深圳英銳恩分享Microchip微芯PIC單片機宏匯編器MPASM。
PIC單片機宏匯編器MPASM是Microchip公司推出的可適用于其PIC16/17全部單片機的宏匯編器,功能齊全,全屏幕操作。
§4.1 啟動和操作
MPASM的啟動很簡單,在DOS狀態下:
> MPASM (注意MPASM后面不要跟文件名)
屏幕上即顯示:
MPASM 01.11 Released (c)1993,94 Byte Craft Limited/Microchip Technology Inc.
Source File : SAMPLE.ASM
Processor Type : 12C509
Error File : Yes
Cross Refernece File : No
Listing File : Yes
Hex Dump Type : INHX8M .HEX
Assemble to Object File : No
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
↑↓,Tab : Move Cursor Esc : Quit Press Enter to change value.
F1 : Help F10 : Assemble
圖4.1 MPASM畫面
Source File: 源程序文件名??梢詭窂胶屯ㄅ浞?*)。
Processor Type: 芯片型號??赏ㄟ^Enter鍵來選擇用戶所需的型號。
Error File: 匯編后自動產生一個.ERR文件,該文件記錄了匯編中
產生的錯誤語句和警告信息。
Cross Reference File: 產生一個參考文件.XRF。
Listing File: 產生一個列表文件.LST。該文件中包含了各種仿真
環境中需要的參數,主要用于仿真調試。
Hex Dump Type: 產生的代碼燒寫文件,一般選擇INHX8M格式,可適應
眾多的燒寫器。
Assemble to Object File: 注意這里產生的.OBJ 文件不是通常認為的機器代碼
文件,而是預留給鏈接器(Linker)的可重定位文件。
選擇NO則匯編不產生任何.OBJ文件。
§4.2 匯編語言格式
PIC匯編語句的格式為:
〔標號〕〈指令助記符〉〔操作數〕 ;〔注釋〕
指令助記符與標號間至少應有一個空格。若一行語句沒有標號,則指令助記符前必須至少有一個空格,否則會當成是標號。一條語句最多字符個數為255。
;
; Sample MPASM Source Code. It is for illustration only.
;
List p=12C509,r=HEX
org 0h ; 程序從0h處開始放
start
movlw 0x0a
movlw 0x0b ;
goto start ; loop
end
圖4.2 匯編語言范例
一、標號
標號須由第一格起始寫,最多可達31個字符,且第一個字符必須是字母。標號后可跟冒號(:)、空格或行結束符。除非使用選擇項/C,否則標號中的字母大小寫是不一樣的,如:
START
start
是二個不同的標號。
二、指令助記符
指PIC的指令或偽指令,宏定義符等。具體參閱有關各章節和資料。
三、操作數
操作數可以是常數,符號或表達式。兩個操作數之間必須由逗號(,)分開。
(1)符號——各種定義的符號、宏定義等。
例:MOVWF F10 ;F10為操作數,是定義的代表寄存器10的符號。
(2)常數——在MPASM中,常數可以是如下:
進制 | 書寫格式 | 例子 |
十進制 | D'<數字>' | D'255' |
十六進制 | H'<16進制數字>' 或 0x<16進制數字> | H'A8' 0xA8 |
二進制 | B'<二進制數字>' | B'00111001' |
八進制 | O'<八進制數字>' | O'777' |
字符ASCⅡ碼 | '< 字 符 >' | 'C' |
注:MPASM默認進制為16進制。
表4.1
(3)表達式——由常數、符號和各種算術運算符號按一定順序組成。
MPASM中的算術符號如表4.2所示。
運 算 符 | 例 子 | |
( | 左括號 | 1+(d*4) |
) | 右括號 | 同上 |
! | 非 | IF !(a-b) |
+ | 加 | a+b |
- | 減 | a-b |
* | 乘 | a*b |
/ | 除 | a/b |
% | 取模 | a%2 |
<< | 左移 | < |
>> | 右移 | >>a |
> | 大于 | IF a>b |
< | 小于 | IF a |
<= | 小于或等于 | IF a<=b |
== | 等于 | IF a==b |
!= | 不等于 | IF a!=b |
& | 與 | a & b |
^ | 異或 | a ^ b |
│ | 或 | a │ b |
~ | 取反 | |
& & | 邏輯與 | IF (a=2) && (b=3) |
││ | 邏輯或 | IF (a=2) ││(b=3) |
= | 等于 | a=b |
+= | 加,然后等于 | a+=1 |
-= | 減,然后等于 | a-=1 |
*= | 乘,然后等于 | a*=5 |
/= | 除,然后等于 | a/=5 |
<<= | 左移,然后等于 | a<<=5 |
>>= | 右移,然后等于 | a>>=5 |
&= | 與,然后等于 | a&=5 |
│= | 或,然后等于 | a│=5 |
^= | 異或,然后等于 | a^=5 |
¥ | 返回當前PC值 | GOTO ¥+3 |
表4.2
四、注釋
以分號(;)起始,用戶可以注釋程序。
CLRF F10 ; 清F10寄存器
§4.3 偽指令
所謂偽指令,是一些用來控制匯編器的命令。它們可放在源程序(.ASM)中,但不是被翻譯成可執行的機器代碼,而是用來控制匯編器的輸入/輸出以及數據的定位等。
在MPASM中,有四類偽指令:
1、數據偽指令:用于控制程序存儲器的定位,定義數據的名稱等。
2、列表偽指令:用于控制MPASM產生的列表文件(.LST)的格式等。
3、控制偽指令:用于控制匯編的路徑,如條件匯編等。
4、宏匯編指令:用于控制宏定義體中的運行和數據定位。
一、數據偽指令
1. DATA——定義程序存儲器的值。
格式:〔<標號>〕 DATA <操作數>,〔<操作數>…〕
例:DATA 1,2+AB,“Test”
2. DEFINE——定義字符串變量。
格式:#DEFINE<變量名>〔<字符串>〕
例:#DEFINE Length 20
#DEFINE control 0x19,7
#DEFINE position (X,Y,Z) (Y-(2×Z+X))
…
…
test_Lable DATA position(1,Length,52)
bsf control ; 置0X19寄存器的bit7
3. SET——對標號賦值。
格式: <標號> SET <表達式>
例: width SET 9
area SET 0x16
width SET area+8
用SET可對標號任意重新賦值,見上例3。這和下面的另一條標號賦不同。
4. EQU——對標號賦值。
格式:<標號> EQU <表達式>
例: lable EQU 0x16
標號一旦由EQU賦值后,其值便不能再重新定義,參考上面SET命令。
5. RES——保留某段程序存貯區。
格式: RES <單元個數>
例: RES 10
保留10個空白字節。
6. INCLUDE——調入外部文件,通常是定義文件,對一些標號和變量進行定義。
MPASM提供一個名為PICREG.EQU的定義文件,讀文件中定義了
PIC寄存器的地址,復位向量及狀態位址。
格式: INCLUDE “文件名”
例: INCLUDE “picreg.egu”
7. Radix——進制定義指令。
格式: RADIX <進制表達式>
例: RADIX dec ; 十進制
RADIX Hex ; 十六進制
RADIX oct ; 八進制
二、列表偽指令
1. LIST——列表選擇指令,設置各種匯編參數。
格式: LIST〔<選擇項>…<選擇項>〕
例: LIST F=INHX8M, R=DEC, P=16C84
以下是LIST選項表:
選項 | 默認值 | 作用 |
C=nnn | 80 | 行寬 |
N=nnn | 59 | 每頁的行數 |
T=ON/OFF | OFF | ON截去超長行的超出部分 |
P= | 無 | PIC12C/16C/17C |
R= | hex | 常數進制選擇:hex,dec,oct |
F= | INHX8M | 燒寫文件格式:INHX16,INHX32和INHX8M |
表4.3
2. PAGE——分頁命令。
格式: PAGE
在列表文件中(.lst)中產生分頁效果,即下面的文件輸出將從新頁面開始。
3. TITLE——程序標頭命令。
格式: TITLE '程序標頭'
例: TITLE 'This is for PIC12C50X demo'
標頭最長不超過60個字符。TITLE令會造成分頁,即標頭總是在一頁的第一行上。
三、控制偽指令
1. ORG——定義程序存放起始地址。
格式:<標號> ORG <地址表達式>
例: ORG 0h ; 起始程序存放地址
START: MOVWF OSCCAL
…
…
若ORG不帶地址參數,則默認為0。若ORG帶標號,則地址參數也賦值給該標號。
2. END——程序結束命令。
格式: END
例: END
這條指令告訴MPASM這是源程序(.ASM)的結束行,后面若還有語句將被視為無效。
3. IF——條件匯編命令。
格式: IF <條件表達式>
<源程序行>
<源程序行>
ENDIF
例: IF VER==100
MOVLW 5
WOVWF F11
ELSE
MOVLW 6
MOVWF F11
ENDIF
…
…
如果條件表達式為真,MPASM將匯編IF和ELSE之間的語句,反之匯編ELSE和ENDIF之間的語句。ELSE可以缺省,這樣條件為真則匯編,反之不匯編。
4. WHILE——條件循環命令。
格式: WHILE <條件表達式>
…
…
ENSW
例: VARIABLE i
WHILE i<count<>
MOVLW i
i=i+1
ENDW
注:VARIABLE也是一條定義變量的偽指令,和EQU及SET不同的是它不要求變量在定義時必須賦值給初值,如上例中的變量i。關于這條偽指令不再贅述。
四、宏定義偽指令
1. MACRO——宏定義命令。宏是一段指令,可以插在源程序中。宏必須事先定義好,宏之間可以互相調用,也可以自己遞歸調用。宏本身不會產生代碼,只是在調用它時把宏體插入源程序,這點和子程序調用有本質不同,即宏并不會節省程序空間,它主要的好處是令程序書寫簡潔明了。
格式: <標號> MACRO〔<參數1>…<參數N>〕
(宏體)
ENDM
例:GET MACRO X,Y,Z
MOVWF X
Y
Z MOVLW 10
GOTO Z
ENDM
宏調用可以下為:
…
GET F0,(INCF F17,W), ENTRY
…
則匯編后這句宏調用產生的源代碼為:
GET F0,(INF17,W), ENTRY
+ MOVWF F0
+ INCF F17,W
+ ENTRY MOVLW 10
+ GOTO ENTRY
前面帶+號表示是宏體中定義的程序。
§4.4 錯誤/警告信息
MPASM匯編一個源程序后,可以產生一個.ERR文件,該文件用來存放匯編后可能產生的錯誤或警告信息。必須強調的是錯誤信息(Error)是指出源程序中出現“致命”(fatal)的錯誤,用戶必須修改直至匯編后Errors= 0。而警告信息(Warnings)是指出源程序中可能有問題的地方,但并不一定是“致命”錯誤,只是提醒用戶去注意這些被警告的地方。如果用戶可以確認無誤,便可以不理會產生的Warnings。
一、錯誤信息
1.Address exceeds maximum limit avaiable
程序存儲器地址溢出(超出)有效范圍。
2.Attempt to redefine reserved word
MPASM中的保留字如“END”、“ERROR”、“HIGH”、“LOW”和“PAGE”被重定義,用戶必須避免再將其用做標號或變量。
3.Branch or jump out of range
程序跳轉指令如“GOTO”、“CALL”等超出規定的范圍。
4.Couldn't open…
TMPASM 不能打開“.OBJ”、“.map”、“.Hex”、“.Err”、“.Lst”或“.ref”文件。一般是電腦已沒有足夠的磁盤空間。
5.Couldn't open source file…
匯編的源程序文件不存在。
6.Duplicate lable or redefininy symbol that cannot be redefined
標號或變量名重復定義。
7.Error in parameter
參數錯誤。
8.Expected…
源程序行有錯。
9.File not found
指定的文件找不到。
10.Illegal argument
非法參數。
11.Illegal condition
IF語句中的條件符號出錯。
12.Illegal condition,EOF encountered before END or conditional end directive
IF、WHILE或MACRO語句中缺少相應的ENDIF、ENDW和ENDM。
13.Illegal conditional compile
IF/ELSE/ENDIF結構書寫有錯。
14.Illegal character…in label…
在標號字符中出現非法字符。合法的字符是“-”、“·”、“A”~“Z”、“a”~“z”、“0”~“9”。
15.Illegal digit
非法數字。如在十進制數中出現十六進制符等。
16.Illegal opcode
非法操作數。
17.Include file not found
Include 指令中的文件找不到。
18.Include files nested too cleep
Include 文件嵌套太多。Include 文件嵌套最多的為5重。
19.Macro name missing
缺少宏定義名稱。
20.Marco nested too deep
宏體嵌套太多。宏體中最多可嵌套8重。
21.Missing arguments
缺少參數,如指令中缺少操作數等。
22.Missing terminator
缺少配對符,如各種括號“)”、“〕”、“}”或“·”、空格等。
23.Nested forward reference not allowed.
使用未定義的標號、變量、宏定義等?;蛘呤荕PASM不能確認標號的類型,一般由標號重復定義引起。
24.Out of memory
程序空間溢出。
25.Overwriting previous address contents
程序空間重復使用。一般由地址定義指令ORG定義不當引起。
26.Processor type is undefined
單片機芯片型號未定義。要么在源程序中未定義,要么在使用MPASM匯編時未定義。
27.Processor type previously defined
單片機芯片型號重復定義。
28.Symbol table full
符號表溢出。
29.Temp file creation error
MPASM在匯編過程中會使用一些臨時性文件。這個錯一般是電腦磁盤滿或讀寫出錯引起。
30.Too many arguments
參數太多,如指令操作符帶過多的操作數。
31.Undefined argument
使用了未定義的參數。
32.Unknow error
MPASM碰到未知的錯,這種情況一般很少發生。
33.While failed to terminate within 256 iterationg
While 語句中沒有結束的條件產生。
二、警告信息
1.Addresses above 32K not currently supported. Using MaxRom.
MPASM目前只允許源程序使用8000H(32K)以下的程序地址。將來可以增加到64K。
2.Argument out of rauge,least significant bits used.
參數超出所允許的范圍值。MPASM一般會把超出的值自動截為認可的最大值。
3.Crossing page boundary--ensure page blts are set
MPASM通知你程序跨頁面了,建議你確認相應的頁面位是否已經設置了。
4.…Is not currently supported
使用了MPASM尚未支持的指令。
5.…Not a single byte quantity
使用了超出8位的數值。
6.This number is being treated as a binary representation
MPASM碰到不知是二進制或十六進制的值,如b 0101。這時MPASM都會把它當做二進制處理。上例如果要表示16進制,應寫成ox b0101或H'b0101'。
§4.5 使用MPASM來匯編PIC12C5XX的問題
如果用戶手中的MPASM版本是97年前的老版本,則在Processor Type中尋不到PIC12C508/509,怎么辦?不要緊,因為PIC12C5XX和PIC16C5X的指令是完全一樣的。所以如果手中的MPASM是老版本,可以用如下方法來操作:
匯編對象 | Processor Type |
PIC12C508 | 16C54 |
PIC12C509 | 16C58 |