Figured out what's going in with bug fourteen: displacement operands
aren't always used relative to the PC. Does this mean I need to track
instruction boundaries past pack? :'(

No, I just need different logic for labels in code vs data segments.

This was an interesting bug for reminding me of the difference between
the emulator-level trace and the application-level trace. The former has
1.5 million lines, while the latter has a dozen. Luckily, just dumping
the latter immediately made obvious what the issue was.

Though this experience does suggest some further ideas for debugging
tools:

  slice trace by line and phase
    slice trace by start and end label

  debug UI for SubX translator
    2D layout: rows = lines of code;  columns = translator phases
    each 'cell' in this layout contains a list of log lines
    shows what came in, what was emitted
    easily collapse any cell

These are domain-specific tools. Special-cased to the SubX translator
phases.
This commit is contained in:
Kartik Agaram 2019-07-18 22:57:48 -07:00
parent 5030d67c85
commit 8da4c8c300
3 changed files with 10 additions and 1 deletions

Binary file not shown.

View File

@ -79,7 +79,7 @@ Entry:
eb/jump $main:end/disp8
$run-main:
# - otherwise convert stdin
# return convert(Stdin, Stdout)
# convert(Stdin, Stdout)
# . . push args
68/push Stdout/imm32
68/push Stdin/imm32
@ -87,6 +87,14 @@ $run-main:
e8/call convert/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . write-stream(2/stderr, Trace-stream)
# . . push args
ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Trace-stream/disp32 # push *Trace-stream
68/push 2/imm32/stderr
# . . call
e8/call write-stream/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . syscall(exit, 0)
bb/copy-to-EBX 0/imm32
$main:end:

View File

@ -17,6 +17,7 @@ Entry:
# . initialize X (location to write result to)
b9/copy-to-ECX X/imm32
# . initialize Size
# HERE
8b/copy 0/mod/indirect 5/rm32/.disp32 . . 2/r32/EDX Size/disp32 . # copy *Size to EDX
# . syscall
b8/copy-to-EAX 4/imm32/write