1. 程式人生 > >XMC啟動檔案中的“Entry“”理解

XMC啟動檔案中的“Entry“”理解

先看<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位元組對齊。