购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 ARM指令集的基本概念

ARM指令集是32位的指令代码,嵌入式代码的启动默认都是从ARM指令集开始的。其中还包括了所有的中断异常都自动转换成ARM状态。需要说明的是,所有的ARM指令集都可以是有条件执行的。

在ARM指令集中,根据条件码和S标志的不同可以形成多种变化的指令形式,种类繁多。因此,在本章中也不可能向读者一一列出ARM指令集中所有的变化形式。这里着重介绍ARM指令集中的变换规律,例如,条件码的种类和含义、S标志的含义等,读者只要参照对应的指令说明就可以实现对各种形式ARM指令的应用。

2.2.1 ARM指令的基本格式

ARM指令集是以32位二进制编码的方式给出的,并且在大部分的指令编码中都定义了第一操作数、第二操作数、目的操作数、条件标志影响位,以及每条指令所对应的不同功能实现的二进制位。每一条32位的ARM指令都具有不同的二进制编码方式,对应不同的指令功能。

一般而言,ARM指令代码的基本格式如图2.2所示。在ARM指令集中,32位的指令代码可以分为5个区域。

其中,ARM指令代码格式中的5个区域具体说明为:

(1)[31~28]为条件码,共4位,最多可表示16种不同的组合;

(2)[27~20]为指令代码,在该指令代码区域中,除了包含指令代码外,还包含了一些可选的后缀码;

(3)[19~16]为R0~R15,共16个寄存器;

(4)[15~12]为目标寄存器或源寄存器;

(5)[11~0]为地址偏移或操作数寄存器。

图2.2 ARM指令代码的格式

用户在编写ARM嵌入式代码的过程中,一般不会直接去编写指令代码,而是先编写ARM指令,然后用编译工具将指令转换成指令代码,即所谓的机器码。在这里需要提醒用户注意区分ARM指令代码和ARM指令的差别。其中,ARM指令的基本格式如图2.3所示。

图2.3 ARM指令的格式

在ARM指令格式中,参数[Opcode]表示指令操作的类型,如LDR、STR指令等;参数[cond]则表示执行条件。需要注意的是,这一部分只有在“条件跳转”指令中才有意义。

参数{S}表示是否影响CPSR寄存器的值,也是一个可选内容;参数[Rd]为目标寄存器;参数[Rn]为第一个操作数寄存器;参数[Operand2]表示第二个操作数。

在ARM指令中,约定“[ ]”内的部分是必需的内容,而“{ }”则是可选的内容。

在介绍完ARM指令代码和ARM指令的基本格式后,用户可以通过表2.2对ARM指令集中常用指令编码的格式做进一步了解。

表2.2 ARM指令的格式

当然,在ARM指令集中远远不止上述表格中所列举的几条指令,这里只是列举出了部分常用的操作指令,以及大体的指令格式。有兴趣的读者可以通过查阅ARM汇编手册对其他一些汇编指令的格式进行深入了解。

2.2.2 ARM指令中的条件执行

在ARM指令编码表中,最高4位[31:28]表示指令的条件码,即cond。在ARM汇编语言中,每种条件码都使用两个英文缩写字母符号来表示其含义。一般条件码都是添加在指令助记符的后面,用来表示在指令执行的过程中,必须满足当前的条件。

当程序运行到条件码时,如果当前条件满足,则执行该指令语句;如果条件不满足,则当前指令被忽略不再执行。在这种情况下,也可以理解为系统执行一条NOP指令(空指令,不执行任何操作)。

例如,在ARM汇编语言中,数据传送指令MOV后面加上条件后缀EQ,即MOVEQ,可以用来表示“如果相等,则传送数据;如果不相等,则不传送数据”。同样,用户也可以通过CPSR寄存器的状态来判断,即当Z标志为1时,进行数据传送;当Z标志不为1时,则不进行数据传送。

在ARM汇编指令中,除了上述的“-EQ”后缀外,还有其他的后缀助记符,分别代表不同的条件操作。用户可以通过表2.3查看有关ARM汇编指令中的条件码。

