https://github.com/akkartik/mu/blob/master/067parse-hex.subx
1
2
3
4 == code
5
6
7
8
9 is-hex-int?:
10
11 55/push-ebp
12 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
13
14 51/push-ecx
15 52/push-edx
16 53/push-ebx
17
18 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 8/disp8 .
19
20 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 2/r32/edx 4/disp8 .
21
22 8b/copy 0/mod/indirect 1/rm32/ecx . . . 1/r32/ecx . .
23
24 b8/copy-to-eax 0/imm32/false
25 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . .
26 73/jump-if-greater-or-equal-unsigned $is-hex-int?:end/disp8
27
28
29 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . .
30 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 3/r32/BL . .
31 81 7/subop/compare 3/mod/direct 3/rm32/ebx . . . . . 0x2d/imm32/-
32 75/jump-if-not-equal $is-hex-int?:initial-0/disp8
33
34 41/increment-ecx
35
36 $is-hex-int?:initial-0:
37
38 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . .
39 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 3/r32/BL . .
40 81 7/subop/compare 3/mod/direct 3/rm32/ebx . . . . . 0x30/imm32/0
41 75/jump-if-not-equal $is-hex-int?:loop/disp8
42
43 41/increment-ecx
44 $is-hex-int?:initial-0x:
45
46 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . .
47 73/jump-if-greater-or-equal-unsigned $is-hex-int?:true/disp8
48
49 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . .
50 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 3/r32/BL . .
51 81 7/subop/compare 3/mod/direct 3/rm32/ebx . . . . . 0x78/imm32/x
52 75/jump-if-not-equal $is-hex-int?:loop/disp8
53
54 41/increment-ecx
55 $is-hex-int?:loop:
56
57 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . .
58 73/jump-if-greater-or-equal-unsigned $is-hex-int?:true/disp8
59
60
61 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . .
62 50/push-eax
63
64 e8/call is-hex-digit?/disp32
65
66 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
67
68 3d/compare-eax-and 0/imm32
69 74/jump-if-equal $is-hex-int?:end/disp8
70
71 41/increment-ecx
72
73 eb/jump $is-hex-int?:loop/disp8
74 $is-hex-int?:true:
75
76 b8/copy-to-eax 1/imm32/true
77 $is-hex-int?:end:
78
79 5b/pop-to-ebx
80 5a/pop-to-edx
81 59/pop-to-ecx
82
83 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
84 5d/pop-to-ebp
85 c3/return
86
87 test-is-hex-int:
88
89 55/push-ebp
90 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
91
92 b8/copy-to-eax "34"/imm32
93 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
94 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
95 05/add-to-eax 4/imm32
96
97 51/push-ecx
98 50/push-eax
99 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
100
101
102 51/push-ecx
103
104 e8/call is-hex-int?/disp32
105
106 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
107
108
109 68/push "F - test-is-hex-int"/imm32
110 68/push 1/imm32/true
111 50/push-eax
112
113 e8/call check-ints-equal/disp32
114
115 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
116
117 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
118 5d/pop-to-ebp
119 c3/return
120
121 test-is-hex-int-handles-letters:
122
123 55/push-ebp
124 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
125
126 b8/copy-to-eax "34a"/imm32
127 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
128 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
129 05/add-to-eax 4/imm32
130
131 51/push-ecx
132 50/push-eax
133 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
134
135
136 51/push-ecx
137
138 e8/call is-hex-int?/disp32
139
140 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
141
142
143 68/push "F - test-is-hex-int-handles-letters"/imm32
144 68/push 1/imm32/true
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 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
152 5d/pop-to-ebp
153 c3/return
154
155 test-is-hex-int-with-trailing-char:
156
157 55/push-ebp
158 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
159
160 b8/copy-to-eax "34q"/imm32
161 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
162 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
163 05/add-to-eax 4/imm32
164
165 51/push-ecx
166 50/push-eax
167 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
168
169
170 51/push-ecx
171
172 e8/call is-hex-int?/disp32
173
174 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
175
176
177 68/push "F - test-is-hex-int-with-trailing-char"/imm32
178 68/push 0/imm32/false
179 50/push-eax
180
181 e8/call check-ints-equal/disp32
182
183 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
184
185 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
186 5d/pop-to-ebp
187 c3/return
188
189 test-is-hex-int-with-leading-char:
190
191 55/push-ebp
192 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
193
194 b8/copy-to-eax "q34"/imm32
195 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
196 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
197 05/add-to-eax 4/imm32
198
199 51/push-ecx
200 50/push-eax
201 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
202
203
204 51/push-ecx
205
206 e8/call is-hex-int?/disp32
207
208 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
209
210
211 68/push "F - test-is-hex-int-with-leading-char"/imm32
212 68/push 0/imm32/false
213 50/push-eax
214
215 e8/call check-ints-equal/disp32
216
217 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
218
219 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
220 5d/pop-to-ebp
221 c3/return
222
223 test-is-hex-int-empty:
224
225 55/push-ebp
226 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
227
228 68/push 0/imm32
229 68/push 0/imm32
230 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
231
232
233 51/push-ecx
234
235 e8/call is-hex-int?/disp32
236
237 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
238
239
240 68/push "F - test-is-hex-int-empty"/imm32
241 68/push 0/imm32/false
242 50/push-eax
243
244 e8/call check-ints-equal/disp32
245
246 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
247
248 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
249 5d/pop-to-ebp
250 c3/return
251
252 test-is-hex-int-handles-0x-prefix:
253
254 55/push-ebp
255 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
256
257 b8/copy-to-eax "0x3a"/imm32
258 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
259 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
260 05/add-to-eax 4/imm32
261
262 51/push-ecx
263 50/push-eax
264 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
265
266
267 51/push-ecx
268
269 e8/call is-hex-int?/disp32
270
271 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
272
273
274 68/push "F - test-is-hex-int-handles-0x-prefix"/imm32
275 68/push 1/imm32/true
276 50/push-eax
277
278 e8/call check-ints-equal/disp32
279
280 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
281
282 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
283 5d/pop-to-ebp
284 c3/return
285
286 test-is-hex-int-handles-negative:
287
288 55/push-ebp
289 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
290
291 b8/copy-to-eax "-34a"/imm32
292 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
293 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
294 05/add-to-eax 4/imm32
295
296 51/push-ecx
297 50/push-eax
298 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
299
300
301 51/push-ecx
302
303 e8/call is-hex-int?/disp32
304
305 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
306
307
308 68/push "F - test-is-hex-int-handles-negative"/imm32
309 68/push 1/imm32/true
310 50/push-eax
311
312 e8/call check-ints-equal/disp32
313
314 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
315
316 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
317 5d/pop-to-ebp
318 c3/return
319
320 test-is-hex-int-handles-negative-0x-prefix:
321
322 55/push-ebp
323 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
324
325 b8/copy-to-eax "-0x3a"/imm32
326 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
327 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
328 05/add-to-eax 4/imm32
329
330 51/push-ecx
331 50/push-eax
332 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
333
334
335 51/push-ecx
336
337 e8/call is-hex-int?/disp32
338
339 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
340
341
342 68/push "F - test-is-hex-int-handles-negative-0x-prefix"/imm32
343 68/push 1/imm32/true
344 50/push-eax
345
346 e8/call check-ints-equal/disp32
347
348 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
349
350 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
351 5d/pop-to-ebp
352 c3/return
353
354 parse-hex-int:
355
356 55/push-ebp
357 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
358
359 51/push-ecx
360 52/push-edx
361 53/push-ebx
362 56/push-esi
363
364 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . .
365
366 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 8/disp8 .
367
368 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 2/r32/edx 4/disp8 .
369
370 8b/copy 0/mod/indirect 1/rm32/ecx . . . 1/r32/ecx . .
371
372 31/xor 3/mod/direct 6/rm32/esi . . . 6/r32/esi . .
373 $parse-hex-int:negative:
374
375 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . .
376 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . .
377 3d/compare-eax-and 0x2d/imm32/-
378 75/jump-if-not-equal $parse-hex-int:initial-0/disp8
379
380 41/increment-ecx
381
382 be/copy-to-esi 1/imm32/true
383 $parse-hex-int:initial-0:
384
385
386 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . .
387 3d/compare-eax-and 0x30/imm32/0
388 75/jump-if-not-equal $parse-hex-int:loop/disp8
389
390 41/increment-ecx
391 $parse-hex-int:initial-0x:
392
393 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . .
394 73/jump-if-greater-or-equal-unsigned $parse-hex-int:end/disp8
395
396 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . .
397 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . .
398 3d/compare-eax-and 0x78/imm32/x
399 75/jump-if-not-equal $parse-hex-int:loop/disp8
400
401 41/increment-ecx
402 $parse-hex-int:loop:
403
404 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . .
405 73/jump-if-greater-or-equal-unsigned $parse-hex-int:negate/disp8
406
407
408 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . .
409
410 e8/call from-hex-char/disp32
411
412 c1/shift 4/subop/left 3/mod/direct 3/rm32/ebx . . . . . 4/imm8
413 01/add 3/mod/direct 3/rm32/ebx . . . 0/r32/eax . .
414
415 41/increment-ecx
416
417 eb/jump $parse-hex-int:loop/disp8
418 $parse-hex-int:negate:
419 81 7/subop/compare 3/mod/direct 6/rm32/esi . . . . . 0/imm32
420 74/jump-if-equal $parse-hex-int:end/disp8
421 f7 3/subop/negate 3/mod/direct 3/rm32/ebx . . . . . .
422 $parse-hex-int:end:
423 89/copy 3/mod/direct 0/rm32/eax . . . 3/r32/ebx . .
424
425 5e/pop-to-esi
426 5b/pop-to-ebx
427 5a/pop-to-edx
428 59/pop-to-ecx
429
430 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
431 5d/pop-to-ebp
432 c3/return
433
434 test-parse-hex-int-single-digit:
435
436 55/push-ebp
437 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
438
439 b8/copy-to-eax "a"/imm32
440 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
441 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
442 05/add-to-eax 4/imm32
443
444 51/push-ecx
445 50/push-eax
446 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
447
448
449 51/push-ecx
450
451 e8/call parse-hex-int/disp32
452
453 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
454
455
456 68/push "F - test-parse-hex-int-single-digit"/imm32
457 68/push 0xa/imm32
458 50/push-eax
459
460 e8/call check-ints-equal/disp32
461
462 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
463
464 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
465 5d/pop-to-ebp
466 c3/return
467
468 test-parse-hex-int-multi-digit:
469
470 55/push-ebp
471 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
472
473 b8/copy-to-eax "34a"/imm32
474 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
475 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
476 05/add-to-eax 4/imm32
477
478 51/push-ecx
479 50/push-eax
480 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
481
482
483 51/push-ecx
484
485 e8/call parse-hex-int/disp32
486
487 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
488
489
490 68/push "F - test-parse-hex-int-multi-digit"/imm32
491 68/push 0x34a/imm32
492 50/push-eax
493
494 e8/call check-ints-equal/disp32
495
496 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
497
498 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
499 5d/pop-to-ebp
500 c3/return
501
502 test-parse-hex-int-0x-prefix:
503
504 55/push-ebp
505 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
506
507 b8/copy-to-eax "0x34"/imm32
508 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
509 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
510 05/add-to-eax 4/imm32
511
512 51/push-ecx
513 50/push-eax
514 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
515
516
517 51/push-ecx
518
519 e8/call parse-hex-int/disp32
520
521 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
522
523
524 68/push "F - test-parse-hex-int-0x-prefix"/imm32
525 68/push 0x34/imm32
526 50/push-eax
527
528 e8/call check-ints-equal/disp32
529
530 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
531
532 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
533 5d/pop-to-ebp
534 c3/return
535
536 test-parse-hex-int-zero:
537
538 55/push-ebp
539 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
540
541 b8/copy-to-eax "0"/imm32
542 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
543 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
544 05/add-to-eax 4/imm32
545
546 51/push-ecx
547 50/push-eax
548 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
549
550
551 51/push-ecx
552
553 e8/call parse-hex-int/disp32
554
555 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
556
557
558 68/push "F - test-parse-hex-int-zero"/imm32
559 68/push 0/imm32
560 50/push-eax
561
562 e8/call check-ints-equal/disp32
563
564 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
565
566 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
567 5d/pop-to-ebp
568 c3/return
569
570 test-parse-hex-int-0-prefix:
571
572 55/push-ebp
573 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
574
575 b8/copy-to-eax "03"/imm32
576 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
577 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
578 05/add-to-eax 4/imm32
579
580 51/push-ecx
581 50/push-eax
582 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
583
584
585 51/push-ecx
586
587 e8/call parse-hex-int/disp32
588
589 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
590
591
592 68/push "F - test-parse-hex-int-0-prefix"/imm32
593 68/push 0x3/imm32
594 50/push-eax
595
596 e8/call check-ints-equal/disp32
597
598 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
599
600 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
601 5d/pop-to-ebp
602 c3/return
603
604 test-parse-hex-int-negative:
605
606 55/push-ebp
607 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
608
609 b8/copy-to-eax "-03"/imm32
610 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . .
611 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 .
612 05/add-to-eax 4/imm32
613
614 51/push-ecx
615 50/push-eax
616 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . .
617
618
619 51/push-ecx
620
621 e8/call parse-hex-int/disp32
622
623 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
624
625
626 68/push "F - test-parse-hex-int-negative"/imm32
627 68/push -3/imm32
628 50/push-eax
629
630 e8/call check-ints-equal/disp32
631
632 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
633
634 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
635 5d/pop-to-ebp
636 c3/return
637
638 is-hex-digit?:
639
640 55/push-ebp
641 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
642
643 51/push-ecx
644
645 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 8/disp8 .
646
647 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0x30/imm32
648 7c/jump-if-lesser $is-hex-digit?:false/disp8
649
650 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0x39/imm32
651 7e/jump-if-lesser-or-equal $is-hex-digit?:true/disp8
652
653 25/and-eax-with 0x5f/imm32
654
655 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0x66/imm32
656 7f/jump-if-greater $is-hex-digit?:false/disp8
657
658 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0x61/imm32
659 7d/jump-if-greater-or-equal $is-hex-digit?:true/disp8
660
661 $is-hex-digit?:false:
662 b8/copy-to-eax 0/imm32/false
663 eb/jump $is-hex-digit?:end/disp8
664 $is-hex-digit?:true:
665 b8/copy-to-eax 1/imm32/true
666 $is-hex-digit?:end:
667
668 59/pop-to-ecx
669
670 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
671 5d/pop-to-ebp
672 c3/return
673
674 test-hex-below-0:
675
676
677 68/push 0x2f/imm32
678
679 e8/call is-hex-digit?/disp32
680
681 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
682
683
684 68/push "F - test-hex-below-0"/imm32
685 68/push 0/imm32/false
686 50/push-eax
687
688 e8/call check-ints-equal/disp32
689
690 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
691 c3/return
692
693 test-hex-0-to-9:
694
695
696 68/push 0x30/imm32
697
698 e8/call is-hex-digit?/disp32
699
700 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
701
702
703 68/push "F - test-hex-at-0"/imm32
704 68/push 1/imm32/true
705 50/push-eax
706
707 e8/call check-ints-equal/disp32
708
709 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
710
711
712 68/push 0x39/imm32
713
714 e8/call is-hex-digit?/disp32
715
716 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
717
718
719 68/push "F - test-hex-at-9"/imm32
720 68/push 1/imm32/true
721 50/push-eax
722
723 e8/call check-ints-equal/disp32
724
725 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
726 c3/return
727
728 test-hex-above-9-to-a:
729
730
731 68/push 0x3a/imm32
732
733 e8/call is-hex-digit?/disp32
734
735 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
736
737
738 68/push "F - test-hex-above-9-to-a"/imm32
739 68/push 0/imm32/false
740 50/push-eax
741
742 e8/call check-ints-equal/disp32
743
744 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
745 c3/return
746
747 test-hex-a-to-f:
748
749
750 68/push 0x61/imm32
751
752 e8/call is-hex-digit?/disp32
753
754 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
755
756
757 68/push "F - test-hex-at-a"/imm32
758 68/push 1/imm32/true
759 50/push-eax
760
761 e8/call check-ints-equal/disp32
762
763 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
764
765
766 68/push 0x66/imm32
767
768 e8/call is-hex-digit?/disp32
769
770 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
771
772
773 68/push "F - test-hex-at-f"/imm32
774 68/push 1/imm32/true
775 50/push-eax
776
777 e8/call check-ints-equal/disp32
778
779 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
780 c3/return
781
782 test-hex-above-f:
783
784
785 68/push 0x67/imm32
786
787 e8/call is-hex-digit?/disp32
788
789 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
790
791
792 68/push "F - test-hex-above-f"/imm32
793 68/push 0/imm32/false
794 50/push-eax
795
796 e8/call check-ints-equal/disp32
797
798 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
799 c3/return
800
801 from-hex-char:
802 $from-hex-char:check0:
803
804 3d/compare-eax-with 0x30/imm32/0
805 7c/jump-if-lesser $from-hex-char:abort/disp8
806 $from-hex-char:check1:
807
808 3d/compare-eax-with 0x66/imm32/f
809 7f/jump-if-greater $from-hex-char:abort/disp8
810 $from-hex-char:check2:
811
812 3d/compare-eax-with 0x39/imm32/9
813 7f/jump-if-greater $from-hex-char:check3/disp8
814 $from-hex-char:digit:
815
816 2d/subtract-from-eax 0x30/imm32/0
817 c3/return
818 $from-hex-char:check3:
819
820 3d/compare-eax-with 0x61/imm32/a
821 7c/jump-if-lesser $from-hex-char:abort/disp8
822 $from-hex-char:letter:
823
824 2d/subtract-from-eax 0x57/imm32/a-10
825 c3/return
826
827 $from-hex-char:abort:
828
829
830 68/push "invalid hex char: "/imm32
831 68/push 2/imm32/stderr
832
833 e8/call _write/disp32
834
835 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
836
837
838 50/push-eax
839
840 68/push Stderr->buffer/imm32
841
842 e8/call clear-stream/disp32
843
844 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
845
846 58/pop-to-eax
847
848
849 50/push-eax
850 68/push Stderr/imm32
851
852 e8/call print-int32-buffered/disp32
853
854 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
855
856
857 68/push Stderr/imm32
858
859 e8/call flush/disp32
860
861 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32
862
863
864 68/push Newline/imm32
865 68/push 2/imm32/stderr
866
867 e8/call _write/disp32
868
869 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
870
871 bb/copy-to-ebx 1/imm32
872 b8/copy-to-eax 1/imm32/exit
873 cd/syscall 0x80/imm8
874
875
876