selph
selph
发布于 2022-01-13 / 334 阅读
0
0

《xchg rax,rax》片段分析0x0c--两种等价异或

前言

本次是该系列的的第0x0c篇,代码一如既往的很简短


实验环境:

  • Windows10 + VS2022 + masm

0x0c

代码片段链接:xorpd | xchg rax,rax 0x0c

mov      rcx,rax
xor      rcx,rbx
ror      rcx,0xd

ror      rax,0xd
ror      rbx,0xd
xor      rax,rbx

cmp      rax,rcx

代码分析

指令都是常见的那几个,这里可以看到,作者把代码分成了三部分,应该有其用意在,这里用到了3个寄存器:rax,rbx,rcx,首先是把rax的值复制给rcx,对rcx进行一段运算,然后对rax进行一段运算,对rax和rcx进行对比,随机输入值给rax,rbx进行测试,最终结果都是rax = rcx

实际上这里作者想表达的含义是:这两种异或(先移位再异或和先异或再移位)计算最终得到的结果是一样的

具体分析见下例测试注释

测试代码

.code
main proc
    lea rax, [099h]
    lea rbx, [0123h]

    mov      rcx, rax   ;rcx = rax
    xor      rcx, rbx   ;rcx ^= rbx
    ror      rcx, 0dh   ;rcx 循环右移0xd位  rcx = (rax^rbx) >> 13

    ror      rax, 0dh   ;rax 循环右移0xd位
    ror      rbx, 0dh   ;rbx 循环右移0xd位 
    xor      rax, rbx   ;rax = (rax >> 13) ^ (rbx >> 13)

    cmp      rax, rcx   ;对比rax和rcx, rax == rcx
    ;(rax ^ rbx) >> 13 == (rax >> 13) ^ (rbx >> 13)

	ret
main ENDP
END

评论