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

标签 assembly x86 operators intel irvine32

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

作者在书中指出

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

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

我的理解正确吗?

此外,哪里是查找此类信息的最佳位置?

最佳答案

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

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 链接由 Cody Gray's comment 提供.

关于assembly - x86 处理器汇编语言 AND 和 OR 运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512137/

相关文章:

java - 为什么 =+ 不会导致编译错误?

assembly - VPERMILPS 指令 (_mm_permute_ps) 的意义何在?

c - 一个简单的 "Hello World"C/C++ 内联汇编语言程序

linux - .text 段大于可执行文件中的 .text 段。为什么?

assembly - 在 8088/86 上,CL 的移位/旋转是否会改变 CL 中的值?

javascript - 使用 if/else 确定获胜者

list - 如何可靠地比较列表的整数或浮点值?

c - 混合 C 和汇编

c++ - 如何使用 Neon Extension 有效地反转汇编语言 ARM 中的数组?

performance - rdpmc 的 CR4.PCE 已清除