From 50ac5cab9c4a1f165ec9d20dd7d6a0ea884cd45d Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 13 Jul 2019 15:18:00 -0700 Subject: [PATCH] fixed fourth bug, hit fifth --- subx/apps/survey | Bin 39901 -> 40299 bytes subx/apps/survey.subx | 339 +++++++++++++++++++++++++++++++++++------- 2 files changed, 289 insertions(+), 50 deletions(-) diff --git a/subx/apps/survey b/subx/apps/survey index 2e90499c9f3c7603452d601d97136e5225059076..678b6aaa70ce875cc97b095230a0691601d20ffc 100755 GIT binary patch literal 40299 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 z zRFd2>RVwUSrD7ye*YtFT4m0hV!FU`(xfsy=R*tg6O8X~xj3c7u((FtJu83w#Ty;{h zs**-pkVb&Wl_poF{C=$_$UsbrnnKr#siMS@pvDrGQg}=!6Bi*8EGQ{HrWzLS zjhxN-h8DMqN`JJJGcQ)4E7>t4Th0cQ3A$*a ztsUPbpesZ6WgzFS9y5c^8c1)1eHJ3Qd5)=rhM3&o(Pb(M^Wj~Sa2j9&ssK3>U2hVM zVoHWRCuvIQb6 ") +#? # . . push args +#? 68/push " -> "/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 +#? # . print-int32-buffered(Stderr, curr-segment->name) +#? # . . push args +#? ff 6/subop/push 1/mod/*+disp8 1/rm32/ECX . . . . 0xc/disp8 . # push *(ECX+12) +#? 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 +#? # }}} +# segments: bdff ff2c # compute-offsets(in, segments, labels) # . . push args 52/push-EDX @@ -185,52 +308,52 @@ convert: # in : (address buffered-file), out : (address buffered-file) -> write {{{ - # . write(2/stderr, "labels->write after rewinding input: ") - # . . push args - 68/push "labels->write after rewinding input: "/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, labels) - # . . push args - ff 6/subop/push 0/mod/indirect 2/rm32/EDX . . . . . . # push *EDX - 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 - # }}} +#? # dump labels->write {{{ +#? # . write(2/stderr, "labels->write after rewinding input: ") +#? # . . push args +#? 68/push "labels->write after rewinding input: "/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, labels) +#? # . . push args +#? ff 6/subop/push 0/mod/indirect 2/rm32/EDX . . . . . . # push *EDX +#? 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 +#? # }}} # emit-output(in, out, segments, labels) # . . push args 52/push-EDX @@ -2388,13 +2511,14 @@ emit-headers: # out : (address buffered-file), segments : (address stream {stri # . . push args ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x10/disp8 . # push *(EBP+16) ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) +#segments correct here: bdff ff2c ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call emit-elf-header/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP # EAX = segments - 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX # ECX = segments->write 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX # curr-segment/EAX = segments->data @@ -2404,7 +2528,76 @@ emit-headers: # out : (address buffered-file), segments : (address stream {stri $emit-headers:loop: # if (curr-segment >= max) break 39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX - 73/jump-if-greater-or-equal-unsigned $emit-headers:end/disp8 + 0f 83/jump-if-greater-or-equal-unsigned $emit-headers:end/disp32 +#? # dump curr-segment->name {{{ +#? # . write(2/stderr, "about to emit ph entry: segment->name: ") +#? # . . push args +#? 68/push "about to emit ph entry: segment->name: "/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, &curr-segment) +#? # . . push args +#? 50/push-EAX +#? 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, " -> ") +#? # . . push args +#? 68/push " -> "/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 +#? # . print-int32-buffered(Stderr, curr-segment->name) +#? # . . push args +#? ff 6/subop/push 0/mod/indirect 0/rm32/EAX . . . . . . # push *EAX +#? 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 +#? # }}} # emit-elf-program-header-entry(curr-segment) # . . push args 50/push-EAX @@ -2414,7 +2607,7 @@ $emit-headers:loop: 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # curr-segment += 20 # size of a row 81 0/subop/add 3/mod/direct 0/rm32/EAX . . . . . 0x14/imm32 # add to EAX - eb/jump $emit-headers:loop/disp8 + e9/jump $emit-headers:loop/disp32 $emit-headers:end: # . restore registers 59/pop-to-ECX @@ -2482,7 +2675,7 @@ $emit-elf-header:end: 5d/pop-to-EBP c3/return -emit-elf-program-header-entry: # curr-segment : {string, segment-info} +emit-elf-program-header-entry: # curr-segment : (address {string, segment-info}) # pseudocode: # *Elf_p_offset = curr-segment->file-offset # *Elf_p_vaddr = curr-segment->address @@ -2503,6 +2696,52 @@ emit-elf-program-header-entry: # curr-segment : {string, segment-info} 56/push-ESI # ESI = curr-segment 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI + # dump curr-segment->name {{{ + # . write(2/stderr, "emit ph entry: segment->name: ") + # . . push args + 68/push "emit ph entry: segment->name: "/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, curr-segment->name) + # . . push args + ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . . # push *EDX + 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 + # }}} # *Elf_p_offset = curr-segment->file-offset # . EAX = curr-segment->file-offset 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 8/disp8 . # copy *(ESI+8) to EAX