飞道的博客

ARM汇编基础知识

397人阅读  评论(0)

ARM 是 Advanced RISC Machine 的缩写,可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集。

RISC(Reduced Instruction Set Computing) 精简指令集计算机:一种执行较少类型计算机指令的微处理器。
处理器指令集: 计算机处理命令的指令集合。ARM 指令集是一组提供一整套运算的 32 位指令。
ARM 处理器是典型的 RISC 处理器,因为它们执行的是加载/存储体系结构。只有加载和存储指令才能访问内存。数据处理指令只操作寄存器的内容。

目前市面上的安卓手机绝大多数的CPU都是基于ARM架构的,但是也有少数采用了英特尔X86架构的CPU。

对于使用ARM处理器的 Android手机来说,它最终会生成相应的ARM elf (so)可执行文件,分析软件的核心功能只能从 elf(so)文件入手。


1、ARM汇编语言(armasm)是一门低级语言,它与系统的底层打交道,直接访问底层硬件资源。

2、ARM汇编语言与C语言共用同一套原生程序开发的API接口。

3、寄存器是CPU的组成部分,是和存储器交互的桥梁,它们可用来暂存指令、数据和地址。


ARM寄存器

ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。

ARM寄存器分为2类,普通寄存器和状态寄存器。通用寄存器总共16种,分别为R0到R15;状态寄存器共2种,分别为CPSR和SPSR。

16种通用寄存器:(总个数31)

  • R15 别名PC(program counter)程序计数器:保存当前正在执行的指令在内存中的地址,当指令执行结束后,PC的值自动+1,即自动指向下一条即将执行的指令在内存中的位置。因为当程序通过汇编指令完成了对PC寄存器的赋值操作的时候,其实就是完成了一次无条件跳转。
  • R14 别名LR(linked register)链接寄存器:用于存放子程序的返回地址,它是ARM程序实现子程序调用的关键所在。
  • R13 别名SP(stack pointer)栈指针寄存器:用于存放堆栈的栈顶地址的。当我们进行出栈和入栈的时候,都将根据该寄存器的值来决定访问内存的位置(即出入栈的内存位置),同时在出栈和入栈操作完成后,SP寄存器的值也应该相应增加或减少。
  • R0-R12是普通的数据寄存器,可用于任何地方。
    • R12 内部调用暂时寄存器 。 被调用函数在返回之前不必恢复。
    • R4-R11 常用来存放函数的局部变量 。 被调用函数返回之前必须恢复这些寄存器的值。
    • R0-R3 常用来传入函数参数,传出函数返回值

2种状态寄存器:(总个数6)

  • CPSR(1个)(current program status register)状态寄存器:用于保存程序的当前状态。
  • SPSR(5个)(saved program status register)备份程序状态寄存器: 异常返回后恢复异常发生时的工作状态。

上面的知识点有点多,需要记住 ARM微处理器有37个寄存器, 其中 31个通用寄存器 总共16种(R0-R15),6个状态寄存器 总共两种(CPSR,SPSR)


ARM处理器状态

ARM汇编下有两种工作状态, 一般情况下是ARM状态,带状态切换的跳转指令BX,当地址值的最后一位是1时,进入Thumb状态。

  • ARM状态:32位,ARM状态执行字对齐的32位ARM指令。
  • Thumb状态,16位,执行半字对齐的16位指令。
  • Thumb-2状态,新的thumb-2内核技术兼有16位及32位指令,实现了更高的性能,更有效的功耗及更少地占用内存
  • 调试状态,ARM处理器停机时进入调试状态。

ARM和Thumb两种状态之间的切换不影响处理器的工作模式和寄存器的内容。
ARM处理器在处理异常时,不管处理器处于什么状态,则都将切换到ARM状态


ARM处理器工作模式

除用户模式之外,其他所有模式统称为特权模式。它们具有对系统资源的完全访问权限,并可随意更改模式。
需要任务保护的应用程序通常在用户模式下执行。有些嵌入式应用程序可能完 全运行在超级用户模式或系统模式下。
进入除用户模式之外的模式是为了处理异常或访问特许资源。


ARM指令集简介

ARM指令集是指计算机ARM操作指令系统,在ARM中有两种方式可以实现程序的跳转:

  • 一种是跳转指令
  • 另一种是直接向PC寄存器(R15)中写入目标地址值

所有 ARM 指令的长度都是 32 位。这些指令是按字对齐方式存储的,因此在 ARM 状态下,指令地址的两个最低有效位始终为零。
而 Thumb、Thumb-2 指令的长度是 16 位或 32 位。这些指令按半字对齐方式存储。其中有些指令使用最低有效位来确定跳转到的目标代码是 Thumb 代码还是 ARM 代码。

ARM处理器指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。

跳转指令
此类指令用于:

  • 向后跳转以构成循环
  • 在条件结构中向前跳转
  • 跳转到子例程
  • 在 ARM 状态和 Thumb 状态之间转换处理器状态

数据处理指令
此类指令用于对通用寄存器执行运算,它们可对两个寄存器的内容执行加法、 减法或按位逻辑等运算,并将结果存放到第三个寄存器中。它们还可以对单个寄存器中的值执行运算,或者对寄存器中的值与指令中提供的常数执行运算。

寄存器加载和存储指令
用于从内存加载单个寄存器的值,或者在内存中存储单个寄存器的值

协处理器指令
此类指令支持一种用于扩展 ARM 体系结构的通用方式。用于减轻系统微处理器的特定处理任务。ARM微处理器可支持多达16个协处理器用于各种协处理操作。

程序状态寄存器(PSR)处理指令
用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括以下两条:

  • MRS 程序状态寄存器到通用寄存器的数据传送指令
  • MSR 通用寄存器到程序状态寄存器的数据传送指令

异常产生指令
ARM 微处理器所支持的异常指令有如下两条:

  • SWI 软件中断指令
  • BKPT 断点中断指令


转载:https://blog.csdn.net/weixin_43582101/article/details/108078003
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场