ARM汇编指令(1)

这篇博客介绍了ARM汇编语言的基础知识,包括数据处理指令如MOV、ADD、SUB、MUL等,逻辑运算指令AND、ORR、EOR,以及比较和跳转指令。此外,还提到了与X86汇编的相似之处,强调了学习汇编的关键在于理解功能和官方文档。内容涵盖了嵌入式开发、逆向工程和系统软件设计中的应用。
摘要由CSDN通过智能技术生成

汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。目前在嵌入式开发、单片机开发、系统软件设计、某些快速处理、位处理、访问硬件设备等高效程序的设计方面有较多应用。
在嵌入式开发中有时候使用汇编,或者混合编程来追求高性能。

在安全领域,逆向工程是也需要用到汇编指令对于底层进行分析等操作。

今天要介绍的是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的01位,其余位清零。

2、【逻辑或指令】:ORR
ORR  R0,R0,#3                   ; 设置R0的01位,其余位保持不变。

3、【逻辑异或指令】:EOR
EOR  R0,R0,#3                   ; 反转R0的01位,其余位保持不变。

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汇编有许多相似之处,指令方面也有很多一致的,而对于汇编的学习确实大同小异,关键在于多看官方文档,以及想要所实现功能所需的汇编。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值