Intel x86 Assembly& Microarchitecture 将进位标志移入寄存器

示例

背景

如果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

优点

  • 大约相同的大小

  • 少两个或一个指令

  • 没有昂贵的跳

缺点

  • 对于不熟悉该技术的读者来说是不透明的

  • 它改变了其他标志