ARM汇编

汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言,目前在嵌入式开发、单片机开发、系统软件设计、某些快速处理、位处理、访问硬件设备等高效程序的设计方面有很多应用。

ARM处理器是一种16/32位的高性能、低成本、低功耗的嵌入式RISC微处理器,由ARM公司设计,然后授权给各半导体厂商生产,它目前已经成为应用最广泛的嵌入式处理器,在逆向分析一款应用软件的时候,了解ARM的架构与ARM程序的汇编指令将能够有效地帮助我们理解一些底层的逻辑,即实现方式。

ARM芯片

ARM架构属于RISC指令集,指令集精简,但指令等长,虽然这样的设计可以提高处理效率,但在遇到复杂的指令后,就需要更多的简单指令来堆彻复杂任务,由于第一次智能手机革命中,大部分智能手机运行系统都比较简单,所以手机厂商和系统公司都选择了ARM架构的处理器来匹配当时的智能手机,这也是google选择ARM作为Android 系统最早使用芯片的原因,但是,面对不断升级的Android 系统,单核ARM芯片已经很难支持其流畅的运行,故此,ARM架构的处理器也在不断的提升自我,最终通过多个指令完成复杂的任务操作。

Android支持处理器概况

支持处理器 概况
ARM 最早支持,支持的最完善,主要用在手机市场,目前积极进军PC、智能家居等市场
X86 目前已经比价完善,推出了atom+Android的上网本,卖点在于支持atom+Android 和atom+windows7双系统
mips 目前在移植,完善过程中,主要目标在智能家电、pc领域,龙芯也在支持android
POWERPC 目前在移植、完善过程中

目前来说android 操作系统运行在ARM处理器上的机器数量最多,也是我们平时使用NDK编译时选择的主要平台,所以我们主要讨论android 系统在arm处理器的应用,以及在ARM处理器上的汇编指令。

计算机层级层级

层级 名称 说明
第零层 硬联逻辑 硬件
第一层 微程序 软硬件分界
第二层 机器语言  
第三层 操作系统 系统软件
第四层 汇编语言  
第五层 高级语言  
第六层 应用程序 应用软件
第七层 用户

第零级,硬联逻辑级,这是计算机内核,由门、触发器等逻辑电路组成,即我们通常在电路板上看到的电路逻辑。

第一级,微程序级,这级的机器语言是微指令集,程序员用微指令编写微程序,一般由硬件直接执行的

第二级,传统机器级,这级的机器语言是该机的指令集,程序用机器指令编写的程序可以由微程序进行解释

第三极,操作系统,从操作系统的基本功能来看,一方面它要直接管理传统机器中的软硬件资源,另一方面它又是传统机器的延伸。

第四级,汇编语言级,这级的机器语言是汇编语言,完成汇编语言翻译的程序叫做汇编程序。

第五级,高级语言级,这级的机器语言就是各种高级语言,通常编译程序来完成高级语言的翻译工作,高级语言主要是相对于汇编语言而言的,它并不是特指某一种具有语言,而是包括了很多变成语言,如:C#、java、vb、.net、C、C++等

第六级,应用程序级,这一级为了使计算机满足某种用途而专门设计的,即通常在计算机上所使用到的各种应用软件。

第七级,使用计算机的用户。

汇编语言

汇编语言是直接面向处理器的程序设计语言,处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令,每一种处理器都有自己可以识别的一整套指令,称为指令集,处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己的内部工作状态,也能控制其他外围电路的工作状态。

所以,在不同的机器中,这些指令就表现为不同的”0“,”1“串,对应着低电平与高电平,这样的指令计算机理解与设计起来非常方便,所以人们阅读理解起来就相对困难了,基本上,汇编语言里的每一条指令,都对应着处理器的一条机器指令。

汇编语言的基本语法

{标号}{指令或伪指令}{;注释}

