selph
selph
发布于 2022-01-12 / 487 阅读
0
0

《xchg rax,rax》片段分析0x0b--128位整数取反

前言

本次是该系列的的第0x0b篇


实验环境:

  • Windows10 + VS2022 + masm

0x0b

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

not      rdx
neg      rax
sbb      rdx,-1

代码分析

这里也没有啥陌生的指令在,使用的寄存器有两个:rad和rdx,同时去操作这两个寄存器有什么意义呢,

之前遇到过(不记得具体是哪了)一种使用eax和edx扩展64位数进行运算的情况,这里是x64汇编,应该也是类似,使用rax和rdx扩展到128位数进行运算使用

每行代码的具体分析如下测试代码所示,那么这里的功能是128位整数取反操作

测试代码:

.code
main proc
    lea rax, [0]
    lea rdx, [2]
    
    ;rax和rdx扩展128位数据,rdx:rax
    not     rdx     ;rdx取反,高64位取反
    neg     rax     ;rax取反,低64位取反,然后+1,若rax为0,则CF(CY)=0,否则CF=1
    sbb     rdx,-1  ;若rax有值,低64位取反+1后有值,则高64位不变,若低64位无值,说明存在进位,高64位+1

	ret
main ENDP
END

参考资料

Solutions of xchg rax,rax


评论