|
32 | 32 | [_ |
33 | 33 | (λ (s) |
34 | 34 | (if (current-shared?) |
35 | | - (if (memq s (unbox external-labels)) |
36 | | - ; hack for ELF64 shared libraries in service of |
37 | | - ; calling external functions in asm-interp |
38 | | - (string-append (symbol->string s) " wrt ..plt") |
39 | | - (symbol->string s)) |
40 | | - (symbol->string s)))])) |
| 35 | + (if (memq s (unbox external-labels)) |
| 36 | + ; hack for ELF64 shared libraries in service of |
| 37 | + ; calling external functions in asm-interp |
| 38 | + (string-append (symbol->string s) " wrt ..plt") |
| 39 | + (symbol->string s)) |
| 40 | + (symbol->string s)))])) |
41 | 41 |
|
42 | 42 | ;; (U Label Reg) -> String |
43 | 43 | (define (jump-target->string t) |
|
70 | 70 |
|
71 | 71 | (define tab (make-string 8 #\space)) |
72 | 72 |
|
73 | | - |
74 | 73 | (define external-labels (box '())) |
75 | 74 |
|
76 | 75 | (define (external-label-shared? x) |
|
85 | 84 | ;; when 1) ELF, 2) building a shared object |
86 | 85 | [(Offset (? external-label-shared? l) i) |
87 | 86 | (string-append tab "mov " |
88 | | - (arg->string a1) ", " |
89 | | - "[" (label-symbol->string l) " + " (number->string i) " wrt ..gotpc]\n" |
90 | | - tab "mov " |
91 | | - (arg->string a1) ", " |
92 | | - "[" (arg->string a1) "]")] |
| 87 | + (arg->string a1) ", " |
| 88 | + "[" (label-symbol->string l) " + " (number->string i) " wrt ..gotpc]\n" |
| 89 | + tab "mov " |
| 90 | + (arg->string a1) ", " |
| 91 | + "[" (arg->string a1) "]")] |
93 | 92 | ;; the usual case |
94 | 93 | [_ |
95 | 94 | (string-append tab "mov " |
96 | | - (arg->string a1) ", " |
97 | | - (arg->string a2))])) |
| 95 | + (arg->string a1) ", " |
| 96 | + (arg->string a2))])) |
98 | 97 |
|
99 | 98 | ;; Instruction -> String |
100 | 99 | (define (instr->string i) |
|
105 | 104 | [(Label l) (string-append (label-symbol->string l) ":")] |
106 | 105 | [(Global x) (string-append tab "global " (label-symbol->string x))] |
107 | 106 | [(Extern l) (let ((r (string-append tab "extern " (label-symbol->string l)))) |
108 | | - (begin |
109 | | - (set-box! external-labels (cons l (unbox external-labels))) |
110 | | - r))] |
| 107 | + (begin |
| 108 | + (set-box! external-labels (cons l (unbox external-labels))) |
| 109 | + r))] |
111 | 110 | [(Mov a1 a2) |
112 | 111 | (mov->string a1 a2)] |
113 | 112 | [(Add a1 a2) |
114 | 113 | (string-append tab "add " |
115 | | - (arg->string a1) ", " |
116 | | - (arg->string a2))] |
| 114 | + (arg->string a1) ", " |
| 115 | + (arg->string a2))] |
117 | 116 | [(Sub a1 a2) |
118 | 117 | (string-append tab "sub " |
119 | | - (arg->string a1) ", " |
120 | | - (arg->string a2))] |
| 118 | + (arg->string a1) ", " |
| 119 | + (arg->string a2))] |
121 | 120 | [(Cmp a1 a2) |
122 | 121 | (string-append tab "cmp " |
123 | | - (arg->string a1) ", " |
124 | | - (arg->string a2))] |
| 122 | + (arg->string a1) ", " |
| 123 | + (arg->string a2))] |
125 | 124 | [(Sal a1 a2) |
126 | 125 | (string-append tab "sal " |
127 | | - (arg->string a1) ", " |
128 | | - (arg->string a2))] |
| 126 | + (arg->string a1) ", " |
| 127 | + (arg->string a2))] |
129 | 128 | [(Sar a1 a2) |
130 | 129 | (string-append tab "sar " |
131 | | - (arg->string a1) ", " |
132 | | - (arg->string a2))] |
| 130 | + (arg->string a1) ", " |
| 131 | + (arg->string a2))] |
133 | 132 | [(And a1 a2) |
134 | 133 | (string-append tab "and " |
135 | | - (arg->string a1) ", " |
136 | | - (arg->string a2))] |
| 134 | + (arg->string a1) ", " |
| 135 | + (arg->string a2))] |
137 | 136 | [(Or a1 a2) |
138 | 137 | (string-append tab "or " |
139 | | - (arg->string a1) ", " |
140 | | - (arg->string a2))] |
| 138 | + (arg->string a1) ", " |
| 139 | + (arg->string a2))] |
141 | 140 | [(Xor a1 a2) |
142 | 141 | (string-append tab "xor " |
143 | | - (arg->string a1) ", " |
144 | | - (arg->string a2))] |
| 142 | + (arg->string a1) ", " |
| 143 | + (arg->string a2))] |
145 | 144 | [(Jmp l) |
146 | 145 | (string-append tab "jmp " |
147 | | - (jump-target->string l))] |
| 146 | + (jump-target->string l))] |
148 | 147 | [(Je l) |
149 | 148 | (string-append tab "je " |
150 | | - (jump-target->string l))] |
| 149 | + (jump-target->string l))] |
151 | 150 | [(Jne l) |
152 | 151 | (string-append tab "jne " |
153 | | - (jump-target->string l))] |
| 152 | + (jump-target->string l))] |
154 | 153 | [(Jl l) |
155 | 154 | (string-append tab "jl " |
156 | | - (jump-target->string l))] |
| 155 | + (jump-target->string l))] |
157 | 156 | [(Jle l) |
158 | 157 | (string-append tab "jle " |
159 | | - (jump-target->string l))] |
| 158 | + (jump-target->string l))] |
160 | 159 | [(Jg l) |
161 | 160 | (string-append tab "jg " |
162 | | - (jump-target->string l))] |
| 161 | + (jump-target->string l))] |
163 | 162 | [(Jge l) |
164 | 163 | (string-append tab "jge " |
165 | | - (jump-target->string l))] |
| 164 | + (jump-target->string l))] |
166 | 165 | [(Call l) |
167 | 166 | (string-append tab "call " |
168 | | - (jump-target->string l))] |
| 167 | + (jump-target->string l))] |
169 | 168 | [(Push a) |
170 | 169 | (string-append tab "push " |
171 | | - (arg->string a))] |
| 170 | + (arg->string a))] |
172 | 171 | [(Pop r) |
173 | 172 | (string-append tab "pop " |
174 | | - (reg->string r))] |
| 173 | + (reg->string r))] |
175 | 174 | [(Lea d (? offset? x)) |
176 | 175 | (string-append tab "lea " |
177 | | - (arg->string d) ", " |
178 | | - (arg->string x))] |
| 176 | + (arg->string d) ", " |
| 177 | + (arg->string x))] |
179 | 178 | [(Lea d x) |
180 | 179 | (string-append tab "lea " |
181 | | - (arg->string d) ", [rel " |
182 | | - (exp->string x) "]")] |
| 180 | + (arg->string d) ", [rel " |
| 181 | + (exp->string x) "]")] |
183 | 182 | [(Div r) |
184 | 183 | (string-append tab "div " |
185 | | - (arg->string r))] |
| 184 | + (arg->string r))] |
186 | 185 | [(Equ x c) |
187 | 186 | (string-append tab |
188 | | - (symbol->string x) |
189 | | - " equ " |
190 | | - (number->string c))] |
| 187 | + (symbol->string x) |
| 188 | + " equ " |
| 189 | + (number->string c))] |
191 | 190 |
|
192 | 191 | [(Dd x) |
193 | 192 | (string-append tab "dd " (arg->string x))] |
|
208 | 207 | (match (findf Label? a) |
209 | 208 | [(Label g) |
210 | 209 | (string-append |
211 | | - tab "global " (label-symbol->string g) "\n" |
212 | | - tab "default rel\n" |
213 | | - tab "section .text\n" |
214 | | - (instrs->string a))] |
| 210 | + tab "global " (label-symbol->string g) "\n" |
| 211 | + tab "default rel\n" |
| 212 | + tab "section .text\n" |
| 213 | + (instrs->string a))] |
215 | 214 | [_ |
216 | | - (instrs->string a) |
217 | | - #; |
218 | | - (error "program does not have an initial label")]))) |
| 215 | + (instrs->string a)]))) |
219 | 216 |
|
220 | 217 | (define (asm-display a) |
221 | 218 | (begin |
|
0 commit comments