ARM 汇编 伪指令 MACRO及MEND

原文链接:http://hi.baidu.com/wypnewbie/blog/item/fd315f5128a009571138c22a.html

MACRO伪操作标识 宏定义的开始,MEND标识宏定义的结束。
用MACRO 及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段

语法格式
MACRO
{$label}  macroname {$parameter {,$parameter}...}
;code
...
;code
MEND

其中:
$labelz在宏指令被展开时,label可被替换成相应的符号,通常是一个标号。在一个符号前使用$标识程序被汇编时将使用相应的值来替代$后的符号
Macroname为所定义的宏的名称
$parameter为宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以在宏定义时为参数指定相应的默认值。
      MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
sub    sp,sp,#4    ;decrement sp(to store jump address)
stmfd    sp!,{r0}    ;PUSH the work register to stack(lr does not push because it return to original address)
ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
ldr     r0,[r0]     ;load the contents(service routine start address) of HandleXXX
str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
ldmfd   sp!,{r0,pc}     ;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!,{r0}  
ldr     r0,=HandleFIQ
ldr     r0,[r0]     
str     r0,[sp,#4]      
ldmfd   sp!,{r0,pc}    


下面一句一句分析一下,为了便于分析,假设sp = 0x33ff8000$HandleLabel = 0x33ffff00,

[0x33ffff00] = 0x10000000,r0 = 0x56001234

$HandlerLabel HANDLER $HandleLabel

宏的名字叫HANDLER ,有两个参数

$HandlerLabel
定义一个标号

sub sp,sp,#4

把栈顶指针减4,留出一个字的空间(用于保存跳转地址的值),sp=0x33ff7ffc

stmfd sp!,{r0}

首先把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}  

把栈顶的两个字弹出,分别保存到r0、pc,此时sp=0x33ff8000,r0=0x56001234,pc=0x10000000 ,通过比较不难发现,sp和r0在执行前后都没有变化,程序就跳转到0x10000000处执行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值