go 汇编demo

package main

//go:noinline
func add(a, b int32) (int32, bool) {
    return a+b, true
}

func main() {
    add(10, 32)
}


自己动手汇编
GOOS=linux GOARCH=amd64 go tool compile -S mainf.go

"".add t=1 size=32 value=0 args=0x10 locals=0x0
	0x0000 00000 (mainf.go:4)	TEXT	"".add(SB), $0-16
	0x0000 00000 (mainf.go:5)	MOVL	"".a+8(FP), BX		// 8(FP) => 10
	0x0004 00004 (mainf.go:5)	MOVL	"".b+12(FP), BP 	// 12(FP) ==> 32
	0x0008 00008 (mainf.go:5)	ADDL	BP, BX 				
	0x000a 00010 (mainf.go:5)	MOVL	BX, "".~r2+16(FP) 	// 16(FP) = a + b
	0x000e 00014 (mainf.go:5)	MOVB	$1, "".~r3+20(FP)   // 20(FP) = 1
	0x0013 00019 (mainf.go:5)	RET


"".main t=1 size=64 value=0 args=0x0 locals=0x10
	0x0000 00000 (mainf.go:8)	TEXT	"".main(SB), $16-0	// 局部空间 16字节
	0x0000 00000 (mainf.go:8)	MOVQ	(TLS), CX 	// TLS 是一个由 runtime 维护的虚拟寄存器,保存了指向当前 g 的指针
													// 16(CX) 对应的是 g.stackguard0,是 runtime 维护的一个阈值
	0x0009 00009 (mainf.go:8)	CMPQ	SP, 16(CX)
	0x000d 00013 (mainf.go:8)	JLS	44
	0x000f 00015 (mainf.go:8)	SUBQ	$16, SP
	0x0013 00019 (mainf.go:9)	MOVL	$10, (SP)		// 0(SP) ==> 10
	0x001a 00026 (mainf.go:9)	MOVL	$32, 4(SP)		// 4(SP) ==> 32
	0x0022 00034 (mainf.go:9)	CALL	"".add(SB) 		// 
	0x0027 00039 (mainf.go:10)	ADDQ	$16, SP
	0x002b 00043 (mainf.go:10)	RET
	0x002c 00044 (mainf.go:8)	CALL	runtime.morestack_noctxt(SB)
	0x0031 00049 (mainf.go:8)	JMP	0
	
	// 调用者分配栈和回收栈


栈帧如下:
	
	main.main saved frame-pointer(BP)
	~r3 (bool) = true
	~r2 (int32) = 42
	b (int32) = 32
	a (int32) = 10
	return_addr_main.main+0x30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值