使用加法和减法设置和清除进位标志
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
会更糟糕,但该解决方案可能会使毫无意义的事情变得太明显了。
我很难清除进位标志,但我想出了一种使用减法清除它的方法,但我想知道是否有人可以与我分享如何设置和清除进位标志的更好方法使用加法和减法。
.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
会更糟糕,但该解决方案可能会使毫无意义的事情变得太明显了。