From bfcc0f858aa324739ad645e2056d73a47ab66f82 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 3 Apr 2020 12:35:53 -0700 Subject: [PATCH] 6182 - start of support for safe handles So far it's unclear how to do this in a series of small commits. Still nibbling around the edges. In this commit we standardize some terminology: The length of an array or stream is denominated in the high-level elements. The _size_ is denominated in bytes. The thing we encode into the type is always the size, not the length. There's still an open question of what to do about the Mu `length` operator. I'd like to modify it to provide the length. Currently it provides the size. If I can't fix that I'll rename it. --- 052kernel-string-equal.subx | 10 ++++----- 054string-equal.subx | 28 ++++++++++++------------- 055stream.subx | 8 ++++---- 056trace.subx | 30 +++++++++++++-------------- 057write.subx | 10 ++++----- 058stream-equal.subx | 26 +++++++++++------------ 060read.subx | 22 ++++++++++---------- 061read-byte.subx | 10 ++++----- 062write-stream.subx | 6 +++--- 064write-byte.subx | 12 +++++------ 065write-buffered.subx | 14 ++++++------- 067parse-hex.subx | 6 +++--- 070new-stream.subx | 8 ++++---- 071read-line.subx | 8 ++++---- 072slice.subx | 32 ++++++++++++++--------------- 075print-int-decimal.subx | 4 ++-- 081table.subx | 24 +++++++++++----------- 082slurp.subx | 4 ++-- 083subx-widths.subx | 2 +- 084emit-hex-array.subx | 4 ++-- 091write-int.subx | 2 +- 092stack.subx | 26 +++++++++++------------ 100array-equal.subx | 28 ++++++++++++------------- apps/assort | Bin 40844 -> 40838 bytes apps/braces | Bin 42645 -> 42633 bytes apps/calls | Bin 47306 -> 47294 bytes apps/crenshaw2-1 | Bin 40247 -> 40241 bytes apps/crenshaw2-1.subx | 12 +++++------ apps/crenshaw2-1b | Bin 40794 -> 40788 bytes apps/crenshaw2-1b.subx | 12 +++++------ apps/dquotes | Bin 44489 -> 44483 bytes apps/ex11.subx | 14 ++++++------- apps/factorial | Bin 39266 -> 39260 bytes apps/handle | Bin 40164 -> 40158 bytes apps/hex | Bin 43086 -> 43080 bytes apps/mu | Bin 210776 -> 210762 bytes apps/mu.subx | 40 ++++++++++++++++++------------------ apps/pack | Bin 53231 -> 53225 bytes apps/sigils | Bin 55030 -> 55018 bytes apps/survey | Bin 49850 -> 49844 bytes apps/survey.subx | 40 ++++++++++++++++++------------------ apps/tests | Bin 39637 -> 39631 bytes 42 files changed, 221 insertions(+), 221 deletions(-) diff --git a/052kernel-string-equal.subx b/052kernel-string-equal.subx index dca4d399..9fd22d8d 100644 --- a/052kernel-string-equal.subx +++ b/052kernel-string-equal.subx @@ -1,11 +1,11 @@ # Checking null-terminated ascii strings. # # By default we create strings as arrays of bytes, and all arrays have a 4-byte -# length prefix. +# size prefix. # # However, we sometimes need to deal with null-prefixed strings when interacting # with the Linux kernel. This layer implements a function for comparing a -# null-terminated 'kernel string' with a length-prefixed 'SubX string'. +# null-terminated 'kernel string' with a size-prefixed 'SubX string'. # # To run (from the subx directory): # $ ./bootstrap translate 05[0-2]*.subx -o /tmp/tmp52 @@ -28,11 +28,11 @@ Entry: # run all tests b8/copy-to-eax 1/imm32/exit cd/syscall 0x80/imm8 -# compare a null-terminated ascii string with a more idiomatic length-prefixed byte array +# compare a null-terminated ascii string with a more idiomatic size-prefixed byte array # reason for the name: the only place we should have null-terminated ascii strings is from commandline args kernel-string-equal?: # s: (addr kernel-string), benchmark: (addr array byte) -> eax: boolean # pseudocode: - # n = benchmark->length + # n = benchmark->size # s1 = s # s2 = benchmark->data # i = 0 @@ -63,7 +63,7 @@ kernel-string-equal?: # s: (addr kernel-string), benchmark: (addr array byte) - 57/push-edi # var s1/edi: (addr byte) = s 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi - # var n/edx: int = benchmark->length + # var n/edx: int = benchmark->size 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 # var s2/esi: (addr byte) = benchmark->data diff --git a/054string-equal.subx b/054string-equal.subx index 29c06549..24d001b0 100644 --- a/054string-equal.subx +++ b/054string-equal.subx @@ -1,4 +1,4 @@ -# Comparing 'regular' length-prefixed strings. +# Comparing 'regular' size-prefixed strings. == code # instruction effective address register displacement immediate @@ -15,7 +15,7 @@ Entry: # run all tests string-equal?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boolean # pseudocode: - # if (s->length != benchmark->length) return false + # if (s->size != benchmark->size) return false # return string-starts-with?(s, benchmark) # # . prologue @@ -29,10 +29,10 @@ string-equal?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boo 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # edi = benchmark 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi - # ecx = s->length + # ecx = s->size 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx -$string-equal?:lengths: - # if (ecx != benchmark->length) return false +$string-equal?:sizes: + # if (ecx != benchmark->size) return false 39/compare 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # compare *edi and ecx b8/copy-to-eax 0/imm32/false 75/jump-if-!= $string-equal?:end/disp8 @@ -57,10 +57,10 @@ $string-equal?:end: string-starts-with?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boolean # pseudocode: - # if (s->length < benchmark->length) return false + # if (s->size < benchmark->size) return false # currs = s->data # currb = benchmark->data - # maxb = &benchmark->data[benchmark->length] + # maxb = &benchmark->data[benchmark->size] # while currb < maxb # c1 = *currs # c2 = *currb @@ -87,17 +87,17 @@ string-starts-with?: # s: (addr array byte), benchmark: (addr array byte) -> ea 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # edi = benchmark 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi - # var blen/ecx: int = benchmark->length + # var bsize/ecx: int = benchmark->size 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx -$string-starts-with?:lengths: - # if (s->length < blen) return false +$string-starts-with?:sizes: + # if (s->size < bsize) return false 39/compare 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # compare *esi with ecx 7c/jump-if-< $string-starts-with?:false/disp8 # var currs/esi: (addr byte) = s->data 81 0/subop/add 3/mod/direct 6/rm32/esi . . . . . 4/imm32 # add to esi # var currb/edi: (addr byte) = benchmark->data 81 0/subop/add 3/mod/direct 7/rm32/edi . . . . . 4/imm32 # add to edi - # var maxb/ecx: (addr byte) = &benchmark->data[benchmark->length] + # var maxb/ecx: (addr byte) = &benchmark->data[benchmark->size] 01/add 3/mod/direct 1/rm32/ecx . . . 7/r32/edi . . # add edi to ecx # var c1/eax: byte = 0 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax @@ -157,7 +157,7 @@ test-compare-empty-with-empty-string: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp c3/return -test-compare-empty-with-non-empty-string: # also checks length-mismatch code path +test-compare-empty-with-non-empty-string: # also checks size-mismatch code path # eax = string-equal?("", "Abc") # . . push args 68/push "Abc"/imm32 @@ -197,7 +197,7 @@ test-compare-equal-strings: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp c3/return -test-compare-inequal-strings-equal-lengths: +test-compare-inequal-strings-equal-sizes: # eax = string-equal?("Abc", "Adc") # . . push args 68/push "Adc"/imm32 @@ -208,7 +208,7 @@ test-compare-inequal-strings-equal-lengths: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # check-ints-equal(eax, 0, msg) # . . push args - 68/push "F - test-compare-inequal-strings-equal-lengths"/imm32 + 68/push "F - test-compare-inequal-strings-equal-sizes"/imm32 68/push 0/imm32/false 50/push-eax # . . call diff --git a/055stream.subx b/055stream.subx index 15d82ce6..84d0580b 100644 --- a/055stream.subx +++ b/055stream.subx @@ -3,10 +3,10 @@ # A stream looks like this: # write: int # index at which writes go # read: int # index that we've read until -# data: (array byte) # prefixed by length as usual +# data: (array byte) # prefixed by size as usual # # some primitives for operating on streams: -# - clear-stream (clears everything but the data length) +# - clear-stream (clears everything but the data size) # - rewind-stream (resets read pointer) == code @@ -23,9 +23,9 @@ clear-stream: # f: (addr stream byte) 51/push-ecx # eax = f 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 0/r32/eax 8/disp8 . # copy *(ebp+8) to eax - # var count/ecx: int = f->length + # var count/ecx: int = f->size 8b/copy 1/mod/*+disp8 0/rm32/eax . . . 1/r32/ecx 8/disp8 . # copy *(eax+8) to ecx - # var max/ecx: (addr byte) = &f->data[f->length] + # var max/ecx: (addr byte) = &f->data[f->size] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 0xc/disp8 . # copy eax+ecx+12 to ecx # f->write = 0 c7 0/subop/copy 0/mod/direct 0/rm32/eax . . . . . 0/imm32 # copy to *eax diff --git a/056trace.subx b/056trace.subx index f7dd4694..45ab2792 100644 --- a/056trace.subx +++ b/056trace.subx @@ -3,7 +3,7 @@ # A trace stream looks like a regular stream: # write: int # index at which writes go # read: int # index that we've read until -# data: (array byte) # prefixed by length as usual +# data: (array byte) # prefixed by size as usual # Usually the trace stream will be in a separate segment set aside for the purpose. # # primitives for operating on traces (arguments in quotes): @@ -33,7 +33,7 @@ _test-trace-stream: # (stream byte) 0/imm32 # current read index 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes @@ -43,7 +43,7 @@ _test-trace-stream: # (stream byte) # . 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 -# Allocate a new segment for the trace stream, initialize its length, and save its address to Trace-stream. +# Allocate a new segment for the trace stream, initialize its size, and save its address to Trace-stream. # The Trace-stream segment will consist of variable-length lines separated by newlines (0x0a) initialize-trace-stream: # n: int # . prologue @@ -67,10 +67,10 @@ initialize-trace-stream: # n: int #? # watch point to catch Trace-stream leaks #? $watch-1: 89/copy 0/mod/indirect 5/rm32/.disp32 . . 0/r32/eax Trace-stream/disp32 # copy eax to *Trace-stream - # Trace-stream->length = n - 12 + # Trace-stream->size = n - 12 # . ecx -= 12 81 5/subop/subtract 3/mod/direct 1/rm32/ecx . . . . . 0xc/imm32 # subtract from ecx - # . Trace-stream->length = ecx + # . Trace-stream->size = ecx 89/copy 1/mod/*+disp8 0/rm32/eax . . . 1/r32/ecx 8/disp8 . # copy ecx to *(eax+8) $initialize-trace-stream:end: # . restore registers @@ -100,12 +100,12 @@ trace: # line: (addr array byte) 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # var ecx: int = t->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx - # var edx: int = t->length + # var edx: int = t->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # copy *(edi+8) to edx - # eax = _append-3(&t->data[t->write], &t->data[t->length], line) + # eax = _append-3(&t->data[t->write], &t->data[t->size], line) # . . push line 56/push-esi - # . . push &t->data[t->length] + # . . push &t->data[t->size] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 2/index/edx . 3/r32/ebx 0xc/disp8 . # copy edi+edx+12 to ebx 53/push-ebx # . . push &t->data[t->write] @@ -122,10 +122,10 @@ trace: # line: (addr array byte) 01/add 0/mod/indirect 7/rm32/edi . . . 0/r32/eax . . # add eax to *edi # refresh ecx = t->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx - # eax = _append-3(&t->data[t->write], &t->data[t->length], line) + # eax = _append-3(&t->data[t->write], &t->data[t->size], line) # . . push line 68/push Newline/imm32 - # . . push &t->data[t->length] + # . . push &t->data[t->size] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 2/index/edx . 3/r32/ebx 0xc/disp8 . # copy edi+edx+12 to ebx 53/push-ebx # . . push &t->data[t->write] @@ -868,8 +868,8 @@ _append-3: # out: (addr byte), outend: (addr byte), s: (addr array byte) -> num 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # . save registers 51/push-ecx - # eax = _append-4(out, outend, &s->data[0], &s->data[s->length]) - # . . push &s->data[s->length] + # eax = _append-4(out, outend, &s->data[0], &s->data[s->size]) + # . . push &s->data[s->size] 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 @@ -965,7 +965,7 @@ _test-stream-line-ABABA: # (stream byte) 8/imm32 # read 0/imm32 - # length + # size 8/imm32 # data 41 42 41 42 41 0a 00 00 # 8 bytes @@ -975,7 +975,7 @@ _test-stream-empty: # (stream byte) 0/imm32 # read 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes @@ -985,7 +985,7 @@ _test-stream-filled: # (stream byte) 8/imm32 # read 0/imm32 - # length + # size 8/imm32 # data 41 41 41 41 0a 41 41 41 # 8 bytes diff --git a/057write.subx b/057write.subx index da369a0a..988e21db 100644 --- a/057write.subx +++ b/057write.subx @@ -13,7 +13,7 @@ # A stream looks like this: # read: int # index at which to read next # write: int # index at which writes go -# data: (array byte) # prefixed by length as usual +# data: (array byte) # prefixed by size as usual == code # instruction effective address register displacement immediate @@ -47,12 +47,12 @@ $write:fake: 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 + # ebx = f->size 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) + # eax = _append-3(&f->data[f->write], &f->data[f->size], s) # . . push s ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) - # . . push &f->data[f->length] + # . . push &f->data[f->size] 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 # . . push &f->data[f->write] @@ -150,7 +150,7 @@ _test-stream: # (stream byte) 0/imm32 # current read index 0/imm32 - # length + # size 0x10/imm32 # data (2 lines x 8 bytes/line) 00 00 00 00 00 00 00 00 diff --git a/058stream-equal.subx b/058stream-equal.subx index 3bd6a3b3..b3bd9b95 100644 --- a/058stream-equal.subx +++ b/058stream-equal.subx @@ -25,8 +25,8 @@ stream-data-equal?: # f: (addr stream byte), s: (addr array byte) -> eax: boole 81 0/subop/add 3/mod/direct 6/rm32/esi . . . . . 0xc/imm32 # add to esi # edi = s 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi -$stream-data-equal?:compare-lengths: - # if (f->write != s->length) return false +$stream-data-equal?:compare-sizes: + # if (f->write != s->size) return false 39/compare 0/mod/indirect 7/rm32/edi . . . 0/r32/eax . . # compare *edi and eax 75/jump-if-!= $stream-data-equal?:false/disp8 # var currs/edi: (addr byte) = s->data @@ -149,7 +149,7 @@ test-stream-data-equal-2: 5d/pop-to-ebp c3/return -test-stream-data-equal-length-check: +test-stream-data-equal-size-check: # . prologue 55/push-ebp 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp @@ -178,7 +178,7 @@ test-stream-data-equal-length-check: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # check-ints-equal(eax, 0, msg) # . . push args - 68/push "F - test-stream-data-equal-length-check"/imm32 + 68/push "F - test-stream-data-equal-size-check"/imm32 68/push 0/imm32 50/push-eax # . . call @@ -230,30 +230,30 @@ $check-stream-equal:end: next-stream-line-equal?: # f: (addr stream byte), s: (addr array byte) -> eax: boolean # pseudocode: # currf = f->read # bound: f->write - # currs = 0 # bound: s->length + # currs = 0 # bound: s->size # while true # if currf >= f->write - # return currs >= s->length + # return currs >= s->size # if f[currf] == '\n' # ++currf - # return currs >= s->length - # if (currs >= s->length) return false # the current line of f still has data to match + # return currs >= s->size + # if (currs >= s->size) return false # the current line of f still has data to match # if (f[currf] != s[currs]) return false # ++currf # ++currs # # collapsing the two branches that can return true: # currf = f->read # bound: f->write - # currs = 0 # bound: s->length + # currs = 0 # bound: s->size # while true # if (currf >= f->write) break # if (f[currf] == '\n') break - # if (currs >= s->length) return false # the current line of f still has data to match + # if (currs >= s->size) return false # the current line of f still has data to match # if (f[currf] != s[currs]) return false # ++currf # ++currs # ++currf # skip '\n' - # return currs >= s->length + # return currs >= s->size # Here the final `++currf` is sometimes unnecessary (if we're already at the end of the stream) # # registers: @@ -293,7 +293,7 @@ $next-stream-line-equal?:loop: # if (c1 == '\n') break 3d/compare-eax-and 0xa/imm32/newline 74/jump-if-= $next-stream-line-equal?:break/disp8 - # if (currs >= s->length) return false + # if (currs >= s->size) return false 3b/compare 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # compare edx with *edi 7d/jump-if->= $next-stream-line-equal?:false/disp8 # c2 = s->data[currs] @@ -309,7 +309,7 @@ $next-stream-line-equal?:loop: $next-stream-line-equal?:break: # ++currf 41/increment-ecx - # if (currs >= s->length) return true + # if (currs >= s->size) return true 3b/compare 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # compare edx with *edi 7c/jump-if-< $next-stream-line-equal?:false/disp8 $next-stream-line-equal?:true: diff --git a/060read.subx b/060read.subx index 02e3326b..661624b2 100644 --- a/060read.subx +++ b/060read.subx @@ -38,7 +38,7 @@ # As a reminder, a stream looks like this: # write: int # index at which to write to next # read: int # index at which to read next -# data: (array byte) # prefixed by length as usual +# data: (array byte) # prefixed by size as usual == code # instruction effective address register displacement immediate @@ -70,7 +70,7 @@ $read:fake: 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 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to esi - # eax = _buffer-4(out = &s->data[s->write], outend = &s->data[s->length], + # eax = _buffer-4(out = &s->data[s->write], outend = &s->data[s->size], # in = &f->data[f->read], inend = &f->data[f->write]) # . . push &f->data[f->write] 8b/copy 0/mod/indirect 6/rm32/esi . . . 0/r32/eax . . # copy *esi to eax @@ -80,7 +80,7 @@ $read:fake: 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 4/disp8 . # copy *(esi+4) to eax 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy esi+eax+12 to eax 50/push-eax - # . . push &s->data[s->length] + # . . push &s->data[s->size] 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 0/r32/eax 8/disp8 . # copy *(edi+8) to eax 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy edi+eax+12 to eax 50/push-eax @@ -116,8 +116,8 @@ _buffer-3: # out: address, outend: address, s: (array byte) -> num_bytes_buffer 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # . save registers 51/push-ecx - # eax = _buffer-4(out, outend, &s->data[0], &s->data[s->length]) - # . . push &s->data[s->length] + # eax = _buffer-4(out, outend, &s->data[0], &s->data[s->size]) + # . . push &s->data[s->size] 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 @@ -208,14 +208,14 @@ _read: # fd: int, s: (addr stream byte) -> num-bytes-read/eax: int 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 + # edx = s->size 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) + # syscall(read, fd, &s->data[s->write], s->size - s->write) # . . fd: 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 + # . . size: edx = s->size - s->write 29/subtract 3/mod/direct 2/rm32/edx . . . 0/r32/eax . . # subtract eax from edx # . . syscall b8/copy-to-eax 3/imm32/read @@ -237,14 +237,14 @@ $_read:end: # 1 (what we have above): # ecx = s # eax = s->write - # edx = s->length + # edx = s->size # # syscall # ecx = lea ecx+eax+12 # edx = sub edx eax # # 2: # ecx = s - # edx = s->length + # edx = s->size # ecx = &s->data # # syscall # ecx = add ecx, s->write @@ -431,7 +431,7 @@ _test-tmp-stream: # (stream byte) 0/imm32 # current read index 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes diff --git a/061read-byte.subx b/061read-byte.subx index 178fe273..78b8a7b9 100644 --- a/061read-byte.subx +++ b/061read-byte.subx @@ -20,7 +20,7 @@ $Stdin->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes @@ -246,7 +246,7 @@ test-read-byte-buffered-refills-buffer: # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # pretend buffer is full - # . _test-buffered-file->read = 6 # >= _test-buffered-file->length + # . _test-buffered-file->read = 6 # >= _test-buffered-file->size b8/copy-to-eax _test-buffered-file/imm32 c7 0/subop/copy 1/mod/*+disp8 0/rm32/eax . . . . 8/disp8 6/imm32 # copy to *(eax+8) # read-byte-buffered(_test-buffered-file) @@ -279,7 +279,7 @@ $_test-buffered-file->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 6/imm32 # data 00 00 00 00 00 00 # 6 bytes @@ -289,7 +289,7 @@ _test-input-stream: # (stream byte) 0/imm32 # current read index 0/imm32 - # length + # size 0x100/imm32 # 256 bytes # data (16 lines x 16 bytes/line) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -318,7 +318,7 @@ $_test-input-buffered-file->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 6/imm32 # data 00 00 00 00 00 00 # 6 bytes diff --git a/062write-stream.subx b/062write-stream.subx index 6374e647..22fc64d1 100644 --- a/062write-stream.subx +++ b/062write-stream.subx @@ -40,7 +40,7 @@ $write-stream:fake: 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 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]) + # eax = _append-4(&f->data[f->write], &f->data[f->size], &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 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy esi+eax+12 to eax @@ -49,7 +49,7 @@ $write-stream:fake: 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 4/disp8 . # copy *(esi+4) to eax 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy esi+eax+12 to eax 50/push-eax - # . . push &f->data[f->length] + # . . push &f->data[f->size] 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 0/r32/eax 8/disp8 . # copy *(edi+8) to eax 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy edi+eax+12 to eax 50/push-eax @@ -247,7 +247,7 @@ _test-stream2: # (stream byte) 4/imm32 # current read index 1/imm32 - # length + # size 8/imm32 # data 41/A 42/B 43/C 44/D 00 00 00 00 # 8 bytes diff --git a/064write-byte.subx b/064write-byte.subx index 13da5722..b134a2a8 100644 --- a/064write-byte.subx +++ b/064write-byte.subx @@ -16,7 +16,7 @@ $Stdout->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes @@ -41,7 +41,7 @@ write-byte-buffered: # f: (addr buffered-file), n: int 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 + # if (f->write >= f->size) flush and clear f's stream 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 0xc/disp8 . # compare ecx with *(edi+12) 7c/jump-if-< $write-byte-buffered:to-stream/disp8 # . flush(f) @@ -216,7 +216,7 @@ append-byte: # f: (addr stream byte), n: int 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi # ecx = f->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx - # if (f->write >= f->length) abort + # if (f->write >= f->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(edi+8) 7d/jump-if->= $append-byte:abort/disp8 $append-byte:to-stream: @@ -288,7 +288,7 @@ _test-output-stream: # (stream byte) 0/imm32 # current read index 0/imm32 - # length + # size 0x400/imm32 # 1024 bytes # data (64 lines x 16 bytes/line) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -365,7 +365,7 @@ $_test-output-buffered-file->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 6/imm32 # data 00 00 00 00 00 00 # 6 bytes @@ -396,7 +396,7 @@ $_test-error-buffered-file->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 6/imm32 # data 00 00 00 00 00 00 # 6 bytes diff --git a/065write-buffered.subx b/065write-buffered.subx index 6e89b64b..19df446e 100644 --- a/065write-buffered.subx +++ b/065write-buffered.subx @@ -8,9 +8,9 @@ write-buffered: # f: (addr buffered-file), msg: (addr array byte) # pseudocode: # in = msg->data - # inend = &msg->data[msg->length] + # inend = &msg->data[msg->size] # while (in < inend) - # if f->write >= f->length + # if f->write >= f->size # flush(f) # clear-stream(f) # c = *in @@ -22,7 +22,7 @@ write-buffered: # f: (addr buffered-file), msg: (addr array byte) # in: esi # inend: ecx # f: edi - # f->length: edx + # f->size: edx # f->write: ebx (cached; need to keep in sync) # c: eax # @@ -40,12 +40,12 @@ write-buffered: # f: (addr buffered-file), msg: (addr array byte) 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 0/r32/eax 0xc/disp8 . # copy *(ebp+12) to eax # var in/esi: (addr byte) = msg->data 8d/copy-address 1/mod/*+disp8 0/rm32/eax . . . 6/r32/esi 4/disp8 . # copy eax+4 to esi - # var inend/ecx: (addr byte) = &msg->data[msg->length] + # var inend/ecx: (addr byte) = &msg->data[msg->size] 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 5/rm32/ebp . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi - # edx = f->length + # edx = f->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 0xc/disp8 . # copy *(edi+12) to edx # ebx = f->write 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 4/disp8 . # copy *(edi+4) to ebx @@ -53,7 +53,7 @@ $write-buffered:loop: # if (in >= inend) break 39/compare 3/mod/direct 6/rm32/esi . . . 1/r32/ecx . . # compare esi with ecx 73/jump-if-addr>= $write-buffered:loop-end/disp8 - # if (f->write >= f->length) flush and clear f's stream + # if (f->write >= f->size) flush and clear f's stream 39/compare 3/mod/direct 3/rm32/ebx . . . 2/r32/edx . . # compare ebx with edx 7c/jump-if-< $write-buffered:to-stream/disp8 # . persist f->write @@ -215,7 +215,7 @@ $Stderr->buffer: 0/imm32 # current read index 0/imm32 - # length + # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes diff --git a/067parse-hex.subx b/067parse-hex.subx index 23270027..b5a5bacf 100644 --- a/067parse-hex.subx +++ b/067parse-hex.subx @@ -362,10 +362,10 @@ parse-hex-int: # in: (addr array byte) -> result/eax: int 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 8/disp8 . # copy *(ebp+8) to eax # var curr/ecx: (addr byte) = &in->data 8d/copy-address 1/mod/*+disp8 0/rm32/eax . . . 1/r32/ecx 4/disp8 . # copy eax+4 to ecx - # var max/edx: (addr byte) = &in->data[in->length] - # . edx = in->length + # var max/edx: (addr byte) = &in->data[in->size] + # . edx = in->size 8b/copy 0/mod/indirect 0/rm32/eax . . . 2/r32/edx . . # copy *eax to edx - # . edx = in->data + in->length + # . edx = in->data + in->size 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 2/index/edx . 2/r32/edx 4/disp8 . # copy eax+edx+4 to edx # return parse-hex-int-helper(curr, max) # . . push args diff --git a/070new-stream.subx b/070new-stream.subx index 76d2a516..5474175b 100644 --- a/070new-stream.subx +++ b/070new-stream.subx @@ -11,7 +11,7 @@ new-stream: # ad: (addr allocation-descriptor), length: int, elemsize: int -> a 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # . save registers 52/push-edx - # var n/eax: int = elemsize * length + 12 (for read, write and length) + # var n/eax: int = elemsize * length + 12 (for read, write and size) # . eax = elemsize 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 0x10/disp8 . # copy *(ebp+16) to eax # . eax *= length @@ -32,7 +32,7 @@ new-stream: # ad: (addr allocation-descriptor), length: int, elemsize: int -> a e8/call allocate/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp - # eax->length = elemsize*length + # eax->size = elemsize*length 89/copy 1/mod/*+disp8 0/rm32/eax . . . 2/r32/edx 8/disp8 . # copy edx to *(eax+8) # clear-stream(eax) # . . push args @@ -100,9 +100,9 @@ test-new-stream: e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp - # check-ints-equal(eax->length, 6, msg) + # check-ints-equal(eax->size, 6, msg) # . . push args - 68/push "F - test-new-stream: sets length correctly"/imm32 + 68/push "F - test-new-stream: sets size correctly"/imm32 68/push 6/imm32 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . . 8/disp8 # push *(eax+8) # . . call diff --git a/071read-line.subx b/071read-line.subx index d4fe9e68..b230c9ca 100644 --- a/071read-line.subx +++ b/071read-line.subx @@ -9,7 +9,7 @@ read-line-buffered: # f: (addr buffered-file), s: (addr stream byte) # pseudocode: # while true - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort # if (f->read >= f->write) populate stream from file # if (f->write == 0) break # AL = f->data[f->read] @@ -35,7 +35,7 @@ read-line-buffered: # f: (addr buffered-file), s: (addr stream byte) # edx = s->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # copy *edi to edx $read-line-buffered:loop: - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # compare edx with *(edi+8) 7d/jump-if->= $read-line-buffered:abort/disp8 # if (f->read >= f->write) populate stream from file @@ -219,7 +219,7 @@ test-read-line-buffered-reads-final-line-until-Eof: read-line: # f: (addr stream byte), s: (addr stream byte) # pseudocode: # while true - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort # if (f->read >= f->write) break # AL = f->data[f->read] # s->data[s->write] = AL @@ -244,7 +244,7 @@ read-line: # f: (addr stream byte), s: (addr stream byte) # edx = s->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # copy *edi to edx $read-line:loop: - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # compare edx with *(edi+8) 0f 8d/jump-if->= $read-line:abort/disp32 # if (f->read >= f->write) break diff --git a/072slice.subx b/072slice.subx index 613ccd2b..39820594 100644 --- a/072slice.subx +++ b/072slice.subx @@ -122,7 +122,7 @@ slice-equal?: # s: (addr slice), p: (addr array byte) -> eax: boolean # if (p == 0) return (s == 0) # currs = s->start # maxs = s->end - # if (maxs - currs != p->length) return false + # if (maxs - currs != p->size) return false # currp = p->data # while currs < maxs # if (*currs != *currp) return false @@ -151,7 +151,7 @@ slice-equal?: # s: (addr slice), p: (addr array byte) -> eax: boolean 8b/copy 0/mod/indirect 6/rm32/esi . . . 2/r32/edx . . # copy *esi to edx # var maxs/esi: (addr byte) = s->end 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 6/r32/esi 4/disp8 . # copy *(esi+4) to esi - # var slen/eax: int = maxs - currs + # var ssize/eax: int = maxs - currs 89/copy 3/mod/direct 0/rm32/eax . . . 6/r32/esi . . # copy esi to eax 29/subtract 3/mod/direct 0/rm32/eax . . . 2/r32/edx . . # subtract edx from eax # ebx = p @@ -165,7 +165,7 @@ $slice-equal?:null-string: 74/jump-if-= $slice-equal?:true/disp8 eb/jump $slice-equal?:false/disp8 $slice-equal?:nonnull-string: - # if (slen != p->length) return false + # if (ssize != p->size) return false 39/compare 0/mod/indirect 3/rm32/ebx . . . 0/r32/eax . . # compare *ebx and eax 75/jump-if-!= $slice-equal?:false/disp8 # var currp/ebx: (addr byte) = p->data @@ -486,12 +486,12 @@ test-slice-equal-with-null: slice-starts-with?: # s: (addr slice), head: (addr array byte) -> eax: boolean # pseudocode - # lenh = head->length - # if (lenh > s->end - s->start) return false + # hsize = head->size + # if (hsize > s->end - s->start) return false # i = 0 # currs = s->start # currp = head->data - # while i < lenh + # while i < hsize # if (*currs != *currh) return false # ++i # ++currs @@ -504,7 +504,7 @@ slice-starts-with?: # s: (addr slice), head: (addr array byte) -> eax: boolean # *currs: eax # *currh: ebx # i: ecx - # lenh: edx + # hsize: edx # # . prologue 55/push-ebp @@ -522,9 +522,9 @@ slice-starts-with?: # s: (addr slice), head: (addr array byte) -> eax: boolean 2b/subtract 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # subtract *esi from ecx # edi = head 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi - # var lenh/edx: int = head->length + # var hsize/edx: int = head->size 8b/copy 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # copy *edi to edx - # if (lenh > lens) return false + # if (hsize > lens) return false 39/compare 3/mod/direct 2/rm32/edx . . . 1/r32/ecx . . # compare edx with ecx 7f/jump-if-> $slice-starts-with?:false/disp8 # var currs/esi: (addr byte) = s->start @@ -538,7 +538,7 @@ slice-starts-with?: # s: (addr slice), head: (addr array byte) -> eax: boolean # var c2/ebx: byte = 0 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . . # clear ebx $slice-starts-with?:loop: - # if (i >= lenh) return true + # if (i >= hsize) return true 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . . # compare ecx with edx 7d/jump-if->= $slice-starts-with?:true/disp8 # c1 = *currs @@ -809,7 +809,7 @@ write-slice: # out: (addr stream byte), s: (addr slice) 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 6/r32/esi 4/disp8 . # copy *(esi+4) to esi # edi = out 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi - # edx = out->length + # edx = out->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # copy *(edi+8) to edx # ebx = out->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 3/r32/ebx . . # copy *edi to ebx @@ -817,7 +817,7 @@ $write-slice:loop: # if (curr >= max) break 39/compare 3/mod/direct 1/rm32/ecx . . . 6/r32/esi . . # compare ecx with esi 73/jump-if-addr>= $write-slice:loop-end/disp8 - # if (out->write >= out->length) abort + # if (out->write >= out->size) abort 39/compare 3/mod/direct 3/rm32/ebx . . . 2/r32/edx . . # compare ebx with edx 7d/jump-if->= $write-slice:abort/disp8 # out->data[out->write] = *in @@ -925,7 +925,7 @@ write-slice-buffered: # out: (addr buffered-file), s: (addr slice) 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 6/r32/esi 4/disp8 . # copy *(esi+4) to esi # edi = out 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi - # edx = out->length + # edx = out->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 0xc/disp8 . # copy *(edi+12) to edx # ebx = out->write 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 4/disp8 . # copy *(edi+4) to ebx @@ -933,7 +933,7 @@ $write-slice-buffered:loop: # if (curr >= max) break 39/compare 3/mod/direct 1/rm32/ecx . . . 6/r32/esi . . # compare ecx with esi 73/jump-if-addr>= $write-slice-buffered:loop-end/disp8 - # if (out->write >= out->length) flush and clear out's stream + # if (out->write >= out->size) flush and clear out's stream 39/compare 3/mod/direct 3/rm32/ebx . . . 2/r32/edx . . # compare ebx with edx 7c/jump-if-< $write-slice-buffered:to-stream/disp8 # . persist out->write @@ -1056,7 +1056,7 @@ slice-to-string: # ad: (addr allocation-descriptor), in: (addr slice) -> out/ea 8b/copy 0/mod/indirect 6/rm32/esi . . . 2/r32/edx . . # copy *esi to edx # var max/ebx: (addr byte) = in->end 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 3/r32/ebx 4/disp8 . # copy *(esi+4) to ebx - # var size/ecx: int = max - curr + 4 # total size of output string (including the initial length) + # var size/ecx: int = max - curr + 4 # total size of output string (including the initial 'size' field) 89/copy 3/mod/direct 1/rm32/ecx . . . 3/r32/ebx . . # copy ebx to ecx 29/subtract 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . . # subtract edx from ecx 81 0/subop/add 3/mod/direct 1/rm32/ecx . . . . . 4/imm32 # add to ecx @@ -1071,7 +1071,7 @@ slice-to-string: # ad: (addr allocation-descriptor), in: (addr slice) -> out/ea # if (eax == 0) abort 3d/compare-eax-and 0/imm32 74/jump-if-= $slice-to-string:abort/disp8 - # out->length = size-4 + # out->size = size-4 89/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy ecx to *eax 81 5/subop/subtract 0/mod/indirect 0/rm32/eax . . . . . 4/imm32 # subtract 4 from *eax # save out diff --git a/075print-int-decimal.subx b/075print-int-decimal.subx index 19fae94b..135d8f0d 100644 --- a/075print-int-decimal.subx +++ b/075print-int-decimal.subx @@ -22,7 +22,7 @@ print-int32-decimal: # out: (addr stream byte), n: int32 # push '-' # w = out->write # curr = &out->data[out->write] - # max = &out->data[out->length] + # max = &out->data[out->size] # while true # pop into eax # if (eax == sentinel) break @@ -78,7 +78,7 @@ $print-int32-decimal:write: 8b/copy 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # copy *edi to edx # var curr/ecx: (addr byte) = &out->data[out->write] 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 2/index/edx . 1/r32/ecx 0xc/disp8 . # copy ebx+edx+12 to ecx - # var max/ebx: (addr byte) = &out->data[out->length] + # var max/ebx: (addr byte) = &out->data[out->size] 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 8/disp8 . # copy *(edi+8) to ebx 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/edi 3/index/ebx . 3/r32/ebx 0xc/disp8 . # copy edi+ebx+12 to ebx $print-int32-decimal:write-loop: diff --git a/081table.subx b/081table.subx index da3f51ed..ed1e9a92 100644 --- a/081table.subx +++ b/081table.subx @@ -127,7 +127,7 @@ test-get: # - setup: create a table with a couple of keys # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -308,7 +308,7 @@ test-get-slice: # - setup: create a table with a couple of keys # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -409,7 +409,7 @@ get-or-insert: # table: (addr stream {string_key, T}), key: string_key, row-siz # if string-equal?(key, *curr) # return curr+4 # curr += row-size - # if table->write >= table->length + # if table->write >= table->size # abort # zero-out(max, row-size) # *max = key @@ -456,7 +456,7 @@ $get-or-insert:mismatch: $get-or-insert:not-found: # result/eax = 0 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax - # if (table->write >= table->length) abort + # if (table->write >= table->size) abort 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx 3b/compare 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(esi+8) 73/jump-if-addr>= $get-or-insert:abort/disp8 @@ -514,7 +514,7 @@ test-get-or-insert: 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -658,7 +658,7 @@ get-or-insert-slice: # table: (addr stream {string_key, T}), key: (addr slice), # if slice-equal?(key, *curr) # return curr+4 # curr += row-size - # if table->write >= table->length + # if table->write >= table->size # abort # zero-out(max, row-size) # *max = slice-to-string(ad, key) @@ -705,7 +705,7 @@ $get-or-insert-slice:mismatch: $get-or-insert-slice:not-found: # result/eax = 0 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax - # if (table->write >= table->length) abort + # if (table->write >= table->size) abort 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx 3b/compare 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(esi+8) 7d/jump-if->= $get-or-insert-slice:abort/disp8 @@ -769,7 +769,7 @@ test-get-or-insert-slice: 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -1054,7 +1054,7 @@ test-get-or-stop: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -1270,7 +1270,7 @@ test-get-slice-or-stop: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -1446,7 +1446,7 @@ test-maybe-get: # - setup: create a table with one row # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx @@ -1593,7 +1593,7 @@ test-maybe-get-slice: # - setup: create a table with one row # var table/ecx: (stream {string, number} 16) # 2 rows * 8 bytes/row 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # subtract from esp - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx diff --git a/082slurp.subx b/082slurp.subx index 8f58d6c5..10c51135 100644 --- a/082slurp.subx +++ b/082slurp.subx @@ -8,7 +8,7 @@ slurp: # f: (addr buffered-file), s: (addr stream byte) # pseudocode: # while true - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort # if (f->read >= f->write) populate stream from file # if (f->write == 0) break # AL = f->data[f->read] @@ -33,7 +33,7 @@ slurp: # f: (addr buffered-file), s: (addr stream byte) # edx = s->write 8b/copy 0/mod/indirect 7/rm32/edi . . . 2/r32/edx . . # copy *edi to edx $slurp:loop: - # if (s->write >= s->length) abort + # if (s->write >= s->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # compare edx with *(edi+8) 7d/jump-if->= $slurp:abort/disp8 # if (f->read >= f->write) populate stream from file diff --git a/083subx-widths.subx b/083subx-widths.subx index 511693b1..8a3142b3 100644 --- a/083subx-widths.subx +++ b/083subx-widths.subx @@ -16,7 +16,7 @@ compute-width: # word: (addr array byte) -> eax: int 51/push-ecx # eax = word 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 8/disp8 . # copy *(ebp+8) to ecx - # var ecx: (addr byte) = &word[word->length] + # var ecx: (addr byte) = &word[word->size] 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 # eax = word->data diff --git a/084emit-hex-array.subx b/084emit-hex-array.subx index 5867a402..c3f74cd6 100644 --- a/084emit-hex-array.subx +++ b/084emit-hex-array.subx @@ -19,7 +19,7 @@ emit-hex-array: # out: (addr buffered-file), arr: (addr array byte) 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx # var curr/ecx: (addr byte) = arr->data 8d/copy-address 1/mod/*+disp8 2/rm32/edx . . . 1/r32/ecx 4/disp8 . # copy edx+4 to ecx - # var max/edx: (addr byte) = &arr->data[arr->length] + # var max/edx: (addr byte) = &arr->data[arr->size] 8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx 01/add 3/mod/direct 2/rm32/edx . . . 1/r32/ecx . . # add ecx to edx # var c/eax: byte = 0 @@ -73,7 +73,7 @@ test-emit-hex-array: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # var arr/ecx (array byte) = [01, 02, 03] 68/push 0x00030201/imm32 # bytes 01 02 03 - 68/push 3/imm32/length + 68/push 3/imm32/size 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # emit-hex-array(_test-output-buffered-file, arr) # . . push args diff --git a/091write-int.subx b/091write-int.subx index 9972a0ac..4db7eab3 100644 --- a/091write-int.subx +++ b/091write-int.subx @@ -17,7 +17,7 @@ write-int: # out: (addr stream byte), n: int 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 + # if (out->write >= out->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(edi+8) 7d/jump-if->= $write-int:abort/disp8 $write-int:to-stream: diff --git a/092stack.subx b/092stack.subx index 6f2e5e8a..5b015ea9 100644 --- a/092stack.subx +++ b/092stack.subx @@ -1,6 +1,6 @@ # A stack looks like this: # top: int -# data: (array byte) # prefixed by length as usual +# data: (array byte) # prefixed by size as usual == code # instruction effective address register displacement immediate @@ -16,7 +16,7 @@ clear-stack: # s: (addr stack) 51/push-ecx # eax = s 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 8/disp8 . # copy *(ebp+8) to eax - # var max/ecx: (addr byte) = &s->data[s->length] + # var max/ecx: (addr byte) = &s->data[s->size] 8b/copy 1/mod/*+disp8 0/rm32/eax . . . 1/r32/ecx 4/disp8 . # copy *(eax+4) to eax 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 8/disp8 . # copy eax+ecx+8 to ecx # s->top = 0 @@ -48,7 +48,7 @@ test-clear-stack: # var stack/ecx = stack of size 8 with random data in it 68/push 34/imm32 68/push 35/imm32 - 68/push 8/imm32/length + 68/push 8/imm32/size 68/push 14/imm32/top 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # clear(stack) @@ -69,11 +69,11 @@ test-clear-stack: e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp - # length should remain 8 + # size should remain 8 58/pop-to-eax # . check-ints-equal(eax, 8, msg) # . . push args - 68/push "F - test-clear-stack: length"/imm32 + 68/push "F - test-clear-stack: size"/imm32 68/push 8/imm32 50/push-eax # . . call @@ -119,7 +119,7 @@ push: # s: (addr stack), n: int 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # ecx = s->top 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx - # if (s->top >= s->length) abort + # if (s->top >= s->size) abort 39/compare 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 4/disp8 . # compare *(esi+4) and ecx 7e/jump-if-<= $push:abort/disp8 # s->data[s->top] = n @@ -167,7 +167,7 @@ test-push: # var stack/ecx = empty stack of size 8 68/push 0/imm32 68/push 0/imm32 - 68/push 8/imm32/length + 68/push 8/imm32/size 68/push 0/imm32/top 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # push(stack, 0x42) @@ -189,11 +189,11 @@ test-push: e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp - # check length + # check size 58/pop-to-eax # . check-ints-equal(eax, 8, msg) # . . push args - 68/push "F - test-push: length"/imm32 + 68/push "F - test-push: size"/imm32 68/push 8/imm32 50/push-eax # . . call @@ -285,7 +285,7 @@ test-pop: # var stack/ecx = stack of size 8 containing just 0x42 68/push 0/imm32 68/push 0x42/imm32 - 68/push 8/imm32/length + 68/push 8/imm32/size 68/push 4/imm32/top 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # eax = pop(stack) @@ -315,11 +315,11 @@ test-pop: e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp - # check length + # check size 58/pop-to-eax # . check-ints-equal(eax, 8, msg) # . . push args - 68/push "F - test-pop: length"/imm32 + 68/push "F - test-pop: size"/imm32 68/push 8/imm32 50/push-eax # . . call @@ -386,7 +386,7 @@ test-top: # var stack/ecx = stack of size 8 containing just 0x42 68/push 0/imm32 68/push 0x42/imm32 - 68/push 8/imm32/length + 68/push 8/imm32/size 68/push 4/imm32/top 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # eax = top(stack) diff --git a/100array-equal.subx b/100array-equal.subx index ca222619..e1449279 100644 --- a/100array-equal.subx +++ b/100array-equal.subx @@ -4,12 +4,12 @@ array-equal?: # a: (addr array int), b: (addr array int) -> eax: boolean # pseudocode: - # lena = a->length - # if (lena != b->length) return false + # asize = a->size + # if (asize != b->size) return false # i = 0 # curra = a->data # currb = b->data - # while i < lena + # while i < asize # i1 = *curra # i2 = *currb # if (c1 != c2) return false @@ -18,7 +18,7 @@ array-equal?: # a: (addr array int), b: (addr array int) -> eax: boolean # # registers: # i: ecx - # lena: edx + # asize: edx # curra: esi # currb: edi # i1: eax @@ -37,10 +37,10 @@ array-equal?: # a: (addr array int), b: (addr array int) -> eax: boolean 8b/-> *(ebp+8) 6/r32/esi # edi = b 8b/-> *(ebp+0xc) 7/r32/edi - # var lena/edx: int = a->length + # var asize/edx: int = a->size 8b/-> *esi 2/r32/edx -$array-equal?:lengths: - # if (lena != b->length) return false +$array-equal?:sizes: + # if (asize != b->size) return false 39/compare *edi 2/r32/edx 75/jump-if-!= $array-equal?:false/disp8 # var curra/esi: (addr byte) = a->data @@ -52,7 +52,7 @@ $array-equal?:lengths: # var vala/eax: int # var valb/ebx: int $array-equal?:loop: - # if (i >= lena) return true + # if (i >= asize) return true 39/compare %ecx 2/r32/edx 7d/jump-if->= $array-equal?:true/disp8 # var vala/eax: int = *curra @@ -104,7 +104,7 @@ test-compare-empty-with-empty-array: 5d/pop-to-ebp c3/return -test-compare-empty-with-non-empty-array: # also checks length-mismatch code path +test-compare-empty-with-non-empty-array: # also checks size-mismatch code path # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -147,7 +147,7 @@ test-compare-equal-arrays: 5d/pop-to-ebp c3/return -test-compare-inequal-arrays-equal-lengths: +test-compare-inequal-arrays-equal-sizes: # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -165,7 +165,7 @@ test-compare-inequal-arrays-equal-lengths: 89/<- %edx 4/r32/esp # (array-equal? %ecx %edx) # => eax - (check-ints-equal %eax 0 "F - test-compare-inequal-arrays-equal-lengths") + (check-ints-equal %eax 0 "F - test-compare-inequal-arrays-equal-sizes") # . epilogue 89/<- %esp 5/r32/ebp 5d/pop-to-ebp @@ -173,7 +173,7 @@ test-compare-inequal-arrays-equal-lengths: parse-array-of-ints: # ad: (addr allocation-descriptor), s: (addr string) -> result/eax: (handle array int) # pseudocode - # end = &s->data[s->length] + # end = &s->data[s->size] # curr = s->data # size = 0 # while true @@ -209,8 +209,8 @@ parse-array-of-ints: # ad: (addr allocation-descriptor), s: (addr string) -> re 8b/-> *(ebp+0xc) 6/r32/esi # var curr/ecx: (addr byte) = s->data 8d/copy-address *(esi+4) 1/r32/ecx - # var end/edx: (addr byte) = &s->data[s->length] - # . edx = s->length + # var end/edx: (addr byte) = &s->data[s->size] + # . edx = s->size 8b/-> *esi 2/r32/edx # . edx += curr 01/add-to %edx 1/r32/ecx diff --git a/apps/assort b/apps/assort index 9f6aa9a66aae839c9527867e3e0d00ad6df9339e..3c24b4a638a5eb95ac4a6601c4b21e7dc255e1e6 100755 GIT binary patch delta 5924 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 KqO&vh`28QOA_83i diff --git a/apps/braces b/apps/braces index 34f18f1179cbe3db772a6b5a53e98ffa9e6a9572..f26cc91afadcc33fcd036dd0c33ec7de8ceb9a5b 100755 GIT binary patch delta 6068 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 Ox!z`O`*Yhy+5Z8qb}eTB delta 6058 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 E59~iESO5S3 diff --git a/apps/calls b/apps/calls index dbe0e219cbe81e86afcfb9eb947cfe03cd3969e4..15e8b09559f720de0887c4f02fc7e332cf58896b 100755 GIT binary patch delta 6533 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 diff --git a/apps/crenshaw2-1 b/apps/crenshaw2-1 index 599fcfc016e1176846a2a2f0ac780993930f3b0a..8f59dc7e3e6c2a5ca1744b847bebfe5330a3323e 100755 GIT binary patch delta 5585 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 delta 5595 zcmZu#d0bP+7G|Pck$^(L1WX77A&{^yVF@5mMa7k%B8oxLBC#rh)~fXZqIIEe)uUFs zDE9fPt)fzEMMY~}s;#)cZfdQ|YkOT^)oQg$d1of%j^+7B?r-Kh-*=YT?%dSxmF?au zd+TLqMUs<~qJI3m_QI`BPOi55@O%4a&nMUv=d`r6R3B;Yie@WU5_)xeVZl&neW(gfj`{i6a9{VD|vqf?RVl%)_~F_Hs%;b!#L|C?eF6Wou~aRy#E8tbcyx!@<8ts3odt5D$^uWM{eo`uC7I70!(y`B#Yr)*X3jzM93?YhbXz8#$3tC$KjwnBJ8SU zvT)Nc5}3-tTj1k1E6iEpaAhANmcE+=R&u@<9B>O)#z>|iY?v57X@$EtNrx`(;bEgB zdo!C7W*;YkXSk>oCc1A)Tq~JEIDexA&fxL4P|&_)F5U;7dzXaw9!b;plcYGq=9GoK zDSLornf5GL>JBS&Uc|?<nXAHcj)eS?Hl3KYUPUz4(!HlNUq;KgUS4C;N=q#jQCt`#0qf+tMux=v8}U^5Xs z)czz5qSX_G9uz2m4G4^fFVu^K$rN}Cay4^g>wLfx-~~4{a{rAKwNFjxe;mVFbK80t zi)h%#ct-oSVrS1XY}7-vY$rQ)t7~<^^+4FZ1s!B0lbQE34`5o zIDIl`wHnzPJAIH=PHLe5f#Y^yF#=~{jrK5U2RQ-WQ06ZuF7OY34K5ejufu*O?7{vN z)<4}-u6?~LmKV=fO~}=@`F_M`Zdr2eHcCSlo_;s4w55HIG=Fj#$^tYpH#IHAEsE#t z1$6=AFs`>wPliK^E|`=;5w_>TLVVW3c0_i;H`x9fp6R-iYmgE+fjovyf!$>7G|&{d zhIEADZW$`026K?J9H#&1$iX%f8oQZQyQs~cpPt*UfP2sYqJe^-*`z023d;8y>*wT} zn1VuP-{PKmP^PC5+mGQ&&Q@K~wd~3#fY;m2m182(*sQi0>SgJJ#^E z7kK!UdH9?kPja(Eo< zGit~(_}&;qRzb6Iyngo!yd7Y&<-E|tusBSkzyAX26Gk1xsm*XIOhZDUKHN(YrK1J7 zbE647!ZoCX8ly^?@dVFp8Un2+!ij&k9nB3)vzcjXxMn-m*w<&x|7p&%BrY&bZ?3rl z--hQB0Spmwq#IZxf&^nAdU**JM64#+ppA?dawt#^`H^L027DEnLEZt^r~t(Vgmc8P zERYLE#S=C)s*)UmeNjgLCaUR#=ps@r(vvwyj5_Nm!*&zeM-RiGBct>1EGmiVreDj3 z#e=#rbVDh9#VqO^cHAN+o{?m^@GQCynF(1jIFg>=61b`SDgrn~sXC;GSLY#q&fK_o3q!JEedmh}u_BK$*8}Ox*6<@47WWy5(|A{)bh!p_8SavZKC z#wo8zgfLFH4Thv}tSm1nPT4!e;bGS~$-@v>kAxa%N{S=(E0XD}G$wh-h`Y%B+ddI@ z@s;?LI-=)=;R}m69h+AZ+EzQ0YeV6uWG%^uzmhei7}RDhSq)~hhOC2O=CR5q zl-i4YgUur=@&cSOhZ9$5Hph_&h)MCrS4XduaGcqxDRE>AY)XkHd*S<(Z2t#_wvi9= z$ixU4seb68FqOW1W~FM$GLy0jaOzgLh}07=pq^vY3w)D*2Yx*?`e!eoI!Dq3)^MsTj6!M*!hc&W zn5&sl^EfpfHuM;S=T~M=Z^Qd6FLv9QguK>M=t*PSrL+>+{^Wfq>Zu{esFK|mPQyCv zKVW^lFOWasVo#0C7{x9ucrzd|;FG11jiG>+yaGeBGG(jn)-73bpLJ0f(SCaxx6cu= zVGkp?E##RUggaTAaF?&@RU$M~O(4j6j}pS8vDqI=u$f1juR&AqqhvO$=#wnWr$8;7 z?UN$g6b)5<{U9t`E!0u;81&Chk)5@pA7-mNT%;(bdOX`qC~ zT@3foXc51`dhMTwHnyjpFw~P3ORv8+5)145s})|clzpAe8pGAl)PDkQnxp~K$pF|f zpo`Z~MwyQyyTb-+ENsj3b-Tw!#n3!JC97aKL=BYV;h8e98s~BUz;wj{rnkTKScos7 z(;!vVHH2AiEivMwddIZb{-SW#I49SZayM}b9zxGo5s0`&yw3w05x@^-JeiK?h&#BK zUKFQ=qw}>K9z)?ue6*Cq#z6|>d~908RovfFO7Lm*H<$}QhAV@V!k5%~4W12pliY*_ zIcDMshjNVg0dglt<(CrAL#lR2d0Q!51v-nN&jQ+XBztDNMEU4BJsbh&83+X9t-y@FXNYcUhdY?B?wr=?57SVxi+~QQdUtO zTOaQ+!VhdDX#KX0)Z|F^m%28>1CsD46V{?|c=Zv=A7MKQWrHW-%kJ{v)ub~_8)6_T zSU*Im_D^VyHrOJ5MFj=+xgBBC!Odxc#vsOM6YT7+T5K{9NkBQPZ$368l|;dmP0K4)3J!34G8AXxt{z*?^r#+#=dP z>IJr}FM=-bb;SdQ?~wj+X?O~CdBNH35}ym*=VQs2j^eEgHHO3K6t?1nhOU!Fzo9sh zZ9V(7nnj%i8N+6fMX+aB4%rH>`37MZ)gFW7{A}$RY+A&zH)uE-Bn^K~4fGhEHq!P3 z)aGmOI2O%iJeWj(~X zYW+WN6pS9;rD_gEPjhq`)6%n9e4A@OrL2!Q>kwnH2<4n5Qr29~dc;_?II$mRX_Ap; zZDpYm5B0~xKM)2YY#R@?Bbvx-FsUF|TS);bZlHIrma_KZ+oGDo)zgf0=jZ8HHcIqjYINLgsk8=o+5`V_@F-k|{}*g8jQ6&rVs6viMC(=>j4i||@JC@B{xugi%1GXZ zyipZy`;lb-yJNx@s2#0>N23zRA&3}FUlFTD_rd>7E{_f*S|CN;h+$`N(MosxJS>~& x4W~+#!o=dzl2>gz#nLz0kr3!UMe9J8P4Sgus-r7>length = 7 + # . num->size = 7 c7 0/subop/copy 1/mod/*+disp8 1/rm32/ecx . . . . 8/disp8 7/imm32 # copy to *(ecx+8) # . clear-stream(num) # . . push args @@ -194,7 +194,7 @@ $compile:end: get-num: # in: (addr buffered-file), out: (addr stream byte), err: fd or (addr stream byte), ed: (addr exit-descriptor) # pseudocode: # if (!is-digit?(Look)) expected(ed, err, "integer") - # if out->write >= out->length + # if out->write >= out->size # write(err, "Error: too many digits in number\n") # stop(ed, 1) # out->data[out->write] = LSB(Look) @@ -205,7 +205,7 @@ get-num: # in: (addr buffered-file), out: (addr stream byte), err: fd or (addr # in: esi # out: edi # out->write: ecx (cached copy; need to keep in sync) - # out->length: edx + # out->size: edx # temporaries: eax, ebx # We can't allocate Look to a register because it gets written implicitly in # get-char in each iteration of the loop. (Thereby demonstrating that it's @@ -250,10 +250,10 @@ $get-num:main: 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 + # edx = out->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # copy *(edi+8) to edx $get-num:loop: - # if (out->write >= out->length) error + # if (out->write >= out->size) error 39/compare 3/mod/direct 2/rm32/edx . . . 1/r32/ecx . . # compare edx with ecx 7d/jump-if-< $get-num:stage2/disp8 # . error(ed, err, msg) # TODO: show full number diff --git a/apps/crenshaw2-1b b/apps/crenshaw2-1b index 838c0c58ed2d23b12dbd249a957e9bd7b90928f2..62ca8b7af3964ba58b96d98c4941ccbd0affda21 100755 GIT binary patch delta 5640 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 HeG~CNB;Kmq delta 5641 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 G!~X{r0jnJV diff --git a/apps/crenshaw2-1b.subx b/apps/crenshaw2-1b.subx index 89791bea..62e56312 100644 --- a/apps/crenshaw2-1b.subx +++ b/apps/crenshaw2-1b.subx @@ -108,12 +108,12 @@ compile: # in: (addr buffered-file), out: fd or (addr stream byte), err: fd or # var num/ecx: (stream byte 7) # Numbers can be 32 bits or 8 hex bytes long. One of them will be in 'Look', so we need space for 7 bytes. # Sizing the stream just right buys us overflow-handling for free inside 'get-num'. - # Add 12 bytes for 'read', 'write' and 'length' fields, for a total of 19 bytes, or 0x13 in hex. + # Add 12 bytes for 'read', 'write' and 'size' fields, for a total of 19 bytes, or 0x13 in hex. # The stack pointer is no longer aligned, so dump_stack() can be misleading past this point. 81 5/subop/subtract 3/mod/direct 4/rm32/esp . . . . . 0x13/imm32 # subtract from esp 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx # initialize the stream - # . num->length = 7 + # . num->size = 7 c7 0/subop/copy 1/mod/*+disp8 1/rm32/ecx . . . . 8/disp8 7/imm32 # copy to *(ecx+8) # . clear-stream(num) # . . push args @@ -195,7 +195,7 @@ get-num: # in: (addr buffered-file), out: (addr stream byte), err: fd or (addr # pseudocode: # if (!is-digit?(Look)) expected(ed, err, "integer") # do - # if out->write >= out->length + # if out->write >= out->size # write(err, "Error: too many digits in number\n") # stop(ed, 1) # out->data[out->write] = LSB(Look) @@ -210,7 +210,7 @@ get-num: # in: (addr buffered-file), out: (addr stream byte), err: fd or (addr # in: esi # out: edi # out->write: ecx (cached copy; need to keep in sync) - # out->length: edx + # out->size: edx # temporaries: eax, ebx # We can't allocate Look to a register because it gets written implicitly in # get-char in each iteration of the loop. (Thereby demonstrating that it's @@ -255,10 +255,10 @@ $get-num:main: 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 + # edx = out->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 8/disp8 . # copy *(edi+8) to edx $get-num:loop: - # if (out->write >= out->length) error + # if (out->write >= out->size) error 39/compare 3/mod/direct 2/rm32/edx . . . 1/r32/ecx . . # compare edx with ecx 7d/jump-if-< $get-num:loop-stage2/disp8 # . error(ed, err, msg) # TODO: show full number diff --git a/apps/dquotes b/apps/dquotes index 12f43de699887272953e8d7dff4932bc7352bacb..9f1d1b4de191271982946d3b0fbda76b0921ef98 100755 GIT binary patch delta 6236 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 delta 6241 zcmZvgd0doL7st7yJR+Nb!wfjX00INU4ExTo3?V2gI)jP?qJRryxPWGwl!)d+YQ1`1 zO)E`$Eq6u9!VglpebgeO)e2Kvv`4L6dNViTJ@*dtT;uf*?&sX^`JH>uU7tG~@06YC zl>KXp0F3&q?ic7k?yX#N%b#QR7J_MPN66o!NG?~*u zv>wLm{xCsE@l2ug!rxMCI=n6XYAB}khc1bh(RvM!orZNQ!M@DmQxNDh7%ug5j9E%W zFY%xTT3^KLFVng^Z)80voMK~6P^#yuk7&J>C)7dfyLtU4#E+3OM4V z_MA$ok!!2qs?!Sc7S!~YKY0*+R?HYve&sJ3=Zf}m>v@XP-7&75W#)v`dWmbR9??1v zvTGB#)&nl|S13{?SAXux250ATVucybk)#1$b6!h!LxjuoiVvvxS=#5nx%eb}=n|p7 zAh|5u^^*kCI26IhwN@`v*_*OW5lg?n1Q&6=2fXiUP((_uv22={K4G1koTP!bn?XN8 z@^`T%VgAVy?BGFFFvD$k(gw*D%Jq#BT)_L^L7{ESbl!$QH}AyP??}scUW({oYs$L) zMS_96ncrcPyFnkUwh#MRu8)@BM?B3Wxalq@8Q?g;V45un+<4SN2~Olu^%BhEa3$0X zFk~H;T>ZGKjl!PuaLc~Atba+;^L%n1z=Z)#Bne*jh$a)8Kg5zOgIk_D^(sGXL&i3! z?1t3F0ZPw6qE`a>6lQqo$d|CeODB9w@f|pc_#r&-%8sOa4A3?(n8d=50~1LR z_{!tSL>MK{CCg#GJdqrLc6l^ugD&|VavgSgn}`Cgd+P+XKemkWGF0D z==?`gJd+k|vz}$^#g5ImhRfEua7=McSVY}#!9isL*#)99MRth-tsFfM*?wx7axm*|tDg(ez#hMNoWLItPhr^A z%;hscqfyJ&+vKA)E@U&5AUJ6Qs}Y=qjhf@c0n7n%sP=auj_{nn8utsW@5Oos9LD-= zR{wN}i)MZhoffujLVxI;@7qk~n&YC`O=YOU>+jm7-mI7sFY0_}r0 z5&@i|EP7p$|tq>Th%^`YNgCK^2DmbDoCN-c8HIbK~C{!oB zLh)W$5t=}np$)-d3a-Jgq4~IXQ^Vqk8_dR158J}#X-mT#oL4!m8R^v5k*>VO-0*{S z3NnkhjPKnl$keH|OCKYBkx8?;bS>2D)OGtGBYlra375W)pl5Q5&)ElV-@+Fk)56cJ zg%9`zb)C21^Joj84)^qO)3H%-wHz|T)!JCZy$77kq}g1W2KC`#UXvK^&+%kv4Of%Z z@J)CySqEL=)3xtBrnOcUww4d{Ls+d>Yi~S8dWT6zbLo9Jt5=f{IA9p)WeBGOaO2Kc z@Gz*!6zYtsV$P3wZgUXyTnHb3*?Ts(u$Z@4OaqVELt|{)v*G_@I#?3tSjiY!)Z8 zo}92-ykXO#7LlXS8Wrw;hQ_!fT}A3edNZ5FsL$-JylqsPno7@#zI99~A1F+ti* zY+^iUJ6Z$A(vQrl0s7MxF{wj}8x0SmhmmI>Cnk`*j$x5x8*GS~NIrr;V|3(m@Q;lk zw;?}PNAAM>*lOYjVr($Zzgt`>F+)|Hj*N%(aS@~zj-$N0y!7o3sWgd*9~kr0@qBG19CgmluxgzteR(TDsj z39rNIL?4-76htR_Ln}rG!KuU|G8O`o)T9K`lgbnjh2uO&KP-)3&>^x(+zQP}267TE zCB-Semjrq)xC**t1CFdPIZiPo+TOyU&!rYD@CFK&Lwj-@*|#o*eoJFg#%5ec?LSV6 zc!=-CyR;#CW9W`r#09796K+4gzAnw2u|?`!XPIj zRfwQw0W3pvJT+IqNi^3`^IdSvOcjn$^H0dh9D#3@wV7HH2rZc*BpWWEJrx{H`^k%N z$P|JXMW@M+?1y`%EZla+tPt`AlxO+j*P|}00CW31t5G{WvDZ)$VErbm z_pvR)RT>szH>2;EhE)l9!4tuiLDvKKF~h03Xe>3{(LeVn)1B|7BI8N7dshwvEd4YGv`Z&l~IFIJl2i)?Gx* zQtOTp?;Nl%iuD1-$}|V(?iyEd4&F774#FR~MZC>B4n<(4x4-VRS#091WK&MZjg4>O zcoN06SajFGw$WbUOVPB5>v?;tsKBSEy)is+J6syA5ROytMR+*+Me+-*FsBlCIA#vV z9~!@zm434&|X46qms*%M|>HURbba){6)%V%`ILBL&tkZVVuEkk zOwjRL8>!2l?3KN}0$ZiPV=Qnh20mGTg6fN{A3^n)nfOh+FlGaBg?VFjL=JC^RjAaN zJ-v;wh-YX(iEV9*twGQ+R+*5Ee)j%s=;KI}YRK-}ljrD1BA@?9WFe@>Ev~CZzeU`C z*Pf+qObZxY#JBun+Khcn<9AEyjrQho7EK&CQG6N;x&TM^Npdz}9mp-B?bo}&w)Hm< zSh&#ZCgV-gzgAlA!rsD=JO|SwT@TwOwWXoFXQRe&oJMgm7PRZV((JcXnAp*?y`NdH zPl0Lt0f80%g zvM0Uk>L~q`)731N-pt}FJoW%p?c}Ntn2J8_#2T);OjS#{>JO%(gA+$^mG2X%D(z9B z6R-5UPrfOPKx~}`TZ`MtT$ouBqN$~T2Di|sRd;n?ap_yqU=Bl5i62hY*^(@oV>WnB z2u^d)M!n;s`b*m+eFb&epRu$(vv`bq-+-D41>`$8F(DoA4q0gk35BpyKYTCbmS&Mg zSczmG>_c)3+Do(XUke@+w~^H5LlYedz9d^GX^91XoRo;KQs1(TrivWwjJ*ffunokv z=Nt(x;BbuuCv&(NZk5T&`yiC-@Piv&E?52`$?or@Lt+i~$%T^g|oHiiF@JnwMN zZVE3-o>#f&28BT|y`n@PGYm~OaSPe*X5-9~;8YIt;YLMDT`_gNObeDs>mF&n-=OeI z$5rRtFQq?1(`0$TLu$qh$AV?!&*L*F zoC`ls&L!)b^;0s5u$hu$P(5{+aD|$l@IIQ_5opc?*J;Cqm#O&)6r*{AntIqV?M;#o zM=O0{N~KCD8i{ZYEUPqa5DA rt<9I`zt9KI%z#?Iei1!rb*--pzFJC``?$=V`t;m@9(-!~L+$?n4WW!v diff --git a/apps/ex11.subx b/apps/ex11.subx index cacd22da..9ff43a73 100644 --- a/apps/ex11.subx +++ b/apps/ex11.subx @@ -1,9 +1,9 @@ -# Null-terminated vs length-prefixed ascii strings. +# Null-terminated vs size-prefixed ascii strings. # -# By default we create strings with a 4-byte length prefix rather than a null suffix. +# By default we create strings with a 4-byte size prefix rather than a null suffix. # However we still need null-prefixed strings when interacting with the Linux # kernel in a few places. This layer implements a function for comparing -# a null-terminated 'kernel string' with a length-prefixed 'SubX string'. +# a null-terminated 'kernel string' with a size-prefixed 'SubX string'. # # To run: # $ ./bootstrap translate init.linux apps/ex11.subx -o apps/ex11 @@ -25,11 +25,11 @@ Entry: # run all tests 89/copy 3/mod/direct 3/rm32/ebx . . . 0/r32/eax . . # copy eax to ebx e8/call syscall_exit/disp32 -# compare a null-terminated ascii string with a more idiomatic length-prefixed byte array +# compare a null-terminated ascii string with a more idiomatic size-prefixed byte array # reason for the name: the only place we should have null-terminated ascii strings is from commandline args -kernel-string-equal?: # s: null-terminated ascii string, benchmark: length-prefixed ascii string -> eax: boolean +kernel-string-equal?: # s: null-terminated ascii string, benchmark: size-prefixed ascii string -> eax: boolean # pseudocode: - # n = benchmark->length + # n = benchmark->size # s1 = s # s2 = benchmark->data # i = 0 @@ -60,7 +60,7 @@ kernel-string-equal?: # s: null-terminated ascii string, benchmark: length-pref 57/push-edi # s1/edi = s 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi - # n/edx = benchmark->length + # n/edx = benchmark->size 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 # s2/esi = benchmark->data diff --git a/apps/factorial b/apps/factorial index 3f09218b29f027662f1f0b362199f36909656977..0bb8b2c892ed82541900063c3b487a5a0c2c9e2a 100755 GIT binary patch delta 5497 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 YrZ)HApXTF0LZPMF*WCZ9`W5y60R<0yjsO4v delta 5495 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 delta 5640 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 LRPVbudBFbwL#hd^ delta 5885 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 delta 42368 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 result/eax: (handle var) # var n/ecx: int = len(fn->name) + 10 for an int + 2 for '$:' 8b/-> *(ebp+8) 0/r32/eax 8b/-> *eax 0/r32/eax # Function-name - 8b/-> *eax 0/r32/eax # String-length + 8b/-> *eax 0/r32/eax # String-size 05/add-to-eax 0xd/imm32 # 10 + 2 for '$:' 89/<- %ecx 0/r32/eax # var name/edx: (stream byte n) @@ -5019,7 +5019,7 @@ test-parse-mu-var-def: (write _test-input-stream "n: int\n") # caller has consumed the 'var' # var vars/ecx: (stack (addr var) 4) 81 5/subop/subtract %esp 0x10/imm32 - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/top 89/<- %ecx 4/r32/esp (clear-stack %ecx) @@ -5049,7 +5049,7 @@ test-parse-mu-reg-var-def: (write _test-input-stream "n/eax: int <- copy 0\n") # caller has consumed the 'var' # var vars/ecx: (stack (addr var) 4) 81 5/subop/subtract %esp 0x10/imm32 - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/top 89/<- %ecx 4/r32/esp (clear-stack %ecx) @@ -5428,7 +5428,7 @@ lookup-var-helper: # name: (addr array byte), vars: (addr stack (handle var)) - 8b/-> *(ebp+0xc) 6/r32/esi # ebx = vars->top 8b/-> *esi 3/r32/ebx - # if (vars->top > vars->length) abort + # if (vars->top > vars->size) abort 3b/compare<- *(esi+4) 0/r32/eax 0f 8f/jump-if-> $lookup-var-helper:error1/disp32 # var min/edx: (addr handle var) = vars->data @@ -5548,7 +5548,7 @@ test-parse-mu-stmt: (write _test-input-stream "increment n\n") # var vars/ecx: (stack (addr var) 4) 81 5/subop/subtract %esp 0x10/imm32 - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/top 89/<- %ecx 4/r32/esp (clear-stack %ecx) @@ -5584,7 +5584,7 @@ test-parse-mu-stmt-with-comma: (write _test-input-stream "copy-to n, 3\n") # var vars/ecx: (stack (addr var) 4) 81 5/subop/subtract %esp 0x10/imm32 - 68/push 0x10/imm32/length + 68/push 0x10/imm32/size 68/push 0/imm32/top 89/<- %ecx 4/r32/esp (clear-stack %ecx) @@ -6141,7 +6141,7 @@ populate-mu-type: # in: (addr stream byte), t: (handle typeinfo) 8b/-> *(ebp+0xc) 7/r32/edi # var line/ecx: (stream byte 512) 81 5/subop/subtract %esp 0x200/imm32 - 68/push 0x200/imm32/length + 68/push 0x200/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/<- %ecx 4/r32/esp @@ -6685,7 +6685,7 @@ size-of-array: # a: (handle tree type-id) -> result/eax: int # return array-size * size-of(elem-type) (size-of-type-id %edx) # => eax f7 4/subop/multiply-into-eax %ecx - 05/add-to-eax 4/imm32 # for array length + 05/add-to-eax 4/imm32 # for array size $size-of-array:end: # . restore registers 5a/pop-to-edx @@ -6822,7 +6822,7 @@ emit-subx-function: # out: (addr buffered-file), f: (handle function) 8b/-> *(ebp+0xc) 1/r32/ecx # var vars/edx: (stack (addr var) 256) 81 5/subop/subtract %esp 0x400/imm32 - 68/push 0x400/imm32/length + 68/push 0x400/imm32/size 68/push 0/imm32/top 89/<- %edx 4/r32/esp # @@ -7223,7 +7223,7 @@ Reverse-branch: # (table string string) # a table is a stream 0xa0/imm32/write 0/imm32/read - 0xa0/imm32/length + 0xa0/imm32/size # data "break-if-="/imm32 "0f 85/jump-if-!="/imm32 "loop-if-="/imm32 "0f 85/jump-if-!="/imm32 @@ -7689,7 +7689,7 @@ emit-subx-var-def: # out: (addr buffered-file), stmt: (handle stmt) (is-mu-array? *(ecx+4)) # Var-type => eax 3d/compare-eax-and 0/imm32/false 0f 84/jump-if-= break/disp32 - # var array-size-without-length/edx: int = n-4 + # var array-size-without-size/edx: int = n-4 81 5/subop/subtract %edx 4/imm32 (emit-indent *(ebp+8) *Curr-block-depth) (write-buffered *(ebp+8) "(push-n-zero-bytes ") @@ -7732,7 +7732,7 @@ emit-subx-stmt: # out: (addr buffered-file), stmt: (handle stmt), primitives: ( # - some special-case primitives that don't actually use the 'primitives' data structure # ecx = stmt 8b/-> *(ebp+0xc) 1/r32/ecx - # array length + # array size { # if (!string-equal?(stmt->operation, "length")) break (string-equal? *(ecx+4) "length") # Stmt1-operation => eax diff --git a/apps/pack b/apps/pack index cc967d248ac8c64f7a16a4656f8135708fdeef5e..d9c6b804e3dc3f2751aa6b572e2452ea560870c9 100755 GIT binary patch delta 6947 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 G#Q#6kt#P3M diff --git a/apps/sigils b/apps/sigils index 9f2881090fb4460f1cfe0b086b4a63dee6651691..6b79497e7d1dcfc18f83c5b5406621f322a14114 100755 GIT binary patch delta 7530 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 delta 7545 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 diff --git a/apps/survey b/apps/survey index 98f75e9e9b725d3f50962bafd49b173bb9973cc1..e4f5c1cf3efebbbb57a20ca079fe9c6108e6de8b 100755 GIT binary patch delta 7426 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 delta 7436 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 obh+WqqJ^DUAUM=|bqQ-n%WBdata[in->length] - # . edx = in->length + # max/edx = &in->data[in->size] + # . edx = in->size 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 2/r32/edx 8/disp8 . # copy *(esi+8) to edx # . edx = esi+edx+12 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 2/index/edx . 2/r32/edx 0xc/disp8 . # copy esi+edx+12 to edx @@ -4609,7 +4609,7 @@ test-num-bytes-handles-imm32: # some fields (the ones with labels capitalized) filled in. # http://www.sco.com/developers/gabi/latest/ch4.eheader.html Elf_header: - # - length + # - size 0x34/imm32 # - data $e_ident: @@ -4647,7 +4647,7 @@ $e_shstrndx: # Some fields need filling in each time. # https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-83432/index.html Elf_program_header_entry: - # - length + # - size 0x20/imm32 # - data $p_type: diff --git a/apps/tests b/apps/tests index 68c0753e783276fc869dea0c4f43be9edc2681be..9d5a07b4c1264cc33ef998c582a4853d109332e3 100755 GIT binary patch delta 5608 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 KLGSr(>i+>3?|t^!XU^}D zUD_l2_awX7i8eN~TP82J72=$29Ly<7U0zIHL^ zsAx5J`jXx+;`iUudlw$$IwQF`*Rlwc(s zuvfb`Q)=May>Q#Up4@|)eu|P#w3#tuO!?K{sh<)RzbkN5u@g_b3A78!N#89wr$!xP*tzluYxvet`r}^EB(=o{NGsfSqf2#>bMtnR^|R;CSwJR)TpP zegQSE;hDB_YpQ*@$)3XQ=b^*8xXgnk=~X^BL*bfhGpU1@-J;0{yAR=&T!0RDo%$=P zmazpYyDPVzr<2CIkuN9c!e#_5a9Fic_=tk9p-^2XyQKt^zX#k_JNmU#YMGjlAFRXL z&|ZENi)iiRMRlQ;$BONp4qlS{mzzE1F--2%#U`G~lVGN=S~h`k*yQU-Cc{qOcpShR zh?^{OBbR>!8jV_Z-69{UaU>#?A#n3%>8?WH1Fvb0%JMCs+Ru>~;dwu`tj+=&5j4O) z1Rq<#`5}&eN4zoRc(!nYZ}d#L!=iJ_cGNtiI?Jy1^YxxOe=z#{5iL~vtI23=E1aTu z+GWt_{|t7l2+)$vU70LfTIe z3Exxv2h<1a$=}e1z}6Rm9@>KoaP_8y#FJu}iPz`gy^uND_tCi0{-xpewsv&xO~!^B z<|bq&aXDYTdm&w?)}HG{dWlK1xb!M4(Wz_y>_sZm(5Qq<`yuEaoYKqI!mW!q6pcOe zieeEy;X70UkKp}e1W<>%%Zr(MIagOedZ=2vu$RC~nKX+_>tRV~hRzOCnbes}7lK>3 zy0)no>0Ty1!}D%K(7j!p`LgFo-|i*CJr<#XNBEsauq@<;CnE@K$5BB`xQBdzKdn25 zJB7ek;e})b=py3CR49)K6lS5s{36sxtS4(g6B#eOM!`NPj;tn!;8bJ=`5qji{N=Y1 z8^wvNCwuG`cjMHkMZ^jAM}_(+0?@|==}NLhq`SCLjJjy8${Y)}(POdGanVJ%Z&k$% z)NWv7=0?NRP*?goTIm{g(j+EcklbE}$I-duFl5IBke|>klH7&$G2@9RJc!W|U+{~K zAZbt#t0P%3H@2FXL5vL~)!-agPTqj2aXRu2tc!~v$KfcpKZ85ieh8{~9loHlJOg?=t zZT^DBVB`7=>`n|PZg4#@P8kwp6@+m?Jm`|bvD%`fIOWTdV9)1Lgg4=B6kLR}Npa-S z+GP4Fj!7O}nxO5m+QmJ5>1LtPOt%|a(YzDZimcE6q<{F%=f2hO-((Hh1b-*1Nh7FI zG~^njq^QX)7@IOtsR*{#u#C+uD{=r_NC_u}(3uiP=0J==fhU!rhH#wiXAN=WH`r!~ zmdQfk8$+(f5YjX4L%i!eNKe&Zgz>3rjIaRPZSXp_kHbf)i%AzGr6mh}b(la9%uTB! z5%6bPwlIoB9~xKMiA~kS2BFbpYSLn6PKtVGl*!QGSe4dNwt}UnB3=?o3;N5 z>rqR?E%PB{MdEl~(<#_6Sgrl37wKIlRdeZmxPnrT@P9__kE}@imOuG^;G3n^4(UZ& zz@)EnX(3dgbbc?=IwmdR(t6mOHGwoi<`9MMEtVHMuIxdb85a|N1U)*?b1hv(wIBHr zDu<|Lt`Y1+LeCpsun~d50`R;+2E!Euvn&7)7GyqnXRBq~DbSD)VN7!g^6Qak}KT{TYPEZl{jEMf`^^(*gq7FE-Ch3=$L zZ01o`Q%>u~;2SvJPVsTPbk)FnBjuszuxS$4@pxZRfp>SjQQYxYxIR)TxWuA06dsR! zk;Fp1F@==C5o0KR!Q3%=`7Wi#?k>HWrM$OLd;$VYy4>@$X-)P*lO*YQ!gC+T9&sqw z zIH2S^s$QU246kHp% zo{WV#qjjVL-X5(~Rau=znZ#4nq0BP3rREuMVYHWiHQL#+wxN$5O{yWwwmZ+)pYUAx zf1aB`J!Wz3ewIYjAJ!}_H63Mi5nu9WXc%ivV|PgEo7V6+iWwaLMX`t8G64s6Npdz| zD&!{7@~?ovmNgy)ivA@xFy1WvWz(7kjYUDZ`G}>ibGJ*eCR5(MYGOF9r+5oq=-f9- zqu<(y!TLK{PUWoAJ&-YW9{B?HjWv?{;83g+I;pEGBp2styc1}S6K~VrXdh|#vuUNf z@SJhx0N7Nl#v@J}UgP20VqN(ll#7{sHynodMz(E={oa={oEF;#uQRSt-`nXv7`;kCJzU^@zu}>CfmVK z;fpVbl8Pj9Z1>uVna=ob3z((=<#eSm?dcg+v(3Asr!VV6f}yn9w{Ju@x?Jt!h)0=@ N1-@31{P{M`{{SB!qVE6z