普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4887|回复: 1

ARM中分支结构的小技巧

[复制链接]

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2015-9-14 14:47:24 | 显示全部楼层 |阅读模式
计算r1和r2的绝对值
对应的C伪指令为:
if ( r1>r2 )
r0 = r1+r2;
else
r0 = r1-r2;

对应的ARM汇编为:
cmp r1, r2
subgt r0, r1, r2
sublt r0, r2, r1

以上条件判断只适合简单的分支结构,复杂的分之结构如何实现呢???比如如下控制逻辑:
if ( r1>r2 )
{
r0 = r1 - r2;
if ( r0>r3 )
r0 = 1;
else
r0 = 0;
}
else
{
r0 = r2 - r1;

if ( r0>r3 )
r0 = 1;
else
r0 = 0;
}

如果还按照上面的思路则很难写出汇编语句,因为ARM只有一个CPSR寄存器,只能存储一次比较结果。
对此问题,有如下四种解决思路:
( 其中条件 LE 为无符号小于等于
GT 为带符号大于
EQ 为等于)

1.使用跳转语句
BEGIF CMP R1, R2
BLE ELSE /********* 跳到第二分支 ************/
SUB R0, R1, R2
CMPGT R0, R3
MOVGT R0, #1
MOVLE R0, #0
B ENDIF
ELSE
SUB R1, R2, R1
CMPGT R0, R3
MOVGT R0, #1
MOVLE R0, #0
ENDIF
说明:跳转语句会影响流水线的执行,所以对速度有严格要求的场合要慎用

2.通过MSR和MRS两条指令使用通用寄存器或堆栈直接对CPSR进行***作。
CMP R1, R2
MRSLE R5, CPSR /**** 保存CPSR,进入第一个if ***/
SUBGT R0, R1, R2
CMPGT R0, R3
MOVGT R0, #1
MOVLE R0, #0
ELSE
MSR CPSR, R5
SUBLE R0, R2, R1
CMP R0, R3
MOVGT R0, #1
MOVLE R0, #0
说明:在很多if嵌套的情况下,可以使用堆栈保存CPSR的值,但应注意对内存的***作速度要慢于寄存器的速度

3.通过临时变量记录比较的结果
CMP R1, R2
MOVLE R5, #1 /*用R5记录状态,用1表示R1 < R2 */
SUBGT R0, R1, R2
CMPGT R0, R3
MOVGT R0, #1
MOVLE R0, #0
ELSE
CMP R5, #1
SUBEQ R0, R1, R2
CMPEQ R0, R3
MOVGT R0, #1
MOVLE R0, #0

回复

使用道具 举报

0

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2015-12-6 01:45:49 | 显示全部楼层
强烈感谢楼主












回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-3 15:31 , Processed in 0.089797 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表