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