汇编cmp指令的用法 大神请进

汇编cmp指令的用法 大神请进,第1张

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故有,正正得负则溢出,负负得正则溢出。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8274507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存