我目前正在按照 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
请注意,这里 AND
、OR
和 NOT
不是同名指令,存在歧义 - 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
? ->
行是实际测试,通过检查生成的二进制可执行文件收集结果。
这证明顺序是(从高到低):NOT
、AND
和 OR
。
当然,这符合通常的逻辑定律和欧文本身,因为我相信这句话应解释为:
<小时/>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/