ARM指令中的條件代碼
ARM指令集中所有ARM指令都是可以帶條件執(zhí)行的。下面是條件代碼的列表:
EQ : 等于
如果一次比較之后設(shè)置了 Z 標(biāo)志。
NE : 不等于
如果一次比較之后清除了 Z 標(biāo)志。
VS : 溢出設(shè)置
如果在一次算術(shù)操作之后設(shè)置了 V 標(biāo)志,計算的結(jié)果不適合放入一個 32bit 目標(biāo)寄存器中。
VC : 溢出清除
如果清除了 V 標(biāo)志,與 VS 相反。
HI : 高于(無符號)
如果一次比較之后設(shè)置了 C 標(biāo)志并清除了 Z 標(biāo)志。
LS : 低于或同于(無符號)
如果一次比較操作之后清除了 C 標(biāo)志或設(shè)置了 Z 標(biāo)志。
PL : 正號
如果一次算術(shù)操作之后清除了 N。出于定義‘正號’的目的,零是正數(shù)的原因是它不是負(fù)數(shù)...
MI : 負(fù)號
如果一次算術(shù)操作之后設(shè)置了 N 標(biāo)志。
CS : 進(jìn)位設(shè)置
如果一次算術(shù)操作或移位操作之后設(shè)置了 C 標(biāo)志,操作的結(jié)果不能表示為 32bit。你可以把 C 標(biāo)志當(dāng)作結(jié)果的第 33 位。
CC : 進(jìn)位清除
與 CS 相反。
GE : 大于或等于(有符號)
如果一次比較之后...
設(shè)置了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
或者...
清除了 N 標(biāo)志并清除了 V 標(biāo)志。
GT : 大于(有符號)
如果一次比較之后...
設(shè)置了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
或者...
清除了 N 標(biāo)志并清除了 V 標(biāo)志
并且...
清除了 Z 標(biāo)志。
LE : 小于或等于(有符號)
如果一次比較之后...
設(shè)置了 N 標(biāo)志并清除了 V 標(biāo)志
或者...
清除了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
并且...
設(shè)置了 Z 標(biāo)志。
LT : 小于(有符號)
如果一次比較之后...
設(shè)置了 N 標(biāo)志并清除了 V 標(biāo)志。
或者...
清除了 N 標(biāo)志并設(shè)置了 V 標(biāo)志。
AL : 總是
缺省條件,所以不用明顯聲明。
NV : 從不
不是特別有用,它表示應(yīng)當(dāng)永遠(yuǎn)不執(zhí)行這個指令。相當(dāng)于NOP。包含 NV 是為了完整性(與 AL 相對),不推薦在代碼中使用它。
S:
還有一個條件代碼是S,它表示執(zhí)行操作后,接著把SPSR的內(nèi)容恢復(fù)到CPSR中。例如:
ADD R0, R0, R1
ADDS R0, R0, R1
ADDEQS R0, R0, R1
第一個例子是一個基本的加法(把 R1 的值增加到 R0),它不影響狀態(tài)寄存器。
第二個例子是同一個加法,只不過它導(dǎo)致更改狀態(tài)寄存器。
最后一個例子是同一個加法,更改狀態(tài)寄存器。不同在于它是一個有條件的指令。只有前一個操作的結(jié)果是 EQ (如果設(shè)置了 Z 標(biāo)志)的時候它才執(zhí)行。
評論