第七章 ARM 反汇编基础(六)(Thumb 汇编指令集)

Thumb 汇编指令集

  • 作为 ARM 指令集的一个子集,针对代码密度问题提出,具有 16 位的指令宽度
  • 与 ARM 指令的 32 位宽度相比,Thumb 指令集在保留 32 位宽度优势的同时大大节省了系统的存储空间
  • Thumb 不是一个完整的体系结构,包含的指令集十分有限,常与 ARM 指令搭配使用
  • 第一代 Thumb 指令集更新到 ARMv6T2 后,引入了第二代 Thumb 指令集,使用与 ARM 指令相同的 32 位指令,不仅性能与 32 位 ARM 指令相当,还保留了第一代指令的简洁特性
  • Thumb 指令和 ARM 指令除了长度不同,寄存器的使用也不同。Thumb 指令集中,R11 ~ R15 寄存器使用 FP、IP、SP、LR、PC 等命名,新的命名方式直接在名称上体现了寄存器的用途,使用上也有限制和差异(相较 ARM 指令)
  • 第一代 Thumb 指令的宽度只有 16 位,在地址读取范围上比 ARM 指令小很多,在进行一些大范围的指令跳转操作时只能切换到 ARM 模式,执行 ARM 指令

16 位 Thumb 指令编码

  • 16 位的 Thumb 指令称第一代 Thumb 指令
  • 格式:
    在这里插入图片描述
  • 可看到,第一代 Thumb 指令设计十分简洁,只用了一个 bits[15:10] 的 Opcode 域来确定指令及其分类
  • 第一代 Thumb 指令的所有指令及分类方法(Opcode 域中的 x 表示取值可为 0 或 1):
Opcode 指令或指令类别
00xxxx 移位、加、减、移动与比较指令
010000 数据处理指令
010001 特殊数据指令,分支与交换指令
01001x 常量池加载指令,LDR 指令
0101xx 加载/存储单个数据指令
011xxx 加载/存储单个数据指令
100xxx 加载/存储单个数据指令
10100x 相对于 PC 寄存器的加法指令,ADR 指令
10101x 相对于 SP 寄存器的加法指令,ADD 指令
1011xx 杂项指令
11000x 多寄存器存储指令,STM、STMIA、STMEA 指令
11001x 多寄存器加载指令,LDM、LDMIA、LDMFD 指令
1101xx 条件分支与中断指令
11100x 无条件分支指令,B 指令
  • 在用 Android NDK 编译代码时,若想默认生成 Thumb 指令而非 ARM 指令&
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ARM指令是一种广泛使用的指令架构,它主要用于移动设备、嵌入式系统和低功耗服务器等领域。这个指令架构的发展可追溯到1980年代初,但只有1990年代后期开始得到广泛采用和推广。现在,ARM指令已经成为了全球最流行的指令之一。 常用的ARM指令包括ARMv6、ARMv7和ARMv8等。它们的主要区别在于处理器的架构和指令的扩展。其中,ARMv6是一种比较老的架构,适用于早期的移动设备和嵌入式系统。而ARMv7则是一种更为先进的架构,支持更多的指令扩展和一些新的特性。ARMv8则是未来的趋势,它支持更多的指令扩展,包括虚拟寄存器、硬件虚拟化和安全性增强等功能。 除了ARM指令,汇编语言也是ARM编程的重要组成部分。常用的ARM汇编语言包括ARM汇编和Thumb汇编两种。ARM汇编是一种较为底层的汇编语言,它使用32位指令来完成数据处理和控制流操作。而Thumb汇编则是一种更加轻量级的汇编语言,它使用16位指令来完成相同的操作。 针对ARM指令和汇编语言,有许多文档和教程可供参考。其中最常用的包括ARM体系结构参考手册、ARM汇编编程指南和ARM编程手册等。这些文档都提供了详细的指令和汇编语言说明,以及实用的编程示例和技巧。同时,还有一些在线资源和社区,如ARM开发者中心和ARM社区等,提供丰富的资讯和交流平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值