Android逆向系列之ARM语法篇

Android逆向系列之ARM语法篇

指令&指令格式

31-28 27-20 19-16 15-12 11-0
cond opcode Rn Rd Op2

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

例如:

ADDEQS R0,R1,#8;

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

ARM指令分类

分类:

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

常见指令:

指令条件后缀

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

编码 后缀助记符 标志位 定义
0000 EQ Z=1 相等
0001 NE Z=0 不相等
0010 CS C=1 无符号大于或者等于
0011 CC C=0 无符号小于
0100 MI N=1 负值
0101 PL N=0 正值或0
0110 VS V=1 溢出
0111 VC V=0 无溢出
1000 HI C=1且Z=0 无符号大于
1001 LS C=0或Z=1 无符号小于或等于
1010 GE N和V相同 有符号大于或等于
1011 LT N和V不同 有符号小于
1100 GT Z=0且N等于V 有符号大于
1101 LE Z=1或N不等于V 有符号小于或等于
1110 AL 无条件 无条件

指令可选后缀

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

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!