https://github.com/akkartik/mu/blob/master/subx/069slice.subx
1
2
3
4 == code
5
6
7
8
9
10 e8/call run-tests/disp32
11
12 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32
13 b8/copy-to-EAX 1/imm32/exit
14 cd/syscall 0x80/imm8
15
16 slice-empty?:
17
18 55/push-EBP
19 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
20
21 51/push-ECX
22
23 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 .
24
25
26 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . .
27
28 39/compare 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 .
29 b8/copy-to-EAX 1/imm32/true
30 74/jump-if-equal $slice-empty?:end/disp8
31 b8/copy-to-EAX 0/imm32/false
32 $slice-empty?:end:
33
34 59/pop-to-ECX
35
36 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
37 5d/pop-to-EBP
38 c3/return
39
40 test-slice-empty-true:
41
42 55/push-EBP
43 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
44
45 68/push 34/imm32/end
46 68/push 34/imm32/start
47 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
48
49
50 51/push-ECX
51
52 e8/call slice-empty?/disp32
53
54 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
55
56
57 68/push "F - test-slice-empty-true"/imm32
58 68/push 1/imm32
59 50/push-EAX
60
61 e8/call check-ints-equal/disp32
62
63 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
64
65 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
66 5d/pop-to-EBP
67 c3/return
68
69 test-slice-empty-false:
70
71 55/push-EBP
72 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
73
74 68/push 23/imm32/end
75 68/push 34/imm32/start
76 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
77
78
79 51/push-ECX
80
81 e8/call slice-empty?/disp32
82
83 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
84
85
86 68/push "F - test-slice-empty-false"/imm32
87 68/push 0/imm32
88 50/push-EAX
89
90 e8/call check-ints-equal/disp32
91
92 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
93
94 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
95 5d/pop-to-EBP
96 c3/return
97
98 slice-equal?:
99
100 55/push-EBP
101 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
102
103 51/push-ECX
104 52/push-EDX
105 53/push-EBX
106 56/push-ESI
107
108 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . .
109 31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . .
110
111 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 .
112
113 8b/copy 0/mod/indirect 6/rm32/ESI . . . 2/r32/EDX . .
114
115 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 6/r32/ESI 4/disp8 .
116
117 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 0xc/disp8 .
118 $slice-equal?:loop:
119
120 8a/copy-byte 0/mod/indirect 3/rm32/EBX . . . 0/r32/AL . .
121
122 39/compare 3/mod/direct 2/rm32/EDX . . . 6/r32/ESI . .
123 7c/jump-if-lesser $slice-equal?:check2/disp8
124 3d/compare-with-EAX 0/imm32
125 74/jump-if-equal $slice-equal?:true/disp8
126 eb/jump $slice-equal?:false/disp8
127 $slice-equal?:check2:
128
129 3d/compare-with-EAX 0/imm32
130 74/jump-if-equal $slice-equal?:false/disp8
131
132 8a/copy-byte 0/mod/indirect 2/rm32/EDX . . . 1/r32/CL . .
133
134 39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . .
135 75/jump-if-not-equal $slice-equal?:false/disp8
136
137 43/increment-EBX
138
139 42/increment-EDX
140 eb/jump $slice-equal?:loop/disp8
141 $slice-equal?:false:
142 b8/copy-to-EAX 0/imm32
143 eb/jump $slice-equal?:end/disp8
144 $slice-equal?:true:
145 b8/copy-to-EAX 1/imm32
146 $slice-equal?:end:
147
148 5e/pop-to-ESI
149 5b/pop-to-EBX
150 5a/pop-to-EDX
151 59/pop-to-ECX
152
153 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
154 5d/pop-to-EBP
155 c3/return
156
157 test-slice-equal:
158
159
160 55/push-EBP
161 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
162
163 68/push _test-slice-data-3/imm32/end
164 68/push _test-slice-data-0/imm32/start
165 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
166
167
168 68/push _test-Abc-kernel-string/imm32
169 51/push-ECX
170
171 e8/call slice-equal?/disp32
172
173 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
174
175
176 68/push "F - test-slice-equal"/imm32
177 68/push 1/imm32
178 50/push-EAX
179
180 e8/call check-ints-equal/disp32
181
182 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
183
184 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
185 5d/pop-to-EBP
186 c3/return
187
188 test-slice-equal-false:
189
190
191 55/push-EBP
192 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
193
194 68/push _test-slice-data-4/imm32/end
195 68/push _test-slice-data-1/imm32/start
196 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
197
198
199 68/push _test-Abc-kernel-string/imm32
200 51/push-ECX
201
202 e8/call slice-equal?/disp32
203
204 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
205
206
207 68/push "F - test-slice-equal-false"/imm32
208 68/push 0/imm32
209 50/push-EAX
210
211 e8/call check-ints-equal/disp32
212
213 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
214
215 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
216 5d/pop-to-EBP
217 c3/return
218
219 test-slice-equal-too-long:
220
221
222 55/push-EBP
223 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
224
225 68/push _test-slice-data-4/imm32/end
226 68/push _test-slice-data-0/imm32/start
227 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
228
229
230 68/push _test-Abc-kernel-string/imm32
231 51/push-ECX
232
233 e8/call slice-equal?/disp32
234
235 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
236
237
238 68/push "F - test-slice-equal-too-long"/imm32
239 68/push 0/imm32
240 50/push-EAX
241
242 e8/call check-ints-equal/disp32
243
244 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
245
246 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
247 5d/pop-to-EBP
248 c3/return
249
250 test-slice-equal-too-short:
251
252
253 55/push-EBP
254 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
255
256 68/push _test-slice-data-1/imm32/end
257 68/push _test-slice-data-0/imm32/start
258 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
259
260
261 68/push _test-Abc-kernel-string/imm32
262 51/push-ECX
263
264 e8/call slice-equal?/disp32
265
266 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
267
268
269 68/push "F - test-slice-equal-too-short"/imm32
270 68/push 0/imm32
271 50/push-EAX
272
273 e8/call check-ints-equal/disp32
274
275 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
276
277 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
278 5d/pop-to-EBP
279 c3/return
280
281 test-slice-equal-empty:
282
283
284 55/push-EBP
285 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
286
287 68/push _test-slice-data-0/imm32/end
288 68/push _test-slice-data-0/imm32/start
289 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
290
291
292 68/push _test-Abc-kernel-string/imm32
293 51/push-ECX
294
295 e8/call slice-equal?/disp32
296
297 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
298
299
300 68/push "F - test-slice-equal-empty"/imm32
301 68/push 0/imm32
302 50/push-EAX
303
304 e8/call check-ints-equal/disp32
305
306 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
307
308 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
309 5d/pop-to-EBP
310 c3/return
311
312 test-slice-equal-with-empty:
313
314
315 55/push-EBP
316 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
317
318 68/push _test-slice-data-2/imm32/end
319 68/push _test-slice-data-0/imm32/start
320 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
321
322
323 68/push Null-kernel-string/imm32
324 51/push-ECX
325
326 e8/call slice-equal?/disp32
327
328 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
329
330
331 68/push "F - test-slice-equal-with-empty"/imm32
332 68/push 0/imm32
333 50/push-EAX
334
335 e8/call check-ints-equal/disp32
336
337 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
338
339 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
340 5d/pop-to-EBP
341 c3/return
342
343 test-slice-equal-empty-with-empty:
344
345
346 55/push-EBP
347 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
348
349 68/push _test-slice-data-0/imm32/end
350 68/push _test-slice-data-0/imm32/start
351 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
352
353
354 68/push Null-kernel-string/imm32
355 51/push-ECX
356
357 e8/call slice-equal?/disp32
358
359 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
360
361
362 68/push "F - test-slice-equal-empty-with-empty"/imm32
363 68/push 1/imm32
364 50/push-EAX
365
366 e8/call check-ints-equal/disp32
367
368 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
369
370 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
371 5d/pop-to-EBP
372 c3/return
373
374 == data
375
376 _test-slice-data-0:
377 41/A
378 _test-slice-data-1:
379 62/b
380 _test-slice-data-2:
381 63/c
382 _test-slice-data-3:
383 64/d
384 _test-slice-data-4:
385
386