ARM指令状态切换到Thumb指令状态_arm切换thumb指令_何有飞的博客-程序员宅基地

技术标签: ARM  arm  

<span style="white-space:pre"></span>
	AREA Arm_to_Thumb,CODE, READONLY
	ENTRY
	CODE32
start
	ldr r0,=aaa+1
	mov r3,#18
	bx r0
	CODE16
aaa 
	mov r1,#12
	mov r2,#10
	END
	


请看上面的代码,首先看到第一条指令,ldr r0,=aaa+1,aaa可以理解成一个函数的名字,那么函数aaa执行的时候是不是有第一条指令啊,这条指令是什么呢,那当然是mov r1,#12这条指令了,所以ldr那条指令的意思是:函数aaa的执行时的pc值+1,给r0寄存器,什么是pc值,就是程序计数器的意思,不懂的可以百度一下咯。至于这里为什么要加1,先不要急,看下面的语句,第二条语句是mov r3,#18,这个应该很好理解,我就不解释了,那么我把这么简单的指令放在这里干什么呢,为了说明这个程序计数器pc的变化过程,以便读者更好的理解随着程序的运行,pc值是怎么变化的。下面我贴一张调试到mov r3,#18那条指令是的图片,注意调试到mov r3,#18这条指令,并这条指令并没有运行,只不过是取址的状态,好了,话不多说,贴图:


注意上面的图片中的黄色箭头是我按单步执行后,按了一下后,箭头所在的位置,这时的R15的值是0x00000004,表示正在执行的指令的地址,当R15的值为0x00000000时,黄色箭头你说在哪里呢,当然是在ldr那条指令那里了,并且表示ldr指令并没有执行。请大家再看,R0的值为什么是0x0000000D呢,R0等于aaa+1,那么aaa是不是就等于十六进制的C啊,等于十进制的12啊,为什么会等于12呢,这就和R15寄存器有关了,待会运行到bx指令的时候再解释,我再单步进入,看截图:


大家只要看黄色的箭头即可。接下去是运行bx指令了,bx指令是什么东西呢,你们可以查阅相关资料,首先bx指令格式:BX{cond}     Rm   ,指令功能,BX指令跳转到Rm指定的地址去执行程序,若Rm的bit0为1,则跳转时自动将CPSR中的标志T置位,即把目标地址的代码解释为Thumb代码,如果为bit0位为0的话,则跳转时自动将CPSR中的标志T复位,即把目标地址的代码解释为ARM代码。

所以你先看看现在的R0的值是0x0000000D,bit0位为1,所以是把ARM指令状态跳转到Thumb指令状态,那么BX既然是一种跳转指令,则应该是偶数啊,D等于13不是偶数呀,这里我给你算算哈,当黄色的箭头指向mov r1,,#12,时,此时R15寄存器的值肯定是0x0000000C了,因为bx指令也是种ARM状态下的指令嘛,所以,当黄色光标指向mov r1,#12时,R15的值是0x0000000C了,这时你应该清楚为什么R0的值为0x0000000D了,就是C+1嘛,1只不过给个信号,我的程序要从ARM状态跳转到Thumb状态的程序中执行了。

T






所以请你猛看这里CPSR寄存器中的T位:从0(ARM状态)变成1(Thumb状态)



怎么验证已经到Thumb状态了呢,请看我再次运行哈:



这张图片中的R15是0x0000000E,上张图片的R15是0x0000000C,相差为2,所以说明已经转化成Thumb状态了,因为Thumb每条指令占用2个字节,16位。还有一点我想说明的是其实在你程序运行之前,每条指令的所对的PC值,是确定的,更为直观点的说法是,黄色箭头此时指向哪一条指令,这时的PC值你确定的,可以笔算的,注意全文所说的PC值就是R15寄存器的值。aaa只不过是一个函数的名字,取啥名儿都无所谓,zhangsan也行啊,哈哈。


啰嗦了半天,不知道有没有把这个转化过程讲清楚,如果还有不懂的,可以直接留言啊。



下面我想说说Thumb指令状态切换到ARM指令状态,原来和上述一样,这里我只贴个短小而精悍的代码了:



	AREA Arm_to_Thumb,CODE, READONLY
	ENTRY
	CODE16
start
	ldr r0,=zhangsan
	mov r3,#18
	bx r0
	CODE32
zhangsan 
	mov r1,#12
	mov r2,#10
	END
	



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011449588/article/details/44634977

