chai2010 / advanced-go-programming-book

:books: 《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题(完稿)
https://chai2010.cn/advanced-go-programming-book/
BSD 2-Clause "Simplified" License
19.41k stars 3.21k forks source link

3.6.1 函数调用参数布局图,pseudo SP的值有问题? #615

Open galaxyzen opened 1 year ago

galaxyzen commented 1 year ago

pseudo SP 的值应该是parent return address处,不应该和BP的值相同?

galaxyzen commented 1 year ago
package main

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

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

版本:go1.16.15 amd64

go1.16.15 tool compile -S -N -l main.go 后,add的Go汇编:

"".add STEXT nosplit size=31 args=0x10 locals=0x0 funcid=0x0
        0x0000 00000 (main.go:4)        TEXT    "".add(SB), NOSPLIT|ABIInternal, $0-16
        0x0000 00000 (main.go:4)        FUNCDATA        $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0000 00000 (main.go:4)        FUNCDATA        $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0000 00000 (main.go:4)        MOVL    $0, "".~r2+16(SP)
        0x0008 00008 (main.go:4)        MOVB    $0, "".~r3+20(SP)
        0x000d 00013 (main.go:4)        MOVL    "".a+8(SP), AX
        0x0011 00017 (main.go:4)        ADDL    "".b+12(SP), AX
        0x0015 00021 (main.go:4)        MOVL    AX, "".~r2+16(SP)
        0x0019 00025 (main.go:4)        MOVB    $1, "".~r3+20(SP)
        0x001e 00030 (main.go:4)        RET

[pseudo SP + 8]定位到实参a[pseudo SP + 12]定位到实参b,所以pseudo SP的值应该是parent return address的起始位置?