From dd9ba09a7c74455f17afb515c377a217fa8be8bc Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 29 Dec 2018 13:36:06 -0800 Subject: [PATCH] 4888 We only can't use rm32=5 when mod=0. Totally fine when it's mod=1. --- subx/050_write.subx | 6 ++-- subx/051test.subx | 6 ++-- subx/052kernel_string_equal.subx | 6 ++-- subx/053new_segment.subx | 2 +- subx/054string_equal.subx | 4 +-- subx/055trace.subx | 20 +++++------ subx/056write.subx | 12 +++---- subx/057stop.subx | 8 ++--- subx/058read.subx | 14 ++++---- subx/059read-byte.subx | 2 +- subx/060write-stream.subx | 14 ++++---- subx/061error.subx | 10 +++--- subx/062write-byte.subx | 6 ++-- subx/063print-byte.subx | 10 +++--- subx/064write-buffered.subx | 4 +-- subx/065error-byte.subx | 18 +++++----- subx/066allocate.subx | 4 +-- subx/apps/crenshaw2-1 | Bin 8333 -> 8241 bytes subx/apps/crenshaw2-1.subx | 56 +++++++++++++++---------------- subx/apps/crenshaw2-1b | Bin 8892 -> 8800 bytes subx/apps/crenshaw2-1b.subx | 56 +++++++++++++++---------------- subx/apps/factorial | Bin 7228 -> 7159 bytes subx/apps/factorial.subx | 10 +++--- subx/apps/hex | Bin 11840 -> 11755 bytes subx/apps/hex.subx | 42 +++++++++++------------ subx/examples/ex10 | Bin 165 -> 163 bytes subx/examples/ex10.subx | 4 +-- subx/examples/ex11 | Bin 1125 -> 1117 bytes subx/examples/ex11.subx | 16 ++++----- subx/examples/ex8 | Bin 139 -> 138 bytes subx/examples/ex8.subx | 2 +- subx/examples/ex9 | Bin 129 -> 127 bytes subx/examples/ex9.subx | 4 +-- subx/test_apps | 10 +++--- 34 files changed, 173 insertions(+), 173 deletions(-) diff --git a/subx/050_write.subx b/subx/050_write.subx index 1f146a5d..58cfde7c 100644 --- a/subx/050_write.subx +++ b/subx/050_write.subx @@ -22,12 +22,12 @@ _write: # fd : int, s : (address array byte) -> 53/push-EBX # syscall(write, fd, (data) s+4, (size) *s) # . fd : EBX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX # . data : ECX = s+4 - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0xc/disp8 . # copy *(EBP+12) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 0xc/disp8 . # copy *(EBP+12) to ECX 81 0/subop/add 3/mod/direct 1/rm32/ECX . . . . . 4/imm32 # add to ECX # . size : EDX = *s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX # . syscall b8/copy-to-EAX 4/imm32/write diff --git a/subx/051test.subx b/subx/051test.subx index 98816c80..e0b91d17 100644 --- a/subx/051test.subx +++ b/subx/051test.subx @@ -30,8 +30,8 @@ check-ints-equal: # (a : int, b : int, msg : (address array byte)) -> 51/push-ECX 53/push-EBX # load first 2 args into EAX and EBX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 0xc/disp8 . # copy *(EBP+12) to 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 @@ -49,7 +49,7 @@ check-ints-equal: # (a : int, b : int, msg : (address array byte)) -> $check-ints-equal:else: # . _write(2/stderr, msg) # . . push args - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0x10/disp8 . # copy *(EBP+16) to ECX + 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 diff --git a/subx/052kernel_string_equal.subx b/subx/052kernel_string_equal.subx index 02284c20..f663f504 100644 --- a/subx/052kernel_string_equal.subx +++ b/subx/052kernel_string_equal.subx @@ -54,12 +54,12 @@ kernel-string-equal: # s : null-terminated ascii string, benchmark : length-pre # return *s1 == 0 # # initialize s into EDI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # initialize benchmark length n into EDX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX # initialize benchmark data into ESI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI 81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 4/imm32 # add to ESI # initialize loop counter i into ECX b9/copy-to-ECX 0/imm32/exit diff --git a/subx/053new_segment.subx b/subx/053new_segment.subx index d88abdc6..0aee0539 100644 --- a/subx/053new_segment.subx +++ b/subx/053new_segment.subx @@ -29,7 +29,7 @@ new-segment: # len : int -> address 53/push-EBX # copy len to _mmap-new-segment->len # TODO: compute _mmap-new-segment+4 before runtime - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX bb/copy-to-EBX _mmap-new-segment/imm32 89/copy 1/mod/*+disp8 3/rm32/EBX . . . 0/r32/EAX 4/disp8 . # copy EAX to *(EBX+4) # mmap(_mmap-new-segment) diff --git a/subx/054string_equal.subx b/subx/054string_equal.subx index 2ac7cb72..fe6dd17b 100644 --- a/subx/054string_equal.subx +++ b/subx/054string_equal.subx @@ -35,9 +35,9 @@ string-equal: # s : string, benchmark : string -> EAX : boolean # s[i]: EAX # # var s/EAX : (address array byte) - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX # var benchmark/EBX : (address array byte) - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 0xc/disp8 . # copy *(EBP+12) to EBX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 0xc/disp8 . # copy *(EBP+12) to EBX # if s->length != b->length return false # EDX = s->length 8b/copy 0/mod/indirect 0/rm32/EAX . . . 2/r32/EDX . . # copy *EAX to EDX diff --git a/subx/055trace.subx b/subx/055trace.subx index c420c38a..17ecb29b 100644 --- a/subx/055trace.subx +++ b/subx/055trace.subx @@ -80,9 +80,9 @@ trace: # t : (address trace-stream), line : string 56/push-ESI 57/push-EDI # EDI = t - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # ESI = line - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI # ECX = t->write 8b/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . . # copy *EDI to ECX # EDX = t->length @@ -143,7 +143,7 @@ clear-trace-stream: # t : (address trace-stream) 50/push-EAX 51/push-ECX # EAX = t - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX # ECX = t->length 8b/copy 1/mod/*+disp8 0/rm32/EAX . . . 1/r32/ECX 8/disp8 . # copy *(EAX+8) to ECX # ECX = &t->data[t->length] @@ -284,7 +284,7 @@ _append-3: # out : address, outend : address, s : (array byte) -> num_bytes_app 51/push-ECX # _append-4(out, outend, &s->data[0], &s->data[s->length]) -> num_bytes_appended/EAX # . . push &s->data[s->length] - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 0/r32/EAX 0x10/disp8 . # copy *(EBP+16) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 0/r32/EAX 0x10/disp8 . # copy *(EBP+16) to EAX 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX 51/push-ECX @@ -292,9 +292,9 @@ _append-3: # out : address, outend : address, s : (array byte) -> num_bytes_app 8d/copy-address 1/mod/*+disp8 0/rm32/EAX . . . 1/r32/ECX 4/disp8 . # copy EAX+4 to ECX 51/push-ECX # . . push outend - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . push out - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call _append-4/disp32 # . . discard args @@ -321,13 +321,13 @@ _append-4: # out : address, outend : address, in : address, inend : address -> # EAX/num_bytes_appended = 0 b8/copy-to-EAX 0/imm32 # EDI = out - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # EDX = outend - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX # ESI = in - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0x10/disp8 . # copy *(EBP+16) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0x10/disp8 . # copy *(EBP+16) to ESI # ECX = inend - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0x14/disp8 . # copy *(EBP+20) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 0x14/disp8 . # copy *(EBP+20) to ECX $_append-4:loop: # if ESI/in >= ECX/inend break 39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI with ECX diff --git a/subx/056write.subx b/subx/056write.subx index 3e52b4f2..395d33b5 100644 --- a/subx/056write.subx +++ b/subx/056write.subx @@ -33,11 +33,11 @@ write: # f : fd or (address stream), s : (address array byte) -> 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (f < 0x08000000) _write(f, s), return # f can't be a user-mode address, so treat it as a kernel file descriptor - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) 7d/jump-if-greater-or-equal $write:fake/disp8 # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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 . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call _write/disp32 # . . discard args @@ -51,14 +51,14 @@ $write:fake: 52/push-EDX 53/push-EBX # ECX = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX # EDX = f->write 8b/copy 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # copy *ECX to EDX # EBX = f->length 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 3/r32/EBX 8/disp8 . # copy *(ECX+8) to EBX # EAX = _append-3(&f->data[f->write], &f->data[f->length], s) # . . push s - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . push &f->data[f->length] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 3/index/EBX . 3/r32/EBX 0xc/disp8 . # copy ECX+EBX+12 to EBX 53/push-EBX @@ -90,7 +90,7 @@ clear-stream: # f : (address stream) -> 50/push-EAX 51/push-ECX # EAX = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX # ECX = f->length 8b/copy 1/mod/*+disp8 0/rm32/EAX . . . 1/r32/ECX 8/disp8 . # copy *(EAX+8) to ECX # ECX = &f->data[f->length] diff --git a/subx/057stop.subx b/subx/057stop.subx index b1aee746..f9e67f9e 100644 --- a/subx/057stop.subx +++ b/subx/057stop.subx @@ -56,7 +56,7 @@ tailor-exit-descriptor: # ed : (address exit-descriptor), nbytes : int -> target - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX 89/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy EAX to *ECX # initialize ed->value c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 0/imm32 # copy to *(ECX+4) @@ -172,7 +172,7 @@ _test-stop-1: # ed : (address exit-descriptor) 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # _test-stop-2(ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call _test-stop-2/disp32 # should never get past this point @@ -200,7 +200,7 @@ _test-stop-2: # ed : (address exit-descriptor) # . stop(ed, 1) # . . push args 68/push 1/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call stop/disp32 # should never get past this point diff --git a/subx/058read.subx b/subx/058read.subx index 16b50f07..42056a13 100644 --- a/subx/058read.subx +++ b/subx/058read.subx @@ -57,11 +57,11 @@ read: # f : fd or (address stream), s : (address stream) -> num-bytes-read/EAX 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (f < 0x08000000) return _read(f, s) # f can't be a user-mode address, so treat it as a kernel file descriptor - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) 7d/jump-if-greater-or-equal $read:fake/disp8 # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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 . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call _read/disp32 # . . discard args @@ -74,9 +74,9 @@ $read:fake: 56/push-ESI 57/push-EDI # ESI = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI # EDI = s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to ESI # EAX = _append-4(out = &s->data[s->write], outend = &s->data[s->length], # in = &f->data[f->read], inend = &f->data[f->write]) # . . push &f->data[f->write] @@ -128,14 +128,14 @@ _read: # fd : int, s : (address stream) -> num-bytes-read/EAX 53/push-EBX 56/push-ESI # ESI = s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI # EAX = s->write 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # copy *ESI to EAX # EDX = s->length 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 2/r32/EDX 8/disp8 . # copy *(ESI+8) to EDX # syscall(read, fd, &s->data[s->write], s->length - s->write) # . . fd : EBX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX # . . data : ECX = &s->data[s->write] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 1/r32/ECX 0xc/disp8 . # copy ESI+EAX+12 to ECX # . . size : EDX = s->length - s->write diff --git a/subx/059read-byte.subx b/subx/059read-byte.subx index e4b54b61..fc583809 100644 --- a/subx/059read-byte.subx +++ b/subx/059read-byte.subx @@ -50,7 +50,7 @@ read-byte: # f : (address buffered-file) -> byte-or-eof/EAX 51/push-ECX 56/push-ESI # ESI = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI # ECX = f->read 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 8/disp8 . # copy *(ESI+8) to ECX # if (f->read >= f->write) populate stream from file diff --git a/subx/060write-stream.subx b/subx/060write-stream.subx index 66e15c7b..a9859ec9 100644 --- a/subx/060write-stream.subx +++ b/subx/060write-stream.subx @@ -24,11 +24,11 @@ write-stream: # f : fd or (address stream), s : (address stream) -> 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # if (f < 0x08000000) _write-stream(f, s), return # f can't be a user-mode address, so treat it as a kernel file descriptor - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x08000000/imm32 # compare *(EBP+8) 7d/jump-if-greater-or-equal $write-stream:fake/disp8 # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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 . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call _write-stream/disp32 # . . discard args @@ -41,9 +41,9 @@ $write-stream:fake: 56/push-ESI 57/push-EDI # EDI = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # ESI = s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI # EAX = _append-4(&f->data[f->write], &f->data[f->length], &s->data[s->read], &s->data[s->write]) # . . push &s->data[s->write] 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # copy *ESI to EAX @@ -91,14 +91,14 @@ _write-stream: # fd : int, s : (address stream) -> 56/push-ESI 57/push-EDI # ESI = s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI # EDI = s->read 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 7/r32/EDI 4/disp8 . # copy *(ESI+4) to EDI # EDX = s->write 8b/copy 0/mod/indirect 6/rm32/ESI . . . 2/r32/EDX . . # copy *ESI to EDX # syscall(write, fd, &s->data[s->read], s->write-s->read) # . . fd : EBX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX # . . data : ECX = &s->data[s->read] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 7/index/EDI . 1/r32/ECX 0xc/disp8 . # copy ESI+EDI+12 to ECX # . . size : EDX = s->write - s->read diff --git a/subx/061error.subx b/subx/061error.subx index ef244162..efda8ea3 100644 --- a/subx/061error.subx +++ b/subx/061error.subx @@ -20,15 +20,15 @@ error: # ed : (address exit-descriptor), out : fd or (address stream), msg : (a # write(out, "Error: ") # . . push args 68/push "Error: "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(out, msg) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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/disp32 # . . discard args @@ -36,7 +36,7 @@ error: # ed : (address exit-descriptor), out : fd or (address stream), msg : (a # write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -44,7 +44,7 @@ error: # ed : (address exit-descriptor), out : fd or (address stream), msg : (a # stop(ed, 1) # . . push args 68/push 1/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call stop/disp32 # should never get past this point diff --git a/subx/062write-byte.subx b/subx/062write-byte.subx index d6a3a90b..ad29d9f1 100644 --- a/subx/062write-byte.subx +++ b/subx/062write-byte.subx @@ -43,7 +43,7 @@ write-byte: # f : (address buffered-file), n : int -> 51/push-ECX 57/push-EDI # EDI = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # ECX = f->write 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 4/disp8 . # copy *(EDI+4) to ECX # if (f->write >= f->length) flush and clear f's stream @@ -68,7 +68,7 @@ $write-byte:to-stream: # write to stream # f->data[f->read] = LSB(n) 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX - 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/AL 0xc/disp8 . # copy byte at *(EBP+12) to AL + 8a/copy-byte 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/AL 0xc/disp8 . # copy byte at *(EBP+12) to AL 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX . 0/r32/AL 0x10/disp8 . # copy AL to *(EDI+ECX+16) # ++f->read ff 0/subop/increment 1/mod/*+disp8 7/rm32/EDI . . . . 4/disp8 . # increment *(EDI+4) @@ -89,7 +89,7 @@ flush: # f : (address buffered-file) -> 50/push-EAX 51/push-ECX # EAX = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX # write-stream(f->fd, data = f+4) # . . push args 8d/copy-address 1/mod/*+disp8 0/rm32/EAX . . . 1/r32/ECX 4/disp8 . # copy EAX+4 to ECX diff --git a/subx/063print-byte.subx b/subx/063print-byte.subx index 61b19146..8bd9fbfc 100644 --- a/subx/063print-byte.subx +++ b/subx/063print-byte.subx @@ -19,7 +19,7 @@ print-byte: # f : (address buffered-file), n : int -> # . save registers 50/push-EAX # AL = convert upper nibble to hex - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX c1/shift 5/subop/logic-right 3/mod/direct 0/rm32/EAX . . . . . 4/imm8 # shift EAX right by 4 bits, while padding zeroes # . hex-char(AL) # . . push args @@ -31,13 +31,13 @@ print-byte: # f : (address buffered-file), n : int -> # write-byte(f, AL) # . . push args 50/push-EAX - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call write-byte/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # AL = convert lower nibble to hex - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX 25/and-EAX 0xf/imm32 # . hex-char(AL) # . . push args @@ -49,7 +49,7 @@ print-byte: # f : (address buffered-file), n : int -> # write-byte(f, AL) # . . push args 50/push-EAX - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call write-byte/disp32 # . . discard args @@ -70,7 +70,7 @@ hex-char: # n : int -> char_or_error/EAX 55/push-EBP 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = n - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX # if it's <= 9 add '0' to it 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0x9/imm32 # compare EAX 7f/jump-if-greater $hex-char:check2/disp8 diff --git a/subx/064write-buffered.subx b/subx/064write-buffered.subx index 55d703c2..3c3c7276 100644 --- a/subx/064write-buffered.subx +++ b/subx/064write-buffered.subx @@ -45,14 +45,14 @@ write-buffered: # f : (address buffered-file), msg : (address array byte) -> data 8d/copy-address 1/mod/*+disp8 0/rm32/EAX . . . 6/r32/ESI 4/disp8 . # copy EAX+4 to ESI # inend/ECX = &msg->data[msg->length] 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX 8d/copy-address 0/mod/indirect 4/rm32/sib 6/base/ESI 1/index/ECX . 1/r32/ECX . . # copy ESI+ECX to ECX # EDI = f - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # EDX = f->length 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 2/r32/EDX 0xc/disp8 . # copy *(EDI+12) to EDX # EBX = f->write diff --git a/subx/065error-byte.subx b/subx/065error-byte.subx index bbbf6c36..5f9a4ada 100644 --- a/subx/065error-byte.subx +++ b/subx/065error-byte.subx @@ -34,15 +34,15 @@ error-byte: # ed : (address exit-descriptor), out : (address buffered-file), ms # write-buffered(out, "Error: ") # . . push args 68/push "Error: "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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 @@ -50,15 +50,15 @@ error-byte: # ed : (address exit-descriptor), out : (address buffered-file), ms # write-buffered(out, ": ") # . . push args 68/push ": "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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 @@ -66,14 +66,14 @@ error-byte: # ed : (address exit-descriptor), out : (address buffered-file), ms # write-buffered(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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 # . flush(out) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call flush/disp32 # . . discard args @@ -81,7 +81,7 @@ error-byte: # ed : (address exit-descriptor), out : (address buffered-file), ms # stop(ed, 1) # . . push args 68/push 1/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call stop/disp32 # should never get past this point diff --git a/subx/066allocate.subx b/subx/066allocate.subx index 92da3815..0e3b54f6 100644 --- a/subx/066allocate.subx +++ b/subx/066allocate.subx @@ -46,13 +46,13 @@ allocate: # ad : (address allocation-descriptor), n : int -> address-or-null/EA 51/push-ECX 52/push-EDX # ECX = ad - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX # save ad->curr 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy *ECX to EAX # check if there's enough space # . EDX = ad->curr + n 89/copy 3/mod/direct 2/rm32/EDX . . . 0/r32/EAX . . # copy EAX to EDX - 03/add 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # add *(EBP+12) to EDX + 03/add 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # add *(EBP+12) to EDX 3b/compare 1/mod/*+disp8 1/rm32/ECX . . . 2/r32/EDX 4/disp8 . # compare EDX with *(ECX+4) 7c/jump-if-lesser $allocate:commit/disp8 # return null if not diff --git a/subx/apps/crenshaw2-1 b/subx/apps/crenshaw2-1 index 1f3b543679b683b065fa623e50796c569054ce8f..5a28117cbe66f02dcc7d2d3153c41ca4157f8f4c 100755 GIT binary patch literal 8241 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 literal 8333 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 1 and argv[1] == "test" then return run_tests() # . argc > 1 - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # . argv[1] == "test" # . . push args 68/push "test"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call kernel-string-equal/disp32 # . . discard args @@ -91,7 +91,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # prime the pump # . Look = get-char(in) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call get-char/disp32 # . . discard args @@ -116,10 +116,10 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # read a digit from 'in' into 'num' # . get-num(in, num, err, ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) + 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 . . . . 0x10/disp8 . # push *(EBP+16) 51/push-ECX/num - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call get-num/disp32 # . . discard args @@ -132,7 +132,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "bb/copy-to-EBX ") # . . push args 68/push "bb/copy-to-EBX "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -140,7 +140,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write-stream(out, num) # . . push args 51/push-ECX/num - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write-stream/disp32 # . . discard args @@ -148,7 +148,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -156,7 +156,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "b8/copy-to-EAX 1/imm32/exit") # . . push args 68/push "b8/copy-to-EAX 1/imm32/exit"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -164,7 +164,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -172,7 +172,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "cd/syscall 0x80/imm8") # . . push args 68/push "cd/syscall 0x80/imm8"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -180,7 +180,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -235,8 +235,8 @@ get-num: # in : (address buffered-file), out : (address stream), err : fd or (a # . expected(ed, err, "integer") # . . push args 68/push "integer"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) + 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 . . . . 0x14/disp8 . # push *(EBP+20) # . . call e8/call expected/disp32 # never returns # . . discard args @@ -252,9 +252,9 @@ $get-num:main: 57/push-EDI # read necessary variables to registers # ESI = in - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI # EDI = out - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI # ECX = out->write 8b/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . . # copy *EDI to ECX # EDX = out->length @@ -265,8 +265,8 @@ $get-num:main: # . error(ed, err, msg) # TODO: show full number # . . push args 68/push "get-num: too many digits in number"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) + 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 . . . . 0x14/disp8 . # push *(EBP+20) # . . call e8/call error/disp32 # never returns # . . discard args @@ -487,15 +487,15 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, "Error: ") # . . push args 68/push "Error: "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, s) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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/disp32 # . . discard args @@ -503,7 +503,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, " expected") # . . push args 68/push " expected"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -511,7 +511,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -519,7 +519,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # stop(ed, 1) # . . push args 68/push 1/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call stop/disp32 # should never get past this point @@ -538,7 +538,7 @@ get-char: # f : (address buffered-file) -> 50/push-EAX # read-byte(f) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call read-byte/disp32 # . . discard args @@ -560,10 +560,10 @@ is-digit?: # c : int -> bool/EAX # EAX = false b8/copy-to-EAX 0/imm32 # if c < '0' return false - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x30/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x30/imm32 # compare *(EBP+8) 7c/jump-if-lesser $is-digit?:end/disp8 # if c > '9' return false - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x39/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x39/imm32 # compare *(EBP+8) 7f/jump-if-greater $is-digit?:end/disp8 # otherwise return true b8/copy-to-EAX 1/imm32 diff --git a/subx/apps/crenshaw2-1b b/subx/apps/crenshaw2-1b index 08395a6b91d651253c228342598f1e60b303c9fe..46a261830933eecc5991dea27bbda60691cabe65 100755 GIT binary patch literal 8800 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 literal 8892 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 1 and argv[1] == "test" then return run_tests() # . argc > 1 - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # . argv[1] == "test" # . . push args 68/push "test"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call kernel-string-equal/disp32 # . . discard args @@ -91,7 +91,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # prime the pump # . Look = get-char(in) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call get-char/disp32 # . . discard args @@ -116,10 +116,10 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # read a digit from 'in' into 'num' # . get-num(in, num, err, ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) + 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 . . . . 0x10/disp8 . # push *(EBP+16) 51/push-ECX/num - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call get-num/disp32 # . . discard args @@ -132,7 +132,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "bb/copy-to-EBX ") # . . push args 68/push "bb/copy-to-EBX "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -140,7 +140,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write-stream(out, num) # . . push args 51/push-ECX/num - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write-stream/disp32 # . . discard args @@ -148,7 +148,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -156,7 +156,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "b8/copy-to-EAX 1/imm32/exit") # . . push args 68/push "b8/copy-to-EAX 1/imm32/exit"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -164,7 +164,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -172,7 +172,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, "cd/syscall 0x80/imm8") # . . push args 68/push "cd/syscall 0x80/imm8"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -180,7 +180,7 @@ compile: # in : (address buffered-file), out : fd or (address stream), err : fd # . write(out, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -240,8 +240,8 @@ get-num: # in : (address buffered-file), out : (address stream), err : fd or (a # . expected(ed, err, "integer") # . . push args 68/push "integer"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) + 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 . . . . 0x14/disp8 . # push *(EBP+20) # . . call e8/call expected/disp32 # never returns # . . discard args @@ -257,9 +257,9 @@ $get-num:main: 57/push-EDI # read necessary variables to registers # ESI = in - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI # EDI = out - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI # ECX = out->write 8b/copy 0/mod/indirect 7/rm32/EDI . . . 1/r32/ECX . . # copy *EDI to ECX # EDX = out->length @@ -271,8 +271,8 @@ $get-num:loop: # . error(ed, err, msg) # TODO: show full number # . . push args 68/push "get-num: too many digits in number"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) + 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 . . . . 0x14/disp8 . # push *(EBP+20) # . . call e8/call error/disp32 # never returns # . . discard args @@ -686,15 +686,15 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, "Error: ") # . . push args 68/push "Error: "/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP # write(f, s) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + 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/disp32 # . . discard args @@ -702,7 +702,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, " expected") # . . push args 68/push " expected"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -710,7 +710,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # write(f, Newline) # . . push args 68/push Newline/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write/disp32 # . . discard args @@ -718,7 +718,7 @@ expected: # ed : (address exit-descriptor), f : fd or (address stream), s : (ad # stop(ed, 1) # . . push args 68/push 1/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call stop/disp32 # should never get past this point @@ -736,7 +736,7 @@ get-char: # f : (address buffered-file) -> 50/push-EAX # read-byte(f) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call read-byte/disp32 # . . discard args @@ -757,10 +757,10 @@ is-digit?: # c : int -> bool/EAX # EAX = false b8/copy-to-EAX 0/imm32 # if c < '0' return false - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x30/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x30/imm32 # compare *(EBP+8) 7c/jump-if-lesser $is-digit?:end/disp8 # if c > '9' return false - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x39/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 0x39/imm32 # compare *(EBP+8) 7f/jump-if-greater $is-digit?:end/disp8 # otherwise return true b8/copy-to-EAX 1/imm32 diff --git a/subx/apps/factorial b/subx/apps/factorial index 3bd1c65bfa688ce8fc21e8d503d9faa8fcdc660f..679feb7191a0b71058fdcf835418fca89eb339c5 100755 GIT binary patch literal 7159 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 literal 7228 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 diff --git a/subx/apps/factorial.subx b/subx/apps/factorial.subx index adc772db..068a63cb 100644 --- a/subx/apps/factorial.subx +++ b/subx/apps/factorial.subx @@ -24,12 +24,12 @@ 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # - if argc > 1 and argv[1] == "test" then return run_tests() # . argc > 1 - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # . argv[1] == "test" # . . push args 68/push "test"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call kernel-string-equal/disp32 # . . discard args @@ -63,10 +63,10 @@ factorial: # n : int -> int/EAX # EAX = 1 (base case) b8/copy-to-EAX 1/imm32 # if (n <= 1) return - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 1/imm32 # compare *(EBP+8) + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 1/imm32 # compare *(EBP+8) 7e/jump-if-<= $factorial:end/disp8 # EBX = n-1 - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 3/r32/EBX 8/disp8 . # copy *(EBP+8) to EBX 81 5/subop/subtract 3/mod/direct 3/rm32/EBX . . . . . 1/imm32 # subtract from EBX # EAX = factorial(n-1) # . . push args @@ -76,7 +76,7 @@ factorial: # n : int -> int/EAX # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP # return n * factorial(n-1) - f7 4/subop/multiply 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 8/disp8 . # multiply *(EBP+8) into EAX + f7 4/subop/multiply 1/mod/*+disp8 5/rm32/EBP . . 8/disp8 . # multiply *(EBP+8) into EAX # TODO: check for overflow $factorial:end: # . epilog diff --git a/subx/apps/hex b/subx/apps/hex index 9287faa727d7007b5d79b1da8db94d798e2e45c9..93c9f27f7ec04280e48ee1b4a79c70be83449afa 100755 GIT binary patch literal 11755 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 G`Tqd-Z?9+o diff --git a/subx/apps/hex.subx b/subx/apps/hex.subx index 032c1da7..2660bd54 100644 --- a/subx/apps/hex.subx +++ b/subx/apps/hex.subx @@ -27,12 +27,12 @@ 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # - if argc > 1 and argv[1] == "test" then return run_tests() # . argc > 1 - 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0/disp8 1/imm32 # compare *EBP + 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0/disp8 1/imm32 # compare *EBP 7e/jump-if-lesser-or-equal $run-main/disp8 # . argv[1] == "test" # . . push args 68/push "test"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call kernel-string-equal/disp32 # . . discard args @@ -91,9 +91,9 @@ convert: # in : (address buffered-file), out : (address buffered-file), err : ( $convert:loop: # EAX = convert-next-octet(in, err, ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x14/disp8 . # push *(EBP+20) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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 . . . . 0x10/disp8 . # push *(EBP+16) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call convert-next-octet/disp32 # . . discard first 2 args @@ -104,7 +104,7 @@ $convert:loop: # write-byte(out, AL) # . . push args 50/push-EAX - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call write-byte/disp32 # . . discard args @@ -114,7 +114,7 @@ $convert:loop: $convert:loop-end: # flush(out) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) # . . call e8/call flush/disp32 # . . discard args @@ -151,9 +151,9 @@ convert-next-octet: # in : (address buffered-file), err : (address buffered-fil 51/push-ECX # EAX = scan-next-byte(in, err, ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call scan-next-byte/disp32 # . . discard args @@ -167,9 +167,9 @@ convert-next-octet: # in : (address buffered-file), err : (address buffered-fil 89/copy 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # copy EAX to ECX # EAX = scan-next-byte(in, err, ed) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + 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) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call scan-next-byte/disp32 # . . discard args @@ -181,8 +181,8 @@ convert-next-octet: # in : (address buffered-file), err : (address buffered-fil # . . push args 68/push 0x2e/imm32/period/dummy 68/push "convert-next-octet: partial byte found"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) + 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 error-byte/disp32 # never returns $convert-next-octet:convert: @@ -508,7 +508,7 @@ scan-next-byte: # in : (address buffered-file), err : (address buffered-file), $scan-next-byte:loop: # EAX = read-byte(in) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call read-byte/disp32 # . . discard args @@ -548,7 +548,7 @@ $scan-next-byte:check2: 75/jump-if-not-equal $scan-next-byte:check3/disp8 # . skip-until-newline(in) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call skip-until-newline/disp32 # . . discard args @@ -559,8 +559,8 @@ $scan-next-byte:check3: # . . push args 50/push-EAX 68/push "scan-next-byte: invalid byte"/imm32 - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 . # push *(EBP+12) - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0x10/disp8 . # push *(EBP+16) + 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 error-byte/disp32 # never returns $scan-next-byte:end: @@ -1421,7 +1421,7 @@ is-hex-lowercase-byte?: # c : byte -> bool/EAX # . save registers 51/push-ECX # ECX = c - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX # return false if c < '0' b8/copy-to-EAX 0/imm32/false 81 7/subop/compare 3/mod/direct 1/rm32/ECX . . . . . 0x30/imm32 # compare ECX @@ -1601,7 +1601,7 @@ skip-until-newline: # in : (address buffered-file) -> $skip-until-newline:loop: # . EAX = read-byte(in) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call read-byte/disp32 # . . discard args diff --git a/subx/examples/ex10 b/subx/examples/ex10 index e6d8b3c4f17a9faae1419f418bc3efd741b96b28..9cdfb983f9ce7158c47121be717e39b30ca031d2 100755 GIT binary patch delta 33 lcmZ3=xR`N*i?}}n0|N-N0x^RC14HN2|D`xIR0|N-NG5~=90|O(FS_|X@G1uCOi6Zg>Ku+i39U$?u4WXS+1A~IY z!n|m;*LOh6U!nR)ks=kRVVRXeT>DEhw0RyIncD zV|grZlnP};09C!v1$XC=*Z4Dv4?@i1OS73 zH!ubmx_vns4}z3-hjMfa?EtaPHbh57Mt~H)hyc3iMLmdE1|rUah%X>Q8W=n;oHlP{ H+QJ9`0(_@b delta 495 zcmcc1@swkNi>xCP0|N-NG5~=90|O(F+6v?YG1u0Ki6Tl8Ku+i39U$?u4WXS+1A~IY z!nqE;G69nPqLD`rC|uAkh< zC|17-E_Lf4+JL4hdfQ@+xSGx|O_B}$aF_Kyp7MS~*5NdTmfG diff --git a/subx/examples/ex11.subx b/subx/examples/ex11.subx index 5acd5bf0..84ef43d9 100644 --- a/subx/examples/ex11.subx +++ b/subx/examples/ex11.subx @@ -53,12 +53,12 @@ kernel-string-equal: # s : null-terminated ascii string, benchmark : length-pre # return false # return *s1 == 0 # initialize s into EDI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI # initialize benchmark length n into EDX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX # initialize benchmark data into ESI - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI 81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 4/imm32 # add to ESI # initialize loop counter i into ECX b9/copy-to-ECX 0/imm32/exit @@ -261,8 +261,8 @@ check-ints-equal: # (a : int, b : int, msg : (address array byte)) -> boolean 51/push-ECX 53/push-EBX # load args into EAX, EBX and ECX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 0xc/disp8 . # copy *(EBP+12) to 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 == b/EBX print('.') and return 39/compare 3/mod/direct 0/rm32/EAX . . . 3/r32/EBX . . # compare EAX and EBX 75/jump-if-unequal $check-ints-equal:else/disp8 @@ -278,7 +278,7 @@ check-ints-equal: # (a : int, b : int, msg : (address array byte)) -> boolean # otherwise print(msg) $check-ints-equal:else: # copy msg into ECX - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 0x10/disp8 . # copy *(EBP+16) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 0x10/disp8 . # copy *(EBP+16) to ECX # print(ECX) # . . push args 51/push-ECX @@ -315,10 +315,10 @@ write-stderr: # s : (address array byte) -> # . . fd = 2 (stderr) bb/copy-to-EBX 2/imm32 # . . x = s+4 - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX 81 0/subop/add 3/mod/direct 1/rm32/ECX . . . . . 4/imm32 # add to ECX # . . size = *s - 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 2/r32/EDX 8/disp8 . # copy *(EBP+8) to EDX + 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 8/disp8 . # copy *(EBP+8) to EDX 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX # . . syscall b8/copy-to-EAX 4/imm32/write diff --git a/subx/examples/ex8 b/subx/examples/ex8 index dda6151093c478702291321204d381cca57631ac..9a92bc7d5df17f8481111a35f2eec99aa8b56cf0 100755 GIT binary patch delta 30 hcmeBX>|&hYB4WnCzyQLmK+GV(z|i^hf9b?XBLGt-27dqm delta 31 icmeBT>}H(cB5KaSzyQLmK+GV(z|i^he~IeE2qOSlSq7y5 diff --git a/subx/examples/ex8.subx b/subx/examples/ex8.subx index 75a77a50..d9234123 100644 --- a/subx/examples/ex8.subx +++ b/subx/examples/ex8.subx @@ -23,7 +23,7 @@ 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP # EAX = ascii-length(argv[1]) # . . push args - ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 . # push *(EBP+8) + ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call ascii-length/disp32 # . . discard args diff --git a/subx/examples/ex9 b/subx/examples/ex9 index dc9c0e3c0fa207ddc4b0846ed9c05c15ae78ab12..ffbea21b9d7388d4ce3d8bfef42183cbf306c118 100755 GIT binary patch delta 32 jcmZo