宏指令是汇编功能的另一种扩充。在我们编写程序时,常常会遇到这种情况:一些程序段它们的结构相同,但在不同情况下使用的参数不同,这时可以把那变化的参数定义为形参,采用宏指令的方法来解决。在汇编时,汇编程序将填入相应的实参,把它们逐条汇编并生成到相应的程序中去。
一个宏指令是汇编语句的一个代码段,其中可以包含有形参,所谓形参是指它的值由引用宏指令时定义,在编写宏指令时它仅仅是一个符号而已。每个宏指令都有一个宏指令名,在程序中可以通过引用它的名字以及给定所需要的参数使用它。宏指令通在汇编语句的命令中使用,参数出现在参数部分中,宏指令每次在程序中引用时,通过实参对形参的替换,使程序中宏指令中的形参获得实际值。一个宏指令必须在它的第一次使用之前被定义。通常,所有的宏指令的定义都集中在程序的首部,宏指令的定义格式如下:
宏指令名 MACRO 形参表
(宏指令体)
ENDM
MACRO和ENDM语句是宏指令定义的标志,它们指出了宏指令的首部和尾部。每个MACRO语句必须有一个匹配的ENDM语句。这些语句不使用标号。
宏指令名按照汇编程序中的其它符号名约定,宏指令名被加到汇编程序符号表中,并赋给一个宏指令类型。因而它必须有唯一的名字。其名字将包括在汇编程序列表输出的汇编符号清单中。
形参表是在宏指令定义中使用的形参集合。这些参数用符号表示,且仅仅在宏指令定义中使用,而不被加到汇编符号表中。它们只能在宏指令中的代码块中使用。各个形参在参数表中应该用逗号隔开。宏汇编中,每个宏指令最多可支持40个参数。但是,参数表必须与MACFO指令在同一行上,由于每一代码行最大长度为80个字符,因形参的数量也受这个条件限制,参数表是任选的,所以一个宏指令也可以是无参的。
宏指令是程序块,它可以是任何汇编语言或伪指令,但由于汇编程序不支持嵌套的宏指令,因此,在宏指令体内不能再使用宏指令或对其他宏指令进行定义。形参可以在代码段语句的任何域中使用,包括标号、命令、参数和注解。形参经常被用作为参数,但是也有可以在其它域中使用。
一个宏指令的主要特点是形参的使用。当宏指令在程序段中被调用时,调用处的实际参数替换定义中的形参。因此,宏指令每次被调用时,通过使用时提供的一个唯一的实际参数集,就生成一个唯一的代码段。一个简单的宏指令定义如下所示:
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
CLR A
MOV R3,A
ABC R2,#25H,INC R3
NOP
JK @R0,R2,ADD,A,R6
NOP
ABC #4FH,#39H,DEC A
NOP
END
该程序中前部是两个宏指令定义,前一个宏指令为ABC,第二个为JK。后部为主程序,在主程序中ABC、JK分别被引用。汇编后的列表文件如下:
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 E4 CLR A
0001 FB MOV R3,A
0002 ABC R2,#25H,INC R3
+0002 EA MOV A,R2
+0003 7C25 MOV R4,#25H
+0005 0B INC R3
+0006 1D DEC R5
0007 00 NOP
0008 JK @R0,R2,ADD,A,R6
+0008 0A INC R2
+0009 E6 MOV A,@R0
+000A 2E ADD A,R6
000B 00 NOP
000C ABC #4FH,#39H,DEC A
+000C 744F MOV A,#4FH
+000E 7C39 MOV R4,#39H
+0010 14 DEC A
+0011 1D DEC R5
0012 00 NOP
0000 END
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

