selph
selph
Published on 2022-01-15 / 387 Visits
0
0

《xchg rax,rax》片段分析0x0e--两种等价取反

前言

本次是该系列的的第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

Comment