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