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