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

x86 processor assembly language AND and OR operator precedence

我目前正在按照 Kip Irvine 的书学习汇编语言 "Assembly language for x86 processor"。

作者在书中表示

the NOT operator has the highest precedence, followed by AND and OR

我知道在Java中,&&(和)运算符的优先级高于|| (or)运算符,不过从作者说的来看,好像在汇编语言中,AND和OR运算符的优先级好像是一样的

我的理解对吗?

另外,寻找此类信息的最佳位置在哪里?

只有当你有一个 equation/statement 一行有多个运算符时,你才能谈论优先级。

bool a = True && False || False && True

在大多数情况下,AND 运算符的优先级高于 OR 运算符,因此先处理 AND 运算符,然后再处理 OR 运算符。因此你得到了答案 'a = False'.


在汇编中,不能让 equation/statement 在一行中包含多个运算符。只有说明。像这样(x86 NASM 语法):

and ax, bx     ;ax = ax & bx   (bitwise, unlike C &&)

因此汇编中没有'precedence'这样的东西。这完全取决于您如何编写程序。如果你选择先做OR运算符,可以,因为没有equations/statements,只有说明。

查找此类信息的最佳位置是Google。 :) 请参阅 标签 wiki 以获取某些汇编程序和其他良好文档的手册链接,如果 Google 无法轻松打开它们。

Irvine 的书使用 MASM 作为参考汇编器。
作者说的是 MASM operators1 - 这些运算符的支持只是为了我们人类的利益。
它们让我们对立即数和常量执行算术运算,但它们所使用的表达式最终必须在汇编时解析为一个值。

aConstant EQU 35

mov edx, NOT 1                       ;Same as mov edx, 0fffffffeh
mov edx, aConstant  AND (NOT 3)      ;Same as mov edx, 32

如果您尝试使用具有非常量值的这些运算符之一,MASM 将相应地发出警告:

error A2026:constant expected

注意这里的ANDORNOT不是同义指令,有歧义——MASM可以从上下文中消歧:

mov ax, STATUS_REG OR ENABLE_BIT      ;Operator
or ax, bx                             ;Instruction

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

我在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

? -> 行是实际测试,结果是从检查生成的二进制可执行文件中收集的。
这证明顺序是(从高到低):NOTANDOR

当然,这符合通常的逻辑法则和尔湾本身,因为我认为引述应被解释为:

the NOT operator has the highest precedence, followed by AND and then followed by OR


1 Link 由 .

提供