assembly - 当被减数为零时,为什么在减法过程中设置进位标志?

标签 assembly x86 flags

目前,我为非常大的无符号整数编写了自己的小库,用于算术和逻辑运算。为了提高性能,我决定在汇编中实现一些功能。所以这是我的问题。
在减去两个无符号整数时,当我从 0 中减去任何数字时,会设置进位标志。

但为什么在这种情况下设置进位标志?进位标志仅在发生溢出时设置,但如果我从零中减去任何数字,则不会发生溢出。
还是我错了?

最佳答案

进位标志是从最高位 (MSb) 进位或借位:

CF (bit 0) Carry flag — Set if an arithmetic operation generates a carry or a borrow out of the mostsignificant bit of the result; cleared otherwise. This flag indicates an overflow condition for unsigned-integer arithmetic. It is also used in multiple-precision arithmetic.



不要将 CF 与符号位相关联,在减法中,每当被减数(被视为无符号)小于被减数(被视为无符号)时,就会设置 CF。
这等效于溢出条件,对于有符号数,等效标志为 OF。

对于(不必要的?)视觉线索,在这个 4-5 操作中,是第二次借用,红色借用,设置了 CF

Borrow and CF

如果您从零中减去,那么自然而然地是,对于任何数字,但零本身,您将始终设置 CF,因为被减数至少设置了一位。

最后,一些指令可以让您在不影响 CF 的情况下更改符号位(参见例如逻辑运算或 neg 的行为)。

关于assembly - 当被减数为零时,为什么在减法过程中设置进位标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166573/

相关文章:

c - 使用带有逻辑运算符的标志而不是条件语句(例如 if())

javascript - 更改 RegExp 标志

c - 如何在C中打印EIP地址?

assembly - 8086 汇编问题,这段代码是做什么的

程序集 EAX 寄存器行为异常

java - REGEX 从控制台命令获取标志?

c - x87 双加法不起作用

assembly - MIPS堆栈帧(和 "addiu"指令混淆)

组件(TASM): print the sum of certain bits in bytes

assembly - 为什么在 64 位模式下使用 'DS:' 段覆盖是非法的?