From f0eb6314286e4cf5612c49beab19b241c4bc98e4 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 12 Jul 2019 11:39:35 -0700 Subject: [PATCH] compute-offsets test now passing The final integration test-convert-computes-addresses is still failing. --- subx/apps/survey | Bin 40103 -> 39892 bytes subx/apps/survey.subx | 146 ++++++++++++++++++++++++++++-------------- 2 files changed, 97 insertions(+), 49 deletions(-) diff --git a/subx/apps/survey b/subx/apps/survey index 28224ac6d603ca66480ddc302eed7b626e45006d..aeb2290b49e95801fa380daf2e4c065bcda58729 100755 GIT binary patch literal 39892 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 literal 40103 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 Z=4O;UbiwH<6U$;2b2+n}%AcHT{vW0l-k$&f diff --git a/subx/apps/survey.subx b/subx/apps/survey.subx index c7f7b0a9..a3e5cb5a 100644 --- a/subx/apps/survey.subx +++ b/subx/apps/survey.subx @@ -593,53 +593,53 @@ $compute-offsets:construct-next-segment: e8/call next-word/disp32 # . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # dump curr-segment-name if not null (clobbering EAX) {{{ - # . if (curr-segment-name == 0) goto update-curr-segment-name - 81 7/subop/compare 3/mod/direct 6/rm32/ESI . . . . . 0/imm32 # compare ESI - 74/jump-if-equal $compute-offsets:update-curr-segment-name/disp8 - # . write(2/stderr, "setting segment to: ") - # . . push args - 68/push "setting segment to: "/imm32 - 68/push 2/imm32/stderr - # . . call - e8/call write/disp32 - # . . discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # . clear-stream(Stderr+4) - # . . push args - b8/copy-to-EAX Stderr/imm32 - 05/add-to-EAX 4/imm32 - 50/push-EAX - # . . call - e8/call clear-stream/disp32 - # . . discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - # . . restore EAX - 58/pop-to-EAX - # . write-buffered(Stderr, curr-segment-name) - # . . push args - 56/push-ESI - 68/push Stderr/imm32 - # . . call - e8/call write-buffered/disp32 - # . . discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # . flush(Stderr) - # . . push args - 68/push Stderr/imm32 - # . . call - e8/call flush/disp32 - # . . discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - # . write(2/stderr, "$\n") - # . . push args - 68/push "$\n"/imm32 - 68/push 2/imm32/stderr - # . . call - e8/call write/disp32 - # . . discard args - 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # }}} +#? # dump curr-segment-name if not null (clobbering EAX) {{{ +#? # . if (curr-segment-name == 0) goto update-curr-segment-name +#? 81 7/subop/compare 3/mod/direct 6/rm32/ESI . . . . . 0/imm32 # compare ESI +#? 74/jump-if-equal $compute-offsets:update-curr-segment-name/disp8 +#? # . write(2/stderr, "setting segment to: ") +#? # . . push args +#? 68/push "setting segment to: "/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . clear-stream(Stderr+4) +#? # . . push args +#? b8/copy-to-EAX Stderr/imm32 +#? 05/add-to-EAX 4/imm32 +#? 50/push-EAX +#? # . . call +#? e8/call clear-stream/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . . restore EAX +#? 58/pop-to-EAX +#? # . write-buffered(Stderr, curr-segment-name) +#? # . . push args +#? 56/push-ESI +#? 68/push Stderr/imm32 +#? # . . call +#? e8/call write-buffered/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . flush(Stderr) +#? # . . push args +#? 68/push Stderr/imm32 +#? # . . call +#? e8/call flush/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . write(2/stderr, "$\n") +#? # . . push args +#? 68/push "$\n"/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # }}} $compute-offsets:update-curr-segment-name: # curr-segment-name = slice-to-string(segment-tmp) # . EAX = slice-to-string(Heap, segment-tmp) @@ -731,9 +731,10 @@ $compute-offsets:case-label: e8/call get-or-insert-slice/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +$compute-offsets:save-label-offset: # x->segment-offset = segment-offset # . EBX = segment-offset - 8f 0/subop/pop 0/mod/indirect 5/rm32/.disp32 . . . compute-offsets:segment-offset/disp32 + 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX compute-offsets:segment-offset/disp32 # copy *segment-offset to EBX # . x->segment-offset = EBX 89/copy 1/mod/*+disp8 0/rm32/EAX . . . 3/r32/EBX 4/disp8 . # copy EBX to *(EAX+4) # trace-slsss("label '" word-slice/EDX "' is in segment '" current-segment-name "'.") @@ -776,6 +777,53 @@ $compute-offsets:case-default: 01/add 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX compute-offsets:segment-offset/disp32 # add EAX to *segment-offset # file-offset += width 01/add 0/mod/indirect 5/rm32/.disp32 . . 0/r32/EAX compute-offsets:file-offset/disp32 # add EAX to *file-offset +#? # dump segment-offset {{{ +#? # . write(2/stderr, "segment-offset: ") +#? # . . push args +#? 68/push "segment-offset: "/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . clear-stream(Stderr+4) +#? # . . save EAX +#? 50/push-EAX +#? # . . push args +#? b8/copy-to-EAX Stderr/imm32 +#? 05/add-to-EAX 4/imm32 +#? 50/push-EAX +#? # . . call +#? e8/call clear-stream/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . . restore EAX +#? 58/pop-to-EAX +#? # . print-int32-buffered(Stderr, segment-offset) +#? # . . push args +#? 52/push-EDX +#? ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . compute-offsets:segment-offset/disp32 # push *segment-offset +#? 68/push Stderr/imm32 +#? # . . call +#? e8/call print-int32-buffered/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . flush(Stderr) +#? # . . push args +#? 68/push Stderr/imm32 +#? # . . call +#? e8/call flush/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . write(2/stderr, "\n") +#? # . . push args +#? 68/push "\n"/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # }}} e9/jump $compute-offsets:word-loop/disp32 $compute-offsets:break-line-loop: # seg/EAX = get-or-insert(segments, curr-segment-name, row-size=16) @@ -801,7 +849,7 @@ $compute-offsets:break-line-loop: # . restore ECX 59/pop-to-ECX # trace-sssns("segment '", curr-segment-name, "' has size ", seg->size, ".") - # . trace-sssns("segment '", curr-segment-name, "' has size ", EAX, ".") + # . trace-sssns("segment '", curr-segment-name, "' has size ", EBX, ".") # . . push args 68/push "."/imm32 53/push-EBX