selph
selph
发布于 2022-01-01 / 448 阅读
0
0

《xchg rax,rax》片段分析0x02--判断是否有值

前言

新年第一天,本次是该系列的的第0x02篇,很巧妙的有值判断


实验环境:

  • Windows10 + VS2022 + masm

0x02

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

neg      rax
sbb      rax,rax
neg      rax

代码分析

neg指令

指令格式:neg r/m

指令功能:对指定寄存器的值进行补码计算(取反,加一,不管正数负数一律进行这个操作)

如果操作数是0,则CF位置0,否则CF位置1

sbb指令

sbb置零:sbb 目的操作数, 源操作数,带退位的减法指令

实际运算是:目的操作数 - (源操作数 + CF位)

代码片段分析

这里通过neg指令判断目标值是不是0,如果是0,第一个neg指令会让CF位为0,使得经过sbb指令后值依然是0,最终结果也是0

如果目标值不为0,第一个neg指令会让CF位为1,使得经过sbb指令后的值固定为-1,也就是二进制的全1,最终结果会是1

本篇的内容是利用neg和sbb对CF标记位的影响来判断寄存器是否有值

测试代码:

.code
main proc
;rax = 10
    xor rax, rax
    add rax, 10

    neg      rax        ;rax 求补码(取反+1),如果rax不为0,则CF位置1
    sbb      rax,rax    ;reg - (reg+CF) 如果rax原本有值,必得 -1
    neg      rax        ;rax 求补码,-1求补码则得0

	ret

main ENDP
END

参考资料

SBB — Integer Subtraction with Borrow (felixcloutier.com)

NEG — Two's Complement Negation (felixcloutier.com)


评论