From 8da4c8c3006c7d60d92a951a2a096449dc398e68 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Thu, 18 Jul 2019 22:57:48 -0700 Subject: 5416 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. --- subx/apps/survey | Bin 41174 -> 41196 bytes subx/apps/survey.subx | 10 +++++++++- subx/examples/ex6.subx | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/subx/apps/survey b/subx/apps/survey index 61e2f974..92da0e6b 100755 Binary files a/subx/apps/survey and b/subx/apps/survey differ diff --git a/subx/apps/survey.subx b/subx/apps/survey.subx index d868132a..0f5428bb 100644 --- a/subx/apps/survey.subx +++ b/subx/apps/survey.subx @@ -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: diff --git a/subx/examples/ex6.subx b/subx/examples/ex6.subx index a90f11df..d690d378 100644 --- a/subx/examples/ex6.subx +++ b/subx/examples/ex6.subx @@ -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 -- cgit 1.4.1-2-gfad0