单片机代理商深圳英锐恩分享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.
使用未定义的标号、变量、宏定义等。或者是MPASM不能确认标号的类型,一般由标号重复定义引起。
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 |