diff options
Diffstat (limited to 'contrib/syslinux-4.02/memdump/crt0.S')
-rw-r--r-- | contrib/syslinux-4.02/memdump/crt0.S | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/memdump/crt0.S b/contrib/syslinux-4.02/memdump/crt0.S new file mode 100644 index 0000000..92297ec --- /dev/null +++ b/contrib/syslinux-4.02/memdump/crt0.S @@ -0,0 +1,53 @@ + .code16 + +#ifndef REGPARM +# error "This file assumes -mregparm=3 -DREGPARM=3" +#endif + + .section ".init","ax" + .globl _start + .type _start,@function +_start: + # Align the stack and make sure the high half is zero + andl $0xfff8,%esp + + # Clear the .bss + cld + xorl %eax,%eax + movw $__bss_start,%di + movw $_end+3,%cx + subw %di,%cx + shrw $2,%cx + rep ; stosl + + # Compute argc and argv (assumes REGPARM) + xorl %edx,%edx + movzbw 0x80,%bx + movb %dl,0x81(%bx) # Zero-terminate string + movb $0x81,%dl + pushl %eax # Make space for argv + movl %esp,%eax + calll __parse_argv + pushl %eax # argc + + # Initialize malloc + # calll __init_memory_arena + + # Now call main... (NOTE: gcc forces main to be regparm 0) + popl %eax # argc + popl %edx # argv + calll main + + # Here %eax is the exit code, fall through into exit + + .size _start,.-_start + + .globl exit + .type exit,@function +exit: + # Exit code already in %eax + movb $0x4c,%ah # Terminate program + int $0x21 +1: hlt + jmp 1b + .size exit,.-exit |