ARM指令分类学习

指令分类:

1、算数和逻辑指令

2、比较指令

3、跳转指令

4、移位指令

5、程序状态字访问指令

6、存储器访问指令

++++++++++++++++++++++++++++++++++++++++++++++++++

学习指令的资料《arm汇编手册(中文版).chm》 ,注:这个资料是 ARM汇编手册,我们用的是GNU的汇编,所以语法 大小写上是有差别的。

使用上一篇文章中的汇编程序来,学习使用每个指令的用法。

一、算数和逻辑指令

1、mov指令

作用、格式、例子

从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

MOV{条件}{S}  <dest>, <op 1>   。其中<dest>必须是通用寄存器。<op 1> 可以是通用寄存器,也可以是立即数。
汇编程序中使用@来添加注释。
JLink 连接好板子,PC机。板子nandflash启动。开启JLinkGDBServer,启动eclipse。打开上一篇文章中的汇编程序工程。
直接在eclipse的工程项目中编辑start.s文件,.text.global _start_start:@mov指令释放mov r1,#3@ #3表示立即数,十进制3mov r2,r1mov r3,#10

clean,编译,调试。查看寄存器的值,寄存器的值可以使用16进制来展示,右键菜单选项进行设置。

2、MVN : 传送取反的值

  MVN{条件}{S}  <dest>, <op 1>

 ( 使用C语言的表示方法:dest = !op_1)将 <op 1> 按位取反之后,赋值给<dest>
例子:mvn r1,#ob10@ #ob10 表示二进制数  10mvn r2,#5mvn r3,r1------------------r1的值应该是 二进制 10 按位取反之后的值: 11111111111111111111111111111101

r3的值应该是r1取反的值  即二进制  10

