1

当我从 golang src 读取源代码时,我无法理解 asm 代码,例如:

// void gogo(Gobuf*)
// restore state from Gobuf; longjmp
TEXT runtime·gogo(SB), NOSPLIT, $0-8
MOVQ 8(SP), BX // gobuf
MOVQ gobuf_g(BX), DX
MOVQ 0(DX), CX // make sure g != nil
get_tls(CX)
MOVQ DX, g(CX)
MOVQ gobuf_sp(BX), SP // 从 G.sched.sp 恢复 SP 寄存器
MOVQ gobuf_ret(BX), AX
MOVQ gobuf_ctxt(BX), DX
MOVQ $0, gobuf_sp(BX) // clear to help garbage collector
MOVQ $0, gobuf_ret(BX)
MOVQ $0, gobuf_ctxt(BX)
MOVQ gobuf_pc(BX), BX // 将 G.sched.pc,也就是 goroutine 函数地址压⼊入 BX。
JMP BX

我不知道为什么用(SB),NOSPLIT,$ 0-8等定义函数名称,以及这一行“MOVQ 8(SP),BX”是什么意思。

4

0 回答 0