智能推荐

朴素贝叶斯分类-西瓜分类python_朴素贝叶斯分类算法流程西瓜-程序员宅基地

1.算法思想——基于概率的预测贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的标记类别。2. 理论基础2.1 贝叶斯定理这个定理解决了现实生活中经常遇到的问题:已知某条件概率,如何得到两个时间交换后的概率,也就是已知P(B∣A) 的情况下如何求得P(B∣A)条件概率P(B∣A):事件B已经..._朴素贝叶斯分类算法流程西瓜

集成开发环境Visual studio的下载安装(新老版本)_安装visual studio 旧的版本_sq-helloworld的博客-程序员宅基地

文章目录前言一、Visual studio下载(社区版)二、安装需注意的我也是小白,以下为个人见解,若有错误可以在下面提出,感谢!前言1、Visual Studio 可以开发应用程序,像桌面应用程序、移动应用程序、ASP.NET Web 应用程序和 XML Web Services。并且可以用 Visual Basic、Visual C#、Visual C++、Visual F# 和 JavaScript 编写代码,此外,可以在 .NET Framework 中通过访问重要技术来简化 Web 应用_安装visual studio 旧的版本

英飞凌TC264D单片机供电电路设计_ycit000的博客-程序员宅基地

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

VUE实现下载后端返回Excel文件流_vue 返回文件流如何下载-程序员宅基地

vue实现后端返回文件流,解析并下载_vue 返回文件流如何下载

scanf函数的理解_python scanf函数-程序员宅基地

scanf函数的理解函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。..._python scanf函数

cvui.h 使用总结_cvui 显示文字后消失-程序员宅基地

很多情况下个人更多用QT搭配opencv进行一系列开发,QT可以迅速开发出合乎要求的界面。但是实际上,试验过程中并不需要一个美观且功能齐全的界面,使用opencv进行图像处理,可能反反复复使用的是按键、勾选按钮、图片显示、参数修改或者显示等功能,这些小功能似乎没必要动用QT的牛刀。有一个非常小巧的GUI库,CVUI。它是建立在OpenCV绘图基元之上的,除OpenCV之外,没有任何依赖性。而使..._cvui 显示文字后消失

随便推点

计算机c语言二级题库108套,国家计算机二级C语言108套操作题真题及答案解析试题精编版.doc...-程序员宅基地

所属年份:2010.9;2011.3;2012.3;2012.9下列给定程序中,函数fun的功能是:计算如下公式直到,并且把计算结果作为函数值返回。例如,若形参e的值为1e-3,则函数返回值为0.551690。请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!#include double fun(do...

安装 .NET Framework的技巧以及探究路径-程序员宅基地

我需要安装哪些版本的 .NET FrameworkWindows 10 1709 内置4.7.1,安装 3.5;Windows 10 1703 内置4.7,安装 3.5、4.7.1;Windows 10 1607 内置4.6.2,安装 3.5、4.7.1;Windows 10 1511 内置4.6.1,安装 3.5、4.7;Windows 10 1507 内置4.6,安

报错信息ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by............)-程序员宅基地

Linux上运行“.py”文件,报错信息:ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by anaconda3/lib/python3.6/site-packages/scipy/sparse/_sparsetools.cpython-36m-x86_64-linux-gnu.so)...

立委科普:问答系统的前生今世-程序员宅基地

立委科普:问答系统的前生今世李维老师的文章看起来就是过瘾,这篇文章也是刚刚在科学网上看到的,还有下一篇,感兴趣的读者可以继续关注。前段时间IBM超级计算机沃森(Watson)刚刚出了一把风头,也让关注自然语言处理的读者更关注起自动问答系统了,李维老师的这篇博文无疑让我们对于问答系统的前世今生又有了一次深刻的了解,所以厚着脸皮,以下继续全文转载自李维老师的博文:立委科普:问答系统的前

GBK编码和UTF-8编码互转的大坑-程序员宅基地

  这几天遇到一个BUG,问题很简单,解决却花了3、4天,特意记录下来。  linux环境下,将默认编码设置为GBK以后,运行GBK编码的脚本,调用一个Java的jar包,然后总jar包中返回GBK字符串。但是不知道是哪里出了问题,返回的参数一直是问号乱码。  放上脚本代码:#!/bin/bash#str="\"$1 $2 $3\""str=...

了解JRE和JDK_nilgnat的博客-程序员宅基地

在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别: JVM -- java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,...