cmp是比较指令,cmp的功能相当于减法指令(sub)。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。
cmp指令格式: cmp 操作对象1, 操作对象2
注意是计算 操作对象2 - 操作对象1,和sub的一样,而不是 操作数1-操作数2(ATT格式), 但不保存结果,只是根据结果修改相应的标志位。示例代码:
#include <stdio.h>
int main()
{
int eax = 100;
int ebx = 200;
int output = -100;
asm volatile(
"movl %1,%%eax;\n\t"
"movl %2,%%ebx;\n\t"
"cmpl %%eax,%%ebx;\n\t" //用的是cmpl比较指喊态令
"sets %%al;\n\t" //负数时设置
"movzbl %%al,%%eax;\n\t"
"movl %%eax,%0\n\t"
: "=m"(output)
: "r"(eax), "r"(ebx)
: "eax");
printf("%d \n", output);
return 0;
}
最终的输出是1
扩展资料
cmp(compare)指令进行比较两个操作数的大小
例:cmpoprd1,oprd2
为第一个操作减去第二个操作数,
但不影响第两个操作数信渗帆的值
它影响flag的CF,ZF,OF,AF,PF
若执行指令后
ZF=1 这个简单,则说明两个数相等滑雹,因为zero为1说明结果为0
当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
参考资料:百度百科 CMP指令
假设现在AX寄存器中的数是0002H,差搭岁BX寄存器中的数是0003H。
执行的指令是:CMP AX, BX
执行这条指令枝迹时,先做用AX中的数减去BX中的数的减法运算。
列出二进制运算式子:
0000 0000 0000 0010
- 0000 0000 0000 0011
_________________________________
(借位1) 1111 1111 1111 1111
所以,运算结果是 0FFFFH
根据这个结果,各标志位将会被分别设置成以下值:
CF=1,虚睁因为有借位
OF=0,未溢出
SF=1,结果是负数
ZF=0,结果不全是零
还有AF, PF等也会相应地被设置。
CMP 比较指令做了减法运算以后,根据运算结果设置了各个标志位。
标志位设置过以后,0FFFFH这个减法运算的结果就没用了,它被丢弃,不保存。
执行过了CMP指令以后,除了CF,ZF,OF, SF,等各个标志位变化外,其它的数据不变。
对照普通的减法指令 SUB AX, BX,它们的区别就在于:
SUB指令执行过以后,原来AX中的被减数丢了,被换成了减法的结果。
CMP指令执行过以后,被减数、减数都保持原样不变。
假设AX寄存器编号0002H,BX寄存器编号0003H。
执行的指令:CMP AX,BX
该指令执行数减的减,在BX AX中的数字。
列表慧空姿二进制算术公式:
0000 0000 0000 0010
- 0000 0000 0000 0011
_________________________________
(借)1111 1111 1111 1111
/>所以,运算结果为0FFFFH
根据这个结果,标志位将被分别设置为以下值:
CF = 1,因为借
= 0 ,不会溢出
SF = 1,其结果是负数
ZF = 0时,结果是不是所有的零
AF,PF,进行相应的前绝设置。
CMP比较指令做减法,每个标志亏闹都被设置,根据操作的结果。
标志设置,0FFFFH减法的结果是没有用的,它会被丢弃,不会被保存。
CMP指令的执行,除了CF,ZF,OF,SF,和其他各种标志的变化,和其他数据不变。
控制的普通减法指令SUB AX,BX,它们之间的区别是:AX被减数的
SUB指令执行后,失去了和被替换的减法结果。
CMP指令执行,减数,减数完整的不变。