Be excrutiatingly correct with inline assembly syntax
[syslinux.git] / dos / crt0.S
blob62ab80ff7a42632eee9ed5957b0ea908dbc9f041
1         .code16
3 #ifndef REGPARM
4 # error "This file assumes -mregparm=3 -DREGPARM=3"
5 #endif
7         .section ".init","ax"
8         .globl _start
9         .type _start,@function
10 _start:
11         # Align the stack and make sure the high half is zero
12         andl $0xfff8,%esp
14         # Clear the .bss
15         cld
16         xorl %eax,%eax
17         movw $__bss_start,%di
18         movw $_end+3,%cx
19         subw %di,%cx
20         shrw $2,%cx
21         rep ; stosl
23         # Compute argc and argv (assumes REGPARM)
24         xorl %edx,%edx
25         movzbw 0x80,%bx
26         movb %dl,0x81(%bx)      # Zero-terminate string
27         movb $0x81,%dl
28         pushl %eax              # Make space for argv
29         movl %esp,%eax
30         calll __parse_argv
31         pushl %eax              # argc
33         # Initialize malloc
34         calll __init_memory_arena
36         # Now call main... (NOTE: gcc forces main to be regparm 0)
37         popl %eax               # argc
38         popl %edx               # argv
39         calll main
41         # Here %eax is the exit code, fall through into exit
43         .size _start,.-_start
45         .globl exit
46         .type exit,@function
47 exit:
48         # Exit code already in %eax
49         movb $0x4c,%ah          # Terminate program
50         int $0x21
51 1:      hlt
52         jmp 1b
53         .size exit,.-exit