This commit was generated by cvs2svn to compensate for changes in r1815,
[bootcd.git] / syslinux / dos / crt0.S
diff --git a/syslinux/dos/crt0.S b/syslinux/dos/crt0.S
new file mode 100644 (file)
index 0000000..af8b8ba
--- /dev/null
@@ -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