From 33cf1f90be1e9d92513775edccf96cf2f5a971b7 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Thu, 6 Dec 2018 00:42:12 -0800 Subject: 4845 --- html/subx/apps/hex.subx.html | 1257 +++++++++++++++++++++--------------------- 1 file changed, 627 insertions(+), 630 deletions(-) (limited to 'html/subx') diff --git a/html/subx/apps/hex.subx.html b/html/subx/apps/hex.subx.html index ddfefd90..f0accae1 100644 --- a/html/subx/apps/hex.subx.html +++ b/html/subx/apps/hex.subx.html @@ -256,636 +256,633 @@ if ('onhashchange' in window) { 191 # if EAX == ' ' continue 192 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0x20/imm32 # compare EAX 193 74/jump-if-equal $scan-next-byte:loop/disp8 -194 $aa: -195 # if EAX == '\t' continue -196 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0x9/imm32 # compare EAX -197 74/jump-if-equal $scan-next-byte:loop/disp8 -198 $bb: -199 # if EAX == '\n' continue -200 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xa/imm32 # compare EAX -201 74/jump-if-equal $scan-next-byte:loop/disp8 -202 $scan-next-byte:check2: -203 # if EAX == '#' skip-until-newline(in) -204 3d/compare-with-EAX 0x23/imm32 -205 75/jump-if-not-equal $scan-next-byte:check3/disp8 -206 $cc: -207 # . skip-until-newline(in) -208 # . . push args -209 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) -210 # . . call -211 e8/call skip-until-newline/disp32 -212 # . . discard args -213 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -214 eb/jump $scan-next-byte:loop/disp8 -215 $scan-next-byte:check3: -216 # TODO: error-byte takes a buffered-file, not a (fd or (address stream)) -217 # otherwise error-byte(ed, err, msg, EAX) -218 # . . push args -219 50/push-EAX -220 68/push "scan-next-byte: invalid byte"/imm32 -221 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) -222 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) -223 # . . call -224 e8/call error-byte/disp32 # never returns -225 $scan-next-byte:end: -226 # . restore registers -227 # . epilog -228 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -229 5d/pop-to-EBP -230 c3/return -231 -232 test-scan-next-byte: -233 # - check that the first two bytes of the input are assembled into the resulting number -234 # setup -235 # . clear-stream(_test-stream) -236 # . . push args -237 68/push _test-stream/imm32 -238 # . . call -239 e8/call clear-stream/disp32 -240 # . . discard args -241 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -242 # . clear-stream(_test-buffered-file+4) -243 # . . push args -244 b8/copy-to-EAX _test-buffered-file/imm32 -245 05/add-to-EAX 4/imm32 -246 50/push-EAX -247 # . . call -248 e8/call clear-stream/disp32 -249 # . . discard args -250 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -251 # initialize '_test-stream' to "abc" -252 # . write(_test-stream, "abc") -253 # . . push args -254 68/push "abc"/imm32 -255 68/push _test-stream/imm32 -256 # . . call -257 e8/call write/disp32 -258 # . . discard args -259 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -260 # scan-next-byte(_test-buffered-file) -261 # . . push args -262 68/push _test-buffered-file/imm32 -263 # . . call -264 e8/call scan-next-byte/disp32 -265 # . . discard args -266 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -267 # check-ints-equal(EAX, 0x61/a, msg) -268 # . . push args -269 68/push "F - test-scan-next-byte"/imm32 -270 68/push 0x61/imm32/a -271 50/push-EAX -272 # . . call -273 e8/call check-ints-equal/disp32 -274 # . . discard args -275 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -276 # . end -277 c3/return -278 -279 test-scan-next-byte-skips-whitespace: -280 # - check that the first two bytes of the input are assembled into the resulting number -281 # setup -282 # . clear-stream(_test-stream) -283 # . . push args -284 68/push _test-stream/imm32 -285 # . . call -286 e8/call clear-stream/disp32 -287 # . . discard args -288 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -289 # . clear-stream(_test-buffered-file+4) -290 # . . push args -291 b8/copy-to-EAX _test-buffered-file/imm32 -292 05/add-to-EAX 4/imm32 -293 50/push-EAX -294 # . . call -295 e8/call clear-stream/disp32 -296 # . . discard args -297 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -298 # initialize '_test-stream' to input with leading whitespace -299 # . write(_test-stream, text) -300 # . . push args -301 68/push " abc"/imm32 -302 68/push _test-stream/imm32 -303 # . . call -304 e8/call write/disp32 -305 # . . discard args -306 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -307 # scan-next-byte(_test-buffered-file) -308 # . . push args -309 68/push _test-buffered-file/imm32 -310 # . . call -311 e8/call scan-next-byte/disp32 -312 # . . discard args -313 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -314 # check-ints-equal(EAX, 0x61/a, msg) -315 # . . push args -316 68/push "F - test-scan-next-byte-skips-whitespace"/imm32 -317 68/push 0x61/imm32/a -318 50/push-EAX -319 # . . call -320 e8/call check-ints-equal/disp32 -321 # . . discard args -322 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -323 # . end -324 c3/return -325 -326 test-scan-next-byte-skips-comment: -327 # - check that the first two bytes of the input are assembled into the resulting number -328 # setup -329 # . clear-stream(_test-stream) -330 # . . push args -331 68/push _test-stream/imm32 -332 # . . call -333 e8/call clear-stream/disp32 -334 # . . discard args -335 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -336 # . clear-stream(_test-buffered-file+4) -337 # . . push args -338 b8/copy-to-EAX _test-buffered-file/imm32 -339 05/add-to-EAX 4/imm32 -340 50/push-EAX -341 # . . call -342 e8/call clear-stream/disp32 -343 # . . discard args -344 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -345 # initialize '_test-stream' to input with leading comment -346 # . write(_test-stream, comment) -347 # . . push args -348 68/push "#x"/imm32 -349 68/push _test-stream/imm32 -350 # . . call -351 e8/call write/disp32 -352 # . . discard args -353 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -354 # . write(_test-stream, Newline) -355 # . . push args -356 68/push Newline/imm32 -357 68/push _test-stream/imm32 -358 # . . call -359 e8/call write/disp32 -360 # . . discard args -361 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -362 # . write(_test-stream, real text) -363 # . . push args -364 68/push "ab"/imm32 -365 68/push _test-stream/imm32 -366 # . . call -367 e8/call write/disp32 -368 # . . discard args -369 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -370 # scan-next-byte(_test-buffered-file) -371 # . . push args -372 68/push _test-buffered-file/imm32 -373 # . . call -374 e8/call scan-next-byte/disp32 -375 # . . discard args -376 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -377 # check-ints-equal(EAX, 0x61/a, msg) -378 # . . push args -379 68/push "F - test-scan-next-byte-skips-comment"/imm32 -380 68/push 0x61/imm32/a -381 50/push-EAX -382 # . . call -383 e8/call check-ints-equal/disp32 -384 # . . discard args -385 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -386 # . end -387 c3/return -388 -389 test-scan-next-byte-skips-comment-and-whitespace: -390 # - check that the first two bytes of the input are assembled into the resulting number -391 # setup -392 # . clear-stream(_test-stream) -393 # . . push args -394 68/push _test-stream/imm32 -395 # . . call -396 e8/call clear-stream/disp32 -397 # . . discard args -398 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -399 # . clear-stream(_test-buffered-file+4) -400 # . . push args -401 b8/copy-to-EAX _test-buffered-file/imm32 -402 05/add-to-EAX 4/imm32 -403 50/push-EAX -404 # . . call -405 e8/call clear-stream/disp32 -406 # . . discard args -407 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -408 # initialize '_test-stream' to input with leading comment and more whitespace after newline -409 # . write(_test-stream, comment) -410 # . . push args -411 68/push "#x"/imm32 -412 68/push _test-stream/imm32 -413 # . . call -414 e8/call write/disp32 -415 # . . discard args -416 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -417 # . write(_test-stream, Newline) -418 # . . push args -419 68/push Newline/imm32 -420 68/push _test-stream/imm32 -421 # . . call -422 e8/call write/disp32 -423 # . . discard args -424 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -425 # . write(_test-stream, real text) -426 # . . push args -427 68/push " ab"/imm32 -428 68/push _test-stream/imm32 -429 # . . call -430 e8/call write/disp32 -431 # . . discard args -432 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -433 # scan-next-byte(_test-buffered-file) -434 # . . push args -435 68/push _test-buffered-file/imm32 -436 # . . call -437 e8/call scan-next-byte/disp32 -438 # . . discard args -439 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -440 # check-ints-equal(EAX, 0x61/a, msg) -441 # . . push args -442 68/push "F - test-scan-next-byte-skips-comment"/imm32 -443 68/push 0x61/imm32/a -444 50/push-EAX -445 # . . call -446 e8/call check-ints-equal/disp32 -447 # . . discard args -448 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -449 # . end -450 c3/return -451 -452 test-scan-next-byte-skips-whitespace-and-comment: -453 # - check that the first two bytes of the input are assembled into the resulting number -454 # setup -455 # . clear-stream(_test-stream) -456 # . . push args -457 68/push _test-stream/imm32 -458 # . . call -459 e8/call clear-stream/disp32 -460 # . . discard args -461 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -462 # . clear-stream(_test-buffered-file+4) -463 # . . push args -464 b8/copy-to-EAX _test-buffered-file/imm32 -465 05/add-to-EAX 4/imm32 -466 50/push-EAX -467 # . . call -468 e8/call clear-stream/disp32 -469 # . . discard args -470 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -471 # initialize '_test-stream' to input with leading whitespace and comment -472 # . write(_test-stream, comment) -473 # . . push args -474 68/push " #x"/imm32 -475 68/push _test-stream/imm32 -476 # . . call -477 e8/call write/disp32 -478 # . . discard args -479 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -480 # . write(_test-stream, Newline) -481 # . . push args -482 68/push Newline/imm32 -483 68/push _test-stream/imm32 -484 # . . call -485 e8/call write/disp32 -486 # . . discard args -487 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -488 # . write(_test-stream, real text) -489 # . . push args -490 68/push "ab"/imm32 -491 68/push _test-stream/imm32 -492 # . . call -493 e8/call write/disp32 -494 # . . discard args -495 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -496 # scan-next-byte(_test-buffered-file) -497 # . . push args -498 68/push _test-buffered-file/imm32 -499 # . . call -500 e8/call scan-next-byte/disp32 -501 # . . discard args -502 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -503 # check-ints-equal(EAX, 0x61/a, msg) -504 # . . push args -505 68/push "F - test-scan-next-byte-skips-comment"/imm32 -506 68/push 0x61/imm32/a -507 50/push-EAX -508 # . . call -509 e8/call check-ints-equal/disp32 -510 # . . discard args -511 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -512 # . end -513 c3/return -514 -515 test-scan-next-byte-reads-final-byte: -516 # - check that the first two bytes of the input are assembled into the resulting number -517 # setup -518 # . clear-stream(_test-stream) -519 # . . push args -520 68/push _test-stream/imm32 -521 # . . call -522 e8/call clear-stream/disp32 -523 # . . discard args -524 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -525 # . clear-stream(_test-buffered-file+4) -526 # . . push args -527 b8/copy-to-EAX _test-buffered-file/imm32 -528 05/add-to-EAX 4/imm32 -529 50/push-EAX -530 # . . call -531 e8/call clear-stream/disp32 -532 # . . discard args -533 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -534 # initialize '_test-stream' to input with single character -535 # . write(_test-stream, character) -536 # . . push args -537 68/push "a"/imm32 -538 68/push _test-stream/imm32 -539 # . . call -540 e8/call write/disp32 -541 # . . discard args -542 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -543 # scan-next-byte(_test-buffered-file) -544 # . . push args -545 68/push _test-buffered-file/imm32 -546 # . . call -547 e8/call scan-next-byte/disp32 -548 # . . discard args -549 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -550 # check-ints-equal(EAX, 0x61/a, msg) -551 # . . push args -552 68/push "F - test-scan-next-byte-skips-comment"/imm32 -553 68/push 0x61/imm32/a -554 50/push-EAX -555 # . . call -556 e8/call check-ints-equal/disp32 -557 # . . discard args -558 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -559 # . end -560 c3/return -561 -562 is-hex-lowercase-byte?: # c : byte -> bool/EAX -563 # . prolog -564 55/push-EBP -565 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -566 # . save registers -567 51/push-ECX -568 # ECX = c -569 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0x8/disp8 . # copy *(EBP+8) to ECX -570 # return false if c < '0' -571 b8/copy-to-EAX 0/imm32/false -572 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x30/imm32 # compare ECX -573 7c/jump-if-lesser $is-hex-lowercase-byte?:end/disp8 -574 # return false if c > 'f' -575 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x66/imm32 # compare ECX -576 7f/jump-if-greater $is-hex-lowercase-byte?:end/disp8 -577 # return true if c <= '9' -578 b8/copy-to-EAX 1/imm32/true -579 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x39/imm32 # compare ECX -580 7e/jump-if-lesser-or-equal $is-hex-lowercase-byte?:end/disp8 -581 # return true if c >= 'a' -582 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x61/imm32 # compare ECX -583 7d/jump-if-greater-or-equal $is-hex-lowercase-byte?:end/disp8 -584 # otherwise return false -585 b8/copy-to-EAX 0/imm32/false -586 $is-hex-lowercase-byte?:end: -587 # . restore registers -588 59/pop-to-ECX -589 # . epilog -590 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -591 5d/pop-to-EBP -592 c3/return -593 -594 test-hex-below-0: -595 # is-hex-lowercase-byte?(0x2f) -596 # . . push args -597 68/push 0x2f/imm32 -598 # . . call -599 e8/call is-hex-lowercase-byte?/disp32 -600 # . . discard args -601 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -602 # check-ints-equal(EAX, 0, msg) -603 # . . push args -604 68/push "F - test-hex-below-0"/imm32 -605 68/push 0/imm32/false -606 50/push-EAX -607 # . . call -608 e8/call check-ints-equal/disp32 -609 # . . discard args -610 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -611 c3/return -612 -613 test-hex-0-to-9: -614 # is-hex-lowercase-byte?(0x30) -615 # . . push args -616 68/push 0x30/imm32 -617 # . . call -618 e8/call is-hex-lowercase-byte?/disp32 -619 # . . discard args -620 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -621 # check-ints-equal(EAX, 1, msg) -622 # . . push args -623 68/push "F - test-hex-at-0"/imm32 -624 68/push 1/imm32/true -625 50/push-EAX -626 # . . call -627 e8/call check-ints-equal/disp32 -628 # . . discard args -629 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -630 # is-hex-lowercase-byte?(0x39) -631 # . . push args -632 68/push 0x39/imm32 -633 # . . call -634 e8/call is-hex-lowercase-byte?/disp32 -635 # . . discard args -636 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -637 # check-ints-equal(EAX, 1, msg) -638 # . . push args -639 68/push "F - test-hex-at-9"/imm32 -640 68/push 1/imm32/true -641 50/push-EAX -642 # . . call -643 e8/call check-ints-equal/disp32 -644 # . . discard args -645 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -646 c3/return -647 -648 test-hex-above-9-to-a: -649 # is-hex-lowercase-byte?(0x3a) -650 # . . push args -651 68/push 0x3a/imm32 -652 # . . call -653 e8/call is-hex-lowercase-byte?/disp32 -654 # . . discard args -655 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -656 # check-ints-equal(EAX, 0, msg) -657 # . . push args -658 68/push "F - test-hex-above-9-to-a"/imm32 -659 68/push 0/imm32/false -660 50/push-EAX -661 # . . call -662 e8/call check-ints-equal/disp32 -663 # . . discard args -664 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -665 c3/return -666 -667 test-hex-a-to-f: -668 # is-hex-lowercase-byte?(0x61) -669 # . . push args -670 68/push 0x61/imm32 -671 # . . call -672 e8/call is-hex-lowercase-byte?/disp32 -673 # . . discard args -674 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -675 # check-ints-equal(EAX, 1, msg) -676 # . . push args -677 68/push "F - test-hex-at-a"/imm32 -678 68/push 1/imm32/true -679 50/push-EAX -680 # . . call -681 e8/call check-ints-equal/disp32 -682 # . . discard args -683 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -684 # is-hex-lowercase-byte?(0x66) -685 # . . push args -686 68/push 0x66/imm32 -687 # . . call -688 e8/call is-hex-lowercase-byte?/disp32 -689 # . . discard args -690 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -691 # check-ints-equal(EAX, 1, msg) -692 # . . push args -693 68/push "F - test-hex-at-f"/imm32 -694 68/push 1/imm32/true -695 50/push-EAX -696 # . . call -697 e8/call check-ints-equal/disp32 -698 # . . discard args -699 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -700 c3/return -701 -702 test-hex-above-f: -703 # is-hex-lowercase-byte?(0x67) -704 # . . push args -705 68/push 0x67/imm32 -706 # . . call -707 e8/call is-hex-lowercase-byte?/disp32 -708 # . . discard args -709 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -710 # check-ints-equal(EAX, 0, msg) -711 # . . push args -712 68/push "F - test-hex-above-f"/imm32 -713 68/push 0/imm32/false -714 50/push-EAX -715 # . . call -716 e8/call check-ints-equal/disp32 -717 # . . discard args -718 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -719 c3/return -720 -721 skip-until-newline: # in : (address buffered-file) -> <void> -722 # pseudocode: -723 # push EAX -724 # repeatedly: -725 # EAX = read-byte(in) -726 # if EAX == 0xffffffff break -727 # if EAX == 0x0a break -728 # pop EAX -729 # . prolog -730 55/push-EBP -731 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -732 # . save registers -733 50/push-EAX -734 $skip-until-newline:loop: -735 # . EAX = read-byte(in) -736 # . . push args -737 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) -738 # . . call -739 e8/call read-byte/disp32 -740 # . . discard args -741 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -742 # . if EAX == 0xffffffff break -743 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xffffffff/imm32 # compare EAX -744 74/jump-if-equal $skip-until-newline:end/disp8 -745 $aa: -746 # . if EAX != 0xa/newline loop -747 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xa/imm32 # compare EAX -748 75/jump-if-not-equal $skip-until-newline:loop/disp8 -749 $skip-until-newline:end: -750 # . restore registers -751 58/pop-to-EAX -752 # . epilog -753 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -754 5d/pop-to-EBP -755 c3/return -756 -757 test-skip-until-newline: -758 # - check that the read pointer points after the newline -759 # setup -760 # . clear-stream(_test-stream) -761 # . . push args -762 68/push _test-stream/imm32 -763 # . . call -764 e8/call clear-stream/disp32 -765 # . . discard args -766 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -767 # . clear-stream(_test-buffered-file+4) -768 # . . push args -769 b8/copy-to-EAX _test-buffered-file/imm32 -770 05/add-to-EAX 4/imm32 -771 50/push-EAX -772 # . . call -773 e8/call clear-stream/disp32 -774 # . . discard args -775 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -776 # initialize '_test-stream' to "abc\nde" -777 # . write(_test-stream, "abc") -778 # . . push args -779 68/push "abc"/imm32 -780 68/push _test-stream/imm32 -781 # . . call -782 e8/call write/disp32 -783 # . . discard args -784 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -785 # . write(_test-stream, Newline) -786 # . . push args -787 68/push Newline/imm32 -788 68/push _test-stream/imm32 -789 # . . call -790 e8/call write/disp32 -791 # . . discard args -792 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -793 # . write(_test-stream, "de") -794 # . . push args -795 68/push "de"/imm32 -796 68/push _test-stream/imm32 -797 # . . call -798 e8/call write/disp32 -799 # . . discard args -800 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -801 # skip-until-newline(_test-buffered-file) -802 # . . push args -803 68/push _test-buffered-file/imm32 -804 # . . call -805 e8/call skip-until-newline/disp32 -806 # . . discard args -807 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -808 # check-ints-equal(_test-buffered-file->read, 4, msg) -809 # . . push args -810 68/push "F - test-skip-until-newline"/imm32 -811 68/push 4/imm32 -812 b8/copy-to-EAX _test-buffered-file/imm32 -813 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 . # push *(EAX+8) -814 # . . call -815 e8/call check-ints-equal/disp32 -816 # . . discard args -817 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -818 # . end -819 c3/return -820 -821 == data -822 -823 # . . vim:nowrap:textwidth=0 +194 # if EAX == '\t' continue +195 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0x9/imm32 # compare EAX +196 74/jump-if-equal $scan-next-byte:loop/disp8 +197 # if EAX == '\n' continue +198 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xa/imm32 # compare EAX +199 74/jump-if-equal $scan-next-byte:loop/disp8 +200 $scan-next-byte:check2: +201 # if EAX == '#' skip-until-newline(in) +202 3d/compare-with-EAX 0x23/imm32 +203 75/jump-if-not-equal $scan-next-byte:check3/disp8 +204 # . skip-until-newline(in) +205 # . . push args +206 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) +207 # . . call +208 e8/call skip-until-newline/disp32 +209 # . . discard args +210 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +211 eb/jump $scan-next-byte:loop/disp8 +212 $scan-next-byte:check3: +213 # TODO: error-byte takes a buffered-file, not a (fd or (address stream)) +214 # otherwise error-byte(ed, err, msg, EAX) +215 # . . push args +216 50/push-EAX +217 68/push "scan-next-byte: invalid byte"/imm32 +218 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) +219 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) +220 # . . call +221 e8/call error-byte/disp32 # never returns +222 $scan-next-byte:end: +223 # . restore registers +224 # . epilog +225 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +226 5d/pop-to-EBP +227 c3/return +228 +229 test-scan-next-byte: +230 # - check that the first two bytes of the input are assembled into the resulting number +231 # setup +232 # . clear-stream(_test-stream) +233 # . . push args +234 68/push _test-stream/imm32 +235 # . . call +236 e8/call clear-stream/disp32 +237 # . . discard args +238 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +239 # . clear-stream(_test-buffered-file+4) +240 # . . push args +241 b8/copy-to-EAX _test-buffered-file/imm32 +242 05/add-to-EAX 4/imm32 +243 50/push-EAX +244 # . . call +245 e8/call clear-stream/disp32 +246 # . . discard args +247 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +248 # initialize '_test-stream' to "abc" +249 # . write(_test-stream, "abc") +250 # . . push args +251 68/push "abc"/imm32 +252 68/push _test-stream/imm32 +253 # . . call +254 e8/call write/disp32 +255 # . . discard args +256 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +257 # scan-next-byte(_test-buffered-file) +258 # . . push args +259 68/push _test-buffered-file/imm32 +260 # . . call +261 e8/call scan-next-byte/disp32 +262 # . . discard args +263 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +264 # check-ints-equal(EAX, 0x61/a, msg) +265 # . . push args +266 68/push "F - test-scan-next-byte"/imm32 +267 68/push 0x61/imm32/a +268 50/push-EAX +269 # . . call +270 e8/call check-ints-equal/disp32 +271 # . . discard args +272 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +273 # . end +274 c3/return +275 +276 test-scan-next-byte-skips-whitespace: +277 # - check that the first two bytes of the input are assembled into the resulting number +278 # setup +279 # . clear-stream(_test-stream) +280 # . . push args +281 68/push _test-stream/imm32 +282 # . . call +283 e8/call clear-stream/disp32 +284 # . . discard args +285 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +286 # . clear-stream(_test-buffered-file+4) +287 # . . push args +288 b8/copy-to-EAX _test-buffered-file/imm32 +289 05/add-to-EAX 4/imm32 +290 50/push-EAX +291 # . . call +292 e8/call clear-stream/disp32 +293 # . . discard args +294 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +295 # initialize '_test-stream' to input with leading whitespace +296 # . write(_test-stream, text) +297 # . . push args +298 68/push " abc"/imm32 +299 68/push _test-stream/imm32 +300 # . . call +301 e8/call write/disp32 +302 # . . discard args +303 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +304 # scan-next-byte(_test-buffered-file) +305 # . . push args +306 68/push _test-buffered-file/imm32 +307 # . . call +308 e8/call scan-next-byte/disp32 +309 # . . discard args +310 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +311 # check-ints-equal(EAX, 0x61/a, msg) +312 # . . push args +313 68/push "F - test-scan-next-byte-skips-whitespace"/imm32 +314 68/push 0x61/imm32/a +315 50/push-EAX +316 # . . call +317 e8/call check-ints-equal/disp32 +318 # . . discard args +319 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +320 # . end +321 c3/return +322 +323 test-scan-next-byte-skips-comment: +324 # - check that the first two bytes of the input are assembled into the resulting number +325 # setup +326 # . clear-stream(_test-stream) +327 # . . push args +328 68/push _test-stream/imm32 +329 # . . call +330 e8/call clear-stream/disp32 +331 # . . discard args +332 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +333 # . clear-stream(_test-buffered-file+4) +334 # . . push args +335 b8/copy-to-EAX _test-buffered-file/imm32 +336 05/add-to-EAX 4/imm32 +337 50/push-EAX +338 # . . call +339 e8/call clear-stream/disp32 +340 # . . discard args +341 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +342 # initialize '_test-stream' to input with leading comment +343 # . write(_test-stream, comment) +344 # . . push args +345 68/push "#x"/imm32 +346 68/push _test-stream/imm32 +347 # . . call +348 e8/call write/disp32 +349 # . . discard args +350 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +351 # . write(_test-stream, Newline) +352 # . . push args +353 68/push Newline/imm32 +354 68/push _test-stream/imm32 +355 # . . call +356 e8/call write/disp32 +357 # . . discard args +358 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +359 # . write(_test-stream, real text) +360 # . . push args +361 68/push "ab"/imm32 +362 68/push _test-stream/imm32 +363 # . . call +364 e8/call write/disp32 +365 # . . discard args +366 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +367 # scan-next-byte(_test-buffered-file) +368 # . . push args +369 68/push _test-buffered-file/imm32 +370 # . . call +371 e8/call scan-next-byte/disp32 +372 # . . discard args +373 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +374 # check-ints-equal(EAX, 0x61/a, msg) +375 # . . push args +376 68/push "F - test-scan-next-byte-skips-comment"/imm32 +377 68/push 0x61/imm32/a +378 50/push-EAX +379 # . . call +380 e8/call check-ints-equal/disp32 +381 # . . discard args +382 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +383 # . end +384 c3/return +385 +386 test-scan-next-byte-skips-comment-and-whitespace: +387 # - check that the first two bytes of the input are assembled into the resulting number +388 # setup +389 # . clear-stream(_test-stream) +390 # . . push args +391 68/push _test-stream/imm32 +392 # . . call +393 e8/call clear-stream/disp32 +394 # . . discard args +395 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +396 # . clear-stream(_test-buffered-file+4) +397 # . . push args +398 b8/copy-to-EAX _test-buffered-file/imm32 +399 05/add-to-EAX 4/imm32 +400 50/push-EAX +401 # . . call +402 e8/call clear-stream/disp32 +403 # . . discard args +404 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +405 # initialize '_test-stream' to input with leading comment and more whitespace after newline +406 # . write(_test-stream, comment) +407 # . . push args +408 68/push "#x"/imm32 +409 68/push _test-stream/imm32 +410 # . . call +411 e8/call write/disp32 +412 # . . discard args +413 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +414 # . write(_test-stream, Newline) +415 # . . push args +416 68/push Newline/imm32 +417 68/push _test-stream/imm32 +418 # . . call +419 e8/call write/disp32 +420 # . . discard args +421 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +422 # . write(_test-stream, real text) +423 # . . push args +424 68/push " ab"/imm32 +425 68/push _test-stream/imm32 +426 # . . call +427 e8/call write/disp32 +428 # . . discard args +429 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +430 # scan-next-byte(_test-buffered-file) +431 # . . push args +432 68/push _test-buffered-file/imm32 +433 # . . call +434 e8/call scan-next-byte/disp32 +435 # . . discard args +436 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +437 # check-ints-equal(EAX, 0x61/a, msg) +438 # . . push args +439 68/push "F - test-scan-next-byte-skips-comment"/imm32 +440 68/push 0x61/imm32/a +441 50/push-EAX +442 # . . call +443 e8/call check-ints-equal/disp32 +444 # . . discard args +445 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +446 # . end +447 c3/return +448 +449 test-scan-next-byte-skips-whitespace-and-comment: +450 # - check that the first two bytes of the input are assembled into the resulting number +451 # setup +452 # . clear-stream(_test-stream) +453 # . . push args +454 68/push _test-stream/imm32 +455 # . . call +456 e8/call clear-stream/disp32 +457 # . . discard args +458 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +459 # . clear-stream(_test-buffered-file+4) +460 # . . push args +461 b8/copy-to-EAX _test-buffered-file/imm32 +462 05/add-to-EAX 4/imm32 +463 50/push-EAX +464 # . . call +465 e8/call clear-stream/disp32 +466 # . . discard args +467 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +468 # initialize '_test-stream' to input with leading whitespace and comment +469 # . write(_test-stream, comment) +470 # . . push args +471 68/push " #x"/imm32 +472 68/push _test-stream/imm32 +473 # . . call +474 e8/call write/disp32 +475 # . . discard args +476 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +477 # . write(_test-stream, Newline) +478 # . . push args +479 68/push Newline/imm32 +480 68/push _test-stream/imm32 +481 # . . call +482 e8/call write/disp32 +483 # . . discard args +484 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +485 # . write(_test-stream, real text) +486 # . . push args +487 68/push "ab"/imm32 +488 68/push _test-stream/imm32 +489 # . . call +490 e8/call write/disp32 +491 # . . discard args +492 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +493 # scan-next-byte(_test-buffered-file) +494 # . . push args +495 68/push _test-buffered-file/imm32 +496 # . . call +497 e8/call scan-next-byte/disp32 +498 # . . discard args +499 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +500 # check-ints-equal(EAX, 0x61/a, msg) +501 # . . push args +502 68/push "F - test-scan-next-byte-skips-comment"/imm32 +503 68/push 0x61/imm32/a +504 50/push-EAX +505 # . . call +506 e8/call check-ints-equal/disp32 +507 # . . discard args +508 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +509 # . end +510 c3/return +511 +512 test-scan-next-byte-reads-final-byte: +513 # - check that the first two bytes of the input are assembled into the resulting number +514 # setup +515 # . clear-stream(_test-stream) +516 # . . push args +517 68/push _test-stream/imm32 +518 # . . call +519 e8/call clear-stream/disp32 +520 # . . discard args +521 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +522 # . clear-stream(_test-buffered-file+4) +523 # . . push args +524 b8/copy-to-EAX _test-buffered-file/imm32 +525 05/add-to-EAX 4/imm32 +526 50/push-EAX +527 # . . call +528 e8/call clear-stream/disp32 +529 # . . discard args +530 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +531 # initialize '_test-stream' to input with single character +532 # . write(_test-stream, character) +533 # . . push args +534 68/push "a"/imm32 +535 68/push _test-stream/imm32 +536 # . . call +537 e8/call write/disp32 +538 # . . discard args +539 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +540 # scan-next-byte(_test-buffered-file) +541 # . . push args +542 68/push _test-buffered-file/imm32 +543 # . . call +544 e8/call scan-next-byte/disp32 +545 # . . discard args +546 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +547 # check-ints-equal(EAX, 0x61/a, msg) +548 # . . push args +549 68/push "F - test-scan-next-byte-skips-comment"/imm32 +550 68/push 0x61/imm32/a +551 50/push-EAX +552 # . . call +553 e8/call check-ints-equal/disp32 +554 # . . discard args +555 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +556 # . end +557 c3/return +558 +559 is-hex-lowercase-byte?: # c : byte -> bool/EAX +560 # . prolog +561 55/push-EBP +562 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +563 # . save registers +564 51/push-ECX +565 # ECX = c +566 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0x8/disp8 . # copy *(EBP+8) to ECX +567 # return false if c < '0' +568 b8/copy-to-EAX 0/imm32/false +569 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x30/imm32 # compare ECX +570 7c/jump-if-lesser $is-hex-lowercase-byte?:end/disp8 +571 # return false if c > 'f' +572 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x66/imm32 # compare ECX +573 7f/jump-if-greater $is-hex-lowercase-byte?:end/disp8 +574 # return true if c <= '9' +575 b8/copy-to-EAX 1/imm32/true +576 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x39/imm32 # compare ECX +577 7e/jump-if-lesser-or-equal $is-hex-lowercase-byte?:end/disp8 +578 # return true if c >= 'a' +579 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x61/imm32 # compare ECX +580 7d/jump-if-greater-or-equal $is-hex-lowercase-byte?:end/disp8 +581 # otherwise return false +582 b8/copy-to-EAX 0/imm32/false +583 $is-hex-lowercase-byte?:end: +584 # . restore registers +585 59/pop-to-ECX +586 # . epilog +587 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +588 5d/pop-to-EBP +589 c3/return +590 +591 test-hex-below-0: +592 # is-hex-lowercase-byte?(0x2f) +593 # . . push args +594 68/push 0x2f/imm32 +595 # . . call +596 e8/call is-hex-lowercase-byte?/disp32 +597 # . . discard args +598 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +599 # check-ints-equal(EAX, 0, msg) +600 # . . push args +601 68/push "F - test-hex-below-0"/imm32 +602 68/push 0/imm32/false +603 50/push-EAX +604 # . . call +605 e8/call check-ints-equal/disp32 +606 # . . discard args +607 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +608 c3/return +609 +610 test-hex-0-to-9: +611 # is-hex-lowercase-byte?(0x30) +612 # . . push args +613 68/push 0x30/imm32 +614 # . . call +615 e8/call is-hex-lowercase-byte?/disp32 +616 # . . discard args +617 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +618 # check-ints-equal(EAX, 1, msg) +619 # . . push args +620 68/push "F - test-hex-at-0"/imm32 +621 68/push 1/imm32/true +622 50/push-EAX +623 # . . call +624 e8/call check-ints-equal/disp32 +625 # . . discard args +626 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +627 # is-hex-lowercase-byte?(0x39) +628 # . . push args +629 68/push 0x39/imm32 +630 # . . call +631 e8/call is-hex-lowercase-byte?/disp32 +632 # . . discard args +633 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +634 # check-ints-equal(EAX, 1, msg) +635 # . . push args +636 68/push "F - test-hex-at-9"/imm32 +637 68/push 1/imm32/true +638 50/push-EAX +639 # . . call +640 e8/call check-ints-equal/disp32 +641 # . . discard args +642 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +643 c3/return +644 +645 test-hex-above-9-to-a: +646 # is-hex-lowercase-byte?(0x3a) +647 # . . push args +648 68/push 0x3a/imm32 +649 # . . call +650 e8/call is-hex-lowercase-byte?/disp32 +651 # . . discard args +652 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +653 # check-ints-equal(EAX, 0, msg) +654 # . . push args +655 68/push "F - test-hex-above-9-to-a"/imm32 +656 68/push 0/imm32/false +657 50/push-EAX +658 # . . call +659 e8/call check-ints-equal/disp32 +660 # . . discard args +661 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +662 c3/return +663 +664 test-hex-a-to-f: +665 # is-hex-lowercase-byte?(0x61) +666 # . . push args +667 68/push 0x61/imm32 +668 # . . call +669 e8/call is-hex-lowercase-byte?/disp32 +670 # . . discard args +671 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +672 # check-ints-equal(EAX, 1, msg) +673 # . . push args +674 68/push "F - test-hex-at-a"/imm32 +675 68/push 1/imm32/true +676 50/push-EAX +677 # . . call +678 e8/call check-ints-equal/disp32 +679 # . . discard args +680 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +681 # is-hex-lowercase-byte?(0x66) +682 # . . push args +683 68/push 0x66/imm32 +684 # . . call +685 e8/call is-hex-lowercase-byte?/disp32 +686 # . . discard args +687 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +688 # check-ints-equal(EAX, 1, msg) +689 # . . push args +690 68/push "F - test-hex-at-f"/imm32 +691 68/push 1/imm32/true +692 50/push-EAX +693 # . . call +694 e8/call check-ints-equal/disp32 +695 # . . discard args +696 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +697 c3/return +698 +699 test-hex-above-f: +700 # is-hex-lowercase-byte?(0x67) +701 # . . push args +702 68/push 0x67/imm32 +703 # . . call +704 e8/call is-hex-lowercase-byte?/disp32 +705 # . . discard args +706 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +707 # check-ints-equal(EAX, 0, msg) +708 # . . push args +709 68/push "F - test-hex-above-f"/imm32 +710 68/push 0/imm32/false +711 50/push-EAX +712 # . . call +713 e8/call check-ints-equal/disp32 +714 # . . discard args +715 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +716 c3/return +717 +718 skip-until-newline: # in : (address buffered-file) -> <void> +719 # pseudocode: +720 # push EAX +721 # repeatedly: +722 # EAX = read-byte(in) +723 # if EAX == 0xffffffff break +724 # if EAX == 0x0a break +725 # pop EAX +726 # . prolog +727 55/push-EBP +728 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +729 # . save registers +730 50/push-EAX +731 $skip-until-newline:loop: +732 # . EAX = read-byte(in) +733 # . . push args +734 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x8/disp8 . # push *(EBP+8) +735 # . . call +736 e8/call read-byte/disp32 +737 # . . discard args +738 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +739 # . if EAX == 0xffffffff break +740 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xffffffff/imm32 # compare EAX +741 74/jump-if-equal $skip-until-newline:end/disp8 +742 $aa: +743 # . if EAX != 0xa/newline loop +744 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0xa/imm32 # compare EAX +745 75/jump-if-not-equal $skip-until-newline:loop/disp8 +746 $skip-until-newline:end: +747 # . restore registers +748 58/pop-to-EAX +749 # . epilog +750 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +751 5d/pop-to-EBP +752 c3/return +753 +754 test-skip-until-newline: +755 # - check that the read pointer points after the newline +756 # setup +757 # . clear-stream(_test-stream) +758 # . . push args +759 68/push _test-stream/imm32 +760 # . . call +761 e8/call clear-stream/disp32 +762 # . . discard args +763 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +764 # . clear-stream(_test-buffered-file+4) +765 # . . push args +766 b8/copy-to-EAX _test-buffered-file/imm32 +767 05/add-to-EAX 4/imm32 +768 50/push-EAX +769 # . . call +770 e8/call clear-stream/disp32 +771 # . . discard args +772 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +773 # initialize '_test-stream' to "abc\nde" +774 # . write(_test-stream, "abc") +775 # . . push args +776 68/push "abc"/imm32 +777 68/push _test-stream/imm32 +778 # . . call +779 e8/call write/disp32 +780 # . . discard args +781 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +782 # . write(_test-stream, Newline) +783 # . . push args +784 68/push Newline/imm32 +785 68/push _test-stream/imm32 +786 # . . call +787 e8/call write/disp32 +788 # . . discard args +789 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +790 # . write(_test-stream, "de") +791 # . . push args +792 68/push "de"/imm32 +793 68/push _test-stream/imm32 +794 # . . call +795 e8/call write/disp32 +796 # . . discard args +797 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +798 # skip-until-newline(_test-buffered-file) +799 # . . push args +800 68/push _test-buffered-file/imm32 +801 # . . call +802 e8/call skip-until-newline/disp32 +803 # . . discard args +804 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +805 # check-ints-equal(_test-buffered-file->read, 4, msg) +806 # . . push args +807 68/push "F - test-skip-until-newline"/imm32 +808 68/push 4/imm32 +809 b8/copy-to-EAX _test-buffered-file/imm32 +810 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 8/disp8 . # push *(EAX+8) +811 # . . call +812 e8/call check-ints-equal/disp32 +813 # . . discard args +814 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +815 # . end +816 c3/return +817 +818 == data +819 +820 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0