使用加法和减法设置和清除进位标志

Setting and Clearing the Carry Flag with Addition and Subtraction

我很难清除进位标志,但我想出了一种使用减法清除它的方法,但我想知道是否有人可以与我分享如何设置和清除进位标志的更好方法使用加法和减法。

.data

    binNum1 BYTE 11111111b

    binNum2 BYTE 00000001b

.code

    main PROC

    mov al, binNum1     ; AL = 0FFh

    add al, binNum2     ; AL = 00h CF = 1

    sub al, binNum2     ; AL = FFh CF = 1

    sub al, binNum2     ; AL = FEh  CF = 0

这就是我必须设置和清除进位标志。当我第一次从 AL 中减去 binNum2 时,我得到了 FFh 的原始值,但是进位标志仍然设置,直到我再次从 AL 中减去 binNum2。然后它将 AL 设置为 FEh 并清除进位标志。

有没有人有更好的清除进位标志的方法?

清除进位标志最好的方法是使用CLC指令;设置进位标志的最佳方法是使用 STC 指令。

如果你因为一些奇怪的原因必须用加法或减法来做;最差的方法(对于代码大小)可能是 sub eax,eax 清除进位标志,xor eax,eax; sub eax,1 设置进位标志。

注意:要设置进位标志,stc; sbb eax,eax 会更糟糕,但该解决方案可能会使毫无意义的事情变得太明显了。