语法格式

<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>

{}表示是可选的部分,<>表示是必要的部分

条件码

大部分ARM指令都支持条件执行,即满足某些条件的时候执行当前指令,同时,还配合有S位用来指示当前指令是否会映像CPSR相应的位。

EQ Equal 相等 Z=1
NE Noequal 不相等 Z=0
CS/HS CarrySet/HighorSame 无符号数>= C=1
CC/LO CarryClear/LOwer 无符号数< C=0
MI MInus 负数 N=1
PL Plus 非负数 N=0
VS oVerflowSet 上溢出 V=1
VC oVerflowClear 没有上溢出 V=0
HI HIgh 无符号> C=1&&Z=0
LS LowerorSame 无符号数<= C=0
GE GreaterorEqual 带符号数>= N=1&&V=1或 N=0&&V=0
LT LessThan 带符号数< N=1&&V=0或 N=0&&V=1
GT GreaterThan 带符号数> Z=0&&N=V
LE LessEqual 带符号数<= Z=1&&N!=V
AL 无条件执行

跳转

B指令跳转的范围是PC+-32M,因为ARM一条指令32bit,操作码B占了6bit,还有24bit装数据,考虑到ARM的地址是4byte对齐的,所以最后的两位都会是0,所以就可以用24bit数据表达26bit的地址空间,2^26=64M,即+-32M。如果需要跳转的地址距离PC超过了32M,可以将目标地址压栈,通过内存将地址传递给PC实现长跳转

B{<cond>}		<target_addr>
BL{<cond>} <target_addr>
BX{<cond>}, <Rm>
BLX <target_address>
BLX{<cond>} <Rm>

数据处理

  • 注意立即数的合法性问题
  • 立即数=(8bit数据) ROR 偶数位,如果不能通过这种方式得到,就会报错
  • {S}用于表示当前指令的操作结果是否影响CPSR中的相应位
