ARM-Linux汇编的宏定义语法说明如下:

使用注意:

1.宏定义以.macro开始,以.endm结束

2.可带参数,参数可有默认值

3.直接使用参数的名字\arg

vector_stub宏的功能:

计算处理完异常的返回地址;

保存寄存器(r0,lr,spsr)

进入管理模式;

最后根据进入异常前的模式跳转到相应的某个分支。

 /*
* Vector stubs.
*
* This code is copied to 0xffff0200 so we can use branches in the
* vectors, rather than ldr's. Note that this code must not
* exceed 0x300 bytes.
*
* Common stub entry macro:
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
*
* SP points to a minimal amount of processor-private memory, the address
* of which is copied into r0 for the mode specific abort handler.
*/
.macro vector_stub, name, mode, correction=
.align vector_\name:
.if \correction
sub lr, lr, #\correction
.endif @
@ Save r0, lr_<exception> (parent PC) and spsr_<exception>
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #] @ save spsr @
@ Prepare for SVC32 mode. IRQs remain disabled.
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE)
msr spsr_cxsf, r0 @
@ the branch table must immediately follow this code
@
and lr, lr, #0x0f
mov r0, sp
ldr lr, [pc, lr, lsl #]
movs pc, lr @ branch to handler in SVC mode
.endm

展开

 /*
* Interrupt dispatcher
*/
vector_stub irq, IRQ_MODE, .long __irq_usr @ (USR_26 / USR_32)
.long __irq_invalid @ (FIQ_26 / FIQ_32)
.long __irq_invalid @ (IRQ_26 / IRQ_32)
.long __irq_svc @ (SVC_26 / SVC_32)
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @ a
.long __irq_invalid @ b
.long __irq_invalid @ c
.long __irq_invalid @ d
.long __irq_invalid @ e
.long __irq_invalid @ f

后得到

 /*
* Interrupt dispatcher
*/
.align vector_irq:
sub lr, lr, # //保存irq返回地址 @
@ Save r0, lr_<exception> (parent PC) and spsr_<exception>
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #] @ save spsr @
@ Prepare for SVC32 mode. IRQs remain disabled.
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE)
msr spsr_cxsf, r0 //对spsr的所有控制位进行写操作,将r0的值全部注入spsr,进入svc模式 @
@ the branch table must immediately follow this code
@
and lr, lr, #0x0f //根据进入中断前的模式跳转到相应的中断处理函数
mov r0, sp
ldr lr, [pc, lr, lsl #]
movs pc, lr @ branch to handler in SVC mode .long __irq_usr @ (USR_26 / USR_32)
.long __irq_invalid @ (FIQ_26 / FIQ_32)
.long __irq_invalid @ (IRQ_26 / IRQ_32)
.long __irq_svc @ (SVC_26 / SVC_32)
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @ a
.long __irq_invalid @ b
.long __irq_invalid @ c
.long __irq_invalid @ d
.long __irq_invalid @ e
.long __irq_invalid @ f

最新文章

  1. 阿里云服务器怎么去掉tomcat的8080端口
  2. Leetcode 313. super ugly number
  3. php继承、多态
  4. iOS开发--开发者帐号
  5. python - list, cllections模块的deque对象
  6. clientdataset&lt;----&gt;json
  7. Inno Setup入门(二)&mdash;&mdash;修改安装过程中的图片
  8. 浅尝JavaScript document对象
  9. 201521123081《java程序设计》 第12周学习总结
  10. 安卓笔记-- popupwindow back键不消失的问题
  11. Window环境下搭建Git服务器
  12. grep用法
  13. Vue之computed计算属性
  14. ado.net调用返回多结果集的存储过程
  15. linux学习 (Linux就该这么学)
  16. 【Ansible 文档】【译文】Playbooks 变量
  17. aapt获取包名和activity,启动app
  18. react-navigation设置navigationOptions中Static中使用 this 的方法
  19. MySQL查询字符串长度最长的记录
  20. corejava-内容梳理

热门文章

  1. 详解window.history
  2. C# 连接oracle,用32位client和64位Client,可能导致结果不同
  3. jQuery dataTable 操作个人使用总结
  4. android :fragmentation使用中遇到的 NullPointerException
  5. Got error 28 from storage engine的错误处理
  6. java控制远程ssh-JSCH(二)
  7. dstat参数选项
  8. Web端 年月日下拉表 密码判断 按钮判断是否提交
  9. APP自动化测试
  10. userBean-作用范围session