selph
selph
Published on 2022-01-19 / 411 Visits
0
0

《xchg rax,rax》片段分析0x12--等价两数相加

前言

本次是该系列的的第0x12篇,本篇介绍了一种新的两数相加的方法,感觉称之为加法的原理好像更合适


实验环境:

  • Windows10 + VS2022 + masm

0x12

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

mov      rcx,rdx
and      rdx,rax
or       rax,rcx
add      rax,rdx

代码分析

这里代码很简短,有两个要用的数,分别在rdx和rax里,首先把rdx复制到rcx,然后使用这个值对rax进行两个运算:and和or,然后把结果相加,最后得到的值与rax与rdx直接相加的结果相同,这里的内容是两数相加的另一种方法

以4位二进制相加为例,看一下计算结果:

rax = 1100b
rdx = 0110b
sum = 10010b

& 0100b
| 1110b
sum 10010b

这个and操作,把两数之间相同的位提取出来,相当于标记要进位的地方

这个or操作,把两数之间非相同的位进行加法,不进行进位,先把结果算出来

最后将要进位的地方进行进位(通过加法进行),最后得到了和的结果,这应该是两数相加的本质了吧

测试代码:

.code
main proc
    lea rdx, [011h]
    lea rax, [031h]

    mov      rcx,rdx    ;rcx = rdx
    and      rdx,rax    ;rdx = rdx & rax
    or       rax,rcx    ;rax = rax | rcx
    add      rax,rdx    ;rax = rax + rdx = (rdx & rax) + (rax | rcx) = (rdx & rax) + (rdx | rax) == rax + rdx

	ret
main ENDP
END

Comment