前言
新年第一天,本次是该系列的的第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