作者:小小寒沙 | 来源:互联网 | 2023-02-01 13:54
我目前正在学习汇编语言,遵循Kip Irvine的书"用于x86处理器的汇编语言".
在书中,作者说过
NOT运算符具有最高优先级,后跟AND和OR
我知道在Java中,&&(和)运算符的优先级高于|| (或)运算符,但从作者所说的来看,似乎在汇编语言中,AND和OR运算符似乎具有相同的优先级.
我的理解是否正确?
此外,哪里是寻找此类信息的最佳地点?
1> Margaret Blo..:
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
如果您尝试使用其中一个具有非常量值的运算符,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
1链接是由Cody Gray的评论提供的.