正确答案
CMPdst,src
CMP指令和SUB指令类似,也是执行两操作数相减,但和SUB指令不同的是,不送回相减结果,只是使结果影响标志位OF,SF,ZF,PF和CF。换句括说,由受影响的标志位状态便可判断两操作数比较的结果。
如何利用上述标志判断两操作数是否相等的关系呢?现设比较的两操作数为A和B:
(1)当两数相等(不管是无符号数或带符号数),则ZF=l,否则,ZF=0;
(2)若两数不相等,则应区分两数是无符号数还是带符号数:
①A和B均为无符号数:两个无符号数相减,CF就是借位标志。若CF=0,表示A-B无借位,则A>B;否则,当CF=l,有借位,则A<B;
②A和B均为带符号数,两个带符号数比较,将可能出现4种情况:
第一种情况:A>0,B>0(两正数比较):两正数相减,结果不会溢出,若结果的符号标志SF=0,则A>B;反之,结果的SF=l,则A<B;SF表示的是运算结果的符号位是正还是负,结果为负时,SF=1。
第二种情况:A<0,B<0(两负数比较):两负数相减,结果也不会溢出,这种情况下,仍然是SF=0,则A>B;反之,结果的SF=l,则A<B;
第三种情况:A>0,B<0(两异号数比较):显然,结果应该是A>B,而且这时应该有SF=0。例如:A=+50,B=-63,结果:A?/FONT>B=113=01110001<+127,不发生溢出,OF=0。
但如果A=+127,B=-63,比较结果是:
A.B=+127-(-63)==+190>+127,溢出,这时,机器中的结果为:
[+127]补=01111111B+[+63]补=00111111B
10111110B
SF=1,OF=1
因此,当结果发生溢出时,OF=1,应当SF=1才反映A>B。
第四种情况:A<0,B>0(两异号数比较):若A=-63,B=+50,显然A<B,比较结果:A-B=-113=10001111B,其SF=1,OF=0。
但若果A=-63,B=+127,比较结果是:A-B=-63-(+127)=-190<-128,溢出。
这时,在机器中的结果为:
[-63]补=11000001B+[-127]补=10000001B
10100010
SF=0,OF=1
因此,当结果发生溢出时,OF=1,应当SF=0,才反映A