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)
}

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

 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

上一篇:Linux的lvm管理:修改LV大小


下一篇:修改nw.js的exe文件使其请求管理员权限