about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-09-02 15:12:44 -0700
committerKartik Agaram <vc@akkartik.com>2019-09-02 15:15:11 -0700
commit968380517a7bea91ebcbf02a329da4fdbf7b3d78 (patch)
tree0f8e0c36f2000042e84ebc6c1c083bb076dc3a88
parent604c8315bd7251daa898dd646cb8595f3700ed21 (diff)
downloadmu-968380517a7bea91ebcbf02a329da4fdbf7b3d78.tar.gz
5608 - write int to stream
-rw-r--r--064write-byte.subx6
-rw-r--r--079write-int.subx119
-rwxr-xr-xapps/assortbin38657 -> 39000 bytes
-rwxr-xr-xapps/crenshaw2-1bin30993 -> 31336 bytes
-rwxr-xr-xapps/crenshaw2-1bbin31552 -> 31895 bytes
-rwxr-xr-xapps/dquotesbin43819 -> 44162 bytes
-rwxr-xr-xapps/factorialbin30005 -> 30348 bytes
-rwxr-xr-xapps/handlebin30859 -> 31202 bytes
-rwxr-xr-xapps/hexbin41050 -> 41393 bytes
-rwxr-xr-xapps/packbin51343 -> 51686 bytes
-rwxr-xr-xapps/sigilsbin52513 -> 52856 bytes
-rwxr-xr-xapps/surveybin47940 -> 48283 bytes
-rwxr-xr-xapps/testsbin37469 -> 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