前言
本次是该系列的的第0x07篇
实验环境:
- Windows10 + VS2022 + masm
0x07
代码片段链接:xorpd | xchg rax,rax 0x07
inc rax
neg rax
inc rax
neg rax
代码分析
指令没有陌生的,这里以4位二进制数0001b进行手算这段指令查看计算过程:
val = 0001b
neg val
0001b -> 1110b -> 1111b (取反+1),result = 1111b
inc val
neg val
0001b -> 0010b -> 1101b -> 1110b,result = 1110b
inc val
neg val
inc val
1110b -> 1111b
可以看出来,在neg前后对操作数进行相同的修改,不影响最终结果
在neg之前对操作数加1,neg之后的结果就会比没加1的neg结果少1,此时如果再加1,也就会变成原neg操作结果
同理,如果将inc改成dec,应该也是一样的,手算一下:
val = 0001b
neg val
0001b -> 1110b -> 1111b (取反+1),result = 1111b
dec val
neg val
0001b -> 0000b -> 1111b -> 0000b,result = 0000b
dec val
neg val
dec val
0000b -> 1111b
综上:本段代码的实际要告诉我们的是,在neg前后对操作数进行相同的修改不影响neg结果
测试代码:
.code
main proc
lea rax, [-1]
inc rax ;+1
neg rax ;取反+1
inc rax ;+1
neg rax ;取反+1
ret
main ENDP
END