2.5 KiB
Debugging
Run the vm with the debug option to enable breakpoints and debugging features: ./main -f myprogram.vaporbin -d.
Breakpoints
Create a breakpoint with break; in vaporlang and BRKP in assembly. Break instructions are a no-op when running without the debug option.
Keyboard controls
- F2: Continue: Resume normal execution
- F3: Break All: Enter break state
- F4: Step: Execute one instruction
- F9: Print program counter, disassemble current instruction, print register values
- F10: Dump memory segments 0 through 63 (inclusive)
- F11: Dump memory segments 64 through 127 (inclusive)
- F12: Disassemble next 16 instructions
Understanding the Output
F9
Program counter: The segment and offset address of the current instruction, first in decimal, then hexidecimal.
PC: 036.009 0x24.0x09
Disassembly: The assembly for the current instruction. Decimal constants include comments for their hexadecimal value.
ASM: LRC r02 #036 ; (0x0024)
Registers: Values of registers in decimal and then hexadecimal
r00: 001 (0x01)
r01: 001 (0x01)
...
F10
16 bytes of memory per row (32 hex digits). This example contains the x y locations of pieces in tetris.
0x00.0x00: 0x070E060F050F070F020E010F000F020F
0x00.0x10: 0x070C070D060D060E0000000000000000
...
Segment 63 contains the return addresses of functions for vaporlang programs.
The first byte 0x04 is the call stack size in bytes. The next 2 bytes 0x02 and 0x1E are a segment and offset return address. The next 0x21.0x55 is another return address and explains the callstack size (4 bytes). The highest order return address is the current one at the time of execution.
0x3F.0x00: 0x04021E21550000000000000000000000
Looking up 0x02.0x1E in the assembly (with instruction address logging) shows that this address is directly after a call to the render function.
LRL r0 r1 @render ; 002.027 0x02.0x1B
JMP r0 r1 ; 002.029 0x02.0x1D
LRC r0 #63 ; 002.030 0x02.0x1E <- The stored return address
At 0x21.0x55 is the return address from the renderTile function. The call stack shows that the program has called render and render has called renderTile.
F12
Disassembly of the next 16 instructions. The * marks the current instruction.
* LRC r02 #035 ; (0x0023) ; 036.016 0x24.0x10
JEQ r00 r01 r02 ; 036.017 0x24.0x11
LRC r01 #127 ; (0x007F) ; 036.018 0x24.0x12
LRC r02 #017 ; (0x0011) ; 036.019 0x24.0x13
...