Android逆向-1.ARM汇编与寄存器-常见

ARM指令集

1.跳转指令

B 无条件跳转
BL 带链接的无条件跳转
BX 带状态切换的无条件跳转
BLX 带链接和状态切换的无条件跳转
B loc_地址
BEQ 相等或为0则跳转指令
BNE 不相等或不为0则跳转指令

2.存储器与寄存器交互数据指令

存储器(主存,内存)
寄存器中放的数据:可以是字符串,可以是数,也可以是一个地址,它可以放各种类型的数据
存储地址单元:地址(如0x00004000)与地址中存在的值

LDR:从存储器中加载数据到寄存器 ← Load
LDR R8,[R9,#04]
解释语句:R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元。简单理解:
[]这个就是取地址,R9寄存器的值加上立即数的值作为地址,取出地址指向的值给R8寄存器。

STR:将寄存器的数据存储到存储器 → Store
STR R8,[R9,#04]
解释语句:将R8寄存器的数据存储到R9+0X04指向的存储单元。简单理解:将R8寄存器的值放到,R9寄存
器加上立即数的值作为地址指向的存储单元(地址指向的值)。最简单理解:就是把值放到地址指
向的空间,需要找这个值就从这个地址中找到。

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

STM:将一个寄存器列表的数据存储到指定的存储器,和LDM相反  ← 

PUSH:将寄存器值推入堆栈
POP:将堆栈值推出到寄存器

SWP:将寄存器与存储器之间的数据进行交换
SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换

堆,队列:数据结构,栈是竖的,后进先出,且只能从栈顶依次填入数据	

3.数据传送指令

MOV:将立即数或寄存器的数据传送到目标寄存器 ←
MOV R0, #8 R0=8

4.数据算术运算指令

ADD:+
SUB:—
MUL:*
DIV:/
有符号,无符号运算;带进位运算

5.数据逻辑运算指令

与:AND
或:ORR
异或:EOR

移位:实质是乘,除,类似于小数点移位,但相反。小数点左移,数变小;右移变大。
但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制。

LSL:逻辑左移←
LSR:逻辑右移←

LSL R0,R1,#2  相当于:R0=R1*4

6.比较指令

CMP:比较
CMP R0 #0 		R0寄存器中的值与0比较
标志位:如z位,这个都可以在动态调试时,寄存器窗口看到

7.其他指令

协处理器指令:SWT (切换用户模式)
伪指令:DCB

8.寄存器寻址方式

立即寻址:MOV R0,#1234 
解释语句:R0=0X1234,这条语句相当于把立即数放到R0寄存器中。
立即寻址是立即数与寄存器操作

寄存器寻址:MOV R0,R1 
解释语句:R0=R1,这条语句相当于把R1寄存器的值放到R0寄存器中
寄存器寻址是寄存器于寄存器操作

寄存器移位寻址:MOV R0,R1,LSL #2 	
解释语句:R0=R1*4,这条语句相当于把R1寄存器逻辑左移的值放到R0寄存器中。

寄存器间接寻址:LDR R0,[R1] 
解释语句:将R1寄存器中的值作为地址,取出地址指向中的值赋予R0

寄存器间接基址偏移寻址:LDR R0,[R1,#-4]
解释语句:将R1寄存器的值-0x4的值作为地址,取出地址中的值给R0。简单理解:将
R1寄存器的值和立即数相减的值作为地址,取出地址指向的值给R0寄存器。

对int a=0;这一句简单高级语言的汇编理解,首先会开辟一个内存存储单元,然后把0x0这个数放入R0寄存器,然后再把R0寄存器的数据放入内存存储单元。

MOV R0,#0
STR R0,[R11,#0x14+var_20]
注意:
变量要看存储单元地址,不要以为是寄存器,简单时可以这么看,但试想,如果寄存器是变量,那得要多少
寄存器。寄存器就是一个桥梁,和存储器即存储单元地址交互的东西。

猜你喜欢

转载自blog.csdn.net/Maggie_up/article/details/84101039