mescc: Beginning of expression and test template.
[mes.git] / doc / examples / main.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 #if __GNUC__
22 void
23 write (int fd, char const* s, int n)
24 {
25   int r;
26   //syscall (SYS_write, fd, s, n));
27   asm (
28        "mov %0, %%ebx\n\t"
29        "mov %1, %%ecx\n\t"
30        "mov %2, %%edx\n\t"
31
32        "mov $0x4, %%eax\n\t"
33        "int $0x80\n\t"
34        : // no outputs "=" (r)
35        : "" (fd), "" (s), "" (n)
36        : "eax", "ebx", "ecx", "edx"
37        );
38 }
39
40 void
41 exit (int code)
42 {
43   asm (
44        "movl %0, %%ebx\n\t"
45        "movl $1,  %%eax\n\t"
46        "int  $0x80"
47        : // no outputs "=" (r)
48        : "" (code)
49        );
50   // not reached
51   exit (0);
52 }
53
54 #define STDOUT 1
55
56 typedef long size_t;
57 size_t
58 strlen (char const* s)
59 {
60   int i = 0;
61   while (s[i]) i++;
62   return i;
63 }
64
65 int
66 puts (char const* s)
67 {
68   //write (STDOUT, s, strlen (s));
69   //int i = write (STDOUT, s, strlen (s));
70   int i = strlen (s);
71   write (1, s, i);
72   return 0;
73 }
74
75 int
76 strcmp (char const* a, char const* b)
77 {
78   while (*a && *b && *a == *b) {a++;b++;}
79   return *a - *b;
80 }
81 #endif
82
83 int
84 //main ()
85 main (int argc, char *argv[])
86 {
87   int i = 0;
88   if (argc > 1 && !strcmp (argv[1], "--help")) puts ("argc > 1 && --help\n");
89   puts ("Hi Mes!\n");
90   return 42;
91 }
92
93 #if __GNUC__
94 void
95 _start ()
96 {
97   // int r=main ();
98   // exit (r);
99   int r;
100   asm (
101        "mov %%ebp,%%eax\n\t"
102        "addl $8,%%eax\n\t"
103        "push %%eax\n\t"
104
105        "mov %%ebp,%%eax\n\t"
106        "addl $4,%%eax\n\t"
107        "movzbl (%%eax),%%eax\n\t"
108        "push %%eax\n\t"
109
110        "call main\n\t"
111        "movl %%eax,%0\n\t"
112        : "=r" (r)
113        : //no inputs "" (&main)
114        );
115   exit (r);
116 }
117 #endif