0

CF:进位标志

ZF:零标志

我目前正在阅读一本关于使用 AT&T 语法在 linux 平台上进行 intel x86 汇编的书,书中说,setbe D的效果相当于:

DCF & ~ ZF

我明白这一点,但它可以简单地写成:

D ← CF | 采埃孚

这仅在 CF/ZF 为 1/1 或 1/0 时与 ~ZF&CF 不同。哪个更准确?

4

3 回答 3

3

想想真值表。

| CF | ZF | CF &~ZF | CF|ZF |
+---------------------------+
   0    0      0        0
   0    1      0        1
   1    0      1        1
   1    1      0        1

真值表是不同的,所以不,它们不一样。

于 2009-04-27T01:25:46.320 回答
2

setbe如果 将结果设置为 1 (ZF=1) or (CF=1)。如果您正在阅读的文档说它设置了它(ZF=0) and (CF=1),那就错了。请参阅80386 程序员参考手册。下面是详细分析:

setbe如果前面比较的结果是小于或等于,则将结果设置为 1 ,作为无符号整数进行比较时有符号整数的等价物是,对于小于或等于)。setle

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

我们来看6个案例:

案例 0:比较 1 和 0
    0 - 1
  = 0 + ~1 + 1
  = 0x00000000 + 0xffffffffe + 1
  = 0xffffffff ≠ 0,无进位
  ==> ZF = 0,CF = 0

案例 1:比较 0 和 0
    0 - 0
  = 0 + ~0 + 1
  = 0x00000000 + 0xffffffff + 1
  = 0x00000000 = 0,带进位
  ==> ZF = 1,CF = 0

案例 2:比较 0 和 1
    1 - 0
  = 1 + ~0 + 1
  = 0x00000001 + 0xffffffff + 1
  = 0x00000001 ≠ 0,带进位
  ==> ZF = 0,CF = 1

案例 3:将 UINT_MAX 与 0 进行比较
    0 - 4294967295
  = 0 + ~4294967295 + 1
  = 0x00000000 + 0x00000000 + 1
  = 0x00000001 ≠ 0,无进位
  ==> ZF = 0,CF = 0

案例 4:比较 0 和 UINT_MAX
    4294967295 - 0
  = 4294967295 + ~0 + 1
  = 0xffffffff + 0xffffffff + 1
  = 0xffffffff ≠ 0,带进位
  ==> ZF = 0,CF = 1

案例 5:比较 UINT_MAX 和 UINT_MAX
    4294967295 - 4294967295
  = 4294967295 + ~4294967295 + 1
  = 0xffffffff + 0x00000000 + 1
  = 0x00000000 = 0,带进位
  ==> ZF = 1,CF = 1

第一个参数小于或等于第二个参数的情况是情况 1、2、4 和 5。所有这些情况都满足(ZF=1) or (CF=1),而比较为假的其余情况满足相反的条件,(ZF=0) and (CF=0)。请注意,我们还列举了 CF 和 ZF 的所有可能组合。因此,我们得出结论,正确的行为setbe是设置 on (ZF=1) or (CF=1)

于 2009-04-27T01:47:25.147 回答
0

SETBE 低于或等于(CF=1 或 ZF=1) 你确定 CF & ~ZF 是正确的吗?指令可以是 SETB 还是 SETL ?

于 2009-04-27T01:41:07.283 回答