常用的ARM指令

数据处理指令

(1)数据传输指令 mov mvn

(2)算术指令 add sub rsb adc sbc rsc

(3)逻辑指令 and orr eor bic         //与或非

(4)比较指令 cmp cmn tst teq

(5)乘法指令 mvl mla umull umlal smull smlal

(6)前导零计数 clz        (用的不多)

详细分析:

mov r1, r0        @两个寄存器之间数据传递,r0赋值给r1

mov r1, #0x0    @将立即数赋值给寄存器,0赋值给r1

mvn和mov用法一样,区别在于,mvn是安慰取反后在赋值

譬如:r1 = 0xff,

  (1)mov r0, r1后,r0 = 0xff;

  (2)mvn r0, r1后,r0 = 0xffff00;   

bic        bic r0, r0, #0x1f             @读出r0中的bit0到bit4清零后赋值给r0

cmp       cmp r0, r1  等价于 sub r2, r0, r1    @比较指令天生就会影响cpsr的标志位

cmn       cmn r0, r1   等价于 add r2, r0, r1

tst        tst r0, #0xf               @测试r0的bit0~bit3是否全为0

常用ARM指令2:cpsr访问指令

mrs & msr

mrs用来读psr,msr用来写psr

CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SOC就只有一个,而spsr有5个

举例:

  @mrs r0, cpsr      @把cpsr中的读取到r0中

  @bic r0,r0,#0x1f     @将低5位清零,

  @orr r0,r0,#0xd3    @11010011,禁止中断和快速中断

    @msr cpsr, r0       @把r0的值写入cpsr

  msrcpsr_c, #0xd3     @把cpsr的特定位改成0xd3。本句代码效果等价于上面4句

常用ARM指令3:跳转(分支)指令

b & bl & bx

b 直接跳转(就没打开算返回)

bl (branch and link),跳转前把返回地址放入lr中,以便返回,以便用于函数调用

bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

常用ARM指令4:访存指令

ldr/str & ldm/stm & swp

单个字/半字/字节访问 ldr/str    

多字批量访问 ldm/stm

swp r1, r2, [r0]

swp r1, r1, [r0]

ARM汇编中的立即数

合法立即数与非法立即数

ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。

合法立即数:经过任意位数的移位后非零部分最终可以用8位表示的,即为合法立即数

常用ARM指令5:软中断指令

swi(software interrupt) 软中断指令用来实现操作系统中系统调用

时间: 2024-10-20 18:49:37

常用的ARM指令的相关文章

ARM指令集中常用的存储和加载指令

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作.常用的加载存储指令如下: -  LDR     字数据加载指令 -       LDRB    字节数据加载指令 -  LDRH    半字数据加载指令 -  STR     字数据存储指令 -       STRB    字节数据存储指令 -  STRH    半字数据存储指令 1.LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址>

ARM指令教程

ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值. l         ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,为0,为负…) CMP R0,R1 BNE NoMatch 比如上一句,BN

arm指令bne.w改成b,即无条件跳转

近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultraedit修改二进制文件,保存可执行程序.再拷贝到ios设备,即可. 文章出处:http://blog.chinaunix.net/uid-22915173-id-225005.html ARM中的常用指令含义ADD 加指令SUB 减指令STR    把寄存器内容存到栈上去LDR    把栈上内容载入一

iOS逆向工程之Hopper中的ARM指令

一.Hopper中的ARM指令 ARM处理器就不多说了,ARM处理器因为低功耗等原因,所以大部分移动设备上用的基本上都是ARM架构的处理器.当然作为移动设备的Android手机,iPhone也是用的ARM架构的处理器.如果你想对iOS系统以及你的应用进一步的了解,那么对ARM指令集的了解是必不可少的,ARM指令集应该也算得上是iOS逆向工程的基础了. 当你使用Hopper进行反编译时,里边全是ARM的指令,那是看的一个爽呢.下面就是使用Hopper打开MobileNote.app的一个Hoppe

黑马程序员--苹果电脑以及开发工具xcode的快捷键与常用的UNIX指令-我之记录

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 快捷键让我们看起来更专业 xcode 快捷键 1.  Esc 自动完成, 貌似Command + . 也可以 2.  Command + / 注释/取消注释,单行注释 3.  Control + Command + ↑↓ (上下箭头)快速

头文件定义和ARM指令

2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的地方,包括字符常量,不修改的数据 查看数据存放在那个节点:(用命令)readelf -S (查看节点号和节点名)readelf -x .data a.out 生命周期:(分成静态,动态) 两个宏的定义和包含: 定义一个a.h#ifndef _A_H_#define _A_H_............

Android ARM指令学习

在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式.这个THUMB指令集可以看作是ARM指令集的子集,只不过ARM指令集为32bit,THUMB指令集为16bit.之所以要使用这个THUMB指令集,主要是为了提升代码密度.具体信息大家可以google. 下面介绍如何简单修改.so文件. 首先,

学习VC MFC开发必须了解的常用宏和指令

1.#include指令  包含指定的文件 2.#define指令   预定义,通常用它来定义常量(包括无参量与带参量),以及用来实现那些"表面似和善.背后一长串"的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了 3.#typedef指令 常用来定义一个标识符及关键字的别名它是语言编译过程的一部分,但它并不实际分配内存空间. 4.#ifndef   #else   #endif指令  条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容

ARM指令分类及其寻址方式

ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: •异常中断产生指令: 二.ARM指令的一般编码格式 ARM指令字长为固定的32位.一条典型的ARM指令语法格式及编码格式如下: 语法格式: <opcode>{<cond>}{s}   <Rd>,<Rn>,<shifter_operand> •<