This commit is contained in:
Kartik Agaram 2019-04-23 20:51:58 -07:00
parent d4e7f835a8
commit 0af2ea07b3
15 changed files with 11549 additions and 10307 deletions

View File

@ -148,11 +148,11 @@ if ('onhashchange' in window) {
<span id="L86" class="LineNr"> 86 </span> 39/compare 3/mod/direct 0/rm32/EAX <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"># compare EAX and EBX</span>
<span id="L87" class="LineNr"> 87 </span> 75/jump-if-not-equal $kernel-string-equal?:false/disp8
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># ++i</span>
<span id="L89" class="LineNr"> 89 </span> 41/inc-ECX
<span id="L89" class="LineNr"> 89 </span> 41/increment-ECX
<span id="L90" class="LineNr"> 90 </span> <span class="subxComment"># ++s1</span>
<span id="L91" class="LineNr"> 91 </span> 47/inc-EDI
<span id="L91" class="LineNr"> 91 </span> 47/increment-EDI
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># ++s2</span>
<span id="L93" class="LineNr"> 93 </span> 46/inc-ESI
<span id="L93" class="LineNr"> 93 </span> 46/increment-ESI
<span id="L94" class="LineNr"> 94 </span> eb/jump $kernel-string-equal?:loop/disp8
<span id="L95" class="LineNr"> 95 </span><span class="Constant">$kernel-string-equal?:break</span>:
<span id="L96" class="LineNr"> 96 </span> <span class="subxComment"># return *s1 == 0</span>

View File

@ -136,11 +136,11 @@ if ('onhashchange' in window) {
<span id="L74" class="LineNr"> 74 </span> 39/compare 3/mod/direct 0/rm32/EAX <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"># compare EAX and EBX</span>
<span id="L75" class="LineNr"> 75 </span> 75/jump-if-not-equal $string-equal?:false/disp8
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># ++i</span>
<span id="L77" class="LineNr"> 77 </span> 41/inc-ECX
<span id="L77" class="LineNr"> 77 </span> 41/increment-ECX
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># ++currs</span>
<span id="L79" class="LineNr"> 79 </span> 46/inc-ESI
<span id="L79" class="LineNr"> 79 </span> 46/increment-ESI
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># ++currb</span>
<span id="L81" class="LineNr"> 81 </span> 47/inc-EDI
<span id="L81" class="LineNr"> 81 </span> 47/increment-EDI
<span id="L82" class="LineNr"> 82 </span> eb/jump $string-equal?:loop/disp8
<span id="L83" class="LineNr"> 83 </span><span class="Constant">$string-equal?:true</span>:
<span id="L84" class="LineNr"> 84 </span> b8/copy-to-EAX 1/imm32

View File

@ -23,7 +23,6 @@ a { color:inherit; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
-->
</style>
@ -280,459 +279,384 @@ if ('onhashchange' in window) {
<span id="L219" class="LineNr">219 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L221" class="LineNr">221 </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="L222" class="LineNr">222 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L223" class="LineNr">223 </span> 58/pop-to-EAX
<span id="L224" class="LineNr">224 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L225" class="LineNr">225 </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="L226" class="LineNr">226 </span> 5d/pop-to-EBP
<span id="L227" class="LineNr">227 </span> c3/return
<span id="L228" class="LineNr">228 </span>
<span id="L229" class="LineNr">229 </span><span class="subxComment"># scan the next line until newline starting from f-&gt;read and compare it with</span>
<span id="L230" class="LineNr">230 </span><span class="subxComment"># 's' (ignoring the trailing newline)</span>
<span id="L231" class="LineNr">231 </span><span class="subxComment"># on success, set f-&gt;read to after the next newline</span>
<span id="L232" class="LineNr">232 </span><span class="subxComment"># on failure, leave f-&gt;read unmodified</span>
<span id="L233" class="LineNr">233 </span><span class="subxComment"># this function is usually used only in tests, so we repeatedly write f-&gt;read</span>
<span id="L234" class="LineNr">234 </span><span class="subxFunction">next-stream-line-equal?</span>: <span class="subxComment"># f : (address stream), s : (address string) -&gt; EAX : boolean</span>
<span id="L235" class="LineNr">235 </span> <span class="subxComment"># pseudocode:</span>
<span id="L236" class="LineNr">236 </span> <span class="subxComment"># currf = f-&gt;read # bound: f-&gt;write</span>
<span id="L237" class="LineNr">237 </span> <span class="subxComment"># currs = 0 # bound : s-&gt;length</span>
<span id="L238" class="LineNr">238 </span> <span class="subxComment"># while true</span>
<span id="L239" class="LineNr">239 </span> <span class="subxComment"># if currf &gt;= f-&gt;write</span>
<span id="L240" class="LineNr">240 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L241" class="LineNr">241 </span> <span class="subxComment"># if f[currf] == '\n'</span>
<span id="L242" class="LineNr">242 </span> <span class="subxComment"># ++currf</span>
<span id="L243" class="LineNr">243 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L244" class="LineNr">244 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false # the current line of f still has data to match</span>
<span id="L245" class="LineNr">245 </span> <span class="subxComment"># if (f[currf] != s[currs]) return false</span>
<span id="L246" class="LineNr">246 </span> <span class="subxComment"># ++currf</span>
<span id="L247" class="LineNr">247 </span> <span class="subxComment"># ++currs</span>
<span id="L248" class="LineNr">248 </span> <span class="subxComment">#</span>
<span id="L249" class="LineNr">249 </span> <span class="subxComment"># collapsing the two branches that can return true:</span>
<span id="L250" class="LineNr">250 </span> <span class="subxComment"># currf = f-&gt;read # bound: f-&gt;write</span>
<span id="L251" class="LineNr">251 </span> <span class="subxComment"># currs = 0 # bound : s-&gt;length</span>
<span id="L252" class="LineNr">252 </span> <span class="subxComment"># while true</span>
<span id="L253" class="LineNr">253 </span> <span class="subxComment"># if (currf &gt;= f-&gt;write) break</span>
<span id="L254" class="LineNr">254 </span> <span class="subxComment"># if (f[currf] == '\n') break</span>
<span id="L255" class="LineNr">255 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false # the current line of f still has data to match</span>
<span id="L256" class="LineNr">256 </span> <span class="subxComment"># if (f[currf] != s[currs]) return false</span>
<span id="L257" class="LineNr">257 </span> <span class="subxComment"># ++currf</span>
<span id="L258" class="LineNr">258 </span> <span class="subxComment"># ++currs</span>
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># ++currf # skip '\n'</span>
<span id="L260" class="LineNr">260 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L261" class="LineNr">261 </span> <span class="subxComment"># Here the final `++currf` is sometimes unnecessary (if we're already at the end of the stream)</span>
<span id="L262" class="LineNr">262 </span> <span class="subxComment">#</span>
<span id="L263" class="LineNr">263 </span> <span class="subxComment"># registers:</span>
<span id="L264" class="LineNr">264 </span> <span class="subxComment"># f: ESI</span>
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># s: EDI</span>
<span id="L266" class="LineNr">266 </span> <span class="subxComment"># currf: ECX</span>
<span id="L267" class="LineNr">267 </span> <span class="subxComment"># currs: EDX</span>
<span id="L268" class="LineNr">268 </span> <span class="subxComment"># f[currf]: EAX</span>
<span id="L269" class="LineNr">269 </span> <span class="subxComment"># s[currs]: EBX</span>
<span id="L270" class="LineNr">270 </span> <span class="subxComment">#</span>
<span id="L271" class="LineNr">271 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L272" class="LineNr">272 </span> 55/push-EBP
<span id="L273" class="LineNr">273 </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="L274" class="LineNr">274 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L275" class="LineNr">275 </span> 51/push-ECX
<span id="L276" class="LineNr">276 </span> 52/push-EDX
<span id="L277" class="LineNr">277 </span> 56/push-ESI
<span id="L278" class="LineNr">278 </span> 57/push-EDI
<span id="L279" class="LineNr">279 </span> <span class="subxComment"># ESI = f</span>
<span id="L280" class="LineNr">280 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L281" class="LineNr">281 </span> <span class="subxComment"># currf/ECX = f-&gt;read</span>
<span id="L282" class="LineNr">282 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESI+4) to ECX</span>
<span id="L283" class="LineNr">283 </span> <span class="subxComment"># EDI = s</span>
<span id="L284" class="LineNr">284 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDI</span>
<span id="L285" class="LineNr">285 </span> <span class="subxComment"># currs/EDX = 0</span>
<span id="L286" class="LineNr">286 </span> 31/xor 3/mod/direct 2/rm32/EDX <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"># clear EDX</span>
<span id="L287" class="LineNr">287 </span> <span class="subxComment"># EAX = EBX = 0</span>
<span id="L288" class="LineNr">288 </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="L289" class="LineNr">289 </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="L290" class="LineNr">290 </span><span class="Constant">$next-stream-line-equal?:loop</span>:
<span id="L291" class="LineNr">291 </span> <span class="subxComment"># if (currf &gt;= f-&gt;write) break</span>
<span id="L292" class="LineNr">292 </span> 3b/compare 0/mod/indirect 6/rm32/ESI <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"># compare ECX with *ESI</span>
<span id="L293" class="LineNr">293 </span> 7d/jump-if-greater-or-equal $next-stream-line-equal?:break/disp8
<span id="L294" class="LineNr">294 </span> <span class="subxComment"># AL = *(f-&gt;data + f-&gt;read)</span>
<span id="L295" class="LineNr">295 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+12) to AL</span>
<span id="L296" class="LineNr">296 </span> <span class="subxComment"># if (EAX == '\n') break</span>
<span id="L297" class="LineNr">297 </span> 3d/compare-EAX-and 0xa/imm32/newline
<span id="L298" class="LineNr">298 </span> 74/jump-if-equal $next-stream-line-equal?:break/disp8
<span id="L299" class="LineNr">299 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false</span>
<span id="L300" class="LineNr">300 </span> 3b/compare 0/mod/indirect 7/rm32/EDI <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 EDX with *EDI</span>
<span id="L301" class="LineNr">301 </span> 7d/jump-if-greater-or-equal $next-stream-line-equal?:false/disp8
<span id="L302" class="LineNr">302 </span> <span class="subxComment"># BL = *(s-&gt;data + currs)</span>
<span id="L303" class="LineNr">303 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 3/r32/BL 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(EDI+EDX+4) to BL</span>
<span id="L304" class="LineNr">304 </span> <span class="subxComment"># if (EAX != EBX) return false</span>
<span id="L305" class="LineNr">305 </span> 39/compare 3/mod/direct 0/rm32/EAX <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"># compare EAX and EBX</span>
<span id="L306" class="LineNr">306 </span> 75/jump-if-not-equal $next-stream-line-equal?:false/disp8
<span id="L307" class="LineNr">307 </span> <span class="subxComment"># ++currf</span>
<span id="L308" class="LineNr">308 </span> 41/increment-ECX
<span id="L309" class="LineNr">309 </span> <span class="subxComment"># ++currs</span>
<span id="L310" class="LineNr">310 </span> 42/increment-EDX
<span id="L311" class="LineNr">311 </span> eb/jump $next-stream-line-equal?:loop/disp8
<span id="L312" class="LineNr">312 </span><span class="Constant">$next-stream-line-equal?:break</span>:
<span id="L313" class="LineNr">313 </span> <span class="subxComment"># ++currf</span>
<span id="L314" class="LineNr">314 </span> 41/increment-ECX
<span id="L315" class="LineNr">315 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return true</span>
<span id="L316" class="LineNr">316 </span> 3b/compare 0/mod/indirect 7/rm32/EDI <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 EDX with *EDI</span>
<span id="L317" class="LineNr">317 </span> 7c/jump-if-lesser $next-stream-line-equal?:false/disp8
<span id="L318" class="LineNr">318 </span><span class="Constant">$next-stream-line-equal?:true</span>:
<span id="L319" class="LineNr">319 </span> b8/copy-to-EAX 1/imm32
<span id="L320" class="LineNr">320 </span> <span class="subxComment"># persist f-&gt;read on success</span>
<span id="L321" class="LineNr">321 </span> 89/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(ESI+4)</span>
<span id="L322" class="LineNr">322 </span> eb/jump $next-stream-line-equal?:end/disp8
<span id="L323" class="LineNr">323 </span><span class="Constant">$next-stream-line-equal?:false</span>:
<span id="L324" class="LineNr">324 </span> b8/copy-to-EAX 0/imm32
<span id="L325" class="LineNr">325 </span><span class="Constant">$next-stream-line-equal?:end</span>:
<span id="L326" class="LineNr">326 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L327" class="LineNr">327 </span> 5f/pop-to-EDI
<span id="L328" class="LineNr">328 </span> 5e/pop-to-ESI
<span id="L329" class="LineNr">329 </span> 5a/pop-to-EDX
<span id="L330" class="LineNr">330 </span> 59/pop-to-ECX
<span id="L331" class="LineNr">331 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L332" class="LineNr">332 </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="L333" class="LineNr">333 </span> 5d/pop-to-EBP
<span id="L334" class="LineNr">334 </span> c3/return
<span id="L335" class="LineNr">335 </span>
<span id="L336" class="LineNr">336 </span><span class="subxTest">test-next-stream-line-equal-stops-at-newline</span>:
<span id="L337" class="LineNr">337 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L338" class="LineNr">338 </span> 55/push-EBP
<span id="L339" class="LineNr">339 </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="L340" class="LineNr">340 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L341" class="LineNr">341 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L342" class="LineNr">342 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L343" class="LineNr">343 </span> <span class="subxS2Comment"># . . call</span>
<span id="L344" class="LineNr">344 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L345" class="LineNr">345 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L346" class="LineNr">346 </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="L347" class="LineNr">347 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L348" class="LineNr">348 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abc&quot;)</span>
<span id="L222" class="LineNr">222 </span><span class="Constant">$check-stream-equal:end</span>:
<span id="L223" class="LineNr">223 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L224" class="LineNr">224 </span> 58/pop-to-EAX
<span id="L225" class="LineNr">225 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L226" class="LineNr">226 </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="L227" class="LineNr">227 </span> 5d/pop-to-EBP
<span id="L228" class="LineNr">228 </span> c3/return
<span id="L229" class="LineNr">229 </span>
<span id="L230" class="LineNr">230 </span><span class="subxComment"># scan the next line until newline starting from f-&gt;read and compare it with</span>
<span id="L231" class="LineNr">231 </span><span class="subxComment"># 's' (ignoring the trailing newline)</span>
<span id="L232" class="LineNr">232 </span><span class="subxComment"># on success, set f-&gt;read to after the next newline</span>
<span id="L233" class="LineNr">233 </span><span class="subxComment"># on failure, leave f-&gt;read unmodified</span>
<span id="L234" class="LineNr">234 </span><span class="subxComment"># this function is usually used only in tests, so we repeatedly write f-&gt;read</span>
<span id="L235" class="LineNr">235 </span><span class="subxFunction">next-stream-line-equal?</span>: <span class="subxComment"># f : (address stream), s : (address string) -&gt; EAX : boolean</span>
<span id="L236" class="LineNr">236 </span> <span class="subxComment"># pseudocode:</span>
<span id="L237" class="LineNr">237 </span> <span class="subxComment"># currf = f-&gt;read # bound: f-&gt;write</span>
<span id="L238" class="LineNr">238 </span> <span class="subxComment"># currs = 0 # bound : s-&gt;length</span>
<span id="L239" class="LineNr">239 </span> <span class="subxComment"># while true</span>
<span id="L240" class="LineNr">240 </span> <span class="subxComment"># if currf &gt;= f-&gt;write</span>
<span id="L241" class="LineNr">241 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L242" class="LineNr">242 </span> <span class="subxComment"># if f[currf] == '\n'</span>
<span id="L243" class="LineNr">243 </span> <span class="subxComment"># ++currf</span>
<span id="L244" class="LineNr">244 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L245" class="LineNr">245 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false # the current line of f still has data to match</span>
<span id="L246" class="LineNr">246 </span> <span class="subxComment"># if (f[currf] != s[currs]) return false</span>
<span id="L247" class="LineNr">247 </span> <span class="subxComment"># ++currf</span>
<span id="L248" class="LineNr">248 </span> <span class="subxComment"># ++currs</span>
<span id="L249" class="LineNr">249 </span> <span class="subxComment">#</span>
<span id="L250" class="LineNr">250 </span> <span class="subxComment"># collapsing the two branches that can return true:</span>
<span id="L251" class="LineNr">251 </span> <span class="subxComment"># currf = f-&gt;read # bound: f-&gt;write</span>
<span id="L252" class="LineNr">252 </span> <span class="subxComment"># currs = 0 # bound : s-&gt;length</span>
<span id="L253" class="LineNr">253 </span> <span class="subxComment"># while true</span>
<span id="L254" class="LineNr">254 </span> <span class="subxComment"># if (currf &gt;= f-&gt;write) break</span>
<span id="L255" class="LineNr">255 </span> <span class="subxComment"># if (f[currf] == '\n') break</span>
<span id="L256" class="LineNr">256 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false # the current line of f still has data to match</span>
<span id="L257" class="LineNr">257 </span> <span class="subxComment"># if (f[currf] != s[currs]) return false</span>
<span id="L258" class="LineNr">258 </span> <span class="subxComment"># ++currf</span>
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># ++currs</span>
<span id="L260" class="LineNr">260 </span> <span class="subxComment"># ++currf # skip '\n'</span>
<span id="L261" class="LineNr">261 </span> <span class="subxComment"># return currs &gt;= s-&gt;length</span>
<span id="L262" class="LineNr">262 </span> <span class="subxComment"># Here the final `++currf` is sometimes unnecessary (if we're already at the end of the stream)</span>
<span id="L263" class="LineNr">263 </span> <span class="subxComment">#</span>
<span id="L264" class="LineNr">264 </span> <span class="subxComment"># registers:</span>
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># f: ESI</span>
<span id="L266" class="LineNr">266 </span> <span class="subxComment"># s: EDI</span>
<span id="L267" class="LineNr">267 </span> <span class="subxComment"># currf: ECX</span>
<span id="L268" class="LineNr">268 </span> <span class="subxComment"># currs: EDX</span>
<span id="L269" class="LineNr">269 </span> <span class="subxComment"># f[currf]: EAX</span>
<span id="L270" class="LineNr">270 </span> <span class="subxComment"># s[currs]: EBX</span>
<span id="L271" class="LineNr">271 </span> <span class="subxComment">#</span>
<span id="L272" class="LineNr">272 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L273" class="LineNr">273 </span> 55/push-EBP
<span id="L274" class="LineNr">274 </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="L275" class="LineNr">275 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L276" class="LineNr">276 </span> 51/push-ECX
<span id="L277" class="LineNr">277 </span> 52/push-EDX
<span id="L278" class="LineNr">278 </span> 56/push-ESI
<span id="L279" class="LineNr">279 </span> 57/push-EDI
<span id="L280" class="LineNr">280 </span> <span class="subxComment"># ESI = f</span>
<span id="L281" class="LineNr">281 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L282" class="LineNr">282 </span> <span class="subxComment"># currf/ECX = f-&gt;read</span>
<span id="L283" class="LineNr">283 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESI+4) to ECX</span>
<span id="L284" class="LineNr">284 </span> <span class="subxComment"># EDI = s</span>
<span id="L285" class="LineNr">285 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDI</span>
<span id="L286" class="LineNr">286 </span> <span class="subxComment"># currs/EDX = 0</span>
<span id="L287" class="LineNr">287 </span> 31/xor 3/mod/direct 2/rm32/EDX <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"># clear EDX</span>
<span id="L288" class="LineNr">288 </span> <span class="subxComment"># EAX = EBX = 0</span>
<span id="L289" class="LineNr">289 </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="L290" class="LineNr">290 </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="L291" class="LineNr">291 </span><span class="Constant">$next-stream-line-equal?:loop</span>:
<span id="L292" class="LineNr">292 </span> <span class="subxComment"># if (currf &gt;= f-&gt;write) break</span>
<span id="L293" class="LineNr">293 </span> 3b/compare 0/mod/indirect 6/rm32/ESI <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"># compare ECX with *ESI</span>
<span id="L294" class="LineNr">294 </span> 7d/jump-if-greater-or-equal $next-stream-line-equal?:break/disp8
<span id="L295" class="LineNr">295 </span> <span class="subxComment"># AL = *(f-&gt;data + f-&gt;read)</span>
<span id="L296" class="LineNr">296 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+12) to AL</span>
<span id="L297" class="LineNr">297 </span> <span class="subxComment"># if (EAX == '\n') break</span>
<span id="L298" class="LineNr">298 </span> 3d/compare-EAX-and 0xa/imm32/newline
<span id="L299" class="LineNr">299 </span> 74/jump-if-equal $next-stream-line-equal?:break/disp8
<span id="L300" class="LineNr">300 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return false</span>
<span id="L301" class="LineNr">301 </span> 3b/compare 0/mod/indirect 7/rm32/EDI <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 EDX with *EDI</span>
<span id="L302" class="LineNr">302 </span> 7d/jump-if-greater-or-equal $next-stream-line-equal?:false/disp8
<span id="L303" class="LineNr">303 </span> <span class="subxComment"># BL = *(s-&gt;data + currs)</span>
<span id="L304" class="LineNr">304 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 3/r32/BL 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(EDI+EDX+4) to BL</span>
<span id="L305" class="LineNr">305 </span> <span class="subxComment"># if (EAX != EBX) return false</span>
<span id="L306" class="LineNr">306 </span> 39/compare 3/mod/direct 0/rm32/EAX <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"># compare EAX and EBX</span>
<span id="L307" class="LineNr">307 </span> 75/jump-if-not-equal $next-stream-line-equal?:false/disp8
<span id="L308" class="LineNr">308 </span> <span class="subxComment"># ++currf</span>
<span id="L309" class="LineNr">309 </span> 41/increment-ECX
<span id="L310" class="LineNr">310 </span> <span class="subxComment"># ++currs</span>
<span id="L311" class="LineNr">311 </span> 42/increment-EDX
<span id="L312" class="LineNr">312 </span> eb/jump $next-stream-line-equal?:loop/disp8
<span id="L313" class="LineNr">313 </span><span class="Constant">$next-stream-line-equal?:break</span>:
<span id="L314" class="LineNr">314 </span> <span class="subxComment"># ++currf</span>
<span id="L315" class="LineNr">315 </span> 41/increment-ECX
<span id="L316" class="LineNr">316 </span> <span class="subxComment"># if (currs &gt;= s-&gt;length) return true</span>
<span id="L317" class="LineNr">317 </span> 3b/compare 0/mod/indirect 7/rm32/EDI <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 EDX with *EDI</span>
<span id="L318" class="LineNr">318 </span> 7c/jump-if-lesser $next-stream-line-equal?:false/disp8
<span id="L319" class="LineNr">319 </span><span class="Constant">$next-stream-line-equal?:true</span>:
<span id="L320" class="LineNr">320 </span> b8/copy-to-EAX 1/imm32
<span id="L321" class="LineNr">321 </span> <span class="subxComment"># persist f-&gt;read on success</span>
<span id="L322" class="LineNr">322 </span> 89/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(ESI+4)</span>
<span id="L323" class="LineNr">323 </span> eb/jump $next-stream-line-equal?:end/disp8
<span id="L324" class="LineNr">324 </span><span class="Constant">$next-stream-line-equal?:false</span>:
<span id="L325" class="LineNr">325 </span> b8/copy-to-EAX 0/imm32
<span id="L326" class="LineNr">326 </span><span class="Constant">$next-stream-line-equal?:end</span>:
<span id="L327" class="LineNr">327 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L328" class="LineNr">328 </span> 5f/pop-to-EDI
<span id="L329" class="LineNr">329 </span> 5e/pop-to-ESI
<span id="L330" class="LineNr">330 </span> 5a/pop-to-EDX
<span id="L331" class="LineNr">331 </span> 59/pop-to-ECX
<span id="L332" class="LineNr">332 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L333" class="LineNr">333 </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="L334" class="LineNr">334 </span> 5d/pop-to-EBP
<span id="L335" class="LineNr">335 </span> c3/return
<span id="L336" class="LineNr">336 </span>
<span id="L337" class="LineNr">337 </span><span class="subxTest">test-next-stream-line-equal-stops-at-newline</span>:
<span id="L338" class="LineNr">338 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L339" class="LineNr">339 </span> 55/push-EBP
<span id="L340" class="LineNr">340 </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="L341" class="LineNr">341 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L342" class="LineNr">342 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L343" class="LineNr">343 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L344" class="LineNr">344 </span> <span class="subxS2Comment"># . . call</span>
<span id="L345" class="LineNr">345 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L346" class="LineNr">346 </span> <span class="subxS2Comment"># . . discard args</span>
<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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L348" class="LineNr">348 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L349" class="LineNr">349 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L350" class="LineNr">350 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L350" class="LineNr">350 </span> 68/push <span class="Constant">&quot;Abc\ndef&quot;</span>/imm32
<span id="L351" class="LineNr">351 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L352" class="LineNr">352 </span> <span class="subxS2Comment"># . . call</span>
<span id="L353" class="LineNr">353 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L354" class="LineNr">354 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L355" class="LineNr">355 </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="L356" class="LineNr">356 </span> <span class="subxS1Comment"># . write(_test-stream, Newline)</span>
<span id="L356" class="LineNr">356 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L357" class="LineNr">357 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L358" class="LineNr">358 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L358" class="LineNr">358 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L359" class="LineNr">359 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L360" class="LineNr">360 </span> <span class="subxS2Comment"># . . call</span>
<span id="L361" class="LineNr">361 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L361" class="LineNr">361 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L362" class="LineNr">362 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L363" class="LineNr">363 </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="L364" class="LineNr">364 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;def&quot;)</span>
<span id="L364" class="LineNr">364 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L365" class="LineNr">365 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L366" class="LineNr">366 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L367" class="LineNr">367 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L368" class="LineNr">368 </span> <span class="subxS2Comment"># . . call</span>
<span id="L369" class="LineNr">369 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<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"># EAX = next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L373" class="LineNr">373 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L374" class="LineNr">374 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L375" class="LineNr">375 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L376" class="LineNr">376 </span> <span class="subxS2Comment"># . . call</span>
<span id="L377" class="LineNr">377 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L378" class="LineNr">378 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L379" class="LineNr">379 </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="L380" class="LineNr">380 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L381" class="LineNr">381 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L382" class="LineNr">382 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-stops-at-newline&quot;</span>/imm32
<span id="L383" class="LineNr">383 </span> 68/push 1/imm32
<span id="L384" class="LineNr">384 </span> 50/push-EAX
<span id="L366" class="LineNr">366 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-stops-at-newline&quot;</span>/imm32
<span id="L367" class="LineNr">367 </span> 68/push 1/imm32
<span id="L368" class="LineNr">368 </span> 50/push-EAX
<span id="L369" class="LineNr">369 </span> <span class="subxS2Comment"># . . call</span>
<span id="L370" class="LineNr">370 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L371" class="LineNr">371 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L372" class="LineNr">372 </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="L373" class="LineNr">373 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L374" class="LineNr">374 </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="L375" class="LineNr">375 </span> 5d/pop-to-EBP
<span id="L376" class="LineNr">376 </span> c3/return
<span id="L377" class="LineNr">377 </span>
<span id="L378" class="LineNr">378 </span><span class="subxTest">test-next-stream-line-equal-stops-at-newline-2</span>:
<span id="L379" class="LineNr">379 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L380" class="LineNr">380 </span> 55/push-EBP
<span id="L381" class="LineNr">381 </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="L382" class="LineNr">382 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L383" class="LineNr">383 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L384" class="LineNr">384 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L385" class="LineNr">385 </span> <span class="subxS2Comment"># . . call</span>
<span id="L386" class="LineNr">386 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L386" class="LineNr">386 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L387" class="LineNr">387 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L388" class="LineNr">388 </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="L389" class="LineNr">389 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L390" class="LineNr">390 </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="L391" class="LineNr">391 </span> 5d/pop-to-EBP
<span id="L392" class="LineNr">392 </span> c3/return
<span id="L393" class="LineNr">393 </span>
<span id="L394" class="LineNr">394 </span><span class="subxTest">test-next-stream-line-equal-stops-at-newline-2</span>:
<span id="L395" class="LineNr">395 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L396" class="LineNr">396 </span> 55/push-EBP
<span id="L397" class="LineNr">397 </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="L398" class="LineNr">398 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L399" class="LineNr">399 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L388" class="LineNr">388 </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="L389" class="LineNr">389 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L390" class="LineNr">390 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L391" class="LineNr">391 </span> 68/push <span class="Constant">&quot;Abc\ndef&quot;</span>/imm32
<span id="L392" class="LineNr">392 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L393" class="LineNr">393 </span> <span class="subxS2Comment"># . . call</span>
<span id="L394" class="LineNr">394 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L395" class="LineNr">395 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L396" class="LineNr">396 </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="L397" class="LineNr">397 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L398" class="LineNr">398 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L399" class="LineNr">399 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L400" class="LineNr">400 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L401" class="LineNr">401 </span> <span class="subxS2Comment"># . . call</span>
<span id="L402" class="LineNr">402 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L402" class="LineNr">402 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L403" class="LineNr">403 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L404" class="LineNr">404 </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="L405" class="LineNr">405 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L406" class="LineNr">406 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abc&quot;)</span>
<span id="L407" class="LineNr">407 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L408" class="LineNr">408 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L409" class="LineNr">409 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L404" class="LineNr">404 </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="L405" class="LineNr">405 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L406" class="LineNr">406 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L407" class="LineNr">407 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-stops-at-newline-2&quot;</span>/imm32
<span id="L408" class="LineNr">408 </span> 68/push 0/imm32
<span id="L409" class="LineNr">409 </span> 50/push-EAX
<span id="L410" class="LineNr">410 </span> <span class="subxS2Comment"># . . call</span>
<span id="L411" class="LineNr">411 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L411" class="LineNr">411 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L412" class="LineNr">412 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L413" class="LineNr">413 </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="L414" class="LineNr">414 </span> <span class="subxS1Comment"># . write(_test-stream, Newline)</span>
<span id="L415" class="LineNr">415 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L416" class="LineNr">416 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L417" class="LineNr">417 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L418" class="LineNr">418 </span> <span class="subxS2Comment"># . . call</span>
<span id="L419" class="LineNr">419 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L420" class="LineNr">420 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L421" class="LineNr">421 </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="L422" class="LineNr">422 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;def&quot;)</span>
<span id="L423" class="LineNr">423 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L424" class="LineNr">424 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L413" class="LineNr">413 </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="L414" class="LineNr">414 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L415" class="LineNr">415 </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="L416" class="LineNr">416 </span> 5d/pop-to-EBP
<span id="L417" class="LineNr">417 </span> c3/return
<span id="L418" class="LineNr">418 </span>
<span id="L419" class="LineNr">419 </span><span class="subxTest">test-next-stream-line-equal-skips-newline</span>:
<span id="L420" class="LineNr">420 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L421" class="LineNr">421 </span> 55/push-EBP
<span id="L422" class="LineNr">422 </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="L423" class="LineNr">423 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L424" class="LineNr">424 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L425" class="LineNr">425 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L426" class="LineNr">426 </span> <span class="subxS2Comment"># . . call</span>
<span id="L427" class="LineNr">427 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L427" class="LineNr">427 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L428" class="LineNr">428 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L429" class="LineNr">429 </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="L430" class="LineNr">430 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L429" class="LineNr">429 </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="L430" class="LineNr">430 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef\n&quot;)</span>
<span id="L431" class="LineNr">431 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L432" class="LineNr">432 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L432" class="LineNr">432 </span> 68/push <span class="Constant">&quot;Abc\ndef\n&quot;</span>/imm32
<span id="L433" class="LineNr">433 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L434" class="LineNr">434 </span> <span class="subxS2Comment"># . . call</span>
<span id="L435" class="LineNr">435 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L435" class="LineNr">435 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L436" class="LineNr">436 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L437" class="LineNr">437 </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="L438" class="LineNr">438 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L438" class="LineNr">438 </span> <span class="subxComment"># next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L439" class="LineNr">439 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L440" class="LineNr">440 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-stops-at-newline-2&quot;</span>/imm32
<span id="L441" class="LineNr">441 </span> 68/push 0/imm32
<span id="L442" class="LineNr">442 </span> 50/push-EAX
<span id="L443" class="LineNr">443 </span> <span class="subxS2Comment"># . . call</span>
<span id="L444" class="LineNr">444 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L445" class="LineNr">445 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L446" class="LineNr">446 </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="L447" class="LineNr">447 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L448" class="LineNr">448 </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="L449" class="LineNr">449 </span> 5d/pop-to-EBP
<span id="L450" class="LineNr">450 </span> c3/return
<span id="L451" class="LineNr">451 </span>
<span id="L452" class="LineNr">452 </span><span class="subxTest">test-next-stream-line-equal-skips-newline</span>:
<span id="L453" class="LineNr">453 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L454" class="LineNr">454 </span> 55/push-EBP
<span id="L455" class="LineNr">455 </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="L456" class="LineNr">456 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L457" class="LineNr">457 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L458" class="LineNr">458 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L440" class="LineNr">440 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L441" class="LineNr">441 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L442" class="LineNr">442 </span> <span class="subxS2Comment"># . . call</span>
<span id="L443" class="LineNr">443 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L444" class="LineNr">444 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L445" class="LineNr">445 </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="L446" class="LineNr">446 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L447" class="LineNr">447 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L448" class="LineNr">448 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L449" class="LineNr">449 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L450" class="LineNr">450 </span> <span class="subxS2Comment"># . . call</span>
<span id="L451" class="LineNr">451 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L452" class="LineNr">452 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L453" class="LineNr">453 </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="L454" class="LineNr">454 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L455" class="LineNr">455 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L456" class="LineNr">456 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-skips-newline&quot;</span>/imm32
<span id="L457" class="LineNr">457 </span> 68/push 1/imm32
<span id="L458" class="LineNr">458 </span> 50/push-EAX
<span id="L459" class="LineNr">459 </span> <span class="subxS2Comment"># . . call</span>
<span id="L460" class="LineNr">460 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L460" class="LineNr">460 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L461" class="LineNr">461 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L462" class="LineNr">462 </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="L463" class="LineNr">463 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef\n&quot;)</span>
<span id="L464" class="LineNr">464 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abc&quot;)</span>
<span id="L465" class="LineNr">465 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L466" class="LineNr">466 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L467" class="LineNr">467 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L468" class="LineNr">468 </span> <span class="subxS2Comment"># . . call</span>
<span id="L469" class="LineNr">469 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L470" class="LineNr">470 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L471" class="LineNr">471 </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="L472" class="LineNr">472 </span> <span class="subxS1Comment"># . write(_test-stream, Newline)</span>
<span id="L462" class="LineNr">462 </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="L463" class="LineNr">463 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L464" class="LineNr">464 </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="L465" class="LineNr">465 </span> 5d/pop-to-EBP
<span id="L466" class="LineNr">466 </span> c3/return
<span id="L467" class="LineNr">467 </span>
<span id="L468" class="LineNr">468 </span><span class="subxTest">test-next-stream-line-equal-handles-final-line</span>:
<span id="L469" class="LineNr">469 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L470" class="LineNr">470 </span> 55/push-EBP
<span id="L471" class="LineNr">471 </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="L472" class="LineNr">472 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L473" class="LineNr">473 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L474" class="LineNr">474 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L475" class="LineNr">475 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L476" class="LineNr">476 </span> <span class="subxS2Comment"># . . call</span>
<span id="L477" class="LineNr">477 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L478" class="LineNr">478 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L479" class="LineNr">479 </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="L480" class="LineNr">480 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;def&quot;)</span>
<span id="L481" class="LineNr">481 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L482" class="LineNr">482 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L483" class="LineNr">483 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L484" class="LineNr">484 </span> <span class="subxS2Comment"># . . call</span>
<span id="L485" class="LineNr">485 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L486" class="LineNr">486 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L487" class="LineNr">487 </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="L488" class="LineNr">488 </span> <span class="subxS1Comment"># . write(_test-stream, Newline)</span>
<span id="L489" class="LineNr">489 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L490" class="LineNr">490 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L491" class="LineNr">491 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L492" class="LineNr">492 </span> <span class="subxS2Comment"># . . call</span>
<span id="L493" class="LineNr">493 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L494" class="LineNr">494 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L495" class="LineNr">495 </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="L496" class="LineNr">496 </span> <span class="subxComment"># next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L497" class="LineNr">497 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L498" class="LineNr">498 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L499" class="LineNr">499 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L500" class="LineNr">500 </span> <span class="subxS2Comment"># . . call</span>
<span id="L501" class="LineNr">501 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L502" class="LineNr">502 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L503" class="LineNr">503 </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="L504" class="LineNr">504 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L505" class="LineNr">505 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L506" class="LineNr">506 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L507" class="LineNr">507 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L474" class="LineNr">474 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L475" class="LineNr">475 </span> <span class="subxS2Comment"># . . call</span>
<span id="L476" class="LineNr">476 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L477" class="LineNr">477 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L478" class="LineNr">478 </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="L479" class="LineNr">479 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L480" class="LineNr">480 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L481" class="LineNr">481 </span> 68/push <span class="Constant">&quot;Abc\ndef&quot;</span>/imm32
<span id="L482" class="LineNr">482 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L483" class="LineNr">483 </span> <span class="subxS2Comment"># . . call</span>
<span id="L484" class="LineNr">484 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L485" class="LineNr">485 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L486" class="LineNr">486 </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="L487" class="LineNr">487 </span> <span class="subxComment"># next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L488" class="LineNr">488 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L489" class="LineNr">489 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L490" class="LineNr">490 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L491" class="LineNr">491 </span> <span class="subxS2Comment"># . . call</span>
<span id="L492" class="LineNr">492 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L493" class="LineNr">493 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L494" class="LineNr">494 </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="L495" class="LineNr">495 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L496" class="LineNr">496 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L497" class="LineNr">497 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L498" class="LineNr">498 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L499" class="LineNr">499 </span> <span class="subxS2Comment"># . . call</span>
<span id="L500" class="LineNr">500 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L501" class="LineNr">501 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L502" class="LineNr">502 </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="L503" class="LineNr">503 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L504" class="LineNr">504 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L505" class="LineNr">505 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-skips-newline&quot;</span>/imm32
<span id="L506" class="LineNr">506 </span> 68/push 1/imm32
<span id="L507" class="LineNr">507 </span> 50/push-EAX
<span id="L508" class="LineNr">508 </span> <span class="subxS2Comment"># . . call</span>
<span id="L509" class="LineNr">509 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L509" class="LineNr">509 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L510" class="LineNr">510 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L511" class="LineNr">511 </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="L512" class="LineNr">512 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L513" class="LineNr">513 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L514" class="LineNr">514 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-skips-newline&quot;</span>/imm32
<span id="L515" class="LineNr">515 </span> 68/push 1/imm32
<span id="L516" class="LineNr">516 </span> 50/push-EAX
<span id="L517" class="LineNr">517 </span> <span class="subxS2Comment"># . . call</span>
<span id="L518" class="LineNr">518 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L519" class="LineNr">519 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L520" class="LineNr">520 </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="L521" class="LineNr">521 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L522" class="LineNr">522 </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="L523" class="LineNr">523 </span> 5d/pop-to-EBP
<span id="L524" class="LineNr">524 </span> c3/return
<span id="L525" class="LineNr">525 </span>
<span id="L526" class="LineNr">526 </span><span class="subxTest">test-next-stream-line-equal-handles-final-line</span>:
<span id="L527" class="LineNr">527 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L528" class="LineNr">528 </span> 55/push-EBP
<span id="L529" class="LineNr">529 </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="L530" class="LineNr">530 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L531" class="LineNr">531 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L511" class="LineNr">511 </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="L512" class="LineNr">512 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L513" class="LineNr">513 </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="L514" class="LineNr">514 </span> 5d/pop-to-EBP
<span id="L515" class="LineNr">515 </span> c3/return
<span id="L516" class="LineNr">516 </span>
<span id="L517" class="LineNr">517 </span><span class="subxTest">test-next-stream-line-equal-always-fails-after-Eof</span>:
<span id="L518" class="LineNr">518 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L519" class="LineNr">519 </span> 55/push-EBP
<span id="L520" class="LineNr">520 </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="L521" class="LineNr">521 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L522" class="LineNr">522 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L523" class="LineNr">523 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L524" class="LineNr">524 </span> <span class="subxS2Comment"># . . call</span>
<span id="L525" class="LineNr">525 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L526" class="LineNr">526 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L527" class="LineNr">527 </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="L528" class="LineNr">528 </span> <span class="subxComment"># write nothing</span>
<span id="L529" class="LineNr">529 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;&quot;)</span>
<span id="L530" class="LineNr">530 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L531" class="LineNr">531 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L532" class="LineNr">532 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L533" class="LineNr">533 </span> <span class="subxS2Comment"># . . call</span>
<span id="L534" class="LineNr">534 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L534" class="LineNr">534 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L535" class="LineNr">535 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L536" class="LineNr">536 </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="L537" class="LineNr">537 </span> <span class="subxComment"># write(_test-stream, &quot;Abc\ndef&quot;)</span>
<span id="L538" class="LineNr">538 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abc&quot;)</span>
<span id="L539" class="LineNr">539 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L540" class="LineNr">540 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L541" class="LineNr">541 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L536" class="LineNr">536 </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="L537" class="LineNr">537 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L538" class="LineNr">538 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L539" class="LineNr">539 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-always-fails-after-Eof&quot;</span>/imm32
<span id="L540" class="LineNr">540 </span> 68/push 1/imm32
<span id="L541" class="LineNr">541 </span> 50/push-EAX
<span id="L542" class="LineNr">542 </span> <span class="subxS2Comment"># . . call</span>
<span id="L543" class="LineNr">543 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L543" class="LineNr">543 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L544" class="LineNr">544 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L545" class="LineNr">545 </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="L546" class="LineNr">546 </span> <span class="subxS1Comment"># . write(_test-stream, Newline)</span>
<span id="L545" class="LineNr">545 </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="L546" class="LineNr">546 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;&quot;)</span>
<span id="L547" class="LineNr">547 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L548" class="LineNr">548 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L548" class="LineNr">548 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L549" class="LineNr">549 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L550" class="LineNr">550 </span> <span class="subxS2Comment"># . . call</span>
<span id="L551" class="LineNr">551 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L551" class="LineNr">551 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L552" class="LineNr">552 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L553" class="LineNr">553 </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="L554" class="LineNr">554 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;def&quot;)</span>
<span id="L554" class="LineNr">554 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L555" class="LineNr">555 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L556" class="LineNr">556 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L557" class="LineNr">557 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L558" class="LineNr">558 </span> <span class="subxS2Comment"># . . call</span>
<span id="L559" class="LineNr">559 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L560" class="LineNr">560 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L561" class="LineNr">561 </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="L562" class="LineNr">562 </span> <span class="subxComment"># next-stream-line-equal?(_test-stream, &quot;Abc&quot;)</span>
<span id="L563" class="LineNr">563 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L564" class="LineNr">564 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L565" class="LineNr">565 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L566" class="LineNr">566 </span> <span class="subxS2Comment"># . . call</span>
<span id="L567" class="LineNr">567 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L568" class="LineNr">568 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L569" class="LineNr">569 </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="L570" class="LineNr">570 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;def&quot;)</span>
<span id="L571" class="LineNr">571 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L572" class="LineNr">572 </span> 68/push <span class="Constant">&quot;def&quot;</span>/imm32
<span id="L573" class="LineNr">573 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L574" class="LineNr">574 </span> <span class="subxS2Comment"># . . call</span>
<span id="L575" class="LineNr">575 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L576" class="LineNr">576 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L577" class="LineNr">577 </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="L578" class="LineNr">578 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L579" class="LineNr">579 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L580" class="LineNr">580 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-skips-newline&quot;</span>/imm32
<span id="L581" class="LineNr">581 </span> 68/push 1/imm32
<span id="L582" class="LineNr">582 </span> 50/push-EAX
<span id="L583" class="LineNr">583 </span> <span class="subxS2Comment"># . . call</span>
<span id="L584" class="LineNr">584 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L585" class="LineNr">585 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L586" class="LineNr">586 </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="L587" class="LineNr">587 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L588" class="LineNr">588 </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="L589" class="LineNr">589 </span> 5d/pop-to-EBP
<span id="L590" class="LineNr">590 </span> c3/return
<span id="L591" class="LineNr">591 </span>
<span id="L592" class="LineNr">592 </span><span class="subxTest">test-next-stream-line-equal-always-fails-after-Eof</span>:
<span id="L593" class="LineNr">593 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L594" class="LineNr">594 </span> 55/push-EBP
<span id="L595" class="LineNr">595 </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="L596" class="LineNr">596 </span> <span class="subxComment"># clear-stream(_test-stream)</span>
<span id="L597" class="LineNr">597 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L598" class="LineNr">598 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L599" class="LineNr">599 </span> <span class="subxS2Comment"># . . call</span>
<span id="L600" class="LineNr">600 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L601" class="LineNr">601 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L602" class="LineNr">602 </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="L603" class="LineNr">603 </span> <span class="subxComment"># write nothing</span>
<span id="L604" class="LineNr">604 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;&quot;)</span>
<span id="L605" class="LineNr">605 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L606" class="LineNr">606 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L607" class="LineNr">607 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L608" class="LineNr">608 </span> <span class="subxS2Comment"># . . call</span>
<span id="L609" class="LineNr">609 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L610" class="LineNr">610 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L611" class="LineNr">611 </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="L612" class="LineNr">612 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L613" class="LineNr">613 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L614" class="LineNr">614 </span> 68/push <span class="Constant">&quot;F - test-next-stream-line-equal-always-fails-after-Eof&quot;</span>/imm32
<span id="L615" class="LineNr">615 </span> 68/push 1/imm32
<span id="L616" class="LineNr">616 </span> 50/push-EAX
<span id="L617" class="LineNr">617 </span> <span class="subxS2Comment"># . . call</span>
<span id="L618" class="LineNr">618 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L619" class="LineNr">619 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L620" class="LineNr">620 </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="L621" class="LineNr">621 </span> <span class="subxComment"># EAX = next-stream-line-equal?(_test-stream, &quot;&quot;)</span>
<span id="L622" class="LineNr">622 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L623" class="LineNr">623 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L624" class="LineNr">624 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L625" class="LineNr">625 </span> <span class="subxS2Comment"># . . call</span>
<span id="L626" class="LineNr">626 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L627" class="LineNr">627 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L628" class="LineNr">628 </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="L629" class="LineNr">629 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L630" class="LineNr">630 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L631" class="LineNr">631 </span> 68/push <span class="Constant">&quot;F - <a href='058stream-equal.subx.html#L592'>test-next-stream-line-equal-always-fails-after-Eof</a>/2&quot;</span>/imm32
<span id="L632" class="LineNr">632 </span> 68/push 1/imm32
<span id="L633" class="LineNr">633 </span> 50/push-EAX
<span id="L634" class="LineNr">634 </span> <span class="subxS2Comment"># . . call</span>
<span id="L635" class="LineNr">635 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L636" class="LineNr">636 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L637" class="LineNr">637 </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="L638" class="LineNr">638 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L639" class="LineNr">639 </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="L640" class="LineNr">640 </span> 5d/pop-to-EBP
<span id="L641" class="LineNr">641 </span> c3/return
<span id="L642" class="LineNr">642 </span>
<span id="L643" class="LineNr">643 </span><span class="subxComment"># helper for later tests</span>
<span id="L644" class="LineNr">644 </span><span class="subxFunction">check-next-stream-line-equal</span>:
<span id="L645" class="LineNr">645 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L646" class="LineNr">646 </span> 55/push-EBP
<span id="L647" class="LineNr">647 </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="L648" class="LineNr">648 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L649" class="LineNr">649 </span> 50/push-EAX
<span id="L650" class="LineNr">650 </span> <span class="subxComment"># EAX = next-stream-line-equal?(f, s)</span>
<span id="L651" class="LineNr">651 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L652" class="LineNr">652 </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="L653" class="LineNr">653 </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="L654" class="LineNr">654 </span> <span class="subxS2Comment"># . . call</span>
<span id="L655" class="LineNr">655 </span> e8/call <a href='058stream-equal.subx.html#L234'>next-stream-line-equal?</a>/disp32
<span id="L656" class="LineNr">656 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L657" class="LineNr">657 </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="L658" class="LineNr">658 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L659" class="LineNr">659 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L660" class="LineNr">660 </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="L661" class="LineNr">661 </span> 68/push 1/imm32
<span id="L662" class="LineNr">662 </span> 50/push-EAX
<span id="L663" class="LineNr">663 </span> <span class="subxS2Comment"># . . call</span>
<span id="L664" class="LineNr">664 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L665" class="LineNr">665 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L666" class="LineNr">666 </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="L667" class="LineNr">667 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L668" class="LineNr">668 </span> 58/pop-to-EAX
<span id="L669" class="LineNr">669 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L670" class="LineNr">670 </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="L671" class="LineNr">671 </span> 5d/pop-to-EBP
<span id="L672" class="LineNr">672 </span> c3/return
<span id="L673" class="LineNr">673 </span>
<span id="L674" class="LineNr">674 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L556" class="LineNr">556 </span> 68/push <span class="Constant">&quot;F - <a href='058stream-equal.subx.html#L517'>test-next-stream-line-equal-always-fails-after-Eof</a>/2&quot;</span>/imm32
<span id="L557" class="LineNr">557 </span> 68/push 1/imm32
<span id="L558" class="LineNr">558 </span> 50/push-EAX
<span id="L559" class="LineNr">559 </span> <span class="subxS2Comment"># . . call</span>
<span id="L560" class="LineNr">560 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L561" class="LineNr">561 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L562" class="LineNr">562 </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="L563" class="LineNr">563 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L564" class="LineNr">564 </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="L565" class="LineNr">565 </span> 5d/pop-to-EBP
<span id="L566" class="LineNr">566 </span> c3/return
<span id="L567" class="LineNr">567 </span>
<span id="L568" class="LineNr">568 </span><span class="subxComment"># helper for later tests</span>
<span id="L569" class="LineNr">569 </span><span class="subxFunction">check-next-stream-line-equal</span>:
<span id="L570" class="LineNr">570 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L571" class="LineNr">571 </span> 55/push-EBP
<span id="L572" class="LineNr">572 </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="L573" class="LineNr">573 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L574" class="LineNr">574 </span> 50/push-EAX
<span id="L575" class="LineNr">575 </span> <span class="subxComment"># EAX = next-stream-line-equal?(f, s)</span>
<span id="L576" class="LineNr">576 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L577" class="LineNr">577 </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="L578" class="LineNr">578 </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="L579" class="LineNr">579 </span> <span class="subxS2Comment"># . . call</span>
<span id="L580" class="LineNr">580 </span> e8/call <a href='058stream-equal.subx.html#L235'>next-stream-line-equal?</a>/disp32
<span id="L581" class="LineNr">581 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L582" class="LineNr">582 </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="L583" class="LineNr">583 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L584" class="LineNr">584 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L585" class="LineNr">585 </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="L586" class="LineNr">586 </span> 68/push 1/imm32
<span id="L587" class="LineNr">587 </span> 50/push-EAX
<span id="L588" class="LineNr">588 </span> <span class="subxS2Comment"># . . call</span>
<span id="L589" class="LineNr">589 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L590" class="LineNr">590 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L591" class="LineNr">591 </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="L592" class="LineNr">592 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L593" class="LineNr">593 </span> 58/pop-to-EAX
<span id="L594" class="LineNr">594 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L595" class="LineNr">595 </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="L596" class="LineNr">596 </span> 5d/pop-to-EBP
<span id="L597" class="LineNr">597 </span> c3/return
<span id="L598" class="LineNr">598 </span>
<span id="L599" class="LineNr">599 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -171,7 +171,7 @@ if ('onhashchange' in window) {
<span id="L110" class="LineNr">110 </span> <span class="subxComment"># otherwise:</span>
<span id="L111" class="LineNr">111 </span> <span class="subxComment"># ed-&gt;value = value+1</span>
<span id="L112" class="LineNr">112 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to ECX</span>
<span id="L113" class="LineNr">113 </span> 41/inc-ECX
<span id="L113" class="LineNr">113 </span> 41/increment-ECX
<span id="L114" class="LineNr">114 </span> 89/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(EAX+4)</span>
<span id="L115" class="LineNr">115 </span> <span class="subxComment"># perform a non-local jump to ed-&gt;target</span>
<span id="L116" class="LineNr">116 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <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 *EAX to ESP</span>

View File

@ -23,7 +23,6 @@ a { color:inherit; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -165,153 +164,128 @@ if ('onhashchange' in window) {
<span id="L103" class="LineNr">103 </span><span class="Constant">$read-line:abort</span>:
<span id="L104" class="LineNr">104 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L106" class="LineNr">106 </span> 68/push <span class="Constant">&quot;read-line: line too long&quot;</span>/imm32
<span id="L106" class="LineNr">106 </span> 68/push <span class="Constant">&quot;read-line: line too long\n&quot;</span>/imm32
<span id="L107" class="LineNr">107 </span> 68/push 2/imm32/stderr
<span id="L108" class="LineNr">108 </span> <span class="subxS2Comment"># . . call</span>
<span id="L109" class="LineNr">109 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L110" class="LineNr">110 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L111" class="LineNr">111 </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="L112" class="LineNr">112 </span> <span class="subxS1Comment"># . _write(2/stderr, Newline)</span>
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L114" class="LineNr">114 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L115" class="LineNr">115 </span> 68/push 2/imm32/stderr
<span id="L116" class="LineNr">116 </span> <span class="subxS2Comment"># . . call</span>
<span id="L117" class="LineNr">117 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L119" class="LineNr">119 </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="L120" class="LineNr">120 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L121" class="LineNr">121 </span> bb/copy-to-EBX 1/imm32
<span id="L122" class="LineNr">122 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L123" class="LineNr">123 </span> cd/syscall 0x80/imm8
<span id="L124" class="LineNr">124 </span> <span class="subxComment"># never gets here</span>
<span id="L125" class="LineNr">125 </span>
<span id="L126" class="LineNr">126 </span><span class="subxTest">test-read-line</span>:
<span id="L127" class="LineNr">127 </span> <span class="subxH1Comment"># - check that read-line stops at a newline</span>
<span id="L128" class="LineNr">128 </span> <span class="subxComment"># setup</span>
<span id="L129" class="LineNr">129 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L131" class="LineNr">131 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . call</span>
<span id="L133" class="LineNr">133 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L134" class="LineNr">134 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L135" class="LineNr">135 </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="L136" class="LineNr">136 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L138" class="LineNr">138 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L139" class="LineNr">139 </span> 05/add-to-EAX 4/imm32
<span id="L140" class="LineNr">140 </span> 50/push-EAX
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . call</span>
<span id="L142" class="LineNr">142 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L144" class="LineNr">144 </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="L145" class="LineNr">145 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L146" class="LineNr">146 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L147" class="LineNr">147 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L112" class="LineNr">112 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L113" class="LineNr">113 </span> bb/copy-to-EBX 1/imm32
<span id="L114" class="LineNr">114 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L115" class="LineNr">115 </span> cd/syscall 0x80/imm8
<span id="L116" class="LineNr">116 </span> <span class="subxComment"># never gets here</span>
<span id="L117" class="LineNr">117 </span>
<span id="L118" class="LineNr">118 </span><span class="subxTest">test-read-line</span>:
<span id="L119" class="LineNr">119 </span> <span class="subxH1Comment"># - check that read-line stops at a newline</span>
<span id="L120" class="LineNr">120 </span> <span class="subxComment"># setup</span>
<span id="L121" class="LineNr">121 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L123" class="LineNr">123 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . call</span>
<span id="L125" class="LineNr">125 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L127" class="LineNr">127 </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="L128" class="LineNr">128 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L130" class="LineNr">130 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L131" class="LineNr">131 </span> 05/add-to-EAX 4/imm32
<span id="L132" class="LineNr">132 </span> 50/push-EAX
<span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . call</span>
<span id="L134" class="LineNr">134 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L136" class="LineNr">136 </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="L137" class="LineNr">137 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L139" class="LineNr">139 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . call</span>
<span id="L141" class="LineNr">141 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L143" class="LineNr">143 </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="L144" class="LineNr">144 </span> <span class="subxComment"># write(_test-stream, &quot;ab\ncd&quot;)</span>
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L146" class="LineNr">146 </span> 68/push <span class="Constant">&quot;ab\ncd&quot;</span>/imm32
<span id="L147" class="LineNr">147 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . call</span>
<span id="L149" class="LineNr">149 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L149" class="LineNr">149 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L151" class="LineNr">151 </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="L152" class="LineNr">152 </span> <span class="subxComment"># write(_test-stream, &quot;ab\ncd&quot;)</span>
<span id="L153" class="LineNr">153 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;ab&quot;)</span>
<span id="L151" class="LineNr">151 </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="L152" class="LineNr">152 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L153" class="LineNr">153 </span> <span class="subxS1Comment"># . EAX = read-line(_test-buffered-file, _test-tmp-stream)</span>
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L155" class="LineNr">155 </span> 68/push <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L156" class="LineNr">156 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L155" class="LineNr">155 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L156" class="LineNr">156 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . call</span>
<span id="L158" class="LineNr">158 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L158" class="LineNr">158 </span> e8/call <a href='071read-line.subx.html#L16'>read-line</a>/disp32
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L160" class="LineNr">160 </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="L161" class="LineNr">161 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;\n&quot;)</span>
<span id="L161" class="LineNr">161 </span> <span class="subxComment"># check-next-stream-line-equal(_test-tmp-stream, &quot;ab&quot;, msg)</span>
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L163" class="LineNr">163 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L164" class="LineNr">164 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . call</span>
<span id="L166" class="LineNr">166 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L168" class="LineNr">168 </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="L169" class="LineNr">169 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;cd&quot;)</span>
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L171" class="LineNr">171 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L172" class="LineNr">172 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . call</span>
<span id="L174" class="LineNr">174 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L176" class="LineNr">176 </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="L177" class="LineNr">177 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L178" class="LineNr">178 </span> <span class="subxS1Comment"># . EAX = read-line(_test-buffered-file, _test-tmp-stream)</span>
<span id="L179" class="LineNr">179 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L180" class="LineNr">180 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L181" class="LineNr">181 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . call</span>
<span id="L183" class="LineNr">183 </span> e8/call <a href='071read-line.subx.html#L16'>read-line</a>/disp32
<span id="L184" class="LineNr">184 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L185" class="LineNr">185 </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="L186" class="LineNr">186 </span> <span class="subxComment"># check-next-stream-line-equal(_test-tmp-stream, &quot;ab&quot;, msg)</span>
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L188" class="LineNr">188 </span> 68/push <span class="Constant">&quot;F - test-read-line&quot;</span>/imm32
<span id="L189" class="LineNr">189 </span> 68/push <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L190" class="LineNr">190 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . call</span>
<span id="L192" class="LineNr">192 </span> e8/call <a href='058stream-equal.subx.html#L644'>check-next-stream-line-equal</a>/disp32
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L194" class="LineNr">194 </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="L195" class="LineNr">195 </span> <span class="subxComment"># end</span>
<span id="L196" class="LineNr">196 </span> c3/return
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="subxTest">test-read-line-reads-final-line-until-Eof</span>:
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># setup</span>
<span id="L200" class="LineNr">200 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L202" class="LineNr">202 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L203" class="LineNr">203 </span> <span class="subxS2Comment"># . . call</span>
<span id="L204" class="LineNr">204 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L207" class="LineNr">207 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L163" class="LineNr">163 </span> 68/push <span class="Constant">&quot;F - test-read-line&quot;</span>/imm32
<span id="L164" class="LineNr">164 </span> 68/push <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L165" class="LineNr">165 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . call</span>
<span id="L167" class="LineNr">167 </span> e8/call <a href='058stream-equal.subx.html#L569'>check-next-stream-line-equal</a>/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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L170" class="LineNr">170 </span> <span class="subxComment"># end</span>
<span id="L171" class="LineNr">171 </span> c3/return
<span id="L172" class="LineNr">172 </span>
<span id="L173" class="LineNr">173 </span><span class="subxTest">test-read-line-reads-final-line-until-Eof</span>:
<span id="L174" class="LineNr">174 </span> <span class="subxComment"># setup</span>
<span id="L175" class="LineNr">175 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L177" class="LineNr">177 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . call</span>
<span id="L179" class="LineNr">179 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L181" class="LineNr">181 </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="L182" class="LineNr">182 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L185" class="LineNr">185 </span> 05/add-to-EAX 4/imm32
<span id="L186" class="LineNr">186 </span> 50/push-EAX
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . call</span>
<span id="L188" class="LineNr">188 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L190" class="LineNr">190 </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="L191" class="LineNr">191 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L192" class="LineNr">192 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L193" class="LineNr">193 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . call</span>
<span id="L195" class="LineNr">195 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L197" class="LineNr">197 </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="L198" class="LineNr">198 </span> <span class="subxComment"># write(_test-stream, &quot;cd&quot;)</span>
<span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L200" class="LineNr">200 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L201" class="LineNr">201 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </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="L206" class="LineNr">206 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L207" class="LineNr">207 </span> <span class="subxS1Comment"># . EAX = read-line(_test-buffered-file, _test-tmp-stream)</span>
<span id="L208" class="LineNr">208 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L209" class="LineNr">209 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L210" class="LineNr">210 </span> 05/add-to-EAX 4/imm32
<span id="L211" class="LineNr">211 </span> 50/push-EAX
<span id="L212" class="LineNr">212 </span> <span class="subxS2Comment"># . . call</span>
<span id="L213" class="LineNr">213 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L214" class="LineNr">214 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L215" class="LineNr">215 </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="L216" class="LineNr">216 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L217" class="LineNr">217 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L218" class="LineNr">218 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L219" class="LineNr">219 </span> <span class="subxS2Comment"># . . call</span>
<span id="L220" class="LineNr">220 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L223" class="LineNr">223 </span> <span class="subxComment"># write(_test-stream, &quot;cd&quot;)</span>
<span id="L224" class="LineNr">224 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L225" class="LineNr">225 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L226" class="LineNr">226 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L227" class="LineNr">227 </span> <span class="subxS2Comment"># . . call</span>
<span id="L228" class="LineNr">228 </span> e8/call <a href='057write.subx.html#L24'>write</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> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L231" class="LineNr">231 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS1Comment"># . EAX = read-line(_test-buffered-file, _test-tmp-stream)</span>
<span id="L233" class="LineNr">233 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L234" class="LineNr">234 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L235" class="LineNr">235 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . call</span>
<span id="L237" class="LineNr">237 </span> e8/call <a href='071read-line.subx.html#L16'>read-line</a>/disp32
<span id="L238" class="LineNr">238 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L239" class="LineNr">239 </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="L240" class="LineNr">240 </span> <span class="subxComment"># check-stream-equal(_test-tmp-stream, &quot;cd&quot;, msg)</span>
<span id="L241" class="LineNr">241 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L242" class="LineNr">242 </span> 68/push <span class="Constant">&quot;F - test-read-line-reads-final-line-until-Eof&quot;</span>/imm32
<span id="L243" class="LineNr">243 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L244" class="LineNr">244 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L245" class="LineNr">245 </span> <span class="subxS2Comment"># . . call</span>
<span id="L246" class="LineNr">246 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L247" class="LineNr">247 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L248" class="LineNr">248 </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="L249" class="LineNr">249 </span> <span class="subxComment"># end</span>
<span id="L250" class="LineNr">250 </span> c3/return
<span id="L251" class="LineNr">251 </span>
<span id="L252" class="LineNr">252 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L209" class="LineNr">209 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L210" class="LineNr">210 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L211" class="LineNr">211 </span> <span class="subxS2Comment"># . . call</span>
<span id="L212" class="LineNr">212 </span> e8/call <a href='071read-line.subx.html#L16'>read-line</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"># check-stream-equal(_test-tmp-stream, &quot;cd&quot;, msg)</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;F - test-read-line-reads-final-line-until-Eof&quot;</span>/imm32
<span id="L218" class="LineNr">218 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L219" class="LineNr">219 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . call</span>
<span id="L221" class="LineNr">221 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L222" class="LineNr">222 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L223" class="LineNr">223 </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="L224" class="LineNr">224 </span> <span class="subxComment"># end</span>
<span id="L225" class="LineNr">225 </span> c3/return
<span id="L226" class="LineNr">226 </span>
<span id="L227" class="LineNr">227 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -432,7 +432,7 @@ if ('onhashchange' in window) {
<span id="L372" class="LineNr">372 </span> 39/compare 3/mod/direct 0/rm32/EAX <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 EAX and EDX</span>
<span id="L373" class="LineNr">373 </span> 75/jump-if-not-equal $skip-chars-matching:end/disp8
<span id="L374" class="LineNr">374 </span> <span class="subxComment"># ++in-&gt;read</span>
<span id="L375" class="LineNr">375 </span> 41/inc-ECX
<span id="L375" class="LineNr">375 </span> 41/increment-ECX
<span id="L376" class="LineNr">376 </span> eb/jump $skip-chars-matching:loop/disp8
<span id="L377" class="LineNr">377 </span><span class="Constant">$skip-chars-matching:end</span>:
<span id="L378" class="LineNr">378 </span> <span class="subxComment"># persist in-&gt;read</span>
@ -556,7 +556,7 @@ if ('onhashchange' in window) {
<span id="L496" class="LineNr">496 </span> 39/compare 3/mod/direct 0/rm32/EAX <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 EAX and EDX</span>
<span id="L497" class="LineNr">497 </span> 74/jump-if-equal $skip-chars-not-matching:end/disp8
<span id="L498" class="LineNr">498 </span> <span class="subxComment"># ++in-&gt;read</span>
<span id="L499" class="LineNr">499 </span> 41/inc-ECX
<span id="L499" class="LineNr">499 </span> 41/increment-ECX
<span id="L500" class="LineNr">500 </span> eb/jump $skip-chars-not-matching:loop/disp8
<span id="L501" class="LineNr">501 </span><span class="Constant">$skip-chars-not-matching:end</span>:
<span id="L502" class="LineNr">502 </span> <span class="subxComment"># persist in-&gt;read</span>
@ -724,7 +724,7 @@ if ('onhashchange' in window) {
<span id="L664" class="LineNr">664 </span> 3d/compare-EAX-and 0x0d/imm32/cr
<span id="L665" class="LineNr">665 </span> 74/jump-if-equal $skip-chars-not-matching-whitespace:end/disp8
<span id="L666" class="LineNr">666 </span> <span class="subxComment"># ++in-&gt;read</span>
<span id="L667" class="LineNr">667 </span> 41/inc-ECX
<span id="L667" class="LineNr">667 </span> 41/increment-ECX
<span id="L668" class="LineNr">668 </span> eb/jump $skip-chars-not-matching-whitespace:loop/disp8
<span id="L669" class="LineNr">669 </span><span class="Constant">$skip-chars-not-matching-whitespace:end</span>:
<span id="L670" class="LineNr">670 </span> <span class="subxComment"># persist in-&gt;read</span>
@ -764,7 +764,7 @@ if ('onhashchange' in window) {
<span id="L704" class="LineNr">704 </span> 39/compare 3/mod/direct 3/rm32/EBX <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 EBX and EDX</span>
<span id="L705" class="LineNr">705 </span> 75/jump-if-not-equal $skip-chars-matching-in-slice:end/disp8
<span id="L706" class="LineNr">706 </span> <span class="subxComment"># ++curr</span>
<span id="L707" class="LineNr">707 </span> 40/inc-EAX
<span id="L707" class="LineNr">707 </span> 40/increment-EAX
<span id="L708" class="LineNr">708 </span> eb/jump $skip-chars-matching-in-slice:loop/disp8
<span id="L709" class="LineNr">709 </span><span class="Constant">$skip-chars-matching-in-slice:end</span>:
<span id="L710" class="LineNr">710 </span> <span class="subxS1Comment"># . restore registers</span>
@ -860,7 +860,7 @@ if ('onhashchange' in window) {
<span id="L800" class="LineNr">800 </span> 39/compare 3/mod/direct 3/rm32/EBX <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 EBX and EDX</span>
<span id="L801" class="LineNr">801 </span> 74/jump-if-equal $skip-chars-not-matching-in-slice:end/disp8
<span id="L802" class="LineNr">802 </span> <span class="subxComment"># ++curr</span>
<span id="L803" class="LineNr">803 </span> 40/inc-EAX
<span id="L803" class="LineNr">803 </span> 40/increment-EAX
<span id="L804" class="LineNr">804 </span> eb/jump $skip-chars-not-matching-in-slice:loop/disp8
<span id="L805" class="LineNr">805 </span><span class="Constant">$skip-chars-not-matching-in-slice:end</span>:
<span id="L806" class="LineNr">806 </span> <span class="subxS1Comment"># . restore registers</span>

View File

@ -0,0 +1,325 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/074print-int-decimal.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Folded { color: #080808; background-color: #949494; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
<script type='text/javascript'>
<!--
/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
var lineNum;
lineNum = window.location.hash;
lineNum = lineNum.substr(1); /* strip off '#' */
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(lineNum);
/* Always jump to new location even if the line was hidden inside a fold, or
* we corrected the raw number to a line ID.
*/
if (lineElem) {
lineElem.scrollIntoView(true);
}
return true;
}
if ('onhashchange' in window) {
window.onhashchange = JumpToLine;
}
-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/subx/074print-int-decimal.subx'>https://github.com/akkartik/mu/blob/master/subx/074print-int-decimal.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Helper to print an int32 in decimal.</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span>== code
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># instruction effective address register displacement immediate</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </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="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">#? e8/call test-print-int32-decimal/disp32</span>
<span id="L10" class="LineNr"> 10 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L11" class="LineNr"> 11 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L12" class="LineNr"> 12 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L13" class="LineNr"> 13 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L14" class="LineNr"> 14 </span>
<span id="L15" class="LineNr"> 15 </span><span class="subxFunction">print-int32-decimal</span>: <span class="subxComment"># out : (address stream), n : int32</span>
<span id="L16" class="LineNr"> 16 </span> <span class="subxComment"># works by generating characters from lowest to highest and pushing them</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># to the stack, before popping them one by one into the stream</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment">#</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># pseudocode:</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># copy ESP to EBX</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># EAX = n</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># while true</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># sign-extend EAX into EDX</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># EAX, EDX = EAX/10, EAX%10</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># push EDX</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># if n &lt; 0</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment"># push '-' - 0x30 = -3</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># w/EAX = out-&gt;write</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># max/ECX = out-&gt;length</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># curr/EDI = out-&gt;data[out-&gt;write]</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># while true</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># if (ESP == EBX) break</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># pop into EDX</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># EDX += '0' # convert decimal digit to ascii</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment"># *curr = DL</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxComment"># ++curr</span>
<span id="L39" class="LineNr"> 39 </span> <span class="subxComment"># ++w</span>
<span id="L40" class="LineNr"> 40 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxComment">#</span>
<span id="L42" class="LineNr"> 42 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L43" class="LineNr"> 43 </span> 55/push-EBP
<span id="L44" class="LineNr"> 44 </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="L45" class="LineNr"> 45 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L46" class="LineNr"> 46 </span> 50/push-EAX
<span id="L47" class="LineNr"> 47 </span> 51/push-ECX
<span id="L48" class="LineNr"> 48 </span> 52/push-EDX
<span id="L49" class="LineNr"> 49 </span> 53/push-EBX
<span id="L50" class="LineNr"> 50 </span> 57/push-EDI
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># copy ESP to EBX</span>
<span id="L52" class="LineNr"> 52 </span> 89/copy 3/mod/direct 3/rm32/EBX <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 EBX</span>
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># ten/ECX = 10</span>
<span id="L54" class="LineNr"> 54 </span> b9/copy-to-ECX 0xa/imm32
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># EAX = |n|</span>
<span id="L56" class="LineNr"> 56 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L57" class="LineNr"> 57 </span> 3d/compare-EAX-with 0/imm32
<span id="L58" class="LineNr"> 58 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:read-loop/disp8
<span id="L59" class="LineNr"> 59 </span><span class="Constant">$print-int32-decimal:negative</span>:
<span id="L60" class="LineNr"> 60 </span> f7 3/subop/negate 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># negate EAX</span>
<span id="L61" class="LineNr"> 61 </span><span class="Constant">$print-int32-decimal:read-loop</span>:
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L63" class="LineNr"> 63 </span> 3d/compare-EAX-and 0/imm32
<span id="L64" class="LineNr"> 64 </span> 74/jump-if-equal $print-int32-decimal:read-break/disp8
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># sign-extend</span>
<span id="L66" class="LineNr"> 66 </span> 99/sign-extend-EAX-into-EDX
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># EAX, EDX = divide-with-remainder EAX/ten, EAX%ten</span>
<span id="L68" class="LineNr"> 68 </span> f7 7/subop/divide-by 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># divide EDX:EAX by ECX, storing quotient in EAX and remainder in EDX</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># push EDX</span>
<span id="L70" class="LineNr"> 70 </span> 52/push-EDX
<span id="L71" class="LineNr"> 71 </span> eb/jump $print-int32-decimal:read-loop/disp8
<span id="L72" class="LineNr"> 72 </span><span class="Constant">$print-int32-decimal:read-break</span>:
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># if (n &lt; 0) push('-')</span>
<span id="L74" class="LineNr"> 74 </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> 0xc/disp8 0/imm32 <span class="subxComment"># compare *(EBP+12)</span>
<span id="L75" class="LineNr"> 75 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:<a href='057write.subx.html#L24'>write</a>/disp8
<span id="L76" class="LineNr"> 76 </span><span class="Constant">$print-int32-decimal:push-negative</span>:
<span id="L77" class="LineNr"> 77 </span> 68/push -3/imm32/dash-minus-zero
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># fall through</span>
<span id="L79" class="LineNr"> 79 </span><span class="Constant">$print-int32-decimal:<a href='057write.subx.html#L24'>write</a></span>:
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># EDI = out</span>
<span id="L81" class="LineNr"> 81 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EDI</span>
<span id="L82" class="LineNr"> 82 </span> <span class="subxComment"># max/ECX = &amp;out-&gt;data[out-&gt;length]</span>
<span id="L83" class="LineNr"> 83 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+8) to ECX</span>
<span id="L84" class="LineNr"> 84 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+ECX+12 to ECX</span>
<span id="L85" class="LineNr"> 85 </span> <span class="subxComment"># w/EAX = out-&gt;write</span>
<span id="L86" class="LineNr"> 86 </span> 8b/copy 0/mod/indirect 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 *EDI to EAX</span>
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># curr/EDI = &amp;out-&gt;data[out-&gt;write]</span>
<span id="L88" class="LineNr"> 88 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 0/index/EAX <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+EAX+12 to EDI</span>
<span id="L89" class="LineNr"> 89 </span><span class="Constant">$print-int32-decimal:write-loop</span>:
<span id="L90" class="LineNr"> 90 </span> <span class="subxComment"># if (ESP == EBX) break</span>
<span id="L91" class="LineNr"> 91 </span> 39/compare 3/mod/direct 4/rm32/ESP <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"># compare ESP and EBX</span>
<span id="L92" class="LineNr"> 92 </span> 74/jump-if-equal $print-int32-decimal:write-break/disp8
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L94" class="LineNr"> 94 </span> 39/compare 3/mod/direct 7/rm32/EDI <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"># compare EDI and ECX</span>
<span id="L95" class="LineNr"> 95 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:abort/disp8
<span id="L96" class="LineNr"> 96 </span> <span class="subxComment"># pop into EDX</span>
<span id="L97" class="LineNr"> 97 </span> 5a/pop-into-EDX
<span id="L98" class="LineNr"> 98 </span> <span class="subxComment"># EDX += '0'</span>
<span id="L99" class="LineNr"> 99 </span> 81 0/subop/add 3/mod/direct 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x30/imm32/zero <span class="subxComment"># add to EDX</span>
<span id="L100" class="LineNr">100 </span><span class="Constant">$print-int32-decimal:write-char</span>:
<span id="L101" class="LineNr">101 </span> <span class="subxComment"># *curr = DL</span>
<span id="L102" class="LineNr">102 </span> 88/copy-byte 0/mod/indirect 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/DL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy DL to byte at *ECX</span>
<span id="L103" class="LineNr">103 </span> <span class="subxComment"># ++curr</span>
<span id="L104" class="LineNr">104 </span> 47/increment-EDI
<span id="L105" class="LineNr">105 </span> <span class="subxComment"># ++w</span>
<span id="L106" class="LineNr">106 </span> 40/increment-EAX
<span id="L107" class="LineNr">107 </span> eb/jump $print-int32-decimal:write-loop/disp8
<span id="L108" class="LineNr">108 </span><span class="Constant">$print-int32-decimal:write-break</span>:
<span id="L109" class="LineNr">109 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L110" class="LineNr">110 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EDI</span>
<span id="L111" class="LineNr">111 </span> 89/copy 0/mod/indirect 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="L112" class="LineNr">112 </span><span class="Constant">$print-int32-decimal:end</span>:
<span id="L113" class="LineNr">113 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L114" class="LineNr">114 </span> 5f/pop-to-EDI
<span id="L115" class="LineNr">115 </span> 5b/pop-to-EBX
<span id="L116" class="LineNr">116 </span> 5a/pop-to-EDX
<span id="L117" class="LineNr">117 </span> 59/pop-to-ECX
<span id="L118" class="LineNr">118 </span> 58/pop-to-EAX
<span id="L119" class="LineNr">119 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L120" class="LineNr">120 </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="L121" class="LineNr">121 </span> 5d/pop-to-EBP
<span id="L122" class="LineNr">122 </span> c3/return
<span id="L123" class="LineNr">123 </span>
<span id="L124" class="LineNr">124 </span><span class="Constant">$print-int32-decimal:abort</span>:
<span id="L125" class="LineNr">125 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L127" class="LineNr">127 </span> 68/push <span class="Constant">&quot;print-int32-decimal: out of space&quot;</span>/imm32
<span id="L128" class="LineNr">128 </span> 68/push 2/imm32/stderr
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . call</span>
<span id="L130" class="LineNr">130 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L132" class="LineNr">132 </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="L133" class="LineNr">133 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L134" class="LineNr">134 </span> bb/copy-to-EBX 1/imm32
<span id="L135" class="LineNr">135 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L136" class="LineNr">136 </span> cd/syscall 0x80/imm8
<span id="L137" class="LineNr">137 </span> <span class="subxComment"># never gets here</span>
<span id="L138" class="LineNr">138 </span>
<span id="L139" class="LineNr">139 </span><span class="subxTest">test-print-int32-decimal</span>:
<span id="L140" class="LineNr">140 </span> <span class="subxComment"># check that a single-digit number converts correctly</span>
<span id="L141" class="LineNr">141 </span> <span class="subxComment"># setup</span>
<span id="L142" class="LineNr">142 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L144" class="LineNr">144 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . call</span>
<span id="L146" class="LineNr">146 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L148" class="LineNr">148 </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="L149" class="LineNr">149 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 9)</span>
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L151" class="LineNr">151 </span> 68/push 9/imm32
<span id="L152" class="LineNr">152 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . call</span>
<span id="L154" class="LineNr">154 </span> e8/call <a href='074print-int-decimal.subx.html#L15'>print-int32-decimal</a>/disp32
<span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L156" class="LineNr">156 </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="L157" class="LineNr">157 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;9&quot;, msg)</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L159" class="LineNr">159 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal&quot;</span>/imm32
<span id="L160" class="LineNr">160 </span> 68/push <span class="Constant">&quot;9&quot;</span>/imm32
<span id="L161" class="LineNr">161 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . call</span>
<span id="L163" class="LineNr">163 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L165" class="LineNr">165 </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="L166" class="LineNr">166 </span> <span class="subxS1Comment"># . end</span>
<span id="L167" class="LineNr">167 </span> c3/return
<span id="L168" class="LineNr">168 </span>
<span id="L169" class="LineNr">169 </span><span class="subxTest">test-print-int32-decimal-multiple-digits</span>:
<span id="L170" class="LineNr">170 </span> <span class="subxComment"># check that a multi-digit number converts correctly</span>
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># setup</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L174" class="LineNr">174 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . call</span>
<span id="L176" class="LineNr">176 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/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="subxComment"># print-int32-decimal(_test-stream, 10)</span>
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L181" class="LineNr">181 </span> 68/push 0xa/imm32
<span id="L182" class="LineNr">182 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . call</span>
<span id="L184" class="LineNr">184 </span> e8/call <a href='074print-int-decimal.subx.html#L15'>print-int32-decimal</a>/disp32
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L186" class="LineNr">186 </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="L187" class="LineNr">187 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;10&quot;, msg)</span>
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L189" class="LineNr">189 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-multiple-digits&quot;</span>/imm32
<span id="L190" class="LineNr">190 </span> 68/push <span class="Constant">&quot;10&quot;</span>/imm32
<span id="L191" class="LineNr">191 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L192" class="LineNr">192 </span> <span class="subxS2Comment"># . . call</span>
<span id="L193" class="LineNr">193 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L195" class="LineNr">195 </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="L196" class="LineNr">196 </span> <span class="subxS1Comment"># . end</span>
<span id="L197" class="LineNr">197 </span> c3/return
<span id="L198" class="LineNr">198 </span>
<span id="L199" class="LineNr">199 </span><span class="subxTest">test-print-int32-decimal-negative</span>:
<span id="L200" class="LineNr">200 </span> <span class="subxComment"># check that a negative single-digit number converts correctly</span>
<span id="L201" class="LineNr">201 </span> <span class="subxComment"># setup</span>
<span id="L202" class="LineNr">202 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L203" class="LineNr">203 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L204" class="LineNr">204 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . call</span>
<span id="L206" class="LineNr">206 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L207" class="LineNr">207 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L208" class="LineNr">208 </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="L209" class="LineNr">209 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -9)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </span> 68/push -9/imm32
<span id="L212" class="LineNr">212 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . call</span>
<span id="L214" class="LineNr">214 </span> e8/call <a href='074print-int-decimal.subx.html#L15'>print-int32-decimal</a>/disp32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L216" class="LineNr">216 </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="L217" class="Folded">217 </span><span class="Folded">+-- 26 lines: #? # dump _test-stream ---------------------------------------------------------------------------------------------------------------------</span>
<span id="L243" class="LineNr">243 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;-9&quot;, msg)</span>
<span id="L244" class="LineNr">244 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L245" class="LineNr">245 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-negative&quot;</span>/imm32
<span id="L246" class="LineNr">246 </span> 68/push <span class="Constant">&quot;-9&quot;</span>/imm32
<span id="L247" class="LineNr">247 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L248" class="LineNr">248 </span> <span class="subxS2Comment"># . . call</span>
<span id="L249" class="LineNr">249 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L250" class="LineNr">250 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L251" class="LineNr">251 </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="L252" class="LineNr">252 </span> <span class="subxS1Comment"># . end</span>
<span id="L253" class="LineNr">253 </span> c3/return
<span id="L254" class="LineNr">254 </span>
<span id="L255" class="LineNr">255 </span><span class="subxTest">test-print-int32-decimal-negative-multiple-digits</span>:
<span id="L256" class="LineNr">256 </span> <span class="subxComment"># check that a multi-digit number converts correctly</span>
<span id="L257" class="LineNr">257 </span> <span class="subxComment"># setup</span>
<span id="L258" class="LineNr">258 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L259" class="LineNr">259 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L260" class="LineNr">260 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L261" class="LineNr">261 </span> <span class="subxS2Comment"># . . call</span>
<span id="L262" class="LineNr">262 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L263" class="LineNr">263 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L264" class="LineNr">264 </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="L265" class="LineNr">265 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -10)</span>
<span id="L266" class="LineNr">266 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L267" class="LineNr">267 </span> 68/push -0xa/imm32
<span id="L268" class="LineNr">268 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L269" class="LineNr">269 </span> <span class="subxS2Comment"># . . call</span>
<span id="L270" class="LineNr">270 </span> e8/call <a href='074print-int-decimal.subx.html#L15'>print-int32-decimal</a>/disp32
<span id="L271" class="LineNr">271 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L272" class="LineNr">272 </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="L273" class="LineNr">273 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;-10&quot;, msg)</span>
<span id="L274" class="LineNr">274 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L275" class="LineNr">275 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-negative-multiple-digits&quot;</span>/imm32
<span id="L276" class="LineNr">276 </span> 68/push <span class="Constant">&quot;-10&quot;</span>/imm32
<span id="L277" class="LineNr">277 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L278" class="LineNr">278 </span> <span class="subxS2Comment"># . . call</span>
<span id="L279" class="LineNr">279 </span> e8/call <a href='058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L280" class="LineNr">280 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L281" class="LineNr">281 </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="L282" class="LineNr">282 </span> <span class="subxS1Comment"># . end</span>
<span id="L283" class="LineNr">283 </span> c3/return
<span id="L284" class="LineNr">284 </span>
<span id="L285" class="LineNr">285 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->

File diff suppressed because it is too large Load Diff

View File

@ -157,7 +157,7 @@ if ('onhashchange' in window) {
<span id="L94" class="LineNr"> 94 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L95" class="LineNr"> 95 </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="L96" class="LineNr"> 96 </span> <span class="subxS2Comment"># . . call</span>
<span id="L97" class="LineNr"> 97 </span> e8/call <a href='crenshaw2-1.subx.html#L533'>get-char</a>/disp32
<span id="L97" class="LineNr"> 97 </span> e8/call <a href='crenshaw2-1.subx.html#L509'>get-char</a>/disp32
<span id="L98" class="LineNr"> 98 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L99" class="LineNr"> 99 </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="L100" class="LineNr">100 </span> <span class="subxComment"># var num/ECX : (address stream) on the stack</span>
@ -185,7 +185,7 @@ if ('onhashchange' in window) {
<span id="L122" class="LineNr">122 </span> 51/push-ECX/num
<span id="L123" class="LineNr">123 </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="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . call</span>
<span id="L125" class="LineNr">125 </span> e8/call <a href='crenshaw2-1.subx.html#L201'>get-num</a>/disp32
<span id="L125" class="LineNr">125 </span> e8/call <a href='crenshaw2-1.subx.html#L185'>get-num</a>/disp32
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L127" class="LineNr">127 </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> 0x10/imm32 <span class="subxComment"># add to ESP</span>
<span id="L128" class="LineNr">128 </span> <span class="subxComment"># render 'num' into the following template on 'out':</span>
@ -217,454 +217,430 @@ if ('onhashchange' in window) {
<span id="L154" class="LineNr">154 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L156" class="LineNr">156 </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="L157" class="LineNr">157 </span> <span class="subxS1Comment"># . write(out, &quot;b8/copy-to-EAX 1/imm32/exit&quot;)</span>
<span id="L157" class="LineNr">157 </span> <span class="subxS1Comment"># . write(out, &quot;b8/copy-to-EAX 1/imm32/exit\n&quot;)</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L159" class="LineNr">159 </span> 68/push <span class="Constant">&quot;b8/copy-to-EAX 1/imm32/exit&quot;</span>/imm32
<span id="L159" class="LineNr">159 </span> 68/push <span class="Constant">&quot;b8/copy-to-EAX 1/imm32/exit\n&quot;</span>/imm32
<span id="L160" class="LineNr">160 </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="L161" class="LineNr">161 </span> <span class="subxS2Comment"># . . call</span>
<span id="L162" class="LineNr">162 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L164" class="LineNr">164 </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="L165" class="LineNr">165 </span> <span class="subxS1Comment"># . write(out, Newline)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS1Comment"># . write(out, &quot;cd/syscall 0x80/imm8\n&quot;)</span>
<span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L167" class="LineNr">167 </span> 68/push <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L167" class="LineNr">167 </span> 68/push <span class="Constant">&quot;cd/syscall 0x80/imm8\n&quot;</span>/imm32
<span id="L168" class="LineNr">168 </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="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . call</span>
<span id="L170" class="LineNr">170 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L171" class="LineNr">171 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L172" class="LineNr">172 </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="L173" class="LineNr">173 </span> <span class="subxS1Comment"># . write(out, &quot;cd/syscall 0x80/imm8&quot;)</span>
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L175" class="LineNr">175 </span> 68/push <span class="Constant">&quot;cd/syscall 0x80/imm8&quot;</span>/imm32
<span id="L176" class="LineNr">176 </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="L177" class="LineNr">177 </span> <span class="subxS2Comment"># . . call</span>
<span id="L178" class="LineNr">178 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L179" class="LineNr">179 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L180" class="LineNr">180 </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="L181" class="LineNr">181 </span> <span class="subxS1Comment"># . write(out, Newline)</span>
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L183" class="LineNr">183 </span> 68/push <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L184" class="LineNr">184 </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="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . call</span>
<span id="L186" class="LineNr">186 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L188" class="LineNr">188 </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="L189" class="LineNr">189 </span><span class="Constant">$compile:end</span>:
<span id="L190" class="LineNr">190 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L191" class="LineNr">191 </span> 59/pop-to-ECX
<span id="L192" class="LineNr">192 </span> 58/pop-to-EAX
<span id="L193" class="LineNr">193 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L194" class="LineNr">194 </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="L195" class="LineNr">195 </span> 5d/pop-to-EBP
<span id="L196" class="LineNr">196 </span> c3/return
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="subxComment"># Read a single digit into 'out'. Abort if there are none, or if there is no space in 'out'.</span>
<span id="L199" class="LineNr">199 </span><span class="subxComment"># Input comes from the global variable 'Look', and we leave the next byte from</span>
<span id="L200" class="LineNr">200 </span><span class="subxComment"># 'in' into it on exit.</span>
<span id="L201" class="LineNr">201 </span><span class="subxFunction">get-num</span>: <span class="subxComment"># in : (address buffered-file), out : (address stream), err : fd or (address stream), ed : (address exit-descriptor) -&gt; &lt;void&gt;</span>
<span id="L202" class="LineNr">202 </span> <span class="subxComment"># pseudocode:</span>
<span id="L203" class="LineNr">203 </span> <span class="subxComment"># if (!is-digit?(Look)) expected(ed, err, &quot;integer&quot;)</span>
<span id="L204" class="LineNr">204 </span> <span class="subxComment"># if out-&gt;write &gt;= out-&gt;length</span>
<span id="L205" class="LineNr">205 </span> <span class="subxComment"># write(err, &quot;Error: too many digits in number\n&quot;)</span>
<span id="L206" class="LineNr">206 </span> <span class="subxComment"># stop(ed, 1)</span>
<span id="L207" class="LineNr">207 </span> <span class="subxComment"># out-&gt;data[out-&gt;write] = LSB(Look)</span>
<span id="L208" class="LineNr">208 </span> <span class="subxComment"># ++out-&gt;write</span>
<span id="L209" class="LineNr">209 </span> <span class="subxComment"># Look = get-char(in)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxComment">#</span>
<span id="L211" class="LineNr">211 </span> <span class="subxComment"># registers:</span>
<span id="L212" class="LineNr">212 </span> <span class="subxComment"># in: ESI</span>
<span id="L213" class="LineNr">213 </span> <span class="subxComment"># out: EDI</span>
<span id="L214" class="LineNr">214 </span> <span class="subxComment"># out-&gt;write: ECX (cached copy; need to keep in sync)</span>
<span id="L215" class="LineNr">215 </span> <span class="subxComment"># out-&gt;length: EDX</span>
<span id="L216" class="LineNr">216 </span> <span class="subxComment"># temporaries: EAX, EBX</span>
<span id="L217" class="LineNr">217 </span> <span class="subxComment"># We can't allocate Look to a register because it gets written implicitly in</span>
<span id="L218" class="LineNr">218 </span> <span class="subxComment"># get-char in each iteration of the loop. (Thereby demonstrating that it's</span>
<span id="L219" class="LineNr">219 </span> <span class="subxComment"># not the right interface for us. But we'll keep it just to follow Crenshaw.)</span>
<span id="L220" class="LineNr">220 </span> <span class="subxComment">#</span>
<span id="L221" class="LineNr">221 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L222" class="LineNr">222 </span> 55/push-EBP
<span id="L223" class="LineNr">223 </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="L224" class="LineNr">224 </span> <span class="subxH1Comment"># - if (is-digit?(Look)) expected(ed, err, &quot;integer&quot;)</span>
<span id="L225" class="LineNr">225 </span> <span class="subxS1Comment"># . EAX = is-digit?(Look)</span>
<span id="L226" class="LineNr">226 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L227" class="LineNr">227 </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='crenshaw2-1.subx.html#L578'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># push *Look</span>
<span id="L228" class="LineNr">228 </span> <span class="subxS2Comment"># . . call</span>
<span id="L229" class="LineNr">229 </span> e8/call <a href='crenshaw2-1.subx.html#L556'>is-digit?</a>/disp32
<span id="L230" class="LineNr">230 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L231" class="LineNr">231 </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="L232" class="LineNr">232 </span> <span class="subxS1Comment"># . if (EAX == 0)</span>
<span id="L233" class="LineNr">233 </span> 3d/compare-EAX-and 0/imm32
<span id="L234" class="LineNr">234 </span> 75/jump-if-not-equal $get-num:main/disp8
<span id="L235" class="LineNr">235 </span> <span class="subxS1Comment"># . expected(ed, err, &quot;integer&quot;)</span>
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L237" class="LineNr">237 </span> 68/push <span class="Constant">&quot;integer&quot;</span>/imm32
<span id="L238" class="LineNr">238 </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="L239" class="LineNr">239 </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> 0x14/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+20)</span>
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . call</span>
<span id="L241" class="LineNr">241 </span> e8/call <a href='crenshaw2-1.subx.html#L483'>expected</a>/disp32 <span class="subxComment"># never returns</span>
<span id="L242" class="LineNr">242 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L243" class="LineNr">243 </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="L244" class="LineNr">244 </span><span class="Constant">$get-num:main</span>:
<span id="L245" class="LineNr">245 </span> <span class="subxH1Comment"># - otherwise read a digit</span>
<span id="L246" class="LineNr">246 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L247" class="LineNr">247 </span> 50/push-EAX
<span id="L248" class="LineNr">248 </span> 51/push-ECX
<span id="L249" class="LineNr">249 </span> 52/push-EDX
<span id="L250" class="LineNr">250 </span> 53/push-EBX
<span id="L251" class="LineNr">251 </span> 56/push-ESI
<span id="L252" class="LineNr">252 </span> 57/push-EDI
<span id="L253" class="LineNr">253 </span> <span class="subxComment"># read necessary variables to registers</span>
<span id="L254" class="LineNr">254 </span> <span class="subxComment"># ESI = in</span>
<span id="L255" class="LineNr">255 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L256" class="LineNr">256 </span> <span class="subxComment"># EDI = out</span>
<span id="L257" class="LineNr">257 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDI</span>
<span id="L258" class="LineNr">258 </span> <span class="subxComment"># ECX = out-&gt;write</span>
<span id="L259" class="LineNr">259 </span> 8b/copy 0/mod/indirect 7/rm32/EDI <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 *EDI to ECX</span>
<span id="L260" class="LineNr">260 </span> <span class="subxComment"># EDX = out-&gt;length</span>
<span id="L261" class="LineNr">261 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+8) to EDX</span>
<span id="L262" class="LineNr">262 </span> <span class="subxComment"># if (out-&gt;write &gt;= out-&gt;length) error</span>
<span id="L263" class="LineNr">263 </span> 39/compare 3/mod/direct 2/rm32/EDX <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"># compare EDX with ECX</span>
<span id="L264" class="LineNr">264 </span> 7d/jump-if-lesser $get-num:stage2/disp8
<span id="L265" class="LineNr">265 </span> <span class="subxS1Comment"># . error(ed, err, msg) # TODO: show full number</span>
<span id="L173" class="LineNr">173 </span><span class="Constant">$compile:end</span>:
<span id="L174" class="LineNr">174 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L175" class="LineNr">175 </span> 59/pop-to-ECX
<span id="L176" class="LineNr">176 </span> 58/pop-to-EAX
<span id="L177" class="LineNr">177 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L178" class="LineNr">178 </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="L179" class="LineNr">179 </span> 5d/pop-to-EBP
<span id="L180" class="LineNr">180 </span> c3/return
<span id="L181" class="LineNr">181 </span>
<span id="L182" class="LineNr">182 </span><span class="subxComment"># Read a single digit into 'out'. Abort if there are none, or if there is no space in 'out'.</span>
<span id="L183" class="LineNr">183 </span><span class="subxComment"># Input comes from the global variable 'Look', and we leave the next byte from</span>
<span id="L184" class="LineNr">184 </span><span class="subxComment"># 'in' into it on exit.</span>
<span id="L185" class="LineNr">185 </span><span class="subxFunction">get-num</span>: <span class="subxComment"># in : (address buffered-file), out : (address stream), err : fd or (address stream), ed : (address exit-descriptor) -&gt; &lt;void&gt;</span>
<span id="L186" class="LineNr">186 </span> <span class="subxComment"># pseudocode:</span>
<span id="L187" class="LineNr">187 </span> <span class="subxComment"># if (!is-digit?(Look)) expected(ed, err, &quot;integer&quot;)</span>
<span id="L188" class="LineNr">188 </span> <span class="subxComment"># if out-&gt;write &gt;= out-&gt;length</span>
<span id="L189" class="LineNr">189 </span> <span class="subxComment"># write(err, &quot;Error: too many digits in number\n&quot;)</span>
<span id="L190" class="LineNr">190 </span> <span class="subxComment"># stop(ed, 1)</span>
<span id="L191" class="LineNr">191 </span> <span class="subxComment"># out-&gt;data[out-&gt;write] = LSB(Look)</span>
<span id="L192" class="LineNr">192 </span> <span class="subxComment"># ++out-&gt;write</span>
<span id="L193" class="LineNr">193 </span> <span class="subxComment"># Look = get-char(in)</span>
<span id="L194" class="LineNr">194 </span> <span class="subxComment">#</span>
<span id="L195" class="LineNr">195 </span> <span class="subxComment"># registers:</span>
<span id="L196" class="LineNr">196 </span> <span class="subxComment"># in: ESI</span>
<span id="L197" class="LineNr">197 </span> <span class="subxComment"># out: EDI</span>
<span id="L198" class="LineNr">198 </span> <span class="subxComment"># out-&gt;write: ECX (cached copy; need to keep in sync)</span>
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># out-&gt;length: EDX</span>
<span id="L200" class="LineNr">200 </span> <span class="subxComment"># temporaries: EAX, EBX</span>
<span id="L201" class="LineNr">201 </span> <span class="subxComment"># We can't allocate Look to a register because it gets written implicitly in</span>
<span id="L202" class="LineNr">202 </span> <span class="subxComment"># get-char in each iteration of the loop. (Thereby demonstrating that it's</span>
<span id="L203" class="LineNr">203 </span> <span class="subxComment"># not the right interface for us. But we'll keep it just to follow Crenshaw.)</span>
<span id="L204" class="LineNr">204 </span> <span class="subxComment">#</span>
<span id="L205" class="LineNr">205 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L206" class="LineNr">206 </span> 55/push-EBP
<span id="L207" class="LineNr">207 </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="L208" class="LineNr">208 </span> <span class="subxH1Comment"># - if (is-digit?(Look)) expected(ed, err, &quot;integer&quot;)</span>
<span id="L209" class="LineNr">209 </span> <span class="subxS1Comment"># . EAX = is-digit?(Look)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </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='crenshaw2-1.subx.html#L554'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># push *Look</span>
<span id="L212" class="LineNr">212 </span> <span class="subxS2Comment"># . . call</span>
<span id="L213" class="LineNr">213 </span> e8/call <a href='crenshaw2-1.subx.html#L532'>is-digit?</a>/disp32
<span id="L214" class="LineNr">214 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L215" class="LineNr">215 </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="L216" class="LineNr">216 </span> <span class="subxS1Comment"># . if (EAX == 0)</span>
<span id="L217" class="LineNr">217 </span> 3d/compare-EAX-and 0/imm32
<span id="L218" class="LineNr">218 </span> 75/jump-if-not-equal $get-num:main/disp8
<span id="L219" class="LineNr">219 </span> <span class="subxS1Comment"># . expected(ed, err, &quot;integer&quot;)</span>
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L221" class="LineNr">221 </span> 68/push <span class="Constant">&quot;integer&quot;</span>/imm32
<span id="L222" class="LineNr">222 </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="L223" class="LineNr">223 </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> 0x14/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+20)</span>
<span id="L224" class="LineNr">224 </span> <span class="subxS2Comment"># . . call</span>
<span id="L225" class="LineNr">225 </span> e8/call <a href='crenshaw2-1.subx.html#L467'>expected</a>/disp32 <span class="subxComment"># never returns</span>
<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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L228" class="LineNr">228 </span><span class="Constant">$get-num:main</span>:
<span id="L229" class="LineNr">229 </span> <span class="subxH1Comment"># - otherwise read a digit</span>
<span id="L230" class="LineNr">230 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L231" class="LineNr">231 </span> 50/push-EAX
<span id="L232" class="LineNr">232 </span> 51/push-ECX
<span id="L233" class="LineNr">233 </span> 52/push-EDX
<span id="L234" class="LineNr">234 </span> 53/push-EBX
<span id="L235" class="LineNr">235 </span> 56/push-ESI
<span id="L236" class="LineNr">236 </span> 57/push-EDI
<span id="L237" class="LineNr">237 </span> <span class="subxComment"># read necessary variables to registers</span>
<span id="L238" class="LineNr">238 </span> <span class="subxComment"># ESI = in</span>
<span id="L239" class="LineNr">239 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L240" class="LineNr">240 </span> <span class="subxComment"># EDI = out</span>
<span id="L241" class="LineNr">241 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDI</span>
<span id="L242" class="LineNr">242 </span> <span class="subxComment"># ECX = out-&gt;write</span>
<span id="L243" class="LineNr">243 </span> 8b/copy 0/mod/indirect 7/rm32/EDI <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 *EDI to ECX</span>
<span id="L244" class="LineNr">244 </span> <span class="subxComment"># EDX = out-&gt;length</span>
<span id="L245" class="LineNr">245 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+8) to EDX</span>
<span id="L246" class="LineNr">246 </span> <span class="subxComment"># if (out-&gt;write &gt;= out-&gt;length) error</span>
<span id="L247" class="LineNr">247 </span> 39/compare 3/mod/direct 2/rm32/EDX <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"># compare EDX with ECX</span>
<span id="L248" class="LineNr">248 </span> 7d/jump-if-lesser $get-num:stage2/disp8
<span id="L249" class="LineNr">249 </span> <span class="subxS1Comment"># . error(ed, err, msg) # TODO: show full number</span>
<span id="L250" class="LineNr">250 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L251" class="LineNr">251 </span> 68/push <span class="Constant">&quot;get-num: too many digits in number&quot;</span>/imm32
<span id="L252" class="LineNr">252 </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="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> 0x14/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+20)</span>
<span id="L254" class="LineNr">254 </span> <span class="subxS2Comment"># . . call</span>
<span id="L255" class="LineNr">255 </span> e8/call <a href='../063error.subx.html#L9'>error</a>/disp32 <span class="subxComment"># never returns</span>
<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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L258" class="LineNr">258 </span><span class="Constant">$get-num:stage2</span>:
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># out-&gt;data[out-&gt;write] = LSB(Look)</span>
<span id="L260" class="LineNr">260 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX <span class="Normal"> . </span> 3/r32/EBX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+ECX+12 to EBX</span>
<span id="L261" class="LineNr">261 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='crenshaw2-1.subx.html#L554'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># copy *Look to EAX</span>
<span id="L262" class="LineNr">262 </span> 88/copy-byte 0/mod/indirect 3/rm32/EBX <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 AL to *EBX</span>
<span id="L263" class="LineNr">263 </span> <span class="subxComment"># ++out-&gt;write</span>
<span id="L264" class="LineNr">264 </span> 41/increment-ECX
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># Look = get-char(in)</span>
<span id="L266" class="LineNr">266 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L267" class="LineNr">267 </span> 68/push <span class="Constant">&quot;get-num: too many digits in number&quot;</span>/imm32
<span id="L268" class="LineNr">268 </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="L269" class="LineNr">269 </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> 0x14/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+20)</span>
<span id="L270" class="LineNr">270 </span> <span class="subxS2Comment"># . . call</span>
<span id="L271" class="LineNr">271 </span> e8/call <a href='../063error.subx.html#L9'>error</a>/disp32 <span class="subxComment"># never returns</span>
<span id="L272" class="LineNr">272 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L273" class="LineNr">273 </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="L274" class="LineNr">274 </span><span class="Constant">$get-num:stage2</span>:
<span id="L275" class="LineNr">275 </span> <span class="subxComment"># out-&gt;data[out-&gt;write] = LSB(Look)</span>
<span id="L276" class="LineNr">276 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX <span class="Normal"> . </span> 3/r32/EBX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+ECX+12 to EBX</span>
<span id="L277" class="LineNr">277 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='crenshaw2-1.subx.html#L578'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># copy *Look to EAX</span>
<span id="L278" class="LineNr">278 </span> 88/copy-byte 0/mod/indirect 3/rm32/EBX <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 AL to *EBX</span>
<span id="L279" class="LineNr">279 </span> <span class="subxComment"># ++out-&gt;write</span>
<span id="L280" class="LineNr">280 </span> 41/increment-ECX
<span id="L281" class="LineNr">281 </span> <span class="subxComment"># Look = get-char(in)</span>
<span id="L282" class="LineNr">282 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L283" class="LineNr">283 </span> 56/push-ESI
<span id="L284" class="LineNr">284 </span> <span class="subxS2Comment"># . . call</span>
<span id="L285" class="LineNr">285 </span> e8/call <a href='crenshaw2-1.subx.html#L533'>get-char</a>/disp32
<span id="L286" class="LineNr">286 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L287" class="LineNr">287 </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="L288" class="LineNr">288 </span><span class="Constant">$get-num:loop-end</span>:
<span id="L289" class="LineNr">289 </span> <span class="subxComment"># persist necessary variables from registers</span>
<span id="L290" class="LineNr">290 </span> 89/copy 0/mod/indirect 7/rm32/EDI <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 *EDI</span>
<span id="L291" class="LineNr">291 </span><span class="Constant">$get-num:end</span>:
<span id="L292" class="LineNr">292 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L293" class="LineNr">293 </span> 5f/pop-to-EDI
<span id="L294" class="LineNr">294 </span> 5e/pop-to-ESI
<span id="L295" class="LineNr">295 </span> 5b/pop-to-EBX
<span id="L296" class="LineNr">296 </span> 5a/pop-to-EDX
<span id="L297" class="LineNr">297 </span> 59/pop-to-ECX
<span id="L298" class="LineNr">298 </span> 58/pop-to-EAX
<span id="L299" class="LineNr">299 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L300" class="LineNr">300 </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="L301" class="LineNr">301 </span> 5d/pop-to-EBP
<span id="L302" class="LineNr">302 </span> c3/return
<span id="L303" class="LineNr">303 </span>
<span id="L304" class="LineNr">304 </span><span class="subxTest">test-get-num-reads-single-digit</span>:
<span id="L305" class="LineNr">305 </span> <span class="subxH1Comment"># - check that get-num returns first character if it's a digit</span>
<span id="L306" class="LineNr">306 </span> <span class="subxComment"># This test uses exit-descriptors. Use EBP for setting up local variables.</span>
<span id="L307" class="LineNr">307 </span> 55/push-EBP
<span id="L308" class="LineNr">308 </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="L309" class="LineNr">309 </span> <span class="subxComment"># clear all streams</span>
<span id="L310" class="LineNr">310 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L267" class="LineNr">267 </span> 56/push-ESI
<span id="L268" class="LineNr">268 </span> <span class="subxS2Comment"># . . call</span>
<span id="L269" class="LineNr">269 </span> e8/call <a href='crenshaw2-1.subx.html#L509'>get-char</a>/disp32
<span id="L270" class="LineNr">270 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L271" class="LineNr">271 </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="L272" class="LineNr">272 </span><span class="Constant">$get-num:loop-end</span>:
<span id="L273" class="LineNr">273 </span> <span class="subxComment"># persist necessary variables from registers</span>
<span id="L274" class="LineNr">274 </span> 89/copy 0/mod/indirect 7/rm32/EDI <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 *EDI</span>
<span id="L275" class="LineNr">275 </span><span class="Constant">$get-num:end</span>:
<span id="L276" class="LineNr">276 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L277" class="LineNr">277 </span> 5f/pop-to-EDI
<span id="L278" class="LineNr">278 </span> 5e/pop-to-ESI
<span id="L279" class="LineNr">279 </span> 5b/pop-to-EBX
<span id="L280" class="LineNr">280 </span> 5a/pop-to-EDX
<span id="L281" class="LineNr">281 </span> 59/pop-to-ECX
<span id="L282" class="LineNr">282 </span> 58/pop-to-EAX
<span id="L283" class="LineNr">283 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L284" class="LineNr">284 </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="L285" class="LineNr">285 </span> 5d/pop-to-EBP
<span id="L286" class="LineNr">286 </span> c3/return
<span id="L287" class="LineNr">287 </span>
<span id="L288" class="LineNr">288 </span><span class="subxTest">test-get-num-reads-single-digit</span>:
<span id="L289" class="LineNr">289 </span> <span class="subxH1Comment"># - check that get-num returns first character if it's a digit</span>
<span id="L290" class="LineNr">290 </span> <span class="subxComment"># This test uses exit-descriptors. Use EBP for setting up local variables.</span>
<span id="L291" class="LineNr">291 </span> 55/push-EBP
<span id="L292" class="LineNr">292 </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="L293" class="LineNr">293 </span> <span class="subxComment"># clear all streams</span>
<span id="L294" class="LineNr">294 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L295" class="LineNr">295 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L296" class="LineNr">296 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L297" class="LineNr">297 </span> <span class="subxS2Comment"># . . call</span>
<span id="L298" class="LineNr">298 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L299" class="LineNr">299 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L300" class="LineNr">300 </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="L301" class="LineNr">301 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L302" class="LineNr">302 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L303" class="LineNr">303 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L304" class="LineNr">304 </span> 05/add-to-EAX 4/imm32
<span id="L305" class="LineNr">305 </span> 50/push-EAX
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . call</span>
<span id="L307" class="LineNr">307 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L308" class="LineNr">308 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L309" class="LineNr">309 </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="L310" class="LineNr">310 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L311" class="LineNr">311 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L312" class="LineNr">312 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L312" class="LineNr">312 </span> 68/push <a href='crenshaw2-1.subx.html#L557'>_test-output-stream</a>/imm32
<span id="L313" class="LineNr">313 </span> <span class="subxS2Comment"># . . call</span>
<span id="L314" class="LineNr">314 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L315" class="LineNr">315 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L316" class="LineNr">316 </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="L317" class="LineNr">317 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L317" class="LineNr">317 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L318" class="LineNr">318 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L319" class="LineNr">319 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L320" class="LineNr">320 </span> 05/add-to-EAX 4/imm32
<span id="L321" class="LineNr">321 </span> 50/push-EAX
<span id="L322" class="LineNr">322 </span> <span class="subxS2Comment"># . . call</span>
<span id="L323" class="LineNr">323 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L324" class="LineNr">324 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L325" class="LineNr">325 </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="L326" class="LineNr">326 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L327" class="LineNr">327 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L328" class="LineNr">328 </span> 68/push <a href='crenshaw2-1.subx.html#L581'>_test-output-stream</a>/imm32
<span id="L319" class="LineNr">319 </span> 68/push <a href='crenshaw2-1.subx.html#L567'>_test-error-stream</a>/imm32
<span id="L320" class="LineNr">320 </span> <span class="subxS2Comment"># . . call</span>
<span id="L321" class="LineNr">321 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L322" class="LineNr">322 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L323" class="LineNr">323 </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="L324" class="LineNr">324 </span> <span class="subxComment"># initialize 'in'</span>
<span id="L325" class="LineNr">325 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;3&quot;)</span>
<span id="L326" class="LineNr">326 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L327" class="LineNr">327 </span> 68/push <span class="Constant">&quot;3&quot;</span>/imm32
<span id="L328" class="LineNr">328 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L329" class="LineNr">329 </span> <span class="subxS2Comment"># . . call</span>
<span id="L330" class="LineNr">330 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L330" class="LineNr">330 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L331" class="LineNr">331 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L332" class="LineNr">332 </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="L333" class="LineNr">333 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L334" class="LineNr">334 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L335" class="LineNr">335 </span> 68/push <a href='crenshaw2-1.subx.html#L591'>_test-error-stream</a>/imm32
<span id="L336" class="LineNr">336 </span> <span class="subxS2Comment"># . . call</span>
<span id="L337" class="LineNr">337 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L338" class="LineNr">338 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L339" class="LineNr">339 </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="L340" class="LineNr">340 </span> <span class="subxComment"># initialize 'in'</span>
<span id="L341" class="LineNr">341 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;3&quot;)</span>
<span id="L342" class="LineNr">342 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L343" class="LineNr">343 </span> 68/push <span class="Constant">&quot;3&quot;</span>/imm32
<span id="L344" class="LineNr">344 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L345" class="LineNr">345 </span> <span class="subxS2Comment"># . . call</span>
<span id="L346" class="LineNr">346 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L347" class="LineNr">347 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L348" class="LineNr">348 </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="L349" class="LineNr">349 </span> <span class="subxComment"># initialize exit-descriptor 'ed' for the call to 'get-num' below</span>
<span id="L350" class="LineNr">350 </span> <span class="subxS1Comment"># . var ed/EAX : exit-descriptor</span>
<span id="L351" class="LineNr">351 </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> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L352" class="LineNr">352 </span> 89/copy 3/mod/direct 0/rm32/EAX <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 EAX</span>
<span id="L353" class="LineNr">353 </span> <span class="subxS1Comment"># . tailor-exit-descriptor(ed, 16)</span>
<span id="L332" class="LineNr">332 </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="L333" class="LineNr">333 </span> <span class="subxComment"># initialize exit-descriptor 'ed' for the call to 'get-num' below</span>
<span id="L334" class="LineNr">334 </span> <span class="subxS1Comment"># . var ed/EAX : exit-descriptor</span>
<span id="L335" class="LineNr">335 </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> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L336" class="LineNr">336 </span> 89/copy 3/mod/direct 0/rm32/EAX <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 EAX</span>
<span id="L337" class="LineNr">337 </span> <span class="subxS1Comment"># . tailor-exit-descriptor(ed, 16)</span>
<span id="L338" class="LineNr">338 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L339" class="LineNr">339 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L340" class="LineNr">340 </span> 50/push-EAX/ed
<span id="L341" class="LineNr">341 </span> <span class="subxS2Comment"># . . call</span>
<span id="L342" class="LineNr">342 </span> e8/call <a href='../059stop.subx.html#L50'>tailor-exit-descriptor</a>/disp32
<span id="L343" class="LineNr">343 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L344" class="LineNr">344 </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="L345" class="LineNr">345 </span> <span class="subxComment"># prime the pump</span>
<span id="L346" class="LineNr">346 </span> <span class="subxS1Comment"># . get-char(_test-buffered-file)</span>
<span id="L347" class="LineNr">347 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L348" class="LineNr">348 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L349" class="LineNr">349 </span> <span class="subxS2Comment"># . . call</span>
<span id="L350" class="LineNr">350 </span> e8/call <a href='crenshaw2-1.subx.html#L509'>get-char</a>/disp32
<span id="L351" class="LineNr">351 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L352" class="LineNr">352 </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="L353" class="LineNr">353 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L354" class="LineNr">354 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L355" class="LineNr">355 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L356" class="LineNr">356 </span> 50/push-EAX/ed
<span id="L357" class="LineNr">357 </span> <span class="subxS2Comment"># . . call</span>
<span id="L358" class="LineNr">358 </span> e8/call <a href='../059stop.subx.html#L50'>tailor-exit-descriptor</a>/disp32
<span id="L359" class="LineNr">359 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L360" class="LineNr">360 </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="L361" class="LineNr">361 </span> <span class="subxComment"># prime the pump</span>
<span id="L362" class="LineNr">362 </span> <span class="subxS1Comment"># . get-char(_test-buffered-file)</span>
<span id="L363" class="LineNr">363 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L364" class="LineNr">364 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L365" class="LineNr">365 </span> <span class="subxS2Comment"># . . call</span>
<span id="L366" class="LineNr">366 </span> e8/call <a href='crenshaw2-1.subx.html#L533'>get-char</a>/disp32
<span id="L367" class="LineNr">367 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L368" class="LineNr">368 </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="L369" class="LineNr">369 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L370" class="LineNr">370 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L371" class="LineNr">371 </span> 50/push-EAX/ed
<span id="L372" class="LineNr">372 </span> 68/push <a href='crenshaw2-1.subx.html#L591'>_test-error-stream</a>/imm32
<span id="L373" class="LineNr">373 </span> 68/push <a href='crenshaw2-1.subx.html#L581'>_test-output-stream</a>/imm32
<span id="L374" class="LineNr">374 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L375" class="LineNr">375 </span> <span class="subxS2Comment"># . . call</span>
<span id="L376" class="LineNr">376 </span> e8/call <a href='crenshaw2-1.subx.html#L201'>get-num</a>/disp32
<span id="L377" class="LineNr">377 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L378" class="LineNr">378 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L379" class="LineNr">379 </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> 0x10/imm32 <span class="subxComment"># add to ESP</span>
<span id="L380" class="LineNr">380 </span> <span class="subxComment"># check-ints-equal(*_test-output-stream-&gt;data, '3', msg)</span>
<span id="L381" class="LineNr">381 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L382" class="LineNr">382 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-single-digit&quot;</span>/imm32
<span id="L383" class="LineNr">383 </span> 68/push 0x33/imm32
<span id="L384" class="LineNr">384 </span> b8/copy-to-EAX <a href='crenshaw2-1.subx.html#L581'>_test-output-stream</a>/imm32
<span id="L385" class="LineNr">385 </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> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+12)</span>
<span id="L386" class="LineNr">386 </span> <span class="subxS2Comment"># . . call</span>
<span id="L387" class="LineNr">387 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L388" class="LineNr">388 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L389" class="LineNr">389 </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="L390" class="LineNr">390 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L391" class="LineNr">391 </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="L392" class="LineNr">392 </span> 5d/pop-to-EBP
<span id="L393" class="LineNr">393 </span> c3/return
<span id="L394" class="LineNr">394 </span>
<span id="L395" class="LineNr">395 </span><span class="subxTest">test-get-num-aborts-on-non-digit-in-Look</span>:
<span id="L396" class="LineNr">396 </span> <span class="subxH1Comment"># - check that get-num returns first character if it's a digit</span>
<span id="L397" class="LineNr">397 </span> <span class="subxComment"># This test uses exit-descriptors. Use EBP for setting up local variables.</span>
<span id="L398" class="LineNr">398 </span> 55/push-EBP
<span id="L399" class="LineNr">399 </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="L400" class="LineNr">400 </span> <span class="subxComment"># clear all streams</span>
<span id="L401" class="LineNr">401 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L355" class="LineNr">355 </span> 50/push-EAX/ed
<span id="L356" class="LineNr">356 </span> 68/push <a href='crenshaw2-1.subx.html#L567'>_test-error-stream</a>/imm32
<span id="L357" class="LineNr">357 </span> 68/push <a href='crenshaw2-1.subx.html#L557'>_test-output-stream</a>/imm32
<span id="L358" class="LineNr">358 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L359" class="LineNr">359 </span> <span class="subxS2Comment"># . . call</span>
<span id="L360" class="LineNr">360 </span> e8/call <a href='crenshaw2-1.subx.html#L185'>get-num</a>/disp32
<span id="L361" class="LineNr">361 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L362" class="LineNr">362 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L363" class="LineNr">363 </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> 0x10/imm32 <span class="subxComment"># add to ESP</span>
<span id="L364" class="LineNr">364 </span> <span class="subxComment"># check-ints-equal(*_test-output-stream-&gt;data, '3', msg)</span>
<span id="L365" class="LineNr">365 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L366" class="LineNr">366 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-single-digit&quot;</span>/imm32
<span id="L367" class="LineNr">367 </span> 68/push 0x33/imm32
<span id="L368" class="LineNr">368 </span> b8/copy-to-EAX <a href='crenshaw2-1.subx.html#L557'>_test-output-stream</a>/imm32
<span id="L369" class="LineNr">369 </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> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+12)</span>
<span id="L370" class="LineNr">370 </span> <span class="subxS2Comment"># . . call</span>
<span id="L371" class="LineNr">371 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L372" class="LineNr">372 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L373" class="LineNr">373 </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="L374" class="LineNr">374 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L375" class="LineNr">375 </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="L376" class="LineNr">376 </span> 5d/pop-to-EBP
<span id="L377" class="LineNr">377 </span> c3/return
<span id="L378" class="LineNr">378 </span>
<span id="L379" class="LineNr">379 </span><span class="subxTest">test-get-num-aborts-on-non-digit-in-Look</span>:
<span id="L380" class="LineNr">380 </span> <span class="subxH1Comment"># - check that get-num returns first character if it's a digit</span>
<span id="L381" class="LineNr">381 </span> <span class="subxComment"># This test uses exit-descriptors. Use EBP for setting up local variables.</span>
<span id="L382" class="LineNr">382 </span> 55/push-EBP
<span id="L383" class="LineNr">383 </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="L384" class="LineNr">384 </span> <span class="subxComment"># clear all streams</span>
<span id="L385" class="LineNr">385 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L386" class="LineNr">386 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L387" class="LineNr">387 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L388" class="LineNr">388 </span> <span class="subxS2Comment"># . . call</span>
<span id="L389" class="LineNr">389 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L390" class="LineNr">390 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L391" class="LineNr">391 </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="L392" class="LineNr">392 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L393" class="LineNr">393 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L394" class="LineNr">394 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L395" class="LineNr">395 </span> 05/add-to-EAX 4/imm32
<span id="L396" class="LineNr">396 </span> 50/push-EAX
<span id="L397" class="LineNr">397 </span> <span class="subxS2Comment"># . . call</span>
<span id="L398" class="LineNr">398 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L399" class="LineNr">399 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L400" class="LineNr">400 </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="L401" class="LineNr">401 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L402" class="LineNr">402 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L403" class="LineNr">403 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L403" class="LineNr">403 </span> 68/push <a href='crenshaw2-1.subx.html#L557'>_test-output-stream</a>/imm32
<span id="L404" class="LineNr">404 </span> <span class="subxS2Comment"># . . call</span>
<span id="L405" class="LineNr">405 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L406" class="LineNr">406 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L407" class="LineNr">407 </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="L408" class="LineNr">408 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L408" class="LineNr">408 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L409" class="LineNr">409 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L410" class="LineNr">410 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L411" class="LineNr">411 </span> 05/add-to-EAX 4/imm32
<span id="L412" class="LineNr">412 </span> 50/push-EAX
<span id="L413" class="LineNr">413 </span> <span class="subxS2Comment"># . . call</span>
<span id="L414" class="LineNr">414 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L415" class="LineNr">415 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L416" class="LineNr">416 </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="L417" class="LineNr">417 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L418" class="LineNr">418 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L419" class="LineNr">419 </span> 68/push <a href='crenshaw2-1.subx.html#L581'>_test-output-stream</a>/imm32
<span id="L410" class="LineNr">410 </span> 68/push <a href='crenshaw2-1.subx.html#L567'>_test-error-stream</a>/imm32
<span id="L411" class="LineNr">411 </span> <span class="subxS2Comment"># . . call</span>
<span id="L412" class="LineNr">412 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L413" class="LineNr">413 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L414" class="LineNr">414 </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="L415" class="LineNr">415 </span> <span class="subxComment"># initialize 'in'</span>
<span id="L416" class="LineNr">416 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;3&quot;)</span>
<span id="L417" class="LineNr">417 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L418" class="LineNr">418 </span> 68/push <span class="Constant">&quot;3&quot;</span>/imm32
<span id="L419" class="LineNr">419 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L420" class="LineNr">420 </span> <span class="subxS2Comment"># . . call</span>
<span id="L421" class="LineNr">421 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L421" class="LineNr">421 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L422" class="LineNr">422 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L423" class="LineNr">423 </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="L424" class="LineNr">424 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L425" class="LineNr">425 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L426" class="LineNr">426 </span> 68/push <a href='crenshaw2-1.subx.html#L591'>_test-error-stream</a>/imm32
<span id="L427" class="LineNr">427 </span> <span class="subxS2Comment"># . . call</span>
<span id="L428" class="LineNr">428 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L429" class="LineNr">429 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L430" class="LineNr">430 </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="L431" class="LineNr">431 </span> <span class="subxComment"># initialize 'in'</span>
<span id="L432" class="LineNr">432 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;3&quot;)</span>
<span id="L433" class="LineNr">433 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L434" class="LineNr">434 </span> 68/push <span class="Constant">&quot;3&quot;</span>/imm32
<span id="L435" class="LineNr">435 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L436" class="LineNr">436 </span> <span class="subxS2Comment"># . . call</span>
<span id="L437" class="LineNr">437 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L438" class="LineNr">438 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L439" class="LineNr">439 </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="L440" class="LineNr">440 </span> <span class="subxComment"># initialize exit-descriptor 'ed' for the call to 'get-num' below</span>
<span id="L441" class="LineNr">441 </span> <span class="subxS1Comment"># . var ed/EAX : (address exit-descriptor)</span>
<span id="L442" class="LineNr">442 </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> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L443" class="LineNr">443 </span> 89/copy 3/mod/direct 0/rm32/EAX <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 EAX</span>
<span id="L444" class="LineNr">444 </span> <span class="subxS1Comment"># . tailor-exit-descriptor(ed, 16)</span>
<span id="L445" class="LineNr">445 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L446" class="LineNr">446 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L447" class="LineNr">447 </span> 50/push-EAX/ed
<span id="L448" class="LineNr">448 </span> <span class="subxS2Comment"># . . call</span>
<span id="L449" class="LineNr">449 </span> e8/call <a href='../059stop.subx.html#L50'>tailor-exit-descriptor</a>/disp32
<span id="L450" class="LineNr">450 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L451" class="LineNr">451 </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="L452" class="LineNr">452 </span> <span class="subxComment"># *don't* prime the pump</span>
<span id="L453" class="LineNr">453 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L454" class="LineNr">454 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L455" class="LineNr">455 </span> 50/push-EAX/ed
<span id="L456" class="LineNr">456 </span> 68/push <a href='crenshaw2-1.subx.html#L591'>_test-error-stream</a>/imm32
<span id="L457" class="LineNr">457 </span> 68/push <a href='crenshaw2-1.subx.html#L581'>_test-output-stream</a>/imm32
<span id="L458" class="LineNr">458 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L459" class="LineNr">459 </span> <span class="subxS2Comment"># . . call</span>
<span id="L460" class="LineNr">460 </span> e8/call <a href='crenshaw2-1.subx.html#L201'>get-num</a>/disp32
<span id="L461" class="LineNr">461 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L462" class="LineNr">462 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L463" class="LineNr">463 </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> 0x10/imm32 <span class="subxComment"># add to ESP</span>
<span id="L464" class="LineNr">464 </span> <span class="subxComment"># check that get-num tried to call exit(1)</span>
<span id="L465" class="LineNr">465 </span> <span class="subxS1Comment"># . check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L466" class="LineNr">466 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L467" class="LineNr">467 </span> 68/push <span class="Constant">&quot;F - test-get-num-aborts-on-non-digit-in-Look&quot;</span>/imm32
<span id="L468" class="LineNr">468 </span> 68/push 2/imm32
<span id="L469" class="LineNr">469 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L470" class="LineNr">470 </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="L471" class="LineNr">471 </span> <span class="subxS2Comment"># . . call</span>
<span id="L472" class="LineNr">472 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L473" class="LineNr">473 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L474" class="LineNr">474 </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="L475" class="LineNr">475 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L476" class="LineNr">476 </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="L477" class="LineNr">477 </span> 5d/pop-to-EBP
<span id="L478" class="LineNr">478 </span> c3/return
<span id="L479" class="LineNr">479 </span>
<span id="L480" class="LineNr">480 </span><span class="subxComment">## helpers</span>
<span id="L481" class="LineNr">481 </span>
<span id="L482" class="LineNr">482 </span><span class="subxComment"># write(f, &quot;Error: &quot;+s+&quot; expected\n&quot;) then stop(ed, 1)</span>
<span id="L483" class="LineNr">483 </span><span class="subxFunction">expected</span>: <span class="subxComment"># ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -&gt; &lt;void&gt;</span>
<span id="L484" class="LineNr">484 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L485" class="LineNr">485 </span> 55/push-EBP
<span id="L486" class="LineNr">486 </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="L487" class="LineNr">487 </span> <span class="subxComment"># write(f, &quot;Error: &quot;)</span>
<span id="L423" class="LineNr">423 </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="L424" class="LineNr">424 </span> <span class="subxComment"># initialize exit-descriptor 'ed' for the call to 'get-num' below</span>
<span id="L425" class="LineNr">425 </span> <span class="subxS1Comment"># . var ed/EAX : (address exit-descriptor)</span>
<span id="L426" class="LineNr">426 </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> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L427" class="LineNr">427 </span> 89/copy 3/mod/direct 0/rm32/EAX <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 EAX</span>
<span id="L428" class="LineNr">428 </span> <span class="subxS1Comment"># . tailor-exit-descriptor(ed, 16)</span>
<span id="L429" class="LineNr">429 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L430" class="LineNr">430 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L431" class="LineNr">431 </span> 50/push-EAX/ed
<span id="L432" class="LineNr">432 </span> <span class="subxS2Comment"># . . call</span>
<span id="L433" class="LineNr">433 </span> e8/call <a href='../059stop.subx.html#L50'>tailor-exit-descriptor</a>/disp32
<span id="L434" class="LineNr">434 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L435" class="LineNr">435 </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="L436" class="LineNr">436 </span> <span class="subxComment"># *don't* prime the pump</span>
<span id="L437" class="LineNr">437 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L438" class="LineNr">438 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L439" class="LineNr">439 </span> 50/push-EAX/ed
<span id="L440" class="LineNr">440 </span> 68/push <a href='crenshaw2-1.subx.html#L567'>_test-error-stream</a>/imm32
<span id="L441" class="LineNr">441 </span> 68/push <a href='crenshaw2-1.subx.html#L557'>_test-output-stream</a>/imm32
<span id="L442" class="LineNr">442 </span> 68/push <a href='../061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L443" class="LineNr">443 </span> <span class="subxS2Comment"># . . call</span>
<span id="L444" class="LineNr">444 </span> e8/call <a href='crenshaw2-1.subx.html#L185'>get-num</a>/disp32
<span id="L445" class="LineNr">445 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L446" class="LineNr">446 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L447" class="LineNr">447 </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> 0x10/imm32 <span class="subxComment"># add to ESP</span>
<span id="L448" class="LineNr">448 </span> <span class="subxComment"># check that get-num tried to call exit(1)</span>
<span id="L449" class="LineNr">449 </span> <span class="subxS1Comment"># . check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L450" class="LineNr">450 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L451" class="LineNr">451 </span> 68/push <span class="Constant">&quot;F - test-get-num-aborts-on-non-digit-in-Look&quot;</span>/imm32
<span id="L452" class="LineNr">452 </span> 68/push 2/imm32
<span id="L453" class="LineNr">453 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L454" class="LineNr">454 </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="L455" class="LineNr">455 </span> <span class="subxS2Comment"># . . call</span>
<span id="L456" class="LineNr">456 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L457" class="LineNr">457 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L458" class="LineNr">458 </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="L459" class="LineNr">459 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L460" class="LineNr">460 </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="L461" class="LineNr">461 </span> 5d/pop-to-EBP
<span id="L462" class="LineNr">462 </span> c3/return
<span id="L463" class="LineNr">463 </span>
<span id="L464" class="LineNr">464 </span><span class="subxComment">## helpers</span>
<span id="L465" class="LineNr">465 </span>
<span id="L466" class="LineNr">466 </span><span class="subxComment"># write(f, &quot;Error: &quot;+s+&quot; expected\n&quot;) then stop(ed, 1)</span>
<span id="L467" class="LineNr">467 </span><span class="subxFunction">expected</span>: <span class="subxComment"># ed : (address exit-descriptor), f : fd or (address stream), s : (address array byte) -&gt; &lt;void&gt;</span>
<span id="L468" class="LineNr">468 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L469" class="LineNr">469 </span> 55/push-EBP
<span id="L470" class="LineNr">470 </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="L471" class="LineNr">471 </span> <span class="subxComment"># write(f, &quot;Error: &quot;)</span>
<span id="L472" class="LineNr">472 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L473" class="LineNr">473 </span> 68/push <span class="Constant">&quot;Error: &quot;</span>/imm32
<span id="L474" class="LineNr">474 </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="L475" class="LineNr">475 </span> <span class="subxS2Comment"># . . call</span>
<span id="L476" class="LineNr">476 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L477" class="LineNr">477 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L478" class="LineNr">478 </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="L479" class="LineNr">479 </span> <span class="subxComment"># write(f, s)</span>
<span id="L480" class="LineNr">480 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L481" class="LineNr">481 </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="L482" class="LineNr">482 </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="L483" class="LineNr">483 </span> <span class="subxS2Comment"># . . call</span>
<span id="L484" class="LineNr">484 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L485" class="LineNr">485 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L486" class="LineNr">486 </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="L487" class="LineNr">487 </span> <span class="subxComment"># write(f, &quot; expected&quot;)</span>
<span id="L488" class="LineNr">488 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L489" class="LineNr">489 </span> 68/push <span class="Constant">&quot;Error: &quot;</span>/imm32
<span id="L489" class="LineNr">489 </span> 68/push <span class="Constant">&quot; expected\n&quot;</span>/imm32
<span id="L490" class="LineNr">490 </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="L491" class="LineNr">491 </span> <span class="subxS2Comment"># . . call</span>
<span id="L492" class="LineNr">492 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L493" class="LineNr">493 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L494" class="LineNr">494 </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="L495" class="LineNr">495 </span> <span class="subxComment"># write(f, s)</span>
<span id="L495" class="LineNr">495 </span> <span class="subxComment"># stop(ed, 1)</span>
<span id="L496" class="LineNr">496 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L497" class="LineNr">497 </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="L498" class="LineNr">498 </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="L497" class="LineNr">497 </span> 68/push 1/imm32
<span id="L498" class="LineNr">498 </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="L499" class="LineNr">499 </span> <span class="subxS2Comment"># . . call</span>
<span id="L500" class="LineNr">500 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L501" class="LineNr">501 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L502" class="LineNr">502 </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="L503" class="LineNr">503 </span> <span class="subxComment"># write(f, &quot; expected&quot;)</span>
<span id="L504" class="LineNr">504 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L505" class="LineNr">505 </span> 68/push <span class="Constant">&quot; expected&quot;</span>/imm32
<span id="L506" class="LineNr">506 </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="L507" class="LineNr">507 </span> <span class="subxS2Comment"># . . call</span>
<span id="L508" class="LineNr">508 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L509" class="LineNr">509 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L510" class="LineNr">510 </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="L511" class="LineNr">511 </span> <span class="subxComment"># write(f, Newline)</span>
<span id="L512" class="LineNr">512 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L513" class="LineNr">513 </span> 68/push <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L514" class="LineNr">514 </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="L515" class="LineNr">515 </span> <span class="subxS2Comment"># . . call</span>
<span id="L516" class="LineNr">516 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L517" class="LineNr">517 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L518" class="LineNr">518 </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="L519" class="LineNr">519 </span> <span class="subxComment"># stop(ed, 1)</span>
<span id="L520" class="LineNr">520 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L521" class="LineNr">521 </span> 68/push 1/imm32
<span id="L522" class="LineNr">522 </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="L523" class="LineNr">523 </span> <span class="subxS2Comment"># . . call</span>
<span id="L524" class="LineNr">524 </span> e8/call <a href='../059stop.subx.html#L98'>stop</a>/disp32
<span id="L525" class="LineNr">525 </span> <span class="subxComment"># should never get past this point</span>
<span id="L526" class="LineNr">526 </span><span class="Constant">$expected:dead-end</span>:
<span id="L500" class="LineNr">500 </span> e8/call <a href='../059stop.subx.html#L98'>stop</a>/disp32
<span id="L501" class="LineNr">501 </span> <span class="subxComment"># should never get past this point</span>
<span id="L502" class="LineNr">502 </span><span class="Constant">$expected:dead-end</span>:
<span id="L503" class="LineNr">503 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L504" class="LineNr">504 </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="L505" class="LineNr">505 </span> 5d/pop-to-EBP
<span id="L506" class="LineNr">506 </span> c3/return
<span id="L507" class="LineNr">507 </span>
<span id="L508" class="LineNr">508 </span><span class="subxComment"># read a byte from 'f', and save it in 'Look'</span>
<span id="L509" class="LineNr">509 </span><span class="subxFunction">get-char</span>: <span class="subxComment"># f : (address buffered-file) -&gt; &lt;void&gt;</span>
<span id="L510" class="LineNr">510 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L511" class="LineNr">511 </span> 55/push-EBP
<span id="L512" class="LineNr">512 </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="L513" class="LineNr">513 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L514" class="LineNr">514 </span> 50/push-EAX
<span id="L515" class="LineNr">515 </span> <span class="subxComment"># read-byte(f)</span>
<span id="L516" class="LineNr">516 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L517" class="LineNr">517 </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="L518" class="LineNr">518 </span> <span class="subxS2Comment"># . . call</span>
<span id="L519" class="LineNr">519 </span> e8/call <a href='../061read-byte.subx.html#L44'>read-byte</a>/disp32
<span id="L520" class="LineNr">520 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L521" class="LineNr">521 </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="L522" class="LineNr">522 </span> <span class="subxComment"># save EAX to Look</span>
<span id="L523" class="LineNr">523 </span> 89/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='crenshaw2-1.subx.html#L554'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *Look</span>
<span id="L524" class="LineNr">524 </span><span class="Constant">$get-char:end</span>:
<span id="L525" class="LineNr">525 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L526" class="LineNr">526 </span> 58/pop-to-EAX
<span id="L527" class="LineNr">527 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L528" class="LineNr">528 </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="L529" class="LineNr">529 </span> 5d/pop-to-EBP
<span id="L530" class="LineNr">530 </span> c3/return
<span id="L531" class="LineNr">531 </span>
<span id="L532" class="LineNr">532 </span><span class="subxComment"># read a byte from 'f', and save it in 'Look'</span>
<span id="L533" class="LineNr">533 </span><span class="subxFunction">get-char</span>: <span class="subxComment"># f : (address buffered-file) -&gt; &lt;void&gt;</span>
<span id="L534" class="LineNr">534 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L535" class="LineNr">535 </span> 55/push-EBP
<span id="L536" class="LineNr">536 </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="L537" class="LineNr">537 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L538" class="LineNr">538 </span> 50/push-EAX
<span id="L539" class="LineNr">539 </span> <span class="subxComment"># read-byte(f)</span>
<span id="L540" class="LineNr">540 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L541" class="LineNr">541 </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="L542" class="LineNr">542 </span> <span class="subxS2Comment"># . . call</span>
<span id="L543" class="LineNr">543 </span> e8/call <a href='../061read-byte.subx.html#L44'>read-byte</a>/disp32
<span id="L544" class="LineNr">544 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L545" class="LineNr">545 </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="L546" class="LineNr">546 </span> <span class="subxComment"># save EAX to Look</span>
<span id="L547" class="LineNr">547 </span> 89/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='crenshaw2-1.subx.html#L578'>Look</a></span>/disp32 <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *Look</span>
<span id="L548" class="LineNr">548 </span><span class="Constant">$get-char:end</span>:
<span id="L549" class="LineNr">549 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L550" class="LineNr">550 </span> 58/pop-to-EAX
<span id="L551" class="LineNr">551 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L552" class="LineNr">552 </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="L553" class="LineNr">553 </span> 5d/pop-to-EBP
<span id="L554" class="LineNr">554 </span> c3/return
<span id="L555" class="LineNr">555 </span>
<span id="L556" class="LineNr">556 </span><span class="subxFunction">is-digit?</span>: <span class="subxComment"># c : int -&gt; EAX : boolean</span>
<span id="L557" class="LineNr">557 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L558" class="LineNr">558 </span> 55/push-EBP
<span id="L559" class="LineNr">559 </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="L560" class="LineNr">560 </span> <span class="subxComment"># EAX = false</span>
<span id="L561" class="LineNr">561 </span> b8/copy-to-EAX 0/imm32
<span id="L562" class="LineNr">562 </span> <span class="subxComment"># if (c &lt; '0') return false</span>
<span id="L563" class="LineNr">563 </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> 8/disp8 0x30/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L564" class="LineNr">564 </span> 7c/jump-if-lesser $is-digit?:end/disp8
<span id="L565" class="LineNr">565 </span> <span class="subxComment"># if (c &gt; '9') return false</span>
<span id="L566" class="LineNr">566 </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> 8/disp8 0x39/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L567" class="LineNr">567 </span> 7f/jump-if-greater $is-digit?:end/disp8
<span id="L568" class="LineNr">568 </span> <span class="subxComment"># otherwise return true</span>
<span id="L569" class="LineNr">569 </span> b8/copy-to-EAX 1/imm32
<span id="L570" class="LineNr">570 </span><span class="Constant">$is-digit?:end</span>:
<span id="L571" class="LineNr">571 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L572" class="LineNr">572 </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="L573" class="LineNr">573 </span> 5d/pop-to-EBP
<span id="L574" class="LineNr">574 </span> c3/return
<span id="L575" class="LineNr">575 </span>
<span id="L576" class="LineNr">576 </span>== data
<span id="L577" class="LineNr">577 </span>
<span id="L578" class="LineNr">578 </span><span class="SpecialChar">Look</span>: <span class="subxComment"># (char with some extra padding)</span>
<span id="L579" class="LineNr">579 </span> 0/imm32
<span id="L580" class="LineNr">580 </span>
<span id="L581" class="LineNr">581 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L582" class="LineNr">582 </span> <span class="subxComment"># current write index</span>
<span id="L583" class="LineNr">583 </span> 0/imm32
<span id="L584" class="LineNr">584 </span> <span class="subxComment"># current read index</span>
<span id="L585" class="LineNr">585 </span> 0/imm32
<span id="L586" class="LineNr">586 </span> <span class="subxComment"># length</span>
<span id="L587" class="LineNr">587 </span> 8/imm32
<span id="L588" class="LineNr">588 </span> <span class="subxComment"># data</span>
<span id="L589" class="LineNr">589 </span> 00 00 00 00 00 00 00 00 <span class="subxComment"># 8 bytes</span>
<span id="L590" class="LineNr">590 </span>
<span id="L591" class="LineNr">591 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L592" class="LineNr">592 </span> <span class="subxComment"># current write index</span>
<span id="L593" class="LineNr">593 </span> 0/imm32
<span id="L594" class="LineNr">594 </span> <span class="subxComment"># current read index</span>
<span id="L595" class="LineNr">595 </span> 0/imm32
<span id="L596" class="LineNr">596 </span> <span class="subxComment"># length</span>
<span id="L597" class="LineNr">597 </span> 0x40/imm32
<span id="L598" class="LineNr">598 </span> <span class="subxComment"># data (4 lines x 16 bytes/line)</span>
<span id="L599" class="LineNr">599 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L600" class="LineNr">600 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L601" class="LineNr">601 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L602" class="LineNr">602 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L603" class="LineNr">603 </span>
<span id="L604" class="LineNr">604 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L532" class="LineNr">532 </span><span class="subxFunction">is-digit?</span>: <span class="subxComment"># c : int -&gt; EAX : boolean</span>
<span id="L533" class="LineNr">533 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L534" class="LineNr">534 </span> 55/push-EBP
<span id="L535" class="LineNr">535 </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="L536" class="LineNr">536 </span> <span class="subxComment"># EAX = false</span>
<span id="L537" class="LineNr">537 </span> b8/copy-to-EAX 0/imm32
<span id="L538" class="LineNr">538 </span> <span class="subxComment"># if (c &lt; '0') return false</span>
<span id="L539" class="LineNr">539 </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> 8/disp8 0x30/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L540" class="LineNr">540 </span> 7c/jump-if-lesser $is-digit?:end/disp8
<span id="L541" class="LineNr">541 </span> <span class="subxComment"># if (c &gt; '9') return false</span>
<span id="L542" class="LineNr">542 </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> 8/disp8 0x39/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L543" class="LineNr">543 </span> 7f/jump-if-greater $is-digit?:end/disp8
<span id="L544" class="LineNr">544 </span> <span class="subxComment"># otherwise return true</span>
<span id="L545" class="LineNr">545 </span> b8/copy-to-EAX 1/imm32
<span id="L546" class="LineNr">546 </span><span class="Constant">$is-digit?:end</span>:
<span id="L547" class="LineNr">547 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L548" class="LineNr">548 </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="L549" class="LineNr">549 </span> 5d/pop-to-EBP
<span id="L550" class="LineNr">550 </span> c3/return
<span id="L551" class="LineNr">551 </span>
<span id="L552" class="LineNr">552 </span>== data
<span id="L553" class="LineNr">553 </span>
<span id="L554" class="LineNr">554 </span><span class="SpecialChar">Look</span>: <span class="subxComment"># (char with some extra padding)</span>
<span id="L555" class="LineNr">555 </span> 0/imm32
<span id="L556" class="LineNr">556 </span>
<span id="L557" class="LineNr">557 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L558" class="LineNr">558 </span> <span class="subxComment"># current write index</span>
<span id="L559" class="LineNr">559 </span> 0/imm32
<span id="L560" class="LineNr">560 </span> <span class="subxComment"># current read index</span>
<span id="L561" class="LineNr">561 </span> 0/imm32
<span id="L562" class="LineNr">562 </span> <span class="subxComment"># length</span>
<span id="L563" class="LineNr">563 </span> 8/imm32
<span id="L564" class="LineNr">564 </span> <span class="subxComment"># data</span>
<span id="L565" class="LineNr">565 </span> 00 00 00 00 00 00 00 00 <span class="subxComment"># 8 bytes</span>
<span id="L566" class="LineNr">566 </span>
<span id="L567" class="LineNr">567 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L568" class="LineNr">568 </span> <span class="subxComment"># current write index</span>
<span id="L569" class="LineNr">569 </span> 0/imm32
<span id="L570" class="LineNr">570 </span> <span class="subxComment"># current read index</span>
<span id="L571" class="LineNr">571 </span> 0/imm32
<span id="L572" class="LineNr">572 </span> <span class="subxComment"># length</span>
<span id="L573" class="LineNr">573 </span> 0x40/imm32
<span id="L574" class="LineNr">574 </span> <span class="subxComment"># data (4 lines x 16 bytes/line)</span>
<span id="L575" class="LineNr">575 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L576" class="LineNr">576 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L577" class="LineNr">577 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L578" class="LineNr">578 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L579" class="LineNr">579 </span>
<span id="L580" class="LineNr">580 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,16 +6,17 @@
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="settings" content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
@ -64,250 +65,197 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </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="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># (re)compute the bounds of the next word in the line</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># return empty string on reaching end of file</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxFunction">next-word</span>: <span class="subxComment"># line : (address stream byte), out : (address slice)</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L12" class="LineNr"> 12 </span> 55/push-EBP
<span id="L13" class="LineNr"> 13 </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="L14" class="LineNr"> 14 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L15" class="LineNr"> 15 </span> 50/push-EAX
<span id="L16" class="LineNr"> 16 </span> 51/push-ECX
<span id="L17" class="LineNr"> 17 </span> 56/push-ESI
<span id="L18" class="LineNr"> 18 </span> 57/push-EDI
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># ESI = line</span>
<span id="L20" class="LineNr"> 20 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># EDI = out</span>
<span id="L22" class="LineNr"> 22 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDI</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># skip-chars-matching(line, ' ')</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L25" class="LineNr"> 25 </span> 68/push 0x20/imm32/space
<span id="L26" class="LineNr"> 26 </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="L27" class="LineNr"> 27 </span> <span class="subxS2Comment"># . . call</span>
<span id="L28" class="LineNr"> 28 </span> e8/call <a href='../073next-token.subx.html#L346'>skip-chars-matching</a>/disp32
<span id="L29" class="LineNr"> 29 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L30" class="LineNr"> 30 </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="L31" class="LineNr"> 31 </span><span class="Constant">$next-word:check0</span>:
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># if (line-&gt;read &gt;= line-&gt;write) clear out and return</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxS1Comment"># . EAX = line-&gt;read</span>
<span id="L34" class="LineNr"> 34 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <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 *(ESI+4) to EAX</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxS1Comment"># . if (EAX &lt; line-&gt;write) goto next check</span>
<span id="L36" class="LineNr"> 36 </span> 3b/compare 0/mod/indirect 6/rm32/ESI <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"># compare EAX with *ESI</span>
<span id="L37" class="LineNr"> 37 </span> 7c/jump-if-lesser $next-word:check1/disp8
<span id="L38" class="LineNr"> 38 </span> <span class="subxS1Comment"># . return out = {0, 0}</span>
<span id="L39" class="LineNr"> 39 </span> c7 0/subop/copy 0/mod/direct 7/rm32/EDI <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"># copy to *EDI</span>
<span id="L40" class="LineNr"> 40 </span> c7 0/subop/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 0/imm32 <span class="subxComment"># copy to *(EDI+4)</span>
<span id="L41" class="LineNr"> 41 </span> eb/jump $next-word:end/disp8
<span id="L42" class="LineNr"> 42 </span><span class="Constant">$next-word:check1</span>:
<span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># out-&gt;start = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L44" class="LineNr"> 44 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESI+4) to ECX</span>
<span id="L45" class="LineNr"> 45 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ESI+ECX+12 to EAX</span>
<span id="L46" class="LineNr"> 46 </span> 89/copy 0/mod/indirect 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="L47" class="LineNr"> 47 </span> <span class="subxComment"># if (line-&gt;data[line-&gt;read] == '#') out-&gt;end = &amp;line-&gt;data[line-&gt;write]), skip rest of stream and return</span>
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . EAX = line-&gt;data[line-&gt;read]</span>
<span id="L49" class="LineNr"> 49 </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="L50" class="LineNr"> 50 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+12) to AL</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxS1Comment"># . compare</span>
<span id="L52" class="LineNr"> 52 </span> 3d/compare-EAX-and 0x23/imm32/pound
<span id="L53" class="LineNr"> 53 </span> 75/jump-if-not-equal $next-word:not-comment/disp8
<span id="L54" class="LineNr"> 54 </span> <span class="subxS1Comment"># . out-&gt;end = &amp;line-&gt;data[line-&gt;write]</span>
<span id="L55" class="LineNr"> 55 </span> 8b/copy 0/mod/indirect 6/rm32/ESI <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 *ESI to EAX</span>
<span id="L56" class="LineNr"> 56 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ESI+EAX+12 to EAX</span>
<span id="L57" class="LineNr"> 57 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EAX to *(EDI+4)</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxS1Comment"># . line-&gt;read = line-&gt;write</span>
<span id="L59" class="LineNr"> 59 </span> 89/copy 1/mod/*+disp8 6/rm32/ESI <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 EAX to *(ESI+4)</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxS1Comment"># . return</span>
<span id="L61" class="LineNr"> 61 </span> eb/jump $next-word:end/disp8
<span id="L62" class="LineNr"> 62 </span><span class="Constant">$next-word:not-comment</span>:
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment"># otherwise skip-chars-not-matching-whitespace(line) # including trailing newline</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L65" class="LineNr"> 65 </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="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . call</span>
<span id="L67" class="LineNr"> 67 </span> e8/call <a href='../073next-token.subx.html#L632'>skip-chars-not-matching-whitespace</a>/disp32
<span id="L68" class="LineNr"> 68 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L69" class="LineNr"> 69 </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="L70" class="LineNr"> 70 </span> <span class="subxComment"># out-&gt;end = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L71" class="LineNr"> 71 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESI+4) to ECX</span>
<span id="L72" class="LineNr"> 72 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ESI+ECX+12 to EAX</span>
<span id="L73" class="LineNr"> 73 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EAX to *(EDI+4)</span>
<span id="L74" class="LineNr"> 74 </span><span class="Constant">$next-word:end</span>:
<span id="L75" class="LineNr"> 75 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L76" class="LineNr"> 76 </span> 5f/pop-to-EDI
<span id="L77" class="LineNr"> 77 </span> 5e/pop-to-ESI
<span id="L78" class="LineNr"> 78 </span> 59/pop-to-ECX
<span id="L79" class="LineNr"> 79 </span> 58/pop-to-EAX
<span id="L80" class="LineNr"> 80 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L81" class="LineNr"> 81 </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="L82" class="LineNr"> 82 </span> 5d/pop-to-EBP
<span id="L83" class="LineNr"> 83 </span> c3/return
<span id="L84" class="LineNr"> 84 </span>
<span id="L85" class="LineNr"> 85 </span><span class="subxTest">test-next-word</span>:
<span id="L86" class="LineNr"> 86 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L87" class="LineNr"> 87 </span> 55/push-EBP
<span id="L88" class="LineNr"> 88 </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="L89" class="LineNr"> 89 </span> <span class="subxComment"># setup</span>
<span id="L90" class="LineNr"> 90 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># write an entire stream's contents to a buffered-file</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># ways to do this:</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># - construct a 'maximal slice' and pass it to write-slice</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxComment"># - flush the buffered-file and pass the stream directly to its fd (disabling buffering)</span>
<span id="L12" class="LineNr"> 12 </span><span class="subxComment"># we'll go with the first way for now</span>
<span id="L13" class="LineNr"> 13 </span><span class="subxFunction">write-stream-data</span>: <span class="subxComment"># f : (address buffered-file), s : (address stream) -&gt; &lt;void&gt;</span>
<span id="L14" class="LineNr"> 14 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L15" class="LineNr"> 15 </span> 55/push-EBP
<span id="L16" class="LineNr"> 16 </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="L17" class="LineNr"> 17 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L18" class="LineNr"> 18 </span> 50/push-EAX
<span id="L19" class="LineNr"> 19 </span> 51/push-ECX
<span id="L20" class="LineNr"> 20 </span> 56/push-ESI
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># ESI = s</span>
<span id="L22" class="LineNr"> 22 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to ESI</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># var slice/ECX = {s-&gt;data, s-&gt;data + s-&gt;write}</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxS1Comment"># . push s-&gt;data + s-&gt;write</span>
<span id="L25" class="LineNr"> 25 </span> 8b/copy 0/mod/indirect 6/rm32/ESI <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 *ESI to EAX</span>
<span id="L26" class="LineNr"> 26 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ESI+EAX+12 to EAX</span>
<span id="L27" class="LineNr"> 27 </span> 50/push-EAX
<span id="L28" class="LineNr"> 28 </span> <span class="subxS1Comment"># . push s-&gt;data</span>
<span id="L29" class="LineNr"> 29 </span> 8d/copy-address 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ESI+12 to EAX</span>
<span id="L30" class="LineNr"> 30 </span> 50/push-EAX
<span id="L31" class="LineNr"> 31 </span> <span class="subxS1Comment"># . ECX = ESP</span>
<span id="L32" class="LineNr"> 32 </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="L33" class="LineNr"> 33 </span> <span class="subxComment"># write-slice(f, slice)</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L35" class="LineNr"> 35 </span> 51/push-ECX
<span id="L36" class="LineNr"> 36 </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="L37" class="LineNr"> 37 </span> <span class="subxS2Comment"># . . call</span>
<span id="L38" class="LineNr"> 38 </span> e8/call <a href='../072slice.subx.html#L707'>write-slice</a>/disp32
<span id="L39" class="LineNr"> 39 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L40" class="LineNr"> 40 </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="L41" class="LineNr"> 41 </span><span class="Constant">$write-stream-data:end</span>:
<span id="L42" class="LineNr"> 42 </span> <span class="subxS1Comment"># . restore locals</span>
<span id="L43" class="LineNr"> 43 </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="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L45" class="LineNr"> 45 </span> 5e/pop-to-ESI
<span id="L46" class="LineNr"> 46 </span> 59/pop-to-ECX
<span id="L47" class="LineNr"> 47 </span> 58/pop-to-EAX
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L49" class="LineNr"> 49 </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="L50" class="LineNr"> 50 </span> 5d/pop-to-EBP
<span id="L51" class="LineNr"> 51 </span> c3/return
<span id="L52" class="LineNr"> 52 </span>
<span id="L53" class="LineNr"> 53 </span><span class="subxTest">test-write-stream-data</span>:
<span id="L54" class="LineNr"> 54 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L55" class="LineNr"> 55 </span> 55/push-EBP
<span id="L56" class="LineNr"> 56 </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="L57" class="LineNr"> 57 </span> <span class="subxComment"># setup</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L60" class="LineNr"> 60 </span> 68/push <a href='subx-common.subx.html#L160'>_test-output-stream</a>/imm32
<span id="L61" class="LineNr"> 61 </span> <span class="subxS2Comment"># . . call</span>
<span id="L62" class="LineNr"> 62 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L63" class="LineNr"> 63 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L64" class="LineNr"> 64 </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="L65" class="LineNr"> 65 </span> <span class="subxS1Comment"># . clear-stream(_test-output-buffered-file+4)</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L67" class="LineNr"> 67 </span> b8/copy-to-EAX <a href='subx-common.subx.html#L186'>_test-output-buffered-file</a>/imm32
<span id="L68" class="LineNr"> 68 </span> 05/add-to-EAX 4/imm32
<span id="L69" class="LineNr"> 69 </span> 50/push-EAX
<span id="L70" class="LineNr"> 70 </span> <span class="subxS2Comment"># . . call</span>
<span id="L71" class="LineNr"> 71 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L73" class="LineNr"> 73 </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="L74" class="LineNr"> 74 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L76" class="LineNr"> 76 </span> 68/push <a href='subx-common.subx.html#L122'>_test-input-stream</a>/imm32
<span id="L77" class="LineNr"> 77 </span> <span class="subxS2Comment"># . . call</span>
<span id="L78" class="LineNr"> 78 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L79" class="LineNr"> 79 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L80" class="LineNr"> 80 </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="L81" class="LineNr"> 81 </span> <span class="subxComment"># initialize input</span>
<span id="L82" class="LineNr"> 82 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;abcd&quot;)</span>
<span id="L83" class="LineNr"> 83 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L84" class="LineNr"> 84 </span> 68/push <span class="Constant">&quot;abcd&quot;</span>/imm32
<span id="L85" class="LineNr"> 85 </span> 68/push <a href='subx-common.subx.html#L122'>_test-input-stream</a>/imm32
<span id="L86" class="LineNr"> 86 </span> <span class="subxS2Comment"># . . call</span>
<span id="L87" class="LineNr"> 87 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L88" class="LineNr"> 88 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L89" class="LineNr"> 89 </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="L90" class="LineNr"> 90 </span> <span class="subxComment"># write-stream-data(_test-output-buffered-file, _test-input-stream)</span>
<span id="L91" class="LineNr"> 91 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L92" class="LineNr"> 92 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L93" class="LineNr"> 93 </span> <span class="subxS2Comment"># . . call</span>
<span id="L94" class="LineNr"> 94 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L95" class="LineNr"> 95 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L96" class="LineNr"> 96 </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="L97" class="LineNr"> 97 </span> <span class="subxComment"># var slice/ECX = {0, 0}</span>
<span id="L98" class="LineNr"> 98 </span> 68/push 0/imm32/end
<span id="L99" class="LineNr"> 99 </span> 68/push 0/imm32/start
<span id="L100" class="LineNr">100 </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="L101" class="LineNr">101 </span> <span class="subxComment"># write(_test-stream, &quot; ab&quot;)</span>
<span id="L102" class="LineNr">102 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L103" class="LineNr">103 </span> 68/push <span class="Constant">&quot; ab&quot;</span>/imm32
<span id="L104" class="LineNr">104 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . call</span>
<span id="L106" class="LineNr">106 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L107" class="LineNr">107 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L108" class="LineNr">108 </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="L109" class="LineNr">109 </span> <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L110" class="LineNr">110 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L111" class="LineNr">111 </span> 51/push-ECX
<span id="L112" class="LineNr">112 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . call</span>
<span id="L114" class="LineNr">114 </span> e8/call <a href='subx-common.subx.html#L10'>next-word</a>/disp32
<span id="L115" class="LineNr">115 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L116" class="LineNr">116 </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="L117" class="LineNr">117 </span> <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-stream-&gt;data, 2, msg)</span>
<span id="L118" class="LineNr">118 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-stream, 14, msg)</span>
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L120" class="LineNr">120 </span> 68/push <span class="Constant">&quot;F - <a href='subx-common.subx.html#L85'>test-next-word</a>: start&quot;</span>/imm32
<span id="L121" class="LineNr">121 </span> 68/push 0xe/imm32
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . push slice-&gt;start - _test-stream</span>
<span id="L123" class="LineNr">123 </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>
<span id="L124" class="LineNr">124 </span> 81 5/subop/subtract 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <a href='../057write.subx.html#L148'>_test-stream</a>/imm32 <span class="subxComment"># subtract from EAX</span>
<span id="L125" class="LineNr">125 </span> 50/push-EAX
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . call</span>
<span id="L127" class="LineNr">127 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L128" class="LineNr">128 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L129" class="LineNr">129 </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="L130" class="LineNr">130 </span> <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-stream-&gt;data, 4, msg)</span>
<span id="L131" class="LineNr">131 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-stream, 16, msg)</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;F - <a href='subx-common.subx.html#L85'>test-next-word</a>: end&quot;</span>/imm32
<span id="L134" class="LineNr">134 </span> 68/push 0x10/imm32
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . push slice-&gt;end - _test-stream</span>
<span id="L136" class="LineNr">136 </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>
<span id="L137" class="LineNr">137 </span> 81 5/subop/subtract 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <a href='../057write.subx.html#L148'>_test-stream</a>/imm32 <span class="subxComment"># subtract from EAX</span>
<span id="L138" class="LineNr">138 </span> 50/push-EAX
<span id="L139" class="LineNr">139 </span> <span class="subxS2Comment"># . . call</span>
<span id="L140" class="LineNr">140 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L142" class="LineNr">142 </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="L143" class="LineNr">143 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L144" class="LineNr">144 </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="L145" class="LineNr">145 </span> 5d/pop-to-EBP
<span id="L146" class="LineNr">146 </span> c3/return
<span id="L147" class="LineNr">147 </span>
<span id="L148" class="LineNr">148 </span><span class="subxTest">test-next-word-returns-whole-comment</span>:
<span id="L149" class="LineNr">149 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L150" class="LineNr">150 </span> 55/push-EBP
<span id="L151" class="LineNr">151 </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="L152" class="LineNr">152 </span> <span class="subxComment"># setup</span>
<span id="L153" class="LineNr">153 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L155" class="LineNr">155 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . call</span>
<span id="L157" class="LineNr">157 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L159" class="LineNr">159 </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="L160" class="LineNr">160 </span> <span class="subxComment"># var slice/ECX = {0, 0}</span>
<span id="L161" class="LineNr">161 </span> 68/push 0/imm32/end
<span id="L162" class="LineNr">162 </span> 68/push 0/imm32/start
<span id="L163" class="LineNr">163 </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="L164" class="LineNr">164 </span> <span class="subxComment"># write(_test-stream, &quot; # a&quot;)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L166" class="LineNr">166 </span> 68/push <span class="Constant">&quot; # a&quot;</span>/imm32
<span id="L167" class="LineNr">167 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L168" class="LineNr">168 </span> <span class="subxS2Comment"># . . call</span>
<span id="L169" class="LineNr">169 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L171" class="LineNr">171 </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="L172" class="LineNr">172 </span> <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L174" class="LineNr">174 </span> 51/push-ECX
<span id="L175" class="LineNr">175 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . call</span>
<span id="L177" class="LineNr">177 </span> e8/call <a href='subx-common.subx.html#L10'>next-word</a>/disp32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L179" class="LineNr">179 </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="L180" class="LineNr">180 </span> <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-stream-&gt;data, 2, msg)</span>
<span id="L181" class="LineNr">181 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-stream, 14, msg)</span>
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L183" class="LineNr">183 </span> 68/push <span class="Constant">&quot;F - <a href='subx-common.subx.html#L148'>test-next-word-returns-whole-comment</a>: start&quot;</span>/imm32
<span id="L184" class="LineNr">184 </span> 68/push 0xe/imm32
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . push slice-&gt;start - _test-stream</span>
<span id="L186" class="LineNr">186 </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>
<span id="L187" class="LineNr">187 </span> 81 5/subop/subtract 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <a href='../057write.subx.html#L148'>_test-stream</a>/imm32 <span class="subxComment"># subtract from EAX</span>
<span id="L188" class="LineNr">188 </span> 50/push-EAX
<span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . call</span>
<span id="L190" class="LineNr">190 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L193" class="LineNr">193 </span> <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-stream-&gt;data, 5, msg)</span>
<span id="L194" class="LineNr">194 </span> <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-stream, 17, msg)</span>
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L196" class="LineNr">196 </span> 68/push <span class="Constant">&quot;F - <a href='subx-common.subx.html#L148'>test-next-word-returns-whole-comment</a>: end&quot;</span>/imm32
<span id="L197" class="LineNr">197 </span> 68/push 0x11/imm32
<span id="L198" class="LineNr">198 </span> <span class="subxS2Comment"># . . push slice-&gt;end - _test-stream</span>
<span id="L199" class="LineNr">199 </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>
<span id="L200" class="LineNr">200 </span> 81 5/subop/subtract 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <a href='../057write.subx.html#L148'>_test-stream</a>/imm32 <span class="subxComment"># subtract from EAX</span>
<span id="L201" class="LineNr">201 </span> 50/push-EAX
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </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="L206" class="LineNr">206 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L207" class="LineNr">207 </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="L208" class="LineNr">208 </span> 5d/pop-to-EBP
<span id="L209" class="LineNr">209 </span> c3/return
<span id="L210" class="LineNr">210 </span>
<span id="L211" class="LineNr">211 </span><span class="subxTest">test-next-word-returns-empty-string-on-eof</span>:
<span id="L212" class="LineNr">212 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L213" class="LineNr">213 </span> 55/push-EBP
<span id="L214" class="LineNr">214 </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="L215" class="LineNr">215 </span> <span class="subxComment"># setup</span>
<span id="L216" class="LineNr">216 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L217" class="LineNr">217 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L218" class="LineNr">218 </span> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L219" class="LineNr">219 </span> <span class="subxS2Comment"># . . call</span>
<span id="L220" class="LineNr">220 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L223" class="LineNr">223 </span> <span class="subxComment"># var slice/ECX = {0, 0}</span>
<span id="L224" class="LineNr">224 </span> 68/push 0/imm32/end
<span id="L225" class="LineNr">225 </span> 68/push 0/imm32/start
<span id="L226" class="LineNr">226 </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="L227" class="LineNr">227 </span> <span class="subxComment"># write nothing to _test-stream</span>
<span id="L228" class="LineNr">228 </span> <span class="subxComment"># next-word(_test-stream, slice)</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> 68/push <a href='../057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L232" class="LineNr">232 </span> <span class="subxS2Comment"># . . call</span>
<span id="L233" class="LineNr">233 </span> e8/call <a href='subx-common.subx.html#L10'>next-word</a>/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"># check-ints-equal(slice-&gt;end - slice-&gt;start, 0, msg)</span>
<span id="L237" class="LineNr">237 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L238" class="LineNr">238 </span> 68/push <span class="Constant">&quot;F - test-next-word-returns-empty-string-on-eof&quot;</span>/imm32
<span id="L239" class="LineNr">239 </span> 68/push 0/imm32
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . push slice-&gt;end - slice-&gt;start</span>
<span id="L241" class="LineNr">241 </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>
<span id="L242" class="LineNr">242 </span> 2b/subtract 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"># subtract *ECX from EAX</span>
<span id="L243" class="LineNr">243 </span> 50/push-EAX
<span id="L244" class="LineNr">244 </span> <span class="subxS2Comment"># . . call</span>
<span id="L245" class="LineNr">245 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L246" class="LineNr">246 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L247" class="LineNr">247 </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="L248" class="LineNr">248 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L249" class="LineNr">249 </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="L250" class="LineNr">250 </span> 5d/pop-to-EBP
<span id="L251" class="LineNr">251 </span> c3/return
<span id="L92" class="LineNr"> 92 </span> 68/push <a href='subx-common.subx.html#L122'>_test-input-stream</a>/imm32
<span id="L93" class="LineNr"> 93 </span> 68/push <a href='subx-common.subx.html#L186'>_test-output-buffered-file</a>/imm32
<span id="L94" class="LineNr"> 94 </span> <span class="subxS2Comment"># . . call</span>
<span id="L95" class="LineNr"> 95 </span> e8/call <a href='subx-common.subx.html#L13'>write-stream-data</a>/disp32
<span id="L96" class="LineNr"> 96 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L97" class="LineNr"> 97 </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="L98" class="LineNr"> 98 </span> <span class="subxComment"># check that the write happened as expected</span>
<span id="L99" class="LineNr"> 99 </span> <span class="subxS1Comment"># . flush(_test-output-buffered-file)</span>
<span id="L100" class="LineNr">100 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L101" class="LineNr">101 </span> 68/push <a href='subx-common.subx.html#L186'>_test-output-buffered-file</a>/imm32
<span id="L102" class="LineNr">102 </span> <span class="subxS2Comment"># . . call</span>
<span id="L103" class="LineNr">103 </span> e8/call <a href='../064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L104" class="LineNr">104 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L105" class="LineNr">105 </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="L106" class="LineNr">106 </span> <span class="subxS1Comment"># . check-stream-equal(_test-output-stream, &quot;abcd&quot;, msg)</span>
<span id="L107" class="LineNr">107 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L108" class="LineNr">108 </span> 68/push <span class="Constant">&quot;F - test-write-stream-data&quot;</span>/imm32
<span id="L109" class="LineNr">109 </span> 68/push <span class="Constant">&quot;abcd&quot;</span>/imm32
<span id="L110" class="LineNr">110 </span> 68/push <a href='subx-common.subx.html#L160'>_test-output-stream</a>/imm32
<span id="L111" class="LineNr">111 </span> <span class="subxS2Comment"># . . call</span>
<span id="L112" class="LineNr">112 </span> e8/call <a href='../058stream-equal.subx.html#L199'>check-stream-equal</a>/disp32
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L114" class="LineNr">114 </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="L115" class="LineNr">115 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L116" class="LineNr">116 </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="L117" class="LineNr">117 </span> 5d/pop-to-EBP
<span id="L118" class="LineNr">118 </span> c3/return
<span id="L119" class="LineNr">119 </span>
<span id="L120" class="LineNr">120 </span>== data
<span id="L121" class="LineNr">121 </span>
<span id="L122" class="LineNr">122 </span><span class="subxMinorFunction">_test-input-stream</span>:
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># current write index</span>
<span id="L124" class="LineNr">124 </span> 0/imm32
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># current read index</span>
<span id="L126" class="LineNr">126 </span> 0/imm32
<span id="L127" class="LineNr">127 </span> <span class="subxComment"># length</span>
<span id="L128" class="LineNr">128 </span> 0x100/imm32 <span class="subxComment"># 256 bytes</span>
<span id="L129" class="LineNr">129 </span> <span class="subxComment"># data (16 lines x 16 bytes/line)</span>
<span id="L130" class="LineNr">130 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L131" class="LineNr">131 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L132" class="LineNr">132 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L133" class="LineNr">133 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L134" class="LineNr">134 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L135" class="LineNr">135 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L136" class="LineNr">136 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L137" class="LineNr">137 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L138" class="LineNr">138 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L139" class="LineNr">139 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L140" class="LineNr">140 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L141" class="LineNr">141 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L142" class="LineNr">142 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L143" class="LineNr">143 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L144" class="LineNr">144 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L145" class="LineNr">145 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L146" class="LineNr">146 </span>
<span id="L147" class="LineNr">147 </span><span class="subxComment"># a test buffered file for _test-input-stream</span>
<span id="L148" class="LineNr">148 </span><span class="subxMinorFunction">_test-input-buffered-file</span>:
<span id="L149" class="LineNr">149 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L150" class="LineNr">150 </span> <a href='subx-common.subx.html#L122'>_test-input-stream</a>/imm32
<span id="L151" class="LineNr">151 </span> <span class="subxComment"># current write index</span>
<span id="L152" class="LineNr">152 </span> 0/imm32
<span id="L153" class="LineNr">153 </span> <span class="subxComment"># current read index</span>
<span id="L154" class="LineNr">154 </span> 0/imm32
<span id="L155" class="LineNr">155 </span> <span class="subxComment"># length</span>
<span id="L156" class="LineNr">156 </span> 6/imm32
<span id="L157" class="LineNr">157 </span> <span class="subxComment"># data</span>
<span id="L158" class="LineNr">158 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L161" class="LineNr">161 </span> <span class="subxComment"># current write index</span>
<span id="L162" class="LineNr">162 </span> 0/imm32
<span id="L163" class="LineNr">163 </span> <span class="subxComment"># current read index</span>
<span id="L164" class="LineNr">164 </span> 0/imm32
<span id="L165" class="LineNr">165 </span> <span class="subxComment"># length</span>
<span id="L166" class="LineNr">166 </span> 0x100/imm32 <span class="subxComment"># 256 bytes</span>
<span id="L167" class="LineNr">167 </span> <span class="subxComment"># data (16 lines x 16 bytes/line)</span>
<span id="L168" class="LineNr">168 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L169" class="LineNr">169 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L170" class="LineNr">170 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L171" class="LineNr">171 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L172" class="LineNr">172 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L173" class="LineNr">173 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L174" class="LineNr">174 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L175" class="LineNr">175 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L176" class="LineNr">176 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L177" class="LineNr">177 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L178" class="LineNr">178 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L179" class="LineNr">179 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L180" class="LineNr">180 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L181" class="LineNr">181 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L182" class="LineNr">182 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L183" class="LineNr">183 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L184" class="LineNr">184 </span>
<span id="L185" class="LineNr">185 </span><span class="subxComment"># a test buffered file for _test-output-stream</span>
<span id="L186" class="LineNr">186 </span><span class="subxMinorFunction">_test-output-buffered-file</span>:
<span id="L187" class="LineNr">187 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L188" class="LineNr">188 </span> <a href='subx-common.subx.html#L160'>_test-output-stream</a>/imm32
<span id="L189" class="LineNr">189 </span> <span class="subxComment"># current write index</span>
<span id="L190" class="LineNr">190 </span> 0/imm32
<span id="L191" class="LineNr">191 </span> <span class="subxComment"># current read index</span>
<span id="L192" class="LineNr">192 </span> 0/imm32
<span id="L193" class="LineNr">193 </span> <span class="subxComment"># length</span>
<span id="L194" class="LineNr">194 </span> 6/imm32
<span id="L195" class="LineNr">195 </span> <span class="subxComment"># data</span>
<span id="L196" class="LineNr">196 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>