汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。目前在嵌入式开发、单片机开发、系统软件设计、某些快速处理、位处理、访问硬件设备等高效程序的设计方面有较多应用。
在嵌入式开发中有时候使用汇编,或者混合编程来追求高性能。
在安全领域,逆向工程是也需要用到汇编指令对于底层进行分析等操作。
今天要介绍的是ARM指令,平时做windows逆向用的x86体系的汇编,当涉及安卓逆向时候那么就要用到ARM的汇编了。
先放上ARM指令速查手册:
链接:https://pan.baidu.com/s/1JALdp8YXbESDfkfJjO1QUg?pwd=h7o7
提取码:h7o7
一、ARM汇编注意事项
1.在ARM汇编中,所有的符号都必须在一行书写,结尾不用加**’’;"**
2、在ARM汇编程序中,一条ARM指令,伪指令。寄存器名可以全部写为大写字母,也可以全部为小写字母,但是不能大小写混合编写使用。
二、数据处理指令
1、数据传输指令
mov 把一个寄存器的赋给另一个寄存器,或者将一个常量赋给寄存器(后边的量赋给前边的量)。
MOV R6,R5 ;将寄存器R0的值传送到寄存器R1
MOV PC,R12 ;将寄存器R14的值传送到PC
MOV R1,R0,LSL#2 ;将寄存器R0的值左移3位后传送到R1(即乘4)
2、算术运算指令:ADD、SUB、ADC、RSB、MUL
与X86汇编类似
1、【加法指令】:ADD
ADD R0,R1,R2 ; R0 <= R1 + R2
ADD R0,R1,#30 ; R0<= R1 + 30
ADD R0,R2,R3,LSL#2 ; R0 <= R2 + (R3 << 2)
2、【带进位的加法指令】:ADC
ADDS R0,R1,R2 ; 加低端的字
ADCS R2,R3,R4 ; 加第二个字,带进位
ADC R3,R7,R11 ; 加第四个字,带进位
3、【减法指令】:SUB
SUB R0,R1,R2 ; R0 <= R1 - R2
SUB R0,R1,#30 ; R0 <= R1 - 30
SUB R0,R2,R3,LSL#2 ; R0 <=R2 - (R3 << 2)
8、【乘法指令】:MUL
mul R2, R0, R1 ;R2 = R0 * R1
7、【逆向减法】:RSB
RSB r1,r2,r3 ;r1 = r3 - r2
3、逻辑运算指令 AND、ORR、EOR
1、【逻辑与指令】:AND
AND R0,R0,#3 ; 保持R0的0、1位,其余位清零。
2、【逻辑或指令】:ORR
ORR R0,R0,#3 ; 设置R0的0、1位,其余位保持不变。
3、【逻辑异或指令】:EOR
EOR R0,R0,#3 ; 反转R0的0、1位,其余位保持不变。
4、比较指令:CMP
与x86汇编也类似
1、【直接比较指令】:CMP
CMP R1,R0 ;R1的值和R0的值相减,并根据结果设置CPSR的标志位
CMP R1,#100 ;R1的值与立即数100相减,并根据结果设置CPSR的标志位
2、【负数比较指令】:CMN(反向CMP)
CMN R1,R0 ;R1的值与R0的值相加,并根据结果设置CPSR的标志位
CMN R1,#100 ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位
5、跳转指令 B(L)
1、【B指令】
B Label ;无条件跳转到标号Label处执行
CMP R1,#0 ;当CPSR中的Z条件码置位时,跳转到标号Label处执行
BEQ Label
2、【BL指令】
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
6 汇编加载 存储指令: LDR、STR 就是x86的 Load/Store
由存储器-->寄存器
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
由寄存器-->存储器
STR R0,[R1],#2 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#2] ;将R0中的字数据写入以R1+8为地址的存储器中。
条件标志(condition flags)
总共有四个条件标志 N, Z, C, V,A32/T32中可存储更新到APSR寄存器最高的4个位置。
条件码(Condition code)
可见arm汇编与X86汇编有许多相似之处,指令方面也有很多一致的,而对于汇编的学习确实大同小异,关键在于多看官方文档,以及想要所实现功能所需的汇编。