Viewing: crt0.S
📄 crt0.S (Read Only) ⬅ To go back
/*
 * ulibc crt0 — C runtime startup for AdrOS userspace
 * Entry point: _start → main(argc, argv, envp) → exit()
 *
 * Stack layout at entry (set up by execve or ld.so):
 *   [ESP+0]  argc
 *   [ESP+4]  argv[0], argv[1], ..., NULL
 *   [...]    envp[0], envp[1], ..., NULL
 *   [...]    auxv entries (if ld.so present)
 */
.section .text
.global _start
.extern main
.extern exit
.extern __environ

_start:
    /* Set up user data segments */
    mov $0x23, %ax
    mov %ax, %ds
    mov %ax, %es
    mov %ax, %fs
    mov %ax, %gs

    /* Parse stack: argc at (%esp), argv at 4(%esp) */
    mov (%esp), %eax        /* argc */
    lea 4(%esp), %ecx       /* argv = &argv[0] */

    /* envp = argv + (argc + 1) * 4  (skip past argv[] and its NULL) */
    mov %eax, %edx
    add $1, %edx
    shl $2, %edx
    add %ecx, %edx          /* edx = envp */

    /* Store envp in __environ global (weak, may not exist) */
    mov %edx, __environ

    /* Call main(argc, argv, envp) */
    push %edx               /* envp */
    push %ecx               /* argv */
    push %eax               /* argc */
    call main
    add $12, %esp

    /* exit(main return value) */
    push %eax
    call exit

    /* Should never reach here */
1:  jmp 1b

.section .note.GNU-stack,"",@progbits