This commit is contained in:
Kartik Agaram 2019-01-10 17:07:55 -08:00
parent 8b9dd2d1a9
commit 5a2e541c18

View File

@ -6,123 +6,6 @@
# . 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
#? e8/call test-write-byte-multiple-flushes/disp32
#? #? e8/call test-foo/disp32
#? #? e8/call test-slice-equal/disp32
#? bb/copy-to-EBX 0/imm32
#? b8/copy-to-EAX 1/imm32/exit
#? cd/syscall 0x80/imm8
#? # stop directly - seems fine
#? # error-byte - writing out of bounds
#? # drop stop - writing out of bounds
#?
#? test-foo:
#? # This test uses exit-descriptors. Use EBP for setting up local variables.
#? 55/push-EBP
#? 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
#? # initialize '_test-stream' to "a"
#? # . write(_test-stream, "a")
#? # . . push args
#? 68/push "a"/imm32
#? 68/push _test-stream/imm32
#? # . . call
#? e8/call write/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # initialize exit-descriptor 'ed' for the call to 'convert-next-octet' below
#? # . var ed/ECX : exit-descriptor
#? 81 5/subop/subtract 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # subtract from ESP
#? 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX
#? # . tailor-exit-descriptor(ed, 12)
#? # . . push args
#? 68/push 0xc/imm32/nbytes-of-args-for-convert-next-octet
#? 51/push-ECX/ed
#? # . . call
#? e8/call tailor-exit-descriptor/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # EAX = foo(_test-buffered-file, _test-error-buffered-file, ed)
#? # . . push args
#? 51/push-ECX/ed
#? 68/push _test-foo-error-buffered-file/imm32
#? 68/push _test-buffered-file/imm32
#? # . . call
#? e8/call foo/disp32
#? # registers except ESP may be clobbered at this point
#? # pop args to convert-next-octet
#? # . . discard first 2 args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # . . restore ed
#? 59/pop-to-ECX
#? # . epilog
#? # don't restore ESP from EBP; manually reclaim locals
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? 5d/pop-to-EBP
#? c3/return
#?
#? foo: # in : (address buffered-file), err : (address buffered-file), ed : (address exit-descriptor) -> byte-or-eof/EAX
#? # . prolog
#? 55/push-EBP
#? 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
#? # . foo-error-byte(ed, err, msg, '.')
#? # . . push args
#? 68/push 0x2e/imm32/period/dummy
#? 68/push "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"/imm32
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x10/disp8 . # push *(EBP+16)
#? # . . call
#? e8/call foo-error-byte/disp32 # never returns
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP
#? # . epilog
#? 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP
#? 5d/pop-to-EBP
#? c3/return
#?
#? # write(out, "Error: "+msg+": "+byte) then stop(ed, 1)
#? foo-error-byte: # ed : (address exit-descriptor), out : (address buffered-file), msg : (address array byte), n : byte -> <void>
#? # . prolog
#? 55/push-EBP
#? 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
#? # write-buffered(out, "Error: ")
#? # . . push args
#? 68/push "Error: "/imm32
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
#? # . . call
#? e8/call write-buffered/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # write-buffered(out, msg)
#? # . . push args
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x10/disp8 . # push *(EBP+16)
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
#? # . . call
#? e8/call write-buffered/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # write-buffered(out, ": ")
#? # . . push args
#? 68/push ": "/imm32
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
#? # . . call
#? e8/call write-buffered/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? # print-byte(out, byte)
#? # . . push args
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x14/disp8 . # push *(EBP+20)
#? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
#? # . . call
#? e8/call print-byte/disp32
#? # . . discard args
#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
#? $foo-error-byte:dead-end:
#? # . epilog
#? 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP
#? 5d/pop-to-EBP
#? c3/return
# main:
e8/call run-tests/disp32 # 'run-tests' is a function created automatically by SubX. It calls all functions that start with 'test-'.
# syscall(exit, Num-test-failures)
@ -490,29 +373,6 @@ test-slice-equal-empty-with-empty:
== data
#? _test-foo-error-stream:
#? # current write index
#? 00 00 00 00
#? # current read index
#? 00 00 00 00
#? # length (= 8)
#? 08 00 00 00
#? # data
#? 00 00 00 00 00 00 00 00 # 8 bytes
#?
#? # a test buffered file for _test-stream
#? _test-foo-error-buffered-file:
#? # file descriptor or (address stream)
#? _test-foo-error-stream/imm32
#? # current write index
#? 00 00 00 00
#? # current read index
#? 00 00 00 00
#? # length (6)
#? 06 00 00 00
#? # data
#? 00 00 00 00 00 00 # 6 bytes
_test-slice-data-0:
41/A
_test-slice-data-1: