ARM指令集中的指令均为单字指令,它为指令的流水线执行创造了条件。大部分指令都以寄存器作为其操作数,指令执行速度快,寻址方式灵活多样。但是对于32位的ARM处理器来讲,指令中的立即数却有特殊的限制,必须满足一定的条件。当要向某一寄存器送入任意32位的立即数时,必须使用ARM中定义的“假伪指令”(LDR)来实现。之所以称为“假伪指令”,是因为它与其他伪指令不同,编译器通过文字池将它等效为ARM指令,因此它有机器码。
● ARM指令都是单字指令,占32位。基本指令只有36条。
● 指令可以有条件执行,也可以无条件执行。ARM指令的一个重要特点是几乎所有的指令都带有一个可选的条件码,可根据当前程序状态寄存器(CPSR)中的条件标志位来决定是否执行该指令。当指令带有条件码并且条件满足时执行该指令,条件不满足时该指令被当作一条空操作(NOP)指令。
● 灵活的寻址方式。计算机的寻址方式是计算机的主要性能特征之一,ARM指令有7种基本寻址方式,5种复合寻址方式。由于ARM指令都占32位,在大多数情况下可以有3个操作数,其中第1个操作数(目的操作数)一般为基本操作数寻址方式,第2个和第3个操作数采用复合寻址方式。ARM指令的重要特点是具有灵活的第2个操作数,既可以是立即数,也可以是逻辑运算数,使得ARM指令可以在读取数值的同时进行算术或移位操作。
● 对协处理器的支持。在很多以ARM为内核的微处理器中,都集成了增强浮点运算功能的协处理器。ARM内核提供了协处理器接口,通过扩展协处理器可以增加许多新的功能。因此,ARM指令中还包含许多条协处理器指令。
● Thumb指令集。ARM中有两种工作状态决定着它有两种指令集:32位的ARM指令集和16位的Thumb指令集。Thumb指令集是重新编码的ARM指令集的子集,通常运行于16位或低于16位的内存数据总线上。使用16位的存储器可以降低成本,同时Thumb指令集的执行速度比ARM 32位指令集要快,而且提高了代码密度。
1)ARM指令使用固定的32位字长,典型的ARM指令编码格式如图3-1所示。
图3-1 典型的ARM指令编码格式
2)ARM指令的语法格式如下:
其中,{}中的内容为可选项,<>中的内容为必选项。以下对具体项目内容进行说明。
{label}:标号代表一个地址,可选项。段内标号的地址值在汇编时确定,段外标号的地址在连接时确定。需注意的是,必须使用标号时不可省略。
<opcode>:指令助记符中的操作码,说明指令完成的功能,必选项。
{<cond>}:说明指令执行的条件。可选项,具体可选字符组合见表3-1,均由两个字符标识。如果有,指令必须在满足条件时才执行,不满足条件时指令执行空操作(NOP)指令;如果无,则指令是无条件执行的。
{S}:可选项,决定指令的操作是否对CPSR的条件标志码产生影响。选中助记符S,表示指令的执行对条件码产生影响;否则无影响。
注意 :有几个特殊的指令不需要助记符S,也会对条件标志码有影响,主要是比较类指令。
<Rd>:必选项,常作为存储指令执行结果的目的寄存器。
<Rn>:必选项,常作为存储指令第1操作数的寄存器。
{,<operand2>}:可有可无,取决于ARM指令。
{;comment}:可选项,指令注释行。以分号开头,说明指令完成的功能等。
3)应用示例:以下是一小段汇编程序。
对第2操作数使用的一些说明 :它共占12位,可以用来存储立即数,具体的形式参见下文所述;它还可以进行寄存器移位的偏移量操作,这时移位的寄存器Rm编码占4位,移位类型操作码占3位,移位常数占5位。
在ARM指令中为了提高代码的执行效率,可以灵活地使用第2操作数,上面的后两条指令就使用了第2操作数,它们是以立即数的形式出现的。第2操作数也可以实现复合寻址方式。以下较为详细地介绍其操作数形式。
用#immed_8r表示,即数据前使用符号“#”。immed_8r对应一个8位位图的常数,即一个8位的二进制常数向右循环移动偶数位得到的结果。具体的移位由4位二进制数乘以2确定,取值范围是(0~2 4 -1)×2=0~30。由图3-1所示的典型的ARM指令编码格式可以看出,第2操作立即数共占用12位(b11~b0),这里的8位指的是b7~b0,4位指的是b11~b8。
注意 :在写汇编程序时,只要指令中的立即数通过上述运算可以获得就是正确的,程序员不需要考虑立即数在指令代码中的具体存储,而由ARM汇编编译器确定。还有一点也要特别留心,即最后形成的是一个32位的数据常量。
合法的常数有:0x2FC、0xFF000000、0xF0000001、0x00~0xFF。
非法的常数有:0x1FE、511、0xFFFF、0x10100和xF000010。
常数表达式应用示例如下。
在这种方式下,第2操作数就是Rm寄存器的内容,具体应用示例如下。
Rm寄存器移位形式需要算术移位或逻辑移位的操作符与常数结合完成,操作完成后,Rm中的内容不变。移位的方法如下。
注意 :当n不在规定的取值范围时,它们运算的结果为0。
寄存器移位形式应用示例如下。
大多数ARM指令都是有条件执行的,也就是说根据当前程序状态寄存器(CPSR)中的条件标志位来决定是否执行该指令。另外还必须在指令格式中包含条件助记符。
从指令的编码格式中可以得知,条件码cond占32位指令的最高4位,也就是说它可以组合成16种条件码。每种条件码的含义和助记符见表3-1。
表3-1 ARM指令的条件码含义和助记符表
(续)
注意 :在ARMv5之前的版本中,ARM指令都是有条件执行的,但从ARMv5版本以后引入了一些无条件执行的指令。
条件执行指令应用示例如下。