4.3.6. CMP 和 CMN

比较和与负值比较。

语法

CMP{cond} Rn, Operand2
CMN{cond} Rn, Operand2

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

Rn

是存放第一个操作数的 ARM 寄存器。

Operand2

是一个灵活的第二操作数。 有关此选项的详细信息,请参阅灵活的第二操作数

用法

这些指令可比较寄存器中的值与 Operand2。 它们会更新结果的条件标记,但不会将结果存入任何寄存器中。

CMP 指令从 Rn 中的值中减去 Operand2 中的值。 这与 SUBS 指令功能相同,只是会将结果丢弃。

CMN 指令可将 Operand2 的值加到 Rn 中的值上。 这与 ADDS 指令功能相同,只是会将结果丢弃。

在某些情况下,汇编器可能会用 CMN 替换 CMP 或用 CMP 替换 CMN。 阅读反汇编列表时请注意这一点。 有关详细信息,请参阅指令替换

在 ARM 指令中使用 pc

Note

不提倡在这些 ARM 指令中使用 pc (r15)。

如果将 pc 用作 Rn,则所用的值为指令地址加 8。

在所有由寄存器控制移位的数据处理指令中,都不能将 pc 用于任何操作数(请参阅灵活的第二操作数)。

在 Thumb-2 指令中使用 pc

在这些指令中,不能将 pc (r15) 用于任何操作数。

条件标记

这些指令会根据结果更新 N、Z、C 和 V 标记。

16 位指令

这些指令的下列形式可用于 Thumb-2 之前的 Thumb 代码中,在 Thumb-2 代码中使用时为 16 位指令:

CMP Rn, Rm

CMN Rn, Rm

RnRm 必须都是 Lo 寄存器。

CMP Rn, #imm

Rn 必须是 Lo 寄存器。 imm 范围为 0-255。

示例

    CMP     r2, r9
    CMN     r0, #6400
    CMPGT   r13, r7, LSL #2

不正确的示例

    CMP     r2, pc, ASR r0 ; pc not permitted with register controlled shift
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential