blx 从thumb调用arm(或者从arm调用thumb), x切换指令状态,
注意一点,汇编中 mov r1, #2 mov r2, #0x2 没有0x的就是十进制的,有0x的是16进制的
Arm常用汇编指令
1.数据处理指令
MOV
ADD
SUB
AND &
ORR |
EOR ^ 异或
BIC
2.移位指令
LSL 左移
LSR 右移
ROR 循环右移指令,全称是Rotate Right
3.乘法指令
MUL
MLA mla r0,r0,r1,r2 r0 = r0*r1+r2
4.内存访问指令
LDR 读四个字节
LDRB 读一个字节
LDRH 读两个字节
STR 写四个字节 str r0,[r2] ;debug r2[0] = r0 把 r0 的数,存到 r2 指向的内存
STRB 只写一个字节
STRH 写两个字节 (Store Halfword)
5.跳转指令
B 无条件跳转指令, 强制跳转
BL 带返回的跳转指令
BLX 带返回和带状态切换的跳转指令
BX 带状态切换的跳转指令
thumb -> arm
arm -> thumb
6.数据加载与存储指令
堆栈: (其实就是一个桶,r1 r2 r3顺序,得到值,不会乱序)
push {r1, r2, r3} → 按r3→r2→r1的顺序把数据存入栈(右到左);
pop {r1, r2, r3} → 按r1→r2→r3的顺序把栈数据写回寄存器(左到右);
寄存器:
LDM LDMIA sp,{r0,r1,r2} ;debug 从sp里面依次把值拿出来 r0=sp[0] r1=sp[4] r2=sp[8]
STM STMIA sp,{r0,r1,r2} ;debug
STMDB 先减地址,再写数据。 地址向低地址增长,适合满递减栈的压栈
| | 栈地址是向下面增加的,栈压栈专属 STMDB/PUSH;
| |
| |
|____|
读取指针的内容 hexdump(xxx.readPointer())
this.context.x8 // x8寄存器
hexdump(ptr(this.arg8).add(Process.pointerSize *2).readPointer());
x8在arm64比较特殊,返回的内容大于16字节就用x8来存储返回内容的地址
arm64传参规则:函数的第 1~8 个参数,固定依次使用 X0、X1、X2、X3、X4、X5、X6、X7 这 8 个寄存器传递
// 一行获取全局ApplicationContext
var appCtx = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext();
native主动调用 给native方法传递字符串 Memory.allocUtf8String("xxxxxx");
0 条评论