mu/linux/102test.subx
Kartik K. Agaram 827dd4a7fe start throwing error on duplicate label
One less error that's only in the bootstrap phase.

On the other hand, for simplicity I got rid of the ability to override
the Entry label. One less special case, but we're also going further
from the ability to run subsets of layers. We haven't really been
exercising it for a long time, though (commit 7842, March 2021 when we
made baremetal the default).
2021-08-22 21:09:28 -07:00

107 lines
4.3 KiB
Plaintext

# Rudimentary test harness
== code
# instruction effective address register displacement immediate
# . op subop mod rm32 base index scale r32
# . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes
#? Entry: # manual test
#? # check-ints-equal(34, 34)
#? # . . push args
#? 68/push "error in check-ints-equal"/imm32
#? 68/push 34/imm32
#? 68/push 34/imm32
#? # . . call
#? e8/call check-ints-equal/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp
#? # syscall_exit(0)
#? bb/copy-to-ebx 0/imm32
#? e8/call syscall_exit/disp32
# print msg to stderr if a != b, otherwise print "."
check-ints-equal: # a: int, b: int, msg: (addr array byte)
# . prologue
55/push-ebp
89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp
# . save registers
50/push-eax
51/push-ecx
53/push-ebx
# load first 2 args into eax and ebx
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 . . . 3/r32/ebx 0xc/disp8 . # copy *(ebp+12) to ebx
# if (eax == ebx) success
39/compare 3/mod/direct 0/rm32/eax . . . 3/r32/ebx . . # compare eax and ebx
75/jump-if-unequal $check-ints-equal:else/disp8
# . _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
# . return
eb/jump $check-ints-equal:end/disp8
# otherwise print error message
$check-ints-equal:else:
# . _write(2/stderr, msg)
# . . push args
8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 0x10/disp8 . # copy *(ebp+16) to ecx
51/push-ecx
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
# . _write(2/stderr, Newline)
# . . push args
68/push Newline/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
# increment Num-test-failures
ff 0/subop/increment 0/mod/indirect 5/rm32/.disp32 . . . Num-test-failures/disp32 # increment *Num-test-failures
$check-ints-equal:end:
# . restore registers
5b/pop-to-ebx
59/pop-to-ecx
58/pop-to-eax
# . epilogue
89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp
5d/pop-to-ebp
c3/return
== data
# length-prefixed string containing just a single newline
# convenient to have when printing messages and so on
Newline: # (array byte)
# size: int
1/imm32
# data
0a/newline
# every test failure increments this counter
Num-test-failures: # int
0/imm32
# length-prefixed string containing just a single space
Space: # (array byte)
# size: int
1/imm32
# data
20/space
# length-prefixed string containing just a single slash
Slash: # (array byte)
# size: int
1/imm32
# data
2f/slash
# . . vim:nowrap:textwidth=0