3.8.1 指令及其编码格式
首先看ARM920T处理器都有哪些指令,如表3-6所示。
表3-6 ARM920T处理器的指令集
35条指令,当然有很多指令在不同的情况下有很多变形,后面会详细介绍。
虽然我们不是开发编译器的,但是我们还是粗略了解这些指令是怎么编码、怎么变成二进制数据存储在存储器中的。这对开发操作系统内核是有很多好处的,如图3-9所示。
图3-9 ARM920T指令编码格式
可以看出,ARM920T处理器ARM状态下的指令都是等长的32位编码。每条指令最高4位都是一个条件码,还有许多我们不认识的位和符号。这个留到介绍指令时再介绍。这里研究条件码是干什么的。
ARM920T处理器大部分指令都可以根据上条指令执行结果的状态,决定是否执行当前指令。如果条件满足就执行当前指令,否则不执行当前指令,相当于执行了一条空指令。设计人员为了达到这一目的,才给每条指令加上了一个条件码段,当然条件码是可选的,可以不写条件码的助记符,那么指令就是无条件执行的。一共有16种可能的条件,每种条件表示为在指令助记符后面附加两个字符后缀。例如,一条分支跳转指令“b”变成了“beq”,那么即为“如果相等则分支跳转”,这意味着只有CPSR寄存器中的Z标志位被置位了才会执行分支跳转。在实际应用当中,将会使用到15种不同的条件,保留第16种(1111)。这些条件码如表3-7所示。
表3-7 ARM920T处理器指令的条件码
注:0b表示后面的数字是二进制数。
要注意的是,很多指令不会主动影响CPSR寄存器中的标志位。有时可以在指令助记符后面加入“s”符号,表示要求这条指令的执行结果将影响CPSR寄存器中的标志位。具体什么样的指令可以加“s”符号,得视具体情况而定。后面介绍每条指令时,会详细介绍。
本书不会过于详细地介绍ARM920T处理器所有指令以及每条指令所有的详细使用方式。因为,一是篇幅所限,二是本书不是介绍某一特定处理器的指令集的专著。但是也不用害怕,笔者会尽量做到写操作系统内核时足够使用。