| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 网上商城 | 芯片价格参考 | 留言 | 论坛 | 网络协议 | 驱动设计 | 购买指南-HowtoBuy | 
您现在的位置: FPGA开发板&SOPC开发板-嵌入式控制研究室 >> ARM >> ARM进阶 >> 文章正文 用户登录 新用户注册
关于ARM的汇编中分支结构的小技巧           ★★★ 【字体:
关于ARM的汇编中分支结构的小技巧
作者:佚名    文章来源:互联网    点击数:    更新时间:2007-6-9

最近学了点关于ARM的汇编中分支结构的小技巧,拿出来跟大家分享一下。如果您几百年前就看过了或早就精通了,不要笑话俺,俺是初学者:)如果大家也像偶一样是新手不妨看一下,应该没有坏处.
计算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

文章录入:fengfeiyi    责任编辑:fengfeiyi 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    关于ARM启动
    如何开发arm(5)
    如何开发arm(4)
    如何开发arm(3)
    如何开发arm(2)
    如何开发arm(1)
    在ARMulator中移植uClinux(…
    在ARMulator中移植uClinux(…
    在ARMulator中移植uClinux(…
    在ARMulator中移植uClinux(…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)