汇编语言CMP(比较)指令:比较整数


了解了所有按位操作指令后,现在来讨论逻辑(布尔)表达式中的指令。最常见的布尔表达式涉及一些比较操作,下面的伪码片段展示了这种情况:

if A > B ...
while X > 0 and X < 200   ...
if check_for_error(N) = true

x86 汇编语言用 CMP 指令比较整数。字符代码也是整数,因此可以用 CMP 指令。

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数:

CMP destination,source

标志位

当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。

如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如右表所示:

CMP结果 ZF CF
目的操作数 < 源操作数 0 1
目的操作数 > 源操作数 0 0
目的操作数 = 源操作数 1 0

如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如右表所示:

CMP结果 标志位
目的操作数 < 源操作数 SF ≠ OF
目的操作数 > 源操作数 SF=OF
目的操作数 = 源操作数 ZF=1

CMP 指令是创建条件逻辑结构的重要工具。当在条件跳转指令中使用 CMP 时,汇编语言的执行结果就和 IF 语句一样。

下面用三段代码来说明标志位是如何受到 CMP 影响的。设 AX=5,并与 10 进行比较,则进位标志位将置 1,原因是(5-10)需要借位:

mov ax, 5
cmp ax,10     ; ZF = 0 and CF = 1

1000 与 1000 比较会将零标志位置 1,因为目标操作数减去源操作数等于 0:

mov ax,1000
mov cx,1000
cmp cx, ax        ;ZF = 1 and CF = 0

105 与 0 进行比较会清除零和进位标志位,因为(105-0)的结果是一个非零的正整数。

mov si,105
cmp si, 0        ; ZF = 0 and CF = 0