selph
selph
发布于 2022-02-07 / 355 阅读
0
0

《xchg rax,rax》片段分析0x17--求绝对值

前言

本次是该系列的的第0x17篇,第一次见到的求绝对值的方法


实验环境:

  • Windows10 + VS2022 + masm

0x17

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

cqo
xor      rax,rdx
sub      rax,rdx

代码分析

cqo指令:将64位的rax扩展成128位的rdx:rax进行使用

这里输入正数的时候:

cqo					;扩展之后,rdx是0
xor      rax,rdx	;rax^rdx为rax本身
sub      rax,rdx	;rax-rdx为rax本身

结果是正数本身

这里输入负数的时候:

cqo					;扩展之后,rdx为全1(FFFFFFFFFFFFFFFF = -1)
xor      rax,rdx	;rax^rdx = rax取反-1
sub      rax,rdx	;rdx是-1,这里就是rax再+1

结果是负数的绝对值

分析代码:

.code
main proc
    lea rax, [-7];

    cqo                 ;扩展rax为rdx:rax 128位
    xor      rax,rdx    ;rax = rax ^ rdx,低64位和高64位异或
    sub      rax,rdx    ;rax = rax - rdx = (rax ^ rdx) - rdx,异或的结果减去高64位

    ret
main ENDP
END

参考资料

assembly - "cqo"、 "cdq"和 "cwd"x86_64 指令。为什么不只使用 cqo? - IT工具网 (coder.work)


评论