将 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

优点

  • 大约相同的大小
  • 两个或少一个指令
  • 没有昂贵的跳跃

缺点

  • 对于不熟悉该技术的读者来说,这是不透明的
  • 它改变了其他标志