selph
selph
发布于 2022-01-08 / 313 阅读
0
0

《xchg rax,rax》片段分析0x07--neg

前言

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

评论