Android逆向系列之ARM语法篇

指令&指令格式

31-2827-2019-1615-1211-0
condopcodeRnRdOp2

<opcode> {<cond>} {s} <Rd>,<Rn>{,<operand2>}

例如:

ADDEQS R0,R1,#0x8;

备注: <>内的项是必须的,{}内的项是可选的

ARM指令分类

分类:

  • 数据处理指令
  • 数据加载/存储指令
  • 分支(跳转)指令
  • 程序状态寄存器指令
  • 协处理器指令
  • 异常产生指令

常见指令:

指令条件后缀

条件后缀影响指令是否执行,不影响指令内容和寄存器内容

编码后缀助记符标志位定义
0000EQZ=1相等
0001NEZ=0不相等
0010CSC=1无符号大于或者等于
0011CCC=0无符号小于
0100MIN=1负值
0101PLN=0正值或0
0110VSV=1溢出
0111VCV=0无溢出
1000HIC=1且Z=0无符号大于
1001LSC=0或Z=1无符号小于或等于
1010GEN和V相同有符号大于或等于
1011LTN和V不同有符号小于
1100GTZ=0且N等于V有符号大于
1101LEZ=1或N不等于V有符号小于或等于
1110AL无条件无条件

指令可选后缀

S

S:是否影响CPSR寄存器的值

例如:

R0 = 0x1 ,R3 = 0x3 ,CPSR = nzcvqIFt_SVC

SUB R1,R0,R3 ;R0的值减去R3的值,结果存入R1

SUBS R1,R0,R3 ;R0的值减去R3的值,结果存入R1,影响标识位

!

!: 是否影响基址寄存器的值

例如:

LDR R3,[R0,#4]

LDR R3,[R0,#4]!

寻址方式

  • 立即数寻址
    • MOV R1,#0x1
  • 寄存器寻址
    • MOV R1,R2
  • 寄存器间接寻址
    • LDR R1,[R2]
  • 寄存器移位寻址
    • MOV R0,R1,LSL,#1
  • 基址变址寻址
    • LDR R1,[R2,#4]
  • 相对寻址
    • BL sub_1234
  • 多寄存器寻址
    • LDMIA R0!,{R1-R4}
  • 堆栈寻址
    • STMFD R13!,{R0-R4}

数据加载/存储指令

LDR/STR

地址索引

  • 前索引
    • LDR R0,[R4,#0x4]
    • R4+0x4的地址数据加载到R0,R4不变
  • 后索引
    • LDR R0,[R4],#0x4
    • R4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
  • 自动索引
    • LDR R0,[R4,#0x4]!
    • R4+0x4的地址数据加载到R0,R4改变,R4 = R4 + 0x4

  • 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。
  • 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。
  • 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。
  • 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。
寻址方式说明POPLDMPUSHSTM
FA递增满LDMFALDMDASTMFASTMIB
FD递减满LDMFDLDMIASTMFDSTMDB
EA递增空LDMEALDMDBSTMEASTMIA
ED递减空LDMEDLDMIBSTMEDSTMDA



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值