布尔值在汇编中如何“注释”?

Col*_*son 5 x86 assembly boolean-logic compilation

据我了解,在类似 C 的语言中,我可以不使用运算符执行布尔值not:(C)

int myBool = TRUE;
myBool = !myBool;
Run Code Online (Sandbox Code Playgroud)

但我的问题是:这在幕后是如何实现的?我的猜测是使用跳转,但如果过度使用,这些可能会效率低下:(Intel x86 语法)

; assume eax holds boolean
  test eax, eax
  jnz short boolTrue
  inc eax ; eax was 0, now 1
  jmp short after
boolTrue: ; eax non-zero
  xor eax, eax ; eax now 0
after:
Run Code Online (Sandbox Code Playgroud)

如图所示,它需要 5 条指令,其中至少有 1 个跳转和 1 个按位and( test)。必须有一种更简单的方法来做到这一点,因为我已经看到代码库if (!!fileHandle)由于某些奇怪的原因而执行“双重不”()。

那么(如上所述):编译器如何!在 x86 上执行 boolean 操作?

MBy*_*ByD 4

您可以使用SETZ(set (if) Zero (flag is set)) 来完成,这不需要任何分支。