ARM基础知识

常见寻址方式

寻址方式描述
立即数寻址直接使用立即数值作为操作数,例如: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, RmRd = Rn + Rm加法运算,指令为 ADD
ADD Rd, Rn, #immedRd = Rn + #immed加法运算,指令为 ADD
ADC Rd, Rn, RmRd = Rn + Rm + 进位带进位的加法运算,指令为 ADC
ADC Rd, Rn, #immedRd = Rn + #immed + 进位带进位的加法运算,指令为 ADC
SUB Rd, Rn, RmRd = Rn – Rm减法
SUB Rd, #immedRd = Rd – #immed减法
SUB Rd, Rn, #immedRd = Rn – #immed减法
SBC Rd, Rn, #immedRd = Rn – #immed – 借位带借位的减法
SBC Rd, Rn ,RmRd = Rn – Rm – 借位带借位的减法
MUL Rd, Rn, RmRd = Rn * Rm乘法 (32 位)
UDIV Rd, Rn, RmRd = Rn / Rm无符号除法
SDIV Rd, Rn, RmRd = Rn / Rm有符号除法

逻辑运算

感谢:【新提醒】《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友? – 『移动安全区』 – 吾爱破解 – LCG – LSG |安卓破解|病毒分析|www.52pojie.cn

上一篇
下一篇