將 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

優點

  • 大約相同的大小
  • 兩個或少一個指令
  • 沒有昂貴的跳躍

缺點

  • 對於不熟悉該技術的讀者來說,這是不透明的
  • 它改變了其他標誌