该指令与SUB指令一样执行减法的 *** 作,但它并不保存运算结果,只是根据结果设置相关的'条件标志位(SF、ZF、CF、OF)。CMP指令后往往跟着条件转移指令,实现根据比较的结果产生不同的程序分支的功能。
但是,当半导体工艺进入0.18微米以后,线延时已经超过了门延迟,要求微处理器的设计通过划分许多规模更小、局部性更好的基本单元结构来进行。相比之下,由于CMP结构已经被划分成多个处理器核来设计,每个核都比较简单,有利于优化设计,因此更有发展前途。IBM 的Power 4芯片和Sun的 MAJC5200芯片都采用了CMP结构。多核处理器可以在处理器内部共享缓存,提高缓存利用率,同时简化多处理器系统设计的复杂度。
在微型计算机的汇编语言中,CMP(compare)是其中一条指令,叫做比较指令。cmp的功能相当于减法指令,只是对 *** 作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
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指令
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)