3、SUB : 减法

  SUB{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_1 - op_2

SUB 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值

4、ADD : 加法

5、AND : 逻辑与

  AND{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_1 AND op_2
----------------------------------
  Op_1   Op_2   结果

  0      0      0
  0      1      0
  1      0      0
  1      1      1
.text.global _start_start:mov r0,#0mov r1,#1mov r2,#3and r3,r0,r1@r3的值是0and r4,r1,r2@r4的值是1

6、BIC : 位清除

BIC{条件}{S}  <dest>, <op 1>, <op 2>BIC 是在一个字中清除位的一种方法。操作数 2 是一个 32 位位掩码(mask)。如果如果在掩码中设置了某一位,则清除这一位。未设置的掩码位指示此位保持不变。

例子:r0 的值是二进制  10111111掩码是   101则结果是    10111010掩码是1 则清楚对应位,置为0掩码是0,则不做操作。.text.global _start_start:mov r1,#0b101011bic r2,r1,#0b101@r2的值应该是 0b101010
二、比较指令

1、cmp : 比较(Compare)

比较的结果保存在程序状态寄存器,CPSR的 N ,Z 位

N: 0  操作数 one大于操作数two

1 操作数 one小于操作数two

Z:  1 表示比较的结果是两个数相等


.text.global _start_start:mov r1,#1cmp r1,#3
2、TST : 测试位操作数one跟操作数two按位与操作,结果影响CPSR的Z位
Status = op_1 AND op_2
Status 0  CPSR Z位 是1
Status 1  CPSR Z位 是0
 


四、跳转指令(分支指令)

C语言中 if else分支,在汇编中是如何实现的?

1、b

b{条件}  <地址>{条件}的相关知识在:GT : 大于(有符号)如果一次比较之后...设置了 N 标志设置了 V 标志或者...清除了 N 标志清除了 V
标志并且...清除了 Z 标志。 示例:mov r1,#7mov r2,#3cmp r1,r2bgt branchadd r3,r1,r2b endbranch:sub r3,r1,r2end:nop
bgt branch: 满足条件跳转到 branch标号处。
b end: 无条件跳转到end标号处。

2、bl  带连接的分支

bl会把下一条指令的地址保存到lr寄存器当中。以便函数能够正常返回到调用的地方。

在汇编中实现函数的调用,返回

mov r3,#1

bl func1 @调用函数 func1

mov r1,#6

func1:

mov r1,#2

mov r2,#3

mov pc,lr

@注意lr寄存器,bl指令能够把跳转地址的下一条指令保存到lr中,可以通过反汇编来看到lr的地址是哪个指令操作的地址。

mov r3,#3


五、移位指令

1、LSL 逻辑左移

mov r1, #0b1

mov r1, r1, lsl#1

@r1的值最终为 0b10

2、ROR 循环右移

mov r1, #0b11

mov r1, r1, ror#1

@r1 的最终结果  1........1

六、程序状态字访问指令

需要特殊的指令来访问,修改CPSR寄存器

msr  把通用寄存器写入到CSPR寄存器中

mrs 把程序状态字搬移到通用寄存器

mrs r0, cpsr  @把cpsr的值赋值给 r0

orr r0, #0b100  @把r0 的第三位置为1

msr cpsr, r0 @把r0的值赋值给cpsr


七、存储器访问指令

内存的值到寄存器 ldr

寄存器的值到内存 str

mov r0, 0xff

str r0,  [r1]  @把r0的值赋值给,以r1的值为地址的内存中。

@在调试时,认为的修改 r1的值为 0x30001000 ,(2440的开发板)

@调试界面打开Memory窗口,观察 内存地址为 0x30001000 的数据是否是  0xff

ldr r2,  [r1]

@以r1的值作为内存的地址,把该内存地址上的值赋值给r2 ,应该是 0xff

				
时间: 2024-10-25 22:18:09

ARM指令分类学习的相关文章

3.2 ARM指令分类学习

1 算术移位寄存器和逻辑指令 1.1 mov 传送(Move) Mov {条件} {S} <dest>, <op_1> MOV从另一个寄存器.被移位的寄存器.或者一个立即数装载一个值到目的寄存器.还可以指定相同的寄存器来实 NOP 指令 MOV R0, R0 ; R0 = R0 等于 NOP 指令 MOV R0, R0, LSL#3 ; R0 = R0 * 8 如果 R15 是目的寄存器,将修改程序计数器或标志.这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15: MOV

ARM指令分类及其寻址方式

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

Part3_lesson2---ARM指令分类学习

1.算术和逻辑指令 mov.mvn.cmp.tst.sub.add.and.bic 2.比较指令 cmp和tst 3.跳转指令 b和bl 4.移位指令 lsl和ror 5.程序状态字访问指令 msr与mrs指令 6.存储器访问指令 ldr和str

ARM指令解析

今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/wrjvszq/8324589大家先拿到这个文档,这个文档对arm指令的解析相当的全面,但是这里要注意的是文档是arm对标准的汇编写出的文档,但是我们要用的是gnu的汇编,这两个稍微有点区别,关于区别大家可以去看看这个博客http://www.cnblogs.com/hnrainll/archive

Android ARM指令学习

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

Atitit.java&#160;虚拟机的构成&#160;与指令分类&#160;与&#160;指令集合&#160;以及字节码查看工具javjap

Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap 1.1. 虚拟机的构成 java虚拟机--处理器.堆栈.寄存器.指令系统. 1 1.2. 虚拟机执行过程1 1.3. 约有250个指令2 2. JVM指令助记符 分类2 2.1. 变量到操作数栈:2 2.2. 算数指令3 2.3. 移位指令3 2.4. 逻辑指令4 2.5. 流程跳转指令4 2.6. Oo指令4 2.7. 运算指令 5 3. 查看指令反编译工具6 3.1.   分析java语言特性的一

ARM基础知识学习笔记

/*****************数电知识*******************/ PN结(Positive-Negative) 三极管:BJT(双极结型三极管Bipolar Junction Transistor)               FET(场效应管Field Effect Transistor)          (单极结型) 1.MOSFET (金属氧化物半导体Metal Oxide Semiconductor FET)               2.JFET(结型Junct

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    把栈上内容载入一

Atitit..net&#160;clr&#160;il指令集&#160;以及指令分类&#160;&#160;与指令详细说明

Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具ILDASM1 1.3. 此程式执行时,关键的记忆体有三种,分別是:1 1.4. Il指令集2 1.4.1. Mov指令3 1.4.2.  跳转指令集合6 1.4.3.  算术 逻辑 与移位指令8 1.4.4. 类型转换9 1.4.5. Other  and oo指令10 2. 参考12 1.1.