08-27-96
;%T Symbol Name Type Value
ABC . . . . . . . . . . . . . . M 0000
JK. . . . . . . . . . . . . . . M 0000
;%Z
00 Errors (0000)
在列表文件中,在调用宏指令处,实参数被充填到宏指令的形参处,并把宏指令体扩充到程序中形成代码。在这个例子中实参不仅代替了指令中的参数部分,而且还能代替整个指令。文件中最前列带“+”的语句为引用宏指令扩展的部分。宏指令被引用时,参数表上实参表应与所替代的形参相对应。在表中出现的参数必须用逗号隔开,汇编程序取逗号之间或与第一个逗号之间,或最后一个逗号与行尾之间的任何字符作为实际参数。这样,可以使用多个符号,甚至一个整条指令作为一个参数,只要在数中没有逗号就行。一个逗号不能作为一个参数的一部分被传递。汇编程序将滤去每个参数的前面和后面的空格,仅仅保留第一个到最后一个可打印字符。
此外,宏指令的实际参数表可以不与形参表完全匹配,即实际参数的数量可以多于或少于形参表中的形参个数。当参数空缺时,相应的形参在宏扩展时被取消,如果实际参数比形参多,则多余的实际参数将被忽略。最后一个在表中间的参数可以通过在参数表中间放两个逗号来赋空值。参见下面的例子。
ABC MACRO P1,P2,P3
MOV A,P1
MOV R4,P2
P3
DEC R5
ENDM
JK MACRO P1,X5,OPC1,ARG1,ARG2
INC X5
MOV A,P1
OPC1 ARG1,ARG2
ENDM
NOP
JK #33H,R3,NOP
SWAP A
NOP
JK R4,R2,ADDC,A,@R1,#66H
NOP
JK #40H,R4,,DEC R2
NOP
END
宏指令的另一个特点是形参可以被用作一个标号,如果一个形参被用作一个标号,当引用宏指令时,实参将成为标号。这就要求每次宏指令调用时,该实参不能相同。以避免标号重复定义错误。例:
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1
08-27-96
ABC MACRO P1,P2,P3
MOV A,P1
MOV R4,P2
P3
DEC R5
ENDM
JK MACRO P1,X5,OPC1,ARG1,ARG2
INC X5
MOV A,P1
OPC1 ARG1,ARG2
ENDM
0000 00 NOP
0001 JK #33H,R3,NOP
+0001 0B INC R3
+0002 7433 MOV A,#33H
+0004 00 NOP ,
0005 C4 SWAP A
0006 00 NOP
0007 JK R4,R2,ADDC,A,@R1,#66H
+0007 0A INC R2
+0008 EC MOV A,R4
+0009 37 ADDC A,@R1
000A 00 NOP
000B JK #40H,R4,,DEC R2
+000B 0C INC R4
+000C 7440 MOV A,#40H
+000E 1A DEC R2,
000F 00 NOP
0000 END
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2
08-27-96
;%T Symbol Name Type Value
ABC . . . . . . . . . . . . . . M 0B0D
JK. . . . . . . . . . . . . . . M 0000
;%Z
00 Errors (0000)
若在宏指信中使用标号,由于这些标号不是形参,所以不会被实参所替代。这样,在程序中多次引用是否会出现标号重复呢?在作宏汇编时,汇编程序会在所有标号尾部增加一个唯 一的四位数,以使多次引用时标号不会重复。例:
LMAC MACRO P1,P2,L1
ANL A,P1
JZ L1
ORL A,P2
L1: MOV @R1,A
INC R1
ENDM
MOV R1,#2AH
MOV A,#65H
LMAC R3,#0F0H,R3ANDA0
MOV A,#23H
LMAC R5,#07H,R5ANDA0
NOP
END
程序中有二个标号MATCH1及NOMATCH,宏指令被二次引用,经汇编后其列表文件如下:
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1
08-27-96
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

