diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-09-02 15:12:44 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-09-02 15:15:11 -0700 |
commit | 968380517a7bea91ebcbf02a329da4fdbf7b3d78 (patch) | |
tree | 0f8e0c36f2000042e84ebc6c1c083bb076dc3a88 | |
parent | 604c8315bd7251daa898dd646cb8595f3700ed21 (diff) | |
download | mu-968380517a7bea91ebcbf02a329da4fdbf7b3d78.tar.gz |
5608 - write int to stream
-rw-r--r-- | 064write-byte.subx | 6 | ||||
-rw-r--r-- | 079write-int.subx | 119 | ||||
-rwxr-xr-x | apps/assort | bin | 38657 -> 39000 bytes | |||
-rwxr-xr-x | apps/crenshaw2-1 | bin | 30993 -> 31336 bytes | |||
-rwxr-xr-x | apps/crenshaw2-1b | bin | 31552 -> 31895 bytes | |||
-rwxr-xr-x | apps/dquotes | bin | 43819 -> 44162 bytes | |||
-rwxr-xr-x | apps/factorial | bin | 30005 -> 30348 bytes | |||
-rwxr-xr-x | apps/handle | bin | 30859 -> 31202 bytes | |||
-rwxr-xr-x | apps/hex | bin | 41050 -> 41393 bytes | |||
-rwxr-xr-x | apps/pack | bin | 51343 -> 51686 bytes | |||
-rwxr-xr-x | apps/sigils | bin | 52513 -> 52856 bytes | |||
-rwxr-xr-x | apps/survey | bin | 47940 -> 48283 bytes | |||
-rwxr-xr-x | apps/tests | bin | 37469 -> 37812 bytes |
13 files changed, 122 insertions, 3 deletions
diff --git a/064write-byte.subx b/064write-byte.subx index 4bb1bcbb..80031972 100644 --- a/064write-byte.subx +++ b/064write-byte.subx @@ -169,7 +169,7 @@ test-write-byte-buffered-multiple-flushes: # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # fill up the buffer for _test-buffered-file - # . write(_test-buffered-file+4, 'abcdef') + # . write(_test-buffered-file+4, "abcdef") # . . push args 68/push "abcdef"/imm32 b8/copy-to-eax _test-buffered-file/imm32 @@ -194,9 +194,9 @@ test-write-byte-buffered-multiple-flushes: e8/call flush/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp - # check-stream-equal(_test-stream, "abcdef", msg) + # check-stream-equal(_test-stream, "abcdefg", msg) # . . push args - 68/push "F - test-write-byte-buffered-multiple-flushes: 1"/imm32 + 68/push "F - test-write-byte-buffered-multiple-flushes"/imm32 68/push "abcdefg"/imm32 68/push _test-stream/imm32 # . . call diff --git a/079write-int.subx b/079write-int.subx new file mode 100644 index 00000000..29ba8d2a --- /dev/null +++ b/079write-int.subx @@ -0,0 +1,119 @@ +# write-int: add a single int byte to a stream + +== code + +write-int: # out : (address stream), n : int -> <void> + # . prolog + 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 + 57/push-edi + # edi = out + 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi + # ecx = out->write + 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx + # if (out->write >= out->length) abort + 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(edi+8) + 7d/jump-if-greater-or-equal $write-int:abort/disp8 +$write-int:to-stream: + # out->data[out->write] = n + 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 0xc/disp8 . # copy *(ebp+12) to eax + 89/copy 1/mod/*+disp8 4/rm32/sib 7/base/edi 1/index/ecx . 0/r32/eax 0xc/disp8 . # copy eax to *(edi+ecx+12) + # out->write += 4 + 81 0/subop/add 0/mod/indirect 7/rm32/edi . . . . . 4/imm32 # add to *edi +$write-int:end: + # . restore registers + 5f/pop-to-edi + 59/pop-to-ecx + 58/pop-to-eax + # . epilog + 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 5d/pop-to-ebp + c3/return + +$write-int:abort: + # . _write(2/stderr, error) + # . . push args + 68/push "write-int: out of space\n"/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 + # . syscall(exit, 1) + bb/copy-to-ebx 1/imm32 + b8/copy-to-eax 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + +test-write-int-single: + # - check that write-int writes to first int of 'stream' + # setup + # . clear-stream(_test-stream) + # . . push args + 68/push _test-stream/imm32 + # . . call + e8/call clear-stream/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + # write-int(_test-stream, "abcd") + # . . push args + 68/push 0x64636261/imm32 + 68/push _test-stream/imm32 + # . . call + e8/call write-int/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # check-stream-equal(_test-stream, "abcd", msg) + # . . push args + 68/push "F - test-write-int-single"/imm32 + 68/push "abcd"/imm32 + 68/push _test-stream/imm32 + # . . call + e8/call check-stream-equal/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp + # . end + c3/return + +test-write-byte-buffered-multiple: + # - check that write-int correctly appends multiple writes + # setup + # . clear-stream(_test-stream) + # . . push args + 68/push _test-stream/imm32 + # . . call + e8/call clear-stream/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + # write-int(_test-stream, "abcd") + # . . push args + 68/push 0x64636261/imm32 + 68/push _test-stream/imm32 + # . . call + e8/call write-int/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # write-int(_test-stream, "efgh") + # . . push args + 68/push 0x68676665/imm32 + 68/push _test-stream/imm32 + # . . call + e8/call write-int/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # check-stream-equal(_test-stream, "abcdefgh", msg) + # . . push args + 68/push "F - test-write-byte-buffered-multiple"/imm32 + 68/push "abcdefgh"/imm32 + 68/push _test-stream/imm32 + # . . call + e8/call check-stream-equal/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp + # . end + c3/return + +# . . vim:nowrap:textwidth=0 diff --git a/apps/assort b/apps/assort index 3e4911fd..b3353818 100755 --- a/apps/assort +++ b/apps/assort Binary files differdiff --git a/apps/crenshaw2-1 b/apps/crenshaw2-1 index e7e21ee0..3dfd2971 100755 --- a/apps/crenshaw2-1 +++ b/apps/crenshaw2-1 Binary files differdiff --git a/apps/crenshaw2-1b b/apps/crenshaw2-1b index 1e81ca9e..b22a1c59 100755 --- a/apps/crenshaw2-1b +++ b/apps/crenshaw2-1b Binary files differdiff --git a/apps/dquotes b/apps/dquotes index 4a00ec5e..571f6794 100755 --- a/apps/dquotes +++ b/apps/dquotes Binary files differdiff --git a/apps/factorial b/apps/factorial index 77db0705..5bf9c44c 100755 --- a/apps/factorial +++ b/apps/factorial Binary files differdiff --git a/apps/handle b/apps/handle index 141561a9..7e32773d 100755 --- a/apps/handle +++ b/apps/handle Binary files differdiff --git a/apps/hex b/apps/hex index b5eec4b5..4c73dd2b 100755 --- a/apps/hex +++ b/apps/hex Binary files differdiff --git a/apps/pack b/apps/pack index 63cc900f..0b07aca3 100755 --- a/apps/pack +++ b/apps/pack Binary files differdiff --git a/apps/sigils b/apps/sigils index 02e87655..745b71e5 100755 --- a/apps/sigils +++ b/apps/sigils Binary files differdiff --git a/apps/survey b/apps/survey index c2a0ffaf..933087ee 100755 --- a/apps/survey +++ b/apps/survey Binary files differdiff --git a/apps/tests b/apps/tests index ef4abae9..02cbc643 100755 --- a/apps/tests +++ b/apps/tests Binary files differ |