网站首页 > 技术文章 正文
ARM汇编教程(3): ARM指令集
ARM与Thumb
ARM 处理器有两种主要的运行状态,ARM 和 Thumb。这些状态与特权级别无关。例如,以 SVC 模式运行的代码可以是 ARM 或 Thumb。这两种状态的主要区别在于指令集,ARM 状态下的指令始终是 32 位的,而 Thumb 状态下的指令是 16 位的(但也可以是 32 位的)。
ARM 版本的调用约定非常混乱,并非所有 ARM 版本都支持相同的 Thumb 指令集。在某些时候,ARM 引入了增强的 Thumb 指令集(Thumbv2),它允许 32 位 Thumb 指令甚至条件执行,这在之前的版本中是不可能的。为了在 Thumb 状态下使用条件执行,引入了“it”指令。然而,这条指令在后来的版本中被删除,并与一些本应不那么复杂的东西交换,结果适得其反。我不知道所有不同 ARM 版本的 ARM/Thumb 指令集的所有不同变体,老实说我不关心。你也不应该。您唯一需要知道的是目标设备的 ARM 版本及其特定的 Thumb 支持,以便可以调整代码。 ARM Infocenter 应该可以帮助您确定 ARM 版本的细节 (http://infocenter.arm.com/help/index.jsp)。
如前所述,有不同的 Thumb 版本。不同的命名只是为了将它们彼此区分开来(处理器本身总是将其称为 Thumb)。
Thumb-1(16 位指令):用于 ARMv6 和更早的架构。
Thumb-2(16 位和 32 位指令):通过添加更多指令并允许它们为 16 位或 32 位宽(ARMv6T2、ARMv7)来扩展 Thumb-1。
ThumbEE:包括一些针对动态生成代码(在执行前不久或执行期间在设备上编译的代码)的更改和添加。
ARM 和 Thumb 的区别:
条件执行:ARM状态下的所有指令都支持条件执行。某些 ARM 处理器版本允许使用 IT 指令在 Thumb 中进行条件执行。条件执行导致更高的代码密度,因为它减少了要执行的指令数量并减少了昂贵的分支指令的数量。
32 位 ARM 和 Thumb 指令:32 位 Thumb 指令有一个 .w 后缀。
桶形移位器是另一个独特的 ARM 模式功能。它可用于将多条指令缩减为一条。例如,不是使用两条指令进行乘法(将寄存器乘以 2 并使用 MOV 将结果存储到另一个寄存器中),而是可以通过使用左移 1 -> Mov R1、R0、LSL 将乘法包含在 MOV 指令中#1; R1 = R0 * 2
要切换处理器执行的状态,必须满足两个条件之一:
我们可以使用分支指令 BX(分支和交换)或 BLX(分支、链接和交换)并将目标寄存器的最低有效位设置为 1。这可以通过将偏移量加 1 来实现,例如 0x5530 + 1。可能这会导致对齐问题,因为指令是 2 字节或 4 字节对齐的。但是因为处理器会忽略最低有效位。
如果设置了当前程序状态寄存器中的 T 位,我们就知道我们处于 Thumb 模式。
ARM指令集的介绍
本部分的目的是简要介绍ARM的指令集和它的一般用途。对我们来说,了解汇编语言的最小部分是如何运作的,它们是如何相互联系的,以及通过组合它们可以实现什么,这一点至关重要。
如前所述,汇编语言是由指令组成的,这些指令是主要的构建块。ARM指令后面通常有一个或两个操作数,一般使用以下模板。
由于ARM指令集的灵活性,并非所有指令都使用模板中提供的所有字段。然而,模板中字段的目的描述如下。
虽然MNEMONIC、S、Rd和Operand1字段是直截了当的,但条件和Operand2字段需要多加说明。条件字段与CPSR寄存器的值密切相关,或者准确地说,与寄存器中特定位的值密切相关。Operand2被称为灵活的操作数,因为我们可以以各种形式使用它--作为即期值(具有有限的值集)、寄存器或带移位的寄存器。例如,我们可以使用这些表达式作为Operand2。
作为一个快速的例子,让我们看看下面的指令清单。
作为一个简单的总结,让我们看看最常见的指令,我们将在未来的例子中使用。
本文是ARM汇编系列教程的第3部分, 介绍arm的基本指令集, 后续内容会尽快更新, 敬请持续关注!
猜你喜欢
- 2024-11-10 VMware中ESXI常用命令(vmware esxi使用教程)
- 2024-11-10 arm嵌入式考试题,大神精心总结(arm嵌入式知识点)
- 2024-11-10 Cortex-A的通用寄存器和程序状态寄存器
- 2024-11-10 基于istio的mirror构建真实流量测试环境
- 2024-11-10 领先业界,中兴通讯首发两款双路4K超高清视讯终端
- 2024-11-10 arm 汇编指令 CPS(arm汇编器)
- 2024-11-10 Linux-2.6.37版:Linux内核启动全过程详解
- 2024-11-10 协处理器指令_开启ICache代码示例
- 2024-11-10 ADC触摸屏编程_定时器程序优化(触摸屏如何修改plc里时间定时值)
- 2024-11-10 90后程序员小伙分享—Linux内核kernel启动分析(下篇)精品推荐
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)