阅读 597

一文带你熟练掌握android的arm32汇编指令。

1.ARM32的常见指令解析

ADC 带进位加法指令,ADD 加法指令, AND 逻辑与指令,
B 分支指令, BIC 位清零指令,BL 带返回的分支指令,
BLX 带返回和状态却换的分支指令,BX 带状态却换的分支指令。
CDP 协处理器数据操作指令, CMN 比较反值指令, CMP 比较指令,
EOR 异或指令,LDC 存储器到协处理器的数据传输指令
LDM 加载多个寄存器指令,
LDR 存储器到寄存器的数据加载指令,
MCR 从ARM寄存器到协处理器寄存器的数据传输指令,
MOV 数据传送指令,
MRC 从协处理器寄存器到ARM寄存器的数据传输指令
MUL 32位乘法指令
MLA 32位乘加指令。
MRS 传输CPSR或SPSR的内容到通用寄存器指令,
MSR 传送通用寄存器到CPSR或SPSR的指令, MVN 数据取反传送指令, ORR 逻辑或指令, RSB 逆向减法指令,
RSC 带错位的逆向减法指令, SBC 带错位减法指令,
STC 协处理器寄存器写入存储器指令,
STM 批量内存字写入指令, STR 寄存器到存储器的数据存储指令,
SUB 减法指令,SWI 软件中断指令。

一条指令可以完成多个寄存器值的传送(最多可传送16个通用寄存器),连续的寄存器用“-”,否则用“,”

2.关键汇编指令的使用

STMFD和LDMFD 跟x86的汇编push和pop是一样的效果。

LDR R4,START 将存储地址为START的字数据读入R4 STR R5,DATA1 将R5存入存储为DATA1中。 LDR R0,[R1] 将存储器地址为R1的字数据写入存储器R0 LDR R0,[R1,R2]将存储器地址为R1+R2的字数据读入存储器R0 STR,R0,[R1, #8]! :将R0字数据存入存储器地址R1+8的存储单元,并将新地址R2+8写入R0 STR,R0,[R1,R2]! 将R0字数据存入存储器R1+R2的存储单元中,并将新地址R2+R2写入R2

push{r0,r4-r7}将r0,r4-r7寄存器内容压人堆栈 pop{r0,r4-r7}}将r0,r4-r7寄存器内容从堆栈中弹出

出栈使用LDM指令,进栈使用STM指令。

3.跳转指令简介

B 无条件跳转
BL 带连接的无条件跳转
BX 带状态却换的无条件跳转
BLX 带连接和状态的无条件跳转

4.存储寄存指令详解

LDR:从存储器中加载数据到寄存器--Load
LDR R8,[R9, #04]: R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元

STR:将寄存器的数据存储到存储器中--store
STR R8, [R9,#04]: 将R8寄存器的数据存储到R9+0x4所指向的存储单元

LDM:将存储器的数据加载到寄存器列表→ LDM R0,{R1-R3}将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器

STM:将一个寄存器列表的数据存储到指定的存储器中
PUSH:将寄存器值推入堆栈
POP:将堆栈值推出到寄存器
SWP:将寄存器与存储器之间的数据进行交换
SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换

5.寄存器详解

ARM32汇编器对ARM寄存器进行了预定义,所有寄存器和协处理器名都是大小写敏感, Ro-R15和r0-r15。

a1-a4(参数,结果或者临时寄存器,与r0-r3一样的)

v1-v8(变量寄存器,与r4-r11一样)

sb和SB(静态基址寄存器,与r9一样)

sl和SL(堆栈限制寄存器,与r10一样)

fp和FP(帧指针,与r11统一)

ip和IP(过程调用中间临时寄存器,与r12统一)

sp和SP(堆栈指针,与r13统一)

lr和LR(连接寄存器,与r14统一)

pc和PC(程序计数器,与r15统一)

cpsr和CPSR(程序状态寄存器)

spsr和SPSR(程序状态寄存器)

f0-f7和F0-F7(FPA寄存器)

s0-s31和S0-S31(VFP单精度寄存器)

d0-d15和D0-D15(VFP双精度寄存器)

p0-p15(协处理器0-15)

c0-c15(协处理器寄存器0-15)

6.汇编在函数中使用需关注点:

1.当函数参数少于4个时,子程序间通过寄存器R0-R3 来进行传递参数;当参数个数多于4个时, 将多余的参数通过数据栈进行传递,入栈顺序与参数顺序正好相反,子程序返回前无需恢复R0~R3的值。

2.在子程序中,使用R4~R11保存局部变量,若使用需要入栈保存,子程序返回前需要恢复这些寄存器;R12是临时寄存器,使用不需要保存。
3.R13用作数据帧指针,记作SP;R14用作链接寄存器,记作LR,用于保存子程序返回时的地址;R15是程序计数器,记作PC。
4.ATPCS规定堆栈是满递减堆栈FD;
5.子程序返回32位的整数,使用R0返回;返回64位整数时,使用R0返回低位,R1返回高位。

文章分类
Android
文章标签