实验环境:Windows10 + VS2022 + masm
前言
本次是该系列的的第0x23篇,又是数学相关的一个片段,emmm
0x23
代码片段链接:xorpd | xchg rax,rax 0x23
.loop:
cmp rax,5
jbe .exit_loop
mov rdx,rax
shr rdx,2
and rax,3
add rax,rdx
jmp .loop
.exit_loop:
cmp rax,3
cmc
sbb rdx,rdx
and rdx,3
sub rax,rdx
代码分析
cmc
指令:CF标志位取反
测试代码:
.code
main proc
mov rax, 7
loop1:
;while(rax>5)rax = rax>>2 + rax&3;
cmp rax,5 ;if(rax <= 5) 5:0101b
jbe exit_loop1 ;
mov rdx,rax ;rdx = rax
shr rdx,2 ;rdx = rdx >> 2
and rax,3 ;rax = rax & 3
add rax,rdx ;rax = rax + rdx = (rax&3)+(rax>>2)???
jmp loop1 ;loop ecx times
exit_loop1:
;if(rax>3)rax -= 3;
cmp rax,3 ;if(rax > 3),设置CF位的,当rax<3时,CF=1,rac>=3,CF=0
cmc ;CF 位取反
sbb rdx,rdx ;rdx = rdx - rdx - CF
and rdx,3 ;rdx取最后2位
sub rax,rdx ;rax = rax - rdx
ret
main ENDP
END
这里计算 rax = rax&3 + rax>>2
,取出最后两位,然后把整体右移两位,加起来,直到小于等于5的时候跳出循环
第一段的功能是:while(rax>5)rax = rax>>2 + rax&3;
然后对比3的关系,CF位取反,CF位影响sbb指令,rdx = rdx - rdx - CF
当rax>3时,CF=0,cmc取反之后CF=1,rdx=3,rax-=3
第二段的功能就是if(rax>3)rax -= 3;
这段代码的功能是:rax = rax%3