1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 == code
28
29
30
31
32
33
34 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
35
36 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32
37 7e/jump-if-lesser-or-equal $run-main/disp8
38
39
40 68/push "test"/imm32
41 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 .
42
43 e8/call kernel-string-equal/disp32
44
45 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
46
47 3d/compare-EAX 1/imm32
48 75/jump-if-not-equal $run-main/disp8
49
50 e8/call run-tests/disp32
51
52 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32
53 eb/jump $main:end/disp8
54 $run-main:
55
56
57 81 5/subop/subtract 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
58 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . .
59
60 c7/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32
61
62
63 50/push-EAX/ed
64 68/push 2/imm32/stderr
65 68/push 1/imm32/stdout
66 68/push Stdin/imm32
67
68 e8/call compile/disp32
69
70 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
71
72 bb/copy-to-EBX 0/imm32
73 $main:end:
74 b8/copy-to-EAX 1/imm32/exit
75 cd/syscall 0x80/imm8
76
77
78 compile:
79
80 55/push-EBP
81 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
82
83 50/push-EAX
84 51/push-ECX
85
86
87 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 .
88
89 e8/call get-char/disp32
90
91 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
92
93
94
95
96 81 5/subop/subtract 3/mod/direct 4/rm32/ESP . . . . . 0x13/imm32
97 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 1/r32/ECX . .
98
99 c7/copy 1/mod/*+disp8 1/rm32/ECX . . . . 8/disp8 7/imm32
100
101
102 51/push-ECX
103
104 e8/call clear-stream/disp32
105
106 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
107
108
109 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 .
110 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 .
111 51/push-ECX/num
112 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 .
113
114 e8/call get-num/disp32
115
116 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
117
118
119 68/push "Ab"/imm32
120 68/push _test-stream/imm32
121
122 e8/call write/disp32
123
124 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
125
126
127 68/push "bb/copy-to-EBX "/imm32
128 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
129
130 e8/call write/disp32
131
132 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
133
134
135 51/push-ECX/num
136 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
137
138 e8/call write-stream/disp32
139
140 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
141
142
143 68/push Newline/imm32
144 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
145
146 e8/call write/disp32
147
148 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
149
150
151 68/push "b8/copy-to-EAX 1/imm32/exit"/imm32
152 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
153
154 e8/call write/disp32
155
156 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
157
158
159 68/push Newline/imm32
160 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
161
162 e8/call write/disp32
163
164 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
165
166
167 68/push "cd/syscall 0x80/imm8"/imm32
168 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
169
170 e8/call write/disp32
171
172 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
173
174
175 68/push Newline/imm32
176 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
177
178 e8/call write/disp32
179
180 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
181
182 59/pop-to-ECX
183 58/pop-to-EAX
184
185 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
186 5d/pop-to-EBP
187 c3/return
188
189
190
191
192 get-num:
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 55/push-EBP
215 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
216
217
218 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Look/disp32 .
219
220 e8/call is-digit?/disp32
221
222 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
223
224 3d/compare-EAX 0/imm32
225 75/jump-if-not-equal $get-num:main/disp8
226
227
228 68/push "integer"/imm32
229 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 .
230 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 .
231
232 e8/call expected/disp32
233
234 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
235 $get-num:main:
236
237 50/push-EAX
238 51/push-ECX
239 52/push-EDX
240 53/push-EBX
241 56/push-ESI
242 57/push-EDI
243
244
245 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 .
246
247 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 0xc/disp8 .
248
249 8b/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . .
250
251 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 2/r32/EDX 8/disp8 .
252
253 3b/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . .
254 7d/jump-if-lesser $get-num:stage2/disp8
255
256
257 68/push "get-num: too many digits in number"/imm32
258 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 .
259 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 .
260
261 e8/call error/disp32
262
263 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
264 $get-num:stage2:
265
266 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX . 3/r32/EBX 0xc/disp8 .
267 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Look/disp32 .
268 88/copy-byte 0/mod/indirect 3/rm32/EBX . . . 0/r32/AL . .
269
270 41/increment-ECX
271
272
273 56/push-ESI
274
275 e8/call get-char/disp32
276
277 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
278 $get-num:loop-end:
279
280 89/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . .
281
282 5f/pop-to-EDI
283 5e/pop-to-ESI
284 5b/pop-to-EBX
285 5a/pop-to-EDX
286 59/pop-to-ECX
287 58/pop-to-EAX
288
289 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
290 5d/pop-to-EBP
291 c3/return
292
293 test-get-num-reads-single-digit:
294
295
296 55/push-EBP
297 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
298
299
300
301 68/push _test-stream/imm32
302
303 e8/call clear-stream/disp32
304
305 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
306
307
308 b8/copy-to-EAX _test-buffered-file/imm32
309 05/add-to-EAX 4/imm32
310 50/push-EAX
311
312 e8/call clear-stream/disp32
313
314 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
315
316
317 68/push _test-output-stream/imm32
318
319 e8/call clear-stream/disp32
320
321 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
322
323
324 68/push _test-error-stream/imm32
325
326 e8/call clear-stream/disp32
327
328 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
329
330
331
332 68/push "3"/imm32
333 68/push _test-stream/imm32
334
335 e8/call write/disp32
336
337 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
338
339
340
341 81 5/subop/subtract 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
342 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . .
343
344
345
346 68/push 0x10/imm32/nbytes-of-args-for-get-num
347 50/push-EAX/ed
348
349 e8/call tailor-exit-descriptor/disp32
350
351 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
352
353
354
355 68/push _test-buffered-file/imm32
356
357 e8/call get-char/disp32
358
359 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
360
361
362 50/push-EAX/ed
363 68/push _test-error-stream/imm32
364 68/push _test-output-stream/imm32
365 68/push _test-buffered-file/imm32
366
367 e8/call get-num/disp32
368
369
370 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
371
372
373 68/push "F - test-get-num-reads-single-digit"/imm32
374 68/push 0x33/imm32
375 b8/copy-to-EAX _test-output-stream/imm32
376 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 .
377
378 e8/call check-ints-equal/disp32
379
380 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
381
382 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
383 5d/pop-to-EBP
384 c3/return
385
386 test-get-num-aborts-on-non-digit-in-Look:
387
388
389 55/push-EBP
390 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
391
392
393
394 68/push _test-stream/imm32
395
396 e8/call clear-stream/disp32
397
398 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
399
400
401 b8/copy-to-EAX _test-buffered-file/imm32
402 05/add-to-EAX 4/imm32
403 50/push-EAX
404
405 e8/call clear-stream/disp32
406
407 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
408
409
410 68/push _test-output-stream/imm32
411
412 e8/call clear-stream/disp32
413
414 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
415
416
417 68/push _test-error-stream/imm32
418
419 e8/call clear-stream/disp32
420
421 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
422
423
424
425 68/push "3"/imm32
426 68/push _test-stream/imm32
427
428 e8/call write/disp32
429
430 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
431
432
433
434 81 5/subop/subtract 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
435 8d/copy-address 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . .
436
437
438
439 68/push 0x10/imm32/nbytes-of-args-for-get-num
440 50/push-EAX/ed
441
442 e8/call tailor-exit-descriptor/disp32
443
444 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
445
446
447
448 50/push-EAX/ed
449 68/push _test-error-stream/imm32
450 68/push _test-output-stream/imm32
451 68/push _test-buffered-file/imm32
452
453 e8/call get-num/disp32
454
455
456 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
457
458
459
460 68/push "F - test-get-num-aborts-on-non-digit-in-Look"/imm32
461 68/push 2/imm32
462
463 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 .
464
465 e8/call check-ints-equal/disp32
466
467 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
468
469 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
470 5d/pop-to-EBP
471 c3/return
472
473
474
475
476 expected:
477
478 55/push-EBP
479 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
480
481
482 68/push "Error: "/imm32
483 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
484
485 e8/call write/disp32
486
487 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
488
489
490 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 .
491 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
492
493 e8/call write/disp32
494
495 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
496
497
498 68/push " expected"/imm32
499 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
500
501 e8/call write/disp32
502
503 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
504
505
506 68/push Newline/imm32
507 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
508
509 e8/call write/disp32
510
511 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
512
513
514 68/push 1/imm32
515 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 .
516
517 e8/call stop/disp32
518
519
520 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
521 5d/pop-to-EBP
522 c3/return
523
524
525 error:
526
527 55/push-EBP
528 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
529
530
531 68/push "Error: "/imm32
532 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
533
534 e8/call write/disp32
535
536 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
537
538
539 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 .
540 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
541
542 e8/call write/disp32
543
544 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
545
546
547 68/push Newline/imm32
548 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
549
550 e8/call write/disp32
551
552 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
553
554
555 68/push 1/imm32
556 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 .
557
558 e8/call stop/disp32
559
560
561 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
562 5d/pop-to-EBP
563 c3/return
564
565
566 get-char:
567
568 55/push-EBP
569 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
570
571 50/push-EAX
572
573
574 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 .
575
576 e8/call read-byte/disp32
577
578 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
579
580 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX Look/disp32 .
581
582 58/pop-to-EAX
583
584 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
585 5d/pop-to-EBP
586 c3/return
587
588 is-digit?:
589
590 55/push-EBP
591 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
592
593 b8/copy-to-EAX 0/imm32
594
595 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 0x30/imm32
596 7c/jump-if-lesser $is-digit?:end/disp8
597
598 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 0x39/imm32
599 7f/jump-if-greater $is-digit?:end/disp8
600
601 b8/copy-to-EAX 1/imm32
602 $is-digit?:end:
603
604 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
605 5d/pop-to-EBP
606 c3/return
607
608 == data
609
610 Look:
611 00 00 00 00
612
613 _test-output-stream:
614
615 00 00 00 00
616
617 00 00 00 00
618
619 08 00 00 00
620
621 00 00 00 00 00 00 00 00
622
623 _test-error-stream:
624
625 00 00 00 00
626
627 00 00 00 00
628
629 08 00 00 00
630
631 00 00 00 00 00 00 00 00
632
633