ARM汇编 - IT指令
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 指令总会得到执行,即使无法满足其条件也如此。
| 条件后缀 | 标志寄存器 | 含义 | 
|---|---|---|
| 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操作。
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 及更高版本