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 指定當前...