diff options
Diffstat (limited to 'contrib/syslinux-4.02/dos/crt0.S')
-rw-r--r-- | contrib/syslinux-4.02/dos/crt0.S | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/dos/crt0.S b/contrib/syslinux-4.02/dos/crt0.S new file mode 100644 index 0000000..3be5712 --- /dev/null +++ b/contrib/syslinux-4.02/dos/crt0.S @@ -0,0 +1,70 @@ + .code16 + +#ifndef REGPARM +# error "This file assumes -mregparm=3 -DREGPARM=3" +#endif + + .section ".text","ax" + .globl _start + .type _start,@function +_start: + # Align the stack and make sure the high half is zero + andl $0xfff8,%esp + + # DS, ES points to the PSP at this point + pushw %es # Save PSP pointer + movw %cs,%ax + movw %ax,%ds + movw %ax,%es + + # Clear the .bss + cld + xorl %eax,%eax + movw $__bss_start,%di + movw $__bss_end+3,%cx + subw %di,%cx + shrw $2,%cx + rep ; stosl + + # Copy the command line into our own segment + popw %fs # FS -> PSP + movw $_cmdline,%di + movzbw %fs:0x80,%cx + movw $0x81,%si + fs ; rep ; movsb + # Already zero-terminated since we're writing into clean bss + + # Compute argc and argv (assumes REGPARM) + movl $_cmdline,%edx + 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 + + .section ".bss","aw" + .balign 4 +_cmdline: + .space 128 + .size _cmdline,.-_cmdline |