我对这个条件标志代码的推导有什么问题吗?

问题描述 投票:0回答:1

需要明确的是,我确信下面的推导是不正确的,但我希望有人能指出我的“证明”中哪里错了。

我试图证明x86指令

setb
确实实现了xcmp指令。具体来说,让我们考虑(ATT语法,我将忽略指示位数的后缀)

# Compare two registers, e.g., %eax and %ebx with values y and x, respectively, when unsigned
cmp %ebx, %eax

# Set %al to 1 if %eax is below %ebx (unsigned comparison)
setb %al

声明是当且仅当 x,y 的值服从 xcmp 指令从 %eax 的内容中减去 %ebx 的内容并且该操作设置适当的相关条件标志——包括这里感兴趣的执行标志。也就是说,它将位模式放入减法器单元中来计算 x(-^u)y,其中我使用该符号来描述无符号减法,并使用 - 来描述相应整数的减法。

现在这是我的问题。假设x

x(-^u)y := x(+^u)((-^u) y) = x(+^u)(2^w - y) = 2^w + x - y < 2^w,

所以表面上没有获得进位,因为结果适合我们的 w 位。即不执行。这只是“证明”的一个方向,但我已经可以清楚地看到我错了。我哪里错了?

assembly x86 integer-arithmetic carryflag eflags
1个回答
0
投票
如果减法中有借位,则

x86 的

sub
cmp
设置 CF。 如果将进位输入为 1 的按位逆相加而没有进位输出,就像 ALU 中的二进制加法器-减法器那样,就会出现这种情况。

某些 ISA(如 ARM)与 x86 的

sub
相反,直接从加减法器的进位输出设置其进位标志。 x86(和其他一些 ISA)将其反转。

相关:算术恒等式和 EFLAGS - 请注意,相当于

sub
的正确汇编是带有
1
cmc
进位的单个加法,而不是单独的
neg
add
,如果您关心 EFLAGS 结果。

© www.soinside.com 2019 - 2024. All rights reserved.