This commit is contained in:
Kartik Agaram 2019-08-25 23:25:08 -07:00
parent 418ea7d3db
commit fc55af70a5
23 changed files with 6646 additions and 6490 deletions

View File

@ -7,7 +7,7 @@
# because we don't know if they refer to the line above or the line below.
#
# To run:
# $ ./subx translate *.subx apps/assort.subx -o apps/assort
# $ ./subx translate 0*.subx apps/subx-common.subx apps/assort.subx -o apps/assort
# $ cat x
# == code
# abc

View File

@ -3,7 +3,7 @@
# except that we support hex digits.
#
# To run:
# $ ./subx translate *.subx apps/crenshaw2-1.subx -o apps/crenshaw2-1
# $ ./subx translate 0*.subx apps/crenshaw2-1.subx -o apps/crenshaw2-1
# $ echo '3' |./subx run apps/crenshaw2-1
# Expected output:
# # syscall(exit, 3)

View File

@ -3,7 +3,7 @@
# except that we support hex numbers of multiple digits.
#
# To run:
# $ ./subx translate *.subx apps/crenshaw2-1b.subx -o apps/crenshaw2-1b
# $ ./subx translate 0*.subx apps/crenshaw2-1b.subx -o apps/crenshaw2-1b
# $ echo '1a' |./subx run apps/crenshaw2-1b
# Expected output:
# # syscall(exit, 1a)

View File

@ -1,5 +1,8 @@
# Experimental syntax sugar for SubX programs.
#
# To run:
# $ ./subx translate 0*.subx apps/subx-common.subx apps/desugar.subx -o apps/desugar
#
# We're experimenting with the following expressions:
#
# 1.

View File

@ -2,7 +2,7 @@
# Replace them with references to new variables in the data segment.
#
# To run:
# $ ./subx translate *.subx apps/dquotes.subx -o apps/dquotes
# $ ./subx translate 0*.subx apps/subx-common.subx apps/dquotes.subx -o apps/dquotes
# $ cat x
# == code
# ab "cd ef"/imm32

View File

@ -1,7 +1,7 @@
## compute the factorial of 5, and return the result in the exit code
#
# To run:
# $ ./subx translate apps/factorial.subx -o apps/factorial
# $ ./subx translate 0*.subx apps/factorial.subx -o apps/factorial
# $ ./subx run apps/factorial
# Expected result:
# $ echo $?

View File

@ -13,7 +13,7 @@
# offset 4: address
#
# To run:
# $ ./subx translate *.subx apps/handle.subx -o apps/handle
# $ ./subx translate 0*.subx apps/handle.subx -o apps/handle
# $ ./subx run apps/handle
# Expected result is a successful lookup followed by a hard abort:
# lookup succeeded

View File

@ -3,7 +3,7 @@
# comments between '#' and newline.
#
# To run:
# $ ./subx translate *.subx apps/hex.subx -o apps/hex
# $ ./subx translate 0*.subx apps/subx-common.subx apps/hex.subx -o apps/hex
# $ echo '80 81 82 # comment' |./subx run apps/hex |xxd -
# Expected output:
# 00000000: 8081 82

View File

@ -3,7 +3,7 @@
# uses are left untouched.
#
# To run:
# $ ./subx translate *.subx apps/pack.subx -o apps/pack
# $ ./subx translate 0*.subx apps/subx-common.subx apps/pack.subx -o apps/pack
# $ echo '05/add-to-EAX 0x20/imm32' |./subx run apps/pack
# Expected output:
# 05 20 00 00 00 # 05/add-to-EAX 0x20/imm32

View File

@ -5,7 +5,7 @@
# b) add segment headers with addresses and offsets correctly filled in
#
# To build:
# $ ./subx translate *.subx apps/survey.subx -o apps/survey
# $ ./subx translate 0*.subx apps/subx-common.subx apps/survey.subx -o apps/survey
#
# The expected input is a stream of bytes with segment headers, comments and
# some interspersed labels.

View File

@ -1,5 +1,8 @@
# Generate code for a new function called 'run-tests' which calls in sequence
# all functions starting with 'test-'.
#
# To build:
# $ ./subx translate 0*.subx apps/subx-common.subx apps/tests.subx -o apps/tests
== code
# instruction effective address register displacement immediate

View File

