发布网友 发布时间:2024-09-27 01:42
共1个回答
热心网友 时间:9分钟前
书接上回,上篇文章让我们初次接触了汇编编程。本文将验证一些常用的汇编指令,以更好地理解计算机运行原理。
在asm_main.s文件中,我们首先验证了CM3权威指南P页的内容:
验证LDR伪指令
在my_main标号下添加以下内容:
在KEIL仿真中,可以看到R0变成了0x10。
同时,这也证明了这是一条伪指令,在汇编器中会被替换成上图中的形式,立即数会被替换成基于PC指针的偏移量。
在执行LDR R1,=loop这一句前,可以看到loop标号对应的地址为1038h。
执行完后,可以看到R1的值为1039h,它自动把LSB置位1了!但是这里汇编器的注释地址为103Ch,笔者不清楚为什么。
验证ADR指令
在main标号下写入以下代码:
可以看出,ADR指令移动的是一个程序地址,但是并没有让LSB置1。
尝试进入ARM模式抛出错误
众所周知,CortexM3不能进入ARM模式,只能在Thumb模式下运行,否则就会进入fault错误。
如果此时使用BLX指令进入它呢?
各位,请看仿真:
当单步调试时,CM3并不会进入fault,但是一旦让它全速运行,立即跳到HardFault处理函数,并且模式从Thread态跳到Handler态。
如图,进入HardFault处理函数。
-2023.12.28于HNIP9607
By Sightseer.