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> 的标识其实就两种符号——TET 表示 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 _Thumb2Test, _Thumb2Test2

.thumb

.thumb_func
_Thumb2Test:

    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
_Thumb2Test2:

    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

下面是调用上述 Thumb2TestThumb2Test2 函数的Objective-C源文件。由于基于iOS系统,因此会有一些框架性的代码~

//
//  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 Thumb2Test(int p[4]);
extern void Thumb2Test2(int p[4]);
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
     
    int a[4];
    Thumb2Test(a);
    NSLog(@"a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d", a[0], a[1], a[2], a[3]);
     
    Thumb2Test2(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

大家可以尝试编译运行,看看输出什么结果~🤭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值