@ -69,7 +69,7 @@ if ('onhashchange' in window) {
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># because we don't know if they refer to the line above or the line below.</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment">#</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># To run:</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># $ ./subx translate *.subx apps/assort.subx -o apps/assort</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/assort.subx -o apps/assort</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxComment"># $ cat x</span>
<span id="L12" class="LineNr"> 12 </span><span class="subxComment"># == code</span>
<span id="L13" class="LineNr"> 13 </span><span class="subxComment"># abc</span>

View File

@ -64,7 +64,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># except that we support hex digits.</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment">#</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># To run:</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate *.subx apps/crenshaw2-1.subx -o apps/crenshaw2-1</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/crenshaw2-1.subx -o apps/crenshaw2-1</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ echo '3' |./subx run apps/crenshaw2-1</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># Expected output:</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># # syscall(exit, 3)</span>

View File

@ -64,7 +64,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># except that we support hex numbers of multiple digits.</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment">#</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># To run:</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate *.subx apps/crenshaw2-1b.subx -o apps/crenshaw2-1b</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/crenshaw2-1b.subx -o apps/crenshaw2-1b</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ echo '1a' |./subx run apps/crenshaw2-1b</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># Expected output:</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># # syscall(exit, 1a)</span>

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@ if ('onhashchange' in window) {
<span id="L2" class="LineNr"> 2 </span><span class="subxComment"># Replace them with references to new variables in the data segment.</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment">#</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To run:</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx translate *.subx apps/dquotes.subx -o apps/dquotes</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/dquotes.subx -o apps/dquotes</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ cat x</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># == code</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># ab &quot;cd ef&quot;/imm32</span>
@ -369,7 +369,7 @@ if ('onhashchange' in window) {
<span id="L306" class="LineNr"> 306 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L307" class="LineNr"> 307 </span> <span class="subxS1Comment"># . print-int32-decimal(out-segment, *Next-string-literal)</span>
<span id="L308" class="LineNr"> 308 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L309" class="LineNr"> 309 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2715'>Next-string-literal</a></span>/disp32 <span class="subxComment"># push *Next-string-literal</span>
<span id="L309" class="LineNr"> 309 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2288'>Next-string-literal</a></span>/disp32 <span class="subxComment"># push *Next-string-literal</span>
<span id="L310" class="LineNr"> 310 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+16)</span>
<span id="L311" class="LineNr"> 311 </span> <span class="subxS2Comment"># . . call</span>
<span id="L312" class="LineNr"> 312 </span> e8/call <a href='../074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
@ -410,7 +410,7 @@ if ('onhashchange' in window) {
<span id="L347" class="LineNr"> 347 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L348" class="LineNr"> 348 </span> <span class="subxS1Comment"># . print-int32-decimal(int32-stream, *Next-string-literal)</span>
<span id="L349" class="LineNr"> 349 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L350" class="LineNr"> 350 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2715'>Next-string-literal</a></span>/disp32 <span class="subxComment"># push *Next-string-literal</span>
<span id="L350" class="LineNr"> 350 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2288'>Next-string-literal</a></span>/disp32 <span class="subxComment"># push *Next-string-literal</span>
<span id="L351" class="LineNr"> 351 </span> 51/push-ECX
<span id="L352" class="LineNr"> 352 </span> <span class="subxS2Comment"># . . call</span>
<span id="L353" class="LineNr"> 353 </span> e8/call <a href='../074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
@ -433,7 +433,7 @@ if ('onhashchange' in window) {
<span id="L370" class="LineNr"> 370 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L371" class="LineNr"> 371 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L372" class="LineNr"> 372 </span> <span class="subxComment"># ++ *Next-string-literal</span>
<span id="L373" class="LineNr"> 373 </span> ff 0/subop/increment 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2715'>Next-string-literal</a></span>/disp32 <span class="subxComment"># increment *Num-test-failures</span>
<span id="L373" class="LineNr"> 373 </span> ff 0/subop/increment 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar"><a href='dquotes.subx.html#L2288'>Next-string-literal</a></span>/disp32 <span class="subxComment"># increment *Num-test-failures</span>
<span id="L374" class="LineNr"> 374 </span><span class="Constant">$process-string-literal:end</span>:
<span id="L375" class="LineNr"> 375 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L376" class="LineNr"> 376 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x16/imm32 <span class="subxComment"># add to ESP</span>
@ -892,7 +892,7 @@ if ('onhashchange' in window) {
<span id="L886" class="LineNr"> 886 </span> 56/push-ESI
<span id="L887" class="LineNr"> 887 </span> 52/push-EDX
<span id="L888" class="LineNr"> 888 </span> <span class="subxS2Comment"># . . call</span>
<span id="L889" class="LineNr"> 889 </span> e8/call <a href='dquotes.subx.html#L2600'>string-length-at-start-of-slice</a>/disp32
<span id="L889" class="LineNr"> 889 </span> e8/call <a href='dquotes.subx.html#L2173'>string-length-at-start-of-slice</a>/disp32
<span id="L890" class="LineNr"> 890 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L891" class="LineNr"> 891 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L892" class="LineNr"> 892 </span> <span class="subxComment"># print(out, &quot;#{len}/imm32 &quot;)</span>
@ -962,7 +962,7 @@ if ('onhashchange' in window) {
<span id="L956" class="LineNr"> 956 </span> 74/jump-if-equal $emit-string-literal-data:char-done/disp8
<span id="L957" class="LineNr"> 957 </span> <span class="subxS1Comment"># . write(out, &quot;/&quot;)</span>
<span id="L958" class="LineNr"> 958 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L959" class="LineNr"> 959 </span> 68/push <span class="SpecialChar"><a href='dquotes.subx.html#L2726'>Slash</a></span>/imm32
<span id="L959" class="LineNr"> 959 </span> 68/push <span class="SpecialChar"><a href='dquotes.subx.html#L2299'>Slash</a></span>/imm32
<span id="L960" class="LineNr"> 960 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L961" class="LineNr"> 961 </span> <span class="subxS2Comment"># . . call</span>
<span id="L962" class="LineNr"> 962 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
@ -979,7 +979,7 @@ if ('onhashchange' in window) {
<span id="L973" class="LineNr"> 973 </span><span class="Constant">$emit-string-literal-data:char-done</span>:
<span id="L974" class="LineNr"> 974 </span> <span class="subxComment"># write(out, &quot; &quot;)</span>
<span id="L975" class="LineNr"> 975 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L976" class="LineNr"> 976 </span> 68/push <span class="SpecialChar"><a href='dquotes.subx.html#L2719'>Space</a></span>/imm32
<span id="L976" class="LineNr"> 976 </span> 68/push <span class="SpecialChar"><a href='dquotes.subx.html#L2292'>Space</a></span>/imm32
<span id="L977" class="LineNr"> 977 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L978" class="LineNr"> 978 </span> <span class="subxS2Comment"># . . call</span>
<span id="L979" class="LineNr"> 979 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
@ -1048,8 +1048,8 @@ if ('onhashchange' in window) {
<span id="L1042" class="LineNr">1042 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1043" class="LineNr">1043 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1044" class="LineNr">1044 </span> <span class="subxComment"># var slice/ECX = '&quot;abc&quot;/d'</span>
<span id="L1045" class="LineNr">1045 </span> 68/push <a href='dquotes.subx.html#L2735'>_test-slice-abc-limit</a>/imm32
<span id="L1046" class="LineNr">1046 </span> 68/push <a href='dquotes.subx.html#L2732'>_test-slice-abc</a>/imm32
<span id="L1045" class="LineNr">1045 </span> 68/push <a href='dquotes.subx.html#L2308'>_test-slice-abc-limit</a>/imm32
<span id="L1046" class="LineNr">1046 </span> 68/push <a href='dquotes.subx.html#L2305'>_test-slice-abc</a>/imm32
<span id="L1047" class="LineNr">1047 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L1048" class="LineNr">1048 </span> <span class="subxComment"># emit-string-literal-data(_test-output-stream, slice)</span>
<span id="L1049" class="LineNr">1049 </span> <span class="subxS2Comment"># . . push args</span>
@ -1127,8 +1127,8 @@ if ('onhashchange' in window) {
<span id="L1171" class="LineNr">1171 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1172" class="LineNr">1172 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1173" class="LineNr">1173 </span> <span class="subxComment"># var slice/ECX = '&quot;a b&quot;'</span>
<span id="L1174" class="LineNr">1174 </span> 68/push <a href='dquotes.subx.html#L2739'>_test-slice-a-space-b-limit</a>/imm32
<span id="L1175" class="LineNr">1175 </span> 68/push <a href='dquotes.subx.html#L2737'>_test-slice-a-space-b</a>/imm32
<span id="L1174" class="LineNr">1174 </span> 68/push <a href='dquotes.subx.html#L2312'>_test-slice-a-space-b-limit</a>/imm32
<span id="L1175" class="LineNr">1175 </span> 68/push <a href='dquotes.subx.html#L2310'>_test-slice-a-space-b</a>/imm32
<span id="L1176" class="LineNr">1176 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L1177" class="LineNr">1177 </span> <span class="subxComment"># emit-string-literal-data(_test-output-stream, slice)</span>
<span id="L1178" class="LineNr">1178 </span> <span class="subxS2Comment"># . . push args</span>
@ -1166,8 +1166,8 @@ if ('onhashchange' in window) {
<span id="L1235" class="LineNr">1235 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1236" class="LineNr">1236 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1237" class="LineNr">1237 </span> <span class="subxComment"># var slice/ECX = '&quot;a\&quot;b&quot;'</span>
<span id="L1238" class="LineNr">1238 </span> 68/push <a href='dquotes.subx.html#L2743'>_test-slice-a-dquote-b-limit</a>/imm32
<span id="L1239" class="LineNr">1239 </span> 68/push <a href='dquotes.subx.html#L2741'>_test-slice-a-dquote-b</a>/imm32
<span id="L1238" class="LineNr">1238 </span> 68/push <a href='dquotes.subx.html#L2316'>_test-slice-a-dquote-b-limit</a>/imm32
<span id="L1239" class="LineNr">1239 </span> 68/push <a href='dquotes.subx.html#L2314'>_test-slice-a-dquote-b</a>/imm32
<span id="L1240" class="LineNr">1240 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L1241" class="LineNr">1241 </span> <span class="subxComment"># emit-string-literal-data(_test-output-stream, slice)</span>
<span id="L1242" class="LineNr">1242 </span> <span class="subxS2Comment"># . . push args</span>
@ -1205,8 +1205,8 @@ if ('onhashchange' in window) {
<span id="L1299" class="LineNr">1299 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1300" class="LineNr">1300 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1301" class="LineNr">1301 </span> <span class="subxComment"># var slice/ECX = '&quot;a\nb&quot;'</span>
<span id="L1302" class="LineNr">1302 </span> 68/push <a href='dquotes.subx.html#L2747'>_test-slice-a-newline-b-limit</a>/imm32
<span id="L1303" class="LineNr">1303 </span> 68/push <a href='dquotes.subx.html#L2745'>_test-slice-a-newline-b</a>/imm32
<span id="L1302" class="LineNr">1302 </span> 68/push <a href='dquotes.subx.html#L2320'>_test-slice-a-newline-b-limit</a>/imm32
<span id="L1303" class="LineNr">1303 </span> 68/push <a href='dquotes.subx.html#L2318'>_test-slice-a-newline-b</a>/imm32
<span id="L1304" class="LineNr">1304 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L1305" class="LineNr">1305 </span> <span class="subxComment"># emit-string-literal-data(_test-output-stream, slice)</span>
<span id="L1306" class="LineNr">1306 </span> <span class="subxS2Comment"># . . push args</span>
@ -1280,7 +1280,7 @@ if ('onhashchange' in window) {
<span id="L1399" class="LineNr">1399 </span> 52/push-EDX
<span id="L1400" class="LineNr">1400 </span> 51/push-ECX
<span id="L1401" class="LineNr">1401 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1402" class="LineNr">1402 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L1402" class="LineNr">1402 </span> e8/call skip-string-in-slice/disp32
<span id="L1403" class="LineNr">1403 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1404" class="LineNr">1404 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1405" class="LineNr">1405 </span> <span class="subxS1Comment"># . curr = EAX</span>
@ -1583,8 +1583,8 @@ if ('onhashchange' in window) {
<span id="L1702" class="LineNr">1702 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1703" class="LineNr">1703 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1704" class="LineNr">1704 </span> <span class="subxComment"># var slice/ECX = &quot;\&quot;abc/def\&quot;/ghi&quot;</span>
<span id="L1705" class="LineNr">1705 </span> 68/push <a href='dquotes.subx.html#L2756'>_test-slice-literal-string-with-limit</a>/imm32
<span id="L1706" class="LineNr">1706 </span> 68/push <a href='dquotes.subx.html#L2750'>_test-slice-literal-string</a>/imm32/start
<span id="L1705" class="LineNr">1705 </span> 68/push <a href='dquotes.subx.html#L2329'>_test-slice-literal-string-with-limit</a>/imm32
<span id="L1706" class="LineNr">1706 </span> 68/push <a href='dquotes.subx.html#L2323'>_test-slice-literal-string</a>/imm32/start
<span id="L1707" class="LineNr">1707 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L1708" class="LineNr">1708 </span> <span class="subxComment"># emit-metadata(_test-output-buffered-file, slice)</span>
<span id="L1709" class="LineNr">1709 </span> <span class="subxS2Comment"># . . push args</span>
@ -1685,7 +1685,7 @@ if ('onhashchange' in window) {
<span id="L1829" class="LineNr">1829 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1830" class="LineNr">1830 </span> 56/push-ESI
<span id="L1831" class="LineNr">1831 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1832" class="LineNr">1832 </span> e8/call <a href='dquotes.subx.html#L2175'>skip-string</a>/disp32
<span id="L1832" class="LineNr">1832 </span> e8/call skip-string/disp32
<span id="L1833" class="LineNr">1833 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1834" class="LineNr">1834 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1835" class="LineNr">1835 </span> <span class="subxComment"># fall through</span>
@ -1858,7 +1858,7 @@ if ('onhashchange' in window) {
<span id="L2002" class="LineNr">2002 </span> 5d/pop-to-EBP
<span id="L2003" class="LineNr">2003 </span> c3/return
<span id="L2004" class="LineNr">2004 </span>
<span id="L2005" class="LineNr">2005 </span><span class="subxTest">test-next-word-or-string-returns-empty-string-on-eof</span>:
<span id="L2005" class="LineNr">2005 </span><span class="subxTest">test-next-word-or-string-returns-empty-slice-on-eof</span>:
<span id="L2006" class="LineNr">2006 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2007" class="LineNr">2007 </span> 55/push-EBP
<span id="L2008" class="LineNr">2008 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
@ -1900,7 +1900,7 @@ if ('onhashchange' in window) {
<span id="L2044" class="LineNr">2044 </span> 5d/pop-to-EBP
<span id="L2045" class="LineNr">2045 </span> c3/return
<span id="L2046" class="LineNr">2046 </span>
<span id="L2047" class="LineNr">2047 </span><span class="subxTest">test-next-word-or-string-returns-whole-string</span>:
<span id="L2047" class="LineNr">2047 </span><span class="subxTest">test-next-word-or-string-returns-string-literal</span>:
<span id="L2048" class="LineNr">2048 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2049" class="LineNr">2049 </span> 55/push-EBP
<span id="L2050" class="LineNr">2050 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
@ -1935,7 +1935,7 @@ if ('onhashchange' in window) {
<span id="L2079" class="LineNr">2079 </span> <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-input-stream-&gt;data, 1, msg)</span>
<span id="L2080" class="LineNr">2080 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-input-stream, 13, msg)</span>
<span id="L2081" class="LineNr">2081 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2082" class="LineNr">2082 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2047'>test-next-word-or-string-returns-whole-string</a>: start&quot;</span>/imm32
<span id="L2082" class="LineNr">2082 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2047'>test-next-word-or-string-returns-string-literal</a>: start&quot;</span>/imm32
<span id="L2083" class="LineNr">2083 </span> 68/push 0xd/imm32
<span id="L2084" class="LineNr">2084 </span> <span class="subxS2Comment"># . . push slice-&gt;start - _test-input-stream</span>
<span id="L2085" class="LineNr">2085 </span> 8b/copy 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *ECX to EAX</span>
@ -1948,7 +1948,7 @@ if ('onhashchange' in window) {
<span id="L2092" class="LineNr">2092 </span> <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-input-stream-&gt;data, 12, msg)</span>
<span id="L2093" class="LineNr">2093 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-input-stream, 24, msg)</span>
<span id="L2094" class="LineNr">2094 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2095" class="LineNr">2095 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2047'>test-next-word-or-string-returns-whole-string</a>: end&quot;</span>/imm32
<span id="L2095" class="LineNr">2095 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2047'>test-next-word-or-string-returns-string-literal</a>: end&quot;</span>/imm32
<span id="L2096" class="LineNr">2096 </span> 68/push 0x18/imm32
<span id="L2097" class="LineNr">2097 </span> <span class="subxS2Comment"># . . push slice-&gt;end - _test-input-stream</span>
<span id="L2098" class="LineNr">2098 </span> 8b/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ECX+4) to EAX</span>
@ -2026,592 +2026,165 @@ if ('onhashchange' in window) {
<span id="L2170" class="LineNr">2170 </span> 5d/pop-to-EBP
<span id="L2171" class="LineNr">2171 </span> c3/return
<span id="L2172" class="LineNr">2172 </span>
<span id="L2173" class="LineNr">2173 </span><span class="subxComment"># update line-&gt;read to end of string literal surrounded by double quotes</span>
<span id="L2174" class="LineNr">2174 </span><span class="subxComment"># line-&gt;read must start out at a double-quote</span>
<span id="L2175" class="LineNr">2175 </span><span class="subxFunction">skip-string</span>: <span class="subxComment"># line : (address stream)</span>
<span id="L2176" class="LineNr">2176 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2177" class="LineNr">2177 </span> 55/push-EBP
<span id="L2178" class="LineNr">2178 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2179" class="LineNr">2179 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L2180" class="LineNr">2180 </span> 50/push-EAX
<span id="L2181" class="LineNr">2181 </span> 51/push-ECX
<span id="L2182" class="LineNr">2182 </span> 52/push-EDX
<span id="L2183" class="LineNr">2183 </span> <span class="subxComment"># ECX = line</span>
<span id="L2184" class="LineNr">2184 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
<span id="L2185" class="LineNr">2185 </span> <span class="subxComment"># EAX = skip-string-in-slice(&amp;line-&gt;data[line-&gt;read], &amp;line-&gt;data[line-&gt;write])</span>
<span id="L2186" class="LineNr">2186 </span> <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;write]</span>
<span id="L2187" class="LineNr">2187 </span> 8b/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ECX+8) to EDX</span>
<span id="L2188" class="LineNr">2188 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX+EDX+12 to EDX</span>
<span id="L2189" class="LineNr">2189 </span> 52/push-EDX
<span id="L2190" class="LineNr">2190 </span> <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;read]</span>
<span id="L2191" class="LineNr">2191 </span> 8b/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ECX+4) to EDX</span>
<span id="L2192" class="LineNr">2192 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX+EDX+12 to EDX</span>
<span id="L2193" class="LineNr">2193 </span> 52/push-EDX
<span id="L2194" class="LineNr">2194 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2195" class="LineNr">2195 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L2196" class="LineNr">2196 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2197" class="LineNr">2197 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2198" class="LineNr">2198 </span> <span class="subxComment"># line-&gt;read = EAX - line-&gt;data</span>
<span id="L2199" class="LineNr">2199 </span> 29/subtract 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># subtract ECX from EAX</span>
<span id="L2200" class="LineNr">2200 </span> 2d/subtract-from-EAX 0xc/imm32
<span id="L2201" class="LineNr">2201 </span> 89/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *(ECX+4)</span>
<span id="L2202" class="LineNr">2202 </span><span class="Constant">$skip-string:end</span>:
<span id="L2203" class="LineNr">2203 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L2204" class="LineNr">2204 </span> 5a/pop-to-EDX
<span id="L2205" class="LineNr">2205 </span> 59/pop-to-ECX
<span id="L2206" class="LineNr">2206 </span> 58/pop-to-EAX
<span id="L2207" class="LineNr">2207 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2208" class="LineNr">2208 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2209" class="LineNr">2209 </span> 5d/pop-to-EBP
<span id="L2210" class="LineNr">2210 </span> c3/return
<span id="L2211" class="LineNr">2211 </span>
<span id="L2212" class="LineNr">2212 </span><span class="subxTest">test-skip-string</span>:
<span id="L2213" class="LineNr">2213 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2214" class="LineNr">2214 </span> 55/push-EBP
<span id="L2215" class="LineNr">2215 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2216" class="LineNr">2216 </span> <span class="subxComment"># setup</span>
<span id="L2217" class="LineNr">2217 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2218" class="LineNr">2218 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2219" class="LineNr">2219 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2220" class="LineNr">2220 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2221" class="LineNr">2221 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2222" class="LineNr">2222 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2223" class="LineNr">2223 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2224" class="LineNr">2224 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;abc\&quot; def&quot;)</span>
<span id="L2225" class="LineNr">2225 </span> <span class="subxS1Comment"># . indices: 0123 45</span>
<span id="L2226" class="LineNr">2226 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2227" class="LineNr">2227 </span> 68/push <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2228" class="LineNr">2228 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2229" class="LineNr">2229 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2230" class="LineNr">2230 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2231" class="LineNr">2231 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2232" class="LineNr">2232 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2233" class="LineNr">2233 </span> <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L2173" class="LineNr">2173 </span><span class="subxFunction">string-length-at-start-of-slice</span>: <span class="subxComment"># curr : (address byte), end : (address byte) -&gt; length/EAX</span>
<span id="L2174" class="LineNr">2174 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2175" class="LineNr">2175 </span> 55/push-EBP
<span id="L2176" class="LineNr">2176 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2177" class="LineNr">2177 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L2178" class="LineNr">2178 </span> 51/push-ECX
<span id="L2179" class="LineNr">2179 </span> 52/push-EDX
<span id="L2180" class="LineNr">2180 </span> 53/push-EBX
<span id="L2181" class="LineNr">2181 </span> <span class="subxComment"># ECX = curr</span>
<span id="L2182" class="LineNr">2182 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
<span id="L2183" class="LineNr">2183 </span> <span class="subxComment"># EDX = end</span>
<span id="L2184" class="LineNr">2184 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDX</span>
<span id="L2185" class="LineNr">2185 </span> <span class="subxComment"># length/EAX = 0</span>
<span id="L2186" class="LineNr">2186 </span> 31/xor 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EAX</span>
<span id="L2187" class="LineNr">2187 </span> <span class="subxComment"># EBX = 0</span>
<span id="L2188" class="LineNr">2188 </span> 31/xor 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EBX</span>
<span id="L2189" class="LineNr">2189 </span> <span class="subxComment"># skip initial dquote</span>
<span id="L2190" class="LineNr">2190 </span> 41/increment-ECX
<span id="L2191" class="LineNr">2191 </span><span class="Constant">$string-length-at-start-of-slice:loop</span>:
<span id="L2192" class="LineNr">2192 </span> <span class="subxComment"># if (curr &gt;= end) return length</span>
<span id="L2193" class="LineNr">2193 </span> 39/compare 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ECX with EDX</span>
<span id="L2194" class="LineNr">2194 </span> 73/jump-if-greater-unsigned-or-equal $string-length-at-start-of-slice:end/disp8
<span id="L2195" class="LineNr">2195 </span> <span class="subxComment"># BL = *curr</span>
<span id="L2196" class="LineNr">2196 </span> 8a/copy-byte 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/BL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *ECX to BL</span>
<span id="L2197" class="LineNr">2197 </span><span class="Constant">$string-length-at-start-of-slice:dquote</span>:
<span id="L2198" class="LineNr">2198 </span> <span class="subxComment"># if (EBX == '&quot;') break</span>
<span id="L2199" class="LineNr">2199 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x22/imm32/dquote <span class="subxComment"># compare EBX</span>
<span id="L2200" class="LineNr">2200 </span> 74/jump-if-equal $string-length-at-start-of-slice:end/disp8
<span id="L2201" class="LineNr">2201 </span><span class="Constant">$string-length-at-start-of-slice:check-for-escape</span>:
<span id="L2202" class="LineNr">2202 </span> <span class="subxComment"># if (EBX == '\') escape next char</span>
<span id="L2203" class="LineNr">2203 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x5c/imm32/backslash <span class="subxComment"># compare EBX</span>
<span id="L2204" class="LineNr">2204 </span> 75/jump-if-not-equal $string-length-at-start-of-slice:continue/disp8
<span id="L2205" class="LineNr">2205 </span><span class="Constant">$string-length-at-start-of-slice:escape</span>:
<span id="L2206" class="LineNr">2206 </span> <span class="subxComment"># increment curr but not result</span>
<span id="L2207" class="LineNr">2207 </span> 41/increment-ECX
<span id="L2208" class="LineNr">2208 </span><span class="Constant">$string-length-at-start-of-slice:continue</span>:
<span id="L2209" class="LineNr">2209 </span> <span class="subxComment"># ++result</span>
<span id="L2210" class="LineNr">2210 </span> 40/increment-EAX
<span id="L2211" class="LineNr">2211 </span> <span class="subxComment"># ++curr</span>
<span id="L2212" class="LineNr">2212 </span> 41/increment-ECX
<span id="L2213" class="LineNr">2213 </span> eb/jump $string-length-at-start-of-slice:loop/disp8
<span id="L2214" class="LineNr">2214 </span><span class="Constant">$string-length-at-start-of-slice:end</span>:
<span id="L2215" class="LineNr">2215 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L2216" class="LineNr">2216 </span> 5b/pop-to-EBX
<span id="L2217" class="LineNr">2217 </span> 5a/pop-to-EDX
<span id="L2218" class="LineNr">2218 </span> 59/pop-to-ECX
<span id="L2219" class="LineNr">2219 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2220" class="LineNr">2220 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2221" class="LineNr">2221 </span> 5d/pop-to-EBP
<span id="L2222" class="LineNr">2222 </span> c3/return
<span id="L2223" class="LineNr">2223 </span>
<span id="L2224" class="LineNr">2224 </span><span class="subxTest">test-string-length-at-start-of-slice</span>:
<span id="L2225" class="LineNr">2225 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2226" class="LineNr">2226 </span> 55/push-EBP
<span id="L2227" class="LineNr">2227 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2228" class="LineNr">2228 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;abc\&quot; def&quot;</span>
<span id="L2229" class="LineNr">2229 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2230" class="LineNr">2230 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2231" class="LineNr">2231 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2232" class="LineNr">2232 </span> 05/add-to-EAX 4/imm32
<span id="L2233" class="LineNr">2233 </span> <span class="subxComment"># EAX = string-length-at-start-of-slice(EAX, ECX)</span>
<span id="L2234" class="LineNr">2234 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2235" class="LineNr">2235 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2212'>test-skip-string</a>/precondition&quot;</span>/imm32
<span id="L2236" class="LineNr">2236 </span> 68/push 0/imm32
<span id="L2237" class="LineNr">2237 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2238" class="LineNr">2238 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2239" class="LineNr">2239 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2240" class="LineNr">2240 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2241" class="LineNr">2241 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2242" class="LineNr">2242 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2243" class="LineNr">2243 </span> <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L2244" class="LineNr">2244 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2245" class="LineNr">2245 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2235" class="LineNr">2235 </span> 51/push-ECX
<span id="L2236" class="LineNr">2236 </span> 50/push-EAX
<span id="L2237" class="LineNr">2237 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2238" class="LineNr">2238 </span> e8/call <a href='dquotes.subx.html#L2173'>string-length-at-start-of-slice</a>/disp32
<span id="L2239" class="LineNr">2239 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2240" class="LineNr">2240 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2241" class="LineNr">2241 </span> <span class="subxComment"># check-ints-equal(EAX, 3, msg)</span>
<span id="L2242" class="LineNr">2242 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2243" class="LineNr">2243 </span> 68/push <span class="Constant">&quot;F - test-string-length-at-start-of-slice&quot;</span>/imm32
<span id="L2244" class="LineNr">2244 </span> 68/push 3/imm32
<span id="L2245" class="LineNr">2245 </span> 50/push-EAX
<span id="L2246" class="LineNr">2246 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2247" class="LineNr">2247 </span> e8/call <a href='dquotes.subx.html#L2175'>skip-string</a>/disp32
<span id="L2247" class="LineNr">2247 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2248" class="LineNr">2248 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2249" class="LineNr">2249 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2250" class="LineNr">2250 </span> <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L2251" class="LineNr">2251 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2252" class="LineNr">2252 </span> 68/push <span class="Constant">&quot;F - test-skip-string&quot;</span>/imm32
<span id="L2253" class="LineNr">2253 </span> 68/push 5/imm32
<span id="L2254" class="LineNr">2254 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2255" class="LineNr">2255 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2256" class="LineNr">2256 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2257" class="LineNr">2257 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2258" class="LineNr">2258 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2259" class="LineNr">2259 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2260" class="LineNr">2260 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2261" class="LineNr">2261 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2262" class="LineNr">2262 </span> 5d/pop-to-EBP
<span id="L2263" class="LineNr">2263 </span> c3/return
<span id="L2264" class="LineNr">2264 </span>
<span id="L2265" class="LineNr">2265 </span><span class="subxTest">test-skip-string-ignores-spaces</span>:
<span id="L2266" class="LineNr">2266 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2267" class="LineNr">2267 </span> 55/push-EBP
<span id="L2268" class="LineNr">2268 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2269" class="LineNr">2269 </span> <span class="subxComment"># setup</span>
<span id="L2270" class="LineNr">2270 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2271" class="LineNr">2271 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2272" class="LineNr">2272 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2273" class="LineNr">2273 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2274" class="LineNr">2274 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2275" class="LineNr">2275 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2276" class="LineNr">2276 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2277" class="LineNr">2277 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;a b\&quot;/yz&quot;)</span>
<span id="L2278" class="LineNr">2278 </span> <span class="subxS1Comment"># . indices: 0123 45</span>
<span id="L2279" class="LineNr">2279 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2280" class="LineNr">2280 </span> 68/push <span class="Constant">&quot;\&quot;</span>a b\<span class="Constant">&quot;/yz&quot;</span>/imm32
<span id="L2281" class="LineNr">2281 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2282" class="LineNr">2282 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2283" class="LineNr">2283 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2284" class="LineNr">2284 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2285" class="LineNr">2285 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2286" class="LineNr">2286 </span> <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L2287" class="LineNr">2287 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2288" class="LineNr">2288 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2265'>test-skip-string-ignores-spaces</a>/precondition&quot;</span>/imm32
<span id="L2289" class="LineNr">2289 </span> 68/push 0/imm32
<span id="L2290" class="LineNr">2290 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2291" class="LineNr">2291 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2292" class="LineNr">2292 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2293" class="LineNr">2293 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2294" class="LineNr">2294 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2295" class="LineNr">2295 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2296" class="LineNr">2296 </span> <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L2297" class="LineNr">2297 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2298" class="LineNr">2298 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2299" class="LineNr">2299 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2300" class="LineNr">2300 </span> e8/call <a href='dquotes.subx.html#L2175'>skip-string</a>/disp32
<span id="L2301" class="LineNr">2301 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2302" class="LineNr">2302 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2303" class="LineNr">2303 </span> <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L2304" class="LineNr">2304 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2305" class="LineNr">2305 </span> 68/push <span class="Constant">&quot;F - test-skip-string-ignores-spaces&quot;</span>/imm32
<span id="L2306" class="LineNr">2306 </span> 68/push 5/imm32
<span id="L2307" class="LineNr">2307 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2308" class="LineNr">2308 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2309" class="LineNr">2309 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2310" class="LineNr">2310 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2311" class="LineNr">2311 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2312" class="LineNr">2312 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2313" class="LineNr">2313 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2314" class="LineNr">2314 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2315" class="LineNr">2315 </span> 5d/pop-to-EBP
<span id="L2316" class="LineNr">2316 </span> c3/return
<span id="L2249" class="LineNr">2249 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2250" class="LineNr">2250 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2251" class="LineNr">2251 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2252" class="LineNr">2252 </span> 5d/pop-to-EBP
<span id="L2253" class="LineNr">2253 </span> c3/return
<span id="L2254" class="LineNr">2254 </span>
<span id="L2255" class="LineNr">2255 </span><span class="subxTest">test-string-length-at-start-of-slice-escaped</span>:
<span id="L2256" class="LineNr">2256 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2257" class="LineNr">2257 </span> 55/push-EBP
<span id="L2258" class="LineNr">2258 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2259" class="LineNr">2259 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;ab\\c\&quot; def&quot;</span>
<span id="L2260" class="LineNr">2260 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>ab\\c\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2261" class="LineNr">2261 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2262" class="LineNr">2262 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2263" class="LineNr">2263 </span> 05/add-to-EAX 4/imm32
<span id="L2264" class="LineNr">2264 </span> <span class="subxComment"># EAX = string-length-at-start-of-slice(EAX, ECX)</span>
<span id="L2265" class="LineNr">2265 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2266" class="LineNr">2266 </span> 51/push-ECX
<span id="L2267" class="LineNr">2267 </span> 50/push-EAX
<span id="L2268" class="LineNr">2268 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2269" class="LineNr">2269 </span> e8/call <a href='dquotes.subx.html#L2173'>string-length-at-start-of-slice</a>/disp32
<span id="L2270" class="LineNr">2270 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2271" class="LineNr">2271 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2272" class="LineNr">2272 </span> <span class="subxComment"># check-ints-equal(EAX, 3, msg)</span>
<span id="L2273" class="LineNr">2273 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2274" class="LineNr">2274 </span> 68/push <span class="Constant">&quot;F - test-string-length-at-start-of-slice-escaped&quot;</span>/imm32
<span id="L2275" class="LineNr">2275 </span> 68/push 3/imm32
<span id="L2276" class="LineNr">2276 </span> 50/push-EAX
<span id="L2277" class="LineNr">2277 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2278" class="LineNr">2278 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2279" class="LineNr">2279 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2280" class="LineNr">2280 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2281" class="LineNr">2281 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2282" class="LineNr">2282 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2283" class="LineNr">2283 </span> 5d/pop-to-EBP
<span id="L2284" class="LineNr">2284 </span> c3/return
<span id="L2285" class="LineNr">2285 </span>
<span id="L2286" class="LineNr">2286 </span>== data
<span id="L2287" class="LineNr">2287 </span>
<span id="L2288" class="LineNr">2288 </span><span class="SpecialChar">Next-string-literal</span>: <span class="subxComment"># tracks the next auto-generated variable name</span>
<span id="L2289" class="LineNr">2289 </span> 1/imm32
<span id="L2290" class="LineNr">2290 </span>
<span id="L2291" class="LineNr">2291 </span><span class="subxComment"># length-prefixed string containing just a single space</span>
<span id="L2292" class="LineNr">2292 </span><span class="SpecialChar">Space</span>:
<span id="L2293" class="LineNr">2293 </span> <span class="subxComment"># size</span>
<span id="L2294" class="LineNr">2294 </span> 1/imm32
<span id="L2295" class="LineNr">2295 </span> <span class="subxComment"># data</span>
<span id="L2296" class="LineNr">2296 </span> 20/space
<span id="L2297" class="LineNr">2297 </span>
<span id="L2298" class="LineNr">2298 </span><span class="subxComment"># length-prefixed string containing just a single slash</span>
<span id="L2299" class="LineNr">2299 </span><span class="SpecialChar">Slash</span>:
<span id="L2300" class="LineNr">2300 </span> <span class="subxComment"># size</span>
<span id="L2301" class="LineNr">2301 </span> 1/imm32
<span id="L2302" class="LineNr">2302 </span> <span class="subxComment"># data</span>
<span id="L2303" class="LineNr">2303 </span> 2f/slash
<span id="L2304" class="LineNr">2304 </span>
<span id="L2305" class="LineNr">2305 </span><span class="subxMinorFunction">_test-slice-abc</span>:
<span id="L2306" class="LineNr">2306 </span> 22/dquote 61/a 62/b 63/c 22/dquote <span class="subxComment"># &quot;abc&quot;</span>
<span id="L2307" class="LineNr">2307 </span> 2f/slash 64/d
<span id="L2308" class="LineNr">2308 </span><span class="subxMinorFunction">_test-slice-abc-limit</span>:
<span id="L2309" class="LineNr">2309 </span>
<span id="L2310" class="LineNr">2310 </span><span class="subxMinorFunction">_test-slice-a-space-b</span>:
<span id="L2311" class="LineNr">2311 </span> 22/dquote 61/a 20/space 62/b 22/dquote <span class="subxComment"># &quot;a b&quot;</span>
<span id="L2312" class="LineNr">2312 </span><span class="subxMinorFunction">_test-slice-a-space-b-limit</span>:
<span id="L2313" class="LineNr">2313 </span>
<span id="L2314" class="LineNr">2314 </span><span class="subxMinorFunction">_test-slice-a-dquote-b</span>:
<span id="L2315" class="LineNr">2315 </span> 22/dquote 61/a 5c/backslash 22/dquote 62/b 22/dquote <span class="subxComment"># &quot;a\&quot;b&quot;</span>
<span id="L2316" class="LineNr">2316 </span><span class="subxMinorFunction">_test-slice-a-dquote-b-limit</span>:
<span id="L2317" class="LineNr">2317 </span>
<span id="L2318" class="LineNr">2318 </span><span class="subxTest">test-skip-string-ignores-escapes</span>:
<span id="L2319" class="LineNr">2319 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2320" class="LineNr">2320 </span> 55/push-EBP
<span id="L2321" class="LineNr">2321 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2322" class="LineNr">2322 </span> <span class="subxComment"># setup</span>
<span id="L2323" class="LineNr">2323 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2324" class="LineNr">2324 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2325" class="LineNr">2325 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2326" class="LineNr">2326 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2327" class="LineNr">2327 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2328" class="LineNr">2328 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2329" class="LineNr">2329 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2330" class="LineNr">2330 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;a\\\&quot;b\&quot;/yz&quot;)</span>
<span id="L2331" class="LineNr">2331 </span> <span class="subxS1Comment"># . indices: 01 2 34 56</span>
<span id="L2332" class="LineNr">2332 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2333" class="LineNr">2333 </span> 68/push <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L2334" class="LineNr">2334 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2335" class="LineNr">2335 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2336" class="LineNr">2336 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2337" class="LineNr">2337 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2338" class="LineNr">2338 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2339" class="LineNr">2339 </span> <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L2340" class="LineNr">2340 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2341" class="LineNr">2341 </span> 68/push <span class="Constant">&quot;F - <a href='dquotes.subx.html#L2318'>test-skip-string-ignores-escapes</a>/precondition&quot;</span>/imm32
<span id="L2342" class="LineNr">2342 </span> 68/push 0/imm32
<span id="L2343" class="LineNr">2343 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2344" class="LineNr">2344 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2345" class="LineNr">2345 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2346" class="LineNr">2346 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2347" class="LineNr">2347 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2348" class="LineNr">2348 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2349" class="LineNr">2349 </span> <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L2350" class="LineNr">2350 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2351" class="LineNr">2351 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2352" class="LineNr">2352 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2353" class="LineNr">2353 </span> e8/call <a href='dquotes.subx.html#L2175'>skip-string</a>/disp32
<span id="L2354" class="LineNr">2354 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2355" class="LineNr">2355 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2356" class="LineNr">2356 </span> <span class="subxComment"># check-ints-equal(line-&gt;read, 6, msg)</span>
<span id="L2357" class="LineNr">2357 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2358" class="LineNr">2358 </span> 68/push <span class="Constant">&quot;F - test-skip-string-ignores-escapes&quot;</span>/imm32
<span id="L2359" class="LineNr">2359 </span> 68/push 6/imm32
<span id="L2360" class="LineNr">2360 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2361" class="LineNr">2361 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2362" class="LineNr">2362 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2363" class="LineNr">2363 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2364" class="LineNr">2364 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2365" class="LineNr">2365 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2366" class="LineNr">2366 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2367" class="LineNr">2367 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2368" class="LineNr">2368 </span> 5d/pop-to-EBP
<span id="L2369" class="LineNr">2369 </span> c3/return
<span id="L2370" class="LineNr">2370 </span>
<span id="L2371" class="LineNr">2371 </span><span class="subxTest">test-skip-string-works-from-mid-stream</span>:
<span id="L2372" class="LineNr">2372 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2373" class="LineNr">2373 </span> 55/push-EBP
<span id="L2374" class="LineNr">2374 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2375" class="LineNr">2375 </span> <span class="subxComment"># setup</span>
<span id="L2376" class="LineNr">2376 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2377" class="LineNr">2377 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2378" class="LineNr">2378 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2379" class="LineNr">2379 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2380" class="LineNr">2380 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2381" class="LineNr">2381 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2382" class="LineNr">2382 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2383" class="LineNr">2383 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;0 \&quot;a\\\&quot;b\&quot;/yz&quot;)</span>
<span id="L2384" class="LineNr">2384 </span> <span class="subxS1Comment"># . indices: 01 2 34 56</span>
<span id="L2385" class="LineNr">2385 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2386" class="LineNr">2386 </span> 68/push <span class="Constant">&quot;0 \&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L2387" class="LineNr">2387 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2388" class="LineNr">2388 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2389" class="LineNr">2389 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2390" class="LineNr">2390 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2391" class="LineNr">2391 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2392" class="LineNr">2392 </span> <span class="subxComment"># precondition: line-&gt;read == 2</span>
<span id="L2393" class="LineNr">2393 </span> c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 2/imm32 <span class="subxComment"># copy to *(EAX+4)</span>
<span id="L2394" class="LineNr">2394 </span> <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L2395" class="LineNr">2395 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2396" class="LineNr">2396 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2397" class="LineNr">2397 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2398" class="LineNr">2398 </span> e8/call <a href='dquotes.subx.html#L2175'>skip-string</a>/disp32
<span id="L2399" class="LineNr">2399 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2400" class="LineNr">2400 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2401" class="LineNr">2401 </span> <span class="subxComment"># check-ints-equal(line-&gt;read, 8, msg)</span>
<span id="L2402" class="LineNr">2402 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2403" class="LineNr">2403 </span> 68/push <span class="Constant">&quot;F - test-skip-string-works-from-mid-stream&quot;</span>/imm32
<span id="L2404" class="LineNr">2404 </span> 68/push 8/imm32
<span id="L2405" class="LineNr">2405 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L2406" class="LineNr">2406 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L2407" class="LineNr">2407 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2408" class="LineNr">2408 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2409" class="LineNr">2409 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2410" class="LineNr">2410 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2411" class="LineNr">2411 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2412" class="LineNr">2412 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2413" class="LineNr">2413 </span> 5d/pop-to-EBP
<span id="L2414" class="LineNr">2414 </span> c3/return
<span id="L2415" class="LineNr">2415 </span>
<span id="L2416" class="LineNr">2416 </span><span class="subxFunction">skip-string-in-slice</span>: <span class="subxComment"># curr : (address byte), end : (address byte) -&gt; new_curr/EAX</span>
<span id="L2417" class="LineNr">2417 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2418" class="LineNr">2418 </span> 55/push-EBP
<span id="L2419" class="LineNr">2419 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2420" class="LineNr">2420 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L2421" class="LineNr">2421 </span> 51/push-ECX
<span id="L2422" class="LineNr">2422 </span> 52/push-EDX
<span id="L2423" class="LineNr">2423 </span> 53/push-EBX
<span id="L2424" class="LineNr">2424 </span> <span class="subxComment"># ECX = curr</span>
<span id="L2425" class="LineNr">2425 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
<span id="L2426" class="LineNr">2426 </span> <span class="subxComment"># EDX = end</span>
<span id="L2427" class="LineNr">2427 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDX</span>
<span id="L2428" class="LineNr">2428 </span> <span class="subxComment"># EAX = 0</span>
<span id="L2429" class="LineNr">2429 </span> 31/xor 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EAX</span>
<span id="L2430" class="LineNr">2430 </span> <span class="subxComment"># skip initial dquote</span>
<span id="L2431" class="LineNr">2431 </span> 41/increment-ECX
<span id="L2432" class="LineNr">2432 </span><span class="Constant">$skip-string-in-slice:loop</span>:
<span id="L2433" class="LineNr">2433 </span> <span class="subxComment"># if (curr &gt;= end) return curr</span>
<span id="L2434" class="LineNr">2434 </span> 39/compare 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ECX with EDX</span>
<span id="L2435" class="LineNr">2435 </span> 73/jump-if-greater-unsigned-or-equal $skip-string-in-slice:return-curr/disp8
<span id="L2436" class="LineNr">2436 </span> <span class="subxComment"># AL = *curr</span>
<span id="L2437" class="LineNr">2437 </span> 8a/copy-byte 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/AL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *ECX to AL</span>
<span id="L2438" class="LineNr">2438 </span><span class="Constant">$skip-string-in-slice:dquote</span>:
<span id="L2439" class="LineNr">2439 </span> <span class="subxComment"># if (EAX == '&quot;') break</span>
<span id="L2440" class="LineNr">2440 </span> 3d/compare-EAX-and 0x22/imm32/double-quote
<span id="L2441" class="LineNr">2441 </span> 74/jump-if-equal $skip-string-in-slice:break/disp8
<span id="L2442" class="LineNr">2442 </span><span class="Constant">$skip-string-in-slice:check-for-escape</span>:
<span id="L2443" class="LineNr">2443 </span> <span class="subxComment"># if (EAX == '\') escape next char</span>
<span id="L2444" class="LineNr">2444 </span> 3d/compare-EAX-and 0x5c/imm32/backslash
<span id="L2445" class="LineNr">2445 </span> 75/jump-if-not-equal $skip-string-in-slice:continue/disp8
<span id="L2446" class="LineNr">2446 </span><span class="Constant">$skip-string-in-slice:escape</span>:
<span id="L2447" class="LineNr">2447 </span> 41/increment-ECX
<span id="L2448" class="LineNr">2448 </span><span class="Constant">$skip-string-in-slice:continue</span>:
<span id="L2449" class="LineNr">2449 </span> <span class="subxComment"># ++curr</span>
<span id="L2450" class="LineNr">2450 </span> 41/increment-ECX
<span id="L2451" class="LineNr">2451 </span> eb/jump $skip-string-in-slice:loop/disp8
<span id="L2452" class="LineNr">2452 </span><span class="Constant">$skip-string-in-slice:break</span>:
<span id="L2453" class="LineNr">2453 </span> <span class="subxComment"># skip final dquote</span>
<span id="L2454" class="LineNr">2454 </span> 41/increment-ECX
<span id="L2455" class="LineNr">2455 </span><span class="Constant">$skip-string-in-slice:return-curr</span>:
<span id="L2456" class="LineNr">2456 </span> <span class="subxComment"># return curr</span>
<span id="L2457" class="LineNr">2457 </span> 89/copy 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ECX to EAX</span>
<span id="L2458" class="LineNr">2458 </span><span class="Constant">$skip-string-in-slice:end</span>:
<span id="L2459" class="LineNr">2459 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L2460" class="LineNr">2460 </span> 5b/pop-to-EBX
<span id="L2461" class="LineNr">2461 </span> 5a/pop-to-EDX
<span id="L2462" class="LineNr">2462 </span> 59/pop-to-ECX
<span id="L2463" class="LineNr">2463 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2464" class="LineNr">2464 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2465" class="LineNr">2465 </span> 5d/pop-to-EBP
<span id="L2466" class="LineNr">2466 </span> c3/return
<span id="L2467" class="LineNr">2467 </span>
<span id="L2468" class="LineNr">2468 </span><span class="subxTest">test-skip-string-in-slice</span>:
<span id="L2469" class="LineNr">2469 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2470" class="LineNr">2470 </span> 55/push-EBP
<span id="L2471" class="LineNr">2471 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2472" class="LineNr">2472 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;abc\&quot; def&quot;</span>
<span id="L2473" class="LineNr">2473 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2474" class="LineNr">2474 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2475" class="LineNr">2475 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2476" class="LineNr">2476 </span> 05/add-to-EAX 4/imm32
<span id="L2477" class="LineNr">2477 </span> <span class="subxComment"># EAX = skip-string-in-slice(EAX, ECX)</span>
<span id="L2478" class="LineNr">2478 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2479" class="LineNr">2479 </span> 51/push-ECX
<span id="L2480" class="LineNr">2480 </span> 50/push-EAX
<span id="L2481" class="LineNr">2481 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2482" class="LineNr">2482 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L2483" class="LineNr">2483 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2484" class="LineNr">2484 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2485" class="LineNr">2485 </span> <span class="subxComment"># check-ints-equal(ECX-EAX, 4, msg) # number of chars remaining after the string literal</span>
<span id="L2486" class="LineNr">2486 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2487" class="LineNr">2487 </span> 68/push <span class="Constant">&quot;F - test-skip-string-in-slice&quot;</span>/imm32
<span id="L2488" class="LineNr">2488 </span> 68/push 4/imm32
<span id="L2489" class="LineNr">2489 </span> <span class="subxS2Comment"># . . push ECX-EAX</span>
<span id="L2490" class="LineNr">2490 </span> 29/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># subtract EAX from ECX</span>
<span id="L2491" class="LineNr">2491 </span> 51/push-ECX
<span id="L2492" class="LineNr">2492 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2493" class="LineNr">2493 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2494" class="LineNr">2494 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2495" class="LineNr">2495 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2496" class="LineNr">2496 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2497" class="LineNr">2497 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2498" class="LineNr">2498 </span> 5d/pop-to-EBP
<span id="L2499" class="LineNr">2499 </span> c3/return
<span id="L2500" class="LineNr">2500 </span>
<span id="L2501" class="LineNr">2501 </span><span class="subxTest">test-skip-string-in-slice-ignores-spaces</span>:
<span id="L2502" class="LineNr">2502 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2503" class="LineNr">2503 </span> 55/push-EBP
<span id="L2504" class="LineNr">2504 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2505" class="LineNr">2505 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;a b\&quot;/yz&quot;</span>
<span id="L2506" class="LineNr">2506 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>a b\<span class="Constant">&quot;/yz&quot;</span>/imm32
<span id="L2507" class="LineNr">2507 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2508" class="LineNr">2508 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2509" class="LineNr">2509 </span> 05/add-to-EAX 4/imm32
<span id="L2510" class="LineNr">2510 </span> <span class="subxComment"># EAX = skip-string-in-slice(EAX, ECX)</span>
<span id="L2511" class="LineNr">2511 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2512" class="LineNr">2512 </span> 51/push-ECX
<span id="L2513" class="LineNr">2513 </span> 50/push-EAX
<span id="L2514" class="LineNr">2514 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2515" class="LineNr">2515 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L2516" class="LineNr">2516 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2517" class="LineNr">2517 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2518" class="LineNr">2518 </span> <span class="subxComment"># check-ints-equal(ECX-EAX, 3, msg) # number of chars remaining after the string literal</span>
<span id="L2519" class="LineNr">2519 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2520" class="LineNr">2520 </span> 68/push <span class="Constant">&quot;F - test-skip-string-in-slice-ignores-spaces&quot;</span>/imm32
<span id="L2521" class="LineNr">2521 </span> 68/push 3/imm32
<span id="L2522" class="LineNr">2522 </span> <span class="subxS2Comment"># . . push ECX-EAX</span>
<span id="L2523" class="LineNr">2523 </span> 29/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># subtract EAX from ECX</span>
<span id="L2524" class="LineNr">2524 </span> 51/push-ECX
<span id="L2525" class="LineNr">2525 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2526" class="LineNr">2526 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2527" class="LineNr">2527 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2528" class="LineNr">2528 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2529" class="LineNr">2529 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2530" class="LineNr">2530 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2531" class="LineNr">2531 </span> 5d/pop-to-EBP
<span id="L2532" class="LineNr">2532 </span> c3/return
<span id="L2533" class="LineNr">2533 </span>
<span id="L2534" class="LineNr">2534 </span><span class="subxTest">test-skip-string-in-slice-ignores-escapes</span>:
<span id="L2535" class="LineNr">2535 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2536" class="LineNr">2536 </span> 55/push-EBP
<span id="L2537" class="LineNr">2537 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2538" class="LineNr">2538 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;a\\\&quot;b\&quot;/yz&quot;</span>
<span id="L2539" class="LineNr">2539 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L2540" class="LineNr">2540 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2541" class="LineNr">2541 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2542" class="LineNr">2542 </span> 05/add-to-EAX 4/imm32
<span id="L2543" class="LineNr">2543 </span> <span class="subxComment"># EAX = skip-string-in-slice(EAX, ECX)</span>
<span id="L2544" class="LineNr">2544 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2545" class="LineNr">2545 </span> 51/push-ECX
<span id="L2546" class="LineNr">2546 </span> 50/push-EAX
<span id="L2547" class="LineNr">2547 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2548" class="LineNr">2548 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L2549" class="LineNr">2549 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2550" class="LineNr">2550 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2551" class="LineNr">2551 </span> <span class="subxComment"># check-ints-equal(ECX-EAX, 3, msg) # number of chars remaining after the string literal</span>
<span id="L2552" class="LineNr">2552 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2553" class="LineNr">2553 </span> 68/push <span class="Constant">&quot;F - test-skip-string-in-slice-ignores-escapes&quot;</span>/imm32
<span id="L2554" class="LineNr">2554 </span> 68/push 3/imm32
<span id="L2555" class="LineNr">2555 </span> <span class="subxS2Comment"># . . push ECX-EAX</span>
<span id="L2556" class="LineNr">2556 </span> 29/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># subtract EAX from ECX</span>
<span id="L2557" class="LineNr">2557 </span> 51/push-ECX
<span id="L2558" class="LineNr">2558 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2559" class="LineNr">2559 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2560" class="LineNr">2560 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2561" class="LineNr">2561 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2562" class="LineNr">2562 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2563" class="LineNr">2563 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2564" class="LineNr">2564 </span> 5d/pop-to-EBP
<span id="L2565" class="LineNr">2565 </span> c3/return
<span id="L2566" class="LineNr">2566 </span>
<span id="L2567" class="LineNr">2567 </span><span class="subxTest">test-skip-string-in-slice-stops-at-end</span>:
<span id="L2568" class="LineNr">2568 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2569" class="LineNr">2569 </span> 55/push-EBP
<span id="L2570" class="LineNr">2570 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2571" class="LineNr">2571 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;abc&quot; # unbalanced dquote</span>
<span id="L2572" class="LineNr">2572 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>abc&quot;/imm32
<span id="L2573" class="LineNr">2573 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2574" class="LineNr">2574 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2575" class="LineNr">2575 </span> 05/add-to-EAX 4/imm32
<span id="L2576" class="LineNr">2576 </span> <span class="subxComment"># EAX = skip-string-in-slice(EAX, ECX)</span>
<span id="L2577" class="LineNr">2577 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2578" class="LineNr">2578 </span> 51/push-ECX
<span id="L2579" class="LineNr">2579 </span> 50/push-EAX
<span id="L2580" class="LineNr">2580 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2581" class="LineNr">2581 </span> e8/call <a href='dquotes.subx.html#L2416'>skip-string-in-slice</a>/disp32
<span id="L2582" class="LineNr">2582 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2583" class="LineNr">2583 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2584" class="LineNr">2584 </span> <span class="subxComment"># check-ints-equal(ECX-EAX, 0, msg) # skipped to end of slice</span>
<span id="L2585" class="LineNr">2585 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2586" class="LineNr">2586 </span> 68/push <span class="Constant">&quot;F - test-skip-string-in-slice-stops-at-end&quot;</span>/imm32
<span id="L2587" class="LineNr">2587 </span> 68/push 0/imm32
<span id="L2588" class="LineNr">2588 </span> <span class="subxS2Comment"># . . push ECX-EAX</span>
<span id="L2589" class="LineNr">2589 </span> 29/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># subtract EAX from ECX</span>
<span id="L2590" class="LineNr">2590 </span> 51/push-ECX
<span id="L2591" class="LineNr">2591 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2592" class="LineNr">2592 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2593" class="LineNr">2593 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2594" class="LineNr">2594 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2595" class="LineNr">2595 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2596" class="LineNr">2596 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2597" class="LineNr">2597 </span> 5d/pop-to-EBP
<span id="L2598" class="LineNr">2598 </span> c3/return
<span id="L2599" class="LineNr">2599 </span>
<span id="L2600" class="LineNr">2600 </span><span class="subxFunction">string-length-at-start-of-slice</span>: <span class="subxComment"># curr : (address byte), end : (address byte) -&gt; length/EAX</span>
<span id="L2601" class="LineNr">2601 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2602" class="LineNr">2602 </span> 55/push-EBP
<span id="L2603" class="LineNr">2603 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2604" class="LineNr">2604 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L2605" class="LineNr">2605 </span> 51/push-ECX
<span id="L2606" class="LineNr">2606 </span> 52/push-EDX
<span id="L2607" class="LineNr">2607 </span> 53/push-EBX
<span id="L2608" class="LineNr">2608 </span> <span class="subxComment"># ECX = curr</span>
<span id="L2609" class="LineNr">2609 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
<span id="L2610" class="LineNr">2610 </span> <span class="subxComment"># EDX = end</span>
<span id="L2611" class="LineNr">2611 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDX</span>
<span id="L2612" class="LineNr">2612 </span> <span class="subxComment"># length/EAX = 0</span>
<span id="L2613" class="LineNr">2613 </span> 31/xor 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EAX</span>
<span id="L2614" class="LineNr">2614 </span> <span class="subxComment"># EBX = 0</span>
<span id="L2615" class="LineNr">2615 </span> 31/xor 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EBX</span>
<span id="L2616" class="LineNr">2616 </span> <span class="subxComment"># skip initial dquote</span>
<span id="L2617" class="LineNr">2617 </span> 41/increment-ECX
<span id="L2618" class="LineNr">2618 </span><span class="Constant">$string-length-at-start-of-slice:loop</span>:
<span id="L2619" class="LineNr">2619 </span> <span class="subxComment"># if (curr &gt;= end) return length</span>
<span id="L2620" class="LineNr">2620 </span> 39/compare 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ECX with EDX</span>
<span id="L2621" class="LineNr">2621 </span> 73/jump-if-greater-unsigned-or-equal $string-length-at-start-of-slice:end/disp8
<span id="L2622" class="LineNr">2622 </span> <span class="subxComment"># BL = *curr</span>
<span id="L2623" class="LineNr">2623 </span> 8a/copy-byte 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/BL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *ECX to BL</span>
<span id="L2624" class="LineNr">2624 </span><span class="Constant">$string-length-at-start-of-slice:dquote</span>:
<span id="L2625" class="LineNr">2625 </span> <span class="subxComment"># if (EBX == '&quot;') break</span>
<span id="L2626" class="LineNr">2626 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x22/imm32/dquote <span class="subxComment"># compare EBX</span>
<span id="L2627" class="LineNr">2627 </span> 74/jump-if-equal $string-length-at-start-of-slice:end/disp8
<span id="L2628" class="LineNr">2628 </span><span class="Constant">$string-length-at-start-of-slice:check-for-escape</span>:
<span id="L2629" class="LineNr">2629 </span> <span class="subxComment"># if (EBX == '\') escape next char</span>
<span id="L2630" class="LineNr">2630 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x5c/imm32/backslash <span class="subxComment"># compare EBX</span>
<span id="L2631" class="LineNr">2631 </span> 75/jump-if-not-equal $string-length-at-start-of-slice:continue/disp8
<span id="L2632" class="LineNr">2632 </span><span class="Constant">$string-length-at-start-of-slice:escape</span>:
<span id="L2633" class="LineNr">2633 </span> <span class="subxComment"># increment curr but not result</span>
<span id="L2634" class="LineNr">2634 </span> 41/increment-ECX
<span id="L2635" class="LineNr">2635 </span><span class="Constant">$string-length-at-start-of-slice:continue</span>:
<span id="L2636" class="LineNr">2636 </span> <span class="subxComment"># ++result</span>
<span id="L2637" class="LineNr">2637 </span> 40/increment-EAX
<span id="L2638" class="LineNr">2638 </span> <span class="subxComment"># ++curr</span>
<span id="L2639" class="LineNr">2639 </span> 41/increment-ECX
<span id="L2640" class="LineNr">2640 </span> eb/jump $string-length-at-start-of-slice:loop/disp8
<span id="L2641" class="LineNr">2641 </span><span class="Constant">$string-length-at-start-of-slice:end</span>:
<span id="L2642" class="LineNr">2642 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L2643" class="LineNr">2643 </span> 5b/pop-to-EBX
<span id="L2644" class="LineNr">2644 </span> 5a/pop-to-EDX
<span id="L2645" class="LineNr">2645 </span> 59/pop-to-ECX
<span id="L2646" class="LineNr">2646 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2647" class="LineNr">2647 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2648" class="LineNr">2648 </span> 5d/pop-to-EBP
<span id="L2649" class="LineNr">2649 </span> c3/return
<span id="L2650" class="LineNr">2650 </span>
<span id="L2651" class="LineNr">2651 </span><span class="subxTest">test-string-length-at-start-of-slice</span>:
<span id="L2652" class="LineNr">2652 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2653" class="LineNr">2653 </span> 55/push-EBP
<span id="L2654" class="LineNr">2654 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2655" class="LineNr">2655 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;abc\&quot; def&quot;</span>
<span id="L2656" class="LineNr">2656 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2657" class="LineNr">2657 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2658" class="LineNr">2658 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2659" class="LineNr">2659 </span> 05/add-to-EAX 4/imm32
<span id="L2660" class="LineNr">2660 </span> <span class="subxComment"># EAX = string-length-at-start-of-slice(EAX, ECX)</span>
<span id="L2661" class="LineNr">2661 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2662" class="LineNr">2662 </span> 51/push-ECX
<span id="L2663" class="LineNr">2663 </span> 50/push-EAX
<span id="L2664" class="LineNr">2664 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2665" class="LineNr">2665 </span> e8/call <a href='dquotes.subx.html#L2600'>string-length-at-start-of-slice</a>/disp32
<span id="L2666" class="LineNr">2666 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2667" class="LineNr">2667 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2668" class="LineNr">2668 </span> <span class="subxComment"># check-ints-equal(EAX, 3, msg)</span>
<span id="L2669" class="LineNr">2669 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2670" class="LineNr">2670 </span> 68/push <span class="Constant">&quot;F - test-string-length-at-start-of-slice&quot;</span>/imm32
<span id="L2671" class="LineNr">2671 </span> 68/push 3/imm32
<span id="L2672" class="LineNr">2672 </span> 50/push-EAX
<span id="L2673" class="LineNr">2673 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2674" class="LineNr">2674 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2675" class="LineNr">2675 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2676" class="LineNr">2676 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2677" class="LineNr">2677 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2678" class="LineNr">2678 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2679" class="LineNr">2679 </span> 5d/pop-to-EBP
<span id="L2680" class="LineNr">2680 </span> c3/return
<span id="L2681" class="LineNr">2681 </span>
<span id="L2682" class="LineNr">2682 </span><span class="subxTest">test-string-length-at-start-of-slice-escaped</span>:
<span id="L2683" class="LineNr">2683 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L2684" class="LineNr">2684 </span> 55/push-EBP
<span id="L2685" class="LineNr">2685 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L2686" class="LineNr">2686 </span> <span class="subxComment"># setup: (EAX..ECX) = &quot;\&quot;ab\\c\&quot; def&quot;</span>
<span id="L2687" class="LineNr">2687 </span> b8/copy-to-EAX <span class="Constant">&quot;\&quot;</span>ab\\c\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L2688" class="LineNr">2688 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ECX</span>
<span id="L2689" class="LineNr">2689 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX+ECX+4 to ECX</span>
<span id="L2690" class="LineNr">2690 </span> 05/add-to-EAX 4/imm32
<span id="L2691" class="LineNr">2691 </span> <span class="subxComment"># EAX = string-length-at-start-of-slice(EAX, ECX)</span>
<span id="L2692" class="LineNr">2692 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2693" class="LineNr">2693 </span> 51/push-ECX
<span id="L2694" class="LineNr">2694 </span> 50/push-EAX
<span id="L2695" class="LineNr">2695 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2696" class="LineNr">2696 </span> e8/call <a href='dquotes.subx.html#L2600'>string-length-at-start-of-slice</a>/disp32
<span id="L2697" class="LineNr">2697 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2698" class="LineNr">2698 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2699" class="LineNr">2699 </span> <span class="subxComment"># check-ints-equal(EAX, 3, msg)</span>
<span id="L2700" class="LineNr">2700 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L2701" class="LineNr">2701 </span> 68/push <span class="Constant">&quot;F - test-string-length-at-start-of-slice-escaped&quot;</span>/imm32
<span id="L2702" class="LineNr">2702 </span> 68/push 3/imm32
<span id="L2703" class="LineNr">2703 </span> 50/push-EAX
<span id="L2704" class="LineNr">2704 </span> <span class="subxS2Comment"># . . call</span>
<span id="L2705" class="LineNr">2705 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L2706" class="LineNr">2706 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L2707" class="LineNr">2707 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L2708" class="LineNr">2708 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L2709" class="LineNr">2709 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L2710" class="LineNr">2710 </span> 5d/pop-to-EBP
<span id="L2711" class="LineNr">2711 </span> c3/return
<span id="L2712" class="LineNr">2712 </span>
<span id="L2713" class="LineNr">2713 </span>== data
<span id="L2714" class="LineNr">2714 </span>
<span id="L2715" class="LineNr">2715 </span><span class="SpecialChar">Next-string-literal</span>: <span class="subxComment"># tracks the next auto-generated variable name</span>
<span id="L2716" class="LineNr">2716 </span> 1/imm32
<span id="L2717" class="LineNr">2717 </span>
<span id="L2718" class="LineNr">2718 </span><span class="subxComment"># length-prefixed string containing just a single space</span>
<span id="L2719" class="LineNr">2719 </span><span class="SpecialChar">Space</span>:
<span id="L2720" class="LineNr">2720 </span> <span class="subxComment"># size</span>
<span id="L2721" class="LineNr">2721 </span> 1/imm32
<span id="L2722" class="LineNr">2722 </span> <span class="subxComment"># data</span>
<span id="L2723" class="LineNr">2723 </span> 20/space
<span id="L2724" class="LineNr">2724 </span>
<span id="L2725" class="LineNr">2725 </span><span class="subxComment"># length-prefixed string containing just a single slash</span>
<span id="L2726" class="LineNr">2726 </span><span class="SpecialChar">Slash</span>:
<span id="L2727" class="LineNr">2727 </span> <span class="subxComment"># size</span>
<span id="L2728" class="LineNr">2728 </span> 1/imm32
<span id="L2729" class="LineNr">2729 </span> <span class="subxComment"># data</span>
<span id="L2730" class="LineNr">2730 </span> 2f/slash
<span id="L2731" class="LineNr">2731 </span>
<span id="L2732" class="LineNr">2732 </span><span class="subxMinorFunction">_test-slice-abc</span>:
<span id="L2733" class="LineNr">2733 </span> 22/dquote 61/a 62/b 63/c 22/dquote <span class="subxComment"># &quot;abc&quot;</span>
<span id="L2734" class="LineNr">2734 </span> 2f/slash 64/d
<span id="L2735" class="LineNr">2735 </span><span class="subxMinorFunction">_test-slice-abc-limit</span>:
<span id="L2736" class="LineNr">2736 </span>
<span id="L2737" class="LineNr">2737 </span><span class="subxMinorFunction">_test-slice-a-space-b</span>:
<span id="L2738" class="LineNr">2738 </span> 22/dquote 61/a 20/space 62/b 22/dquote <span class="subxComment"># &quot;a b&quot;</span>
<span id="L2739" class="LineNr">2739 </span><span class="subxMinorFunction">_test-slice-a-space-b-limit</span>:
<span id="L2740" class="LineNr">2740 </span>
<span id="L2741" class="LineNr">2741 </span><span class="subxMinorFunction">_test-slice-a-dquote-b</span>:
<span id="L2742" class="LineNr">2742 </span> 22/dquote 61/a 5c/backslash 22/dquote 62/b 22/dquote <span class="subxComment"># &quot;a\&quot;b&quot;</span>
<span id="L2743" class="LineNr">2743 </span><span class="subxMinorFunction">_test-slice-a-dquote-b-limit</span>:
<span id="L2744" class="LineNr">2744 </span>
<span id="L2745" class="LineNr">2745 </span><span class="subxMinorFunction">_test-slice-a-newline-b</span>:
<span id="L2746" class="LineNr">2746 </span> 22/dquote 61/a 5c/backslash 6e/n 62/b 22/dquote <span class="subxComment"># &quot;a\nb&quot;</span>
<span id="L2747" class="LineNr">2747 </span><span class="subxMinorFunction">_test-slice-a-newline-b-limit</span>:
<span id="L2748" class="LineNr">2748 </span>
<span id="L2749" class="LineNr">2749 </span><span class="subxComment"># &quot;abc/def&quot;/ghi</span>
<span id="L2750" class="LineNr">2750 </span><span class="subxMinorFunction">_test-slice-literal-string</span>:
<span id="L2751" class="LineNr">2751 </span> 22/dquote
<span id="L2752" class="LineNr">2752 </span> 61/a 62/b 63/c <span class="subxComment"># abc</span>
<span id="L2753" class="LineNr">2753 </span> 2f/slash 64/d 65/e 66/f <span class="subxComment"># /def</span>
<span id="L2754" class="LineNr">2754 </span> 22/dquote
<span id="L2755" class="LineNr">2755 </span> 2f/slash 67/g 68/h 69/i <span class="subxComment"># /ghi</span>
<span id="L2756" class="LineNr">2756 </span><span class="subxMinorFunction">_test-slice-literal-string-with-limit</span>:
<span id="L2757" class="LineNr">2757 </span>
<span id="L2758" class="LineNr">2758 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L2318" class="LineNr">2318 </span><span class="subxMinorFunction">_test-slice-a-newline-b</span>:
<span id="L2319" class="LineNr">2319 </span> 22/dquote 61/a 5c/backslash 6e/n 62/b 22/dquote <span class="subxComment"># &quot;a\nb&quot;</span>
<span id="L2320" class="LineNr">2320 </span><span class="subxMinorFunction">_test-slice-a-newline-b-limit</span>:
<span id="L2321" class="LineNr">2321 </span>
<span id="L2322" class="LineNr">2322 </span><span class="subxComment"># &quot;abc/def&quot;/ghi</span>
<span id="L2323" class="LineNr">2323 </span><span class="subxMinorFunction">_test-slice-literal-string</span>:
<span id="L2324" class="LineNr">2324 </span> 22/dquote
<span id="L2325" class="LineNr">2325 </span> 61/a 62/b 63/c <span class="subxComment"># abc</span>
<span id="L2326" class="LineNr">2326 </span> 2f/slash 64/d 65/e 66/f <span class="subxComment"># /def</span>
<span id="L2327" class="LineNr">2327 </span> 22/dquote
<span id="L2328" class="LineNr">2328 </span> 2f/slash 67/g 68/h 69/i <span class="subxComment"># /ghi</span>
<span id="L2329" class="LineNr">2329 </span><span class="subxMinorFunction">_test-slice-literal-string-with-limit</span>:
<span id="L2330" class="LineNr">2330 </span>
<span id="L2331" class="LineNr">2331 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -62,7 +62,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="subxComment">## compute the factorial of 5, and return the result in the exit code</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate apps/factorial.subx -o apps/factorial</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/factorial.subx -o apps/factorial</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run apps/factorial</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Expected result:</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ echo $?</span>

View File

@ -76,7 +76,7 @@ if ('onhashchange' in window) {
<span id="L13" class="LineNr"> 13 </span><span class="subxComment"># offset 4: address</span>
<span id="L14" class="LineNr"> 14 </span><span class="subxComment">#</span>
<span id="L15" class="LineNr"> 15 </span><span class="subxComment"># To run:</span>
<span id="L16" class="LineNr"> 16 </span><span class="subxComment"># $ ./subx translate *.subx apps/handle.subx -o apps/handle</span>
<span id="L16" class="LineNr"> 16 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/handle.subx -o apps/handle</span>
<span id="L17" class="LineNr"> 17 </span><span class="subxComment"># $ ./subx run apps/handle</span>
<span id="L18" class="LineNr"> 18 </span><span class="subxComment"># Expected result is a successful lookup followed by a hard abort:</span>
<span id="L19" class="LineNr"> 19 </span><span class="subxComment"># lookup succeeded</span>

View File

@ -64,7 +64,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># comments between '#' and newline.</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment">#</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># To run:</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate *.subx apps/hex.subx -o apps/hex</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/hex.subx -o apps/hex</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ echo '80 81 82 # comment' |./subx run apps/hex |xxd -</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># Expected output:</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># 00000000: 8081 82</span>

View File

@ -65,7 +65,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># uses are left untouched.</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment">#</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># To run:</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate *.subx apps/pack.subx -o apps/pack</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/pack.subx -o apps/pack</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ echo '05/add-to-EAX 0x20/imm32' |./subx run apps/pack</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># Expected output:</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># 05 20 00 00 00 # 05/add-to-EAX 0x20/imm32</span>

File diff suppressed because it is too large Load Diff

View File

@ -68,7 +68,7 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># b) add segment headers with addresses and offsets correctly filled in</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment">#</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># To build:</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># $ ./subx translate *.subx apps/survey.subx -o apps/survey</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/survey.subx -o apps/survey</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment">#</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># The expected input is a stream of bytes with segment headers, comments and</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxComment"># some interspersed labels.</span>

View File

@ -60,283 +60,286 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Generate code for a new function called 'run-tests' which calls in sequence</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment"># all functions starting with 'test-'.</span>
<span id="L3" class="LineNr"> 3 </span>
<span id="L4" class="LineNr"> 4 </span>== code
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># instruction effective address register displacement immediate</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxS1Comment"># . 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</span>
<span id="L8" class="LineNr"> 8 </span>
<span id="L9" class="LineNr"> 9 </span><span class="SpecialChar">Entry</span>:
<span id="L10" class="LineNr"> 10 </span> <span class="subxComment"># Heap = new-segment(Heap-size)</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L12" class="LineNr"> 12 </span> 68/push <span class="SpecialChar"><a href='../075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L13" class="LineNr"> 13 </span> 68/push <span class="SpecialChar">Heap-size</span>/imm32
<span id="L14" class="LineNr"> 14 </span> <span class="subxS2Comment"># . . call</span>
<span id="L15" class="LineNr"> 15 </span> e8/call <a href='../053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L16" class="LineNr"> 16 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L17" class="LineNr"> 17 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># initialize-trace-stream(256KB)</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L20" class="LineNr"> 20 </span> 68/push 0x40000/imm32/256KB
<span id="L21" class="LineNr"> 21 </span> <span class="subxS2Comment"># . . call</span>
<span id="L22" class="LineNr"> 22 </span> e8/call <a href='../056trace.subx.html#L44'>initialize-trace-stream</a>/disp32
<span id="L23" class="LineNr"> 23 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L24" class="LineNr"> 24 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L25" class="LineNr"> 25 </span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># run tests if necessary, convert stdin if not</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L28" class="LineNr"> 28 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># initialize heap</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxH1Comment"># - if argc &gt; 1 and argv[1] == &quot;test&quot;, then return run_tests()</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxS1Comment"># . argc &gt; 1</span>
<span id="L32" class="LineNr"> 32 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/disp8 1/imm32 <span class="subxComment"># compare *EBP</span>
<span id="L33" class="LineNr"> 33 </span> 7e/jump-if-lesser-or-equal $run-main/disp8
<span id="L34" class="LineNr"> 34 </span> <span class="subxS1Comment"># . argv[1] == &quot;test&quot;</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L36" class="LineNr"> 36 </span> 68/push <span class="Constant">&quot;test&quot;</span>/imm32
<span id="L37" class="LineNr"> 37 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxS2Comment"># . . call</span>
<span id="L39" class="LineNr"> 39 </span> e8/call <a href='../052kernel-string-equal.subx.html#L31'>kernel-string-equal?</a>/disp32
<span id="L40" class="LineNr"> 40 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L41" class="LineNr"> 41 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L42" class="LineNr"> 42 </span> <span class="subxS1Comment"># . check result</span>
<span id="L43" class="LineNr"> 43 </span> 3d/compare-EAX-and 1/imm32
<span id="L44" class="LineNr"> 44 </span> 75/jump-if-not-equal $run-main/disp8
<span id="L45" class="LineNr"> 45 </span> <span class="subxS1Comment"># . run-tests()</span>
<span id="L46" class="LineNr"> 46 </span> e8/call run-tests/disp32
<span id="L47" class="LineNr"> 47 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="SpecialChar"><a href='../051test.subx.html#L90'>Num-test-failures</a></span>/disp32 <span class="subxComment"># copy *Num-test-failures to EBX</span>
<span id="L48" class="LineNr"> 48 </span> eb/jump $main:end/disp8
<span id="L49" class="LineNr"> 49 </span><span class="Constant">$run-main</span>:
<span id="L50" class="LineNr"> 50 </span> <span class="subxH1Comment"># - otherwise convert stdin</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># convert(Stdin, Stdout)</span>
<span id="L52" class="LineNr"> 52 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L53" class="LineNr"> 53 </span> 68/push <span class="SpecialChar"><a href='../064write-byte.subx.html#L10'>Stdout</a></span>/imm32
<span id="L54" class="LineNr"> 54 </span> 68/push <span class="SpecialChar"><a href='../061read-byte.subx.html#L14'>Stdin</a></span>/imm32
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . call</span>
<span id="L56" class="LineNr"> 56 </span> e8/call <a href='tests.subx.html#L65'>convert</a>/disp32
<span id="L57" class="LineNr"> 57 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L58" class="LineNr"> 58 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxS1Comment"># . syscall(exit, 0)</span>
<span id="L60" class="LineNr"> 60 </span> bb/copy-to-EBX 0/imm32
<span id="L61" class="LineNr"> 61 </span><span class="Constant">$main:end</span>:
<span id="L62" class="LineNr"> 62 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L63" class="LineNr"> 63 </span> cd/syscall 0x80/imm8
<span id="L64" class="LineNr"> 64 </span>
<span id="L65" class="LineNr"> 65 </span><span class="subxFunction">convert</span>: <span class="subxComment"># in : (address buffered-file), out : (address buffered-file) -&gt; &lt;void&gt;</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># pseudocode</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># bool tests-found = false</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># var line = new-stream(512, 1)</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># var new-code-segment = new-stream(Segment-size, 1)</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># write(new-code-segment, &quot;\n==code\n&quot;)</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># write(new-code-segment, &quot;run-tests:\n&quot;)</span>
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># while true</span>
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># clear-stream(line)</span>
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># read-line-buffered(in, line)</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># if (line-&gt;write == 0) break # end of file</span>
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># var word-slice = next-word(line)</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># if is-label?(word-slice)</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># if slice-starts-with?(word-slice, &quot;test-&quot;)</span>
<span id="L79" class="LineNr"> 79 </span> <span class="subxComment"># tests-found = true</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># write(new-code-segment, &quot; e8/call &quot;)</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># write-slice(new-code-segment, word-slice)</span>
<span id="L82" class="LineNr"> 82 </span> <span class="subxComment"># write(new-code-segment, &quot;/disp32\n&quot;)</span>
<span id="L83" class="LineNr"> 83 </span> <span class="subxComment"># rewind-stream(line)</span>
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># write-stream-data(out, line)</span>
<span id="L85" class="LineNr"> 85 </span> <span class="subxComment"># if tests-found</span>
<span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># write(new-code-segment, &quot; c3/return\n&quot;)</span>
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># write-stream-data(out, new-code-segment)</span>
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># flush(out)</span>
<span id="L89" class="LineNr"> 89 </span> <span class="subxComment">#</span>
<span id="L90" class="LineNr"> 90 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L91" class="LineNr"> 91 </span> 55/push-EBP
<span id="L92" class="LineNr"> 92 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L94" class="LineNr"> 94 </span> 50/push-EAX
<span id="L95" class="LineNr"> 95 </span> 51/push-ECX
<span id="L96" class="LineNr"> 96 </span> 52/push-EDX
<span id="L97" class="LineNr"> 97 </span> 53/push-EBX
<span id="L98" class="LineNr"> 98 </span> 57/push-EDI
<span id="L99" class="LineNr"> 99 </span> <span class="subxComment"># var line/ECX : (address stream byte) = stream(512)</span>
<span id="L100" class="LineNr">100 </span> 81 5/subop/subtract 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x200/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L101" class="LineNr">101 </span> 68/push 0x200/imm32/length
<span id="L102" class="LineNr">102 </span> 68/push 0/imm32/read
<span id="L103" class="LineNr">103 </span> 68/push 0/imm32/write
<span id="L104" class="LineNr">104 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L105" class="LineNr">105 </span> <span class="subxComment"># var word-slice/EDX = {0, 0}</span>
<span id="L106" class="LineNr">106 </span> 68/push 0/imm32/end
<span id="L107" class="LineNr">107 </span> 68/push 0/imm32/start
<span id="L108" class="LineNr">108 </span> 89/copy 3/mod/direct 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EDX</span>
<span id="L109" class="LineNr">109 </span> <span class="subxComment"># tests-found?/EBX = false</span>
<span id="L110" class="LineNr">110 </span> 31/xor 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EBX</span>
<span id="L111" class="LineNr">111 </span> <span class="subxComment"># new-code-segment/EDI = new-stream(Heap, Segment-size, 1)</span>
<span id="L112" class="LineNr">112 </span> <span class="subxS1Comment"># . EAX = new-stream(Heap, Segment-size, 1)</span>
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L114" class="LineNr">114 </span> 68/push 1/imm32
<span id="L115" class="LineNr">115 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar">Segment-size</span>/disp32 <span class="subxComment"># push *Segment-size</span>
<span id="L116" class="LineNr">116 </span> 68/push <span class="SpecialChar"><a href='../075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L117" class="LineNr">117 </span> <span class="subxS2Comment"># . . call</span>
<span id="L118" class="LineNr">118 </span> e8/call <a href='../070new-stream.subx.html#L8'>new-stream</a>/disp32
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L120" class="LineNr">120 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L121" class="LineNr">121 </span> <span class="subxS1Comment"># . EDI = EAX</span>
<span id="L122" class="LineNr">122 </span> 89/copy 3/mod/direct 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to EDI</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># write(new-code-segment, &quot;\n== code\n&quot;)</span>
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L125" class="LineNr">125 </span> 68/push <span class="Constant">&quot;\n== code\n&quot;</span>/imm32
<span id="L126" class="LineNr">126 </span> 57/push-EDI
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . call</span>
<span id="L128" class="LineNr">128 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L130" class="LineNr">130 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L131" class="LineNr">131 </span> <span class="subxComment"># write(new-code-segment, &quot;run-tests:\n&quot;)</span>
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L133" class="LineNr">133 </span> 68/push <span class="Constant">&quot;run-tests:\n&quot;</span>/imm32
<span id="L134" class="LineNr">134 </span> 57/push-EDI
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . call</span>
<span id="L136" class="LineNr">136 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L138" class="LineNr">138 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L139" class="LineNr">139 </span><span class="Constant">$convert:loop</span>:
<span id="L140" class="LineNr">140 </span> <span class="subxComment"># clear-stream(line)</span>
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L142" class="LineNr">142 </span> 51/push-ECX
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . call</span>
<span id="L144" class="LineNr">144 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L146" class="LineNr">146 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L147" class="LineNr">147 </span> <span class="subxComment"># read-line-buffered(in, line)</span>
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L149" class="LineNr">149 </span> 51/push-ECX
<span id="L150" class="LineNr">150 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L151" class="LineNr">151 </span> <span class="subxS2Comment"># . . call</span>
<span id="L152" class="LineNr">152 </span> e8/call <a href='../071read-line.subx.html#L9'>read-line-buffered</a>/disp32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L154" class="LineNr">154 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L155" class="LineNr">155 </span><span class="Constant">$convert:check0</span>:
<span id="L156" class="LineNr">156 </span> <span class="subxComment"># if (line-&gt;write == 0) break</span>
<span id="L157" class="LineNr">157 </span> 81 7/subop/compare 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *ECX</span>
<span id="L158" class="LineNr">158 </span> 0f 84/jump-if-equal $convert:break/disp32
<span id="L159" class="LineNr">159 </span> <span class="subxComment"># next-word(line, word-slice)</span>
<span id="L160" class="LineNr">160 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L161" class="LineNr">161 </span> 52/push-EDX
<span id="L162" class="LineNr">162 </span> 51/push-ECX
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . call</span>
<span id="L164" class="LineNr">164 </span> e8/call next-word/disp32
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L166" class="LineNr">166 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L167" class="LineNr">167 </span><span class="Constant">$convert:check-for-label</span>:
<span id="L168" class="LineNr">168 </span> <span class="subxComment"># if (!is-label?(word-slice)) continue</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS1Comment"># . EAX = is-label?(word-slice)</span>
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L171" class="LineNr">171 </span> 52/push-EDX
<span id="L172" class="LineNr">172 </span> <span class="subxS2Comment"># . . call</span>
<span id="L173" class="LineNr">173 </span> e8/call is-label?/disp32
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L175" class="LineNr">175 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L176" class="LineNr">176 </span> <span class="subxS1Comment"># . if (EAX == 0) continue</span>
<span id="L177" class="LineNr">177 </span> 3d/compare-EAX-and 0/imm32
<span id="L178" class="LineNr">178 </span> 74/jump-if-equal $convert:continue/disp8
<span id="L179" class="LineNr">179 </span><span class="Constant">$convert:check-label-prefix</span>:
<span id="L180" class="LineNr">180 </span> <span class="subxComment"># strip trailing ':' from word-slice</span>
<span id="L181" class="LineNr">181 </span> ff 1/subop/decrement 1/mod/*+disp8 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># decrement *(EDX+4)</span>
<span id="L182" class="LineNr">182 </span> <span class="subxComment"># if !slice-starts-with?(word-slice, &quot;test-&quot;) continue</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> 68/push <span class="Constant">&quot;test-&quot;</span>/imm32
<span id="L185" class="LineNr">185 </span> 52/push-EDX
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . call</span>
<span id="L187" class="LineNr">187 </span> e8/call <a href='../072slice.subx.html#L457'>slice-starts-with?</a>/disp32
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L189" class="LineNr">189 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L190" class="LineNr">190 </span> <span class="subxS1Comment"># . if (EAX == 0) break</span>
<span id="L191" class="LineNr">191 </span> 3d/compare-EAX-and 0/imm32
<span id="L192" class="LineNr">192 </span> 74/jump-if-equal $convert:continue/disp8
<span id="L193" class="LineNr">193 </span><span class="Constant">$convert:call-test-function</span>:
<span id="L194" class="LineNr">194 </span> <span class="subxComment"># tests-found? = true</span>
<span id="L195" class="LineNr">195 </span> bb/copy-to-EBX 1/imm32/true
<span id="L196" class="LineNr">196 </span> <span class="subxComment"># write(new-code-segment, &quot; e8/call &quot;)</span>
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L198" class="LineNr">198 </span> 68/push <span class="Constant">&quot; e8/call &quot;</span>/imm32
<span id="L199" class="LineNr">199 </span> 57/push-EDI
<span id="L200" class="LineNr">200 </span> <span class="subxS2Comment"># . . call</span>
<span id="L201" class="LineNr">201 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L203" class="LineNr">203 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L204" class="LineNr">204 </span> <span class="subxComment"># write-slice(new-code-segment, word-slice)</span>
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L206" class="LineNr">206 </span> 52/push-EDX
<span id="L207" class="LineNr">207 </span> 57/push-EDI
<span id="L208" class="LineNr">208 </span> <span class="subxS2Comment"># . . call</span>
<span id="L209" class="LineNr">209 </span> e8/call <a href='../072slice.subx.html#L762'>write-slice</a>/disp32
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L211" class="LineNr">211 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L212" class="LineNr">212 </span> <span class="subxComment"># write(new-code-segment, &quot;/disp32\n&quot;)</span>
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L214" class="LineNr">214 </span> 68/push <span class="Constant">&quot;/disp32\n&quot;</span>/imm32
<span id="L215" class="LineNr">215 </span> 57/push-EDI
<span id="L216" class="LineNr">216 </span> <span class="subxS2Comment"># . . call</span>
<span id="L217" class="LineNr">217 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L218" class="LineNr">218 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L219" class="LineNr">219 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L220" class="LineNr">220 </span><span class="Constant">$convert:continue</span>:
<span id="L221" class="LineNr">221 </span> <span class="subxComment"># rewind-stream(line)</span>
<span id="L222" class="LineNr">222 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L223" class="LineNr">223 </span> 51/push-ECX
<span id="L224" class="LineNr">224 </span> <span class="subxS2Comment"># . . call</span>
<span id="L225" class="LineNr">225 </span> e8/call <a href='../055stream.subx.html#L55'>rewind-stream</a>/disp32
<span id="L226" class="LineNr">226 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L227" class="LineNr">227 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L228" class="LineNr">228 </span> <span class="subxComment"># write-stream-data(out, line)</span>
<span id="L229" class="LineNr">229 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L230" class="LineNr">230 </span> 51/push-ECX
<span id="L231" class="LineNr">231 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS2Comment"># . . call</span>
<span id="L233" class="LineNr">233 </span> e8/call write-stream-data/disp32
<span id="L234" class="LineNr">234 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L235" class="LineNr">235 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L236" class="LineNr">236 </span> <span class="subxComment"># loop</span>
<span id="L237" class="LineNr">237 </span> e9/jump $convert:loop/disp32
<span id="L238" class="LineNr">238 </span><span class="Constant">$convert:break</span>:
<span id="L239" class="LineNr">239 </span> <span class="subxComment"># if (!tests-found?) goto end</span>
<span id="L240" class="LineNr">240 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare EBX</span>
<span id="L241" class="LineNr">241 </span> 74/jump-if-equal $convert:end/disp8
<span id="L242" class="LineNr">242 </span> <span class="subxComment"># write(new-code-segment, &quot; c3/return\n&quot;)</span>
<span id="L243" class="LineNr">243 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L244" class="LineNr">244 </span> 68/push <span class="Constant">&quot; c3/return\n&quot;</span>/imm32
<span id="L245" class="LineNr">245 </span> 57/push-EDI
<span id="L246" class="LineNr">246 </span> <span class="subxS2Comment"># . . call</span>
<span id="L247" class="LineNr">247 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L248" class="LineNr">248 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L249" class="LineNr">249 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L250" class="LineNr">250 </span> <span class="subxComment"># write-stream-data(out, new-code-segment)</span>
<span id="L251" class="LineNr">251 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L252" class="LineNr">252 </span> 57/push-EDI
<span id="L253" class="LineNr">253 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L254" class="LineNr">254 </span> <span class="subxS2Comment"># . . call</span>
<span id="L255" class="LineNr">255 </span> e8/call write-stream-data/disp32
<span id="L256" class="LineNr">256 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L257" class="LineNr">257 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L258" class="LineNr">258 </span><span class="Constant">$convert:end</span>:
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># flush(out)</span>
<span id="L260" class="LineNr">260 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L261" class="LineNr">261 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L262" class="LineNr">262 </span> <span class="subxS2Comment"># . . call</span>
<span id="L263" class="LineNr">263 </span> e8/call <a href='../064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L264" class="LineNr">264 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L265" class="LineNr">265 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L266" class="LineNr">266 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L267" class="LineNr">267 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x214/imm32 <span class="subxComment"># add to ESP</span>
<span id="L268" class="LineNr">268 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L269" class="LineNr">269 </span> 5f/pop-to-EDI
<span id="L270" class="LineNr">270 </span> 5b/pop-to-EBX
<span id="L271" class="LineNr">271 </span> 5a/pop-to-EDX
<span id="L272" class="LineNr">272 </span> 59/pop-to-ECX
<span id="L273" class="LineNr">273 </span> 58/pop-to-EAX
<span id="L274" class="LineNr">274 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L275" class="LineNr">275 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L276" class="LineNr">276 </span> 5d/pop-to-EBP
<span id="L277" class="LineNr">277 </span> c3/return
<span id="L278" class="LineNr">278 </span>
<span id="L279" class="LineNr">279 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment">#</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To build:</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx translate 0*.subx apps/subx-common.subx apps/tests.subx -o apps/tests</span>
<span id="L6" class="LineNr"> 6 </span>
<span id="L7" class="LineNr"> 7 </span>== code
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># instruction effective address register displacement immediate</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxS1Comment"># . 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</span>
<span id="L11" class="LineNr"> 11 </span>
<span id="L12" class="LineNr"> 12 </span><span class="SpecialChar">Entry</span>:
<span id="L13" class="LineNr"> 13 </span> <span class="subxComment"># Heap = new-segment(Heap-size)</span>
<span id="L14" class="LineNr"> 14 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L15" class="LineNr"> 15 </span> 68/push <span class="SpecialChar"><a href='../075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L16" class="LineNr"> 16 </span> 68/push <span class="SpecialChar">Heap-size</span>/imm32
<span id="L17" class="LineNr"> 17 </span> <span class="subxS2Comment"># . . call</span>
<span id="L18" class="LineNr"> 18 </span> e8/call <a href='../053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L19" class="LineNr"> 19 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L20" class="LineNr"> 20 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># initialize-trace-stream(256KB)</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L23" class="LineNr"> 23 </span> 68/push 0x40000/imm32/256KB
<span id="L24" class="LineNr"> 24 </span> <span class="subxS2Comment"># . . call</span>
<span id="L25" class="LineNr"> 25 </span> e8/call <a href='../056trace.subx.html#L44'>initialize-trace-stream</a>/disp32
<span id="L26" class="LineNr"> 26 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L27" class="LineNr"> 27 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L28" class="LineNr"> 28 </span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># run tests if necessary, convert stdin if not</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L31" class="LineNr"> 31 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># initialize heap</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxH1Comment"># - if argc &gt; 1 and argv[1] == &quot;test&quot;, then return run_tests()</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxS1Comment"># . argc &gt; 1</span>
<span id="L35" class="LineNr"> 35 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/disp8 1/imm32 <span class="subxComment"># compare *EBP</span>
<span id="L36" class="LineNr"> 36 </span> 7e/jump-if-lesser-or-equal $run-main/disp8
<span id="L37" class="LineNr"> 37 </span> <span class="subxS1Comment"># . argv[1] == &quot;test&quot;</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L39" class="LineNr"> 39 </span> 68/push <span class="Constant">&quot;test&quot;</span>/imm32
<span id="L40" class="LineNr"> 40 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxS2Comment"># . . call</span>
<span id="L42" class="LineNr"> 42 </span> e8/call <a href='../052kernel-string-equal.subx.html#L31'>kernel-string-equal?</a>/disp32
<span id="L43" class="LineNr"> 43 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L44" class="LineNr"> 44 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxS1Comment"># . check result</span>
<span id="L46" class="LineNr"> 46 </span> 3d/compare-EAX-and 1/imm32
<span id="L47" class="LineNr"> 47 </span> 75/jump-if-not-equal $run-main/disp8
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . run-tests()</span>
<span id="L49" class="LineNr"> 49 </span> e8/call run-tests/disp32
<span id="L50" class="LineNr"> 50 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="SpecialChar"><a href='../051test.subx.html#L90'>Num-test-failures</a></span>/disp32 <span class="subxComment"># copy *Num-test-failures to EBX</span>
<span id="L51" class="LineNr"> 51 </span> eb/jump $main:end/disp8
<span id="L52" class="LineNr"> 52 </span><span class="Constant">$run-main</span>:
<span id="L53" class="LineNr"> 53 </span> <span class="subxH1Comment"># - otherwise convert stdin</span>
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># convert(Stdin, Stdout)</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L56" class="LineNr"> 56 </span> 68/push <span class="SpecialChar"><a href='../064write-byte.subx.html#L10'>Stdout</a></span>/imm32
<span id="L57" class="LineNr"> 57 </span> 68/push <span class="SpecialChar"><a href='../061read-byte.subx.html#L14'>Stdin</a></span>/imm32
<span id="L58" class="LineNr"> 58 </span> <span class="subxS2Comment"># . . call</span>
<span id="L59" class="LineNr"> 59 </span> e8/call <a href='tests.subx.html#L68'>convert</a>/disp32
<span id="L60" class="LineNr"> 60 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L61" class="LineNr"> 61 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxS1Comment"># . syscall(exit, 0)</span>
<span id="L63" class="LineNr"> 63 </span> bb/copy-to-EBX 0/imm32
<span id="L64" class="LineNr"> 64 </span><span class="Constant">$main:end</span>:
<span id="L65" class="LineNr"> 65 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L66" class="LineNr"> 66 </span> cd/syscall 0x80/imm8
<span id="L67" class="LineNr"> 67 </span>
<span id="L68" class="LineNr"> 68 </span><span class="subxFunction">convert</span>: <span class="subxComment"># in : (address buffered-file), out : (address buffered-file) -&gt; &lt;void&gt;</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># pseudocode</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># bool tests-found = false</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># var line = new-stream(512, 1)</span>
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># var new-code-segment = new-stream(Segment-size, 1)</span>
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># write(new-code-segment, &quot;\n==code\n&quot;)</span>
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># write(new-code-segment, &quot;run-tests:\n&quot;)</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># while true</span>
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># clear-stream(line)</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># read-line-buffered(in, line)</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># if (line-&gt;write == 0) break # end of file</span>
<span id="L79" class="LineNr"> 79 </span> <span class="subxComment"># var word-slice = next-word(line)</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># if is-label?(word-slice)</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># if slice-starts-with?(word-slice, &quot;test-&quot;)</span>
<span id="L82" class="LineNr"> 82 </span> <span class="subxComment"># tests-found = true</span>
<span id="L83" class="LineNr"> 83 </span> <span class="subxComment"># write(new-code-segment, &quot; e8/call &quot;)</span>
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># write-slice(new-code-segment, word-slice)</span>
<span id="L85" class="LineNr"> 85 </span> <span class="subxComment"># write(new-code-segment, &quot;/disp32\n&quot;)</span>
<span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># rewind-stream(line)</span>
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># write-stream-data(out, line)</span>
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># if tests-found</span>
<span id="L89" class="LineNr"> 89 </span> <span class="subxComment"># write(new-code-segment, &quot; c3/return\n&quot;)</span>
<span id="L90" class="LineNr"> 90 </span> <span class="subxComment"># write-stream-data(out, new-code-segment)</span>
<span id="L91" class="LineNr"> 91 </span> <span class="subxComment"># flush(out)</span>
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment">#</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L94" class="LineNr"> 94 </span> 55/push-EBP
<span id="L95" class="LineNr"> 95 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L96" class="LineNr"> 96 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L97" class="LineNr"> 97 </span> 50/push-EAX
<span id="L98" class="LineNr"> 98 </span> 51/push-ECX
<span id="L99" class="LineNr"> 99 </span> 52/push-EDX
<span id="L100" class="LineNr">100 </span> 53/push-EBX
<span id="L101" class="LineNr">101 </span> 57/push-EDI
<span id="L102" class="LineNr">102 </span> <span class="subxComment"># var line/ECX : (address stream byte) = stream(512)</span>
<span id="L103" class="LineNr">103 </span> 81 5/subop/subtract 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x200/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L104" class="LineNr">104 </span> 68/push 0x200/imm32/length
<span id="L105" class="LineNr">105 </span> 68/push 0/imm32/read
<span id="L106" class="LineNr">106 </span> 68/push 0/imm32/write
<span id="L107" class="LineNr">107 </span> 89/copy 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to ECX</span>
<span id="L108" class="LineNr">108 </span> <span class="subxComment"># var word-slice/EDX = {0, 0}</span>
<span id="L109" class="LineNr">109 </span> 68/push 0/imm32/end
<span id="L110" class="LineNr">110 </span> 68/push 0/imm32/start
<span id="L111" class="LineNr">111 </span> 89/copy 3/mod/direct 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EDX</span>
<span id="L112" class="LineNr">112 </span> <span class="subxComment"># tests-found?/EBX = false</span>
<span id="L113" class="LineNr">113 </span> 31/xor 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear EBX</span>
<span id="L114" class="LineNr">114 </span> <span class="subxComment"># new-code-segment/EDI = new-stream(Heap, Segment-size, 1)</span>
<span id="L115" class="LineNr">115 </span> <span class="subxS1Comment"># . EAX = new-stream(Heap, Segment-size, 1)</span>
<span id="L116" class="LineNr">116 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L117" class="LineNr">117 </span> 68/push 1/imm32
<span id="L118" class="LineNr">118 </span> ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="SpecialChar">Segment-size</span>/disp32 <span class="subxComment"># push *Segment-size</span>
<span id="L119" class="LineNr">119 </span> 68/push <span class="SpecialChar"><a href='../075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L120" class="LineNr">120 </span> <span class="subxS2Comment"># . . call</span>
<span id="L121" class="LineNr">121 </span> e8/call <a href='../070new-stream.subx.html#L8'>new-stream</a>/disp32
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L123" class="LineNr">123 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L124" class="LineNr">124 </span> <span class="subxS1Comment"># . EDI = EAX</span>
<span id="L125" class="LineNr">125 </span> 89/copy 3/mod/direct 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to EDI</span>
<span id="L126" class="LineNr">126 </span> <span class="subxComment"># write(new-code-segment, &quot;\n== code\n&quot;)</span>
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr">128 </span> 68/push <span class="Constant">&quot;\n== code\n&quot;</span>/imm32
<span id="L129" class="LineNr">129 </span> 57/push-EDI
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . call</span>
<span id="L131" class="LineNr">131 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L133" class="LineNr">133 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L134" class="LineNr">134 </span> <span class="subxComment"># write(new-code-segment, &quot;run-tests:\n&quot;)</span>
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L136" class="LineNr">136 </span> 68/push <span class="Constant">&quot;run-tests:\n&quot;</span>/imm32
<span id="L137" class="LineNr">137 </span> 57/push-EDI
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . call</span>
<span id="L139" class="LineNr">139 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L141" class="LineNr">141 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L142" class="LineNr">142 </span><span class="Constant">$convert:loop</span>:
<span id="L143" class="LineNr">143 </span> <span class="subxComment"># clear-stream(line)</span>
<span id="L144" class="LineNr">144 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L145" class="LineNr">145 </span> 51/push-ECX
<span id="L146" class="LineNr">146 </span> <span class="subxS2Comment"># . . call</span>
<span id="L147" class="LineNr">147 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L149" class="LineNr">149 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L150" class="LineNr">150 </span> <span class="subxComment"># read-line-buffered(in, line)</span>
<span id="L151" class="LineNr">151 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L152" class="LineNr">152 </span> 51/push-ECX
<span id="L153" class="LineNr">153 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . call</span>
<span id="L155" class="LineNr">155 </span> e8/call <a href='../071read-line.subx.html#L9'>read-line-buffered</a>/disp32
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L157" class="LineNr">157 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L158" class="LineNr">158 </span><span class="Constant">$convert:check0</span>:
<span id="L159" class="LineNr">159 </span> <span class="subxComment"># if (line-&gt;write == 0) break</span>
<span id="L160" class="LineNr">160 </span> 81 7/subop/compare 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *ECX</span>
<span id="L161" class="LineNr">161 </span> 0f 84/jump-if-equal $convert:break/disp32
<span id="L162" class="LineNr">162 </span> <span class="subxComment"># next-word(line, word-slice)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L164" class="LineNr">164 </span> 52/push-EDX
<span id="L165" class="LineNr">165 </span> 51/push-ECX
<span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . call</span>
<span id="L167" class="LineNr">167 </span> e8/call next-word/disp32
<span id="L168" class="LineNr">168 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L169" class="LineNr">169 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L170" class="LineNr">170 </span><span class="Constant">$convert:check-for-label</span>:
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># if (!is-label?(word-slice)) continue</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS1Comment"># . EAX = is-label?(word-slice)</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L174" class="LineNr">174 </span> 52/push-EDX
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . call</span>
<span id="L176" class="LineNr">176 </span> e8/call is-label?/disp32
<span id="L177" class="LineNr">177 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L178" class="LineNr">178 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L179" class="LineNr">179 </span> <span class="subxS1Comment"># . if (EAX == 0) continue</span>
<span id="L180" class="LineNr">180 </span> 3d/compare-EAX-and 0/imm32
<span id="L181" class="LineNr">181 </span> 74/jump-if-equal $convert:continue/disp8
<span id="L182" class="LineNr">182 </span><span class="Constant">$convert:check-label-prefix</span>:
<span id="L183" class="LineNr">183 </span> <span class="subxComment"># strip trailing ':' from word-slice</span>
<span id="L184" class="LineNr">184 </span> ff 1/subop/decrement 1/mod/*+disp8 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># decrement *(EDX+4)</span>
<span id="L185" class="LineNr">185 </span> <span class="subxComment"># if !slice-starts-with?(word-slice, &quot;test-&quot;) continue</span>
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L187" class="LineNr">187 </span> 68/push <span class="Constant">&quot;test-&quot;</span>/imm32
<span id="L188" class="LineNr">188 </span> 52/push-EDX
<span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . call</span>
<span id="L190" class="LineNr">190 </span> e8/call <a href='../072slice.subx.html#L457'>slice-starts-with?</a>/disp32
<span id="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L192" class="LineNr">192 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L193" class="LineNr">193 </span> <span class="subxS1Comment"># . if (EAX == 0) break</span>
<span id="L194" class="LineNr">194 </span> 3d/compare-EAX-and 0/imm32
<span id="L195" class="LineNr">195 </span> 74/jump-if-equal $convert:continue/disp8
<span id="L196" class="LineNr">196 </span><span class="Constant">$convert:call-test-function</span>:
<span id="L197" class="LineNr">197 </span> <span class="subxComment"># tests-found? = true</span>
<span id="L198" class="LineNr">198 </span> bb/copy-to-EBX 1/imm32/true
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># write(new-code-segment, &quot; e8/call &quot;)</span>
<span id="L200" class="LineNr">200 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L201" class="LineNr">201 </span> 68/push <span class="Constant">&quot; e8/call &quot;</span>/imm32
<span id="L202" class="LineNr">202 </span> 57/push-EDI
<span id="L203" class="LineNr">203 </span> <span class="subxS2Comment"># . . call</span>
<span id="L204" class="LineNr">204 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L206" class="LineNr">206 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L207" class="LineNr">207 </span> <span class="subxComment"># write-slice(new-code-segment, word-slice)</span>
<span id="L208" class="LineNr">208 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L209" class="LineNr">209 </span> 52/push-EDX
<span id="L210" class="LineNr">210 </span> 57/push-EDI
<span id="L211" class="LineNr">211 </span> <span class="subxS2Comment"># . . call</span>
<span id="L212" class="LineNr">212 </span> e8/call <a href='../072slice.subx.html#L762'>write-slice</a>/disp32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L214" class="LineNr">214 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L215" class="LineNr">215 </span> <span class="subxComment"># write(new-code-segment, &quot;/disp32\n&quot;)</span>
<span id="L216" class="LineNr">216 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L217" class="LineNr">217 </span> 68/push <span class="Constant">&quot;/disp32\n&quot;</span>/imm32
<span id="L218" class="LineNr">218 </span> 57/push-EDI
<span id="L219" class="LineNr">219 </span> <span class="subxS2Comment"># . . call</span>
<span id="L220" class="LineNr">220 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L221" class="LineNr">221 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L222" class="LineNr">222 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L223" class="LineNr">223 </span><span class="Constant">$convert:continue</span>:
<span id="L224" class="LineNr">224 </span> <span class="subxComment"># rewind-stream(line)</span>
<span id="L225" class="LineNr">225 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L226" class="LineNr">226 </span> 51/push-ECX
<span id="L227" class="LineNr">227 </span> <span class="subxS2Comment"># . . call</span>
<span id="L228" class="LineNr">228 </span> e8/call <a href='../055stream.subx.html#L55'>rewind-stream</a>/disp32
<span id="L229" class="LineNr">229 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L230" class="LineNr">230 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L231" class="LineNr">231 </span> <span class="subxComment"># write-stream-data(out, line)</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L233" class="LineNr">233 </span> 51/push-ECX
<span id="L234" class="LineNr">234 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L235" class="LineNr">235 </span> <span class="subxS2Comment"># . . call</span>
<span id="L236" class="LineNr">236 </span> e8/call write-stream-data/disp32
<span id="L237" class="LineNr">237 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L238" class="LineNr">238 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L239" class="LineNr">239 </span> <span class="subxComment"># loop</span>
<span id="L240" class="LineNr">240 </span> e9/jump $convert:loop/disp32
<span id="L241" class="LineNr">241 </span><span class="Constant">$convert:break</span>:
<span id="L242" class="LineNr">242 </span> <span class="subxComment"># if (!tests-found?) goto end</span>
<span id="L243" class="LineNr">243 </span> 81 7/subop/compare 3/mod/direct 3/rm32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare EBX</span>
<span id="L244" class="LineNr">244 </span> 74/jump-if-equal $convert:end/disp8
<span id="L245" class="LineNr">245 </span> <span class="subxComment"># write(new-code-segment, &quot; c3/return\n&quot;)</span>
<span id="L246" class="LineNr">246 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L247" class="LineNr">247 </span> 68/push <span class="Constant">&quot; c3/return\n&quot;</span>/imm32
<span id="L248" class="LineNr">248 </span> 57/push-EDI
<span id="L249" class="LineNr">249 </span> <span class="subxS2Comment"># . . call</span>
<span id="L250" class="LineNr">250 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L251" class="LineNr">251 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L252" class="LineNr">252 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L253" class="LineNr">253 </span> <span class="subxComment"># write-stream-data(out, new-code-segment)</span>
<span id="L254" class="LineNr">254 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L255" class="LineNr">255 </span> 57/push-EDI
<span id="L256" class="LineNr">256 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L257" class="LineNr">257 </span> <span class="subxS2Comment"># . . call</span>
<span id="L258" class="LineNr">258 </span> e8/call write-stream-data/disp32
<span id="L259" class="LineNr">259 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L260" class="LineNr">260 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L261" class="LineNr">261 </span><span class="Constant">$convert:end</span>:
<span id="L262" class="LineNr">262 </span> <span class="subxComment"># flush(out)</span>
<span id="L263" class="LineNr">263 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L264" class="LineNr">264 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L265" class="LineNr">265 </span> <span class="subxS2Comment"># . . call</span>
<span id="L266" class="LineNr">266 </span> e8/call <a href='../064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L267" class="LineNr">267 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L268" class="LineNr">268 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L269" class="LineNr">269 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L270" class="LineNr">270 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x214/imm32 <span class="subxComment"># add to ESP</span>
<span id="L271" class="LineNr">271 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L272" class="LineNr">272 </span> 5f/pop-to-EDI
<span id="L273" class="LineNr">273 </span> 5b/pop-to-EBX
<span id="L274" class="LineNr">274 </span> 5a/pop-to-EDX
<span id="L275" class="LineNr">275 </span> 59/pop-to-ECX
<span id="L276" class="LineNr">276 </span> 58/pop-to-EAX
<span id="L277" class="LineNr">277 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L278" class="LineNr">278 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L279" class="LineNr">279 </span> 5d/pop-to-EBP
<span id="L280" class="LineNr">280 </span> c3/return
<span id="L281" class="LineNr">281 </span>
<span id="L282" class="LineNr">282 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>