将 Carry 标志移动到寄存器中
背景
如果 Carry(C
)标志包含你想要放入寄存器的值,那么天真的方法是执行以下操作:
mov al, 1
jc NotZero
mov al, 0
NotZero:
用’sbb'
避免跳跃的更直接的方法是使用借用减法:
sbb al,al ; Move Carry to al
如果 C
为零,那么 al
将为零。否则它将是 0xFF
(-1
)。如果你需要它是 0x01
,请添加:
and al, 0x01 ; Mask down to 1 or 0
优点
- 大约相同的大小
- 两个或少一个指令
- 没有昂贵的跳跃
缺点
- 对于不熟悉该技术的读者来说,这是不透明的
- 它改变了其他标志