编程论坛
注册
登录
编程论坛
→
汇编论坛
有关王爽书中cmp指令的疑问
tigerdown
发布于 2018-05-23 08:10, 3466 次点击
在P225, (3)如果sf=0,而of=1, 则(ah)<(bh)。
谁能举一下实例,多谢
只有本站会员才能查看附件,请
登录
8 回复
#2
tigerdown
2018-05-23 09:07
在<<Assembly Language for x86 Processors>> KIP R. IRVINE 书中是这样判断的:
CMP Results ZF CF Flags
a<b 0 1 SF=/OF
a>b 0 0 SF=OF
a=b 1 0 ZF=1
只有本站会员才能查看附件,请
登录
[此贴子已经被作者于2018-5-23 14:56编辑过]
#3
tigerdown
2018-05-23 13:15
回复 楼主 tigerdown
如果溢出of=1那么就会超出-127到128范围, 所以最高位应是1, 怎么可能Sf=0呢?!
#4
wmf2014
2018-05-24 09:39
cmp(compare)指令进行比较两个操作数的大小
例:cmp oprd1,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
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
#5
tigerdown
2018-05-24 10:15
回复 4楼 wmf2014
谢谢, 版主回贴
实例证明,这二本书对cmp指令的描述是不符事实。
例子: ah=0, bh=128, cmp ah, bh. 运行后sf=1, of=1, 而ah<bh, 我附上运行结果和二夲书中的陈述。
只有本站会员才能查看附件,请
登录
只有本站会员才能查看附件,请
登录
只有本站会员才能查看附件,请
登录
#6
tigerdown
2018-05-24 10:15
回复 4楼 wmf2014
谢谢, 版主回贴
实例证明,这二本书对cmp指令的描述是不符事实。
例子: ah=0, bh=128, cmp ah, bh. 运行后sf=1, of=1, 而ah<bh, 我附上运行结果和二夲书中的陈述。
只有本站会员才能查看附件,请
登录
只有本站会员才能查看附件,请
登录
只有本站会员才能查看附件,请
登录
#7
wmf2014
2018-05-24 10:51
我一般进行无符号位比较,看ZF和CF标志位就行了,未关注过OF、SF。
cmp a,b
NZ NC则a>b
NZ CY则a<b
#8
tigerdown
2018-05-24 11:53
回复 7楼 wmf2014
非常同意你的看法, 但不知他们为什么把这事搞得太复杂
#9
qcy1021
2018-06-11 19:17
1