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指令
1、cmp就是为了设置控制位,不会改变数值;
2、cmp指令进行比较两个 *** 作数的大小;
3、cmp的意思。雹卜在进行比较的时候将个数做郑敏减法运算,运算是影响符号位的,大数减小数喊肆枝,符号位为加,反则为减。所以执行该指令后可以通过查询符号位CF是0还是1就可以知道两个数的大小。
cmp是汇编的比较指令;\x0d\x0acmp(compare)指令的作用:进行比较两个 *** 作数的大小;\x0d\x0a例如:\x0d\x0acmpoprd1,oprd2\x0d\x0a为第一个 *** 作减去第二个 *** 作数,但不影响第两个 *** 作数的值;\x0d\x0a它影响flag的CF,ZF,OF,AF,PF\x0d\x0a\x0d\x0a怎么判断大小呢?\x0d\x0a若执行指令后;\x0d\x0aZF=1这个简单,则说明两个数相等做顷早,因为zero为1说明结果为0\x0d\x0a当无符号时:\x0d\x0a若\x0d\x0aCF=1则说明了有进位或借位,cmp是进行的减 *** 作,故可以看出为借位,所以,此时oprd1oprd2\x0d\x0a当有符号时:\x0d\x0a若SF=0,OF=0则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2\x0d\x0a若SF=1,OF=0则说明了此时的值为负数,乎键没有溢出,则为oprd1oprd2\x0d\x0a最后两个纯雀可以作出这种判断的原因是,溢出的本质问题:\x0d\x0a两数同为正,相加,值为负,则说明溢出;\x0d\x0a两数同为负,相加,值为正,则说明溢出;\x0d\x0a故有,正正得负则溢出,负负得正则溢出。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)