[转贴]ARM的一些小技巧

[复制链接]
1895|1
 楼主| twentyone 发表于 2008-3-21 15:25 | 显示全部楼层 |阅读模式
最近学了点关于ARM的汇编中分支结构的小技巧,拿出来跟大家分享一下。如果您几百年前就看过了或早就精通了,不要笑话俺,俺是初学者如果大家也像偶一样是新手不妨看一下,应该没有坏处.<br />计算r1和r2的绝对值<br />对应的C伪指令为:<br />if&nbsp;(&nbsp;r1&gt;r2&nbsp;)<br />r0&nbsp;=&nbsp;r1&nbsp;r2;<br />else<br />r0&nbsp;=&nbsp;r1-r2;<br />对应的ARM汇编为:<br />cmp&nbsp;r1,&nbsp;r2<br />subgt&nbsp;r0,&nbsp;r1,&nbsp;r2<br />sublt&nbsp;r0,&nbsp;r2,&nbsp;r1<br />以上条件判断只适合简单的分支结构,复杂的分之结构如何实现呢???比如如下控制逻辑:<br />if&nbsp;(&nbsp;r1&gt;r2&nbsp;)<br />{<br />r0&nbsp;=&nbsp;r1&nbsp;-&nbsp;r2;<br />if&nbsp;(&nbsp;r0&gt;r3&nbsp;)<br />r0&nbsp;=&nbsp;1;<br />else<br />r0&nbsp;=&nbsp;0;<br />}<br />else<br />{<br />r0&nbsp;=&nbsp;r2&nbsp;-&nbsp;r1;<br />if&nbsp;(&nbsp;r0&gt;r3&nbsp;)<br />r0&nbsp;=&nbsp;1;<br />else<br />r0&nbsp;=&nbsp;0;<br />}<br />如果还按照上面的思路则很难写出汇编语句,因为ARM只有一个CPSR寄存器,只能存储一次比较结果。<br />对此问题,有如下四种解决思路:<br />(&nbsp;其中条件&nbsp;LE&nbsp;为无符号小于等于<br />GT&nbsp;为带符号大于<br />EQ&nbsp;为等于)<br />1.使用跳转语句<br />BEGIF&nbsp;CMP&nbsp;R1,&nbsp;R2<br />BLE&nbsp;ELSE&nbsp;/*********&nbsp;跳到第二分支&nbsp;************/<br />SUB&nbsp;R0,&nbsp;R1,&nbsp;R2<br />CMPGT&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />B&nbsp;ENDIF<br />ELSE<br />SUB&nbsp;R1,&nbsp;R2,&nbsp;R1<br />CMPGT&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />ENDIF<br />说明:跳转语句会影响流水线的执行,所以对速度有严格要求的场合要慎用<br />2.通过MSR和MRS两条指令使用通用寄存器或堆栈直接对CPSR进行操作。<br />CMP&nbsp;R1,&nbsp;R2<br />MRSLE&nbsp;R5,&nbsp;CPSR&nbsp;/****&nbsp;保存CPSR,进入第一个if&nbsp;***/<br />SUBGT&nbsp;R0,&nbsp;R1,&nbsp;R2<br />CMPGT&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />ELSE<br />MSR&nbsp;CPSR,&nbsp;R5<br />SUBLE&nbsp;R0,&nbsp;R2,&nbsp;R1<br />CMP&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />说明:在很多if嵌套的情况下,可以使用堆栈保存CPSR的值,但应注意对内存的操作速度要慢于寄存器的速度<br />3.通过临时变量记录比较的结果<br />CMP&nbsp;R1,&nbsp;R2<br />MOVLE&nbsp;R5,&nbsp;#1&nbsp;/*用R5记录状态,用1表示R1&nbsp;&lt;&nbsp;R2&nbsp;*/<br />SUBGT&nbsp;R0,&nbsp;R1,&nbsp;R2<br />CMPGT&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />ELSE<br />CMP&nbsp;R5,&nbsp;#1<br />SUBEQ&nbsp;R0,&nbsp;R1,&nbsp;R2<br />CMPEQ&nbsp;R0,&nbsp;R3<br />MOVGT&nbsp;R0,&nbsp;#1<br />MOVLE&nbsp;R0,&nbsp;#0<br />4.跳转表。
林粼粼 发表于 2008-3-21 15:30 | 显示全部楼层

ARM结构体系和编程上有介绍这些

杜春蕾的书看看还是有必要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

203

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部