先看<startup_XMC4800.S>文件中的最前面的一段宏:
.macro Entry Handler
.long \Handler
.endm
这个宏使用的应该是Linux汇编程序宏定义的格式,如下:
.macro 宏名 参数名列表 @伪指令.macro定义一个宏
宏体
.endm @.endm表示宏结束
如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。宏定义时的参数还可以使用默认值。
可以使用.exitm伪指令来退出宏。
【例5】宏定义
.macro SHIFTLEFT a, b
那么前面的宏是在定义一个叫做Entry(入口)的宏,这个宏代用参数Handler。
接着看启动文件中怎么使用Entry宏,启动文件有这样的代码:
.syntax unified
.section .reset, "a", %progbits
.align 2
.globl __Vectors
.type __Vectors, %object
__Vectors:
.long __initial_sp /* Top of Stack */
.long Reset_Handler /* Reset Handler */
Entry NMI_Handler /* NMI Handler */
Entry HardFault_Handler /* Hard Fault Handler */
Entry MemManage_Handler /* MPU Fault Handler */
Entry BusFault_Handler /* Bus Fault Handler */
Entry UsageFault_Handler /* Usage Fault Handler */
“Entry NMI_Handler"这一句用宏替换后就翻译成.long NMI_Handler,也就是定义一个4字节的符号NMI_Handler作为不可屏蔽中断的入口地址向量。而在以后的程序如果定义NMI_Handler()中断函数,该函数的起始地址(句柄)将放到.reset段__Vectors表中的第8字节开始的4个字节中。
另外说面.align 2这一伪指令使用的是arm-linux是按照2^n的方案对齐的,也就是说.align 2表示的是以下代码4字节对齐。