https://zckun.github.io/2019/10/17/arm-bytecode-it-191017/

IT指令后面的指令是带条件的指令,比如MOVCC,是普通MOV指令的带条件版本,调试的时候会看到MOVCC每次都会跑到,只有实际只有条件满足才会真正执行

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 指令总会得到执行,即使无法满足其条件也如此。

条件后缀标志寄存器含义
EQZ == 1等于
NEZ == 0不等于
CS/HSC == 1无符号大于或相同
CC/LOC == 0无符号小于
MIN == 1负数
PLN == 0整数或零
VSV == 1溢出
VCV == 0无溢出
HIC == 1 && Z == 0无符号大于
LSC == 1 or Z == 0无符号小于或相同
GEN == V有符号大于或等于
LTN != V有符号小于
GTZ == 0 && N == V有符号大于
LEZ == 1 or N != V有符号小于或等于
AL任何始终。不可用于B{cond}中

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

ITETT EQ
MOVEQ R0, #1 ;//指令1
MOVNE R0, #0 ;//指令2
MOVEQ R1, #0 ;//指令3
MOVEQ R2, #0 ;//指令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 块中使用下面的指令:

IT
CBZ 和 CBNZ
TBB 和 TBH
CPS、CPSID 和 CPSIE
SETEND

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

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

举个例子

if (R4 == R5)
{
  R7 = R8 + R9;
  R7 /= 2;
}
else
{
  R7 = R10 + R11;
  R7 *= 2;
}

汇编如下

CMP R4, R5
ITTEE EQ
ADDEQ R7, R8, R9    ; if R4 = R5, R7 = R8 + R9
ASREQ R7, R7, #1    ; if R4 = R5, R7 /= 2
ADDNE R7, R10, R11  ; if R4 != R5, R7 = R10 + R11
LSLNE R7, R7, #1    ; if R4 != R5, R7 *=2

IT语法

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

IT后面最多可以跟4条指令,其中xyz只可以用T或者E,T就是Then,条件为真时执行,E是Else,条件为假时执行。 ITT后面就是两条指令,ITTEE就是四条指令。

体系结构

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