mescc: Refactor mlibc compilation.
[mes.git] / libc / mini-libc-mes.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 void
22 exit ()
23 {
24   asm (".byte 0x8b 0x5d 0x08");                    // mov    0x8(%ebp),%ebx
25   asm (".byte 0xb8 0x01 0x00 0x00 0x00");          // mov    $0x1,%eax
26   asm (".byte 0xcd 0x80");                         // int    $0x80
27 }
28
29 void
30 write ()
31 {
32   asm (".byte 0x8b 0x5d 0x08");                   // mov    0x8(%ebp),%ebx
33   asm (".byte 0x8b 0x4d 0x0c");                   // mov    0xc(%ebp),%ecx
34   asm (".byte 0x8b 0x55 0x10");                   // mov    0x10(%ebp),%edx
35
36   asm (".byte 0xb8 0x04 0x00 0x00 0x00");         // mov    $0x4,%eax
37   asm (".byte 0xcd 0x80");                        // int    $0x80
38 }
39
40 int
41 strlen (char const* s)
42 {
43   int i = 0;
44   while (s[i]) i++;
45   return i;
46 }
47
48 int
49 eputs (char const* s)
50 {
51   int i = strlen (s);
52   write (2, s, i);
53   return 0;
54 }
55
56 char **g_environment;
57 char **
58 _env (char **e)
59 {
60   return e;
61 }
62
63 int
64 _start ()
65 {
66   asm (".byte 0x89 0xe8");      // mov    %ebp,%eax
67   asm (".byte 0x83 0xc0 0x08"); // add    $0x8,%eax
68   asm (".byte 0x50");           // push   %eax
69
70   asm (".byte 0x89 0xe8");      // mov    %ebp,%eax
71   asm (".byte 0x83 0xc0 0x04"); // add    $0x4,%eax
72   asm (".byte 0x0f 0xb6 0x00"); // movzbl (%eax),%eax
73   asm (".byte 0x50");           // push   %eax
74
75   asm (".byte 0x89 0xe8");      // mov    %ebp,%eax
76   asm (".byte 0x83 0xc0 0x04"); // add    $0x4,%eax
77   asm (".byte 0x0f 0xb6 0x00"); // movzbl (%eax),%eax
78   asm (".byte 0x83 0xc0 0x03"); // add    $0x3,%eax
79   asm (".byte 0xc1 0xe0 0x02"); // shl    $0x2,%eax
80   asm (".byte 0x01 0xe8");      // add    %ebp,%eax
81   asm (".byte 0x50");           // push   %eax
82
83   g_environment = _env ();
84   asm (".byte 0x58");
85   int r = main ();
86   exit (r);
87 }