新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM汇编编程基础之三-基本寻址方式与基本指令

ARM汇编编程基础之三-基本寻址方式与基本指令

作者: 时间:2016-11-27 来源:网络 收藏

3、分支指令,共3条:B、BL、BX

B label :跳转到标号label处,也就是说在该条b指令执行后,下一条执行的指令是标号label处的指令。

BL label :与B指令的功能相同,也实现跳转,不同之处在于,bl在跳转的同时还要将返回地址(bl指令的下一条指令的地址)保存到lr中

BX r0 :将r0的值作为地址,跳转到该地址处,并根据r0的值决定是否在ARM和thumb态之间进行切换。(关于BX指令,以及ARM态和thumb态的切换,详见“ARM程序与thumb程序的切换”一文)

特别说明:

B和BL指令,其跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。这是为什么呢?详见“杂项解释”一文。

4、数据处理指令

MOV r0, r1:将r1的值赋给r0

ADD(SUB) r0, r1, r2:将r1的值加上(减去)r2的值,结果存放到r0中

AND(ORR, EOR) r0, r1, r2:将r1的值与(或、异或)r2的值,结果存放到r0中

CMP r1, r2:比较r1与r2值的大小

特别需要说明的问题:

指令CMP r1,r2,其作用细节是:执行r1-r2的操作,如果结果为负数,则置位CPSR的N位,清零Z位;结果为0,则清零CPSR的N位,置位Z位;结果为正,则清零CPSR的N位,清零Z位。但r1-r2的结果并不保存。CMP指令通常用于分支跳转。例如,如下的C程序

int i,j;

if (i == j) {

i++;

} else {

j++;

}

如果使用汇编语句改写的话,就应该写为:

使用ldr指令将变量i的值放入r0

使用ldr指令将变量j的值放入r1

cmp r0, r1

addeq r0, r0, #1

使用streq指令将r0的值放入变量i中

beq label

add r1, r1, #1

使用str指令将r1的值放入变量j中

label其它代码

……

其中addeq, streq, beq这几条指令,是add, str, b指令的条件执行版本。讲到这里就不得不讲解一下什么是条件执行了。ARM指令集的所有指令均支持条件执行,条件执行指的是,指令可以根据执行时的情况(CPSR的条件代码标志位)决定自身是否被执行。eq表示如果CPSR的Z位为1(对于本程序,实际上就是r0的值与r1的值相等,因为cmp会根据r0与r1的值设置Z位)的情况下,该指令要执行,否则不执行。

其它条件助记符如下:

条件助记符标志含义
EQZ=1相等
NEZ=0不相等
CS/HSC=1无符号数大于或等于
CC/LOC=0无符号数小于
MIN=1负数
PLN=0正数或零
VSV=1溢出
VCV=0没有溢出
HIC=1,Z=0无符号数大于
LSC=0,Z=1无符号数小于或等于
GEN=V有符号数大于或等于
LTN!=V有符号数小于
GTZ=0,N=V有符号数大于
LEZ=1,N!=V有符号数小于或等于
AL任何无条件执行 (指令默认条件)
NV任何从不执行(不要使用)


上一页 1 2 下一页

评论


技术专区

关闭