常见寻址方式
| 寻址方式 | 描述 |
|---|
| 立即数寻址 | 直接使用立即数值作为操作数,例如:MOV R0, #5 |
| 寄存器直接寻址 | 使用寄存器中的值作为操作数,例如:MOV R0, R1 |
| 寄存器间接寻址 | 使用寄存器中的值作为内存地址,访问该地址中的数据,例如:LDR R0, [R1] |
| 寄存器相对寻址 | 使用寄存器中的值加上一个立即偏移量作为内存地址,例如:LDR R0, [R1, #4] |
| 寄存器变址寻址 | 使用两个寄存器中的值相加作为内存地址,例如:LDR R0, [R1, R2] |
| 带有变址寄存器的寄存器相对寻址 | 使用寄存器中的值加上另一个寄存器的值乘以一个比例因子作为内存地址,例如:LDR R0, [R1, R2, LSL #2] |
| 堆栈寻址 | 使用堆栈指针寄存器(如SP)进行操作,例如:PUSH {R0, R1} 或 POP {R0, R1} |
压栈和出栈指令
| 指令类型 | 指令示例 | 描述 |
|---|
| 压栈 | PUSH {R0, R1} | 将寄存器R0和R1的内容压入堆栈中 |
| 压栈 | PUSH {R0-R5} | 将寄存器R0到R5的内容压入堆栈中 |
| 压栈 | STMDB SP!, {R0-R5} | 将寄存器R0到R5的内容压入堆栈中(与PUSH等效) |
| 出栈 | POP {R0, R1} | 从堆栈中弹出数据,恢复到寄存器R0和R1中 |
| 出栈 | POP {R0-R5} | 从堆栈中弹出数据,恢复到寄存器R0到R5中 |
跳转指令
| 指令类型 | 指令示例 | 描述 |
|---|
| 无条件跳转 | B label | 无条件跳转到标签label指向的位置 |
| 子程序调用 | BL label | 调用子程序,将当前指令的下一条指令地址存入链接寄存器(LR),然后跳转到标签label指向的位置 |
| 子程序返回 | BX LR | 返回子程序调用前的位置,跳转到链接寄存器(LR)中存储的地址 |
| 寄存器跳转 | BX Rn | 跳转到寄存器Rn中存储的地址 |
算术运算指令
| 指令 | 计算公式 | 备注 |
|---|
| ADD Rd, Rn, Rm | Rd = Rn + Rm | 加法运算,指令为 ADD |
| ADD Rd, Rn, #immed | Rd = Rn + #immed | 加法运算,指令为 ADD |
| ADC Rd, Rn, Rm | Rd = Rn + Rm + 进位 | 带进位的加法运算,指令为 ADC |
| ADC Rd, Rn, #immed | Rd = Rn + #immed + 进位 | 带进位的加法运算,指令为 ADC |
| SUB Rd, Rn, Rm | Rd = Rn – Rm | 减法 |
| SUB Rd, #immed | Rd = Rd – #immed | 减法 |
| SUB Rd, Rn, #immed | Rd = Rn – #immed | 减法 |
| SBC Rd, Rn, #immed | Rd = Rn – #immed – 借位 | 带借位的减法 |
| SBC Rd, Rn ,Rm | Rd = Rn – Rm – 借位 | 带借位的减法 |
| MUL Rd, Rn, Rm | Rd = Rn * Rm | 乘法 (32 位) |
| UDIV Rd, Rn, Rm | Rd = Rn / Rm | 无符号除法 |
| SDIV Rd, Rn, Rm | Rd = Rn / Rm | 有符号除法 |
逻辑运算
感谢:【新提醒】《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友? – 『移动安全区』 – 吾爱破解 – LCG – LSG |安卓破解|病毒分析|www.52pojie.cn