Cortex-A7:在ARM状态下执行Thumb指令会发生什么?在Thumb状态下执行ARM指令会发生什么?

0 参考资料

ARM Cortex-A(armV7)编程手册V4.0.pdf

1 前言

Cortex-A7支持ARM和Thumb(Thumb-2)2个状态,在ARM状态下可以执行ARM指令,在Thumb(Thumb-2)状态下可以执行Thumb(Thumb-2)指令。在ARM和Thumb(Thumb-2)混合编程下,编译器会帮助我们完成CPU的状态切换,如果我们强行在ARM状态下执行Thumb指令会发生什么呢?在Thumb状态下执行ARM指令会发生什么?

2 Cortex-A7:在ARM状态下执行Thumb指令会发生什么?

本文以基于Cortex-A7内核的stm32MP135为例,测试在ARM状态下执行Thumb指令会发生什么。
方法:IRQ中断发生时会修改PC指针的值,我们人为将PC指针修改值bit0置0,让CPU切换到ARM状态,然后执行IRQ中断服务函数的Thumb指令。

2.1 查看编译生成的.list文件,修改镜像中断向量表

在这里插入图片描述
根据Cortex-A7向量表及.list文件我们知道红框标记处的0xc000810d是IRQ中断服务函数入口地址+1,这用来切换CPU到Thumb状态。
IRQ中断服务函数如下:
在这里插入图片描述

Cortex-A7向量表如下:
在这里插入图片描述
打开生成的镜像文件,找到偏移地址为0x338地址内容(之所以还要加0x200,是因为.stm32镜像加的头大小为0x200):
在这里插入图片描述
红框标记的值就是IRQ中断服务函数入口地址。
我们将这个值修改为0xc000810c(bit0设置为0),也就是让CPU切换到ARM状态,接着会执行IRQ中断服务函数的Thumb指令,看会有什么现象发生。

2.2 实验现象

在这里插入图片描述
程序直接卡死,没有任何反应。
这说明ARM状态下是不能执行Thumb指令的。

3 Cortex-A7:在Thumb状态下执行ARM指令会发生什么?

本文以基于Cortex-A7内核的stm32MP135为例,测试在Thumb状态下执行ARM指令会发生什么。
使用和2中类似的方法,在跳转到另一个函数(执行ARM指令)前将赋给PC的函数入口地址值+1,让CPU切换到Thumb状态。结果如下:
在这里插入图片描述
程序直接卡死,没有任何反应。
这说明Thumb状态下是不能执行ARM指令的。

4 总结

(1)ARM状态只能执行ARM指令不能执行Thumb指令;Thumb状态只能执行Thumb指令不能执行ARM指令。
(2)开发者无需关系ARM/Thumb状态的切换,编译器会自动生成正确的代码(如修改PC指针时给地址+1,切换到Thumb状态)。

注:Cortex-A7所指的Thumb指令集就是Thumb-2指令集,本文的Thumb指Thumb-2。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值