ref: 6d3e368f2d0796e366d2df8ed56e3b6fe0c42182
dir: /posix-386/start.c/
#include "u.h"
#include "libc.h"
void start(uintptr_t entry, Tos *_tos, int argc, char *argv[]) {
// entry point
register uintptr_t ebx asm("ebx") = entry;
register Tos *ecx asm("ecx") = _tos;
register int edx asm("edx") = argc;
register char **esi asm("esi") = argv;
__asm__ (
// Load values into registers
"mov ebx, %0\n\t"
"mov ecx, %1\n\t"
"mov edx, %2\n\t"
"mov esi, %3\n\t"
// push argv onto stack
"mov edi, edx\n\t"
"inc edi\n\t"
"shl edi, 2\n\t"
"sub esp, edi\n\t"
"mov edi, esp\n\t"
"rep movsb\n\t"
// push argc onto stack
"mov [esp], edx\n\t"
"sub esp, 4\n\t"
// jump to entry point
"jmp ebx\n\t"
"nop\n\t"
:
: "r" (ebx), "r" (ecx), "r" (edx), "r" (esi)
: "edi"
);
}