分享

[翻译]ARM汇编简介(三)ARM指令集

 黑犬黑犬_924 2018-09-26

ARM和THUMB


ARM处理器有两种可让我们操作的状态(我们就不把 Jazelle 考虑在内了),他们是ARM和Thumb。这些状态和特权级别没任何关系。比如,在SVC模式下运行代码即可以是在ARM状态也可以是Thumb,主要的区别在于指令集,ARM状态下的指令集总是32位的,而Thumb下则是16位(也可能是32位)了解thumb指令在哪里使用,如何使用,对于我们达成开发目标而言是相当重要的。当我们编写ARM代码时,我们需要去掉空字节,并用16位的Thumb指令代替32位的ARM指令来减少获取到他们的机会。


ARM版本的调用规则让人难以感到困惑,并且不是所有的ARM版本都支持同样的Thumb指令集。在某个时间点,ARM引入了一个增强的Thumb指令集(伪名称:thumbv2),它允许执行32位Thumb指令,甚至是条件执行指令,这在之前的版本中是不可能的。为了在Thumb状态下使用条件执行,我们引入了“it”指令。然而,这一指令在后来的版本中被删除,并且被换成了可能让事情变得不那么复杂的指令集,然而却达到了相反的效果。我不知道所有不同ARM版本的ARM/Thumb指令集的所有不同的变化,我是真的不在乎。你也不应该在乎。唯一需要知道的是你的目标设备的ARM版本及其支持的Thumb版本,这样你就可以调整你的代码了。
ARM息中心应该帮助你确定ARM版本的细节 (http://infocenter./help/index.jsp). 。


如前所述,有不同的Thumb版本。不同的命名只是为了区分它们
                                                  (处理器本身总是把它视为Thumb指令)。
 . Thumb-1(16位指令)           :用于ARMv6和早期的体系结构。
 . Thumb-2(16位和32位指令):通过添加更多指令扩展了Thumb-1指令集,并允许它们既
                                                    可以是16位也可以是32位位宽的指令
                                                   (分别对应ARMV6T2,ARMV7)
 . ThumbEE                               :包括针对动态生成代码的一些更改和添加
                                                   (在执行之前或执行过程中在设备上编译的代码)。

ARM和Thumb指令之间的差异:
 . 条件执行:ARM状态中的所有指令均支持条件执行指令。一些ARM处理器版本允许使用IT指
                    令在Thumb模式中执行条件指令。条件执行导致了更高的代码密度,因为它减少
                     了要执行的指令的数量,并减少了耗费资源更多的分支指令的数量。

 . 32位ARM和Thumb指令:32位Thumb指令有一个.w后缀。

 . 循环移位是ARM模式的另一种独特特征 。它可以用来将多个指令缩为一个。例如,与使用两
   个指令实现乘法相比(用寄存器里的数乘以2,并使用MOV将结果存储到另一个寄存器中)
   你可以使用左移一位来在MOV指令中包含乘法指令
   -> Mov  R1, R0, LSL #1      ; R1 = R0 * 2


要想切换处理器执行的状态,必须满足两个条件中的一个:
1. 我们可以使用分支指令BX(分支和交换)或BLX(分支、链接和交换),并将目的寄存器的最低有效位设置为1。这可以通过添加1的偏移来实现,如0x5530+ 1。您可能会认为这会导致对齐问题,因为指令要么是2字节,要么是4字节对齐。这不是问题,因为处理器将忽略最低有效位。第6部分中的更多细节:条件执行和分支
2. 如果当前程序状态寄存器中的T位被置位,我们知道我们处于Thumb模式。

ARM指令集介绍

这部分的目的是为了简要介绍常用的ARM指令集及其一般用途。对于我们来说,理解汇编语言的最小部分如何工作,它们如何相互连接以及通过组合它们可以实现什么是至关重要的。


如前所述,汇编语言由指令构成,这些指令是主要的构建块。一条ARM指令后通常跟着一个或两个操作数,通常使用以下模板呈现:

由于ARM指令集的灵活性,并非所有指令都使用模板中提供的所有字段。然而,模板中字段的目的如下:

虽然助记符、S、RD和第一操作数字段都很直观明了,但条件和第二操作数的字段需要更明确一些。条件字段与CPSR寄存器的值紧密相关,或者确切地说,是寄存器中特定位的值紧密相关。第二操作数被称为灵活的操作数,因为我们可以用各种形式将它作为立即数(具有有限的值集)、寄存器或移位寄存器来使用。例如,我们可以使用这些表达式作为第二操作数:


下面的例子可以帮助我们快速浏览不同类型指令集看上去有什么不同。我们来看看下表:

作为一个快速总结,我们来看将来的例子里最常用的指令有哪些

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多