简介
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 中。
指令格局如下:
SMLAL{cond}{S} RdLo,RdHi,Rm,RsSMLAL 指令举例如下:SMLAL R2,R3,R7,R6 ;(R3,R2)=R7×R6+(R3,R2)
SMLAD 将Rm寄存器的低半字和Rn寄存器的低半字相乘,然后将Rm寄存器的高半字和Rn的高半字相乘,最终将两个乘积与Ra寄存器的值相加并存入Rd寄存器。它的格局如下:
SMLAD{cond}{S}Rd,Rm,Rn,Ra
SDIV 有符号数除法指令。它的格局如下:
SDIV{cond} Rd,Rm,Rn
UDIV 无符号数除法指令。它的格局如下:
UDIV{cond} Rd,Rm,Rn
ASR 算术右移指令。它的格局如下:
ASR{cond} Rd,Rm,operader2
AND 逻辑与指令。它的格局如下:
AND{cond} Rd,Rm,operader2
ORR 逻辑或指令。它的格局如下:
ORR{cond} Rd,Rm,operader2
EOR 异或指令。它的格局如下:
EOR{cond} Rd,Rm,operader2
BIC 位铲除指令。它的格局如下:
BIC{cond} Rd,Rm,operader2
LSL 逻辑左移指令。它的格局如下:
LSL{cond} Rd,Rm,operader2
……
小结
了解了ARM处理器完好的指令集,为进一步破(po)解(jie)Android又打下了一个根底。