微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Android ARM汇编语言

Android ARM汇编语言

时间:11-09 来源:互联网 点击:
简介

ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集。

原生程序与ARM汇编语言

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

一个ARM原生程序如下:

EXPORT main  //main函数mainvar_C= -0xc     //识别出的栈变量var_8 = -8STMFD SP!,{R11,LR}   //指令  压入堆栈ADD R11,SP,#4SUB SP,SP,#8STR R0,[R11,#var_8]STR R1,[R11,#var_C]LDR R3,=(aHelloArm - 0x8300)ADD R3,PC,R3MOV R0,R3BL putsMOV R3,#0MOV R0,R3SUB SP,R11,#4LDMFD SP!,{R11,PC}  //堆栈寻址指令

对应的代码:

int main(int argc, char* argv[]){printf("Hello ARM!\n");return 0;}

原生程序的生成过程

1、预处理

2、编译

3、汇编

4、链接

必须了解的ARM知识

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

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

3、寄存器是处理器特有的高速存贮部件,它们可用来暂存指令、数据和地址。ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,

6个为状态寄存器。ARM处理器支持七种运行模式,它们分别为:用户模式、快速中断模式、外部中断模式、管理模式、数据访问终止模式、

系统模式、未定义指令中止模式。

指令格式

ARM指令的基本格式如下:

{}{S}{.W|.N},{,}opcode为指令助记符,cond为执行条件。


跳转指令

1、B跳转指令

B{cond} label   简单的分支指令

2、BL带链接的跳转指令

BL{cond} label 

3、BX带状态切换的跳转指令

BX{cond} Rm

4、BLX带链接和状态切换的跳转指令

BLX{cond} Rm
存储器访问指令

LDR 用于从存储器中加载数据到寄存器中。它的格式如下:

LDR{type}{cond} Rd,labelLDRD{cond} Rd,Rd2,label

STR用于存储数据到指定地址的存储单元中。它的格式如下:

STR{type}{cond} Rd,labelSTRD{cond} Rd,Rd2,label

LDM 从指定的存储单元加载多个数据到一个寄存器列表。它的格式如下:

LDM{addr_mode}{cond} Rn{!} reglist

STM 将一个寄存器列表的数据存储到指定的存储单元。它的格式如下:

STM{addr_mode}{cond} Rn{!} reglist

PUSH 将寄存器推入满递减堆栈。它的格式如下:

PUSH {cond} reglist

POP 从满递减堆栈中弹出数据到寄存器。它的格式如下:

POP {cond} reglist

SWP 用于寄存器与存储器之间的数据交换。它的格式如下:

SWP{B}{cond} Rd,Rm,[Rn]
数据处理指令

MOV 将8位的立即数或寄存器的内容传送到目标寄存器中。它的格式如下:

MOV {cond}{S}Rd,operand2

MVN 数据非传送指令。它的格式如下:

MVN {cond}{S}Rd,operand2

ADD 加法指令。它的格式如下:

ADD{cond}{S}Rd,Rn,operand2

ADC 带进位加法指令。它的格式如下:

ADC{cond}{S}Rd,Rn,operand2

SUB 减法指令。它的格式如下:

SUB{cond}{S}Rd,Rn,operand2

RSB 逆向减法指令。它的格式如下:

RSB{cond}{S}Rd,Rn,operand2

SBC 带进位减法指令。它的格式如下:

SBC{cond}{S}Rd,Rn,operand2

RSC 带进位逆向减法指令。它的格式如下:

RSC {cond}{S}Rd,Rn,operand2

MUL 32位乘法指令。它的格式如下:

MUL {cond}{S}Rd,Rm,Rn

MLS 将Rm寄存器和Rn寄存器中的值相乘,然后再从Ra寄存器的值中减去乘积,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:

MLS {cond}{S} Rd,Rm,Rn,Ra

MLA 将Rm寄存器和Rn寄存器中的值相乘,然后再将乘积与Ra寄存器中的值想家,最后将所得结果的低32位存入Rd寄存器中。它的格式如下:

MLA {cond}{S} Rd,Rm,Rn,Ra

UMULL64 位无符号乘法指令。指令将Rm 和Rs 中的值作无符号数相乘,结果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:

UMULL{cond}{S} RdLo,RdHi,Rm,RsUMULL 指令举例如下:UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8

UMLAL 64 位无符号乘加指令。指令将Rm 和Rs 中的值作无符号数相乘,64 位乘积与RdHi、RdLo 相加,结果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。

指令格式如下:

UMLAL{cond}{S} RdLo,RdHi,Rm,RsUMLAL 指令举例如下:UMLAL R0,R1,R5,R8 ;(R1,R0)=R5×R8+(R1,R0)

SMULL 64 位有符号乘法指令。指令将Rm 和Rs 中的值作有符号数相乘,结果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:

SMULL{cond}{S} RdLo,RdHi,Rm,RsSMULL 指令举例如下:SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6

SMLAL 64 位有符号乘加指令。指令将Rm 和Rs 中的值作有符号数相乘,64 位乘积与RdHi、RdLo,相加,结果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top