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将相应地抱怨:
错误A2026:不变的预期
请注意,这里 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 .
当然,这符合通常的逻辑法则和欧文本身,因为我认为引用应解释为:
NOT运算符具有最高优先级,后跟AND,然后是OR