selph
selph
发布于 2022-04-12 / 386 阅读
0
0

《xchg rax,rax》片段分析0x23--模3运算

实验环境: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


评论