selph
selph
发布于 2022-01-17 / 360 阅读
0
0

《xchg rax,rax》片段分析0x10--两数交换

前言

本次是该系列的的第0x10篇,本篇介绍了两数交换的4种汇编实现的方法


实验环境:

  • Windows10 + VS2022 + masm

0x10

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

push     rax
push     rcx
pop      rax
pop      rcx

xor      rax,rcx
xor      rcx,rax
xor      rax,rcx

add      rax,rcx
sub      rcx,rax
add      rax,rcx
neg      rcx

xchg     rax,rcx

代码分析

通过空行分出了四种交换两个数的方法:

  1. 通过栈进行交换
  2. 通过异或进行交换
  3. 通过加减进行交换
  4. 通过xchg指令进行交换

没有不常见的指令,具体分析见如下测试代码注释

测试代码

.code
main proc
	lea rax, [011h]
	lea rcx, [022h]

	;通过栈的方式进行数据交换
	push     rax	
	push     rcx
	pop      rax	;把入栈的rcx出栈给rax
	pop      rcx	;把入栈的rax出栈给rcx

	;异或交换
	xor      rax,rcx	;rax = rax ^ rcx
	xor      rcx,rax	;rcx = rcx ^ rax = rcx ^ (rax ^ rcx) = rax, 这里把原来最初的rax rcx带入进行计算,进行推导,下同
	xor      rax,rcx	;rax = rax ^ rcx = (rax ^ rcx) ^ rax = rcx

	;通过加减交换
	add      rax,rcx	;rax = rax + rcx
	sub      rcx,rax	;rcx = rcx - rax = rcx - (rax + rcx) = -rax
	add      rax,rcx	;rax = rax + rcx = rax + rcx - rax = rcx
	neg      rcx		;rcx = ~(-rax)

	;通过交换指令进行
	xchg     rax,rcx

	ret
main ENDP
END

评论