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!