mescc: Nicer functions/parameters.
[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 (push-arg o)
28   `(#x68 ,@(int->bv32 o)))              ; push o
29
30 (define (i386:ret . rest)
31   `(
32     ,@(if (null? rest) '()
33           `(#xb8                        ; mov    $00,%eax
34             ,@(int->bv32 (car rest))))
35     #xc9                                        ; leave
36     #xc3                               ; ret
37     ))
38
39 ;; #x83 #xec #x10                      ; sub    $0x10,%esp
40
41 ;; #x8b #x45 #x04                      ; mov    0x4(%ebp),%eax
42
43 ;; #x8b #x5d #x04                      ; mov    0x4(%ebp),%ebx
44 ;; #x8b #x45 #x08                      ; mov    0x8(%ebp),%eax
45
46 ;; #x8b #x4d #x04                      ; mov    0xc(%ebp),%ecx
47 ;; #x8b #x5d #x08                      ; mov    0x4(%ebp),%ebx
48 ;; #x8b #x45 #x0c                      ; mov    0x8(%ebp),%eax
49
50 ;; #x8b #x55 #xfc                      ; mov    0x4(%ebp),%edx
51
52
53
54 ;; #x8b #x5d #x08                      ; mov    $0x8(%ebp),%ebx
55
56 ;; #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
57 ;; #x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
58
59 ;; #x8b #x55 #x08                      ; mov    $0x8(%ebp),%edx
60 ;; #x8b #x4d #x0c                      ; mov    $0xc(%ebp),%ecx
61 ;; #x8b #x5d #x10                      ; mov    $0x10(%ebp),%ebx
62
63
64 (define (i386:call address . arguments)
65   (let* ((pushes (append-map push-arg arguments))
66          (s (length pushes))
67          (n (length arguments)))
68    `(
69      ,@pushes                           ; push args
70      #xe8 ,@(int->bv32 (- address 5 s)) ; call relative
71      #x83 #xc4 ,(* n 4)                 ; add    $00,%esp
72      )))
73   
74 (define (i386:eputs s t d)
75   `(
76     #x55                                ; push   %ebp
77     #x89 #xe5                           ; mov    %esp,%ebp
78
79     ;;;#x59                                ; pop    %ecx
80
81     #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
82     ;;#x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
83
84     #xba #x01 #x00 #x00 #x00            ; mov    $0x1,%edx
85
86
87     #xbb #x02 #x00 #x00 #x00            ; mov    $0x1,%ebx
88     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
89     #xcd #x80                           ; int    $0x80
90
91     #xc9                                ; leave
92     #xc3                                ; ret
93     ))
94
95 (define (i386:exit s t d)
96   `(
97     #x5b                                ; pop    %ebx
98     #x5b                                ; pop    %ebx
99     ;; FIXME: hack to get return value 41
100     ;; without local variable support in _start
101     #x89 #xc3                           ; mov    %eax,%ebx
102     #xb8 #x01 #x00 #x00 #x00            ; mov    $0x1,%eax
103     #xcd #x80                           ; int    $0x80
104     ))
105
106 (define (i386:puts s t d)
107   `(
108     #x55                                ; push   %ebp
109     #x89 #xe5                           ; mov    %esp,%ebp
110
111     #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
112     ;; #x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
113
114     #xba #x0a #x00 #x00 #x00            ; mov    $0xa,%edx
115     ;; #x59                                ; pop    %ecx
116
117     #xbb #x01 #x00 #x00 #x00            ; mov    $0x1,%ebx
118     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
119     #xcd #x80                           ; int    $0x80
120     #xc9                                ; leave
121     #xc3                                ; ret
122     ))