基本语法
1、MACRO 和 MEND
MACRO 和 MEND 伪指令可以为一个程序段定义一个名称。这样,在汇编语言应用程序中,就可以通过这个名称来使用它所代表的程序段,即当程序做汇编时,该名称将被替换为其所代表的程序段。
MACRO
$标号 宏名 $参数1, $参数2,…..
程序段(宏定义体)
MEND
$标号:为主标号,宏内的所有其它标号必须由主标号组成;
宏名:宏名称,为宏在程序中的引用名;
$参数1,$参数2:宏中可以使用的参数。
宏中的所有标号必须在前面冠以符号“$”。
MACRO、 MEND伪指令可以嵌套使用。
举一个更具体的例子
MACRO ;宏定义指令
$MDATA MAXNUM $NUM1,$NUM2 ;主标号,宏名,参数
语句段
$MDATA.WAY1 ; 宏内标号,必须写为“主标号.宏内标号”
语句段
$MDATA.WAY2 ; 宏内标号
语句段
MEND ; 宏结束指令
主程序中调用该宏:
Lab1 MAXNUM 0x01, 0x02
2、MEXIT
MEXIT 用于从宏定义中跳转出去。
实践
用汇编语言和宏实现1+2+3+4+5+6+7
接下来用两种宏定义实现
方法一
MACRO ;宏定义
$LABEL ADDRT $A,$B ;主标号,宏名,参数
$LABEL.ADDR ;宏内其他标号
ADD $A,$A,$B
ADD $B,$B,#1
CMP $B,#7
BLE $LABEL.ADDR
MOV R2,$A ;结果赋给R2
MEND
AREA ACC,CODE,READONLY ;段定义
ENTRY
CODE32
MOV R0,#0 ;给两个参数赋值
MOV R1,#1
ADDRT R0,R1 ;宏调用
END
方法二
感觉这个方法很不实用,因为只能事先指定寄存器,但实际应用中寄存器可能被占用,强行将宏与寄存器绑定了,这种状况下的好处就是没有显式传参,上一种方法还要传参。
MACRO ;宏定义
ADDRT ;宏名
ADDR ADD R0,R0,R1 ;程序段
ADD R1,R1,#1
CMP R1,#7
BLE ADDR
MEND
AREA ACC,CODE,READONLY ;段定义
ENTRY ;程序入口
CODE32
MOV R0,#0
MOV R1,#1
ADDRT ;无显式传参
END
程序正常运行的关键是不仅宏和汇编的格式要对,而且像标号这些要顶格写。