https://github.com/akkartik/mu/blob/master/apps/subx-common.subx
1
2
3
4 == data
5
6
7 Heap-size:
8 0x200000/imm32/2MB
9
10
11 Segment-size:
12 0x80000/imm32/512KB
13
14
15 Input-size:
16 0x100000/imm32/1MB
17
18
19 Max-labels:
20 0x10000/imm32/4K-labels/64KB
21
22 == code
23
24
25
26
27
28
29 next-word:
30
31 55/push-EBP
32 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
33
34 50/push-EAX
35 51/push-ECX
36 56/push-ESI
37 57/push-EDI
38
39 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 .
40
41 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 .
42
43
44 68/push 0x20/imm32/space
45 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
46
47 e8/call skip-chars-matching/disp32
48
49 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
50 $next-word:check0:
51
52
53 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 .
54
55 3b/compare 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
56 7c/jump-if-lesser $next-word:check-for-comment/disp8
57
58 c7 0/subop/copy 0/mod/direct 7/rm32/EDI . . . . . 0/imm32
59 c7 0/subop/copy 1/mod/*+disp8 7/rm32/EDI . . . . 4/disp8 0/imm32
60 eb/jump $next-word:end/disp8
61 $next-word:check-for-comment:
62
63 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 .
64 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/EAX 0xc/disp8 .
65 89/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . .
66
67
68 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . .
69 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/AL 0xc/disp8 .
70
71 3d/compare-EAX-and 0x23/imm32/pound
72 75/jump-if-not-equal $next-word:regular-word/disp8
73 $next-word:comment:
74
75 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
76 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
77 89/copy 1/mod/*+disp8 7/rm32/EDI . . . 0/r32/EAX 4/disp8 .
78
79 89/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 .
80
81 eb/jump $next-word:end/disp8
82 $next-word:regular-word:
83
84
85 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
86
87 e8/call skip-chars-not-matching-whitespace/disp32
88
89 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
90
91 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 .
92 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/EAX 0xc/disp8 .
93 89/copy 1/mod/*+disp8 7/rm32/EDI . . . 0/r32/EAX 4/disp8 .
94 $next-word:end:
95
96 5f/pop-to-EDI
97 5e/pop-to-ESI
98 59/pop-to-ECX
99 58/pop-to-EAX
100
101 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
102 5d/pop-to-EBP
103 c3/return
104
105 test-next-word:
106
107 55/push-EBP
108 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
109
110
111
112 68/push _test-stream/imm32
113
114 e8/call clear-stream/disp32
115
116 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
117
118 68/push 0/imm32/end
119 68/push 0/imm32/start
120 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
121
122
123 68/push " ab"/imm32
124 68/push _test-stream/imm32
125
126 e8/call write/disp32
127
128 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
129
130
131 51/push-ECX
132 68/push _test-stream/imm32
133
134 e8/call next-word/disp32
135
136 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
137
138
139
140 68/push "F - test-next-word: start"/imm32
141 68/push 0xe/imm32
142
143 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . .
144 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32
145 50/push-EAX
146
147 e8/call check-ints-equal/disp32
148
149 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
150
151
152
153 68/push "F - test-next-word: end"/imm32
154 68/push 0x10/imm32
155
156 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 .
157 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32
158 50/push-EAX
159
160 e8/call check-ints-equal/disp32
161
162 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
163
164 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
165 5d/pop-to-EBP
166 c3/return
167
168 test-next-word-returns-whole-comment:
169
170 55/push-EBP
171 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
172
173
174
175 68/push _test-stream/imm32
176
177 e8/call clear-stream/disp32
178
179 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
180
181 68/push 0/imm32/end
182 68/push 0/imm32/start
183 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
184
185
186 68/push " # a"/imm32
187 68/push _test-stream/imm32
188
189 e8/call write/disp32
190
191 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
192
193
194 51/push-ECX
195 68/push _test-stream/imm32
196
197 e8/call next-word/disp32
198
199 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
200
201
202
203 68/push "F - test-next-word-returns-whole-comment: start"/imm32
204 68/push 0xe/imm32
205
206 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . .
207 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32
208 50/push-EAX
209
210 e8/call check-ints-equal/disp32
211
212 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
213
214
215
216 68/push "F - test-next-word-returns-whole-comment: end"/imm32
217 68/push 0x11/imm32
218
219 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 .
220 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32
221 50/push-EAX
222
223 e8/call check-ints-equal/disp32
224
225 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
226
227 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
228 5d/pop-to-EBP
229 c3/return
230
231 test-next-word-returns-empty-string-on-eof:
232
233 55/push-EBP
234 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
235
236
237
238 68/push _test-stream/imm32
239
240 e8/call clear-stream/disp32
241
242 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
243
244 68/push 0/imm32/end
245 68/push 0/imm32/start
246 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
247
248
249
250 51/push-ECX
251 68/push _test-stream/imm32
252
253 e8/call next-word/disp32
254
255 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
256
257
258 68/push "F - test-next-word-returns-empty-string-on-eof"/imm32
259 68/push 0/imm32
260
261 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 .
262 2b/subtract 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . .
263 50/push-EAX
264
265 e8/call check-ints-equal/disp32
266
267 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
268
269 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
270 5d/pop-to-EBP
271 c3/return
272
273
274
275
276
277
278 write-stream-data:
279
280 55/push-EBP
281 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
282
283 50/push-EAX
284 51/push-ECX
285 56/push-ESI
286
287 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 .
288
289
290 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
291 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
292 50/push-EAX
293
294 8d/copy-address 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 0xc/disp8 .
295 50/push-EAX
296
297 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
298
299
300 51/push-ECX
301 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
302
303 e8/call write-slice-buffered/disp32
304
305 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
306 $write-stream-data:end:
307
308 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
309
310 5e/pop-to-ESI
311 59/pop-to-ECX
312 58/pop-to-EAX
313
314 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
315 5d/pop-to-EBP
316 c3/return
317
318 test-write-stream-data:
319
320 55/push-EBP
321 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
322
323
324
325 68/push _test-output-stream/imm32
326
327 e8/call clear-stream/disp32
328
329 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
330
331
332 b8/copy-to-EAX _test-output-buffered-file/imm32
333 05/add-to-EAX 4/imm32
334 50/push-EAX
335
336 e8/call clear-stream/disp32
337
338 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
339
340
341 68/push _test-input-stream/imm32
342
343 e8/call clear-stream/disp32
344
345 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
346
347
348
349 68/push "abcd"/imm32
350 68/push _test-input-stream/imm32
351
352 e8/call write/disp32
353
354 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
355
356
357 68/push _test-input-stream/imm32
358 68/push _test-output-buffered-file/imm32
359
360 e8/call write-stream-data/disp32
361
362 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
363
364
365
366 68/push _test-output-buffered-file/imm32
367
368 e8/call flush/disp32
369
370 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
371
372
373 68/push "F - test-write-stream-data"/imm32
374 68/push "abcd"/imm32
375 68/push _test-output-stream/imm32
376
377 e8/call check-stream-equal/disp32
378
379 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
380
381 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
382 5d/pop-to-EBP
383 c3/return
384
385 has-metadata?:
386
387
388
389
390
391
392
393
394
395
396 55/push-EBP
397 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
398
399 51/push-ECX
400 52/push-EDX
401 56/push-ESI
402 57/push-EDI
403
404 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 .
405
406 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 2/r32/EDX 4/disp8 .
407
408 68/push 0/imm32/end
409 68/push 0/imm32/start
410 89/copy 3/mod/direct 7/rm32/EDI . . . 4/r32/ESP . .
411
412
413 57/push-EDI
414 68/push 0x2f/imm32/slash
415 52/push-EDX
416 ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . .
417
418 e8/call next-token-from-slice/disp32
419
420 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
421
422 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 4/disp8 .
423 $has-metadata?:loop:
424
425
426 57/push-EDI
427 68/push 0x2f/imm32/slash
428 52/push-EDX
429 51/push-ECX
430
431 e8/call next-token-from-slice/disp32
432
433 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
434
435
436
437 57/push-EDI
438
439 e8/call slice-empty?/disp32
440
441 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
442
443 3d/compare-EAX-and 0/imm32
444 75/jump-if-not-equal $has-metadata?:false/disp8
445
446
447
448 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 .
449 57/push-EDI
450
451 e8/call slice-equal?/disp32
452
453 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
454
455 3d/compare-EAX-and 0/imm32
456 75/jump-if-not-equal $has-metadata?:true/disp8
457
458 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 4/disp8 .
459 eb/jump $has-metadata?:loop/disp8
460 $has-metadata?:true:
461 b8/copy-to-EAX 1/imm32/true
462 eb/jump $has-metadata?:end/disp8
463 $has-metadata?:false:
464 b8/copy-to-EAX 0/imm32/false
465 $has-metadata?:end:
466
467 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
468
469 5f/pop-to-EDI
470 5e/pop-to-ESI
471 5a/pop-to-EDX
472 59/pop-to-ECX
473
474 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
475 5d/pop-to-EBP
476 c3/return
477
478 test-has-metadata-true:
479
480 55/push-EBP
481 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
482
483 b8/copy-to-EAX "ab/imm32"/imm32
484 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
485 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
486 05/add-to-EAX 4/imm32
487
488 51/push-ECX
489 50/push-EAX
490 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . .
491
492
493 68/push "imm32"/imm32
494 56/push-ESI
495
496 e8/call has-metadata?/disp32
497
498 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
499
500
501 68/push "F - test-has-metadata-true"/imm32
502 68/push 1/imm32/true
503 50/push-EAX
504
505 e8/call check-ints-equal/disp32
506
507 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
508
509 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
510 5d/pop-to-EBP
511 c3/return
512
513 test-has-metadata-false:
514
515 55/push-EBP
516 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
517
518 b8/copy-to-EAX "ab/c"/imm32
519 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
520 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
521 05/add-to-EAX 4/imm32
522
523 51/push-ECX
524 50/push-EAX
525 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . .
526
527
528 68/push "d"/imm32
529 56/push-ESI
530
531 e8/call has-metadata?/disp32
532
533 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
534
535
536 68/push "F - test-has-metadata-false"/imm32
537 68/push 0/imm32/false
538 50/push-EAX
539
540 e8/call check-ints-equal/disp32
541
542 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
543
544 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
545 5d/pop-to-EBP
546 c3/return
547
548 test-has-metadata-ignore-name:
549
550 55/push-EBP
551 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
552
553 b8/copy-to-EAX "a/b"/imm32
554 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
555 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
556 05/add-to-EAX 4/imm32
557
558 51/push-ECX
559 50/push-EAX
560 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . .
561
562
563 68/push "a"/imm32
564 56/push-ESI
565
566 e8/call has-metadata?/disp32
567
568 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
569
570
571 68/push "F - test-has-metadata-ignore-name"/imm32
572 68/push 0/imm32/false
573 50/push-EAX
574
575 e8/call check-ints-equal/disp32
576
577 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
578
579 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
580 5d/pop-to-EBP
581 c3/return
582
583 test-has-metadata-multiple-true:
584
585 55/push-EBP
586 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
587
588 b8/copy-to-EAX "a/b/c"/imm32
589 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
590 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
591 05/add-to-EAX 4/imm32
592
593 51/push-ECX
594 50/push-EAX
595 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . .
596
597
598 68/push "c"/imm32
599 56/push-ESI
600
601 e8/call has-metadata?/disp32
602
603 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
604
605
606 68/push "F - test-has-metadata-multiple-true"/imm32
607 68/push 1/imm32/true
608 50/push-EAX
609
610 e8/call check-ints-equal/disp32
611
612 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
613
614 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
615 5d/pop-to-EBP
616 c3/return
617
618 test-has-metadata-multiple-false:
619
620 55/push-EBP
621 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
622
623 b8/copy-to-EAX "a/b/c"/imm32
624 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
625 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
626 05/add-to-EAX 4/imm32
627
628 51/push-ECX
629 50/push-EAX
630 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . .
631
632
633 68/push "d"/imm32
634 56/push-ESI
635
636 e8/call has-metadata?/disp32
637
638 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
639
640
641 68/push "F - test-has-metadata-multiple-false"/imm32
642 68/push 0/imm32/false
643 50/push-EAX
644
645 e8/call check-ints-equal/disp32
646
647 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
648
649 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
650 5d/pop-to-EBP
651 c3/return
652
653
654
655
656
657 emit:
658
659 55/push-EBP
660 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
661
662 50/push-EAX
663 56/push-ESI
664 57/push-EDI
665
666 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 .
667
668 68/push 0/imm32/end
669 68/push 0/imm32/start
670 89/copy 3/mod/direct 7/rm32/EDI . . . 4/r32/ESP . .
671
672
673 57/push-EDI
674 68/push 0x2f/imm32/slash
675 ff 6/subop/push 1/mod/*+disp8 6/rm32/ESI . . . . 4/disp8 .
676 ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . .
677
678 e8/call next-token-from-slice/disp32
679
680 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
681
682
683
684 57/push-EDI
685
686 e8/call is-valid-name?/disp32
687
688 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
689
690 3d/compare-EAX-and 0/imm32
691 74/jump-if-equal $emit:hex-int/disp8
692 $emit:name:
693
694
695 56/push-ESI
696 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
697
698 e8/call write-slice-buffered/disp32
699
700 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
701
702
703 68/push " "/imm32
704 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
705
706 e8/call write-buffered/disp32
707
708 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
709
710 eb/jump $emit:end/disp8
711
712
713
714
715
716 $emit:hex-int:
717
718
719 57/push-EDI
720
721 e8/call parse-hex-int/disp32
722
723 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
724
725
726 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x10/disp8 .
727 50/push-EAX
728 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 .
729
730 e8/call emit-hex/disp32
731
732 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
733 $emit:end:
734
735 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
736
737 5f/pop-to-EDI
738 5e/pop-to-ESI
739 58/pop-to-EAX
740
741 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
742 5d/pop-to-EBP
743 c3/return
744
745 test-emit-number:
746
747 55/push-EBP
748 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
749
750
751
752 68/push _test-output-stream/imm32
753
754 e8/call clear-stream/disp32
755
756 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
757
758
759 b8/copy-to-EAX _test-output-buffered-file/imm32
760 05/add-to-EAX 4/imm32
761 50/push-EAX
762
763 e8/call clear-stream/disp32
764
765 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
766
767 b8/copy-to-EAX "30"/imm32
768 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
769 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
770 05/add-to-EAX 4/imm32
771
772 51/push-ECX
773 50/push-EAX
774 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
775
776
777 68/push 1/imm32
778 51/push-ECX
779 68/push _test-output-buffered-file/imm32
780
781 e8/call emit/disp32
782
783 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
784
785
786 68/push _test-output-buffered-file/imm32
787
788 e8/call flush/disp32
789
790 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
791
792
793 68/push "F - test-emit-number/1"/imm32
794 68/push "30 "/imm32
795 68/push _test-output-stream/imm32
796
797 e8/call check-stream-equal/disp32
798
799 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
800
801 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
802 5d/pop-to-EBP
803 c3/return
804
805 test-emit-negative-number:
806
807
808 55/push-EBP
809 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
810
811
812
813 68/push _test-output-stream/imm32
814
815 e8/call clear-stream/disp32
816
817 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
818
819
820 b8/copy-to-EAX _test-output-buffered-file/imm32
821 05/add-to-EAX 4/imm32
822 50/push-EAX
823
824 e8/call clear-stream/disp32
825
826 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
827
828 b8/copy-to-EAX "-2"/imm32
829 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
830 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
831 05/add-to-EAX 4/imm32
832
833 51/push-ECX
834 50/push-EAX
835 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
836
837
838 68/push 2/imm32
839 51/push-ECX
840 68/push _test-output-buffered-file/imm32
841
842 e8/call emit/disp32
843
844 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
845
846
847 68/push _test-output-buffered-file/imm32
848
849 e8/call flush/disp32
850
851 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
852
853
854 68/push "F - test-emit-number/1"/imm32
855 68/push "fe ff "/imm32
856 68/push _test-output-stream/imm32
857
858 e8/call check-stream-equal/disp32
859
860 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
861
862 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
863 5d/pop-to-EBP
864 c3/return
865
866 test-emit-number-with-metadata:
867
868 55/push-EBP
869 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
870
871
872
873 68/push _test-output-stream/imm32
874
875 e8/call clear-stream/disp32
876
877 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
878
879
880 b8/copy-to-EAX _test-output-buffered-file/imm32
881 05/add-to-EAX 4/imm32
882 50/push-EAX
883
884 e8/call clear-stream/disp32
885
886 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
887
888 b8/copy-to-EAX "-2/foo"/imm32
889 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
890 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
891 05/add-to-EAX 4/imm32
892
893 51/push-ECX
894 50/push-EAX
895 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
896
897
898 68/push 2/imm32
899 51/push-ECX
900 68/push _test-output-buffered-file/imm32
901
902 e8/call emit/disp32
903
904 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
905
906
907 68/push _test-output-buffered-file/imm32
908
909 e8/call flush/disp32
910
911 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
912
913
914
915 68/push "F - test-emit-number-with-metadata"/imm32
916 68/push "fe ff "/imm32
917 68/push _test-output-stream/imm32
918
919 e8/call check-stream-equal/disp32
920
921 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
922
923 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
924 5d/pop-to-EBP
925 c3/return
926
927 test-emit-non-number:
928
929 55/push-EBP
930 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
931
932
933
934 68/push _test-output-stream/imm32
935
936 e8/call clear-stream/disp32
937
938 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
939
940
941 b8/copy-to-EAX _test-output-buffered-file/imm32
942 05/add-to-EAX 4/imm32
943 50/push-EAX
944
945 e8/call clear-stream/disp32
946
947 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
948
949 b8/copy-to-EAX "xyz"/imm32
950 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
951 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
952 05/add-to-EAX 4/imm32
953
954 51/push-ECX
955 50/push-EAX
956 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
957
958
959 68/push 2/imm32
960 51/push-ECX
961 68/push _test-output-buffered-file/imm32
962
963 e8/call emit/disp32
964
965 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
966
967
968 68/push _test-output-buffered-file/imm32
969
970 e8/call flush/disp32
971
972 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
973
974
975 68/push "F - test-emit-non-number"/imm32
976 68/push "xyz "/imm32
977 68/push _test-output-stream/imm32
978
979 e8/call check-stream-equal/disp32
980
981 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
982
983 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
984 5d/pop-to-EBP
985 c3/return
986
987 test-emit-non-number-with-metadata:
988
989 55/push-EBP
990 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
991
992
993
994 68/push _test-output-stream/imm32
995
996 e8/call clear-stream/disp32
997
998 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
999
1000
1001 b8/copy-to-EAX _test-output-buffered-file/imm32
1002 05/add-to-EAX 4/imm32
1003 50/push-EAX
1004
1005 e8/call clear-stream/disp32
1006
1007 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1008
1009 b8/copy-to-EAX "xyz/"/imm32
1010 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1011 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1012 05/add-to-EAX 4/imm32
1013
1014 51/push-ECX
1015 50/push-EAX
1016 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1017
1018
1019 68/push 2/imm32
1020 51/push-ECX
1021 68/push _test-output-buffered-file/imm32
1022
1023 e8/call emit/disp32
1024
1025 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1026
1027
1028 68/push _test-output-buffered-file/imm32
1029
1030 e8/call flush/disp32
1031
1032 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1033
1034
1035 68/push "F - test-emit-non-number-with-metadata"/imm32
1036 68/push "xyz/ "/imm32
1037 68/push _test-output-stream/imm32
1038
1039 e8/call check-stream-equal/disp32
1040
1041 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1042
1043 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1044 5d/pop-to-EBP
1045 c3/return
1046
1047 test-emit-non-number-with-all-hex-digits-and-metadata:
1048
1049 55/push-EBP
1050 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1051
1052
1053
1054 68/push _test-output-stream/imm32
1055
1056 e8/call clear-stream/disp32
1057
1058 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1059
1060
1061 b8/copy-to-EAX _test-output-buffered-file/imm32
1062 05/add-to-EAX 4/imm32
1063 50/push-EAX
1064
1065 e8/call clear-stream/disp32
1066
1067 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1068
1069 b8/copy-to-EAX "abcd/xyz"/imm32
1070 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1071 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1072 05/add-to-EAX 4/imm32
1073
1074 51/push-ECX
1075 50/push-EAX
1076 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1077
1078
1079 68/push 2/imm32
1080 51/push-ECX
1081 68/push _test-output-buffered-file/imm32
1082
1083 e8/call emit/disp32
1084
1085 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1086
1087
1088 68/push _test-output-buffered-file/imm32
1089
1090 e8/call flush/disp32
1091
1092 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1093 +-- 26 lines: #? # dump output ---------------------------------------------------------------------------------------------------------------------------
1119
1120
1121 68/push "F - test-emit-non-number-with-all-hex-digits"/imm32
1122 68/push "abcd/xyz "/imm32
1123 68/push _test-output-stream/imm32
1124
1125 e8/call check-stream-equal/disp32
1126
1127 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1128
1129 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1130 5d/pop-to-EBP
1131 c3/return
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141 is-valid-name?:
1142
1143 55/push-EBP
1144 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1145
1146 51/push-ECX
1147 56/push-ESI
1148
1149 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 .
1150
1151 8b/copy 0/mod/indirect 6/rm32/ESI . . . 1/r32/ECX . .
1152
1153 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 .
1154 $is-valid-name?:check0:
1155
1156 39/compare 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . .
1157 73/jump-if-greater-or-equal-unsigned $is-valid-name?:false/disp8
1158 $is-valid-name?:check1:
1159
1160 29/subtract 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . .
1161
1162 3d/compare-EAX-and 2/imm32
1163 74/jump-if-equal $is-valid-name?:false/disp8
1164 $is-valid-name?:check2:
1165
1166 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . .
1167 8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . .
1168
1169 3d/compare-EAX-and 2d/imm32/-
1170 74/jump-if-equal $is-valid-name?:false/disp8
1171 $is-valid-name?:check3a:
1172
1173 3d/compare-EAX-with 30/imm32/0
1174 7c/jump-if-lesser $is-valid-name?:true/disp8
1175 $is-valid-name?:check3b:
1176
1177 3d/compare-EAX-with 39/imm32/9
1178 7f/jump-if-greater $is-valid-name?:true/disp8
1179 $is-valid-name?:false:
1180
1181 b8/copy-to-EAX 0/imm32/false
1182 eb/jump $is-valid-name?:end/disp8
1183 $is-valid-name?:true:
1184
1185 b8/copy-to-EAX 1/imm32/true
1186 $is-valid-name?:end:
1187
1188 5e/pop-to-ESI
1189 59/pop-to-ECX
1190
1191 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1192 5d/pop-to-EBP
1193 c3/return
1194
1195 test-is-valid-name-digit-prefix:
1196
1197 55/push-EBP
1198 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1199
1200 b8/copy-to-EAX "34"/imm32
1201 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1202 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1203 05/add-to-EAX 4/imm32
1204
1205 51/push-ECX
1206 50/push-EAX
1207 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1208
1209
1210 51/push-ECX
1211
1212 e8/call is-valid-name?/disp32
1213
1214 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1215
1216
1217 68/push "F - test-is-valid-name-digit-prefix"/imm32
1218 68/push 0/imm32/false
1219 50/push-EAX
1220
1221 e8/call check-ints-equal/disp32
1222
1223 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1224
1225 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1226 5d/pop-to-EBP
1227 c3/return
1228
1229 test-is-valid-name-negative-prefix:
1230
1231 55/push-EBP
1232 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1233
1234 b8/copy-to-EAX "-0x34"/imm32
1235 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1236 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1237 05/add-to-EAX 4/imm32
1238
1239 51/push-ECX
1240 50/push-EAX
1241 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1242
1243
1244 51/push-ECX
1245
1246 e8/call is-valid-name?/disp32
1247
1248 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1249
1250
1251 68/push "F - test-is-valid-name-negative-prefix"/imm32
1252 68/push 0/imm32/false
1253 50/push-EAX
1254
1255 e8/call check-ints-equal/disp32
1256
1257 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1258
1259 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1260 5d/pop-to-EBP
1261 c3/return
1262
1263 test-is-valid-name-0x-prefix:
1264
1265 55/push-EBP
1266 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1267
1268 b8/copy-to-EAX "0x34"/imm32
1269 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1270 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1271 05/add-to-EAX 4/imm32
1272
1273 51/push-ECX
1274 50/push-EAX
1275 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1276
1277
1278 51/push-ECX
1279
1280 e8/call is-valid-name?/disp32
1281
1282 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1283
1284
1285 68/push "F - test-is-valid-name-0x-prefix"/imm32
1286 68/push 0/imm32/false
1287 50/push-EAX
1288
1289 e8/call check-ints-equal/disp32
1290
1291 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1292
1293 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1294 5d/pop-to-EBP
1295 c3/return
1296
1297 test-is-valid-name-starts-with-pre-digit:
1298
1299 55/push-EBP
1300 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1301
1302 b8/copy-to-EAX "/03"/imm32
1303 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1304 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1305 05/add-to-EAX 4/imm32
1306
1307 51/push-ECX
1308 50/push-EAX
1309 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1310
1311
1312 51/push-ECX
1313
1314 e8/call is-valid-name?/disp32
1315
1316 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1317
1318
1319 68/push "F - test-is-valid-name-starts-with-pre-digit"/imm32
1320 68/push 1/imm32/true
1321 50/push-EAX
1322
1323 e8/call check-ints-equal/disp32
1324
1325 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1326
1327 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1328 5d/pop-to-EBP
1329 c3/return
1330
1331 test-is-valid-name-starts-with-post-digit:
1332
1333 55/push-EBP
1334 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1335
1336 b8/copy-to-EAX "q34"/imm32
1337 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1338 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1339 05/add-to-EAX 4/imm32
1340
1341 51/push-ECX
1342 50/push-EAX
1343 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1344
1345
1346 51/push-ECX
1347
1348 e8/call is-valid-name?/disp32
1349
1350 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1351
1352
1353 68/push "F - test-is-valid-name-starts-with-post-digit"/imm32
1354 68/push 1/imm32/true
1355 50/push-EAX
1356
1357 e8/call check-ints-equal/disp32
1358
1359 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1360
1361 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1362 5d/pop-to-EBP
1363 c3/return
1364
1365 test-is-valid-name-starts-with-digit:
1366
1367 55/push-EBP
1368 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1369
1370 b8/copy-to-EAX "0x34"/imm32
1371 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1372 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1373 05/add-to-EAX 4/imm32
1374
1375 51/push-ECX
1376 50/push-EAX
1377 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1378
1379
1380 51/push-ECX
1381
1382 e8/call is-valid-name?/disp32
1383
1384 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1385
1386
1387 68/push "F - test-is-valid-name-starts-with-digit"/imm32
1388 68/push 0/imm32/false
1389 50/push-EAX
1390
1391 e8/call check-ints-equal/disp32
1392
1393 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1394
1395 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1396 5d/pop-to-EBP
1397 c3/return
1398
1399
1400 emit-hex:
1401
1402 55/push-EBP
1403 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1404
1405 50/push-EAX
1406 51/push-ECX
1407 52/push-EDX
1408 53/push-EBX
1409 57/push-EDI
1410
1411 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 .
1412
1413 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 0xc/disp8 .
1414
1415 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0x10/disp8 .
1416
1417 31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . .
1418 $emit-hex:loop:
1419
1420 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . .
1421 7d/jump-if-greater-or-equal $emit-hex:end/disp8
1422
1423
1424 53/push-EBX
1425 57/push-EDI
1426
1427 e8/call print-byte-buffered/disp32
1428
1429 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1430
1431
1432 68/push 0x20/imm32/space
1433 57/push-EDI
1434
1435 e8/call write-byte-buffered/disp32
1436
1437 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1438
1439 c1/shift 5/subop/logic-right 3/mod/direct 3/rm32/EBX . . . . . 8/imm8
1440 $emit-hex:continue:
1441
1442 41/increment-ECX
1443 eb/jump $emit-hex:loop/disp8
1444 $emit-hex:end:
1445
1446 5f/pop-to-EDI
1447 5b/pop-to-EBX
1448 5a/pop-to-EDX
1449 59/pop-to-ECX
1450 58/pop-to-EAX
1451
1452 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1453 5d/pop-to-EBP
1454 c3/return
1455
1456 test-emit-hex-single-byte:
1457
1458
1459
1460 68/push _test-output-stream/imm32
1461
1462 e8/call clear-stream/disp32
1463
1464 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1465
1466
1467 b8/copy-to-EAX _test-output-buffered-file/imm32
1468 05/add-to-EAX 4/imm32
1469 50/push-EAX
1470
1471 e8/call clear-stream/disp32
1472
1473 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1474
1475
1476 68/push 1/imm32
1477 68/push 0xab/imm32
1478 68/push _test-output-buffered-file/imm32
1479
1480 e8/call emit-hex/disp32
1481
1482 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1483
1484
1485 68/push _test-output-buffered-file/imm32
1486
1487 e8/call flush/disp32
1488
1489 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1490
1491
1492 68/push "F - test-emit-hex-single-byte"/imm32
1493 68/push 0x206261/imm32
1494
1495 b8/copy-to-EAX _test-output-stream/imm32
1496 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 .
1497
1498 e8/call check-ints-equal/disp32
1499
1500 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1501
1502 c3/return
1503
1504 test-emit-hex-multiple-byte:
1505
1506
1507
1508 68/push _test-output-stream/imm32
1509
1510 e8/call clear-stream/disp32
1511
1512 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1513
1514
1515 b8/copy-to-EAX _test-output-buffered-file/imm32
1516 05/add-to-EAX 4/imm32
1517 50/push-EAX
1518
1519 e8/call clear-stream/disp32
1520
1521 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1522
1523
1524 68/push 2/imm32
1525 68/push 0x1234/imm32
1526 68/push _test-output-buffered-file/imm32
1527
1528 e8/call emit-hex/disp32
1529
1530 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1531
1532
1533 68/push _test-output-buffered-file/imm32
1534
1535 e8/call flush/disp32
1536
1537 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1538
1539
1540 68/push "F - test-emit-hex-multiple-byte/1"/imm32
1541 68/push "34 12 "/imm32
1542 68/push _test-output-stream/imm32
1543
1544 e8/call check-stream-equal/disp32
1545
1546 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1547
1548 c3/return
1549
1550 test-emit-hex-zero-pad:
1551
1552
1553
1554 68/push _test-output-stream/imm32
1555
1556 e8/call clear-stream/disp32
1557
1558 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1559
1560
1561 b8/copy-to-EAX _test-output-buffered-file/imm32
1562 05/add-to-EAX 4/imm32
1563 50/push-EAX
1564
1565 e8/call clear-stream/disp32
1566
1567 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1568
1569
1570 68/push 2/imm32
1571 68/push 0xab/imm32
1572 68/push _test-output-buffered-file/imm32
1573
1574 e8/call emit-hex/disp32
1575
1576 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1577
1578
1579 68/push _test-output-buffered-file/imm32
1580
1581 e8/call flush/disp32
1582
1583 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1584
1585
1586 68/push "F - test-emit-hex-zero-pad/1"/imm32
1587 68/push "ab 00 "/imm32
1588 68/push _test-output-stream/imm32
1589
1590 e8/call check-stream-equal/disp32
1591
1592 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1593
1594 c3/return
1595
1596 test-emit-hex-negative:
1597
1598
1599
1600 68/push _test-output-stream/imm32
1601
1602 e8/call clear-stream/disp32
1603
1604 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1605
1606
1607 b8/copy-to-EAX _test-output-buffered-file/imm32
1608 05/add-to-EAX 4/imm32
1609 50/push-EAX
1610
1611 e8/call clear-stream/disp32
1612
1613 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1614
1615
1616 68/push 2/imm32
1617 68/push -1/imm32
1618 68/push _test-output-buffered-file/imm32
1619
1620 e8/call emit-hex/disp32
1621
1622 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1623
1624
1625 68/push _test-output-buffered-file/imm32
1626
1627 e8/call flush/disp32
1628
1629 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1630
1631
1632 68/push "F - test-emit-hex-negative/1"/imm32
1633 68/push "ff ff "/imm32
1634 68/push _test-output-stream/imm32
1635
1636 e8/call check-stream-equal/disp32
1637
1638 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1639
1640 c3/return
1641
1642
1643 emit-hex-array:
1644
1645 55/push-EBP
1646 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1647
1648 50/push-EAX
1649 51/push-ECX
1650 52/push-EDX
1651 57/push-EDI
1652
1653 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 .
1654
1655 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 .
1656
1657 8d/copy-address 1/mod/*+disp8 2/rm32/EDX . . . 1/r32/ECX 4/disp8 .
1658
1659 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . .
1660 01/add 3/mod/direct 2/rm32/EDX . . . 1/r32/ECX . .
1661
1662 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . .
1663 $emit-hex-array:loop:
1664
1665 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . .
1666 73/jump-if-greater-or-equal-unsigned $emit-hex-array:end/disp8
1667
1668
1669 68/push 1/imm32/width
1670 8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . .
1671 50/push-EAX
1672 57/push-EDI
1673
1674 e8/call emit-hex/disp32
1675
1676 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1677
1678 41/increment-ECX
1679 eb/jump $emit-hex-array:loop/disp8
1680 $emit-hex-array:end:
1681
1682 5f/pop-to-EDI
1683 5a/pop-to-EDX
1684 59/pop-to-ECX
1685 58/pop-to-EAX
1686
1687 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1688 5d/pop-to-EBP
1689 c3/return
1690
1691 test-emit-hex-array:
1692
1693 55/push-EBP
1694 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1695
1696
1697
1698 68/push _test-output-stream/imm32
1699
1700 e8/call clear-stream/disp32
1701
1702 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1703
1704
1705 b8/copy-to-EAX _test-output-buffered-file/imm32
1706 05/add-to-EAX 4/imm32
1707 50/push-EAX
1708
1709 e8/call clear-stream/disp32
1710
1711 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1712
1713 68/push 0x00030201/imm32
1714 68/push 3/imm32/length
1715 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1716
1717
1718 51/push-ECX
1719 68/push _test-output-buffered-file/imm32
1720
1721 e8/call emit-hex-array/disp32
1722
1723 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1724
1725
1726 68/push _test-output-buffered-file/imm32
1727
1728 e8/call flush/disp32
1729
1730 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1731 +-- 33 lines: #? # dump output ---------------------------------------------------------------------------------------------------------------------------
1764
1765
1766 68/push "F - test-emit-hex-array"/imm32
1767 68/push "01 02 03 "/imm32
1768 68/push _test-output-stream/imm32
1769
1770 e8/call check-next-stream-line-equal/disp32
1771
1772 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1773
1774 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1775 5d/pop-to-EBP
1776 c3/return
1777
1778 compute-width:
1779
1780 55/push-EBP
1781 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1782
1783 51/push-ECX
1784
1785 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 .
1786
1787 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
1788 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
1789
1790 05/add-to-EAX 4/imm32
1791
1792 51/push-ECX
1793 50/push-EAX
1794 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
1795
1796
1797 51/push-ECX
1798
1799 e8/call compute-width-of-slice/disp32
1800
1801 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1802 $compute-width:end:
1803
1804 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1805
1806 59/pop-to-ECX
1807
1808 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1809 5d/pop-to-EBP
1810 c3/return
1811
1812 compute-width-of-slice:
1813
1814 55/push-EBP
1815 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1816
1817 51/push-ECX
1818
1819 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 .
1820
1821
1822
1823 68/push "imm32"/imm32
1824 51/push-ECX
1825
1826 e8/call has-metadata?/disp32
1827
1828 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1829
1830 3d/compare-EAX-and 0/imm32
1831 b8/copy-to-EAX 4/imm32
1832 75/jump-if-not-equal $compute-width-of-slice:end/disp8
1833
1834
1835
1836 68/push "disp32"/imm32
1837 51/push-ECX
1838
1839 e8/call has-metadata?/disp32
1840
1841 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1842
1843 3d/compare-EAX-and 0/imm32
1844 b8/copy-to-EAX 4/imm32
1845 75/jump-if-not-equal $compute-width-of-slice:end/disp8
1846
1847
1848
1849 68/push "imm16"/imm32
1850 51/push-ECX
1851
1852 e8/call has-metadata?/disp32
1853
1854 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1855
1856 3d/compare-EAX-and 0/imm32
1857 b8/copy-to-EAX 2/imm32
1858 75/jump-if-not-equal $compute-width-of-slice:end/disp8
1859
1860
1861
1862 68/push "disp16"/imm32
1863 51/push-ECX
1864
1865 e8/call has-metadata?/disp32
1866
1867 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
1868
1869 3d/compare-EAX-and 0/imm32
1870 b8/copy-to-EAX 2/imm32
1871 75/jump-if-not-equal $compute-width-of-slice:end/disp8
1872
1873 b8/copy-to-EAX 1/imm32
1874 $compute-width-of-slice:end:
1875
1876 59/pop-to-ECX
1877
1878 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
1879 5d/pop-to-EBP
1880 c3/return
1881
1882 test-compute-width:
1883
1884 55/push-EBP
1885 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
1886 $test-compute-width:imm8:
1887
1888
1889 68/push "0x2/imm8"/imm32
1890
1891 e8/call compute-width/disp32
1892
1893 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1894
1895
1896 68/push "F - test-compute-width: 0x2/imm8"/imm32
1897 50/push-EAX
1898 68/push 1/imm32
1899
1900 e8/call check-ints-equal/disp32
1901
1902 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1903 $test-compute-width:imm16:
1904
1905
1906 68/push "4/imm16"/imm32
1907
1908 e8/call compute-width/disp32
1909
1910 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1911
1912
1913 68/push "F - test-compute-width: 4/imm16"/imm32
1914 50/push-EAX
1915 68/push 2/imm32
1916
1917 e8/call check-ints-equal/disp32
1918
1919 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1920 $test-compute-width:imm32:
1921
1922
1923 68/push "4/imm32"/imm32
1924
1925 e8/call compute-width/disp32
1926
1927 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1928
1929
1930 68/push "F - test-compute-width: 4/imm32"/imm32
1931 50/push-EAX
1932 68/push 4/imm32
1933
1934 e8/call check-ints-equal/disp32
1935
1936 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1937 $test-compute-width:disp8:
1938
1939
1940 68/push "foo/disp8"/imm32
1941
1942 e8/call compute-width/disp32
1943
1944 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1945
1946
1947 68/push "F - test-compute-width: foo/disp8"/imm32
1948 50/push-EAX
1949 68/push 1/imm32
1950
1951 e8/call check-ints-equal/disp32
1952
1953 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1954 $test-compute-width:disp16:
1955
1956
1957 68/push "foo/disp16"/imm32
1958
1959 e8/call compute-width/disp32
1960
1961 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1962
1963
1964 68/push "F - test-compute-width: foo/disp16"/imm32
1965 50/push-EAX
1966 68/push 2/imm32
1967
1968 e8/call check-ints-equal/disp32
1969
1970 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1971 $test-compute-width:disp32:
1972
1973
1974 68/push "foo/disp32"/imm32
1975
1976 e8/call compute-width/disp32
1977
1978 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1979
1980
1981 68/push "F - test-compute-width: foo/disp32"/imm32
1982 50/push-EAX
1983 68/push 4/imm32
1984
1985 e8/call check-ints-equal/disp32
1986
1987 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
1988 $test-compute-width:no-metadata:
1989
1990
1991 68/push "45"/imm32
1992
1993 e8/call compute-width/disp32
1994
1995 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
1996
1997
1998 68/push "F - test-compute-width: 45 (no metadata)"/imm32
1999 50/push-EAX
2000 68/push 1/imm32
2001
2002 e8/call check-ints-equal/disp32
2003
2004 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
2005
2006 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
2007 5d/pop-to-EBP
2008 c3/return
2009
2010 is-label?:
2011
2012 55/push-EBP
2013 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
2014
2015 51/push-ECX
2016
2017 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 .
2018
2019 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 1/r32/ECX 4/disp8 .
2020
2021
2022 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . .
2023
2024 8a/copy-byte 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/AL -1/disp8 .
2025
2026 3d/compare-EAX-and 0x3a/imm32/colon
2027 b8/copy-to-EAX 1/imm32/true
2028 74/jump-if-equal $is-label?:end/disp8
2029 b8/copy-to-EAX 0/imm32/false
2030 $is-label?:end:
2031
2032 59/pop-to-ECX
2033
2034 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
2035 5d/pop-to-EBP
2036 c3/return
2037
2038 test-is-label?:
2039
2040 55/push-EBP
2041 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
2042 $test-is-label?:true:
2043
2044 b8/copy-to-EAX "AAA:"/imm32
2045 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
2046 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
2047 05/add-to-EAX 4/imm32
2048
2049 51/push-ECX
2050 50/push-EAX
2051 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
2052
2053
2054 51/push-ECX
2055
2056 e8/call is-label?/disp32
2057
2058 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
2059
2060
2061 68/push "F - test-is-label?:true"/imm32
2062 68/push 1/imm32
2063 50/push-EAX
2064
2065 e8/call check-ints-equal/disp32
2066
2067 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
2068 $test-is-label?:false:
2069
2070 b8/copy-to-EAX "AAA"/imm32
2071 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . .
2072 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 .
2073 05/add-to-EAX 4/imm32
2074
2075 51/push-ECX
2076 50/push-EAX
2077 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . .
2078
2079
2080 51/push-ECX
2081
2082 e8/call is-label?/disp32
2083
2084 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
2085
2086
2087 68/push "F - test-is-label?:false"/imm32
2088 68/push 0/imm32
2089 50/push-EAX
2090
2091 e8/call check-ints-equal/disp32
2092
2093 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
2094
2095 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
2096 5d/pop-to-EBP
2097 c3/return
2098
2099 == data
2100
2101 _test-data-segment:
2102 64/d 61/a 74/t 61/a
2103 _test-data-segment-end:
2104
2105