在汇编语言程序设计中,每一条指令的助记符可以全部用大写或者全部用小写,但不允许在一条指令中大、小写混用,同时,如果一条语句太长,可将该语句分为若干行来书写,在行末尾用 ”\“ 表示下一行与本行为同一行语句。

语句注释:注释以分号 (;) 开头,注释的结尾即为一行的结尾,为了程序清晰易读,注释也可以单独占用一行,汇编器在对程序进行汇编时忽略注释。

从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换

ARM状态----此时处理器执行32位的字对齐的ARM指令

Thumb状态-----此时处理器执行16位的、半字对齐的Thumb指令

当ARM微处理器执行32位的ARM指令集时,工作在ARM状态,当ARM微处理执行16位的Thumb指令集时,工作在Thumb状态,在程序执行过程中,微处理器可以随时在两种状态之间切换,并且处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。

ARM指令集和Thumb指令集均有切换处理器状态的指令,并可在两种状态之间切换,但ARM微处理器在开始执行代码时,应该处于ARM状态。

进入Thumb状态,当操作数寄存器的状态位 (位0) 为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态,此外,当处理器处于Thumb状态发生异常(如IRQ、FIQ、Undef、SWI等),则异常处理返回时,自动切换到Thumb状态。

进入ARM状态,当操作数及储存器的状态为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态,此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。

RM体系结构的存储器格式

ARM体系结构将存储器看作是从零地址开始的字节的线型组合,从零字节到三字节放置一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列,作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4G(232字节),ARM体系结构可以用两种方法存储数据,称之为大端格式和小端格式,

大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中

小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节

指令长度及数据类型

ARM微处理器的指令长度可以是32位 (在ARM状态下) ,也可以是16位 (在Thumb状态下),ARM微处理器中的支持字节(8位)、半字(16位)、字(32位)这三种数据类型,其中字需要4字节对齐(地址的低两位为0),半字需要2字节对齐(地址的最低位为0)。

处理器模式 

ARM处理器支持7种运行模式

  • 用户模式(usr):ARM处理器正常的程序执行状态
  • 快速中断模式(fiq):用于高速数据传输或通道处理
  • 外部中断模式(irq):用于通用的中断处理
  • 管道模式(svc):操作系统使用的保护模式
  • 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
  • 系统模式(sys):运行具有特权操作系统任务
  • 未定义指令终止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

ARM位处理器的运行模式可以通过软件改变,也可通过外部中断或异常处理改变,大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些保护的系统资源是不能被访问的。

除了用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式,其中除去用户模式和系统模式以外的5种又称为异常模式,常用于处理中断或异常,以及需要访问受保护的系统资源等情况。

ARM状态下寄存器组织

ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器,但是这些寄存器不能被同时访问,具体哪些寄存器可是可编程访问的,取决于微处理器的工作状态及具体的运行模式,但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个转台寄存器都是可访问的。

通用寄存器包括R0~R15,可分为3类

  • 未分组寄存器R0~R7
  • 分组寄存器R8~R14
  • 程序计数器PC(R15)

Thumb状态下的寄存器组织

thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(sp)、连接寄存器(LR)、CPSR,同时,在每一种特权模式下都有一组SP、LR、SPSR

Thumb状态下的寄存器组织与ARM状态下的寄存器组织关系如下:

  • Thumb状态下和ARM状态下的R0~R7是相同的
  • Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的
  • Thumb状态下SP对应于ARM状态下的R13
  • Thumb状态下LR对应于ARM状态下的R14
  • Thumb状态下的程序计数器对应于ARM状态下的R15

在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分但可使用汇编程序受限制地访问这些寄存器,将其用作快速暂存器,使用带特殊变量的MOV指令,数据可以在低位寄存器和高位寄存器之间进行传送,高位寄存器的值可以使用CMP和ADD指令进行比较或加上低位寄存器中的值。

 

发布了15 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qinggancha/article/details/103395099