MOV{<cond>}{S}	<Rd>,	<shifter_operand>			;数据传送
MVN{<cond>}{S} <Rd>, <shifter_operand> ;数据求反传送
ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;加法
ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位加法
SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;减法
SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位减法
RSB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逆向减法
RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位逆向减法
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑与
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑或
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑异或
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位清除
CMP{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;比较
CMN{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;基于相反数的比较
TST{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位测试
TEQ{<cond>} <Rn>, <shifter_operand> ;相等测试

数据处理指令的操作数寻址方式(shifter_operand)

<opcode>{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>
#<immediate> ;立即数寻址
<Rm> ;寄存器寻址
<Rm>,LSL #<shift_imm> ;立即数逻辑左移
<Rm>,LSL <Rs> ;寄存器逻辑左移 <Rm>,LSR #<shift_imm> ;立即数逻辑右移
<Rm>,LSR <Rs> ;寄存器逻辑右移 <Rm>,ASR #<shift_imm> ;立即数算术右移
<Rm>,ASR <Rs> ;立即数算术右移 <Rm>,ROR #<shift_imm> ;立即数循环右移
<Rm>,ROR <Rs> ;寄存器循环右移 <Rm>,RRX ;寄存器扩展循环右移

乘法指令

任何乘法指令都必须使用寄存器,不能使用立即数

MUL{<cond>}{S}	<Rd>,	<Rm>,	<Rs>				;32位乘法
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn> ;32位带加数的乘法
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位有符号数乘法
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位带加数的有符号数乘法
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位无符号数乘法
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位带加数的无符号数乘法

PSR指令

MRS{<cond>}	<Rd>,	CPSR							;将PSR的内容传送到通用寄存器中
MRS{<cond>} <Rd>, SPSR
MSR{<cond>} CPSR_<fields>, #<immediate> ;将通用寄存器的内容或一个立即数传送到PSR
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>

内存访问

B字节,H半字,T用户模式,S由有符号

LDR{<cond>		<Rd>,	<addressing_mode>				;字数据读取
LDR{<cond>}B <Rd>, <addressing_mode> ;字节数据读取
LDR{<cond>}BT <Rd>, <addressing_mode> ;用户模式的字节数据读取
LDR{<cond>}H <Rd>, <addressing_mode> ;半字数据读取
LDR{<cond>}SB <Rd>, <addressing_mode> ;有符号的字节数据读取
LDR{<cond>}SH <Rd>, <addressing_mode> ;有符号的半字数据读取
LDR{<cond>}T <Rd>, <post_indexed_addressing_mode> ;用户模式的字数据读取
STR{<cond>} <Rd>, <addressing_mode> ;字数据写入
STR{<cond>}B <Rd>, <addressing_mode> ;字节数据写入
STR{<cond>}H <Rd>, <addressing_mode> ;半字数据写入
STR{<cond>}T <Rd>, < post_indexed_addressing_mode> ;用户模式字数据写入

批量内存访问

LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers>			;批量内存字数据读取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_without_pc> ;用户模式的批量内存字数据读取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc> ;带PSR的批量内存字数据读取
STM{<cond>}<addressing_mode> <Rn>{!}, <registers> ;批量内存字数据写入
STM{<cond>}<addressing_mode> <Rn>, <registers> ;用户模式的批量内存字数据写入

异常发生指令

SWI{<cond>}	<immed_24>		;软中断
BKPT <immediate> ;断点中断

ARM指令的更多相关文章

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

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  2. ARM指令教程

    ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...

  3. ARM指令分类及其寻址方式

    ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...

  4. ARM指令学习,王明学learn

    ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令    2.— MVN 数据取反传送指令    3.— CMP 比较指令    4.— CMN 反值比较指令    5.— TST 位测试 ...

  5. 头文件定义和ARM指令

    2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的 ...

  6. [置顶] ARM指令集和常用寄存器

    1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2  //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...

  7. ARM指令和Thumb指令区别

    Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...

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

    近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...

  9. arm指令1

    .section .text.writeFUNCTION(write) ldr r12, =__NR_write swi #0 bx lr LDR: LDR 的两种用法 1)LDR pc, =MyHa ...

随机推荐

  1. 2015暑假多校联合---Expression(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5396 Problem Description Teacher Mai has n numb ...

  2. PHP两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  3. 瞬间读懂什么是互联网思维、大数据、O2O、众筹、红海

     1.什么叫大数据? 某必胜客店的电话铃响了,客服人员拿起电话. 客服:必胜客.您好,请问有什么需要我为您服务? 顾客:你好,我想要一份…… 客服:先生,烦请先把您的会员卡号告诉我. 顾客:16846 ...

  4. 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码

    概述 http://my97.net/是一个web浏览器的日期选择控件,非常好用,做得非常棒,各种API等事件等都很方便,但是使用了4.8beta3之后,在控件上面右击会出现官网链接 ,这个是PM以及 ...

  5. ScrollReveal.js – 帮助你实现超炫的元素运动效果

    ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力.只需要给元素增加 data-scrollreveal 属性,当元素进入可视区域的时候会自动被触发设置 ...

  6. 15款美丽的设备模板,帮助展示你的 APP

    有什么更好的方式来显示您的应用程序的外观和感觉呢?你看了这些设计示例之后就会有灵感了.无论是在 iPhone,iPad,Android,还是在桌面应用程序或网站,这些设计都增加了一些视觉上的吸引力,并 ...

  7. Web前端开发工程师基本要求

    一位好的Web前端开发工程师在知识体系上既要有广度,又要有深度,所以很多大公司即使出高薪也很难招聘到理想的前端开发工程师.现在说的重点不在于讲解技术,而是更侧重于对技巧的讲解.技术非黑即白,只有对和错 ...

  8. 希尔排序(Shell)

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...

  9. android gps定位LocationManager

    android location provider有: * LocationManager.GPS_PROVIDER:GPS,精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫 ...

  10. iOS 打电话、发短信、邮件、打开网址、调用应用等合集

    iOS中的很多功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等,这里总结几个比较常用的: 1.打电话 方式一:最简单最直接的方式:直接跳到拨号界面 NSURL *url = ...