最近学了点关于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
4.跳转表。介个内容太多,偶的宿舍在阴面,手指头冰凉冰凉的,也累了,先不写了。下面有资料出处,自己看吧.我下次再写完:)。
大部分内容来自于:吴明晖 <<基于ARM的嵌入式系统开发与应用>>
我要赚赏金打赏帖 |
|
|---|---|
| 28BYJ-48机械臂实现人脸跟随被打赏¥24元 | |
| 基于RK3506B的片温识读功能的实现被打赏¥25元 | |
| 【瑞萨RA8D1测评】基于FreeRTOS的lvgl移植教程被打赏¥29元 | |
| 电子价签墨水屏开发被打赏¥35元 | |
| 【Ozone】RTT 打印终端使用被打赏¥29元 | |
| BMS保护板绝缘检测功能-不平衡电桥技术绝缘电阻检测设计与实现被打赏¥34元 | |
| 给28BYJ-48三自由度机械臂加一个网页控制台被打赏¥32元 | |
| 用28BYJ-48电机从零搭一台三自由度机械臂被打赏¥33元 | |
| 【英飞凌开发经验】ModusToolbox配置EdgeTalk外设被打赏¥27元 | |
| 基于BQ76952PFBR的BMS保护板热插拔损坏的原因和处理措施被打赏¥32元 | |
我要赚赏金
