历史上的今天
今天是:2025年03月06日(星期四)
2020年03月06日 | 【ARM裸板】未定义指令异常分析及示例
2020-03-06 来源:eefocus
1.未定义指令异常示例
根据5.1可知,执行异常处理函数之前,硬件会处理的事情:
1.lr_und保存有被中断模式中的下一条即将执行的指令的地址
2.SPSR_und保存被中断模式CPSR
3.CPSR的[M4:M0]=[11011],进入到und模式
4.跳到0x04的模式执行程序,即跳到b do_und这一指令
/*====================================异常向量表===========================================*/
_start:
b reset //vector 0: reset(0地址对应reset)
ldr pc, =und_addr //绝对跳转,跳转至sdram中,vector 4: und (发生未定义指令异常,则进入“处理未定义异常函数”)
und_addr:
.word do_und //存放地址,确保这一地址存放在内存的前4K中
/*=================================处理未定义异常=========================================*/
do_und:
/*执行到这里之前:
*1.lr_und保存有被中断模式中的下一条即将执行的指令的地址
*2.SPSR_und保存被中断模式CPSR
*3.CPSR的[M4:M0]=[11011],进入到und模式
*4.跳到0x04的模式执行程序,即跳到`b do_und`这一指令
*/
/* sp_und 设置栈,因为后面函数需要栈 */
ldr sp, =0x34000000
/* 保存现场 */
/* lr是异常处理完后的返回地址,也需要保存 */
stmdb sp!, {r0-r12,lr} //在und异常处理函数总有可能需要用到r0~r12,因此先保存下来
/* 处理und异常 */
mrs r0,cpsr //把cpsr的值放入r0
ldr r1, =und_string
bl printException
/* 恢复现场 */
ldmia sp,{r0-r12,pc}^ //将lr的值赋给pc ,`^`会把spsr的值恢复到cpsr中
und_string:
.string "undefined instruction exception"
.align 4 //确保4字节对齐
1.1 在汇编中加入string
官方文档
.string "str" Copy the characters in str to the object file. You may specify more than one string to copy, separated by commas. Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte. You can use any of the escape sequences described in section Strings.
在字符串后最好加一句·.align 4 ,确保后续的程序4字节对齐
und_string:
.string "undefined instruction exception"
.align 4 //确保4字节对齐
1.2 MRS & MSR
ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据
MRS: 状态寄存器到通用寄存器的传送指令
mrs r0,cpsr //将CPSR的值读出放在r0
MSR: 通用寄存器到状态寄存器的传送指令
msr cpsr, r0 //将r0的值写入CPSR
1.3 设置und的栈
由于后面需要保存寄存器数数据、以及发生函数调用并且需要传递参数,需要用到栈,因此需要先设置栈(随便指向一块未使用的内存)
/* sp_und 设置栈,因为后面函数需要栈 */
ldr sp, =0x34000000
1.4 保存现场
根据未定义指令异常寄存器资源,在und异常处理函数总有可能需要用到r0~r12,因此先保存下来(保存在栈中)
以及lr寄存器,后面还需要返回
stmdb sp!, {r0-r12,lr}

1.5 处理异常
打印提示发生未定义异常,并打印CPSR的值
mrs r0,cpsr //把cpsr的值放入r0
1.6 恢复现场
依次恢复r0~r12的值,恢复cpsr的值,并把lr的值赋给PC,
ldmia sp,{r0-r12,pc}^ //`^`会把spsr的值恢复到cpsr中
1.7 验证
CPSR = 0x600000db
确实满足CPSR的 [M4:M0] = 11011,为未定义指令异常

2.程序执行过程
上一篇:【ARM裸板】软件中断分析及示例
史海拾趣
|
1.概述 虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它 ...… 查看全部问答> |
|
整理了一天,打印时记得用双面A4,因为是按照双面排版的! 下载了记得顶一下,本人刚注册的号,积分不多,帮忙挣点积分了好下载资料,在此谢过了!! (本教材中有少部分图片不是很清楚,不过不影响大局 ...… 查看全部问答> |
|
pos端疑问(请有实际开发经验的同仁帮忙解答) (有分连接) 本人目前所在项目是做一个pos对端服务系统,通过socket负责解析pos传送过来的封包数据。现在pos那端提出他们不支持断点续传功能,也就是假设时间段内发送1000个数据包,有任意一条出错就必须从头再传,基于程序设计逻辑考虑这样肯定是不合适的。pos ...… 查看全部问答> |
|
要用C#开发WINDOWS CE的应用程序,学习的资料谁能给点啊? 用VS2005开发WINDOWS CE的资料好少啊,尤其是中文的,谁能给点啊? 原来一直开发桌面程序的,现在单位需要,要开发WINDOWS CE下的应用程序。 谁能给点学习资料啊?最好是中文的。… 查看全部问答> |
|
阿牛哥6月28日去北京国际会议中心参加安富利ARM系统设计策略研讨会。 这是安富利ARM系统设计策略研讨会在亚洲第一站,这个研讨会将持续三个月时间,在大陆8个城市举办,后续还会在台湾,新加坡 ,韩国 ,印度等举行,真是 ...… 查看全部问答> |





