Who prepares argc and argv?

Hi dear friends!

I am very interested in the starting up process of a go program. I just copied the code of the startup function of any go program for the 386 family processor and Windows operating system, _rt0_386:

// _rt0_386 is common startup code for most 386 systems when using
// internal linking. This is the entry point for the program from the
// kernel for an ordinary -buildmode=exe program. The stack holds the
// number of arguments and the C-style argv.
TEXT _rt0_386(SB),NOSPLIT,$8
	MOVL	8(SP), AX	// argc
	LEAL	12(SP), BX	// argv
	MOVL	AX, 0(SP)
	MOVL	BX, 4(SP)
	JMP	runtime·rt0_go(SB)

But I just can’t understand why 8(SP) now contains a valid argc. In C, I know how argc and argv are prepared. It is the mainCRTStartup function that prepares argc and argv, and then calls main(argc, argv). But for go, now since _rt0_386 is the entry function, meaning that no other function calls _rt0_386 and therefore argc and argv are not yet prepared at this time.

Can anyone resolve my puzzle? Thank you!