前言
本次是该系列的的第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
代码分析
通过空行分出了四种交换两个数的方法:
- 通过栈进行交换
- 通过异或进行交换
- 通过加减进行交换
- 通过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