From 999c529cb972079df3bc693945be34a77336ddf4 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 26 Oct 2019 23:51:14 -0700 Subject: 5716 --- html/apps/crenshaw2-1.subx.html | 520 ++++++++++++++++++++-------------------- 1 file changed, 258 insertions(+), 262 deletions(-) (limited to 'html/apps/crenshaw2-1.subx.html') diff --git a/html/apps/crenshaw2-1.subx.html b/html/apps/crenshaw2-1.subx.html index 088a688d..bf85749b 100644 --- a/html/apps/crenshaw2-1.subx.html +++ b/html/apps/crenshaw2-1.subx.html @@ -163,7 +163,7 @@ if ('onhashchange' in window) { 102 # . . push args 103 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 104 # . . call -105 e8/call get-char/disp32 +105 e8/call get-char/disp32 106 # . . discard args 107 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 108 # var num/ecx : (address stream) on the stack @@ -277,9 +277,9 @@ if ('onhashchange' in window) { 216 # - if (is-digit?(Look)) expected(ed, err, "integer") 217 # . eax = is-digit?(Look) 218 # . . push args -219 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Look/disp32 . # push *Look +219 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Look/disp32 . # push *Look 220 # . . call -221 e8/call is-digit?/disp32 +221 e8/call is-digit?/disp32 222 # . . discard args 223 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 224 # . if (eax == 0) @@ -291,7 +291,7 @@ if ('onhashchange' in window) { 230 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 . # push *(ebp+16) 231 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x14/disp8 . # push *(ebp+20) 232 # . . call -233 e8/call expected/disp32 # never returns +233 e8/call expected/disp32 # never returns 234 # . . discard args 235 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 236 $get-num:main: @@ -327,7 +327,7 @@ if ('onhashchange' in window) { 266 $get-num:stage2: 267 # out->data[out->write] = LSB(Look) 268 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 1/index/ecx . 3/r32/ebx 0xc/disp8 . # copy edi+ecx+12 to ebx -269 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/eax Look/disp32 . # copy *Look to eax +269 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/eax Look/disp32 . # copy *Look to eax 270 88/copy-byte 0/mod/indirect 3/rm32/ebx . . . 0/r32/AL . . # copy byte at AL to *ebx 271 # ++out->write 272 41/increment-ecx @@ -335,7 +335,7 @@ if ('onhashchange' in window) { 274 # . . push args 275 56/push-esi 276 # . . call -277 e8/call get-char/disp32 +277 e8/call get-char/disp32 278 # . . discard args 279 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 280 $get-num:loop-end: @@ -367,263 +367,259 @@ if ('onhashchange' in window) { 306 e8/call clear-stream/disp32 307 # . . discard args 308 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -309 # . clear-stream(_test-buffered-file+4) +309 # . clear-stream(_test-buffered-file->buffer) 310 # . . push args -311 b8/copy-to-eax _test-buffered-file/imm32 -312 05/add-to-eax 4/imm32 -313 50/push-eax -314 # . . call -315 e8/call clear-stream/disp32 -316 # . . discard args -317 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -318 # . clear-stream(_test-output-stream) -319 # . . push args -320 68/push _test-output-stream/imm32 -321 # . . call -322 e8/call clear-stream/disp32 -323 # . . discard args -324 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -325 # . clear-stream(_test-error-stream) -326 # . . push args -327 68/push _test-error-stream/imm32 -328 # . . call -329 e8/call clear-stream/disp32 -330 # . . discard args -331 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -332 # initialize 'in' -333 # . write(_test-stream, "3") -334 # . . push args -335 68/push "3"/imm32 -336 68/push _test-stream/imm32 -337 # . . call -338 e8/call write/disp32 -339 # . . discard args -340 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -341 # initialize exit-descriptor 'ed' for the call to 'get-num' below -342 # . var ed/eax : exit-descriptor -343 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # subtract from esp -344 89/copy 3/mod/direct 0/rm32/eax . . . 4/r32/esp . . # copy esp to eax -345 # . tailor-exit-descriptor(ed, 16) -346 # . . push args -347 68/push 0x10/imm32/nbytes-of-args-for-get-num -348 50/push-eax/ed -349 # . . call -350 e8/call tailor-exit-descriptor/disp32 -351 # . . discard args -352 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -353 # prime the pump -354 # . get-char(_test-buffered-file) -355 # . . push args -356 68/push _test-buffered-file/imm32 -357 # . . call -358 e8/call get-char/disp32 -359 # . . discard args -360 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -361 # get-num(in, out, err, ed) -362 # . . push args -363 50/push-eax/ed -364 68/push _test-error-stream/imm32 -365 68/push _test-output-stream/imm32 -366 68/push _test-buffered-file/imm32 -367 # . . call -368 e8/call get-num/disp32 -369 # registers except esp may be clobbered at this point -370 # . . discard args -371 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp -372 # check-ints-equal(*_test-output-stream->data, '3', msg) -373 # . . push args -374 68/push "F - test-get-num-reads-single-digit"/imm32 -375 68/push 0x33/imm32 -376 b8/copy-to-eax _test-output-stream/imm32 -377 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 0xc/disp8 . # push *(eax+12) -378 # . . call -379 e8/call check-ints-equal/disp32 -380 # . . discard args -381 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp -382 # . reclaim locals -383 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -384 5d/pop-to-ebp -385 c3/return -386 -387 test-get-num-aborts-on-non-digit-in-Look: -388 # - check that get-num returns first character if it's a digit -389 # This test uses exit-descriptors. Use ebp for setting up local variables. -390 55/push-ebp -391 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp -392 # clear all streams -393 # . clear-stream(_test-stream) -394 # . . push args -395 68/push _test-stream/imm32 -396 # . . call -397 e8/call clear-stream/disp32 -398 # . . discard args -399 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -400 # . clear-stream(_test-buffered-file+4) -401 # . . push args -402 b8/copy-to-eax _test-buffered-file/imm32 -403 05/add-to-eax 4/imm32 -404 50/push-eax -405 # . . call -406 e8/call clear-stream/disp32 -407 # . . discard args -408 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -409 # . clear-stream(_test-output-stream) -410 # . . push args -411 68/push _test-output-stream/imm32 -412 # . . call -413 e8/call clear-stream/disp32 -414 # . . discard args -415 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -416 # . clear-stream(_test-error-stream) -417 # . . push args -418 68/push _test-error-stream/imm32 -419 # . . call -420 e8/call clear-stream/disp32 -421 # . . discard args -422 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -423 # initialize 'in' -424 # . write(_test-stream, "3") -425 # . . push args -426 68/push "3"/imm32 -427 68/push _test-stream/imm32 -428 # . . call -429 e8/call write/disp32 -430 # . . discard args -431 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -432 # initialize exit-descriptor 'ed' for the call to 'get-num' below -433 # . var ed/eax : (address exit-descriptor) -434 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # subtract from esp -435 89/copy 3/mod/direct 0/rm32/eax . . . 4/r32/esp . . # copy esp to eax -436 # . tailor-exit-descriptor(ed, 16) -437 # . . push args -438 68/push 0x10/imm32/nbytes-of-args-for-get-num -439 50/push-eax/ed -440 # . . call -441 e8/call tailor-exit-descriptor/disp32 -442 # . . discard args -443 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -444 # *don't* prime the pump -445 # get-num(in, out, err, ed) -446 # . . push args -447 50/push-eax/ed -448 68/push _test-error-stream/imm32 -449 68/push _test-output-stream/imm32 -450 68/push _test-buffered-file/imm32 -451 # . . call -452 e8/call get-num/disp32 -453 # registers except esp may be clobbered at this point -454 # . . discard args -455 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp -456 # check that get-num tried to call exit(1) -457 # . check-ints-equal(ed->value, 2, msg) # i.e. stop was called with value 1 -458 # . . push args -459 68/push "F - test-get-num-aborts-on-non-digit-in-Look"/imm32 -460 68/push 2/imm32 -461 # . . push ed->value -462 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) -463 # . . call -464 e8/call check-ints-equal/disp32 -465 # . . discard args -466 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp -467 # . reclaim locals -468 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -469 5d/pop-to-ebp -470 c3/return -471 -472 ## helpers -473 -474 # write(f, "Error: "+s+" expected\n") then stop(ed, 1) -475 expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -476 # . prologue -477 55/push-ebp -478 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp -479 # write(f, "Error: ") -480 # . . push args -481 68/push "Error: "/imm32 -482 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) -483 # . . call -484 e8/call write/disp32 -485 # . . discard args -486 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -487 # write(f, s) -488 # . . push args -489 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 . # push *(ebp+16) -490 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) -491 # . . call -492 e8/call write/disp32 -493 # . . discard args -494 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -495 # write(f, " expected") -496 # . . push args -497 68/push " expected\n"/imm32 -498 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) -499 # . . call -500 e8/call write/disp32 -501 # . . discard args -502 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp -503 # stop(ed, 1) -504 # . . push args -505 68/push 1/imm32 -506 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) -507 # . . call -508 e8/call stop/disp32 -509 # should never get past this point -510 $expected:dead-end: -511 # . epilogue -512 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp -513 5d/pop-to-ebp -514 c3/return -515 -516 # read a byte from 'f', and save it in 'Look' -517 get-char: # f : (address buffered-file) -518 # . prologue -519 55/push-ebp -520 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp -521 # . save registers -522 50/push-eax -523 # eax = read-byte-buffered(f) -524 # . . push args -525 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) -526 # . . call -527 e8/call read-byte-buffered/disp32 -528 # . . discard args -529 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp -530 # save eax to Look -531 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/eax Look/disp32 . # copy eax to *Look -532 $get-char:end: -533 # . restore registers -534 58/pop-to-eax -535 # . epilogue -536 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp -537 5d/pop-to-ebp -538 c3/return -539 -540 is-digit?: # c : int -> eax : boolean -541 # . prologue -542 55/push-ebp -543 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp -544 # eax = false -545 b8/copy-to-eax 0/imm32 -546 # if (c < '0') return false -547 81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x30/imm32 # compare *(ebp+8) -548 7c/jump-if-lesser $is-digit?:end/disp8 -549 # if (c > '9') return false -550 81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x39/imm32 # compare *(ebp+8) -551 7f/jump-if-greater $is-digit?:end/disp8 -552 # otherwise return true -553 b8/copy-to-eax 1/imm32 -554 $is-digit?:end: -555 # . epilogue -556 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp -557 5d/pop-to-ebp -558 c3/return -559 -560 == data -561 -562 Look: # (char with some extra padding) -563 0/imm32 -564 -565 # . . vim:nowrap:textwidth=0 +311 68/push _test-buffered-file->buffer/imm32 +312 # . . call +313 e8/call clear-stream/disp32 +314 # . . discard args +315 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +316 # . clear-stream(_test-output-stream) +317 # . . push args +318 68/push _test-output-stream/imm32 +319 # . . call +320 e8/call clear-stream/disp32 +321 # . . discard args +322 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +323 # . clear-stream(_test-error-stream) +324 # . . push args +325 68/push _test-error-stream/imm32 +326 # . . call +327 e8/call clear-stream/disp32 +328 # . . discard args +329 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +330 # initialize 'in' +331 # . write(_test-stream, "3") +332 # . . push args +333 68/push "3"/imm32 +334 68/push _test-stream/imm32 +335 # . . call +336 e8/call write/disp32 +337 # . . discard args +338 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +339 # initialize exit-descriptor 'ed' for the call to 'get-num' below +340 # . var ed/eax : exit-descriptor +341 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # subtract from esp +342 89/copy 3/mod/direct 0/rm32/eax . . . 4/r32/esp . . # copy esp to eax +343 # . tailor-exit-descriptor(ed, 16) +344 # . . push args +345 68/push 0x10/imm32/nbytes-of-args-for-get-num +346 50/push-eax/ed +347 # . . call +348 e8/call tailor-exit-descriptor/disp32 +349 # . . discard args +350 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +351 # prime the pump +352 # . get-char(_test-buffered-file) +353 # . . push args +354 68/push _test-buffered-file/imm32 +355 # . . call +356 e8/call get-char/disp32 +357 # . . discard args +358 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +359 # get-num(in, out, err, ed) +360 # . . push args +361 50/push-eax/ed +362 68/push _test-error-stream/imm32 +363 68/push _test-output-stream/imm32 +364 68/push _test-buffered-file/imm32 +365 # . . call +366 e8/call get-num/disp32 +367 # registers except esp may be clobbered at this point +368 # . . discard args +369 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp +370 # check-ints-equal(*_test-output-stream->data, '3', msg) +371 # . . push args +372 68/push "F - test-get-num-reads-single-digit"/imm32 +373 68/push 0x33/imm32 +374 b8/copy-to-eax _test-output-stream/imm32 +375 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 0xc/disp8 . # push *(eax+12) +376 # . . call +377 e8/call check-ints-equal/disp32 +378 # . . discard args +379 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp +380 # . reclaim locals +381 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +382 5d/pop-to-ebp +383 c3/return +384 +385 test-get-num-aborts-on-non-digit-in-Look: +386 # - check that get-num returns first character if it's a digit +387 # This test uses exit-descriptors. Use ebp for setting up local variables. +388 55/push-ebp +389 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +390 # clear all streams +391 # . clear-stream(_test-stream) +392 # . . push args +393 68/push _test-stream/imm32 +394 # . . call +395 e8/call clear-stream/disp32 +396 # . . discard args +397 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +398 # . clear-stream(_test-buffered-file->buffer) +399 # . . push args +400 68/push _test-buffered-file->buffer/imm32 +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 # . clear-stream(_test-output-stream) +406 # . . push args +407 68/push _test-output-stream/imm32 +408 # . . call +409 e8/call clear-stream/disp32 +410 # . . discard args +411 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +412 # . clear-stream(_test-error-stream) +413 # . . push args +414 68/push _test-error-stream/imm32 +415 # . . call +416 e8/call clear-stream/disp32 +417 # . . discard args +418 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +419 # initialize 'in' +420 # . write(_test-stream, "3") +421 # . . push args +422 68/push "3"/imm32 +423 68/push _test-stream/imm32 +424 # . . call +425 e8/call write/disp32 +426 # . . discard args +427 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +428 # initialize exit-descriptor 'ed' for the call to 'get-num' below +429 # . var ed/eax : (address exit-descriptor) +430 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # subtract from esp +431 89/copy 3/mod/direct 0/rm32/eax . . . 4/r32/esp . . # copy esp to eax +432 # . tailor-exit-descriptor(ed, 16) +433 # . . push args +434 68/push 0x10/imm32/nbytes-of-args-for-get-num +435 50/push-eax/ed +436 # . . call +437 e8/call tailor-exit-descriptor/disp32 +438 # . . discard args +439 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +440 # *don't* prime the pump +441 # get-num(in, out, err, ed) +442 # . . push args +443 50/push-eax/ed +444 68/push _test-error-stream/imm32 +445 68/push _test-output-stream/imm32 +446 68/push _test-buffered-file/imm32 +447 # . . call +448 e8/call get-num/disp32 +449 # registers except esp may be clobbered at this point +450 # . . discard args +451 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp +452 # check that get-num tried to call exit(1) +453 # . check-ints-equal(ed->value, 2, msg) # i.e. stop was called with value 1 +454 # . . push args +455 68/push "F - test-get-num-aborts-on-non-digit-in-Look"/imm32 +456 68/push 2/imm32 +457 # . . push ed->value +458 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) +459 # . . call +460 e8/call check-ints-equal/disp32 +461 # . . discard args +462 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp +463 # . reclaim locals +464 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +465 5d/pop-to-ebp +466 c3/return +467 +468 ## helpers +469 +470 # write(f, "Error: "+s+" expected\n") then stop(ed, 1) +471 expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) +472 # . prologue +473 55/push-ebp +474 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +475 # write(f, "Error: ") +476 # . . push args +477 68/push "Error: "/imm32 +478 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) +479 # . . call +480 e8/call write/disp32 +481 # . . discard args +482 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +483 # write(f, s) +484 # . . push args +485 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 . # push *(ebp+16) +486 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) +487 # . . call +488 e8/call write/disp32 +489 # . . discard args +490 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +491 # write(f, " expected") +492 # . . push args +493 68/push " expected\n"/imm32 +494 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) +495 # . . call +496 e8/call write/disp32 +497 # . . discard args +498 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +499 # stop(ed, 1) +500 # . . push args +501 68/push 1/imm32 +502 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) +503 # . . call +504 e8/call stop/disp32 +505 # should never get past this point +506 $expected:dead-end: +507 # . epilogue +508 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +509 5d/pop-to-ebp +510 c3/return +511 +512 # read a byte from 'f', and save it in 'Look' +513 get-char: # f : (address buffered-file) +514 # . prologue +515 55/push-ebp +516 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +517 # . save registers +518 50/push-eax +519 # eax = read-byte-buffered(f) +520 # . . push args +521 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) +522 # . . call +523 e8/call read-byte-buffered/disp32 +524 # . . discard args +525 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +526 # save eax to Look +527 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/eax Look/disp32 . # copy eax to *Look +528 $get-char:end: +529 # . restore registers +530 58/pop-to-eax +531 # . epilogue +532 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +533 5d/pop-to-ebp +534 c3/return +535 +536 is-digit?: # c : int -> eax : boolean +537 # . prologue +538 55/push-ebp +539 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +540 # eax = false +541 b8/copy-to-eax 0/imm32 +542 # if (c < '0') return false +543 81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x30/imm32 # compare *(ebp+8) +544 7c/jump-if-lesser $is-digit?:end/disp8 +545 # if (c > '9') return false +546 81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x39/imm32 # compare *(ebp+8) +547 7f/jump-if-greater $is-digit?:end/disp8 +548 # otherwise return true +549 b8/copy-to-eax 1/imm32 +550 $is-digit?:end: +551 # . epilogue +552 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +553 5d/pop-to-ebp +554 c3/return +555 +556 == data +557 +558 Look: # (char with some extra padding) +559 0/imm32 +560 +561 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0