《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > ARM汇编语言设置条件码

ARM汇编语言设置条件码

2017-06-22
关键词: 汇编语言

如果需要,ARM的任何数据处理指令都能通过增加S操作码来设置条件码。对于比较、测试指令操作,其主要作用就是设置条件码,因此可不用增加S操作码,但对所有其他数据处理指令必须通过增加S操作码来指明。例如,下面代码完成2个数的64位加法,一个数存于[R1,R0],另一个数存于[R3,R2],用C条件码标志位存立即数进位:

ADDS            R2,R2,R0                ;32位进位输出到C

ADC              R3,R3,R1                ;再加到高位字中

由于操作码的S扩展能控制指令是都修改条件码,所以适合的时候,需要在指令序列中把条件码保护起来,如在中断的情况下。

数据处理指令加了S后,算数操作根据算术运算的结果设置所有标志位。逻辑“或”传送操作不产生有意义的C或V值,他们根据结果设置N和Z,保留V。

1)条件执行

ARM指令集不同寻常的特征是每条指令都可以是条件执行的。条件转移是绝大多数指令集的标准特征,但ARM将条件执行扩展到所有指令,包括监控调用和协处理器指令。条件域cond占据32位指令域的高四位,如图所示。

条件域共有16个值,每个值都根据CPSR中的N、Z、C和V的标志位的值来确定指令执行还是跳过。

一条指令本来是用于跳过其后的几条指令,但如果利用ARM指令集所有ARM指令都可执行这一特点,则给予指令后的ARM指令以相反的条件,转移将被忽略。

例如:

       CMP       R0,#5

       BEQ       BYPASS                      ;如果R0≠5

       ADD       R1,R1,R0                ;则R1=R1+R0-R2

       SUB              R1,R1,R2                ;

BYPASS

这可替代为:

       CMP       R0,#5                        ;如果R0≠5

       ADDNE  R1,R1,R0                ;则R1=R1+R0-R2

       SUBNE   R1,R1,R2                ;

              …   

新的指令序列比原先的既短小又快速。如果被跳过的指令序列并不进行复杂的操作,使用条件执行都要比使用转移好。因为ARM转移指令一般要用3个周期来执行,所以上面例子中采用3条指令的方法。如果代码充分优化,那么是使用条件执行还是转移,需要根据代码动态行为的测量来决定。

有时巧妙地使用条件,可写出非常简练的代码。例如:

;if((a==b)&&(c==d))e++

CMP       R0,R1

CMPEQ  R2,R3

ADDEQ  R4,R4,#4

注意:如果第一个比较发现操作数不同,则第二个比较指令和后面加1指令也将跳过。由于第二个比较指令使用了条件执行,从而实现了if语句的逻辑“与”。


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。