+-----------+---\ | 返回值2 | \ +-----------+ \ | 返回值1 | \ +---------+-+ | 参数2 | 这些在调用函数中 +-----------+ | 参数1 | / +-----------+ / | 返回地址 | / +-----------+--\/-----fp值 | 局部变量 | \ | ... | 被调用数栈祯 | | / +-----------+--/+---sp值
package main
import "fmt"
func test(i, j int) (int, int) {
a:=i+ j
b:=i- j
return a,b
}
func main() {
a,b:= test(2,1)
fmt.Println(a, b)
}
"".test t=1size=32value=0args=0x20locals=0x0 0x000000000(test.go:5) TEXT"".test(SB),$0-32//栈大小为32字节 0x000000000(test.go:5)NOP 0x000000000(test.go:5)NOP 0x000000000(test.go:5)MOVQ"".i+8(FP),CX//取第一个参数i 0x000500005(test.go:5)MOVQ"".j+16(FP),AX//取第二个参数j 0x000a00010(test.go:5) FUNCDATA$0, gclocals·a8eabfc4a4514ed6b3b0c61e9680e440(SB) 0x000a00010(test.go:5) FUNCDATA$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x000a00010(test.go:6)MOVQCX,BX//将i放入bx 0x000d00013(test.go:6) ADDQAX,CX//i+j放入cx 0x001000016(test.go:7) SUBQAX,BX//i-j放入bx //将返回结果存入调用函数栈帧 0x001300019(test.go:8)MOVQCX,"".~r2+24(FP) //将返回结果存入调用函数栈帧 0x001800024(test.go:8)MOVQBX,"".~r3+32(FP) 0x001d00029(test.go:8)RET
packagemain
import"fmt"
functest(aint)func(iint)int{
returnfunc(iint)int{
a = a + i
returna
}
}
funcmain(){
f := test(1)
a := f(2)
fmt.Println(a)
b := f(3)
fmt.Println(b)
}
"".test t=1size=160value=0args=0x10locals=0x20
0x000000000(test.go:5) TEXT"".test(SB),$32-16
0x000000000(test.go:5)MOVQ(TLS),CX
0x000900009(test.go:5) CMPQSP,16(CX)
0x000d00013(test.go:5) JLS142
0x000f00015(test.go:5) SUBQ$32,SP
0x001300019(test.go:5) FUNCDATA$0, gclocals·8edb5632446ada37b0a930d010725cc5(SB)
0x001300019(test.go:5) FUNCDATA$1, gclocals·008e235a1392cc90d1ed9ad2f7e76d87(SB)
0x001300019(test.go:5) LEAQ type.int(SB),BX
0x001a00026(test.go:5)MOVQBX, (SP)
0x001e00030(test.go:5) PCDATA$0,$0
//生成一个int型对象,即a
0x001e00030(test.go:5)CALLruntime.newobject(SB)
//8(sp)即生成的a的地址,放入AX
0x002300035(test.go:5)MOVQ8(SP),AX
//将a的地址存入sp+24的位置
0x002800040(test.go:5)MOVQAX,"".&a+24(SP)
//取出main函数传入的第一个参数,即a
0x002d00045(test.go:5)MOVQ"".a+40(FP),BP
//将a放入(AX)指向的内存,即上述新生成的int型对象
0x003200050(test.go:5)MOVQBP, (AX)
0x003500053(test.go:6) LEAQ type.struct { F uintptr; a *int }(SB), BX
0x003c00060(test.go:6)MOVQBX, (SP)
0x004000064(test.go:6) PCDATA$0,$1
0x004000064(test.go:6)CALLruntime.newobject(SB)
//8(sp)这就是上述生成的struct对象地址
0x004500069(test.go:6)MOVQ8(SP),AX
0x004a00074(test.go:6)NOP
//test内部匿名函数地址存入BP
0x004a00074(test.go:6) LEAQ"".test.func1(SB),BP
//将匿名函数地址放入(AX)指向的地址,即给上述
//F uintptr赋值
0x005100081(test.go:6)MOVQBP, (AX)
0x005400084(test.go:6)MOVQAX,"".autotmp_0001+16(SP)
0x005900089(test.go:6)NOP
//将上述生成的整型对象a的地址存入BP
0x005900089(test.go:6)MOVQ"".&a+24(SP),BP
0x005e00094(test.go:6) CMPB runtime.writeBarrier(SB),$0
0x006500101(test.go:6)JNE$0,117
//将a地址存入AX指向内存+8,
//即为上述结构体a *int赋值
0x006700103(test.go:6)MOVQBP,8(AX)
//将上述结构体的地址存入main函数栈帧中;
0x006b00107(test.go:9)MOVQAX,"".~r1+48(FP)
0x007000112(test.go:9) ADDQ$32,SP
0x007400116(test.go:9)RET
type.struct{
F uintptr//这个就是闭包调用的函数指针
a *int//这就是闭包的上下文数据
}
"".main t=1size=528value=0args=0x0locals=0x88 0x000000000(test.go:12) TEXT"".main(SB),$136-0 0x000000000(test.go:12)MOVQ(TLS),CX 0x000900009(test.go:12) LEAQ -8(SP),AX 0x000e00014(test.go:12) CMPQAX,16(CX) 0x001200018(test.go:12) JLS506 0x001800024(test.go:12) SUBQ$136,SP 0x001f00031(test.go:12) FUNCDATA$0, gclocals·f5be5308b59e045b7c5b33ee8908cfb7(SB) 0x001f00031(test.go:12) FUNCDATA$1, gclocals·9d868b227cedd8dd4b1bec8682560fff(SB) //将参数1(f:=test(1))放入main函数栈顶 0x001f00031(test.go:13)MOVQ$1, (SP) 0x002700039(test.go:13) PCDATA$0,$0 //调用main函数生成闭包对象 0x002700039(test.go:13)CALL"".test(SB) //将闭包对象的地址放入DX 0x002c00044(test.go:13)MOVQ8(SP),DX //将参数2(a:=f(2))放入栈顶 0x003100049(test.go:14)MOVQ$2, (SP) 0x003900057(test.go:14)MOVQDX,"".f+56(SP) //将闭包对象的函数指针赋值给BX 0x003e00062(test.go:14)MOVQ(DX),BX 0x004100065(test.go:14) PCDATA$0,$1 //这里调用闭包函数,并且将闭包对象的地址也传进 //闭包函数,为了修改a嘛 0x004100065(test.go:14)CALLDX,BX 0x004300067(test.go:14)MOVQ8(SP),BX
"".test.func1t=1size=32value=0args=0x10 locals=0x0 0x000000000(test.go:6) TEXT"".test.func1(SB), $0-16 0x000000000(test.go:6) NOP 0x000000000(test.go:6) NOP 0x000000000(test.go:6) FUNCDATA $0, gclocals·23e8278e2b69a3a75fa59b23c49ed6ad(SB) 0x000000000(test.go:6) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) //DX是闭包对象的地址,+8即a的地址 0x000000000(test.go:6) MOVQ8(DX), AX //AX为a的地址,(AX)即为a的值 0x000400004(test.go:7) MOVQ (AX), BP //将参数i存入R8 0x000700007(test.go:7) MOVQ"".i+8(FP), R8 //a+i的值存入BP 0x000c00012(test.go:7) ADDQ R8, BP //将a+i存入a的地址 0x000f00015(test.go:7) MOVQ BP, (AX) //将a地址最新数据存入BP 0x001200018(test.go:8) MOVQ (AX), BP //将a最新值作为返回值放入main函数栈中 0x001500021(test.go:8) MOVQ BP,"".~r1+16(FP) 0x001a00026(test.go:8) RET
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有