CF:进位标志
ZF:零标志
我目前正在阅读一本关于使用 AT&T 语法在 linux 平台上进行 intel x86 汇编的书,书中说,setbe D的效果相当于:
D ← CF & ~ ZF
我明白这一点,但它可以简单地写成:
D ← CF | 采埃孚
这仅在 CF/ZF 为 1/1 或 1/0 时与 ~ZF&CF 不同。哪个更准确?
CF:进位标志
ZF:零标志
我目前正在阅读一本关于使用 AT&T 语法在 linux 平台上进行 intel x86 汇编的书,书中说,setbe D的效果相当于:
D ← CF & ~ ZF
我明白这一点,但它可以简单地写成:
D ← CF | 采埃孚
这仅在 CF/ZF 为 1/1 或 1/0 时与 ~ZF&CF 不同。哪个更准确?
想想真值表。
| CF | ZF | CF &~ZF | CF|ZF |
+---------------------------+
0 0 0 0
0 1 0 1
1 0 1 1
1 1 0 1
真值表是不同的,所以不,它们不一样。
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)
。
SETBE 低于或等于(CF=1 或 ZF=1) 你确定 CF & ~ZF 是正确的吗?指令可以是 SETB 还是 SETL ?