ARM汇编基本指令:
https://blog.csdn.net/weixin_/article/details/
Android与ARM处理器:
ARM处理器架构概述
ARM处理器家族
Android支持的处理器架构
ARM/x86/MIPS
原生程序与ARM汇编语言:
原生程序逆向初步
代码混淆技术
ARM指令集
堆栈指针寄存器sp/堆栈寻址指令(stmfd压栈/ldmfd出栈)
存储器访问指令(str写入数据到存储器中/ldr从存储器中读取数 据到寄存器)
数据处理指令(mov)/带链接跳转指令(bl)
原生程序的生成过程(交叉编译/跨平台编译)
预处理(预处理指令) 编译 汇编 链接
必须了解的ARM知识
汇编:芯片,高级语言的逆向,中间语言
分析和修改汇编指令:赋值、跳转、算术运算、移位运算、堆栈操 作、内存读写指令、函数调用约定
Thumb(16位)、Thumb2(32位)、ARM(32位)
用户模式(usr):
不分组寄存器(R0-R7)
分组寄存器(R8-R14)
传递参数与返回值(R0-R3)
保存栈顶地址(R13/SP)
保存函数的返回地址(R14/LR)
程序计数器R15(PC)
状态寄存器CPSR
ARM处理器:
ARM状态(执行32位对齐指令的ARM指令)
Thumb状态(执行16位对齐的Thumb指令)
ARM汇编语言程序结构:
完整的ARM汇编程序
处理器架构定义
段定义
注释与标号
@=>单行注释
//=>多行注释
汇编器指令
子程序与参数传递
R0-R3这4个寄存器用来传递函数调用的第1到第4个参数,超 出的参数通过堆栈来传递
R0寄存器同时用来存放函数调用的返回值
被调用的函数在返回前无需恢复这些寄存器的内容
ARM指令集:
立即寻址(mov r0,#0x123)
寄存器寻址(mov r0,r1)
寄存器移位寻址(mov r0,r1,lsl #0x2)
LSL(逻辑左移)
LSR(逻辑右移)
ASR(算术右移)
ROR(循环右移)
RRX(带扩展的循环右移)
寄存器间接寻址(ldr r0,[r1])
基址寻址(ldr r0,[r1,#-4])
多寄存器寻址(ldmia r0,{r1,r2,r3,r4})
堆栈寻址(stmfd sp!,{r1-r7,lr}(入栈保护)/ldmfd sp,{r1-r7,lr}(出栈恢复))
ldmfa/stmfa
ldmea/stmea
ldmfd/stmfd
ldmed/stmed
块拷贝寻址
ldmia/stmia
ldmda/stmda
ldmib/stmib
ldmdb/stmdb
相对寻址
相对寻址以程序计算器pc的当前值作为基地址,指令中的地址 标号作为偏移量,将两者相加之后得到操作数有效地址ARM与 Thum指令集
指令格式
<opcode>:指令助记符
{<cond>}:执行条件
{s}:是否影响cpsr寄存器的值
{.w}:指令宽度说明符.w表示是32位
{.n}:指令宽度说明符.n表示16位
<rd>:目的寄存器
,<rn>:第一个操作数寄存器
{,<perand2>}:第二个操作数:立即数、寄存器、寄存器移位
eq:相等/z=1
ne:不相等/标志z=0
hi:无符号数大于/c=1,z=0
cs/hs:无符号数大于或等于/c=1
cc/lo:无符号数小于/c=0
ls:无符号数小于或等于/c=0,z=1
gt:有符号数大于/z=0,n=v
ge:有符号数大于或等于/n=v
lt:有符号数小于/n!=v
le:有符号数小于或等于/z=1,n!=v
mi:负数/n=1
pl:整数或0/n=0
vs:溢出/v=1
vc:没有溢出
跳转指令
B 无条件跳转
BL 带链接的无条件跳转
BX 带状态切换的无条件跳转
BLX 带链接和状态切换的无条件跳转
寄存器访问指令
ldr(<-)/ldrd
str(->)/strd
ldm(->)
stm(<-)
push(入栈)/pop(出栈)
swp
数据处理指令
数据传送指令(mov)/数据非传送指令(mvn)
算术运算指令
add/adc
sub/rsb/sbc/rsc
mul/mls/mla umull/umlal smull/smlal smlad/smlsd
sdiv/udiv
asr(算术右移指令)
逻辑运算指令
and/orr/eor 逻辑与/逻辑或/逻辑异或
bic(位清楚指令)
lsl/lsr 逻辑左移/逻辑右移
ror/rrx 循环右移/带扩展的循环右移
比较指令
cmp/cmn/tst/teq
其他指令
nop(空操作指令)
swi(软中断指令)
mrs(读状态寄存器指令)
msr(写状态寄存器指令)
ARM指令机器码:
B/BL指令
00001BD0 BEQ loc_1c04
31-28:cond=>0000
27-25:101
25-24:L=>B:0 /BL:1
23-0:offset:目标地址与该指令的相对偏移
offset:(1c04-(1bd0+8))/4=1011
0000 101 0 000000000000000000001011
0A 00 00 0B
00001BD0 0B 00 00 0A
LDR/STR指令
00001BC0 LDR R2,[R12]
00001BC0 00 20 9C E5
E5 9C 20 00
1110 01 011001 1100 0010 000000000000
cond 1110
指令标识 01
IPUBWL 011001
Rn:R12 1100
Rd:R2 0010
offset:0 000000000000
MOV指令
MOV R1, #0x
56 14 A0 E3
E3 A0 14 56
1110 00 1 1101 0 0000 0001 0100 0
Thumb指令
CPSR寄存器
T位:1-thumb,0-arm
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232210.html原文链接:https://javaforall.net
