2021-05-14 22:40:49 +00:00
|
|
|
# Dump a stack trace when you abort.
|
|
|
|
|
|
|
|
== code
|
|
|
|
|
|
|
|
abort: # e: (addr array byte)
|
|
|
|
# . prologue
|
|
|
|
55/push-ebp
|
|
|
|
89/<- %ebp 4/r32/esp
|
|
|
|
#
|
|
|
|
(set-cursor-position-on-real-screen 0 0)
|
|
|
|
(draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+8) 0xf 0xc) # 0/real-screen, 0xf/fg=white, 0xc/bg=red
|
2021-05-15 03:52:27 +00:00
|
|
|
(dump-call-stack)
|
2021-05-14 22:40:49 +00:00
|
|
|
# crash
|
|
|
|
{
|
|
|
|
eb/jump loop/disp8
|
|
|
|
}
|
2021-05-15 03:52:27 +00:00
|
|
|
|
2021-05-15 04:32:06 +00:00
|
|
|
# destroys the heap
|
2021-05-15 03:52:27 +00:00
|
|
|
dump-call-stack:
|
|
|
|
# . prologue
|
|
|
|
55/push-ebp
|
|
|
|
89/<- %ebp 4/r32/esp
|
|
|
|
# . save registers
|
|
|
|
50/push-eax
|
2021-05-15 04:32:06 +00:00
|
|
|
51/push-ecx
|
|
|
|
52/push-edx
|
2021-05-15 03:52:27 +00:00
|
|
|
53/push-ebx
|
2021-05-15 04:32:06 +00:00
|
|
|
# var labels/edx: (stream {label-name, address} 0x1000)
|
|
|
|
81 5/subop/subtract %esp 0xc000/imm32
|
|
|
|
68/push 0xc000/imm32
|
|
|
|
68/push 0/imm32/read
|
|
|
|
68/push 0/imm32/write
|
|
|
|
89/<- %edx 4/r32/esp
|
|
|
|
#
|
|
|
|
(load-debug-symbols %edx) # destroys the heap
|
2021-05-15 03:52:27 +00:00
|
|
|
# traverse the linked list of ebp pointers: https://wiki.osdev.org/Stack_Trace
|
|
|
|
8b/-> *ebp 3/r32/ebx
|
|
|
|
{
|
|
|
|
# loop termination check
|
|
|
|
81 7/subop/compare %ebx 0/imm32
|
|
|
|
0f 84/jump-if-= break/disp32
|
|
|
|
# loop body
|
|
|
|
(draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "\n" 0 0xc)
|
|
|
|
(draw-int32-hex-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebx+4) 0xf 0xc)
|
|
|
|
# loop update
|
|
|
|
8b/-> *ebx 3/r32/ebx
|
|
|
|
#
|
|
|
|
e9/jump loop/disp32
|
|
|
|
}
|
|
|
|
$dump-call-stack:end:
|
2021-05-15 04:32:06 +00:00
|
|
|
# . reclaim locals
|
|
|
|
81 0/subop/add %esp 0x100c/imm32
|
|
|
|
# . restore registers
|
|
|
|
5b/pop-to-ebx
|
|
|
|
5a/pop-to-edx
|
|
|
|
59/pop-to-ecx
|
|
|
|
58/pop-to-eax
|
|
|
|
# . epilogue
|
|
|
|
89/<- %esp 5/r32/ebp
|
|
|
|
5d/pop-to-ebp
|
|
|
|
c3/return
|
|
|
|
|
|
|
|
load-debug-symbols: # labels/edx: (stream {label-name, address})
|
|
|
|
# . prologue
|
|
|
|
55/push-ebp
|
|
|
|
89/<- %ebp 4/r32/esp
|
|
|
|
# . save registers
|
|
|
|
50/push-eax
|
|
|
|
51/push-ecx
|
|
|
|
52/push-edx
|
|
|
|
53/push-ebx
|
|
|
|
# create space for a stream on the heap, clobbering any existing data
|
|
|
|
# var ecx: (addr stream byte)
|
|
|
|
b9/copy-to-ecx 0x03000000/imm32
|
|
|
|
c7 0/subop/copy *ecx 0/imm32 # write index
|
|
|
|
c7 0/subop/copy *(ecx+4) 0/imm32 # read index
|
|
|
|
c7 0/subop/copy *(ecx+8) 0x01000000/imm32 # stream capacity = 16MB
|
|
|
|
# load 0x100 sectors starting from sector 10080 = 0x2760
|
|
|
|
(load-sectors Primary-bus-primary-drive 0x2760 0x100 %ecx)
|
|
|
|
b8/copy-to-eax 0x0300000c/imm32
|
|
|
|
b9/copy-to-ecx 0/imm32
|
|
|
|
{
|
|
|
|
3d/compare-eax-and 0x030000ff/imm32
|
|
|
|
74/jump-if-= break/disp8
|
|
|
|
#
|
|
|
|
8a/byte-> *eax 1/r32/CL
|
|
|
|
(draw-grapheme-at-cursor 0 %ecx 7 0)
|
|
|
|
(move-cursor-rightward-and-downward 0)
|
|
|
|
#
|
|
|
|
40/increment-eax
|
|
|
|
eb/jump loop/disp8
|
|
|
|
}
|
|
|
|
$load-debug-symbols:end:
|
|
|
|
# . reclaim locals
|
|
|
|
81 0/subop/add %esp 0x100c/imm32
|
2021-05-15 03:52:27 +00:00
|
|
|
# . restore registers
|
|
|
|
5b/pop-to-ebx
|
2021-05-15 04:32:06 +00:00
|
|
|
5a/pop-to-edx
|
|
|
|
59/pop-to-ecx
|
2021-05-15 03:52:27 +00:00
|
|
|
58/pop-to-eax
|
|
|
|
# . epilogue
|
|
|
|
89/<- %esp 5/r32/ebp
|
|
|
|
5d/pop-to-ebp
|
|
|
|
c3/return
|