2f2ccac538761169d563bfd34396abf903b6105e
[mes.git] / module / mes / libc-i386.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; libc-i386.mes defines C library routines
24
25 ;;; Code:
26
27 (define i386:exit
28   '(lambda (f g ta t d)
29      (list
30       #x5b                                ; pop    %ebx
31       #x5b                                ; pop    %ebx
32       #xb8 #x01 #x00 #x00 #x00            ; mov    $0x1,%eax
33       #xcd #x80                           ; int    $0x80
34       )))
35
36 (define i386:read
37   '(lambda (f g ta t d)
38      (list
39       #x55                                ; push   %ebp
40       #x89 #xe5                           ; mov    %esp,%ebp
41
42       #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
43       #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
44       #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
45
46       #xb8 #x03 #x00 #x00 #x00            ; mov    $0x3,%eax
47       #xcd #x80                           ; int    $0x80
48
49       #xc9                                ; leave
50       #xc3                                ; ret
51       )))
52
53 (define i386:write
54   '(lambda (f g ta t d)
55    (list
56      #x55                                ; push   %ebp
57      #x89 #xe5                           ; mov    %esp,%ebp
58
59      #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
60      #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
61      #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
62
63      #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
64      #xcd #x80                           ; int    $0x80
65
66      #xc9                                ; leave
67      #xc3                                ; ret
68      )))
69
70 (define i386:open
71   '(lambda (f g ta t d)
72      (list
73       #x55                                ; push   %ebp
74       #x89 #xe5                           ; mov    %esp,%ebp
75
76       #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
77       #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
78       #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
79
80       #xb8 #x05 #x00 #x00 #x00            ; mov    $0x5,%eax
81       #xcd #x80                           ; int    $0x80
82
83       #xc9                                ; leave
84       #xc3                                ; ret
85       )))
86
87 (define i386:access
88   '(lambda (f g ta t d)
89     (list
90       #x55                                ; push   %ebp
91       #x89 #xe5                           ; mov    %esp,%ebp
92
93       #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
94       #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
95
96       #xb8 #x21 #x00 #x00 #x00            ; mov    $0x21,%eax
97       #xcd #x80                           ; int    $0x80
98
99       #xc9                                ; leave
100       #xc3                                ; ret
101       )))
102
103 (define i386:brk
104   '(lambda (f g ta t d)
105      (list
106       #x55                                ; push   %ebp
107       #x89 #xe5                           ; mov    %esp,%ebp
108
109       #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
110       #xb8 #x2d #x00 #x00 #x00            ; mov    $0x2d,%eax
111       #xcd #x80                           ; int    $0x80
112
113       #xc9                                ; leave
114       #xc3                                ; ret
115       )))
116
117 (define i386:fsync
118   '(lambda (f g ta t d)
119      (list
120       #x55                                ; push   %ebp
121       #x89 #xe5                           ; mov    %esp,%ebp
122
123       #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
124       #xb8 #x76 #x00 #x00 #x00            ; mov    $0x76,%eax
125       #xcd #x80                           ; int    $0x80
126
127       #xc9                                ; leave
128       #xc3                                ; ret
129       )))
130
131 (define (i386:_start)
132   (string-append ".byte"
133                 " 0x89 0xe8"      ; mov    %ebp,%eax
134                 " 0x83 0xc0 0x08" ; add    $0x8,%eax
135                 " 0x50"           ; push   %eax
136
137                 " 0x89 0xe8"      ; mov    %ebp,%eax
138                 " 0x83 0xc0 0x04" ; add    $0x4,%eax
139                 " 0x0f 0xb6 0x00" ; movzbl (%eax),%eax
140                 " 0x50"           ; push   %eax
141
142                 " 0x89 0xe8"            ; mov    %ebp,%eax
143                 " 0x83 0xc0 0x04"       ; add    $0x4,%eax
144                 " 0x0f 0xb6 0x00"       ; movzbl (%eax),%eax
145                 " 0x83 0xc0 0x03"       ; add    $0x3,%eax
146                 " 0xc1 0xe0 0x02"       ; shl    $0x2,%eax
147                 " 0x01 0xe8"            ; add    %ebp,%eax
148                 " 0x50"                 ; push   %eax
149                 ))
150
151 (define (i386:va-arg)
152   (string-append ".byte"
153                  " 0x8b 0x45 0xfc" ; mov    -<0x4>(%ebp),%eax :va_arg
154                  " 0xc1 0xe0 0x2"  ; shl    $0x2,%eax
155                  " 0x01 0xe8"      ; add    %ebp,%eax
156                  " 0x83 0xc0 0xc"  ; add    $0xc,%eax
157                  " 0x8b 0x00"      ; mov    (%eax),%eax
158                  " 0x89 0x45 0xf8" ; mov    %eax,-0x8(%ebp) :va
159                  " 0x50"           ; push   %eax
160                 ))
161
162 (define i386:libc
163   (list
164    (cons "exit" (list i386:exit))
165    (cons "read" (list i386:read))
166    (cons "write" (list i386:write))
167    (cons "open" (list i386:open))
168    (cons "access" (list i386:access))
169    (cons "brk" (list i386:brk))
170    (cons "fsync" (list i386:fsync))))