老古开发网首页
导航:老古开发网首页文章索引索引第1827页文章分类AVR单片机第2页→[关于ARM的汇编中分支结构的小技巧]
| -文章搜索 - 最新文章 - |

第1410篇:关于ARM的汇编中分支结构的小技巧

发布时间:2006年3月31日 点击次数:2212
来源:   作者:
 
最近学了点关于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


欢迎进入老古论坛进行讨论
[AVR单片机] 相关文章:
Source Insight配置WinAVR的具体步骤
简介:
配置WinAVR主要分2步: 1.选择Options-&gt;Custom Commands a. 点击ADD按纽,在Command: 内写入编译器名,如WinAVR Compile b. 在Run: 内写入命令make clean;make all; c. 千万不要在Dir加目录,我试过了,make clern;m......

AVR应用经验
AVR芯片的ISP全攻略
AVR的主要特性
Atmel三款带10位ADC的AVR单片机
 
下一个:[AVR单片机][转帖]ARM的生意经
简介:
只要是做嵌入式芯片的,无论是设计者、还是生产者,都难以绕过ARM(Advanced RISC Machines)—一家在半导体和芯片领域享有盛名的英国公司。但是与其在业内的鼎鼎大名形成鲜明对比的是,ARM在圈外却一贯默默无闻。        真“芯”英雄   逡巡于电子产品商店的普通消费大众几乎很少有人会看到ARM的Logo。“虽然看不到,但是ARM其实一直就在消费者周围。”ARM中国区总裁谭军说。   ARM“不为人知”,是因为它的客户不是普通消费者,而是众多的技术公司——A......

上一个:[嵌入式系统]实时嵌入式多用户指纹登录系统1

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:125毫秒