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表示立即数,十进制3
mov r2,r1
mov r3,#10 clean,编译,调试。
查看寄存器的值,寄存器的值可以使用16进制来展示,右键菜单选项进行设置。
2、MVN : 传送取反的值
MVN{条件}{S} <dest>, <op 1>
( 使用C语言的表示方法:dest = !op_1)将 <op 1> 按位取反之后,赋值给<dest>
例子:
mvn r1,#ob10
@ #ob10 表示二进制数 10
mvn r2,#5
mvn 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,#0
mov r1,#1
mov r2,#3
and r3,r0,r1
@r3的值是0
and 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,#0b101011
bic 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,#1
cmp 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,#7
mov r2,#3
cmp r1,r2
bgt branch
add r3,r1,r2
b end
branch:
sub r3,r1,r2
end:
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
ARM指令分类学习的更多相关文章
- 3.2 ARM指令分类学习
1 算术移位寄存器和逻辑指令 1.1 mov 传送(Move) Mov {条件} {S} <dest>, <op_1> MOV从另一个寄存器.被移位的寄存器.或者一个立即数装载 ...
- [国嵌笔记][025][ARM指令分类学习]
算术和逻辑指令 1.mov 格式:mov {条件}{s} <dest>, <op> 作用:把一个值从一个地方移动到另一个地方,<dest>必须是寄存器 示例: @m ...
- ARM指令分类及其寻址方式
ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...
- Part3_lesson2---ARM指令分类学习
1.算术和逻辑指令 mov.mvn.cmp.tst.sub.add.and.bic 2.比较指令 cmp和tst 3.跳转指令 b和bl 4.移位指令 lsl和ror 5.程序状态字访问指令 msr与 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- ARM指令解析
今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/ ...
- ARM指令学习,王明学learn
ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令 2.— MVN 数据取反传送指令 3.— CMP 比较指令 4.— CMN 反值比较指令 5.— TST 位测试 ...
- Android ARM指令学习
在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...
- arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...
随机推荐
- ACM题目————反约瑟夫问题
题目描述 Description 著名的约瑟夫问题是这样描述的:N个人排成一个圆圈,然后把这N个人按逆时针方向编号为1.2.….N:随机产生 一个正整数M,然后从编号为1的人开始按逆时针计数,当某人计 ...
- SQL数据类型大全 《转自网络》
数据类型是数据的一种属性,表示数据所表示信息的类型.任何一种计算机语言都定义了自己的数据类型.当然,不同的程序语言都具有不同的特点,所定义的数据类型的种类和名称都或多或少有些不同.SQLServer ...
- extjs 中动态给gridpanel 复选框赋值
最近在搞extjs时需要动态根据数据给gridpanel的复选框赋值 网上看了很多 ,多不行,最后找到一个好使的方法 如下: RBACformPanel.getSelectionModel().sel ...
- Winform知识
文档界面 分类: 1.单文档界面应用程序(SDI) 特点: 1.应用程序中SDI的所有窗体都彼此独立 2.多文档界面应用程序(MDI) 特点: 1.每个应用程序中只能有一个MDI父窗体,在父窗体中可以 ...
- hdu4932 Miaomiao's Geometry
这是一道搜索题,我们很容易得到目标值的上下界,然后就只能枚举了. 就是将x轴上的点排序之后从左到右依次考察每个点,每个点要么在线段的左端点,要么在线段的右端点. 点编号从0到n-1,从编号为1的点开始 ...
- Design T-Shirt 分类: HDU 2015-06-26 11:58 7人阅读 评论(0) 收藏
Design T-Shirt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- 这题实在不知道起啥名好了 分类: sdutOJ 2015-06-22 17:17 19人阅读 评论(0) 收藏
这题实在不知道起啥名好了 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 懒得想背景故事了,开门见山. 有一个长度为n的整数数列A ...
- Java中数组的特性
转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...
- ThreadPoolExecutor的学习
Java多线程之ThreadPoolExecutor 线程池的作用就是使用更少的线程, 来执行更多的任务, 以达到线程的充分利用. 从ThreadPoolExecutor类的构造方法学习: /** * ...
- select resharper shortcuts scheme
VS代码生成工具ReSharper提供了丰富的快捷键,可以极大地提高你的开发效率.安装ReSharper后首次启动Visual Studio时,会出现一个名为ReSharper Keyboard Sc ...