go x,y=y,x交换原理

package main

import (
	"fmt"
)

func main() {
	x := 1
	y := 2

	x, y = y, x
	fmt.Printf("x:%d,y:%d\n", x, y)
}


 

 0x0026 00038 (.\Hello.go:8)     MOVQ    $1, "".x+48(SP)       //1赋值给x
 0x002f 00047 (.\Hello.go:9)     MOVQ    $2, "".y+40(SP)       //2赋值给y
 0x0038 00056 (.\Hello.go:11)    MOVQ    "".x+48(SP), CX       //x放到CX寄存器(数值1放到了CX)
 0x003d 00061 (.\Hello.go:11)    MOVQ    CX, ""..autotmp_3+56(SP)   //CX移动到SP(1放到tmp)
 0x0042 00066 (.\Hello.go:11)    MOVQ    "".y+40(SP), CX        //y放到CX寄存器(数值2放到CX)
 0x0047 00071 (.\Hello.go:11)    MOVQ    CX, "".x+48(SP)        //CX赋值给x(2赋值给x)
 0x004c 00076 (.\Hello.go:11)    MOVQ    ""..autotmp_3+56(SP), CX //tmp放到CX中(将1赋值给CX)
 0x0051 00081 (.\Hello.go:11)    MOVQ    CX, "".y+40(SP)        //CX赋值给y(1赋值给y)

 局部变量存在栈空间中,栈地址是从高地址向低地址生长;

因此参数x先入栈("".x+48(SP));之后参数y后入栈("".y+40(SP));

通过上面汇编代码的分析,可以看出:

x,y=y,x

就是下面的tmp交换原理

tmp = x

x = y

y = tmp

关于数据交换还有不需要第三变量写法:

package main

import (
	"fmt"
)

func main() {
	x := 1
	y := 2

	x = x^y
	y = x^y
	x = x^y
	fmt.Printf("x:%d,y:%d\n", x, y)
}

汇编如下: 

 0x0026 00038 (.\Hello.go:8)     MOVQ    $1, "".x+48(SP)
 0x002f 00047 (.\Hello.go:9)     MOVQ    $2, "".y+40(SP)
 0x0038 00056 (.\Hello.go:12)    MOVQ    "".x+48(SP), CX
 0x003d 00061 (.\Hello.go:12)    MOVQ    CX, DX
 0x0040 00064 (.\Hello.go:12)    XORQ    $2, CX
 0x0044 00068 (.\Hello.go:12)    MOVQ    CX, "".x+48(SP)
 0x0049 00073 (.\Hello.go:13)    MOVQ    "".y+40(SP), CX
 0x004e 00078 (.\Hello.go:13)    XORQ    CX, DX
 0x0051 00081 (.\Hello.go:13)    MOVQ    DX, CX
 0x0054 00084 (.\Hello.go:13)    XORQ    $2, DX
 0x0058 00088 (.\Hello.go:13)    MOVQ    DX, "".y+40(SP)
 0x005d 00093 (.\Hello.go:14)    MOVQ    "".x+48(SP), DX
 0x0062 00098 (.\Hello.go:14)    XORQ    DX, CX
 0x0065 00101 (.\Hello.go:14)    XORQ    $2, CX
 0x0069 00105 (.\Hello.go:14)    MOVQ    CX, "".x+48(SP)

 

 汇编指令:

几种基本汇编指令详解_远航 | FIBOS.io-CSDN博客_汇编subl

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值