表2.3 ARM汇编指令中的条件码

根据表2.3中的条件码及其有关CPSR寄存器中标志位的相关说明,用户可以对比表2.4中两种不同的嵌入式编程语言所编写的ARM指令查看条件码在汇编指令中的具体含义。

表2.4 ARM条件码的应用

在表2.4中,左半部分是这段ARM指令所对应的C语言描述,主要用于实现比较两个数的大小,并将较大的数加1。

右半部分的代码则是对应的汇编语言描述。汇编语言相比C语言描述的代码较为复杂,下面将对该汇编语句中的各条指令分别进行解释说明。

在ARM汇编语言代码行1中,CMP R0,R1指令主要实现了寄存器R0和寄存器R1中数值的减法运算,并根据计算的结果设置CPSR寄存器中的C、N、Z、V等标志位。值得一提的是,在CMP减法指令中,只进行两个数值之间的减法操作,而并不立即保存减法运算的结果。

需要说明的是,有关CPSR寄存器中的C、N、Z和V等标志位的具体描述在2.2.3节有关ARM指令中的S标志中将向读者详细介绍。

该语句是一个条件执行语句,且需要注意的是,在ADD指令后添加了-HI后缀。从表2.3中可以看出,-HI后缀用于表示“大于(无符号比较)”,即如果CPSR寄存器中的标志状态位C=1且Z=0时,则将寄存器R0上的数值加上立即数#1,并且将最后计算的结果保存在寄存器R0中。

同样,第3条语句同第2条语句一样,也是一个条件执行指令。在表2.3中同样可以查得,-LS后缀用于表示“小于或等于(无符号比较)”,即当CPSR寄存器中的标志状态位C=0且Z=1时,将寄存器R1中的数值加上立即数#1,并将计算的结果保存到R1中。

比较表2.4中有关C语言代码的描述,对比相应的汇编语言可以看出,寄存器R0中对应的数字是变量a,寄存器R1中对应的数字是变量b。

最后,用户可以通过下面几个例句来回顾ARM汇编指令格式的具体操作使用方式。同样,用户可以结合表2.3中对应的指令说明及后缀含义来了解各条指令的含义,具体的意义以注释的形式给出,不再赘述。

2.2.3 ARM指令中的S标志

在部分特定的场合,绝大部分嵌入式ARM指令都可以根据实际的需求选择性地添加后缀。从某种程度上来说,这给ARM指令集的使用带来了较大的灵活性。

在前面的章节中,已经通过简单的例子向用户介绍了有关ARM指令中S后缀的使用方法和含义。从本质上来说,ARM指令中的S标志类似于一个用户可控的开关信号,主要用于决定在处理数据后是否更新CPSR寄存器中的标志位。

在这里有必要简单地向读者介绍一下通用ARM嵌入式芯片所支持的算术与逻辑标志,在后续的章节中仍然会使用到这些标志位,具体如表2.5所示。

表2.5 算术与逻辑标志(APSR与CPRS寄存器)

在ARM汇编语言中,如果指令操作码助记符的后面设置了S标志,则该指令运行后CPSR寄存器中的状态位同时被更新;如果指令操作码助记符的后面没有设置S标志,则该指令运行后,CPSR寄存器中的状态位不会被改变。下面这段代码可以帮助用户更好地理解ARM指令中S标志的具体作用。

在这段代码中,前两条指令主要将立即数0x7FFFFFFF分别存储到寄存器R3和R4中;第3条指令将R3和R4中的数值相加,但由于该“ADD”指令后没有添加S标志,即运算操作后不影响CPSR寄存器中的C标志位(进位标志);相比之下,第4条指令在ADD指令后添加了S标志,即运算操作后同时修改CPSR寄存器中的C标志位。 +hCziIqiIgZifz8B/SvgDgf6fLELZInpQ67PvlFJqLApjvINk6Lw7oK3MQybRfy0

点击中间区域
呼出菜单
上一章
目录
下一章
×