IT (If-Then) 指令由四條後續條件指令(IT 塊)句組成。 這些條件能夠徹底相同,也能夠互爲邏輯反。 IT 塊中的指令(包括跳轉)還必須在語法的
{cond}
部分中指定條件。 無需在代碼中編寫 IT 指令,由於彙編器會根據在後續指令中指定的條件爲您自動生成這些指令。 不過,若是確實須要編寫 IT 指令,則彙編器會根據後續指令中指定的條件對 IT 中指定的條件進行驗證。 編寫 IT 指令可確保您會考慮如何在代碼設計中放置條件指令以及選擇條件。 在彙編爲 ARM 代碼時,彙編器會執行相同的檢查,可是不會生成任何 IT 指令bash
語法:IT{x{y{z}}} {cond}
spa
x
: 指定 IT 塊中第二個指令的條件開關。y
: 指定 IT 塊中第三個指令的條件開關。z
: 指定 IT 塊中第四個指令的條件開關。cond
: 指定 IT 塊中第一個指令的條件。設計
IT 塊中第二個、第三個和第四個指令的條件開關能夠是下列項之一:code
T
: Then。 將條件 cond 應用於指令。E
: Else。 將 cond 的相反條件應用於指令。get
除了 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」符合時,執行指令一、三、4的mov操做,不然執行指令2的mov操做。table
ITETT EQ
MOVEQ R0, #1 ;//指令1
MOVNE R0, #0 ;//指令2
MOVEQ R1, #0 ;//指令3
MOVEQ R2, #0 ;//指令4
複製代碼
這是剛剛一個程序的代碼class
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 塊中使用任何彙編器指令。
此 16 位 Thumb 指令可用於 ARMv6T2 及更高版本
博客:2h0n9