您可以在ARM体系结构中从arm模式切换到Thumb模式的所有方法都列出并详细解释?

sri*_*nth 2 embedded arm thumb

我找不到这个问题的答案.你可以告诉我ARM架构何时从手臂模式切换到拇指模式?解释切换工作的所有方式.

old*_*mer 9

答案在ARM ARM(ARM架构参考手册)中.例如,在ARM指令和Thumb指令中查看BX.如果这是一个家庭作业问题,还有更多说明.

还要查看发生异常时会发生什么的伪代码:

R14_ = return link
SPSR_ = CPSR
CPSR[4:0] = exception mode number
CPSR[5] = 0 
if  == Reset or FIQ then
    CPSR[6] = 1 
CPSR[7] = 1 
if  != UNDEF or SWI then
    CPSR[8] = 1
CPSR[9] = CP15_reg1_EEbit
PC = exception vector address

上面的伪代码(在ARM ARM中)的注释描述了您的问题的另一个答案.

现在不明显的,并且在BX和其他指令描述中可能误导是bx rm并不总是切换状态.拇指BX描述说"ARM代码和Thumb代码之间的分支".好像拇指使用它会让你一直手臂编码.伪代码描绘了稍微好一点的图片,寄存器中地址的lsbit告诉您是否分支到拇指或臂代码.拇指描述中的PC伪代码虽然具有误导性.Thumb指令是16位,pc一次向前移动16位,0x00,0x02,0x04等.在arm模式下,指令为32位,pc为0x00,0x04,0x08等.(查看分支指令ARM分支是signed_immed << 2,0,4,8等拇指分支是signed_immed << 1,0,2,4,6等)

基本上如果你有一个混合模式程序你想使用BX而不是B,特别是当返回bx lr而不是mov pc,lr.所以拇指和手臂功能都会使用bx lr来返回.所有四个案件都被覆盖,手臂呼叫臂,手臂呼叫拇指,拇指呼叫手臂和拇指呼叫拇指.

因此,寻找影响cpsr的T位和/或影响程序计数器的指令,使得程序计数器在某处分支.另外要小心将自己限制在您感兴趣的特定系列/核心(阅读ARM ARM时),armv4t,armv6,armv6等.您可能希望获得特定核心的TRM(技术参考手册).使用也是如此.ARM ARM非常通用,随着核心数量的增加,ARM ARM中的具体差异并不明确.你需要TRM.

我有很多ARM ARM的版本,它们都包含错误/错误.故意与否我不知道,所以总是需要一些黑客来找出你使用的核心是如何工作的.


编辑于2018年

我不打算列出每个核心等等的列表.这就是arm文档的用途,而不是stackoverflow的用途.

但是,答案还在于武器网站上提供的建筑参考手册.您可能不得不牺牲一个电子邮件地址,但非常值得.

您正在寻找的关键词是interwork互通.旧的/原始的手臂现在被称为armv5 architectural reference manual你寻找a T Flag并看看哪些指令改变了那面旗帜.对于armv7-marmv8-m ARM,您可以查找互通支持或互通地址.它显示了一个影响PC的指令列表,但是支持或不支持交互操作.

对于用于ARMv7-A/R,我现在还在找工作互通分支,到目前为止,我没有看到一个部分......挺住......寻找之间的转换Thumb stateARM state并有显示的指令列表的部分从拇指状态到手臂状态和从手臂状态到拇指状态的列表.

ARMv6(不是-M)对armv5和armv7 ARM进行了攻击,但是每个指令/编码都显示了支持它的架构,因此您可能需要遍历每个交互分支指令并查看它们是否具有armv6支持(armv4和armv5)也显示).虽然blxarmv4T/armv5T中的拇指编码不是armv6-m/armv7-m的一部分,但是armv7手册并不是全部的故事,以前blx编码现在是thumb2扩展的一部分.

所有这些支持的主要指令是BX,其他指令因架构而异,是否可以使用它们来切换状态.如果您正在编写模拟器,祝您好运,如果您正在编程,您可以尝试调整架构,但是当它怀疑只是使用bx.请注意,arm11-mpcore中没有未记录的错误(不是像树莓派中的那个更老的arm11s),它在数据之后pop pc或者ldr pc数据类似于分支指令时对数据执行预取.我的建议是不要在arm11 mpcore上使用这些指令,而是使用armv4t样式弹出或加载到易失性寄存器和bx.pop {r3}; bx r3而不是pop {pc}.副作用很难看到,读取周期可能发生在作用于读取的外围设备上,从uart上的数据寄存器读取并丢失字符.仅供参考,我们花了一段时间才找到并确认这一点.

我试着添加一些代码.

  • 我本可以写出更好的答案,我让它太难读了.无论如何,简答:寻找影响CPSR中T位的指令. (2认同)