前言
本次是该系列的的第0x0e篇,依然是两种等价运算
实验环境:
- Windows10 + VS2022 + masm
0x0e
代码片段链接:xorpd | xchg rax,rax 0x0e
mov rcx,rax
and rcx,rbx
not rcx
not rax
not rbx
or rax,rbx
cmp rax,rcx
代码分析
本文和上次的内容是依然一类的,只不过操作换了,符合的结合律很相似,不过这里还不太一样,两种等价的取反操作,两个数进行取反操作之前先各自进行相同的and操作,和取反操作之后再进行or操作,最终结果是一样的,也就是说,存在这样一个等价关系:~(rcx & rbx) == ~rax | ~rbx
,和离散数学的逻辑取反相同,因为比较简单,就不再做介绍了
测试代码:
.code
main proc
lea rax, [099h]
lea rbx, [0123h]
lea rcx, [011h]
mov rcx,rax ;rcx = rax
and rcx,rbx ;rcx = rcx & rbx
not rcx ;rcx = ~(rcx & rbx)
not rax ;rax = ~rax
not rbx ;rbx = ~rbx
or rax,rbx ;rax = ~rax | ~rbx
cmp rax,rcx ;~(rcx & rbx) == ~rax | ~rbx
ret
main ENDP
END