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).
107 lines
4.3 KiB
Plaintext
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
|