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,OR并NOT没有同名的指令,出现混淆- 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,AND和OR.
当然,这符合通常的逻辑法则和欧文本身,因为我认为引用应解释为:
NOT运算符具有最高优先级,后跟AND,然后是OR
1链接是由Cody Gray的评论提供的.