必须知道的ARM指令集 - 图文

2020-03-27 02:11

常用的ARM指令集

我们知道CPU能直接识别的是机器码,也就是0和1组合的东东。不同的组合代表不同的含义,CPU就做不同的事情。按照道理来说,我们写的代码都应该是0和1组成的东西,但是如果真的是那样,那结果....。人类是聪明的,发明了汇编语言,汇编语言是用一些助记符,来代替机器码。当然,汇编语言是不能给CPU识别的,需要编译器将其编译成机器码。

汇编语言是和特定的CPU关联的,不同的CPU对应不同的汇编指令。好在,现在大多数嵌入式CPU都是使用ARM架构的,这样我们只需要学会ARM的汇编指令集,我们写的汇编程序就可以在这些使用ARM架构的CPU上运行。

ARM的汇编指令很多,很难将其全部记住,其实也没必要,我们只需要学会一些常用的ARM汇编指令即可。其他的用到再去查即可。下面我们就开始,必须知道的ARM指令学习。 一、ARM指令格式 ARM指令的基本格式如下:

其中<>号内是必须的,{}号内的项是可选的。 各项的说明如下: opcode :指令助记符 cond :执行条件

S :是否影响CPSR寄存器的值

Rd :目标寄存器(一般用来存放指令执行最后的结果) Rn :第1个操作数的寄存器 operand2 :第2个操作数

1. 其中,我们必须要研究一下operand2这个操作数,它有如下表现形式

(1)#immed_8r——常数表达式

该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到,这个数我们也成立即数。 例如: MOV R0,#1 AND R1,R2,#0x0

例如:0x04800000它可以拿0x12循环右移位10位得到,所以它是一个合法的立即数。

有人会问,是不是每次我都要去判断一个数是不是立即数,我就需要从0x00~0xff里面找出一个数,将它循环右移偶数个位看是否能的得到,那太麻烦了。有没有一些快速识别的方法呢?肯定是有的呀,当然也不能完全依赖哦,最好就是拿编译器验证,不是,编译器就会报

错。

如何判断一个数是否是合法立即数?

首先将这个数转换为32bit 16进制形式,例如218=0xDA=0x000000DA

1.除零外,仅有一位数为合法立即数。

2.除零外,仅有二位数,并且相邻(包括首尾,如0x1000000A)的为合法立即数。

3.除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000,包括首尾相邻,如:0x14000003),这三位数中,最高位取值仅能为1、2、3,最低位取值仅能为4、8、C,中间位0x0~0xF。这种组合的为合法立即数。

除了以上三种,其他基本是非法立即数。

举例:

0xFF是有效立即数。 0x104是有效立即数。

0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F都是有效立即数。

反例:

0x101是无效立即数。

0x102是无效立即数。

0xFF1、0xFF04、0xFF003、0xFFFFFFFF都是无效立即数。

还有一个要说的就是:只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的立即数,否则就是非法的立即数。

练习: 下面哪些立即数是数据处理指令中有效的数据? a) 0x00AB0000 b) 0x0000FFFF c) 0xF000000F d) 0x08000012 e) 0x00001f80 f) 0xFFFFFFFF (2)Rm——寄存器方式

在寄存器方式下,操作数即为寄存器的数值。 例如:

SUB R1,R1,R2 MOV PC,R0

(3)Rm,shift——寄存器移位方式

将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下:

例如:

ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8=9R1 SUB R1,R1,R2,LSR R3 ;R1=R1-(R2/2R3) 2.ARM指令集——条件码

使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。 所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行 功能。如果指令不标明条件代码,将默认为无条件(AL)执行。

其中上图,红线括起来的必须记住,其他不知道的时候在回过头查即可。 例如:

二、ARM指令


必须知道的ARM指令集 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:cvs的功能介绍

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: