6. 对比说明¶
它们对两个参数执行算术或逻辑指令,丢弃结果但设置条件标志。通常,这些用于测试数据值,而无需在执行条件分支之前更改它们。
6.1. 文档约定¶
符号:表示ARM寄存器R0-R7。表示宽度为 8 位的立即数。Rd, Rm, Rn
imm8
6.2. 应用程序状态寄存器 (APSR)¶
这包含由条件分支指令测试的四位。通常,条件分支将测试多个位,例如bge(LABEL)
。条件代码的含义取决于算术指令的操作数是被视为有符号整数还是无符号整数。因此bhi(LABEL)
假设处理了无符号数,而
bgt(LABEL)
假设有符号操作数。
6.3. APSR 位¶
Z (零)
如果操作的结果为零或比较的操作数相等,则设置此值。
N (负)
如果结果是否定的,则设置。
C (携带)
当结果溢出 MSB 时,加法设置进位标志,例如将 0x80000000 和 0x80000000 相加。由于二进制补码运算的性质,此行为在减法时相反,进位位表示借位清零。因此 0x10 - 0x01 作为 0x10 + 0xffffffff 执行,这将设置进位位。
V (溢出)
如果结果(被视为二进制的补码数)具有与操作数相关的“错误”符号,则设置溢出标志。例如,将 1 添加到 0x7fffffff 将设置溢出位,因为结果 (0x8000000),被视为二进制补码整数,是负数。请注意,在这种情况下,未设置进位位。
6.4. 比较说明¶
这些设置 APSR(应用程序状态寄存器)N(负)、Z(零)、C(进位)和 V(溢出)标志。.
cmp(Rn, imm8)
Rn - imm8
cmp(Rn, Rm)
Rn - Rm
cmn(Rn, Rm)
Rn + Rm
tst(Rn, Rm)
Rn & Rm
6.5. 条件执行¶
it
和 ite
指令提供一至四个后续指令有条件地执行,而不需要的标签的装置。
it(<条件>) 如果那么
如果
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<条件>) 如果然后 else
如果
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
这可以扩展到控制最多四个后续指令的执行: it[x[y[z]]] 其中 x,y,z=t/e; 例如 itt、itee、itete、ittte、itttt、iteee 等。