ARM处理器架构的Thumb指令集中关于IT指令的使用
在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了IT指令,进一步增强了代码的紧凑性。
Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。如果你需要更紧凑的指令,那么使用Thumb结合ThumbEE来做带条件的指令执行还是不错的选择。Thumb本身不具备带条件指令执行的特性。
IT指令的描述为:IT{<x>{<y>{<z>}}} <firstcond>
其中,<x>表示第二条指令的条件;<y>表示第三条指令的条件;<z>表示第四条指令的条件。<firstcond>是条件操作数,表示第一条指令的条件。
<x>、<y>、<z>的标识其实就两种符号——T或E。T表示Then,表示相应的指令所满足的条件与<firstcond>一致;E表示else,表示相应的指令所满足的条件与<firstcond>完全相反。因此,对于第一条指令而言,总是为T的,因此不需要在IT中显示给出,它直接对应于<firstcond>的条件。
另外,在IT块中不能再使用IT指令。即,相继的四条指令中不允许出现IT指令。
下面给出一些示例代码:
// // hi.s // test // // Created by zenny_chen on 13-5-8. // Copyright (c) 2013年 zenny_chen. All rights reserved. // .text .align 4 .globl _ThumbEETest, _ThumbEETest2 .thumb .thumb_func _ThumbEETest: eor r1, r1, r1 eor r2, r2, r2 eor r3, r3, r3 eor r12, r12, r12 cmp r1, #0 itete eq moveq r1, #10 movne r2, #20 moveq r3, #30 movne r12, #50 stmia r0, {r1-r3, r12} bx lr .thumb_func _ThumbEETest2: mov r1, #1 eor r2, r2, r2 eor r3, r3, r3 eor r12, r12, r12 cmp r1, #0 ittet gt movgt r1, #10 movgt r2, #20 movle r3, #30 // 这里只能用le(表示小于等于),而不能用lt(表示小于) movgt r12, #50 stmia r0, {r1-r3, r12} bx lr
// // ViewController.m // test // // Created by zenny_chen on 13-5-8. // Copyright (c) 2013年 zenny_chen. All rights reserved. // #import "ViewController.h" @interface ViewController () @end extern void ThumbEETest(int p[4]); extern void ThumbEETest2(int p[4]); @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. int a[4]; ThumbEETest(a); NSLog(@"a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d", a[0], a[1], a[2], a[3]); ThumbEETest2(a); NSLog(@"a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d", a[0], a[1], a[2], a[3]); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end