Part 3 ARM指令集

ARM模式和Thumb模式

ARM处理器主要有两种工作模式(先不算Jazelle)-ARM状态和Thumb状态。这些状态模式与权限级别无关,它们主要区别是指令集,在ARM模式下指令集始终是32-bit,但是在Thumb模式下可以是16-bit或者32-bit。学会怎么使用Thumb模式对于ARM开发很重要。编写ARM壳代码时,我们需要避免NULL字节,使用16位Thumb指令而不是32位ARM指令可以降低这种风险。ARM各版本的调用规范容易让人混淆,不是所有的ARM版本都支持相同的Thumb指令集。后来,ARM 引入了增强的 Thumb 指令集(伪名称:Thumbv2),它允许 32 位 Thumb 指令甚至允许条件执行,而这在之前的版本中就不行。为了在Thumb中支持条件执行,引入了“it”指令。但是,此指令随后在更高版本中被删除,并与更简单的东西进行了替换。我不知道所有不同ARM/Thumb指令集的所有不同变体,实话说,我不关心。你也最好也别关心。您只需要知道的是你的目标设备的 ARM 版本及其特定的 Thumb 支持,然后再调整代码。ARM 信息中可以帮助您确定ARM 版本的细节(http://infocenter.arm.com/help/index.jsp)。

  • Thumb-1(16 位指令):在ARMv6和更早的体系结构中使用。
  • Thumb-2(16 位和 32 位指令):在Thumb-1基础上添加更多指令并允许它们为 16 位或 32 位宽(ARMv6T2、ARMv7)。
  • ThumbEE:更改和添加了一些支持动态生成代码的功能(在执行之前或执行期间在设备上编译代码)。

ARM模式和Thumb模式的态区别:

  • 条件执行:在ARM模式下所有的指令都支持条件执行。一些版本的ARM处理器可以通过it指令在Thumb工作模式下支持条件执行。
  • ARM和Thumb模式下的32-bit指令:在Thumb模式下的32-bit指令有.w后缀。
  • 桶型位移器(barrel shifter)是ARM模式下的另一个特点。它可以将多条指令缩减为一条。例如,你可以通过向左位移1位的指令后缀将乘法运算直接包含在一条MOV指令中(将一个寄存器的值乘以2,再将结果MOV到另一个寄存器):MOV R1, R0, LSL#1 ;R1 = R0 * 2,而不需要使用专门的乘法指令来运算。
    要切换处理器在其中执行的状态,必须满足以下两个条件之一:

    • 我们可以使用分支指令 BX(分支和切换状态)或 BLX(分支、链接和切换状态),并将目标寄存器的最小有效位设置为 1。可以通过偏移量加1来实现,例如0x5530+1。您可能会认为这将导致对齐问题,因为指令是 2 或 4 字节对齐的。这不是问题,因为处理器将忽略最低有效位。详见Part 6:条件执行和分支。
    • 如果当前程序状态寄存器的T位被置位,就说明工作在Thumb模式下。

ARM指令简介

本节简单介绍ARM指令集以及基本用法。了解汇编语言中的最小部分如何操作,它们之间如何衔接,它们之间能组合成什么样的功能。

ARM指令后面通常跟着两个操作数,像下面这样的形式:

MNEMONIC{S}{condition} {Rd}, Operand1, Operand2

由于ARM指令集的灵活性,并不是所有的指令都用到这些字段。这些字段的解释如下:

MNEMONIC     - 操作指令(机器码对应的助记符)。
{S}          - 可选后缀. 如果指定了该后缀,那么条件标志将根据操作结果进行更新。
{condition}  - 执行指令所需满足的条件。
{Rd}         - 目标寄存器,存储操作结果。
Operand1     - 第一操作数(寄存器或者立即数)
Operand2     - 第二操作数. 立即数或者带有位移操作后缀(可选)的寄存器。

MNEMONIC, S, RdOperand1字段比较明了,conditionOperand2字段需要再解释一下。condition字段与CPSR寄存器的值有关,准确的说是和CPSR某些位有关。Operand2也叫可变操作数,因为它可以有多种形式--立即数、寄存器、带有位移操作的寄存器。例如Operand2可以有以下多种形式:

#123                    - 立即数。
Rx                      - 寄存器x (如 R1, R2, R3 ...)。
Rx, ASR n               - 寄存器x,算术右移n位 (1 = n = 32)。
Rx, LSL n               - 寄存器x,逻辑左移n位 (0 = n = 31)。
Rx, LSR n               - 寄存器x,逻辑右移n位 (1 = n = 32)。
Rx, ROR n               - 寄存器x,循环右移n位 (1 = n = 31)。
Rx, RRX                 - 寄存器x,扩展的循环位移,右移1位。

让我们以一个简单的例子看一下这些指令的不同:

ADD   R0, R1, R2         - 将寄存器R1内的值与寄存器R2内的值相加,结果存储到R0。
ADD   R0, R1, #2         - 将寄存器R1内的值加上立即数2,结果存储到R0。
MOVLE R0, #5             - 仅当满足条件LE(小于或等于)时,才将立即数5移动到R0(编译器会把它看作MOVLE R0, R0, #5)。
MOV   R0, R1, LSL #1     - 将寄存器R1的内容向左移动一位然后移动到R0(Rd)。因此,如果R1值是2,它将向左移动一位,并变为4。然后将4移动到R0。

来快速总结一下,看一下后续示例中将涉及的一些常用指令:

<end>

.jsp后缀语言_ARM汇编语言入门(三)相关推荐

  1. arm b bl 地址无关码_ARM汇编语言入门(六)

    Part 6:条件状态和分支 在探讨CPSR时我们已经接触了条件状态.我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流.通过CPSR寄存器中的特定bit位来表示条件状 ...

  2. sql语言和php,SQL语言快速入门(三)_php

    我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息.下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作. SELECT-FROM 为方便讲解,我们在数据库 ...

  3. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  4. R语言七天入门教程三:学习基本结构

    R语言七天入门教程三:学习基本结构 一.编程的语言的基本结构 1.三种基本结构 绝大多数编程语言,都有三种最基本的程序结构:顺序结构.分支结构.循环结构.这三种结构的流程图如下所示(从左至右依次为:顺 ...

  5. ARM 汇编语言入门

    [翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语 ...

  6. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  7. C语言零基础入门——1.基础知识与环境搭建。

    C语言零基础入门--1.基础知识与环境搭建. 好了.终于迎来了第一篇文章,这篇文章要做的事情非常简单,主要有三个事情 ​ 第一:C语言的介绍. ​ 第二:计算机的基础知识. ​ 第三:C语言的环境安装 ...

  8. python语言支持函数式编程_Python语言之Pyhton入门笔记函数式编程

    本文主要向大家介绍了Python语言之Pyhton入门笔记函数式编程,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 一,匿名函数 def add(x,y) return x+y ...

  9. 统一建模语言UML轻松入门(1)――基本概念

    统一建模语言UML轻松入门(1)――基本概念 --------------------------------------------------------------------- 宋宝华 ema ...

最新文章

  1. 在任何设备上都完美呈现的30个华丽的响应式网站
  2. 无责任Windows Azure SDK .NET开发入门(二):使用Azure AD 进行身份验证
  3. python扫描proxy并获取可用代理ip列表
  4. 数据结构与算法 / 栈(stack)
  5. Go赋值使用:类型{} 定位使用.
  6. 前端学习(635):字符串拼接
  7. l2-006 树的遍历
  8. win7如何不用点击用户名 直接自动登录桌面
  9. npcap lookback adapter回环网卡是什么 它的作用是什么
  10. oeasy教您玩转python - 008 - # ascii码表
  11. Codeforces Round #521 (Div. 3) E. Thematic Contests(思维)
  12. IOS点击事件延迟300ms踩坑
  13. 流媒体选择Nginx是福还是祸?
  14. 常用的网络营销推广渠道方式
  15. 乐城超市36计做微营销-王卫
  16. [ISUX译]iOS 9人机界面指南(二):设计策略
  17. 在python中replace是什么意思_python中replace的用法是什么?
  18. 解决新版谷歌Chrome浏览器Cookie跨域失效问题
  19. MySQL数据库系列培训教程
  20. ISIC-2017 和 PH2 皮肤镜图像分割数据集

热门文章

  1. 用符号方法求下列极限或导数matlab,实验7答案 Matlab符号计算
  2. java 数组 参数 ppt,Java自学课件-数组.ppt
  3. arcgis 圈选获取图层下点位_ArcGIS小技巧——提取面要素的质心点
  4. 罕见!百度、微博、拼多多、B站等全国34家互联网巨头集体表态
  5. 阿里员工发帖吐槽人不如驴:你不能一边抽我,一边问我爱不爱你
  6. 学了Python就能上手业务?你还差得远!
  7. 4 种大学生兼职,助你走向经济独立!
  8. 今年数据分析到底有多火?全网跪求优质资源!
  9. 计算机教师应该读的书籍,信息技术教师读书心得
  10. GAN生成对抗网络-SSGAN原理与基本实现-半监督学习GAN-08