ARM 彙編 偽指令 MACRO及MEND

2021-05-28 15:00:06 字數 2676 閱讀 4885

macro偽操作標識 巨集定義的開始,mend標識巨集定義的結束。

用macro 及mend定義一段**,稱為巨集定義體,這樣在程式中就可以通過巨集指令多次呼叫該**段

語法格式

macro

macroname ...}

;code

...;code

mend

其中:$labelz在巨集指令被展開時,label可被替換成相應的符號,通常是乙個標號。在乙個符號前使用$標識程式被彙編時將使用相應的值來替代$後的符號

macroname為所定義的巨集的名稱

$parameter為巨集指令的引數。當巨集指令被展開時將被替換成相應的值,類似於函式中的形式引數。可以在巨集定義時為引數指定相應的預設值。

macro

$handlerlabel handler $handlelabel

$handlerlabel

sub    sp,sp,#4    ;decrement sp(to store jump address)

stmfd    sp!,    ;push the work register to stack(lr does not push because it return to original address)

ldr     r0,=$handlelabel;load the address of handle*** to r0

ldr     r0,[r0]     ;load the contents(service routine start address) of handle***

str     r0,[sp,#4]      ;store the contents(isr) of handle*** to stack

ldmfd   sp!,     ;pop the work register and pc(jump to isr)

mend

;;在程式中呼叫

handlerfiq      handler handlefiq

handlerirq      handler handleirq

handlerundef    handler handleundef

handlerswi      handler handleswi

handlerdabort   handler handledabort

handlerpabort   handler handlepabort

比如第乙個為例說明 handlerfiq      handler handlefiq

;;程式被彙編後,巨集展開的結果

handlerfiq

sub    sp,sp,#4   

stmfd    sp!, 

ldr     r0,=handlefiq

ldr     r0,[r0]    

str     r0,[sp,#4]     

ldmfd   sp!,   

下面一句一句分析一下,為了便於分析,假設sp =0x33ff8000

$handlelabel =0x33ffff00,

[0x33ffff00]

=0x10000000,r0 = 0x56001234

$handlerlabel handler $handlelabel

巨集的名字叫handler ,有兩個引數

$handlerlabel

定義乙個標號

sub sp,sp,#4

把棧頂指標減4,留出乙個字的空間(用於儲存跳轉位址的值),sp=

0x33ff7ffc

stmfd sp!,

首先把sp減4 (sp=

0x33ff7ff8),然後把將要使用的r0暫存器入棧,此時[0x33ff7ff8]=0x56001234

ldr     r0,=$handlelabel

給暫存器r0賦值,r0=0x33ffff00

ldr     r0,[r0]

給暫存器r0賦值,r0=0x10000000

str     r0,[sp,#4]

;把暫存器r0儲存到0x33ff7ffc (0x33ff7ff8+4),sp沒有改變sp=0x33ff7ff8,如果

str     r0,[sp,#4]!sp 改變

此時 ;[0x33ff7ffc] = 0x10000000

ldmfd   sp!,

把棧頂的兩個字彈出,分別儲存到r0、pc,此時sp=0x33ff8000,r0=0x56001234,pc=0x10000000,通過比較不難發現,sp和r0在執行前後都沒有變化,程式就跳轉到0x10000000處執行

ARM彙編偽指令

global,local,set,equ global 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol local set 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set star...

ARM彙編偽指令

資料定義偽指令 彙編控制偽操作 雜項.global,local,set,equ 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set st...

ARM彙編偽指令

用來做注釋。可以在行首也可以在 後面同一行直接跟,和c語言中 類似 做注釋,一般放在行首,表示這一行都是注釋而不是 以冒號結尾的是標號 點號在gnu彙編中表示當前指令的位址 立即數前面要加 或 表示這是個立即數 global start 給 start外部鏈結屬性 section text 指定當前...