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