06e691edb744a7b2edaf4a91ae76d04a6ec47c32
[mes.git] / module / mes / libc-i386.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; libc-i386.mes: 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:puts data length)
28   `(
29      #xba ,@(int->bv32 length)      ;; mov    $0xe,%edx
30           #xb9 ,@(int->bv32 data)        ;; mov    $data,%ecx
31           #xbb #x01 #x00 #x00 #x00       ;; mov    $0x1,%ebx
32           #xb8 #x04 #x00 #x00 #x00       ;; mov    $0x4,%eax
33           #xcd #x80                      ;; int    $0x80
34           ))
35
36 (define (i386:exit code)
37   `(
38     #xbb ,@(int->bv32 code)        ;; mov    $code,%ebx
39          #xb8 #x01 #x00 #x00 #x00       ;; mov    $0x1,%eax
40          #xcd #x80                      ;; int    $0x80
41          ))
42
43 (define (i386:for start test step statement)
44 `(
45
46   ;;   b:
47   #x89 #xe5                     ;; mov    %esp,%ebp
48        ;;21:
49        #xc7 #x45 #xf4 ,@(int->bv32 start) ;;    movl   $start,-0xc(%ebp)
50        ;;28:
51        #xeb ,(+ (length statement) 9) ;;x14     jmp    3e <main+0x3e>
52        ;;2a:
53        ;;#x83 #xec #x0c             ;;  sub    $0xc,%esp
54        
55        ;;   9:
56        #x55   ;;                        push   %ebp
57        
58        ,@statement
59        #x5d   ;;                        pop   %ebp
60        ;;2d:
61  ;;;;;;#x68 #x09 #x00 #x00 #x00       ;;        push   $0x9
62        ;;32:
63  ;;;;;;#xe8 #xfc #xff #xff #xff       ;;        call   33 <main+0x33>
64        ;;37:
65  ;;;;;;#x83 #xc4 #x10             ;;    add    $0x10,%esp
66        ;;3a:
67        ;;;;#x83 #x45 #xf4 ,step          ;;     addl   $step,-0xc(%ebp)
68        ;;3e:
69        ;;;;#x83 #x7d #xf4 ,test          ;;     cmpl   $test,-0xc(%ebp)
70        #x81 #x45 #xf4 ,@(int->bv32 step)        ;;addl   $step,-0xc(%ebp)
71        #x81 #x7d #xf4 ,@(int->bv32 test) ;;cmpl   $0x7cff,-0xc(%ebp)
72        ;;42:
73        ;;;#x7e ,(- 0 (length statement) 18) ;;#xe6 ;;   jle    2a <main+0x2a>
74        #x75 ,(- 0 (length statement) 18) ;;#xe6 ;;      jne    2a <main+0x2a>
75 ))