x86处理器汇编语言AND和OR运算符优先级

Tho*_*hor 2 x86 assembly intel operators irvine32

我目前正在学习汇编语言,遵循Kip Irvine的书"用于x86处理器的汇编语言".

在书中,作者说过

NOT运算符具有最高优先级,后跟AND和OR

我知道在Java中,&&(和)运算符的优先级高于|| (或)运算符,但从作者所说的来看,似乎在汇编语言中,AND和OR运算符似乎具有相同的优先级.

我的理解是否正确?

此外,哪里是寻找此类信息的最佳地点?

Mar*_*oom 6

Irvine的书使用MASM作为参考汇编程序.
作者正在讨论MASM运营商1 - 这些运营商仅为了我们人类的利益而受到支持.
它们让我们对立即数和常量执行算术,但它们使用的表达式必须最终在汇编时解析为一个值.

aConstant EQU 35

mov edx, NOT 1                       ;Same as mov edx, 0fffffffeh
mov edx, aConstant  AND (NOT 3)      ;Same as mov edx, 32
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用其中一个具有非常量值的运算符,MASM将相应地抱怨:

错误A2026:预期不变

请注意,在这里AND,ORNOT没有同名的指令,出现混淆- MASM可以从上下文歧义:

mov ax, STATUS_REG OR ENABLE_BIT      ;Operator
or ax, bx                             ;Instruction
Run Code Online (Sandbox Code Playgroud)

从人的角度来看,指令是顺序执行的,因此它们不需要任何优先顺序.
运算符形成表达式并且必须给出排序.

我在MASM文档中找不到这样的顺序,所以我通过汇编这段代码直接测试了它

  ;Results only refer to bit0 of the immediate.
  ;NOT 0 is 0ffffffffh but I consider it a 1 by the virtue of above.

  mov edx, 0 AND (1 OR 1)     ;0
  mov edx, (0 AND 1) OR 1     ;1
  mov edx, 0 AND 1 OR 1       ;? -> 1

  mov edx, (NOT 0) AND 0      ;0
  mov edx, NOT (0 AND 0)      ;1
  mov edx, NOT 0 AND 0        ;? -> 0

  mov edx, (NOT 0) OR 1       ;1
  mov edx, NOT (0 OR 1)       ;0
  mov edx, NOT 0 OR 1         ;? -> 1
Run Code Online (Sandbox Code Playgroud)

这些? ->行是实际测试,从检查生成的二进制可执行文件中收集结果.
这证明了顺序为(从最高到低)NOT,ANDOR.

当然,这符合通常的逻辑法则和欧文本身,因为我认为引用应解释为:

NOT运算符具有最高优先级,后跟AND,然后是OR


1链接是由Cody Gray的评论提供的.