一文带你熟练掌握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返回高位。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值