历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2018年10月21日 | ARM指令状态切换到Thumb指令状态

发布者:SparklingEyes 来源: eefocus关键字:ARM  指令状态  Thumb 手机看文章 扫描二维码
随时随地手机看文章
  1.  


  2.     AREA Arm_to_Thumb,CODE, READONLY  

  3.     ENTRY  

  4.     CODE32  

  5. start  

  6.     ldr r0,=aaa+1  

  7.     mov r3,#18  

  8.     bx r0  

  9.     CODE16  

  10. aaa   

  11.     mov r1,#12  

  12.     mov r2,#10  

  13.     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指令状态,原来和上述一样,这里我只贴个短小而精悍的代码了:




[plain] view plain copy

  1.     AREA Arm_to_Thumb,CODE, READONLY  

  2.     ENTRY  

  3.     CODE16  

  4. start  

  5.     ldr r0,=zhangsan  

  6.     mov r3,#18  

  7.     bx r0  

  8.     CODE32  

  9. zhangsan   

  10.     mov r1,#12  

  11.     mov r2,#10  

  12.     END 


关键字:ARM  指令状态  Thumb 引用地址:ARM指令状态切换到Thumb指令状态

上一篇:ARM编程进阶之二 —— ATPCS与混合编程
下一篇:ARM裸机程序之存储管理器控制SDRAM

推荐阅读

近日,在由阿里巴巴、百度、腾讯、中国电信、中国移动、中国信息通信研究院以及英特尔联合主办的ODCC峰会期间,电源方案供应商Vicor推出了首款平板电源RFM系列3相AC/DC 48V转换器,仅为iPad大小,但输出功率达10000W,功率密度是传统3向AC/D解决方案的4倍,效率同样高达96%,解决了如今包括超算、AI在内的大功率服务器对于能源密度需求的痛点。这也是Vico...
2019年是智能产品的高速发展期,扫地机器人得到了快速的发展。可是,市面上扫地机器人品牌众多,到底哪个牌子的扫地机器人更好更实用呢?如果要评选今年最好用的扫地机器人,以下四款扫地机器人绝对能让你心服口服。第一款:斐纳TOMEFON TF-G85扫地机器人现如今,用扫地机器人帮忙打扫家庭卫生已经是很多年轻人的选择了,很多人在选择扫地机器人的时候都...
2020年10月16日,工业和信息化部主办的2020工业互联网网络创新大会盛大开幕,同期发布了我国第一个边缘计算产业促进项目“边缘计算标准件计划”首批产品评测结果。研华WISE-PaaS/IoTSuite智能边缘一体机凭借边云协同一体化、低代码高可用以及弹性扩充的优势,通过首批边缘云相关产品评测。 “边缘计算标准件计划”由中国信通院、中国电信、中国联通、华为...
10月19日,东方电子股份有限公司公告称,其全资子公司烟台东方威思顿电气有限公司与专业投资机构合作设立东方茸世(烟台)创业投资合伙企业(有限合伙)(以下简称“东方茸世”),并完成工商登记和私募基金备案。日前,东方茸世与上海先楫半导体科技有限公司(以下简称“先楫半导体”)及其原股东签署《增资协议》。东方茸世投资2000万元人民币,认购先楫...

史海拾趣

问答坊 | AI 解惑

Linux 2.6 内核中的最新电源管理技术综述

前言 本系列文章将结合近年来不断在各种硬件(包括 CPU、芯片组、PCI Express 等各种最新总线标准以及外设)上新增的节能技术,从 Linux® 2.6内核及整个 software stack (包括 kernel、middleware 以及各种用户态 utility)如何添加对这些创 ...…

查看全部问答∨

电子设计超声波

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 顶一下吧!  …

查看全部问答∨

PB 编译时出现说可能不支持boot 怎么办啊???

PB Debugger Warning:  Debugger service map is set to none.  If your image has debugging support it may not boot properly. PB Debugger Cannot initialize the Kernel Debugger. PB Debugger Debugger could not init ...…

查看全部问答∨

谁能做个仿POS的设备,回帖有分。

手持式设备的要求 1. 内置打印机,有外置打印机接口,可使用外部打印机快速打印 2. 支持MODEM 电话拨号连接 3. 有ETHernet 网络接口 4. 显示屏 3.0寸以上黑白 5. 支持二次开发,至少提供API,驱动等 6. 内置大容量可充电电池,至少保障工作24 ...…

查看全部问答∨

急,关于用WAVECOM无线模块发送彩信的问题

现在我在做毕设,就是要用WAVECOM发彩信 型号:wavecom Q2406 PL 002 在我往串口发送了 AT+CGDCONT=1,"IP","CMWAP" ATD*99***1# 之后,服务器给我重复了好多次,发了这样的一段数据:(我用了ACCESSPORT来显示串口收到的16进制数据) ...…

查看全部问答∨

有售价的资料,下载时所付的芯币给了谁?

我上传的资料售价是1芯币,被下载了100多次怎么不见我的芯币有所增加呢?哪位版主帮我解释下? [ 本帖最后由 ming1005 于 2010-9-16 21:03 编辑 ]…

查看全部问答∨

急救啊!CCS因为硬件初始化不成功进不了

         开始用的好好的系统,在调试程序的时候出现硬件初始化不成功的错误,然后重进CCS,接着就调出对话框如下错误:can\\\'t initialize target cpu  error 0x80000240/-200  fatal error ...…

查看全部问答∨

谁有AD12序列重复采集的程序 啊 ?

序列重复采集时,需要判断最后一通道的中断位吗? 是不是吧AD12MEM中的数据读走以后 它会自动再去采集啊…

查看全部问答∨

一个FFT程序的小问题

做一个FFT的实验,有个程序如下:   /*构造要做FFT的序列,按实部0、虚部0,实部1,虚部1...顺序构造,虚部为0*/   for (i=0;i<nx1;i++)   {        x1[2*i]=(short)((cos(PI*i/10.0)+ ...…

查看全部问答∨

Altium.Designer.FPGA设计指导

在网上看到这个文件,于是做成了PDF,是Altium Designer FPGA系统设计培训的课件。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved