CF:携带标志
ZF:零旗
我目前正在使用AT& T语法在linux平台上阅读有关intel x86汇编的书,该书说, setbe D 的效果与以下内容相符:
D ← CF & 〜 ZF
我明白了,但它可以写成:
D← CF | ZF
当CF / ZF为1/1或1/0时,这只与~ZF& CF不同?哪一个更准确?
答案 0 :(得分:3)
想想真相表。
| CF | ZF | CF &~ZF | CF|ZF |
+---------------------------+
0 0 0 0
0 1 0 1
1 0 1 1
1 1 0 1
真值表是不同的,所以不,它们不一样。
答案 1 :(得分:2)
setbe
, (ZF=1) or (CF=1)
会将结果设置为1。如果您正在阅读的文档说明它在(ZF=0) and (CF=1)
上设置,那就错了。请参阅80386 Programmer's Reference Manual。以下是详细分析:
setbe
将结果设置为1,与无符号整数进行比较(对于 l ess-or- e qual,对于有符号整数的等效值为setle
。
执行cmp
指令时,从源操作数中减去目标操作数,并丢弃结果。唯一的输出是条件标志的设置。请记住,当我们减去两个数字A-B
时,我们确实在两个补码中添加A+(~B)+1
,其中~B
是B
的补码(即所有位都被翻转) )。
让我们看看6个案例:
Case 0: Compare 1 to 0 0 - 1 = 0 + ~1 + 1 = 0x00000000 + 0xfffffffe + 1 = 0xffffffff ≠ 0, no carry ==> ZF = 0, CF = 0 Case 1: Compare 0 to 0 0 - 0 = 0 + ~0 + 1 = 0x00000000 + 0xffffffff + 1 = 0x00000000 = 0, with carry ==> ZF = 1, CF = 0 Case 2: Compare 0 to 1 1 - 0 = 1 + ~0 + 1 = 0x00000001 + 0xffffffff + 1 = 0x00000001 ≠ 0, with carry ==> ZF = 0, CF = 1 Case 3: Compare UINT_MAX to 0 0 - 4294967295 = 0 + ~4294967295 + 1 = 0x00000000 + 0x00000000 + 1 = 0x00000001 ≠ 0, no carry ==> ZF = 0, CF = 0 Case 4: Compare 0 to UINT_MAX 4294967295 - 0 = 4294967295 + ~0 + 1 = 0xffffffff + 0xffffffff + 1 = 0xffffffff ≠ 0, with carry ==> ZF = 0, CF = 1 Case 5: Compare UINT_MAX to UINT_MAX 4294967295 - 4294967295 = 4294967295 + ~4294967295 + 1 = 0xffffffff + 0x00000000 + 1 = 0x00000000 = 0, with carry ==> ZF = 1, CF = 1
第一个参数低于或等于第二个参数的情况是情况1,2,4和5.所有这些都满足(ZF=1) or (CF=1)
,以及比较为假的其余情况满足相反的条件,(ZF=0) and (CF=0)
。请注意,我们还列举了CF和ZF的所有可能组合。因此,我们得出结论,setbe
的正确行为是设置(ZF=1) or (CF=1)
。
答案 2 :(得分:0)
SETBE低于或等于(CF = 1或ZF = 1) 你确定CF& ~ZF是对的吗?指令可以是SETB还是SETL?