访问汇编条件代码

时间:2009-04-27 01:15:55

标签: assembly boolean-logic

CF:携带标志

ZF:零旗

我目前正在使用AT& T语法在linux平台上阅读有关intel x86汇编的书,该书说, setbe D 的效果与以下内容相符:

D CF & 〜 ZF

我明白了,但它可以写成:

D← CF | ZF

当CF / ZF为1/1或1/0时,这只与~ZF& CF不同?哪一个更准确?

3 个答案:

答案 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。以下是详细分析:

如果前面比较的结果是 b elow-或 - e qual,则

setbe将结果设置为1,与无符号整数进行比较(对于 l ess-or- e qual,对于有符号整数的等效值为setle

执行cmp指令时,从源操作数中减去目标操作数,并丢弃结果。唯一的输出是条件标志的设置。请记住,当我们减去两个数字A-B时,我们确实在两个补码中添加A+(~B)+1,其中~BB的补码(即所有位都被翻转) )。

让我们看看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?