ARM - IT

IT

IT (If-Then) 指令由四条后续条件指令(IT 块)句组成。 这些条件可以完全相同,也可以互为逻辑反。
IT 块中的指令(包括跳转)还必须在语法的 {cond} 部分中指定条件。
无需在代码中编写 IT 指令,因为汇编器会根据在后续指令中指定的条件为您自动生成这些指令。 不过,如果确实需要编写 IT 指令,则汇编器会根据后续指令中指定的条件对 IT 中指定的条件进行验证。
编写 IT 指令可确保您会考虑如何在代码设计中放置条件指令以及选择条件。
在汇编为 ARM 代码时,汇编器会执行相同的检查,但是不会生成任何 IT 指令

语法IT{x{y{z}}} {cond}

x: 指定 IT 块中第二个指令的条件开关。
y: 指定 IT 块中第三个指令的条件开关。
z: 指定 IT 块中第四个指令的条件开关。
cond: 指定 IT 块中第一个指令的条件。

IT 块中第二个、第三个和第四个指令的条件开关可以是下列项之一:

T: Then。 将条件 cond 应用于指令。
E: Else。 将 cond 的相反条件应用于指令。

除了 CMP、CMN, 和 TST 之外,通常会影响条件代码标记的 16 位指令在用于 IT 块内时,不会影响这些标记。
IT 块中 BKPT 指令总会得到执行,即使无法满足其条件也如此。


条件后缀 标志寄存器 含义
EQ Z == 1 等于
NE Z == 0 不等于
CS/HS C == 1 无符号大于或相同
CC/LO C == 0 无符号小于
MI N == 1 负数
PL N == 0 整数或零
VS V == 1 溢出
VC V == 0 无溢出
HI C == 1 && Z == 0 无符号大于
LS C == 1 or Z == 0 无符号小于或相同
GE N == V 有符号大于或等于
LT N != V 有符号小于
GT Z == 0 && N == V 有符号大于
LE Z == 1 or N != V 有符号小于或等于
AL 任何 始终。不可用于B{cond}中

下面这个例子,意思是,当条件“EQ”符合时,执行指令1、3、4的mov操作,否则执行指令2的mov操作。

1
2
3
4
5
ITETT EQ
MOVEQ R0, #1 ;//指令1
MOVNE R0, #0 ;//指令2
MOVEQ R1, #0 ;//指令3
MOVEQ R2, #0 ;//指令4

这是刚刚一个程序的代码

1
2
3
4
LSLS    R2,R1,#1    ;R1 << 1,差不多就是R1*2,结果放在R2
CMP R4,R2 ;R4 - R2,判断R4 > R2
IT CC ;如果R4 < R2,就执行MOVCC,否则跳过MOVCC
MOVCC R4,R2 ;这里是将R1*2的值R2给R4

限制

不允许 在 IT 块中使用下面的指令:

1
2
3
4
5
IT
CBZ 和 CBNZ
TBB 和 TBH
CPS、CPSID 和 CPSIE
SETEND

使用 IT 块时的其他限制有:

跳转指令或修改 pc 的任何指令只能是 IT 块中的最后一个指令。
无法跳转到 IT 块中的任何指令,除非在从异常处理程序返回时。
不能在 IT 块中使用任何汇编器指令。

体系结构

此 16 位 Thumb 指令可用于 ARMv6T2 及更高版本