This commit is contained in:
Kartik Agaram 2019-08-25 15:53:24 -07:00
parent 9ac3fde9ab
commit 6033844884
65 changed files with 16110 additions and 11224 deletions

View File

@ -14,7 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
@ -22,7 +22,7 @@ a { color:inherit; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.PreProc { color: #c000c0; }
.SalientComment { color: #0000af; }
-->
</style>
@ -428,7 +428,7 @@ if ('onhashchange' in window) {
<span id="L367" class="LineNr">367 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L368" class="LineNr">368 </span> cerr &lt;&lt; <span class="Constant">&quot;Run `subx help instructions` for details on <a href='011run.cc.html#L123'>words</a> like 'r32' and 'disp8'.\n&quot;</span>
<span id="L369" class="LineNr">369 </span> <span class="Constant">&quot;For complete details on these instructions, consult the IA-32 manual (volume 2).\n&quot;</span>
<span id="L370" class="LineNr">370 </span> <span class="Constant">&quot;There's various versions of it online, such as <a href="https://c9x.me/x86">https://c9x.me/x86</a>.\n&quot;</span>
<span id="L370" class="LineNr">370 </span> <span class="Constant">&quot;There's various versions of it online, such as <a href="https://c9x.me/x86.">https://c9x.me/x86.</a>\n&quot;</span>
<span id="L371" class="LineNr">371 </span> <span class="Constant">&quot;The mnemonics in brackets will help you locate each instruction.\n&quot;</span><span class="Delimiter">;</span>
<span id="L372" class="LineNr">372 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L373" class="LineNr">373 </span><span class="Delimiter">}</span>

View File

@ -14,9 +14,9 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }

View File

@ -66,189 +66,190 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Main&quot;)</span>
<span id="L6" class="LineNr"> 6 </span>assert<span class="Delimiter">(</span>argc &gt; <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L96'>is_equal</a><span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L8" class="LineNr"> 8 </span> <a href='003trace.cc.html#L206'>START_TRACING_UNTIL_END_OF_SCOPE</a><span class="Delimiter">;</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== Starting to run&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L10" class="LineNr"> 10 </span> assert<span class="Delimiter">(</span>argc &gt; <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L11" class="LineNr"> 11 </span> <a href='000organization.cc.html#L148'>reset</a><span class="Delimiter">();</span>
<span id="L12" class="LineNr"> 12 </span> cerr &lt;&lt; std::hex<span class="Delimiter">;</span>
<span id="L13" class="LineNr"> 13 </span> <a href='012elf.cc.html#L21'>load_elf</a><span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L14" class="LineNr"> 14 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a> &lt; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span><span class="Delimiter">)</span> <span class="Comment">// weak final-gasp termination check</span>
<span id="L15" class="LineNr"> 15 </span> <a href='010---vm.cc.html#L267'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;executed past end of the world: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L29'>EIP</a> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L18" class="LineNr"> 18 </span><span class="Delimiter">}</span>
<span id="L19" class="LineNr"> 19 </span>
<span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(code)</span>
<span id="L21" class="LineNr"> 21 </span><span class="Normal">void</span> <a href='012elf.cc.html#L21'>load_elf</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; filename<span class="Delimiter">,</span> <span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Normal">int</span> fd = open<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> O_RDONLY<span class="Delimiter">);</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; filename<span class="Delimiter">.</span>c_str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: open&quot;</span> &lt;&lt; <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L24" class="LineNr"> 24 </span> <span class="Normal">off_t</span> size = lseek<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">SEEK_END</span><span class="Delimiter">);</span>
<span id="L25" class="LineNr"> 25 </span> lseek<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">SEEK_SET</span><span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span> <span class="Normal">uint8_t</span>* elf_contents = <span class="Normal">static_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span>malloc<span class="Delimiter">(</span>size<span class="Delimiter">));</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents == <span class="Constant">NULL</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;malloc(&quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">')'</span> &lt;&lt; <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Normal">ssize_t</span> read_size = read<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> elf_contents<span class="Delimiter">,</span> size<span class="Delimiter">);</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size != read_size<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;read → &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; (!= &quot;</span> &lt;&lt; read_size &lt;&lt; <span class="Constant">')'</span> &lt;&lt; <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L34'>load_elf_contents</a><span class="Delimiter">(</span>elf_contents<span class="Delimiter">,</span> size<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span> free<span class="Delimiter">(</span>elf_contents<span class="Delimiter">);</span>
<span id="L32" class="LineNr"> 32 </span><span class="Delimiter">}</span>
<span id="L33" class="LineNr"> 33 </span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">void</span> <a href='012elf.cc.html#L34'>load_elf_contents</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Normal">uint8_t</span> magic[<span class="Constant">5</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
<span id="L36" class="LineNr"> 36 </span> memcpy<span class="Delimiter">(</span>magic<span class="Delimiter">,</span> elf_contents<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>memcmp<span class="Delimiter">(</span>magic<span class="Delimiter">,</span> <span class="Constant">&quot;\177ELF&quot;</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid ELF file; starts with \&quot;&quot; &lt;&lt; magic &lt;&lt; '&quot;</span>' &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L39" class="LineNr"> 39 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents[<span class="Constant">4</span>] != <span class="Constant">1</span><span class="Delimiter">)</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Only 32-bit ELF files (4-byte words; virtual addresses up to 4GB) supported.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents[<span class="Constant">5</span>] != <span class="Constant">1</span><span class="Delimiter">)</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Only little-endian ELF files supported.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Comment">// unused: remaining 10 bytes of e_ident</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Normal">uint32_t</span> e_machine_type = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_machine_type != <span class="Constant">0x00030002</span><span class="Delimiter">)</span>
<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Comment">// unused: e_version. We only support version 1, and later versions will be backwards compatible.</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">uint32_t</span> e_entry = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">24</span>]<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Normal">uint32_t</span> e_phoff = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">28</span>]<span class="Delimiter">);</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Comment">// unused: e_shoff</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Comment">// unused: e_flags</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">uint32_t</span> e_ehsize = <a href='012elf.cc.html#L171'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">40</span>]<span class="Delimiter">);</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_ehsize &lt; <span class="Constant">52</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; ELF header too small\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L54" class="LineNr"> 54 </span> <span class="Normal">uint32_t</span> e_phentsize = <a href='012elf.cc.html#L171'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">42</span>]<span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Normal">uint32_t</span> e_phnum = <a href='012elf.cc.html#L171'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">44</span>]<span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; e_phnum &lt;&lt; <span class="Constant">&quot; entries in the program header, each &quot;</span> &lt;&lt; e_phentsize &lt;&lt; <span class="Constant">&quot; bytes long&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Comment">// unused: e_shentsize</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Comment">// unused: e_shnum</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Comment">// unused: e_shstrndx</span>
<span id="L60" class="LineNr"> 60 </span>
<span id="L61" class="LineNr"> 61 </span> set&lt;<span class="Normal">uint32_t</span>&gt; overlap<span class="Delimiter">;</span> <span class="Comment">// to detect overlapping segments</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; e_phnum<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L63" class="LineNr"> 63 </span> <a href='012elf.cc.html#L104'>load_segment_from_program_header</a><span class="Delimiter">(</span>elf_contents<span class="Delimiter">,</span> i<span class="Delimiter">,</span> size<span class="Delimiter">,</span> e_phoff + i*e_phentsize<span class="Delimiter">,</span> e_ehsize<span class="Delimiter">,</span> overlap<span class="Delimiter">);</span>
<span id="L64" class="LineNr"> 64 </span>
<span id="L65" class="LineNr"> 65 </span> <span class="Comment">// initialize code and stack</span>
<span id="L66" class="LineNr"> 66 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L149'>STACK_SEGMENT</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L149'>STACK_SEGMENT</a><span class="Delimiter">));</span>
<span id="L68" class="LineNr"> 68 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L150'>AFTER_STACK</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Comment">// The stack grows downward.</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <a href='012elf.cc.html#L150'>AFTER_STACK</a><span class="Delimiter">;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBP]<span class="Delimiter">.</span>u = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L72" class="LineNr"> 72 </span> <a href='010---vm.cc.html#L29'>EIP</a> = e_entry<span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span>
<span id="L74" class="LineNr"> 74 </span> <span class="Comment">// initialize args on stack</span>
<span id="L75" class="LineNr"> 75 </span> <span class="Comment">// no envp for now</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Comment">// we wastefully use a separate page of memory for argv</span>
<span id="L77" class="LineNr"> 77 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L151'>ARGV_DATA_SEGMENT</a><span class="Delimiter">));</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Normal">uint32_t</span> argv_data = <a href='012elf.cc.html#L151'>ARGV_DATA_SEGMENT</a><span class="Delimiter">;</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = argc-<span class="Constant">1</span><span class="Delimiter">;</span> i &gt;= <span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span> --i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L80" class="LineNr"> 80 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">);</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt;= strlen<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L82" class="LineNr"> 82 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>argv_data<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span> <span class="Comment">// don't bother comparing ARGV and STACK</span>
<span id="L83" class="LineNr"> 83 </span> <a href='010---vm.cc.html#L234'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span> argv_data += <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">char</span><span class="Delimiter">);</span>
<span id="L85" class="LineNr"> 85 </span> assert<span class="Delimiter">(</span>argv_data &lt; <a href='012elf.cc.html#L151'>ARGV_DATA_SEGMENT</a> + <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span>
<span id="L88" class="LineNr"> 88 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>argc-<span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u -= <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L149'>STACK_SEGMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;The stack overflowed its segment. &quot;</span>
<span id="L95" class="LineNr"> 95 </span> &lt;&lt; <span class="Constant">&quot;Maybe SPACE_FOR_SEGMENT should be larger? &quot;</span>
<span id="L96" class="LineNr"> 96 </span> &lt;&lt; <span class="Constant">&quot;Or you need to carve out an exception for the stack segment &quot;</span>
<span id="L97" class="LineNr"> 97 </span> &lt;&lt; <span class="Constant">&quot;to be larger.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span>
<span id="L99" class="LineNr"> 99 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span> <a href='010---vm.cc.html#L242'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L102" class="LineNr">102 </span><span class="Delimiter">}</span>
<span id="L103" class="LineNr">103 </span>
<span id="L104" class="LineNr">104 </span><span class="Normal">void</span> <a href='012elf.cc.html#L104'>load_segment_from_program_header</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">int</span> segment_index<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> offset<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> e_ehsize<span class="Delimiter">,</span> set&lt;<span class="Normal">uint32_t</span>&gt;&amp; overlap<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">uint32_t</span> p_type = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset]<span class="Delimiter">);</span>
<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;program header at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot;: type &quot;</span> &lt;&lt; p_type &lt;&lt; end<span class="Delimiter">();</span>
<span id="L107" class="LineNr">107 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_type != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L108" class="LineNr">108 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ignoring segment at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; of non PT_LOAD type &quot;</span> &lt;&lt; p_type &lt;&lt; <span class="Constant">&quot; (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L109" class="LineNr">109 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L110" class="LineNr">110 </span> <span class="Delimiter">}</span>
<span id="L111" class="LineNr">111 </span> <span class="Normal">uint32_t</span> p_offset = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">4</span>]<span class="Delimiter">);</span>
<span id="L112" class="LineNr">112 </span> <span class="Normal">uint32_t</span> p_vaddr = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">8</span>]<span class="Delimiter">);</span>
<span id="L113" class="LineNr">113 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_ehsize &gt; p_vaddr<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; program header overlaps ELF header\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L114" class="LineNr">114 </span> <span class="Comment">// unused: p_paddr</span>
<span id="L115" class="LineNr">115 </span> <span class="Normal">uint32_t</span> p_filesz = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">uint32_t</span> p_memsz = <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">20</span>]<span class="Delimiter">);</span>
<span id="L117" class="LineNr">117 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_filesz != p_memsz<span class="Delimiter">)</span>
<span id="L118" class="LineNr">118 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Can't yet handle segments where p_filesz != p_memsz (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L119" class="LineNr">119 </span>
<span id="L120" class="LineNr">120 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset + p_filesz &gt; size<span class="Delimiter">)</span>
<span id="L121" class="LineNr">121 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; segment at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; is too large: wants to end at &quot;</span> &lt;&lt; p_offset+p_filesz &lt;&lt; <span class="Constant">&quot; but the file ends at &quot;</span> &lt;&lt; size &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L122" class="LineNr">122 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_memsz &gt;= <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L123" class="LineNr">123 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Code segment too small for SubX; for now please manually increase SEGMENT_ALIGNMENT.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L124" class="LineNr">124 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L125" class="LineNr">125 </span> <span class="Delimiter">}</span>
<span id="L126" class="LineNr">126 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;blitting file offsets (&quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset+p_filesz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;) to addresses (&quot;</span> &lt;&lt; p_vaddr &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_vaddr+p_memsz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">')'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L127" class="LineNr">127 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size &gt; p_memsz<span class="Delimiter">)</span> size = p_memsz<span class="Delimiter">;</span>
<span id="L128" class="LineNr">128 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>p_vaddr<span class="Delimiter">));</span>
<span id="L129" class="LineNr">129 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p_filesz<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L130" class="LineNr">130 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L131" class="LineNr">131 </span> <a href='010---vm.cc.html#L234'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L132" class="LineNr">132 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">);</span>
<span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span>
<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>segment_index == <span class="Constant">0</span> &amp;&amp; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> &lt; p_vaddr+p_memsz<span class="Delimiter">)</span>
<span id="L135" class="LineNr">135 </span> <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> = p_vaddr+p_memsz<span class="Delimiter">;</span>
<span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span>
<span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L139" class="LineNr">139 </span><span class="Comment">// Very primitive/fixed/insecure ELF segments for now.</span>
<span id="L140" class="LineNr">140 </span><span class="Comment">// --- inaccessible: 0x00000000 -&gt; 0x08047fff</span>
<span id="L141" class="LineNr">141 </span><span class="Comment">// code: 0x09000000 -&gt; 0x09ffffff (specified in ELF binary)</span>
<span id="L142" class="LineNr">142 </span><span class="Comment">// data: 0x0a000000 -&gt; 0x0affffff (specified in ELF binary)</span>
<span id="L143" class="LineNr">143 </span><span class="Comment">// --- heap gets mmap'd somewhere here ---</span>
<span id="L144" class="LineNr">144 </span><span class="Comment">// stack: 0xbdffffff -&gt; 0xbd000000 (downward; not in ELF binary)</span>
<span id="L145" class="LineNr">145 </span><span class="Comment">// argv hack: 0xbf000000 -&gt; 0xbfffffff (not in ELF binary)</span>
<span id="L146" class="LineNr">146 </span><span class="Comment">// --- reserved for kernel: 0xc0000000 -&gt; ...</span>
<span id="L147" class="LineNr">147 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L147'>START_HEAP</a> = <span class="Constant">0x0b000000</span><span class="Delimiter">;</span>
<span id="L148" class="LineNr">148 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L148'>END_HEAP</a> = <span class="Constant">0xbd000000</span><span class="Delimiter">;</span>
<span id="L149" class="LineNr">149 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L149'>STACK_SEGMENT</a> = <span class="Constant">0xbd000000</span><span class="Delimiter">;</span>
<span id="L150" class="LineNr">150 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L150'>AFTER_STACK</a> = <span class="Constant">0xbe000000</span><span class="Delimiter">;</span>
<span id="L151" class="LineNr">151 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L151'>ARGV_DATA_SEGMENT</a> = <span class="Constant">0xbf000000</span><span class="Delimiter">;</span>
<span id="L152" class="LineNr">152 </span><span class="Comment">// When updating the above memory map, don't forget to update `mmap`'s</span>
<span id="L153" class="LineNr">153 </span><span class="Comment">// implementation in the 'syscalls' layer.</span>
<span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before &quot;End Dump Info for Instruction&quot;)</span>
<span id="L155" class="LineNr">155 </span><span class="CommentedCode">//? dump_stack(); // slow</span>
<span id="L156" class="LineNr">156 </span><span class="Delimiter">:(code)</span>
<span id="L157" class="LineNr">157 </span><span class="Normal">void</span> <a href='012elf.cc.html#L157'>dump_stack</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L158" class="LineNr">158 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L159" class="LineNr">159 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;stack:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L160" class="LineNr">160 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = AFTER_STACK-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L161" class="LineNr">161 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">40</span><span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span><span class="Delimiter">}</span>
<span id="L166" class="LineNr">166 </span>
<span id="L167" class="LineNr">167 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L167'>u32_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L168" class="LineNr">168 </span> <span class="Identifier">return</span> p[<span class="Constant">0</span>] | p[<span class="Constant">1</span>] &lt;&lt; <span class="Constant">8</span> | p[<span class="Constant">2</span>] &lt;&lt; <span class="Constant">16</span> | p[<span class="Constant">3</span>] &lt;&lt; <span class="Constant">24</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span>
<span id="L171" class="LineNr">171 </span><span class="Normal">inline</span> <span class="Normal">uint16_t</span> <a href='012elf.cc.html#L171'>u16_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L172" class="LineNr">172 </span> <span class="Identifier">return</span> p[<span class="Constant">0</span>] | p[<span class="Constant">1</span>] &lt;&lt; <span class="Constant">8</span><span class="Delimiter">;</span>
<span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span>
<span id="L174" class="LineNr">174 </span>
<span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L176" class="LineNr">176 </span><span class="Normal">struct</span> <a href='012elf.cc.html#L176'>perr</a> <span class="Delimiter">{};</span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">:(code)</span>
<span id="L178" class="LineNr">178 </span>ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> <a href='012elf.cc.html#L176'>perr</a> <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L179" class="LineNr">179 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>errno<span class="Delimiter">)</span>
<span id="L180" class="LineNr">180 </span> os &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">);</span>
<span id="L181" class="LineNr">181 </span> <span class="Identifier">return</span> os<span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span><span class="Delimiter">}</span>
<span id="L183" class="LineNr">183 </span>
<span id="L184" class="LineNr">184 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L185" class="LineNr">185 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/types.h&gt;</span>
<span id="L186" class="LineNr">186 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/stat.h&gt;</span>
<span id="L187" class="LineNr">187 </span><span class="PreProc">#include </span><span class="Constant">&lt;fcntl.h&gt;</span>
<span id="L188" class="LineNr">188 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdarg.h&gt;</span>
<span id="L189" class="LineNr">189 </span><span class="PreProc">#include </span><span class="Constant">&lt;errno.h&gt;</span>
<span id="L190" class="LineNr">190 </span><span class="PreProc">#include </span><span class="Constant">&lt;unistd.h&gt;</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Comment">// Outside of tests, traces must be explicitly requested.</span>
<span id="L9" class="LineNr"> 9 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L446'>Trace_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span> <span class="Special"><a href='003trace.cc.html#L72'>Trace_stream</a></span> = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
<span id="L10" class="LineNr"> 10 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== Starting to run&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L11" class="LineNr"> 11 </span> assert<span class="Delimiter">(</span>argc &gt; <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L12" class="LineNr"> 12 </span> <a href='000organization.cc.html#L148'>reset</a><span class="Delimiter">();</span>
<span id="L13" class="LineNr"> 13 </span> cerr &lt;&lt; std::hex<span class="Delimiter">;</span>
<span id="L14" class="LineNr"> 14 </span> <a href='012elf.cc.html#L22'>load_elf</a><span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L15" class="LineNr"> 15 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a> &lt; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span><span class="Delimiter">)</span> <span class="Comment">// weak final-gasp termination check</span>
<span id="L16" class="LineNr"> 16 </span> <a href='010---vm.cc.html#L267'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L17" class="LineNr"> 17 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;executed past end of the world: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L29'>EIP</a> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L18" class="LineNr"> 18 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">}</span>
<span id="L20" class="LineNr"> 20 </span>
<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(code)</span>
<span id="L22" class="LineNr"> 22 </span><span class="Normal">void</span> <a href='012elf.cc.html#L22'>load_elf</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; filename<span class="Delimiter">,</span> <span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Normal">int</span> fd = open<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> O_RDONLY<span class="Delimiter">);</span>
<span id="L24" class="LineNr"> 24 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>fd &lt; <span class="Constant">0</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; filename<span class="Delimiter">.</span>c_str<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: open&quot;</span> &lt;&lt; <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L25" class="LineNr"> 25 </span> <span class="Normal">off_t</span> size = lseek<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">SEEK_END</span><span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span> lseek<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">SEEK_SET</span><span class="Delimiter">);</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">uint8_t</span>* elf_contents = <span class="Normal">static_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span>malloc<span class="Delimiter">(</span>size<span class="Delimiter">));</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents == <span class="Constant">NULL</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;malloc(&quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">')'</span> &lt;&lt; <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Normal">ssize_t</span> read_size = read<span class="Delimiter">(</span>fd<span class="Delimiter">,</span> elf_contents<span class="Delimiter">,</span> size<span class="Delimiter">);</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size != read_size<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;read → &quot;</span> &lt;&lt; size &lt;&lt; <span class="Constant">&quot; (!= &quot;</span> &lt;&lt; read_size &lt;&lt; <span class="Constant">')'</span> &lt;&lt; <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <a href='012elf.cc.html#L35'>load_elf_contents</a><span class="Delimiter">(</span>elf_contents<span class="Delimiter">,</span> size<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L32" class="LineNr"> 32 </span> free<span class="Delimiter">(</span>elf_contents<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span><span class="Delimiter">}</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Normal">void</span> <a href='012elf.cc.html#L35'>load_elf_contents</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">int</span> argc<span class="Delimiter">,</span> <span class="Normal">char</span>* argv[]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Normal">uint8_t</span> magic[<span class="Constant">5</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
<span id="L37" class="LineNr"> 37 </span> memcpy<span class="Delimiter">(</span>magic<span class="Delimiter">,</span> elf_contents<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>memcmp<span class="Delimiter">(</span>magic<span class="Delimiter">,</span> <span class="Constant">&quot;\177ELF&quot;</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid ELF file; starts with \&quot;&quot; &lt;&lt; magic &lt;&lt; '&quot;</span>' &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents[<span class="Constant">4</span>] != <span class="Constant">1</span><span class="Delimiter">)</span>
<span id="L41" class="LineNr"> 41 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Only 32-bit ELF files (4-byte words; virtual addresses up to 4GB) supported.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>elf_contents[<span class="Constant">5</span>] != <span class="Constant">1</span><span class="Delimiter">)</span>
<span id="L43" class="LineNr"> 43 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Only little-endian ELF files supported.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Comment">// unused: remaining 10 bytes of e_ident</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Normal">uint32_t</span> e_machine_type = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_machine_type != <span class="Constant">0x00030002</span><span class="Delimiter">)</span>
<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Comment">// unused: e_version. We only support version 1, and later versions will be backwards compatible.</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Normal">uint32_t</span> e_entry = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">24</span>]<span class="Delimiter">);</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Normal">uint32_t</span> e_phoff = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">28</span>]<span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Comment">// unused: e_shoff</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Comment">// unused: e_flags</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Normal">uint32_t</span> e_ehsize = <a href='012elf.cc.html#L172'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">40</span>]<span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_ehsize &lt; <span class="Constant">52</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; ELF header too small\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Normal">uint32_t</span> e_phentsize = <a href='012elf.cc.html#L172'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">42</span>]<span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Normal">uint32_t</span> e_phnum = <a href='012elf.cc.html#L172'>u16_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">44</span>]<span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; e_phnum &lt;&lt; <span class="Constant">&quot; entries in the program header, each &quot;</span> &lt;&lt; e_phentsize &lt;&lt; <span class="Constant">&quot; bytes long&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Comment">// unused: e_shentsize</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Comment">// unused: e_shnum</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Comment">// unused: e_shstrndx</span>
<span id="L61" class="LineNr"> 61 </span>
<span id="L62" class="LineNr"> 62 </span> set&lt;<span class="Normal">uint32_t</span>&gt; overlap<span class="Delimiter">;</span> <span class="Comment">// to detect overlapping segments</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; e_phnum<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L64" class="LineNr"> 64 </span> <a href='012elf.cc.html#L105'>load_segment_from_program_header</a><span class="Delimiter">(</span>elf_contents<span class="Delimiter">,</span> i<span class="Delimiter">,</span> size<span class="Delimiter">,</span> e_phoff + i*e_phentsize<span class="Delimiter">,</span> e_ehsize<span class="Delimiter">,</span> overlap<span class="Delimiter">);</span>
<span id="L65" class="LineNr"> 65 </span>
<span id="L66" class="LineNr"> 66 </span> <span class="Comment">// initialize code and stack</span>
<span id="L67" class="LineNr"> 67 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L150'>STACK_SEGMENT</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L150'>STACK_SEGMENT</a><span class="Delimiter">));</span>
<span id="L69" class="LineNr"> 69 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L151'>AFTER_STACK</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Comment">// The stack grows downward.</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <a href='012elf.cc.html#L151'>AFTER_STACK</a><span class="Delimiter">;</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBP]<span class="Delimiter">.</span>u = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span> <a href='010---vm.cc.html#L29'>EIP</a> = e_entry<span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span>
<span id="L75" class="LineNr"> 75 </span> <span class="Comment">// initialize args on stack</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Comment">// no envp for now</span>
<span id="L77" class="LineNr"> 77 </span> <span class="Comment">// we wastefully use a separate page of memory for argv</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L152'>ARGV_DATA_SEGMENT</a><span class="Delimiter">));</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Normal">uint32_t</span> argv_data = <a href='012elf.cc.html#L152'>ARGV_DATA_SEGMENT</a><span class="Delimiter">;</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = argc-<span class="Constant">1</span><span class="Delimiter">;</span> i &gt;= <span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span> --i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L81" class="LineNr"> 81 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">);</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt;= strlen<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>argv_data<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span> <span class="Comment">// don't bother comparing ARGV and STACK</span>
<span id="L84" class="LineNr"> 84 </span> <a href='010---vm.cc.html#L234'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L85" class="LineNr"> 85 </span> argv_data += <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">char</span><span class="Delimiter">);</span>
<span id="L86" class="LineNr"> 86 </span> assert<span class="Delimiter">(</span>argv_data &lt; <a href='012elf.cc.html#L152'>ARGV_DATA_SEGMENT</a> + <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span>argc-<span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span>
<span id="L91" class="LineNr"> 91 </span>
<span id="L92" class="LineNr"> 92 </span><span class="Normal">void</span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u -= <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L150'>STACK_SEGMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L95" class="LineNr"> 95 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;The stack overflowed its segment. &quot;</span>
<span id="L96" class="LineNr"> 96 </span> &lt;&lt; <span class="Constant">&quot;Maybe SPACE_FOR_SEGMENT should be larger? &quot;</span>
<span id="L97" class="LineNr"> 97 </span> &lt;&lt; <span class="Constant">&quot;Or you need to carve out an exception for the stack segment &quot;</span>
<span id="L98" class="LineNr"> 98 </span> &lt;&lt; <span class="Constant">&quot;to be larger.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">}</span>
<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L102" class="LineNr">102 </span> <a href='010---vm.cc.html#L242'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L103" class="LineNr">103 </span><span class="Delimiter">}</span>
<span id="L104" class="LineNr">104 </span>
<span id="L105" class="LineNr">105 </span><span class="Normal">void</span> <a href='012elf.cc.html#L105'>load_segment_from_program_header</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">int</span> segment_index<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> offset<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> e_ehsize<span class="Delimiter">,</span> set&lt;<span class="Normal">uint32_t</span>&gt;&amp; overlap<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span> <span class="Normal">uint32_t</span> p_type = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset]<span class="Delimiter">);</span>
<span id="L107" class="LineNr">107 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;program header at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot;: type &quot;</span> &lt;&lt; p_type &lt;&lt; end<span class="Delimiter">();</span>
<span id="L108" class="LineNr">108 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_type != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L109" class="LineNr">109 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ignoring segment at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; of non PT_LOAD type &quot;</span> &lt;&lt; p_type &lt;&lt; <span class="Constant">&quot; (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L111" class="LineNr">111 </span> <span class="Delimiter">}</span>
<span id="L112" class="LineNr">112 </span> <span class="Normal">uint32_t</span> p_offset = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">4</span>]<span class="Delimiter">);</span>
<span id="L113" class="LineNr">113 </span> <span class="Normal">uint32_t</span> p_vaddr = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">8</span>]<span class="Delimiter">);</span>
<span id="L114" class="LineNr">114 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_ehsize &gt; p_vaddr<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; program header overlaps ELF header\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L115" class="LineNr">115 </span> <span class="Comment">// unused: p_paddr</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">uint32_t</span> p_filesz = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L117" class="LineNr">117 </span> <span class="Normal">uint32_t</span> p_memsz = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[offset + <span class="Constant">20</span>]<span class="Delimiter">);</span>
<span id="L118" class="LineNr">118 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_filesz != p_memsz<span class="Delimiter">)</span>
<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Can't yet handle segments where p_filesz != p_memsz (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span>
<span id="L121" class="LineNr">121 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset + p_filesz &gt; size<span class="Delimiter">)</span>
<span id="L122" class="LineNr">122 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; segment at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; is too large: wants to end at &quot;</span> &lt;&lt; p_offset+p_filesz &lt;&lt; <span class="Constant">&quot; but the file ends at &quot;</span> &lt;&lt; size &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L123" class="LineNr">123 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_memsz &gt;= <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Code segment too small for SubX; for now please manually increase SEGMENT_ALIGNMENT.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L125" class="LineNr">125 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L126" class="LineNr">126 </span> <span class="Delimiter">}</span>
<span id="L127" class="LineNr">127 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;blitting file offsets (&quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset+p_filesz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;) to addresses (&quot;</span> &lt;&lt; p_vaddr &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_vaddr+p_memsz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">')'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L128" class="LineNr">128 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size &gt; p_memsz<span class="Delimiter">)</span> size = p_memsz<span class="Delimiter">;</span>
<span id="L129" class="LineNr">129 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>p_vaddr<span class="Delimiter">));</span>
<span id="L130" class="LineNr">130 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p_filesz<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L131" class="LineNr">131 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L132" class="LineNr">132 </span> <a href='010---vm.cc.html#L234'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L133" class="LineNr">133 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">);</span>
<span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span>
<span id="L135" class="LineNr">135 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>segment_index == <span class="Constant">0</span> &amp;&amp; <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> &lt; p_vaddr+p_memsz<span class="Delimiter">)</span>
<span id="L136" class="LineNr">136 </span> <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> = p_vaddr+p_memsz<span class="Delimiter">;</span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">}</span>
<span id="L138" class="LineNr">138 </span>
<span id="L139" class="LineNr">139 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L140" class="LineNr">140 </span><span class="Comment">// Very primitive/fixed/insecure ELF segments for now.</span>
<span id="L141" class="LineNr">141 </span><span class="Comment">// --- inaccessible: 0x00000000 -&gt; 0x08047fff</span>
<span id="L142" class="LineNr">142 </span><span class="Comment">// code: 0x09000000 -&gt; 0x09ffffff (specified in ELF binary)</span>
<span id="L143" class="LineNr">143 </span><span class="Comment">// data: 0x0a000000 -&gt; 0x0affffff (specified in ELF binary)</span>
<span id="L144" class="LineNr">144 </span><span class="Comment">// --- heap gets mmap'd somewhere here ---</span>
<span id="L145" class="LineNr">145 </span><span class="Comment">// stack: 0xbdffffff -&gt; 0xbd000000 (downward; not in ELF binary)</span>
<span id="L146" class="LineNr">146 </span><span class="Comment">// argv hack: 0xbf000000 -&gt; 0xbfffffff (not in ELF binary)</span>
<span id="L147" class="LineNr">147 </span><span class="Comment">// --- reserved for kernel: 0xc0000000 -&gt; ...</span>
<span id="L148" class="LineNr">148 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L148'>START_HEAP</a> = <span class="Constant">0x0b000000</span><span class="Delimiter">;</span>
<span id="L149" class="LineNr">149 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L149'>END_HEAP</a> = <span class="Constant">0xbd000000</span><span class="Delimiter">;</span>
<span id="L150" class="LineNr">150 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L150'>STACK_SEGMENT</a> = <span class="Constant">0xbd000000</span><span class="Delimiter">;</span>
<span id="L151" class="LineNr">151 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L151'>AFTER_STACK</a> = <span class="Constant">0xbe000000</span><span class="Delimiter">;</span>
<span id="L152" class="LineNr">152 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L152'>ARGV_DATA_SEGMENT</a> = <span class="Constant">0xbf000000</span><span class="Delimiter">;</span>
<span id="L153" class="LineNr">153 </span><span class="Comment">// When updating the above memory map, don't forget to update `mmap`'s</span>
<span id="L154" class="LineNr">154 </span><span class="Comment">// implementation in the 'syscalls' layer.</span>
<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(before &quot;End Dump Info for Instruction&quot;)</span>
<span id="L156" class="LineNr">156 </span><span class="CommentedCode">//? dump_stack(); // slow</span>
<span id="L157" class="LineNr">157 </span><span class="Delimiter">:(code)</span>
<span id="L158" class="LineNr">158 </span><span class="Normal">void</span> <a href='012elf.cc.html#L158'>dump_stack</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L159" class="LineNr">159 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L160" class="LineNr">160 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;stack:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = AFTER_STACK-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">40</span><span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span><span class="Delimiter">}</span>
<span id="L167" class="LineNr">167 </span>
<span id="L168" class="LineNr">168 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L169" class="LineNr">169 </span> <span class="Identifier">return</span> p[<span class="Constant">0</span>] | p[<span class="Constant">1</span>] &lt;&lt; <span class="Constant">8</span> | p[<span class="Constant">2</span>] &lt;&lt; <span class="Constant">16</span> | p[<span class="Constant">3</span>] &lt;&lt; <span class="Constant">24</span><span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </span><span class="Delimiter">}</span>
<span id="L171" class="LineNr">171 </span>
<span id="L172" class="LineNr">172 </span><span class="Normal">inline</span> <span class="Normal">uint16_t</span> <a href='012elf.cc.html#L172'>u16_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <span class="Identifier">return</span> p[<span class="Constant">0</span>] | p[<span class="Constant">1</span>] &lt;&lt; <span class="Constant">8</span><span class="Delimiter">;</span>
<span id="L174" class="LineNr">174 </span><span class="Delimiter">}</span>
<span id="L175" class="LineNr">175 </span>
<span id="L176" class="LineNr">176 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L177" class="LineNr">177 </span><span class="Normal">struct</span> <a href='012elf.cc.html#L177'>perr</a> <span class="Delimiter">{};</span>
<span id="L178" class="LineNr">178 </span><span class="Delimiter">:(code)</span>
<span id="L179" class="LineNr">179 </span>ostream&amp; <span class="Normal">operator</span>&lt;&lt;<span class="Delimiter">(</span>ostream&amp; os<span class="Delimiter">,</span> <a href='012elf.cc.html#L177'>perr</a> <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L180" class="LineNr">180 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>errno<span class="Delimiter">)</span>
<span id="L181" class="LineNr">181 </span> os &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span> <span class="Identifier">return</span> os<span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span>
<span id="L184" class="LineNr">184 </span>
<span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L186" class="LineNr">186 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/types.h&gt;</span>
<span id="L187" class="LineNr">187 </span><span class="PreProc">#include </span><span class="Constant">&lt;sys/stat.h&gt;</span>
<span id="L188" class="LineNr">188 </span><span class="PreProc">#include </span><span class="Constant">&lt;fcntl.h&gt;</span>
<span id="L189" class="LineNr">189 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdarg.h&gt;</span>
<span id="L190" class="LineNr">190 </span><span class="PreProc">#include </span><span class="Constant">&lt;errno.h&gt;</span>
<span id="L191" class="LineNr">191 </span><span class="PreProc">#include </span><span class="Constant">&lt;unistd.h&gt;</span>
</pre>
</body>
</html>

View File

@ -1260,7 +1260,7 @@ if ('onhashchange' in window) {
<span id="L1199" class="LineNr">1199 </span> <span class="Constant">&quot; 53 \n&quot;</span> <span class="Comment">// push EBX to stack</span>
<span id="L1200" class="LineNr">1200 </span> <span class="Delimiter">);</span>
<span id="L1201" class="LineNr">1201 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1202" class="LineNr">1202 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L91'>push</a> EBX\n&quot;</span>
<span id="L1202" class="LineNr">1202 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L92'>push</a> EBX\n&quot;</span>
<span id="L1203" class="LineNr">1203 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000004\n&quot;</span>
<span id="L1204" class="LineNr">1204 </span> <span class="Constant">&quot;run: pushing value 0x0000000a\n&quot;</span>
<span id="L1205" class="LineNr">1205 </span> <span class="Delimiter">);</span>
@ -1278,7 +1278,7 @@ if ('onhashchange' in window) {
<span id="L1217" class="LineNr">1217 </span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1218" class="LineNr">1218 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1219" class="LineNr">1219 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: &quot; &lt;&lt; NUM(reg) &lt;&lt; &quot;: &quot; &lt;&lt; Reg[reg].u &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1220" class="LineNr">1220 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1220" class="LineNr">1220 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1221" class="LineNr">1221 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1222" class="LineNr">1222 </span><span class="Delimiter">}</span>
<span id="L1223" class="LineNr">1223 </span>
@ -1335,7 +1335,7 @@ if ('onhashchange' in window) {
<span id="L1274" class="LineNr">1274 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;popping value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1275" class="LineNr">1275 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u += <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L1276" class="LineNr">1276 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1277" class="LineNr">1277 </span> assert<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L150'>AFTER_STACK</a><span class="Delimiter">);</span>
<span id="L1277" class="LineNr">1277 </span> assert<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L151'>AFTER_STACK</a><span class="Delimiter">);</span>
<span id="L1278" class="LineNr">1278 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L1279" class="LineNr">1279 </span><span class="Delimiter">}</span>
</pre>

View File

@ -829,7 +829,7 @@ if ('onhashchange' in window) {
<span id="L770" class="LineNr"> 770 </span> <span class="Constant">&quot;af 00 00 00\n&quot;</span> <span class="Comment">// 0x000000af</span>
<span id="L771" class="LineNr"> 771 </span> <span class="Delimiter">);</span>
<span id="L772" class="LineNr"> 772 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L773" class="LineNr"> 773 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L91'>push</a> r/m32\n&quot;</span>
<span id="L773" class="LineNr"> 773 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L92'>push</a> r/m32\n&quot;</span>
<span id="L774" class="LineNr"> 774 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (EAX)\n&quot;</span>
<span id="L775" class="LineNr"> 775 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000010\n&quot;</span>
<span id="L776" class="LineNr"> 776 </span> <span class="Constant">&quot;run: pushing value 0x000000af\n&quot;</span>
@ -840,7 +840,7 @@ if ('onhashchange' in window) {
<span id="L781" class="LineNr"> 781 </span><span class="Normal">case</span> <span class="Constant">6</span>: <span class="Delimiter">{</span> <span class="Comment">// push r/m32 to stack</span>
<span id="L782" class="LineNr"> 782 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L783" class="LineNr"> 783 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* val = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L784" class="LineNr"> 784 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>*val<span class="Delimiter">);</span>
<span id="L784" class="LineNr"> 784 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span>*val<span class="Delimiter">);</span>
<span id="L785" class="LineNr"> 785 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L786" class="LineNr"> 786 </span><span class="Delimiter">}</span>
<span id="L787" class="LineNr"> 787 </span>

View File

@ -1315,7 +1315,7 @@ if ('onhashchange' in window) {
<span id="L1254" class="LineNr">1254 </span> <span class="Constant">&quot; 68 af 00 00 00 \n&quot;</span> <span class="Comment">// push *EAX to stack</span>
<span id="L1255" class="LineNr">1255 </span> <span class="Delimiter">);</span>
<span id="L1256" class="LineNr">1256 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1257" class="LineNr">1257 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L91'>push</a> imm32 0x000000af\n&quot;</span>
<span id="L1257" class="LineNr">1257 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L92'>push</a> imm32 0x000000af\n&quot;</span>
<span id="L1258" class="LineNr">1258 </span> <span class="Constant">&quot;run: <a href='010---vm.cc.html#L17'>ESP</a> is now 0xbd000010\n&quot;</span>
<span id="L1259" class="LineNr">1259 </span> <span class="Constant">&quot;run: <a href='003trace.cc.html#L117'>contents</a> at <a href='010---vm.cc.html#L17'>ESP</a>: 0x000000af\n&quot;</span>
<span id="L1260" class="LineNr">1260 </span> <span class="Delimiter">);</span>
@ -1326,7 +1326,7 @@ if ('onhashchange' in window) {
<span id="L1265" class="LineNr">1265 </span> <span class="Normal">const</span> <span class="Normal">uint32_t</span> val = <span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span><a href='011run.cc.html#L447'>next32</a><span class="Delimiter">());</span>
<span id="L1266" class="LineNr">1266 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1267" class="LineNr">1267 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: &quot; &lt;&lt; val &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1268" class="LineNr">1268 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L1268" class="LineNr">1268 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L1269" class="LineNr">1269 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ESP is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1270" class="LineNr">1270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;contents at <a href='010---vm.cc.html#L17'>ESP</a>: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1271" class="LineNr">1271 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>

View File

@ -87,7 +87,7 @@ if ('onhashchange' in window) {
<span id="L27" class="LineNr"> 27 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: EIP: &quot; &lt;&lt; EIP &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a><span class="Delimiter">);</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a><span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span> <a href='010---vm.cc.html#L29'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L29'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -119,7 +119,7 @@ if ('onhashchange' in window) {
<span id="L59" class="LineNr"> 59 </span><span class="Normal">case</span> <span class="Constant">2</span>: <span class="Delimiter">{</span> <span class="Comment">// call function pointer at r/m32</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call to r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* offset = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a><span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> <a href='012elf.cc.html#L92'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L29'>EIP</a><span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span> <a href='010---vm.cc.html#L29'>EIP</a> += *offset<span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L29'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>

View File

@ -167,13 +167,13 @@ if ('onhashchange' in window) {
<span id="L107" class="LineNr">107 </span>
<span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L109" class="LineNr">109 </span><span class="Comment">// Very primitive/fixed/insecure mmap segments for now.</span>
<span id="L110" class="LineNr">110 </span><span class="Normal">uint32_t</span> <span class="Special"><a href='020syscalls.cc.html#L110'>Segments_allocated_above</a></span> = <a href='012elf.cc.html#L148'>END_HEAP</a><span class="Delimiter">;</span>
<span id="L110" class="LineNr">110 </span><span class="Normal">uint32_t</span> <span class="Special"><a href='020syscalls.cc.html#L110'>Segments_allocated_above</a></span> = <a href='012elf.cc.html#L149'>END_HEAP</a><span class="Delimiter">;</span>
<span id="L111" class="LineNr">111 </span><span class="Delimiter">:(code)</span>
<span id="L112" class="LineNr">112 </span><span class="Comment">// always allocate multiples of the segment size</span>
<span id="L113" class="LineNr">113 </span><span class="Normal">uint32_t</span> <a href='020syscalls.cc.html#L113'>new_segment</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> length<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L114" class="LineNr">114 </span> assert<span class="Delimiter">(</span>length &gt; <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L115" class="LineNr">115 </span> <span class="Normal">uint32_t</span> result = <span class="Delimiter">(</span><span class="Special"><a href='020syscalls.cc.html#L110'>Segments_allocated_above</a></span> - length<span class="Delimiter">)</span> &amp; <span class="Constant">0xff000000</span><span class="Delimiter">;</span> <span class="Comment">// same number of zeroes as SEGMENT_ALIGNMENT</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result &lt;= <a href='012elf.cc.html#L147'>START_HEAP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result &lt;= <a href='012elf.cc.html#L148'>START_HEAP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;Allocated too many segments; the VM ran out of memory. &quot;</span>
<span id="L118" class="LineNr">118 </span> &lt;&lt; <span class="Constant">&quot;Maybe <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a> can be smaller?\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span>

View File

@ -79,198 +79,199 @@ if ('onhashchange' in window) {
<span id="L18" class="LineNr"> 18 </span>
<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before &quot;End Main&quot;)</span>
<span id="L20" class="LineNr"> 20 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L96'>is_equal</a><span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;translate&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L21" class="LineNr"> 21 </span> <a href='003trace.cc.html#L206'>START_TRACING_UNTIL_END_OF_SCOPE</a><span class="Delimiter">;</span>
<span id="L22" class="LineNr"> 22 </span> <a href='000organization.cc.html#L148'>reset</a><span class="Delimiter">();</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Comment">// Begin subx translate</span>
<span id="L24" class="LineNr"> 24 </span> program p<span class="Delimiter">;</span>
<span id="L25" class="LineNr"> 25 </span> string output_filename<span class="Delimiter">;</span>
<span id="L26" class="LineNr"> 26 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip 'subx translate'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span> i &lt; argc<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L96'>is_equal</a><span class="Delimiter">(</span>argv[i]<span class="Delimiter">,</span> <span class="Constant">&quot;-o&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L28" class="LineNr"> 28 </span> ++i<span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= argc<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L30" class="LineNr"> 30 </span> <a href='028translate.cc.html#L71'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> cerr &lt;&lt; <span class="Constant">&quot;'-o' must be followed by a filename to write results to\n&quot;</span><span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Delimiter">}</span>
<span id="L34" class="LineNr"> 34 </span> output_filename = argv[i]<span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; argv[i] &lt;&lt; end<span class="Delimiter">();</span>
<span id="L38" class="LineNr"> 38 </span> ifstream fin<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!fin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span> cerr &lt;&lt; <span class="Constant">&quot;could not open &quot;</span> &lt;&lt; argv[i] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Delimiter">}</span>
<span id="L43" class="LineNr"> 43 </span> parse<span class="Delimiter">(</span>fin<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Delimiter">}</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L48" class="LineNr"> 48 </span> <a href='028translate.cc.html#L71'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L49" class="LineNr"> 49 </span> cerr &lt;&lt; <span class="Constant">&quot;nothing to do; must provide at least one file to read\n&quot;</span><span class="Delimiter">;</span>
<span id="L50" class="LineNr"> 50 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Delimiter">}</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>output_filename<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L53" class="LineNr"> 53 </span> <a href='028translate.cc.html#L71'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L54" class="LineNr"> 54 </span> cerr &lt;&lt; <span class="Constant">&quot;must provide a filename to write to using '-o'\n&quot;</span><span class="Delimiter">;</span>
<span id="L55" class="LineNr"> 55 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span>
<span id="L57" class="LineNr"> 57 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;begin&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L58" class="LineNr"> 58 </span> transform<span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;translate&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;begin&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> save_elf<span class="Delimiter">(</span>p<span class="Delimiter">,</span> output_filename<span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L63" class="LineNr"> 63 </span> unlink<span class="Delimiter">(</span>output_filename<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
<span id="L64" class="LineNr"> 64 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Comment">// End subx translate</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L68" class="LineNr"> 68 </span><span class="Delimiter">}</span>
<span id="L69" class="LineNr"> 69 </span>
<span id="L70" class="LineNr"> 70 </span><span class="Delimiter">:(code)</span>
<span id="L71" class="LineNr"> 71 </span><span class="Normal">void</span> <a href='028translate.cc.html#L71'>print_translate_usage</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L72" class="LineNr"> 72 </span> cerr &lt;&lt; <span class="Constant">&quot;Usage: subx translate file1 file2 ... -o output\n&quot;</span><span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span><span class="Delimiter">}</span>
<span id="L74" class="LineNr"> 74 </span>
<span id="L75" class="LineNr"> 75 </span><span class="Comment">// write out a program to a bare-bones ELF file</span>
<span id="L76" class="LineNr"> 76 </span><span class="Normal">void</span> save_elf<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L77" class="LineNr"> 77 </span> ofstream out<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> ios::binary<span class="Delimiter">);</span>
<span id="L78" class="LineNr"> 78 </span> save_elf<span class="Delimiter">(</span>p<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L79" class="LineNr"> 79 </span> out<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
<span id="L80" class="LineNr"> 80 </span><span class="Delimiter">}</span>
<span id="L81" class="LineNr"> 81 </span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> save_elf<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Comment">// validation: stay consistent with the self-hosted translator</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>entry</a> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L85" class="LineNr"> 85 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;no 'Entry' label found\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">)</span> == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;must include a 'data' segment\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Comment">// processing</span>
<span id="L93" class="LineNr"> 93 </span> <a href='028translate.cc.html#L98'>write_elf_header</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>size<span class="Delimiter">();</span> ++i<span class="Delimiter">)</span>
<span id="L95" class="LineNr"> 95 </span> <a href='028translate.cc.html#L194'>write_segment</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> out<span class="Delimiter">);</span>
<span id="L96" class="LineNr"> 96 </span><span class="Delimiter">}</span>
<span id="L97" class="LineNr"> 97 </span>
<span id="L98" class="LineNr"> 98 </span><span class="Normal">void</span> <a href='028translate.cc.html#L98'>write_elf_header</a><span class="Delimiter">(</span>ostream&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Normal">char</span> c = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span><span class="PreProc">#define </span><span class="Special">O</span><span class="PreProc">(</span><span class="Special">X</span><span class="PreProc">) c = (</span><span class="Special">X</span><span class="PreProc">)</span><span class="Delimiter">;</span><span class="PreProc"> out</span><span class="Delimiter">.</span><span class="PreProc">write(&amp;c</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">sizeof</span><span class="PreProc">(c))</span>
<span id="L101" class="LineNr">101 </span><span class="Comment">// host is required to be little-endian</span>
<span id="L102" class="LineNr">102 </span><span class="PreProc">#define emit(</span><span class="Special">X</span><span class="PreProc">) out</span><span class="Delimiter">.</span><span class="PreProc">write(</span><span class="Normal">reinterpret_cast</span><span class="PreProc">&lt;</span><span class="Normal">const</span><span class="PreProc"> </span><span class="Normal">char</span><span class="PreProc">*&gt;(&amp;</span><span class="Special">X</span><span class="PreProc">)</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">sizeof</span><span class="PreProc">(</span><span class="Special">X</span><span class="PreProc">))</span>
<span id="L103" class="LineNr">103 </span> <span class="SalientComment">//// ehdr</span>
<span id="L104" class="LineNr">104 </span> <span class="Comment">// e_ident</span>
<span id="L105" class="LineNr">105 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x7f</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">E</span><span class="Comment">*/</span><span class="Constant">0x45</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">L</span><span class="Comment">*/</span><span class="Constant">0x4c</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">F</span><span class="Comment">*/</span><span class="Constant">0x46</span><span class="Delimiter">);</span>
<span id="L106" class="LineNr">106 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Comment">// 32-bit format</span>
<span id="L107" class="LineNr">107 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Comment">// little-endian</span>
<span id="L108" class="LineNr">108 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x0</span><span class="Delimiter">);</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <span class="Constant">8</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x0</span><span class="Delimiter">);</span> <span class="Delimiter">}</span>
<span id="L110" class="LineNr">110 </span> <span class="Comment">// e_type</span>
<span id="L111" class="LineNr">111 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x02</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L112" class="LineNr">112 </span> <span class="Comment">// e_machine</span>
<span id="L113" class="LineNr">113 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L114" class="LineNr">114 </span> <span class="Comment">// e_version</span>
<span id="L115" class="LineNr">115 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x01</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L116" class="LineNr">116 </span> <span class="Comment">// e_entry</span>
<span id="L117" class="LineNr">117 </span> <span class="Normal">uint32_t</span> e_entry = p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>entry</a><span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span> <span class="Comment">// Override e_entry</span>
<span id="L119" class="LineNr">119 </span> emit<span class="Delimiter">(</span>e_entry<span class="Delimiter">);</span>
<span id="L120" class="LineNr">120 </span> <span class="Comment">// e_phoff -- immediately after ELF header</span>
<span id="L121" class="LineNr">121 </span> <span class="Normal">uint32_t</span> e_phoff = <span class="Constant">0x34</span><span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span> emit<span class="Delimiter">(</span>e_phoff<span class="Delimiter">);</span>
<span id="L123" class="LineNr">123 </span> <span class="Comment">// e_shoff; unused</span>
<span id="L124" class="LineNr">124 </span> <span class="Normal">uint32_t</span> dummy32 = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L125" class="LineNr">125 </span> emit<span class="Delimiter">(</span>dummy32<span class="Delimiter">);</span>
<span id="L126" class="LineNr">126 </span> <span class="Comment">// e_flags; unused</span>
<span id="L127" class="LineNr">127 </span> emit<span class="Delimiter">(</span>dummy32<span class="Delimiter">);</span>
<span id="L128" class="LineNr">128 </span> <span class="Comment">// e_ehsize</span>
<span id="L129" class="LineNr">129 </span> <span class="Normal">uint16_t</span> e_ehsize = <span class="Constant">0x34</span><span class="Delimiter">;</span>
<span id="L130" class="LineNr">130 </span> emit<span class="Delimiter">(</span>e_ehsize<span class="Delimiter">);</span>
<span id="L131" class="LineNr">131 </span> <span class="Comment">// e_phentsize</span>
<span id="L132" class="LineNr">132 </span> <span class="Normal">uint16_t</span> e_phentsize = <span class="Constant">0x20</span><span class="Delimiter">;</span>
<span id="L133" class="LineNr">133 </span> emit<span class="Delimiter">(</span>e_phentsize<span class="Delimiter">);</span>
<span id="L134" class="LineNr">134 </span> <span class="Comment">// e_phnum</span>
<span id="L135" class="LineNr">135 </span> <span class="Normal">uint16_t</span> e_phnum = <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">);</span>
<span id="L136" class="LineNr">136 </span> emit<span class="Delimiter">(</span>e_phnum<span class="Delimiter">);</span>
<span id="L137" class="LineNr">137 </span> <span class="Comment">// e_shentsize</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">uint16_t</span> dummy16 = <span class="Constant">0x0</span><span class="Delimiter">;</span>
<span id="L139" class="LineNr">139 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span> <span class="Comment">// e_shnum</span>
<span id="L141" class="LineNr">141 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L142" class="LineNr">142 </span> <span class="Comment">// e_shstrndx</span>
<span id="L143" class="LineNr">143 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L144" class="LineNr">144 </span>
<span id="L145" class="LineNr">145 </span> <span class="Normal">uint32_t</span> p_offset = <span class="Comment">/*</span><span class="Comment">size of ehdr</span><span class="Comment">*/</span><span class="Constant">0x34</span> + <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">)</span>*<span class="Constant">0x20</span><span class="Comment">/*</span><span class="Comment">size of each phdr</span><span class="Comment">*/</span><span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L147" class="LineNr">147 </span> <span class="Normal">const</span> segment&amp; curr = p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L148" class="LineNr">148 </span> <span class="SalientComment">//// phdr</span>
<span id="L149" class="LineNr">149 </span> <span class="Comment">// p_type</span>
<span id="L150" class="LineNr">150 </span> <span class="Normal">uint32_t</span> p_type = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L151" class="LineNr">151 </span> emit<span class="Delimiter">(</span>p_type<span class="Delimiter">);</span>
<span id="L152" class="LineNr">152 </span> <span class="Comment">// p_offset</span>
<span id="L153" class="LineNr">153 </span> emit<span class="Delimiter">(</span>p_offset<span class="Delimiter">);</span>
<span id="L154" class="LineNr">154 </span> <span class="Comment">// p_vaddr</span>
<span id="L155" class="LineNr">155 </span> <span class="Normal">uint32_t</span> p_start = curr<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L156" class="LineNr">156 </span> emit<span class="Delimiter">(</span>p_start<span class="Delimiter">);</span>
<span id="L157" class="LineNr">157 </span> <span class="Comment">// p_paddr</span>
<span id="L158" class="LineNr">158 </span> emit<span class="Delimiter">(</span>p_start<span class="Delimiter">);</span>
<span id="L159" class="LineNr">159 </span> <span class="Comment">// p_filesz</span>
<span id="L160" class="LineNr">160 </span> <span class="Normal">uint32_t</span> size = <a href='028translate.cc.html#L204'>num_words</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L161" class="LineNr">161 </span> assert<span class="Delimiter">(</span>p_offset + size &lt; <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L162" class="LineNr">162 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
<span id="L163" class="LineNr">163 </span> <span class="Comment">// p_memsz</span>
<span id="L164" class="LineNr">164 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
<span id="L165" class="LineNr">165 </span> <span class="Comment">// p_flags</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">uint32_t</span> p_flags = <span class="Delimiter">(</span>curr<span class="Delimiter">.</span><a href='011run.cc.html#L112'>name</a> == <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span> ? <span class="Comment">/*</span><span class="Comment">r-x</span><span class="Comment">*/</span><span class="Constant">0x5</span> : <span class="Comment">/*</span><span class="Comment">rw-</span><span class="Comment">*/</span><span class="Constant">0x6</span><span class="Delimiter">;</span>
<span id="L167" class="LineNr">167 </span> emit<span class="Delimiter">(</span>p_flags<span class="Delimiter">);</span>
<span id="L168" class="LineNr">168 </span>
<span id="L169" class="LineNr">169 </span> <span class="Comment">// p_align</span>
<span id="L170" class="LineNr">170 </span> <span class="Comment">// &quot;As the system creates or augments a process image, it logically copies</span>
<span id="L171" class="LineNr">171 </span> <span class="Comment">// a file's segment to a virtual memory segment. When—and if— the system</span>
<span id="L172" class="LineNr">172 </span> <span class="Comment">// physically reads the file depends on the program's execution behavior,</span>
<span id="L173" class="LineNr">173 </span> <span class="Comment">// system load, and so on. A process does not require a physical page</span>
<span id="L174" class="LineNr">174 </span> <span class="Comment">// unless it references the logical page during execution, and processes</span>
<span id="L175" class="LineNr">175 </span> <span class="Comment">// commonly leave many pages unreferenced. Therefore delaying physical</span>
<span id="L176" class="LineNr">176 </span> <span class="Comment">// reads frequently obviates them, improving system performance. To obtain</span>
<span id="L177" class="LineNr">177 </span> <span class="Comment">// this efficiency in practice, executable and shared object files must</span>
<span id="L178" class="LineNr">178 </span> <span class="Comment">// have segment images whose file offsets and virtual addresses are</span>
<span id="L179" class="LineNr">179 </span> <span class="Comment">// congruent, modulo the page size.&quot; -- <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a> (page 95)</span>
<span id="L180" class="LineNr">180 </span> <span class="Normal">uint32_t</span> p_align = <span class="Constant">0x1000</span><span class="Delimiter">;</span> <span class="Comment">// default page size on linux</span>
<span id="L181" class="LineNr">181 </span> emit<span class="Delimiter">(</span>p_align<span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset % p_align != p_start % p_align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L183" class="LineNr">183 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L184" class="LineNr">184 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L185" class="LineNr">185 </span> <span class="Delimiter">}</span>
<span id="L186" class="LineNr">186 </span>
<span id="L187" class="LineNr">187 </span> <span class="Comment">// prepare for next segment</span>
<span id="L188" class="LineNr">188 </span> p_offset += size<span class="Delimiter">;</span>
<span id="L189" class="LineNr">189 </span> <span class="Delimiter">}</span>
<span id="L190" class="LineNr">190 </span><span class="PreProc">#undef </span><span class="Special">O</span>
<span id="L191" class="LineNr">191 </span><span class="PreProc">#undef emit</span>
<span id="L192" class="LineNr">192 </span><span class="Delimiter">}</span>
<span id="L193" class="LineNr">193 </span>
<span id="L194" class="LineNr">194 </span><span class="Normal">void</span> <a href='028translate.cc.html#L194'>write_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L195" class="LineNr">195 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L196" class="LineNr">196 </span> <span class="Normal">const</span> vector&lt;word&gt;&amp; w = s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">;</span>
<span id="L197" class="LineNr">197 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L198" class="LineNr">198 </span> <span class="Normal">uint8_t</span> x = <a href='011run.cc.html#L302'>hex_byte</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>data<span class="Delimiter">);</span> <span class="Comment">// we're done with metadata by this point</span>
<span id="L199" class="LineNr">199 </span> out<span class="Delimiter">.</span>write<span class="Delimiter">(</span><span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span>&amp;x<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">sizeof(byte)</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span>
<span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span>
<span id="L202" class="LineNr">202 </span><span class="Delimiter">}</span>
<span id="L203" class="LineNr">203 </span>
<span id="L204" class="LineNr">204 </span><span class="Normal">uint32_t</span> <a href='028translate.cc.html#L204'>num_words</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L205" class="LineNr">205 </span> <span class="Normal">uint32_t</span> sum = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L206" class="LineNr">206 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L207" class="LineNr">207 </span> sum += <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">);</span>
<span id="L208" class="LineNr">208 </span> <span class="Identifier">return</span> sum<span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span><span class="Delimiter">}</span>
<span id="L210" class="LineNr">210 </span>
<span id="L211" class="LineNr">211 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L212" class="LineNr">212 </span><span class="Normal">using</span> std::ios<span class="Delimiter">;</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Comment">// Outside of tests, traces must be explicitly requested.</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L446'>Trace_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span> <span class="Special"><a href='003trace.cc.html#L72'>Trace_stream</a></span> = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
<span id="L23" class="LineNr"> 23 </span> <a href='000organization.cc.html#L148'>reset</a><span class="Delimiter">();</span>
<span id="L24" class="LineNr"> 24 </span> <span class="Comment">// Begin subx translate</span>
<span id="L25" class="LineNr"> 25 </span> program p<span class="Delimiter">;</span>
<span id="L26" class="LineNr"> 26 </span> string output_filename<span class="Delimiter">;</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip 'subx translate'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span> i &lt; argc<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L96'>is_equal</a><span class="Delimiter">(</span>argv[i]<span class="Delimiter">,</span> <span class="Constant">&quot;-o&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L29" class="LineNr"> 29 </span> ++i<span class="Delimiter">;</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= argc<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L31" class="LineNr"> 31 </span> <a href='028translate.cc.html#L72'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> cerr &lt;&lt; <span class="Constant">&quot;'-o' must be followed by a filename to write results to\n&quot;</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Delimiter">}</span>
<span id="L35" class="LineNr"> 35 </span> output_filename = argv[i]<span class="Delimiter">;</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; argv[i] &lt;&lt; end<span class="Delimiter">();</span>
<span id="L39" class="LineNr"> 39 </span> ifstream fin<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span>
<span id="L40" class="LineNr"> 40 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!fin<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L41" class="LineNr"> 41 </span> cerr &lt;&lt; <span class="Constant">&quot;could not open &quot;</span> &lt;&lt; argv[i] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Delimiter">}</span>
<span id="L44" class="LineNr"> 44 </span> parse<span class="Delimiter">(</span>fin<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L49" class="LineNr"> 49 </span> <a href='028translate.cc.html#L72'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> cerr &lt;&lt; <span class="Constant">&quot;nothing to do; must provide at least one file to read\n&quot;</span><span class="Delimiter">;</span>
<span id="L51" class="LineNr"> 51 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Delimiter">}</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>output_filename<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L54" class="LineNr"> 54 </span> <a href='028translate.cc.html#L72'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L55" class="LineNr"> 55 </span> cerr &lt;&lt; <span class="Constant">&quot;must provide a filename to write to using '-o'\n&quot;</span><span class="Delimiter">;</span>
<span id="L56" class="LineNr"> 56 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Delimiter">}</span>
<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;begin&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> transform<span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;translate&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;begin&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span> save_elf<span class="Delimiter">(</span>p<span class="Delimiter">,</span> output_filename<span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L64" class="LineNr"> 64 </span> unlink<span class="Delimiter">(</span>output_filename<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Delimiter">}</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Comment">// End subx translate</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
<span id="L70" class="LineNr"> 70 </span>
<span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(code)</span>
<span id="L72" class="LineNr"> 72 </span><span class="Normal">void</span> <a href='028translate.cc.html#L72'>print_translate_usage</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L73" class="LineNr"> 73 </span> cerr &lt;&lt; <span class="Constant">&quot;Usage: subx translate file1 file2 ... -o output\n&quot;</span><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="Comment">// write out a program to a bare-bones ELF file</span>
<span id="L77" class="LineNr"> 77 </span><span class="Normal">void</span> save_elf<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; filename<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L78" class="LineNr"> 78 </span> ofstream out<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> ios::binary<span class="Delimiter">);</span>
<span id="L79" class="LineNr"> 79 </span> save_elf<span class="Delimiter">(</span>p<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L80" class="LineNr"> 80 </span> out<span class="Delimiter">.</span>close<span class="Delimiter">();</span>
<span id="L81" class="LineNr"> 81 </span><span class="Delimiter">}</span>
<span id="L82" class="LineNr"> 82 </span>
<span id="L83" class="LineNr"> 83 </span><span class="Normal">void</span> save_elf<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Comment">// validation: stay consistent with the self-hosted translator</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>entry</a> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L86" class="LineNr"> 86 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;no 'Entry' label found\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">)</span> == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;must include a 'data' segment\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Delimiter">}</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Comment">// processing</span>
<span id="L94" class="LineNr"> 94 </span> <a href='028translate.cc.html#L99'>write_elf_header</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>size<span class="Delimiter">();</span> ++i<span class="Delimiter">)</span>
<span id="L96" class="LineNr"> 96 </span> <a href='028translate.cc.html#L195'>write_segment</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> out<span class="Delimiter">);</span>
<span id="L97" class="LineNr"> 97 </span><span class="Delimiter">}</span>
<span id="L98" class="LineNr"> 98 </span>
<span id="L99" class="LineNr"> 99 </span><span class="Normal">void</span> <a href='028translate.cc.html#L99'>write_elf_header</a><span class="Delimiter">(</span>ostream&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L100" class="LineNr">100 </span> <span class="Normal">char</span> c = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
<span id="L101" class="LineNr">101 </span><span class="PreProc">#define </span><span class="Special">O</span><span class="PreProc">(</span><span class="Special">X</span><span class="PreProc">) c = (</span><span class="Special">X</span><span class="PreProc">)</span><span class="Delimiter">;</span><span class="PreProc"> out</span><span class="Delimiter">.</span><span class="PreProc">write(&amp;c</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">sizeof</span><span class="PreProc">(c))</span>
<span id="L102" class="LineNr">102 </span><span class="Comment">// host is required to be little-endian</span>
<span id="L103" class="LineNr">103 </span><span class="PreProc">#define emit(</span><span class="Special">X</span><span class="PreProc">) out</span><span class="Delimiter">.</span><span class="PreProc">write(</span><span class="Normal">reinterpret_cast</span><span class="PreProc">&lt;</span><span class="Normal">const</span><span class="PreProc"> </span><span class="Normal">char</span><span class="PreProc">*&gt;(&amp;</span><span class="Special">X</span><span class="PreProc">)</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">sizeof</span><span class="PreProc">(</span><span class="Special">X</span><span class="PreProc">))</span>
<span id="L104" class="LineNr">104 </span> <span class="SalientComment">//// ehdr</span>
<span id="L105" class="LineNr">105 </span> <span class="Comment">// e_ident</span>
<span id="L106" class="LineNr">106 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x7f</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">E</span><span class="Comment">*/</span><span class="Constant">0x45</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">L</span><span class="Comment">*/</span><span class="Constant">0x4c</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">F</span><span class="Comment">*/</span><span class="Constant">0x46</span><span class="Delimiter">);</span>
<span id="L107" class="LineNr">107 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Comment">// 32-bit format</span>
<span id="L108" class="LineNr">108 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Comment">// little-endian</span>
<span id="L109" class="LineNr">109 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x1</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x0</span><span class="Delimiter">);</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <span class="Constant">8</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x0</span><span class="Delimiter">);</span> <span class="Delimiter">}</span>
<span id="L111" class="LineNr">111 </span> <span class="Comment">// e_type</span>
<span id="L112" class="LineNr">112 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x02</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L113" class="LineNr">113 </span> <span class="Comment">// e_machine</span>
<span id="L114" class="LineNr">114 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L115" class="LineNr">115 </span> <span class="Comment">// e_version</span>
<span id="L116" class="LineNr">116 </span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x01</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span> <span class="Special">O</span><span class="Delimiter">(</span><span class="Constant">0x00</span><span class="Delimiter">);</span>
<span id="L117" class="LineNr">117 </span> <span class="Comment">// e_entry</span>
<span id="L118" class="LineNr">118 </span> <span class="Normal">uint32_t</span> e_entry = p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>entry</a><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <span class="Comment">// Override e_entry</span>
<span id="L120" class="LineNr">120 </span> emit<span class="Delimiter">(</span>e_entry<span class="Delimiter">);</span>
<span id="L121" class="LineNr">121 </span> <span class="Comment">// e_phoff -- immediately after ELF header</span>
<span id="L122" class="LineNr">122 </span> <span class="Normal">uint32_t</span> e_phoff = <span class="Constant">0x34</span><span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span> emit<span class="Delimiter">(</span>e_phoff<span class="Delimiter">);</span>
<span id="L124" class="LineNr">124 </span> <span class="Comment">// e_shoff; unused</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">uint32_t</span> dummy32 = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L126" class="LineNr">126 </span> emit<span class="Delimiter">(</span>dummy32<span class="Delimiter">);</span>
<span id="L127" class="LineNr">127 </span> <span class="Comment">// e_flags; unused</span>
<span id="L128" class="LineNr">128 </span> emit<span class="Delimiter">(</span>dummy32<span class="Delimiter">);</span>
<span id="L129" class="LineNr">129 </span> <span class="Comment">// e_ehsize</span>
<span id="L130" class="LineNr">130 </span> <span class="Normal">uint16_t</span> e_ehsize = <span class="Constant">0x34</span><span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span> emit<span class="Delimiter">(</span>e_ehsize<span class="Delimiter">);</span>
<span id="L132" class="LineNr">132 </span> <span class="Comment">// e_phentsize</span>
<span id="L133" class="LineNr">133 </span> <span class="Normal">uint16_t</span> e_phentsize = <span class="Constant">0x20</span><span class="Delimiter">;</span>
<span id="L134" class="LineNr">134 </span> emit<span class="Delimiter">(</span>e_phentsize<span class="Delimiter">);</span>
<span id="L135" class="LineNr">135 </span> <span class="Comment">// e_phnum</span>
<span id="L136" class="LineNr">136 </span> <span class="Normal">uint16_t</span> e_phnum = <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">);</span>
<span id="L137" class="LineNr">137 </span> emit<span class="Delimiter">(</span>e_phnum<span class="Delimiter">);</span>
<span id="L138" class="LineNr">138 </span> <span class="Comment">// e_shentsize</span>
<span id="L139" class="LineNr">139 </span> <span class="Normal">uint16_t</span> dummy16 = <span class="Constant">0x0</span><span class="Delimiter">;</span>
<span id="L140" class="LineNr">140 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L141" class="LineNr">141 </span> <span class="Comment">// e_shnum</span>
<span id="L142" class="LineNr">142 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L143" class="LineNr">143 </span> <span class="Comment">// e_shstrndx</span>
<span id="L144" class="LineNr">144 </span> emit<span class="Delimiter">(</span>dummy16<span class="Delimiter">);</span>
<span id="L145" class="LineNr">145 </span>
<span id="L146" class="LineNr">146 </span> <span class="Normal">uint32_t</span> p_offset = <span class="Comment">/*</span><span class="Comment">size of ehdr</span><span class="Comment">*/</span><span class="Constant">0x34</span> + <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">)</span>*<span class="Constant">0x20</span><span class="Comment">/*</span><span class="Comment">size of each phdr</span><span class="Comment">*/</span><span class="Delimiter">;</span>
<span id="L147" class="LineNr">147 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L148" class="LineNr">148 </span> <span class="Normal">const</span> segment&amp; curr = p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L149" class="LineNr">149 </span> <span class="SalientComment">//// phdr</span>
<span id="L150" class="LineNr">150 </span> <span class="Comment">// p_type</span>
<span id="L151" class="LineNr">151 </span> <span class="Normal">uint32_t</span> p_type = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L152" class="LineNr">152 </span> emit<span class="Delimiter">(</span>p_type<span class="Delimiter">);</span>
<span id="L153" class="LineNr">153 </span> <span class="Comment">// p_offset</span>
<span id="L154" class="LineNr">154 </span> emit<span class="Delimiter">(</span>p_offset<span class="Delimiter">);</span>
<span id="L155" class="LineNr">155 </span> <span class="Comment">// p_vaddr</span>
<span id="L156" class="LineNr">156 </span> <span class="Normal">uint32_t</span> p_start = curr<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L157" class="LineNr">157 </span> emit<span class="Delimiter">(</span>p_start<span class="Delimiter">);</span>
<span id="L158" class="LineNr">158 </span> <span class="Comment">// p_paddr</span>
<span id="L159" class="LineNr">159 </span> emit<span class="Delimiter">(</span>p_start<span class="Delimiter">);</span>
<span id="L160" class="LineNr">160 </span> <span class="Comment">// p_filesz</span>
<span id="L161" class="LineNr">161 </span> <span class="Normal">uint32_t</span> size = <a href='028translate.cc.html#L205'>num_words</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L162" class="LineNr">162 </span> assert<span class="Delimiter">(</span>p_offset + size &lt; <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L163" class="LineNr">163 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
<span id="L164" class="LineNr">164 </span> <span class="Comment">// p_memsz</span>
<span id="L165" class="LineNr">165 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
<span id="L166" class="LineNr">166 </span> <span class="Comment">// p_flags</span>
<span id="L167" class="LineNr">167 </span> <span class="Normal">uint32_t</span> p_flags = <span class="Delimiter">(</span>curr<span class="Delimiter">.</span><a href='011run.cc.html#L112'>name</a> == <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span> ? <span class="Comment">/*</span><span class="Comment">r-x</span><span class="Comment">*/</span><span class="Constant">0x5</span> : <span class="Comment">/*</span><span class="Comment">rw-</span><span class="Comment">*/</span><span class="Constant">0x6</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span> emit<span class="Delimiter">(</span>p_flags<span class="Delimiter">);</span>
<span id="L169" class="LineNr">169 </span>
<span id="L170" class="LineNr">170 </span> <span class="Comment">// p_align</span>
<span id="L171" class="LineNr">171 </span> <span class="Comment">// &quot;As the system creates or augments a process image, it logically copies</span>
<span id="L172" class="LineNr">172 </span> <span class="Comment">// a file's segment to a virtual memory segment. When—and if— the system</span>
<span id="L173" class="LineNr">173 </span> <span class="Comment">// physically reads the file depends on the program's execution behavior,</span>
<span id="L174" class="LineNr">174 </span> <span class="Comment">// system load, and so on. A process does not require a physical page</span>
<span id="L175" class="LineNr">175 </span> <span class="Comment">// unless it references the logical page during execution, and processes</span>
<span id="L176" class="LineNr">176 </span> <span class="Comment">// commonly leave many pages unreferenced. Therefore delaying physical</span>
<span id="L177" class="LineNr">177 </span> <span class="Comment">// reads frequently obviates them, improving system performance. To obtain</span>
<span id="L178" class="LineNr">178 </span> <span class="Comment">// this efficiency in practice, executable and shared object files must</span>
<span id="L179" class="LineNr">179 </span> <span class="Comment">// have segment images whose file offsets and virtual addresses are</span>
<span id="L180" class="LineNr">180 </span> <span class="Comment">// congruent, modulo the page size.&quot; -- <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a> (page 95)</span>
<span id="L181" class="LineNr">181 </span> <span class="Normal">uint32_t</span> p_align = <span class="Constant">0x1000</span><span class="Delimiter">;</span> <span class="Comment">// default page size on linux</span>
<span id="L182" class="LineNr">182 </span> emit<span class="Delimiter">(</span>p_align<span class="Delimiter">);</span>
<span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset % p_align != p_start % p_align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L184" class="LineNr">184 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L398'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L185" class="LineNr">185 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span>
<span id="L187" class="LineNr">187 </span>
<span id="L188" class="LineNr">188 </span> <span class="Comment">// prepare for next segment</span>
<span id="L189" class="LineNr">189 </span> p_offset += size<span class="Delimiter">;</span>
<span id="L190" class="LineNr">190 </span> <span class="Delimiter">}</span>
<span id="L191" class="LineNr">191 </span><span class="PreProc">#undef </span><span class="Special">O</span>
<span id="L192" class="LineNr">192 </span><span class="PreProc">#undef emit</span>
<span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span>
<span id="L194" class="LineNr">194 </span>
<span id="L195" class="LineNr">195 </span><span class="Normal">void</span> <a href='028translate.cc.html#L195'>write_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L196" class="LineNr">196 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L197" class="LineNr">197 </span> <span class="Normal">const</span> vector&lt;word&gt;&amp; w = s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">;</span>
<span id="L198" class="LineNr">198 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span> <span class="Normal">uint8_t</span> x = <a href='011run.cc.html#L302'>hex_byte</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>data<span class="Delimiter">);</span> <span class="Comment">// we're done with metadata by this point</span>
<span id="L200" class="LineNr">200 </span> out<span class="Delimiter">.</span>write<span class="Delimiter">(</span><span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span>&amp;x<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">sizeof(byte)</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span>
<span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span>
<span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Normal">uint32_t</span> <a href='028translate.cc.html#L205'>num_words</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span> <span class="Normal">uint32_t</span> sum = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L207" class="LineNr">207 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L208" class="LineNr">208 </span> sum += <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">);</span>
<span id="L209" class="LineNr">209 </span> <span class="Identifier">return</span> sum<span class="Delimiter">;</span>
<span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
<span id="L211" class="LineNr">211 </span>
<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L213" class="LineNr">213 </span><span class="Normal">using</span> std::ios<span class="Delimiter">;</span>
</pre>
</body>
</html>

View File

@ -14,9 +14,9 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }

View File

@ -14,6 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
@ -21,7 +22,6 @@ a { color:inherit; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Delimiter { color: #c000c0; }
.cSpecial { color: #008000; }
.SalientComment { color: #0000af; }
-->
</style>

View File

@ -14,6 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
@ -71,7 +72,7 @@ if ('onhashchange' in window) {
<span id="L12" class="LineNr"> 12 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L13" class="LineNr"> 13 </span> <span class="Constant">&quot;transform: -- move literal strings to data segment\n&quot;</span>
<span id="L14" class="LineNr"> 14 </span> <span class="Constant">&quot;transform: adding global variable '__subx_global_1' containing \&quot;</span>test\<span class="Constant">&quot;\n&quot;</span>
<span id="L15" class="LineNr"> 15 </span> <span class="Constant">&quot;transform: instruction after transform: 'b8 __subx_global_1'\n&quot;</span>
<span id="L15" class="LineNr"> 15 </span> <span class="Constant">&quot;transform: <a href='011run.cc.html#L122'>line</a> after transform: 'b8 __subx_global_1'\n&quot;</span>
<span id="L16" class="LineNr"> 16 </span> <span class="Delimiter">);</span>
<span id="L17" class="LineNr"> 17 </span><span class="Delimiter">}</span>
<span id="L18" class="LineNr"> 18 </span>
@ -80,307 +81,332 @@ if ('onhashchange' in window) {
<span id="L21" class="LineNr"> 21 </span><span class="Comment">//: layers to transform.</span>
<span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(after &quot;Begin Transforms&quot;)</span>
<span id="L23" class="LineNr"> 23 </span><span class="Comment">// Begin Level-3 Transforms</span>
<span id="L24" class="LineNr"> 24 </span><span class="Special"><a href='011run.cc.html#L252'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='038---literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">);</span>
<span id="L24" class="LineNr"> 24 </span><span class="Special"><a href='011run.cc.html#L252'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='038---literal_strings.cc.html#L32'>transform_literal_strings</a><span class="Delimiter">);</span>
<span id="L25" class="LineNr"> 25 </span><span class="Comment">// End Level-3 Transforms</span>
<span id="L26" class="LineNr"> 26 </span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L28" class="LineNr"> 28 </span><span class="Normal">int</span> <span class="Special"><a href='038---literal_strings.cc.html#L28'>Next_auto_global</a></span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(code)</span>
<span id="L30" class="LineNr"> 30 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- move literal strings to data segment&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> segment&amp; code = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">);</span>
<span id="L34" class="LineNr"> 34 </span> segment&amp; data = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L36" class="LineNr"> 36 </span> line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span> word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L40" class="LineNr"> 40 </span> ostringstream global_name<span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> global_name &lt;&lt; <span class="Constant">&quot;__subx_global_&quot;</span> &lt;&lt; <span class="Special"><a href='038---literal_strings.cc.html#L28'>Next_auto_global</a></span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span> ++<span class="Special"><a href='038---literal_strings.cc.html#L28'>Next_auto_global</a></span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span> <a href='038---literal_strings.cc.html#L50'>add_global_to_data_segment</a><span class="Delimiter">(</span>global_name<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> curr<span class="Delimiter">,</span> data<span class="Delimiter">);</span>
<span id="L44" class="LineNr"> 44 </span> curr<span class="Delimiter">.</span>data = global_name<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Delimiter">}</span>
<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction after transform: '&quot;</span> &lt;&lt; data_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span>
<span id="L48" class="LineNr"> 48 </span><span class="Delimiter">}</span>
<span id="L49" class="LineNr"> 49 </span>
<span id="L50" class="LineNr"> 50 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L50'>add_global_to_data_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; <a href='011run.cc.html#L112'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; value<span class="Delimiter">,</span> segment&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding global variable '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' containing &quot;</span> &lt;&lt; value<span class="Delimiter">.</span>data &lt;&lt; end<span class="Delimiter">();</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Comment">// emit label</span>
<span id="L53" class="LineNr"> 53 </span> data<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>label<span class="Delimiter">(</span><a href='011run.cc.html#L112'>name</a><span class="Delimiter">));</span>
<span id="L54" class="LineNr"> 54 </span> <span class="Comment">// emit size for size-prefixed array</span>
<span id="L55" class="LineNr"> 55 </span> data<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L122'>line</a><span class="Delimiter">());</span>
<span id="L56" class="LineNr"> 56 </span> emit_hex_bytes<span class="Delimiter">(</span>data<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>back<span class="Delimiter">(),</span> <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">.</span>data<span class="Delimiter">)</span>-<span class="Comment">/*</span><span class="Comment">skip quotes</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Comment">/*</span><span class="Comment">bytes</span><span class="Comment">*/</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Comment">// emit data byte by byte</span>
<span id="L58" class="LineNr"> 58 </span> data<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L122'>line</a><span class="Delimiter">());</span>
<span id="L59" class="LineNr"> 59 </span> line&amp; curr = data<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>back<span class="Delimiter">();</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip start quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">.</span>data<span class="Delimiter">)</span>-<span class="Comment">/*</span><span class="Comment">skip end quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">char</span> c = value<span class="Delimiter">.</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L63" class="LineNr"> 63 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='030---operands.cc.html#L295'>hex_byte_to_string</a><span class="Delimiter">(</span>c<span class="Delimiter">);</span>
<span id="L64" class="LineNr"> 64 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> c<span class="Delimiter">));</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span>
<span id="L66" class="LineNr"> 66 </span><span class="Delimiter">}</span>
<span id="L67" class="LineNr"> 67 </span>
<span id="L68" class="LineNr"> 68 </span><span class="Comment">//: Within strings, whitespace is significant. So we need to redo our instruction</span>
<span id="L69" class="LineNr"> 69 </span><span class="Comment">//: parsing.</span>
<span id="L70" class="LineNr"> 70 </span>
<span id="L71" class="LineNr"> 71 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L71'>test_instruction_with_string_literal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L72" class="LineNr"> 72 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Constant">&quot;a \&quot;</span>abc def\<span class="Constant">&quot; z\n&quot;</span> <span class="Comment">// two spaces inside string</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">);</span>
<span id="L75" class="LineNr"> 75 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L77" class="LineNr"> 77 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>abc def\<span class="Constant">&quot;\n&quot;</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: z\n&quot;</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">);</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Comment">// no other words</span>
<span id="L81" class="LineNr"> 81 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
<span id="L83" class="LineNr"> 83 </span>
<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before &quot;End Line Parsing Special-cases(line_data -&gt; l)&quot;)</span>
<span id="L85" class="LineNr"> 85 </span><span class="Normal">if</span> <span class="Delimiter">(</span>line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'&quot;'</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// can cause false-positives, but we can handle them</span>
<span id="L86" class="LineNr"> 86 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>line_data<span class="Delimiter">,</span> l<span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span>
<span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(code)</span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> parse_instruction_character_by_character<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; line_data<span class="Delimiter">,</span> vector&lt;line&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="cSpecial">'\n'</span><span class="Delimiter">)</span> != string::npos &amp;&amp; line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="cSpecial">'\n'</span><span class="Delimiter">)</span> != line_data<span class="Delimiter">.</span>size<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;parse_instruction_character_by_character: should receive only a single line\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Delimiter">}</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Comment">// parse literals</span>
<span id="L97" class="LineNr"> 97 </span> istringstream in<span class="Delimiter">(</span>line_data<span class="Delimiter">);</span>
<span id="L98" class="LineNr"> 98 </span> in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
<span id="L99" class="LineNr"> 99 </span> <a href='011run.cc.html#L122'>line</a> result<span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> result<span class="Delimiter">.</span>original = line_data<span class="Delimiter">;</span>
<span id="L101" class="LineNr">101 </span> <span class="Comment">// add tokens (words or strings) one by one</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L103" class="LineNr">103 </span> <a href='038---literal_strings.cc.html#L166'>skip_whitespace</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L106" class="LineNr">106 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// comment; drop rest of line</span>
<span id="L107" class="LineNr">107 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">':'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// line metadata; skip for now</span>
<span id="L108" class="LineNr">108 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// comment token at end of line</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span>
<span id="L111" class="LineNr">111 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// '.' followed by space is comment token; skip</span>
<span id="L112" class="LineNr">112 </span> <span class="Delimiter">}</span>
<span id="L113" class="LineNr">113 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L114" class="LineNr">114 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L115" class="LineNr">115 </span> <span class="Comment">// string literal; slurp everything between quotes into data</span>
<span id="L116" class="LineNr">116 </span> ostringstream d<span class="Delimiter">;</span>
<span id="L117" class="LineNr">117 </span> d &lt;&lt; c<span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L121" class="LineNr">121 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'n'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
<span id="L124" class="LineNr">124 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="cSpecial">'\\'</span><span class="Delimiter">;</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L126" class="LineNr">126 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;parse_instruction_character_by_character: unknown escape sequence '\\&quot;</span> &lt;&lt; c &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L127" class="LineNr">127 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L128" class="LineNr">128 </span> <span class="Delimiter">}</span>
<span id="L129" class="LineNr">129 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L131" class="LineNr">131 </span> d &lt;&lt; c<span class="Delimiter">;</span>
<span id="L132" class="LineNr">132 </span> <span class="Delimiter">}</span>
<span id="L133" class="LineNr">133 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span>
<span id="L135" class="LineNr">135 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = d<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L136" class="LineNr">136 </span> <span class="Comment">// slurp metadata</span>
<span id="L137" class="LineNr">137 </span> ostringstream m<span class="Delimiter">;</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> &amp;&amp; <a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// peek can sometimes trigger eof(), so do it first</span>
<span id="L139" class="LineNr">139 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L140" class="LineNr">140 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'/'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L141" class="LineNr">141 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!m<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>m<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
<span id="L142" class="LineNr">142 </span> m<span class="Delimiter">.</span>str<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L143" class="LineNr">143 </span> <span class="Delimiter">}</span>
<span id="L144" class="LineNr">144 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L145" class="LineNr">145 </span> m &lt;&lt; c<span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <span class="Delimiter">}</span>
<span id="L147" class="LineNr">147 </span> <span class="Delimiter">}</span>
<span id="L148" class="LineNr">148 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!m<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>m<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
<span id="L149" class="LineNr">149 </span> <span class="Delimiter">}</span>
<span id="L150" class="LineNr">150 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L151" class="LineNr">151 </span> <span class="Comment">// not a string literal; slurp all characters until whitespace</span>
<span id="L152" class="LineNr">152 </span> ostringstream w<span class="Delimiter">;</span>
<span id="L153" class="LineNr">153 </span> w &lt;&lt; c<span class="Delimiter">;</span>
<span id="L154" class="LineNr">154 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> &amp;&amp; <a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// peek can sometimes trigger eof(), so do it first</span>
<span id="L155" class="LineNr">155 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L156" class="LineNr">156 </span> w &lt;&lt; c<span class="Delimiter">;</span>
<span id="L157" class="LineNr">157 </span> <span class="Delimiter">}</span>
<span id="L158" class="LineNr">158 </span> <a href='011run.cc.html#L210'>parse_word</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">());</span>
<span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span>
<span id="L160" class="LineNr">160 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;word: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span> <span class="Delimiter">}</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
<span id="L163" class="LineNr">163 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L164" class="LineNr">164 </span><span class="Delimiter">}</span>
<span id="L165" class="LineNr">165 </span>
<span id="L166" class="LineNr">166 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L166'>skip_whitespace</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L167" class="LineNr">167 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L168" class="LineNr">168 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L169" class="LineNr">169 </span> <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </span> <span class="Delimiter">}</span>
<span id="L171" class="LineNr">171 </span><span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span>
<span id="L173" class="LineNr">173 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L173'>skip_comment</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L174" class="LineNr">174 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L175" class="LineNr">175 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L176" class="LineNr">176 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L177" class="LineNr">177 </span> <span class="Delimiter">}</span>
<span id="L178" class="LineNr">178 </span><span class="Delimiter">}</span>
<span id="L179" class="LineNr">179 </span>
<span id="L180" class="LineNr">180 </span><a href='011run.cc.html#L122'>line</a> label<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <a href='011run.cc.html#L122'>line</a> result<span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L183" class="LineNr">183 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <span class="Delimiter">(</span>s+<span class="Constant">&quot;:&quot;</span><span class="Delimiter">);</span>
<span id="L184" class="LineNr">184 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
<span id="L186" class="LineNr">186 </span>
<span id="L187" class="LineNr">187 </span><span class="Comment">// helper for tests</span>
<span id="L188" class="LineNr">188 </span><span class="Normal">void</span> parse_instruction_character_by_character<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; line_data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L189" class="LineNr">189 </span> vector&lt;line&gt; out<span class="Delimiter">;</span>
<span id="L190" class="LineNr">190 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>line_data<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L191" class="LineNr">191 </span><span class="Delimiter">}</span>
<span id="L192" class="LineNr">192 </span>
<span id="L193" class="LineNr">193 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L193'>test_parse2_comment_token_in_middle</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L194" class="LineNr">194 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L195" class="LineNr">195 </span> <span class="Constant">&quot;a . z\n&quot;</span>
<span id="L196" class="LineNr">196 </span> <span class="Delimiter">);</span>
<span id="L197" class="LineNr">197 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L198" class="LineNr">198 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L199" class="LineNr">199 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: z\n&quot;</span>
<span id="L200" class="LineNr">200 </span> <span class="Delimiter">);</span>
<span id="L201" class="LineNr">201 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L202" class="LineNr">202 </span> <span class="Comment">// no other words</span>
<span id="L203" class="LineNr">203 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span><span class="Delimiter">}</span>
<span id="L205" class="LineNr">205 </span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L206'>test_parse2_word_starting_with_dot</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L208" class="LineNr">208 </span> <span class="Constant">&quot;a .b c\n&quot;</span>
<span id="L209" class="LineNr">209 </span> <span class="Delimiter">);</span>
<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L211" class="LineNr">211 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L212" class="LineNr">212 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .b\n&quot;</span>
<span id="L213" class="LineNr">213 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: c\n&quot;</span>
<span id="L214" class="LineNr">214 </span> <span class="Delimiter">);</span>
<span id="L215" class="LineNr">215 </span><span class="Delimiter">}</span>
<span id="L216" class="LineNr">216 </span>
<span id="L217" class="LineNr">217 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L217'>test_parse2_comment_token_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L218" class="LineNr">218 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L219" class="LineNr">219 </span> <span class="Constant">&quot;. a b\n&quot;</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">);</span>
<span id="L221" class="LineNr">221 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L222" class="LineNr">222 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L223" class="LineNr">223 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L224" class="LineNr">224 </span> <span class="Delimiter">);</span>
<span id="L225" class="LineNr">225 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L226" class="LineNr">226 </span><span class="Delimiter">}</span>
<span id="L227" class="LineNr">227 </span>
<span id="L228" class="LineNr">228 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L228'>test_parse2_comment_token_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L229" class="LineNr">229 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L230" class="LineNr">230 </span> <span class="Constant">&quot;a b .\n&quot;</span>
<span id="L231" class="LineNr">231 </span> <span class="Delimiter">);</span>
<span id="L232" class="LineNr">232 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L233" class="LineNr">233 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L234" class="LineNr">234 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L235" class="LineNr">235 </span> <span class="Delimiter">);</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L237" class="LineNr">237 </span><span class="Delimiter">}</span>
<span id="L238" class="LineNr">238 </span>
<span id="L239" class="LineNr">239 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L239'>test_parse2_word_starting_with_dot_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L240" class="LineNr">240 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L241" class="LineNr">241 </span> <span class="Constant">&quot;.a b c\n&quot;</span>
<span id="L242" class="LineNr">242 </span> <span class="Delimiter">);</span>
<span id="L243" class="LineNr">243 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L244" class="LineNr">244 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .a\n&quot;</span>
<span id="L245" class="LineNr">245 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L246" class="LineNr">246 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: c\n&quot;</span>
<span id="L247" class="LineNr">247 </span> <span class="Delimiter">);</span>
<span id="L248" class="LineNr">248 </span><span class="Delimiter">}</span>
<span id="L249" class="LineNr">249 </span>
<span id="L250" class="LineNr">250 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L250'>test_parse2_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L251" class="LineNr">251 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L252" class="LineNr">252 </span> <span class="Constant">&quot;.a b/c d\n&quot;</span>
<span id="L253" class="LineNr">253 </span> <span class="Delimiter">);</span>
<span id="L254" class="LineNr">254 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L255" class="LineNr">255 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .a\n&quot;</span>
<span id="L256" class="LineNr">256 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b /c\n&quot;</span>
<span id="L257" class="LineNr">257 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: d\n&quot;</span>
<span id="L258" class="LineNr">258 </span> <span class="Delimiter">);</span>
<span id="L259" class="LineNr">259 </span><span class="Delimiter">}</span>
<span id="L260" class="LineNr">260 </span>
<span id="L261" class="LineNr">261 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L261'>test_parse2_string_with_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L262" class="LineNr">262 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L263" class="LineNr">263 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32 g\n&quot;</span>
<span id="L264" class="LineNr">264 </span> <span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L266" class="LineNr">266 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L267" class="LineNr">267 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L268" class="LineNr">268 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: g\n&quot;</span>
<span id="L269" class="LineNr">269 </span> <span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
<span id="L271" class="LineNr">271 </span>
<span id="L272" class="LineNr">272 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L272'>test_parse2_string_with_metadata_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L273" class="LineNr">273 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L274" class="LineNr">274 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L275" class="LineNr">275 </span> <span class="Delimiter">);</span>
<span id="L276" class="LineNr">276 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L277" class="LineNr">277 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L278" class="LineNr">278 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L279" class="LineNr">279 </span> <span class="Delimiter">);</span>
<span id="L280" class="LineNr">280 </span><span class="Delimiter">}</span>
<span id="L281" class="LineNr">281 </span>
<span id="L282" class="LineNr">282 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L282'>test_parse2_string_with_metadata_at_end_of_line_without_newline</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L283" class="LineNr">283 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L284" class="LineNr">284 </span> <span class="Constant">&quot;68/push \&quot;</span>test\<span class="Constant">&quot;/f&quot;</span> <span class="Comment">// no newline, which is how calls from parse() will look</span>
<span id="L285" class="LineNr">285 </span> <span class="Delimiter">);</span>
<span id="L286" class="LineNr">286 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L287" class="LineNr">287 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: 68 /push\n&quot;</span>
<span id="L288" class="LineNr">288 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>test\<span class="Constant">&quot; /f\n&quot;</span>
<span id="L28" class="LineNr"> 28 </span><span class="Normal">int</span> <span class="Special">Next_auto_global</span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L30" class="LineNr"> 30 </span><span class="Special">Next_auto_global</span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(code)</span>
<span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L32'>transform_literal_strings</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- move literal strings to data segment&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span> vector&lt;line&gt; new_lines<span class="Delimiter">;</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> s = <span class="Constant">0</span><span class="Delimiter">;</span> s &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">);</span> ++s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span> segment&amp; seg = p<span class="Delimiter">.</span><a href='011run.cc.html#L107'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;segment '&quot;</span> &lt;&lt; seg<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L39" class="LineNr"> 39 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span><span class="CommentedCode">//? cerr &lt;&lt; seg.name &lt;&lt; '/' &lt;&lt; i &lt;&lt; '\n';</span>
<span id="L41" class="LineNr"> 41 </span> line&amp; <a href='011run.cc.html#L122'>line</a> = seg<span class="Delimiter">.</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span><a href='011run.cc.html#L122'>line</a><span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L43" class="LineNr"> 43 </span> word&amp; curr = <a href='011run.cc.html#L122'>line</a><span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> ostringstream global_name<span class="Delimiter">;</span>
<span id="L46" class="LineNr"> 46 </span> global_name &lt;&lt; <span class="Constant">&quot;__subx_global_&quot;</span> &lt;&lt; <span class="Special">Next_auto_global</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr"> 47 </span> ++<span class="Special">Next_auto_global</span><span class="Delimiter">;</span>
<span id="L48" class="LineNr"> 48 </span> <a href='038---literal_strings.cc.html#L59'>add_global_to_data_segment</a><span class="Delimiter">(</span>global_name<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> curr<span class="Delimiter">,</span> new_lines<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> curr<span class="Delimiter">.</span>data = global_name<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Delimiter">}</span>
<span id="L51" class="LineNr"> 51 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;line after transform: '&quot;</span> &lt;&lt; data_to_string<span class="Delimiter">(</span>line<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Delimiter">}</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Delimiter">}</span>
<span id="L54" class="LineNr"> 54 </span> segment* data = find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>data<span class="Delimiter">)</span>
<span id="L56" class="LineNr"> 56 </span> data<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>insert<span class="Delimiter">(</span>data<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>end<span class="Delimiter">(),</span> new_lines<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> new_lines<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L57" class="LineNr"> 57 </span><span class="Delimiter">}</span>
<span id="L58" class="LineNr"> 58 </span>
<span id="L59" class="LineNr"> 59 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L59'>add_global_to_data_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; <a href='011run.cc.html#L112'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; value<span class="Delimiter">,</span> vector&lt;line&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding global variable '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' containing &quot;</span> &lt;&lt; value<span class="Delimiter">.</span>data &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Comment">// emit label</span>
<span id="L62" class="LineNr"> 62 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>label<span class="Delimiter">(</span><a href='011run.cc.html#L112'>name</a><span class="Delimiter">));</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Comment">// emit size for size-prefixed array</span>
<span id="L64" class="LineNr"> 64 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L122'>line</a><span class="Delimiter">());</span>
<span id="L65" class="LineNr"> 65 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">.</span>back<span class="Delimiter">(),</span> <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">.</span>data<span class="Delimiter">)</span>-<span class="Comment">/*</span><span class="Comment">skip quotes</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">4</span><span class="Comment">/*</span><span class="Comment">bytes</span><span class="Comment">*/</span><span class="Delimiter">);</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Comment">// emit data byte by byte</span>
<span id="L67" class="LineNr"> 67 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L122'>line</a><span class="Delimiter">());</span>
<span id="L68" class="LineNr"> 68 </span> line&amp; curr = out<span class="Delimiter">.</span>back<span class="Delimiter">();</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip start quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L164'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">.</span>data<span class="Delimiter">)</span>-<span class="Comment">/*</span><span class="Comment">skip end quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Normal">char</span> c = value<span class="Delimiter">.</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L71" class="LineNr"> 71 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L72" class="LineNr"> 72 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='030---operands.cc.html#L295'>hex_byte_to_string</a><span class="Delimiter">(</span>c<span class="Delimiter">);</span>
<span id="L73" class="LineNr"> 73 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> c<span class="Delimiter">));</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span>
<span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span>
<span id="L76" class="LineNr"> 76 </span>
<span id="L77" class="LineNr"> 77 </span><span class="Comment">//: Within strings, whitespace is significant. So we need to redo our instruction</span>
<span id="L78" class="LineNr"> 78 </span><span class="Comment">//: parsing.</span>
<span id="L79" class="LineNr"> 79 </span>
<span id="L80" class="LineNr"> 80 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L80'>test_instruction_with_string_literal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L81" class="LineNr"> 81 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Constant">&quot;a \&quot;</span>abc def\<span class="Constant">&quot; z\n&quot;</span> <span class="Comment">// two spaces inside string</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>abc def\<span class="Constant">&quot;\n&quot;</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: z\n&quot;</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Comment">// no other words</span>
<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L91" class="LineNr"> 91 </span><span class="Delimiter">}</span>
<span id="L92" class="LineNr"> 92 </span>
<span id="L93" class="LineNr"> 93 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L93'>test_string_literal_in_data_segment</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L94" class="LineNr"> 94 </span> <a href='011run.cc.html#L83'>run</a><span class="Delimiter">(</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Constant">&quot;b8/copy X/imm32\n&quot;</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Constant">&quot;X:\n&quot;</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Constant">&quot;\&quot;</span>test\<span class="Constant">&quot;/imm32\n&quot;</span>
<span id="L100" class="LineNr">100 </span> <span class="Delimiter">);</span>
<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L102" class="LineNr">102 </span> <span class="Constant">&quot;transform: -- move literal strings to data segment\n&quot;</span>
<span id="L103" class="LineNr">103 </span> <span class="Constant">&quot;transform: adding global variable '__subx_global_1' containing \&quot;</span>test\<span class="Constant">&quot;\n&quot;</span>
<span id="L104" class="LineNr">104 </span> <span class="Constant">&quot;transform: <a href='011run.cc.html#L122'>line</a> after transform: '__subx_global_1'\n&quot;</span>
<span id="L105" class="LineNr">105 </span> <span class="Delimiter">);</span>
<span id="L106" class="LineNr">106 </span><span class="Delimiter">}</span>
<span id="L107" class="LineNr">107 </span>
<span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End Line Parsing Special-cases(line_data -&gt; l)&quot;)</span>
<span id="L109" class="LineNr">109 </span><span class="Normal">if</span> <span class="Delimiter">(</span>line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'&quot;'</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// can cause false-positives, but we can handle them</span>
<span id="L110" class="LineNr">110 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>line_data<span class="Delimiter">,</span> l<span class="Delimiter">);</span>
<span id="L111" class="LineNr">111 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span>
<span id="L113" class="LineNr">113 </span>
<span id="L114" class="LineNr">114 </span><span class="Delimiter">:(code)</span>
<span id="L115" class="LineNr">115 </span><span class="Normal">void</span> parse_instruction_character_by_character<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; line_data<span class="Delimiter">,</span> vector&lt;line&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="cSpecial">'\n'</span><span class="Delimiter">)</span> != string::npos &amp;&amp; line_data<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="cSpecial">'\n'</span><span class="Delimiter">)</span> != line_data<span class="Delimiter">.</span>size<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;parse_instruction_character_by_character: should receive only a single line\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L118" class="LineNr">118 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span>
<span id="L120" class="LineNr">120 </span> <span class="Comment">// parse literals</span>
<span id="L121" class="LineNr">121 </span> istringstream in<span class="Delimiter">(</span>line_data<span class="Delimiter">);</span>
<span id="L122" class="LineNr">122 </span> in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span> <a href='011run.cc.html#L122'>line</a> result<span class="Delimiter">;</span>
<span id="L124" class="LineNr">124 </span> result<span class="Delimiter">.</span>original = line_data<span class="Delimiter">;</span>
<span id="L125" class="LineNr">125 </span> <span class="Comment">// add tokens (words or strings) one by one</span>
<span id="L126" class="LineNr">126 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L127" class="LineNr">127 </span> <a href='038---literal_strings.cc.html#L191'>skip_whitespace</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span>
<span id="L128" class="LineNr">128 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L129" class="LineNr">129 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L130" class="LineNr">130 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// comment; drop rest of line</span>
<span id="L131" class="LineNr">131 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">':'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// line metadata; skip for now</span>
<span id="L132" class="LineNr">132 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'.'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L133" class="LineNr">133 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// comment token at end of line</span>
<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span>
<span id="L135" class="LineNr">135 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// '.' followed by space is comment token; skip</span>
<span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L139" class="LineNr">139 </span> <span class="Comment">// string literal; slurp everything between quotes into data</span>
<span id="L140" class="LineNr">140 </span> ostringstream d<span class="Delimiter">;</span>
<span id="L141" class="LineNr">141 </span> d &lt;&lt; c<span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L145" class="LineNr">145 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'n'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L147" class="LineNr">147 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="Constant">'&quot;'</span><span class="Delimiter">;</span>
<span id="L148" class="LineNr">148 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="cSpecial">'\\'</span><span class="Delimiter">)</span> d &lt;&lt; <span class="cSpecial">'\\'</span><span class="Delimiter">;</span>
<span id="L149" class="LineNr">149 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L150" class="LineNr">150 </span> <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;parse_instruction_character_by_character: unknown escape sequence '\\&quot;</span> &lt;&lt; c &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L151" class="LineNr">151 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L152" class="LineNr">152 </span> <span class="Delimiter">}</span>
<span id="L153" class="LineNr">153 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L155" class="LineNr">155 </span> d &lt;&lt; c<span class="Delimiter">;</span>
<span id="L156" class="LineNr">156 </span> <span class="Delimiter">}</span>
<span id="L157" class="LineNr">157 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L158" class="LineNr">158 </span> <span class="Delimiter">}</span>
<span id="L159" class="LineNr">159 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = d<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L160" class="LineNr">160 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>original = d<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span> <span class="Comment">// slurp metadata</span>
<span id="L162" class="LineNr">162 </span> ostringstream m<span class="Delimiter">;</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> &amp;&amp; <a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// peek can sometimes trigger eof(), so do it first</span>
<span id="L164" class="LineNr">164 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L165" class="LineNr">165 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'/'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!m<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>m<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
<span id="L167" class="LineNr">167 </span> m<span class="Delimiter">.</span>str<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L168" class="LineNr">168 </span> <span class="Delimiter">}</span>
<span id="L169" class="LineNr">169 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L170" class="LineNr">170 </span> m &lt;&lt; c<span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span> <span class="Delimiter">}</span>
<span id="L173" class="LineNr">173 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!m<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">())</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>m<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
<span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span>
<span id="L175" class="LineNr">175 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr">176 </span> <span class="Comment">// not a string literal; slurp all characters until whitespace</span>
<span id="L177" class="LineNr">177 </span> ostringstream w<span class="Delimiter">;</span>
<span id="L178" class="LineNr">178 </span> w &lt;&lt; c<span class="Delimiter">;</span>
<span id="L179" class="LineNr">179 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>!isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">())</span> &amp;&amp; <a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// peek can sometimes trigger eof(), so do it first</span>
<span id="L180" class="LineNr">180 </span> in &gt;&gt; c<span class="Delimiter">;</span>
<span id="L181" class="LineNr">181 </span> w &lt;&lt; c<span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span>
<span id="L183" class="LineNr">183 </span> <a href='011run.cc.html#L210'>parse_word</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">());</span>
<span id="L184" class="LineNr">184 </span> <span class="Delimiter">}</span>
<span id="L185" class="LineNr">185 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;word: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span>
<span id="L187" class="LineNr">187 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
<span id="L188" class="LineNr">188 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span>
<span id="L190" class="LineNr">190 </span>
<span id="L191" class="LineNr">191 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L191'>skip_whitespace</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L192" class="LineNr">192 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L193" class="LineNr">193 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L194" class="LineNr">194 </span> <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L195" class="LineNr">195 </span> <span class="Delimiter">}</span>
<span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L198'>skip_comment</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L200" class="LineNr">200 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L201" class="LineNr">201 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L272'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span>
<span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><a href='011run.cc.html#L122'>line</a> label<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span> <a href='011run.cc.html#L122'>line</a> result<span class="Delimiter">;</span>
<span id="L207" class="LineNr">207 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L128'>word</a><span class="Delimiter">());</span>
<span id="L208" class="LineNr">208 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L123'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <span class="Delimiter">(</span>s+<span class="Constant">&quot;:&quot;</span><span class="Delimiter">);</span>
<span id="L209" class="LineNr">209 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
<span id="L211" class="LineNr">211 </span>
<span id="L212" class="LineNr">212 </span><span class="Comment">// helper for tests</span>
<span id="L213" class="LineNr">213 </span><span class="Normal">void</span> parse_instruction_character_by_character<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; line_data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L214" class="LineNr">214 </span> vector&lt;line&gt; out<span class="Delimiter">;</span>
<span id="L215" class="LineNr">215 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>line_data<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
<span id="L217" class="LineNr">217 </span>
<span id="L218" class="LineNr">218 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L218'>test_parse2_comment_token_in_middle</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L219" class="LineNr">219 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L220" class="LineNr">220 </span> <span class="Constant">&quot;a . z\n&quot;</span>
<span id="L221" class="LineNr">221 </span> <span class="Delimiter">);</span>
<span id="L222" class="LineNr">222 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L223" class="LineNr">223 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L224" class="LineNr">224 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: z\n&quot;</span>
<span id="L225" class="LineNr">225 </span> <span class="Delimiter">);</span>
<span id="L226" class="LineNr">226 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L227" class="LineNr">227 </span> <span class="Comment">// no other words</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L229" class="LineNr">229 </span><span class="Delimiter">}</span>
<span id="L230" class="LineNr">230 </span>
<span id="L231" class="LineNr">231 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L231'>test_parse2_word_starting_with_dot</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L232" class="LineNr">232 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L233" class="LineNr">233 </span> <span class="Constant">&quot;a .b c\n&quot;</span>
<span id="L234" class="LineNr">234 </span> <span class="Delimiter">);</span>
<span id="L235" class="LineNr">235 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L236" class="LineNr">236 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L237" class="LineNr">237 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .b\n&quot;</span>
<span id="L238" class="LineNr">238 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: c\n&quot;</span>
<span id="L239" class="LineNr">239 </span> <span class="Delimiter">);</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span>
<span id="L242" class="LineNr">242 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L242'>test_parse2_comment_token_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L243" class="LineNr">243 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L244" class="LineNr">244 </span> <span class="Constant">&quot;. a b\n&quot;</span>
<span id="L245" class="LineNr">245 </span> <span class="Delimiter">);</span>
<span id="L246" class="LineNr">246 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L247" class="LineNr">247 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L248" class="LineNr">248 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L249" class="LineNr">249 </span> <span class="Delimiter">);</span>
<span id="L250" class="LineNr">250 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L251" class="LineNr">251 </span><span class="Delimiter">}</span>
<span id="L252" class="LineNr">252 </span>
<span id="L253" class="LineNr">253 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L253'>test_parse2_comment_token_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L254" class="LineNr">254 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L255" class="LineNr">255 </span> <span class="Constant">&quot;a b .\n&quot;</span>
<span id="L256" class="LineNr">256 </span> <span class="Delimiter">);</span>
<span id="L257" class="LineNr">257 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L258" class="LineNr">258 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L259" class="LineNr">259 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L260" class="LineNr">260 </span> <span class="Delimiter">);</span>
<span id="L261" class="LineNr">261 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
<span id="L263" class="LineNr">263 </span>
<span id="L264" class="LineNr">264 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L264'>test_parse2_word_starting_with_dot_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L265" class="LineNr">265 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L266" class="LineNr">266 </span> <span class="Constant">&quot;.a b c\n&quot;</span>
<span id="L267" class="LineNr">267 </span> <span class="Delimiter">);</span>
<span id="L268" class="LineNr">268 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L269" class="LineNr">269 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .a\n&quot;</span>
<span id="L270" class="LineNr">270 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b\n&quot;</span>
<span id="L271" class="LineNr">271 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: c\n&quot;</span>
<span id="L272" class="LineNr">272 </span> <span class="Delimiter">);</span>
<span id="L273" class="LineNr">273 </span><span class="Delimiter">}</span>
<span id="L274" class="LineNr">274 </span>
<span id="L275" class="LineNr">275 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L275'>test_parse2_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L276" class="LineNr">276 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L277" class="LineNr">277 </span> <span class="Constant">&quot;.a b/c d\n&quot;</span>
<span id="L278" class="LineNr">278 </span> <span class="Delimiter">);</span>
<span id="L279" class="LineNr">279 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L280" class="LineNr">280 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: .a\n&quot;</span>
<span id="L281" class="LineNr">281 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: b /c\n&quot;</span>
<span id="L282" class="LineNr">282 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: d\n&quot;</span>
<span id="L283" class="LineNr">283 </span> <span class="Delimiter">);</span>
<span id="L284" class="LineNr">284 </span><span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span>
<span id="L286" class="LineNr">286 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L286'>test_parse2_string_with_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L287" class="LineNr">287 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L288" class="LineNr">288 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32 g\n&quot;</span>
<span id="L289" class="LineNr">289 </span> <span class="Delimiter">);</span>
<span id="L290" class="LineNr">290 </span><span class="Delimiter">}</span>
<span id="L291" class="LineNr">291 </span>
<span id="L292" class="LineNr">292 </span><span class="Comment">//: Make sure slashes inside strings don't trigger adding stuff from inside the</span>
<span id="L293" class="LineNr">293 </span><span class="Comment">//: string to metadata.</span>
<span id="L294" class="LineNr">294 </span>
<span id="L295" class="LineNr">295 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L295'>test_parse2_string_containing_slashes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L296" class="LineNr">296 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L297" class="LineNr">297 </span> <span class="Constant">&quot;a \&quot;</span>bc/def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L298" class="LineNr">298 </span> <span class="Delimiter">);</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L300" class="LineNr">300 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc/def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">);</span>
<span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span>
<span id="L303" class="LineNr">303 </span>
<span id="L304" class="LineNr">304 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L304'>test_instruction_with_string_literal_with_escaped_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L305" class="LineNr">305 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L306" class="LineNr">306 </span> <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>\n<span class="Constant">&quot; // escaped quote inside string</span>
<span id="L307" class="LineNr">307 </span><span class="Constant"> );</span>
<span id="L308" class="LineNr">308 </span><span class="Constant"> CHECK_TRACE_CONTENTS(</span>
<span id="L309" class="LineNr">309 </span><span class="Constant"> &quot;</span>parse2: <a href='011run.cc.html#L128'>word</a>: \<span class="Constant">&quot;a\&quot;</span>b\<span class="Constant">&quot;\n&quot;</span>
<span id="L290" class="LineNr">290 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L291" class="LineNr">291 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L292" class="LineNr">292 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L293" class="LineNr">293 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: g\n&quot;</span>
<span id="L294" class="LineNr">294 </span> <span class="Delimiter">);</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span>
<span id="L297" class="LineNr">297 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L297'>test_parse2_string_with_metadata_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L298" class="LineNr">298 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L299" class="LineNr">299 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L300" class="LineNr">300 </span> <span class="Delimiter">);</span>
<span id="L301" class="LineNr">301 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L302" class="LineNr">302 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: a\n&quot;</span>
<span id="L303" class="LineNr">303 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L304" class="LineNr">304 </span> <span class="Delimiter">);</span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">}</span>
<span id="L306" class="LineNr">306 </span>
<span id="L307" class="LineNr">307 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L307'>test_parse2_string_with_metadata_at_end_of_line_without_newline</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L308" class="LineNr">308 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L309" class="LineNr">309 </span> <span class="Constant">&quot;68/push \&quot;</span>test\<span class="Constant">&quot;/f&quot;</span> <span class="Comment">// no newline, which is how calls from parse() will look</span>
<span id="L310" class="LineNr">310 </span> <span class="Delimiter">);</span>
<span id="L311" class="LineNr">311 </span> <span class="Comment">// no other words</span>
<span id="L312" class="LineNr">312 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L313" class="LineNr">313 </span><span class="Delimiter">}</span>
<span id="L314" class="LineNr">314 </span>
<span id="L315" class="LineNr">315 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L315'>test_instruction_with_string_literal_with_escaped_backslash</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L316" class="LineNr">316 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L317" class="LineNr">317 </span> <span class="Constant">&quot;\&quot;</span>a\\\\b\<span class="Constant">&quot;\n&quot;</span> <span class="Comment">// escaped backslash inside string</span>
<span id="L318" class="LineNr">318 </span> <span class="Delimiter">);</span>
<span id="L319" class="LineNr">319 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L320" class="LineNr">320 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>a\\b\<span class="Constant">&quot;\n&quot;</span>
<span id="L321" class="LineNr">321 </span> <span class="Delimiter">);</span>
<span id="L322" class="LineNr">322 </span> <span class="Comment">// no other words</span>
<span id="L323" class="LineNr">323 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L324" class="LineNr">324 </span><span class="Delimiter">}</span>
<span id="L311" class="LineNr">311 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L312" class="LineNr">312 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: 68 /push\n&quot;</span>
<span id="L313" class="LineNr">313 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>test\<span class="Constant">&quot; /f\n&quot;</span>
<span id="L314" class="LineNr">314 </span> <span class="Delimiter">);</span>
<span id="L315" class="LineNr">315 </span><span class="Delimiter">}</span>
<span id="L316" class="LineNr">316 </span>
<span id="L317" class="LineNr">317 </span><span class="Comment">//: Make sure slashes inside strings don't trigger adding stuff from inside the</span>
<span id="L318" class="LineNr">318 </span><span class="Comment">//: string to metadata.</span>
<span id="L319" class="LineNr">319 </span>
<span id="L320" class="LineNr">320 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L320'>test_parse2_string_containing_slashes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L321" class="LineNr">321 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L322" class="LineNr">322 </span> <span class="Constant">&quot;a \&quot;</span>bc/def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L323" class="LineNr">323 </span> <span class="Delimiter">);</span>
<span id="L324" class="LineNr">324 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L325" class="LineNr">325 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>bc/def\<span class="Constant">&quot; /disp32\n&quot;</span>
<span id="L326" class="LineNr">326 </span> <span class="Delimiter">);</span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">}</span>
<span id="L328" class="LineNr">328 </span>
<span id="L329" class="LineNr">329 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L329'>test_instruction_with_string_literal_with_escaped_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L330" class="LineNr">330 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L331" class="LineNr">331 </span> <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>\n<span class="Constant">&quot; // escaped quote inside string</span>
<span id="L332" class="LineNr">332 </span><span class="Constant"> );</span>
<span id="L333" class="LineNr">333 </span><span class="Constant"> CHECK_TRACE_CONTENTS(</span>
<span id="L334" class="LineNr">334 </span><span class="Constant"> &quot;</span>parse2: <a href='011run.cc.html#L128'>word</a>: \<span class="Constant">&quot;a\&quot;</span>b\<span class="Constant">&quot;\n&quot;</span>
<span id="L335" class="LineNr">335 </span> <span class="Delimiter">);</span>
<span id="L336" class="LineNr">336 </span> <span class="Comment">// no other words</span>
<span id="L337" class="LineNr">337 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L338" class="LineNr">338 </span><span class="Delimiter">}</span>
<span id="L339" class="LineNr">339 </span>
<span id="L340" class="LineNr">340 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L340'>test_instruction_with_string_literal_with_escaped_backslash</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L341" class="LineNr">341 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L342" class="LineNr">342 </span> <span class="Constant">&quot;\&quot;</span>a\\\\b\<span class="Constant">&quot;\n&quot;</span> <span class="Comment">// escaped backslash inside string</span>
<span id="L343" class="LineNr">343 </span> <span class="Delimiter">);</span>
<span id="L344" class="LineNr">344 </span> <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L345" class="LineNr">345 </span> <span class="Constant">&quot;parse2: <a href='011run.cc.html#L128'>word</a>: \&quot;</span>a\\b\<span class="Constant">&quot;\n&quot;</span>
<span id="L346" class="LineNr">346 </span> <span class="Delimiter">);</span>
<span id="L347" class="LineNr">347 </span> <span class="Comment">// no other words</span>
<span id="L348" class="LineNr">348 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.Constant { color: #008787; }
-->
</style>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>

View File

@ -14,17 +14,17 @@ 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; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

View File

@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.Constant { color: #008787; }
-->
</style>

View File

@ -14,17 +14,17 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

View File

@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
-->
</style>

View File

@ -14,18 +14,18 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,12 +14,12 @@ 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; }
.subxS2Comment { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->

View File

@ -14,15 +14,15 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>
@ -100,171 +100,173 @@ if ('onhashchange' in window) {
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="subxComment"># Configure an exit-descriptor for a call pushing 'nbytes' bytes of args to</span>
<span id="L41" class="LineNr"> 41 </span><span class="subxComment"># the stack.</span>
<span id="L42" class="LineNr"> 42 </span><span class="subxComment"># Ugly that we need to know the size of args, but so it goes.</span>
<span id="L43" class="LineNr"> 43 </span><span class="subxFunction">tailor-exit-descriptor</span>: <span class="subxComment"># ed : (address exit-descriptor), nbytes : int -&gt; &lt;void&gt;</span>
<span id="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L45" class="LineNr"> 45 </span> 55/push-EBP
<span id="L46" class="LineNr"> 46 </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="L47" class="LineNr"> 47 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L48" class="LineNr"> 48 </span> 50/push-EAX
<span id="L49" class="LineNr"> 49 </span> 51/push-ECX
<span id="L50" class="LineNr"> 50 </span> <span class="subxComment"># EAX = nbytes</span>
<span id="L51" class="LineNr"> 51 </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="L52" class="LineNr"> 52 </span> <span class="subxComment"># Let X be the value of ESP in the caller, before the call to tailor-exit-descriptor.</span>
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># The return address for a call in the caller's body will be at:</span>
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># X-8 if the caller takes 4 bytes of args for the exit-descriptor (add 4 bytes for the return address)</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># X-12 if the caller takes 8 bytes of args</span>
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># ..and so on</span>
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># That's the value we need to return: X-nbytes-4</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment">#</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># However, we also need to account for the perturbance to ESP caused by the</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxComment"># call to tailor-exit-descriptor. It pushes 8 bytes of args followed by 4</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># bytes for the return address and 4 bytes to push EBP above.</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># So EBP at this point is X-16.</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment">#</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># So the return address for the next call in the caller is:</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># EBP+8 if the caller takes 4 bytes of args</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># EBP+4 if the caller takes 8 bytes of args</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># EBP if the caller takes 12 bytes of args</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># EBP-4 if the caller takes 16 bytes of args</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># ..and so on</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># That's EBP+12-nbytes.</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># option 1: 6 + 3 bytes</span>
<span id="L72" class="LineNr"> 72 </span><span class="CommentedCode">#? 2d/subtract 3/mod/direct 0/rm32/EAX . . . . . 8/imm32 # subtract from EAX</span>
<span id="L73" class="LineNr"> 73 </span><span class="CommentedCode">#? 8d/copy-address 0/mod/indirect 4/rm32/sib 5/base/EBP 0/index/EAX . 0/r32/EAX . . # copy EBP+EAX to EAX</span>
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># option 2: 2 + 4 bytes</span>
<span id="L75" class="LineNr"> 75 </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="L76" class="LineNr"> 76 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 5/base/EBP 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBP+EAX+12 to EAX</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># copy EAX to ed-&gt;target</span>
<span id="L78" class="LineNr"> 78 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <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 *(EBP+8) to ECX</span>
<span id="L79" class="LineNr"> 79 </span> 89/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 EAX to *ECX</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># initialize ed-&gt;value</span>
<span id="L81" class="LineNr"> 81 </span> c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX <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 *(ECX+4)</span>
<span id="L82" class="LineNr"> 82 </span><span class="Constant">$tailor-exit-descriptor:end</span>:
<span id="L83" class="LineNr"> 83 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L84" class="LineNr"> 84 </span> 59/pop-to-ECX
<span id="L85" class="LineNr"> 85 </span> 58/pop-to-EAX
<span id="L86" class="LineNr"> 86 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L87" class="LineNr"> 87 </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="L88" class="LineNr"> 88 </span> 5d/pop-to-EBP
<span id="L89" class="LineNr"> 89 </span> c3/return
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="subxFunction">stop</span>: <span class="subxComment"># ed : (address exit-descriptor), value : int</span>
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># no prolog; one way or another, we're going to clobber registers</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># EAX = ed</span>
<span id="L94" class="LineNr"> 94 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+4) to EAX</span>
<span id="L95" class="LineNr"> 95 </span> <span class="subxComment"># if (ed-&gt;target == 0) really exit</span>
<span id="L96" class="LineNr"> 96 </span> 81 7/subop/compare 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *EAX</span>
<span id="L97" class="LineNr"> 97 </span> 75/jump-if-not-equal $stop:fake/disp8
<span id="L98" class="LineNr"> 98 </span> <span class="subxS1Comment"># . syscall(exit, value)</span>
<span id="L99" class="LineNr"> 99 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to EBX</span>
<span id="L100" class="LineNr">100 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L101" class="LineNr">101 </span> cd/syscall 0x80/imm8
<span id="L102" class="LineNr">102 </span><span class="Constant">$stop:fake</span>:
<span id="L103" class="LineNr">103 </span> <span class="subxComment"># otherwise:</span>
<span id="L104" class="LineNr">104 </span> <span class="subxComment"># ed-&gt;value = value+1</span>
<span id="L105" class="LineNr">105 </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="L106" class="LineNr">106 </span> 41/increment-ECX
<span id="L107" class="LineNr">107 </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="L108" class="LineNr">108 </span> <span class="subxComment"># perform a non-local jump to ed-&gt;target</span>
<span id="L109" class="LineNr">109 </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>
<span id="L110" class="LineNr">110 </span><span class="Constant">$stop:end</span>:
<span id="L111" class="LineNr">111 </span> c3/return <span class="subxComment"># doesn't return to caller</span>
<span id="L112" class="LineNr">112 </span>
<span id="L113" class="LineNr">113 </span><span class="subxTest">test-stop-skips-returns-on-exit</span>:
<span id="L114" class="LineNr">114 </span> <span class="subxComment"># This looks like the standard prolog, but is here for different reasons.</span>
<span id="L115" class="LineNr">115 </span> <span class="subxComment"># A function calling 'stop' can't rely on EBP persisting past the call.</span>
<span id="L116" class="LineNr">116 </span> <span class="subxComment">#</span>
<span id="L117" class="LineNr">117 </span> <span class="subxComment"># Use EBP here as a stable base to refer to locals and arguments from in the</span>
<span id="L118" class="LineNr">118 </span> <span class="subxComment"># presence of push/pop/call instructions.</span>
<span id="L119" class="LineNr">119 </span> <span class="subxComment"># *Don't* use EBP as a way to restore ESP.</span>
<span id="L120" class="LineNr">120 </span> 55/push-EBP
<span id="L121" class="LineNr">121 </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="L122" class="LineNr">122 </span> <span class="subxComment"># Make room for an exit descriptor on the stack. That's almost always the</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># right place for it, available only as long as it's legal to use. Once this</span>
<span id="L124" class="LineNr">124 </span> <span class="subxComment"># containing function returns we'll need a new exit descriptor.</span>
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># var ed/EAX : (address exit-descriptor)</span>
<span id="L126" class="LineNr">126 </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="L127" class="LineNr">127 </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="L128" class="LineNr">128 </span> <span class="subxComment"># Size the exit-descriptor precisely for the next call below, to _test-stop-1.</span>
<span id="L129" class="LineNr">129 </span> <span class="subxComment"># tailor-exit-descriptor(ed, 4)</span>
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L131" class="LineNr">131 </span> 68/push 4/imm32/nbytes-of-args-for-_test-stop-1
<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='059stop.subx.html#L43'>tailor-exit-descriptor</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> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L137" class="LineNr">137 </span> <span class="subxS1Comment"># . _test-stop-1(ed)</span>
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L139" class="LineNr">139 </span> 50/push-EAX
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . call</span>
<span id="L141" class="LineNr">141 </span> e8/call <a href='059stop.subx.html#L162'>_test-stop-1</a>/disp32
<span id="L142" class="LineNr">142 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L143" class="LineNr">143 </span> <span class="subxComment"># restore args</span>
<span id="L144" class="LineNr">144 </span> 58/pop-to-EAX
<span id="L145" class="LineNr">145 </span> <span class="subxComment"># check that _test-stop-1 tried to call exit(1)</span>
<span id="L146" class="LineNr">146 </span> <span class="subxComment"># check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L148" class="LineNr">148 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L149" class="LineNr">149 </span> 68/push 2/imm32
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L151" class="LineNr">151 </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="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . call</span>
<span id="L153" class="LineNr">153 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L155" class="LineNr">155 </span> 81 0/subop/add 3/mod/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="L156" class="LineNr">156 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L157" class="LineNr">157 </span> <span class="subxComment"># don't restore ESP from EBP; manually reclaim locals</span>
<span id="L158" class="LineNr">158 </span> 81 0/subop/add 3/mod/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="L159" class="LineNr">159 </span> 5d/pop-to-EBP
<span id="L160" class="LineNr">160 </span> c3/return
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="subxMinorFunction">_test-stop-1</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L164" class="LineNr">164 </span> 55/push-EBP
<span id="L165" class="LineNr">165 </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="L166" class="LineNr">166 </span> <span class="subxComment"># _test-stop-2(ed)</span>
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . push args</span>
<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> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . call</span>
<span id="L170" class="LineNr">170 </span> e8/call <a href='059stop.subx.html#L189'>_test-stop-2</a>/disp32
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># should never get past this point</span>
<span id="L172" class="LineNr">172 </span><span class="Constant">$_test-stop-1:dead-end</span>:
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L174" class="LineNr">174 </span> 81 0/subop/add 3/mod/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="L175" class="LineNr">175 </span> <span class="subxComment"># signal test failed: check-ints-equal(1, 0, msg)</span>
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L177" class="LineNr">177 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L178" class="LineNr">178 </span> 68/push 0/imm32
<span id="L179" class="LineNr">179 </span> 68/push 1/imm32
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . call</span>
<span id="L181" class="LineNr">181 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L183" class="LineNr">183 </span> 81 0/subop/add 3/mod/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="L184" class="LineNr">184 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L185" class="LineNr">185 </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="L186" class="LineNr">186 </span> 5d/pop-to-EBP
<span id="L187" class="LineNr">187 </span> c3/return
<span id="L188" class="LineNr">188 </span>
<span id="L189" class="LineNr">189 </span><span class="subxMinorFunction">_test-stop-2</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L190" class="LineNr">190 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L191" class="LineNr">191 </span> 55/push-EBP
<span id="L192" class="LineNr">192 </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="L193" class="LineNr">193 </span> <span class="subxS1Comment"># . stop(ed, 1)</span>
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L195" class="LineNr">195 </span> 68/push 1/imm32
<span id="L196" class="LineNr">196 </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="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . call</span>
<span id="L198" class="LineNr">198 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># should never get past this point</span>
<span id="L200" class="LineNr">200 </span><span class="Constant">$_test-stop-2:dead-end</span>:
<span id="L201" class="LineNr">201 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L202" class="LineNr">202 </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="L203" class="LineNr">203 </span> 5d/pop-to-EBP
<span id="L204" class="LineNr">204 </span> c3/return
<span id="L205" class="LineNr">205 </span>
<span id="L206" class="LineNr">206 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L42" class="LineNr"> 42 </span><span class="subxComment"># Ugly that we need to know the size of args. Don't allocate variables between</span>
<span id="L43" class="LineNr"> 43 </span><span class="subxComment"># tailor-exit-descriptor and the call it's for.</span>
<span id="L44" class="LineNr"> 44 </span><span class="subxFunction">tailor-exit-descriptor</span>: <span class="subxComment"># ed : (address exit-descriptor), nbytes : int -&gt; &lt;void&gt;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L46" class="LineNr"> 46 </span> 55/push-EBP
<span id="L47" class="LineNr"> 47 </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="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L49" class="LineNr"> 49 </span> 50/push-EAX
<span id="L50" class="LineNr"> 50 </span> 51/push-ECX
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># EAX = nbytes</span>
<span id="L52" class="LineNr"> 52 </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="L53" class="LineNr"> 53 </span> <span class="subxComment"># Let X be the value of ESP in the caller, before the call to tailor-exit-descriptor.</span>
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># The return address for a call in the caller's body will be at:</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># X-8 if the caller takes 4 bytes of args for the exit-descriptor (add 4 bytes for the return address)</span>
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># X-12 if the caller takes 8 bytes of args</span>
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># ..and so on</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># That's the value we need to return: X-nbytes-4</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment">#</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxComment"># However, we also need to account for the perturbance to ESP caused by the</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># call to tailor-exit-descriptor. It pushes 8 bytes of args followed by 4</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># bytes for the return address and 4 bytes to push EBP above.</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment"># So EBP at this point is X-16.</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment">#</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># So the return address for the next call in the caller is:</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># EBP+8 if the caller takes 4 bytes of args</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># EBP+4 if the caller takes 8 bytes of args</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># EBP if the caller takes 12 bytes of args</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># EBP-4 if the caller takes 16 bytes of args</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># ..and so on</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># That's EBP+12-nbytes.</span>
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># option 1: 6 + 3 bytes</span>
<span id="L73" class="LineNr"> 73 </span><span class="CommentedCode">#? 2d/subtract 3/mod/direct 0/rm32/EAX . . . . . 8/imm32 # subtract from EAX</span>
<span id="L74" class="LineNr"> 74 </span><span class="CommentedCode">#? 8d/copy-address 0/mod/indirect 4/rm32/sib 5/base/EBP 0/index/EAX . 0/r32/EAX . . # copy EBP+EAX to EAX</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># option 2: 2 + 4 bytes</span>
<span id="L76" class="LineNr"> 76 </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="L77" class="LineNr"> 77 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 5/base/EBP 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBP+EAX+12 to EAX</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># copy EAX to ed-&gt;target</span>
<span id="L79" class="LineNr"> 79 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <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 *(EBP+8) to ECX</span>
<span id="L80" class="LineNr"> 80 </span> 89/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 EAX to *ECX</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># initialize ed-&gt;value</span>
<span id="L82" class="LineNr"> 82 </span> c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX <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 *(ECX+4)</span>
<span id="L83" class="LineNr"> 83 </span><span class="Constant">$tailor-exit-descriptor:end</span>:
<span id="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L85" class="LineNr"> 85 </span> 59/pop-to-ECX
<span id="L86" class="LineNr"> 86 </span> 58/pop-to-EAX
<span id="L87" class="LineNr"> 87 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L88" class="LineNr"> 88 </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="L89" class="LineNr"> 89 </span> 5d/pop-to-EBP
<span id="L90" class="LineNr"> 90 </span> c3/return
<span id="L91" class="LineNr"> 91 </span>
<span id="L92" class="LineNr"> 92 </span><span class="subxFunction">stop</span>: <span class="subxComment"># ed : (address exit-descriptor), value : int</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># no prolog; one way or another, we're going to clobber registers</span>
<span id="L94" class="LineNr"> 94 </span> <span class="subxComment"># EAX = ed</span>
<span id="L95" class="LineNr"> 95 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+4) to EAX</span>
<span id="L96" class="LineNr"> 96 </span> <span class="subxComment"># if (ed-&gt;target == 0) really exit</span>
<span id="L97" class="LineNr"> 97 </span> 81 7/subop/compare 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *EAX</span>
<span id="L98" class="LineNr"> 98 </span> 75/jump-if-not-equal $stop:fake/disp8
<span id="L99" class="LineNr"> 99 </span> <span class="subxS1Comment"># . syscall(exit, value)</span>
<span id="L100" class="LineNr">100 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to EBX</span>
<span id="L101" class="LineNr">101 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L102" class="LineNr">102 </span> cd/syscall 0x80/imm8
<span id="L103" class="LineNr">103 </span><span class="Constant">$stop:fake</span>:
<span id="L104" class="LineNr">104 </span> <span class="subxComment"># otherwise:</span>
<span id="L105" class="LineNr">105 </span> <span class="subxComment"># ed-&gt;value = value+1</span>
<span id="L106" class="LineNr">106 </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="L107" class="LineNr">107 </span> 41/increment-ECX
<span id="L108" class="LineNr">108 </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="L109" class="LineNr">109 </span> <span class="subxComment"># perform a non-local jump to ed-&gt;target</span>
<span id="L110" class="LineNr">110 </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>
<span id="L111" class="LineNr">111 </span><span class="Constant">$stop:end</span>:
<span id="L112" class="LineNr">112 </span> c3/return <span class="subxComment"># doesn't return to caller</span>
<span id="L113" class="LineNr">113 </span>
<span id="L114" class="LineNr">114 </span><span class="subxTest">test-stop-skips-returns-on-exit</span>:
<span id="L115" class="LineNr">115 </span> <span class="subxComment"># This looks like the standard prolog, but is here for different reasons.</span>
<span id="L116" class="LineNr">116 </span> <span class="subxComment"># A function calling 'stop' can't rely on EBP persisting past the call.</span>
<span id="L117" class="LineNr">117 </span> <span class="subxComment">#</span>
<span id="L118" class="LineNr">118 </span> <span class="subxComment"># Use EBP here as a stable base to refer to locals and arguments from in the</span>
<span id="L119" class="LineNr">119 </span> <span class="subxComment"># presence of push/pop/call instructions.</span>
<span id="L120" class="LineNr">120 </span> <span class="subxComment"># *Don't* use EBP as a way to restore ESP.</span>
<span id="L121" class="LineNr">121 </span> 55/push-EBP
<span id="L122" class="LineNr">122 </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="L123" class="LineNr">123 </span> <span class="subxComment"># Make room for an exit descriptor on the stack. That's almost always the</span>
<span id="L124" class="LineNr">124 </span> <span class="subxComment"># right place for it, available only as long as it's legal to use. Once this</span>
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># containing function returns we'll need a new exit descriptor.</span>
<span id="L126" class="LineNr">126 </span> <span class="subxComment"># var ed/EAX : (address exit-descriptor)</span>
<span id="L127" class="LineNr">127 </span> 68/push 0/imm32
<span id="L128" class="LineNr">128 </span> 68/push 0/imm32
<span id="L129" class="LineNr">129 </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="L130" class="LineNr">130 </span> <span class="subxComment"># Size the exit-descriptor precisely for the next call below, to _test-stop-1.</span>
<span id="L131" class="LineNr">131 </span> <span class="subxComment"># tailor-exit-descriptor(ed, 4)</span>
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L133" class="LineNr">133 </span> 68/push 4/imm32/nbytes-of-args-for-_test-stop-1
<span id="L134" class="LineNr">134 </span> 50/push-EAX
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . call</span>
<span id="L136" class="LineNr">136 </span> e8/call <a href='059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L138" class="LineNr">138 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L139" class="LineNr">139 </span> <span class="subxS1Comment"># . _test-stop-1(ed)</span>
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L141" class="LineNr">141 </span> 50/push-EAX
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . call</span>
<span id="L143" class="LineNr">143 </span> e8/call <a href='059stop.subx.html#L164'>_test-stop-1</a>/disp32
<span id="L144" class="LineNr">144 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L145" class="LineNr">145 </span> <span class="subxComment"># restore args</span>
<span id="L146" class="LineNr">146 </span> 58/pop-to-EAX
<span id="L147" class="LineNr">147 </span> <span class="subxComment"># check that _test-stop-1 tried to call exit(1)</span>
<span id="L148" class="LineNr">148 </span> <span class="subxS1Comment"># . check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L149" class="LineNr">149 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L150" class="LineNr">150 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L151" class="LineNr">151 </span> 68/push 2/imm32
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L153" class="LineNr">153 </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="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . call</span>
<span id="L155" class="LineNr">155 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L157" class="LineNr">157 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L159" class="LineNr">159 </span> <span class="subxComment"># don't restore ESP from EBP; manually reclaim locals</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> 5d/pop-to-EBP
<span id="L162" class="LineNr">162 </span> c3/return
<span id="L163" class="LineNr">163 </span>
<span id="L164" class="LineNr">164 </span><span class="subxMinorFunction">_test-stop-1</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L166" class="LineNr">166 </span> 55/push-EBP
<span id="L167" class="LineNr">167 </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="L168" class="LineNr">168 </span> <span class="subxComment"># _test-stop-2(ed)</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L170" class="LineNr">170 </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="L171" class="LineNr">171 </span> <span class="subxS2Comment"># . . call</span>
<span id="L172" class="LineNr">172 </span> e8/call <a href='059stop.subx.html#L191'>_test-stop-2</a>/disp32
<span id="L173" class="LineNr">173 </span> <span class="subxComment"># should never get past this point</span>
<span id="L174" class="LineNr">174 </span><span class="Constant">$_test-stop-1:dead-end</span>:
<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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L177" class="LineNr">177 </span> <span class="subxComment"># signal test failed: check-ints-equal(1, 0, msg)</span>
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L179" class="LineNr">179 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L180" class="LineNr">180 </span> 68/push 0/imm32
<span id="L181" class="LineNr">181 </span> 68/push 1/imm32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . call</span>
<span id="L183" class="LineNr">183 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L186" class="LineNr">186 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L187" class="LineNr">187 </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="L188" class="LineNr">188 </span> 5d/pop-to-EBP
<span id="L189" class="LineNr">189 </span> c3/return
<span id="L190" class="LineNr">190 </span>
<span id="L191" class="LineNr">191 </span><span class="subxMinorFunction">_test-stop-2</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L192" class="LineNr">192 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L193" class="LineNr">193 </span> 55/push-EBP
<span id="L194" class="LineNr">194 </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="L195" class="LineNr">195 </span> <span class="subxS1Comment"># . stop(ed, 1)</span>
<span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L197" class="LineNr">197 </span> 68/push 1/imm32
<span id="L198" class="LineNr">198 </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="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . call</span>
<span id="L200" class="LineNr">200 </span> e8/call <a href='059stop.subx.html#L92'>stop</a>/disp32
<span id="L201" class="LineNr">201 </span> <span class="subxComment"># should never get past this point</span>
<span id="L202" class="LineNr">202 </span><span class="Constant">$_test-stop-2:dead-end</span>:
<span id="L203" class="LineNr">203 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L204" class="LineNr">204 </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="L205" class="LineNr">205 </span> 5d/pop-to-EBP
<span id="L206" class="LineNr">206 </span> c3/return
<span id="L207" class="LineNr">207 </span>
<span id="L208" class="LineNr">208 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -14,16 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

View File

@ -14,17 +14,17 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.Constant { color: #008787; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.subxTest { color: #5f8700; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -352,7 +352,45 @@ if ('onhashchange' in window) {
<span id="L290" class="LineNr">290 </span> <span class="subxComment"># data</span>
<span id="L291" class="LineNr">291 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L292" class="LineNr">292 </span>
<span id="L293" class="LineNr">293 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L293" class="LineNr">293 </span><span class="subxMinorFunction">_test-input-stream</span>:
<span id="L294" class="LineNr">294 </span> <span class="subxComment"># current write index</span>
<span id="L295" class="LineNr">295 </span> 0/imm32
<span id="L296" class="LineNr">296 </span> <span class="subxComment"># current read index</span>
<span id="L297" class="LineNr">297 </span> 0/imm32
<span id="L298" class="LineNr">298 </span> <span class="subxComment"># length</span>
<span id="L299" class="LineNr">299 </span> 0x100/imm32 <span class="subxComment"># 256 bytes</span>
<span id="L300" class="LineNr">300 </span> <span class="subxComment"># data (16 lines x 16 bytes/line)</span>
<span id="L301" class="LineNr">301 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L302" class="LineNr">302 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L303" class="LineNr">303 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L304" class="LineNr">304 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L305" class="LineNr">305 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L306" class="LineNr">306 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L307" class="LineNr">307 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L308" class="LineNr">308 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L309" class="LineNr">309 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L310" class="LineNr">310 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L311" class="LineNr">311 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L312" class="LineNr">312 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L313" class="LineNr">313 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L314" class="LineNr">314 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L315" class="LineNr">315 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L316" class="LineNr">316 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L317" class="LineNr">317 </span>
<span id="L318" class="LineNr">318 </span><span class="subxComment"># a test buffered file for _test-input-stream</span>
<span id="L319" class="LineNr">319 </span><span class="subxMinorFunction">_test-input-buffered-file</span>:
<span id="L320" class="LineNr">320 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L321" class="LineNr">321 </span> <a href='061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L322" class="LineNr">322 </span> <span class="subxComment"># current write index</span>
<span id="L323" class="LineNr">323 </span> 0/imm32
<span id="L324" class="LineNr">324 </span> <span class="subxComment"># current read index</span>
<span id="L325" class="LineNr">325 </span> 0/imm32
<span id="L326" class="LineNr">326 </span> <span class="subxComment"># length</span>
<span id="L327" class="LineNr">327 </span> 6/imm32
<span id="L328" class="LineNr">328 </span> <span class="subxComment"># data</span>
<span id="L329" class="LineNr">329 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -14,16 +14,16 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -98,7 +98,7 @@ if ('onhashchange' in window) {
<span id="L39" class="LineNr">39 </span> 68/push 1/imm32
<span id="L40" class="LineNr">40 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L41" class="LineNr">41 </span> <span class="subxS2Comment"># . . call</span>
<span id="L42" class="LineNr">42 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L42" class="LineNr">42 </span> e8/call <a href='059stop.subx.html#L92'>stop</a>/disp32
<span id="L43" class="LineNr">43 </span> <span class="subxComment"># should never get past this point</span>
<span id="L44" class="LineNr">44 </span><span class="Constant">$error:dead-end</span>:
<span id="L45" class="LineNr">45 </span> <span class="subxS1Comment"># . epilog</span>

View File

@ -14,16 +14,17 @@ 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; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxS1Comment { color: #0000af; }
.Constant { color: #008787; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxS2Comment { color: #8a8a8a; }
.subxTest { color: #5f8700; }
-->
</style>
@ -346,7 +347,93 @@ if ('onhashchange' in window) {
<span id="L285" class="LineNr">285 </span> <span class="subxS1Comment"># . end</span>
<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="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L288" class="LineNr">288 </span>== data
<span id="L289" class="LineNr">289 </span>
<span id="L290" class="LineNr">290 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L291" class="LineNr">291 </span> <span class="subxComment"># current write index</span>
<span id="L292" class="LineNr">292 </span> 0/imm32
<span id="L293" class="LineNr">293 </span> <span class="subxComment"># current read index</span>
<span id="L294" class="LineNr">294 </span> 0/imm32
<span id="L295" class="LineNr">295 </span> <span class="subxComment"># length</span>
<span id="L296" class="LineNr">296 </span> 0x200/imm32 <span class="subxComment"># 512 bytes</span>
<span id="L297" class="LineNr">297 </span> <span class="subxComment"># data (32 lines x 16 bytes/line)</span>
<span id="L298" class="LineNr">298 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L299" class="LineNr">299 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L300" class="LineNr">300 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L301" class="LineNr">301 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L302" class="LineNr">302 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L303" class="LineNr">303 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L304" class="LineNr">304 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L305" class="LineNr">305 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L306" class="LineNr">306 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L307" class="LineNr">307 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L308" class="LineNr">308 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L309" class="LineNr">309 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L310" class="LineNr">310 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L311" class="LineNr">311 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L312" class="LineNr">312 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L313" class="LineNr">313 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L314" class="LineNr">314 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L315" class="LineNr">315 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L316" class="LineNr">316 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L317" class="LineNr">317 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L318" class="LineNr">318 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L319" class="LineNr">319 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L320" class="LineNr">320 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L321" class="LineNr">321 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L322" class="LineNr">322 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L323" class="LineNr">323 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L324" class="LineNr">324 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L325" class="LineNr">325 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L326" class="LineNr">326 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L327" class="LineNr">327 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L328" class="LineNr">328 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L329" class="LineNr">329 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="subxComment"># a test buffered file for _test-output-stream</span>
<span id="L332" class="LineNr">332 </span><span class="subxMinorFunction">_test-output-buffered-file</span>:
<span id="L333" class="LineNr">333 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L334" class="LineNr">334 </span> <a href='064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L335" class="LineNr">335 </span> <span class="subxComment"># current write index</span>
<span id="L336" class="LineNr">336 </span> 0/imm32
<span id="L337" class="LineNr">337 </span> <span class="subxComment"># current read index</span>
<span id="L338" class="LineNr">338 </span> 0/imm32
<span id="L339" class="LineNr">339 </span> <span class="subxComment"># length</span>
<span id="L340" class="LineNr">340 </span> 6/imm32
<span id="L341" class="LineNr">341 </span> <span class="subxComment"># data</span>
<span id="L342" class="LineNr">342 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L343" class="LineNr">343 </span>
<span id="L344" class="LineNr">344 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L345" class="LineNr">345 </span> <span class="subxComment"># current write index</span>
<span id="L346" class="LineNr">346 </span> 0/imm32
<span id="L347" class="LineNr">347 </span> <span class="subxComment"># current read index</span>
<span id="L348" class="LineNr">348 </span> 0/imm32
<span id="L349" class="LineNr">349 </span> <span class="subxComment"># line</span>
<span id="L350" class="LineNr">350 </span> 0x80/imm32 <span class="subxComment"># 128 bytes</span>
<span id="L351" class="LineNr">351 </span> <span class="subxComment"># data (8 lines x 16 bytes/line)</span>
<span id="L352" class="LineNr">352 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L353" class="LineNr">353 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L354" class="LineNr">354 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L355" class="LineNr">355 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L356" class="LineNr">356 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L357" class="LineNr">357 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L358" class="LineNr">358 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L359" class="LineNr">359 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L360" class="LineNr">360 </span>
<span id="L361" class="LineNr">361 </span><span class="subxComment"># a test buffered file for _test-error-stream</span>
<span id="L362" class="LineNr">362 </span><span class="subxMinorFunction">_test-error-buffered-file</span>:
<span id="L363" class="LineNr">363 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L364" class="LineNr">364 </span> <a href='064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L365" class="LineNr">365 </span> <span class="subxComment"># current write index</span>
<span id="L366" class="LineNr">366 </span> 0/imm32
<span id="L367" class="LineNr">367 </span> <span class="subxComment"># current read index</span>
<span id="L368" class="LineNr">368 </span> 0/imm32
<span id="L369" class="LineNr">369 </span> <span class="subxComment"># length</span>
<span id="L370" class="LineNr">370 </span> 6/imm32
<span id="L371" class="LineNr">371 </span> <span class="subxComment"># data</span>
<span id="L372" class="LineNr">372 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L373" class="LineNr">373 </span>
<span id="L374" class="LineNr">374 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -14,16 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,16 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Folded { color: #080808; background-color: #949494; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.Folded { color: #080808; background-color: #949494; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxTest { color: #5f8700; }
-->
</style>
@ -681,10 +681,10 @@ if ('onhashchange' in window) {
<span id="L621" class="LineNr">621 </span> e8/call <a href='067parse-hex.subx.html#L354'>parse-hex-int</a>/disp32
<span id="L622" class="LineNr">622 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L623" class="LineNr">623 </span> 81 0/subop/add 3/mod/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="L624" class="LineNr">624 </span> <span class="subxComment"># check-ints-equal(EAX, 0xfffffffd, msg)</span>
<span id="L624" class="LineNr">624 </span> <span class="subxComment"># check-ints-equal(EAX, -3, msg)</span>
<span id="L625" class="LineNr">625 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L626" class="LineNr">626 </span> 68/push <span class="Constant">&quot;F - test-parse-hex-int-negative&quot;</span>/imm32
<span id="L627" class="LineNr">627 </span> 68/push 0xfffffffd/imm32
<span id="L627" class="LineNr">627 </span> 68/push -3/imm32
<span id="L628" class="LineNr">628 </span> 50/push-EAX
<span id="L629" class="LineNr">629 </span> <span class="subxS2Comment"># . . call</span>
<span id="L630" class="LineNr">630 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32

View File

@ -14,15 +14,15 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -140,7 +140,7 @@ if ('onhashchange' in window) {
<span id="L80" class="LineNr">80 </span> 68/push 1/imm32
<span id="L81" class="LineNr">81 </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="L82" class="LineNr">82 </span> <span class="subxS2Comment"># . . call</span>
<span id="L83" class="LineNr">83 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L83" class="LineNr">83 </span> e8/call <a href='059stop.subx.html#L92'>stop</a>/disp32
<span id="L84" class="LineNr">84 </span> <span class="subxComment"># should never get past this point</span>
<span id="L85" class="LineNr">85 </span><span class="Constant">$error-byte:dead-end</span>:
<span id="L86" class="LineNr">86 </span> <span class="subxS1Comment"># . epilog</span>

View File

@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,15 +14,15 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,14 +14,14 @@ 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; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.Folded { color: #080808; background-color: #949494; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->

File diff suppressed because it is too large Load Diff

View File

@ -14,16 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.Folded { color: #080808; background-color: #949494; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,16 +14,16 @@ 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; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxTest { color: #5f8700; }
-->
</style>
@ -363,7 +363,7 @@ if ('onhashchange' in window) {
<span id="L302" class="LineNr">302 </span> 52/push-EDX
<span id="L303" class="LineNr">303 </span> 51/push-ECX
<span id="L304" class="LineNr">304 </span> <span class="subxS2Comment"># . . call</span>
<span id="L305" class="LineNr">305 </span> e8/call <a href='073next-token.subx.html#L677'>skip-chars-matching-in-slice</a>/disp32
<span id="L305" class="LineNr">305 </span> e8/call <a href='073next-token.subx.html#L804'>skip-chars-matching-in-slice</a>/disp32
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L307" class="LineNr">307 </span> 81 0/subop/add 3/mod/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="L308" class="LineNr">308 </span> <span class="subxS1Comment"># . ECX = EAX</span>
@ -378,7 +378,7 @@ if ('onhashchange' in window) {
<span id="L317" class="LineNr">317 </span> 52/push-EDX
<span id="L318" class="LineNr">318 </span> 51/push-ECX
<span id="L319" class="LineNr">319 </span> <span class="subxS2Comment"># . . call</span>
<span id="L320" class="LineNr">320 </span> e8/call <a href='073next-token.subx.html#L773'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L320" class="LineNr">320 </span> e8/call <a href='073next-token.subx.html#L972'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L321" class="LineNr">321 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L322" class="LineNr">322 </span> 81 0/subop/add 3/mod/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="L323" class="LineNr">323 </span> <span class="subxS1Comment"># . ECX = EAX</span>
@ -424,7 +424,7 @@ if ('onhashchange' in window) {
<span id="L363" class="LineNr">363 </span> 52/push-EDX
<span id="L364" class="LineNr">364 </span> ff 6/subop/push 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ECX</span>
<span id="L365" class="LineNr">365 </span> <span class="subxS2Comment"># . . call</span>
<span id="L366" class="LineNr">366 </span> e8/call <a href='073next-token.subx.html#L677'>skip-chars-matching-in-slice</a>/disp32
<span id="L366" class="LineNr">366 </span> e8/call <a href='073next-token.subx.html#L804'>skip-chars-matching-in-slice</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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L369" class="LineNr">369 </span> <span class="subxS1Comment"># . slice-&gt;start = EAX</span>
@ -439,7 +439,7 @@ if ('onhashchange' in window) {
<span id="L378" class="LineNr">378 </span> 52/push-EDX
<span id="L379" class="LineNr">379 </span> 50/push-EAX
<span id="L380" class="LineNr">380 </span> <span class="subxS2Comment"># . . call</span>
<span id="L381" class="LineNr">381 </span> e8/call <a href='073next-token.subx.html#L773'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L381" class="LineNr">381 </span> e8/call <a href='073next-token.subx.html#L972'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L382" class="LineNr">382 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L383" class="LineNr">383 </span> 81 0/subop/add 3/mod/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="L384" class="LineNr">384 </span> <span class="subxS1Comment"># . slice-&gt;end = EAX</span>

View File

@ -14,12 +14,12 @@ 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; }
.subxS2Comment { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

1761
html/078table.subx.html Normal file

File diff suppressed because it is too large Load Diff

View File

@ -14,17 +14,17 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -207,14 +207,14 @@ if ('onhashchange' in window) {
<span id="L161" class="LineNr">161 </span> <span class="subxComment"># setup</span>
<span id="L162" class="LineNr">162 </span> <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L164" class="LineNr">164 </span> 68/push _test-input-stream/imm32
<span id="L164" class="LineNr">164 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-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='../055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS1Comment"># . clear-stream(_test-input-buffered-file+4)</span>
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L171" class="LineNr">171 </span> b8/copy-to-EAX _test-input-buffered-file/imm32
<span id="L171" class="LineNr">171 </span> b8/copy-to-EAX <a href='../061read-byte.subx.html#L319'>_test-input-buffered-file</a>/imm32
<span id="L172" class="LineNr">172 </span> 05/add-to-EAX 4/imm32
<span id="L173" class="LineNr">173 </span> 50/push-EAX
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . call</span>
@ -223,14 +223,14 @@ if ('onhashchange' in window) {
<span id="L177" class="LineNr">177 </span> 81 0/subop/add 3/mod/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="L178" class="LineNr">178 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L179" class="LineNr">179 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L180" class="LineNr">180 </span> 68/push _test-output-stream/imm32
<span id="L180" class="LineNr">180 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L181" class="LineNr">181 </span> <span class="subxS2Comment"># . . call</span>
<span id="L182" class="LineNr">182 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L184" class="LineNr">184 </span> 81 0/subop/add 3/mod/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="L185" class="LineNr">185 </span> <span class="subxS1Comment"># . clear-stream(_test-output-buffered-file+4)</span>
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L187" class="LineNr">187 </span> b8/copy-to-EAX _test-output-buffered-file/imm32
<span id="L187" class="LineNr">187 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L332'>_test-output-buffered-file</a>/imm32
<span id="L188" class="LineNr">188 </span> 05/add-to-EAX 4/imm32
<span id="L189" class="LineNr">189 </span> 50/push-EAX
<span id="L190" class="LineNr">190 </span> <span class="subxS2Comment"># . . call</span>
@ -255,7 +255,7 @@ if ('onhashchange' in window) {
<span id="L209" class="LineNr">209 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;# comment 1\n&quot;)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </span> 68/push <span class="Constant">&quot;# comment 1\n&quot;</span>/imm32
<span id="L212" class="LineNr">212 </span> 68/push _test-input-stream/imm32
<span id="L212" class="LineNr">212 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-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='../057write.subx.html#L24'>write</a>/disp32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . discard args</span>
@ -263,7 +263,7 @@ if ('onhashchange' in window) {
<span id="L217" class="LineNr">217 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot; # comment 2 indented\n&quot;)</span>
<span id="L218" class="LineNr">218 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L219" class="LineNr">219 </span> 68/push <span class="Constant">&quot; # comment 2 indented\n&quot;</span>/imm32
<span id="L220" class="LineNr">220 </span> 68/push _test-input-stream/imm32
<span id="L220" class="LineNr">220 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L221" class="LineNr">221 </span> <span class="subxS2Comment"># . . call</span>
<span id="L222" class="LineNr">222 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L223" class="LineNr">223 </span> <span class="subxS2Comment"># . . discard args</span>
@ -271,7 +271,7 @@ if ('onhashchange' in window) {
<span id="L225" class="LineNr">225 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x09000000\n&quot;)</span>
<span id="L226" class="LineNr">226 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L227" class="LineNr">227 </span> 68/push <span class="Constant">&quot;== code 0x09000000\n&quot;</span>/imm32
<span id="L228" class="LineNr">228 </span> 68/push _test-input-stream/imm32
<span id="L228" class="LineNr">228 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L229" class="LineNr">229 </span> <span class="subxS2Comment"># . . call</span>
<span id="L230" class="LineNr">230 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L231" class="LineNr">231 </span> <span class="subxS2Comment"># . . discard args</span>
@ -279,7 +279,7 @@ if ('onhashchange' in window) {
<span id="L233" class="LineNr">233 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;# comment 3 inside a segment\n&quot;)</span>
<span id="L234" class="LineNr">234 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L235" class="LineNr">235 </span> 68/push <span class="Constant">&quot;# comment 3 inside a segment\n&quot;</span>/imm32
<span id="L236" class="LineNr">236 </span> 68/push _test-input-stream/imm32
<span id="L236" class="LineNr">236 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L237" class="LineNr">237 </span> <span class="subxS2Comment"># . . call</span>
<span id="L238" class="LineNr">238 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L239" class="LineNr">239 </span> <span class="subxS2Comment"># . . discard args</span>
@ -287,7 +287,7 @@ if ('onhashchange' in window) {
<span id="L241" class="LineNr">241 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;1\n&quot;)</span>
<span id="L242" class="LineNr">242 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L243" class="LineNr">243 </span> 68/push <span class="Constant">&quot;1\n&quot;</span>/imm32
<span id="L244" class="LineNr">244 </span> 68/push _test-input-stream/imm32
<span id="L244" class="LineNr">244 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-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='../057write.subx.html#L24'>write</a>/disp32
<span id="L247" class="LineNr">247 </span> <span class="subxS2Comment"># . . discard args</span>
@ -295,7 +295,7 @@ if ('onhashchange' in window) {
<span id="L249" class="LineNr">249 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;\n&quot;) # empty line</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;\n&quot;</span>/imm32
<span id="L252" class="LineNr">252 </span> 68/push _test-input-stream/imm32
<span id="L252" class="LineNr">252 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L253" class="LineNr">253 </span> <span class="subxS2Comment"># . . call</span>
<span id="L254" class="LineNr">254 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L255" class="LineNr">255 </span> <span class="subxS2Comment"># . . discard args</span>
@ -303,7 +303,7 @@ if ('onhashchange' in window) {
<span id="L257" class="LineNr">257 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;2 3 # comment 4 inline with other contents\n&quot;)</span>
<span id="L258" class="LineNr">258 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L259" class="LineNr">259 </span> 68/push <span class="Constant">&quot;2 3 # comment 4 inline with other contents\n&quot;</span>/imm32
<span id="L260" class="LineNr">260 </span> 68/push _test-input-stream/imm32
<span id="L260" class="LineNr">260 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-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='../057write.subx.html#L24'>write</a>/disp32
<span id="L263" class="LineNr">263 </span> <span class="subxS2Comment"># . . discard args</span>
@ -311,7 +311,7 @@ if ('onhashchange' in window) {
<span id="L265" class="LineNr">265 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;== data 0x0a000000\n&quot;)</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;== data 0x0a000000\n&quot;</span>/imm32
<span id="L268" class="LineNr">268 </span> 68/push _test-input-stream/imm32
<span id="L268" class="LineNr">268 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-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='../057write.subx.html#L24'>write</a>/disp32
<span id="L271" class="LineNr">271 </span> <span class="subxS2Comment"># . . discard args</span>
@ -319,7 +319,7 @@ if ('onhashchange' in window) {
<span id="L273" class="LineNr">273 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;4 5/imm32\n&quot;)</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;4 5/imm32\n&quot;</span>/imm32
<span id="L276" class="LineNr">276 </span> 68/push _test-input-stream/imm32
<span id="L276" class="LineNr">276 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L277" class="LineNr">277 </span> <span class="subxS2Comment"># . . call</span>
<span id="L278" class="LineNr">278 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L279" class="LineNr">279 </span> <span class="subxS2Comment"># . . discard args</span>
@ -327,7 +327,7 @@ if ('onhashchange' in window) {
<span id="L281" class="LineNr">281 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code\n&quot;)</span>
<span id="L282" class="LineNr">282 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L283" class="LineNr">283 </span> 68/push <span class="Constant">&quot;== code\n&quot;</span>/imm32
<span id="L284" class="LineNr">284 </span> 68/push _test-input-stream/imm32
<span id="L284" class="LineNr">284 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L285" class="LineNr">285 </span> <span class="subxS2Comment"># . . call</span>
<span id="L286" class="LineNr">286 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L287" class="LineNr">287 </span> <span class="subxS2Comment"># . . discard args</span>
@ -335,7 +335,7 @@ if ('onhashchange' in window) {
<span id="L289" class="LineNr">289 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;6 7\n&quot;)</span>
<span id="L290" class="LineNr">290 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L291" class="LineNr">291 </span> 68/push <span class="Constant">&quot;6 7\n&quot;</span>/imm32
<span id="L292" class="LineNr">292 </span> 68/push _test-input-stream/imm32
<span id="L292" class="LineNr">292 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L293" class="LineNr">293 </span> <span class="subxS2Comment"># . . call</span>
<span id="L294" class="LineNr">294 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L295" class="LineNr">295 </span> <span class="subxS2Comment"># . . discard args</span>
@ -343,7 +343,7 @@ if ('onhashchange' in window) {
<span id="L297" class="LineNr">297 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;8 9\n&quot;)</span>
<span id="L298" class="LineNr">298 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L299" class="LineNr">299 </span> 68/push <span class="Constant">&quot;8 9\n&quot;</span>/imm32
<span id="L300" class="LineNr">300 </span> 68/push _test-input-stream/imm32
<span id="L300" class="LineNr">300 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L301" class="LineNr">301 </span> <span class="subxS2Comment"># . . call</span>
<span id="L302" class="LineNr">302 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L303" class="LineNr">303 </span> <span class="subxS2Comment"># . . discard args</span>
@ -351,7 +351,7 @@ if ('onhashchange' in window) {
<span id="L305" class="LineNr">305 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code\n&quot;)</span>
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L307" class="LineNr">307 </span> 68/push <span class="Constant">&quot;== code\n&quot;</span>/imm32
<span id="L308" class="LineNr">308 </span> 68/push _test-input-stream/imm32
<span id="L308" class="LineNr">308 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L309" class="LineNr">309 </span> <span class="subxS2Comment"># . . call</span>
<span id="L310" class="LineNr">310 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L311" class="LineNr">311 </span> <span class="subxS2Comment"># . . discard args</span>
@ -359,22 +359,22 @@ if ('onhashchange' in window) {
<span id="L313" class="LineNr">313 </span> <span class="subxS1Comment"># . write(_test-input-stream, &quot;10 11\n&quot;)</span>
<span id="L314" class="LineNr">314 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L315" class="LineNr">315 </span> 68/push <span class="Constant">&quot;10 11\n&quot;</span>/imm32
<span id="L316" class="LineNr">316 </span> 68/push _test-input-stream/imm32
<span id="L316" class="LineNr">316 </span> 68/push <a href='../061read-byte.subx.html#L293'>_test-input-stream</a>/imm32
<span id="L317" class="LineNr">317 </span> <span class="subxS2Comment"># . . call</span>
<span id="L318" class="LineNr">318 </span> e8/call <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L319" class="LineNr">319 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L320" class="LineNr">320 </span> 81 0/subop/add 3/mod/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="L321" class="LineNr">321 </span> <span class="subxComment"># convert(_test-input-buffered-file, _test-output-buffered-file)</span>
<span id="L322" class="LineNr">322 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L323" class="LineNr">323 </span> 68/push _test-output-buffered-file/imm32
<span id="L324" class="LineNr">324 </span> 68/push _test-input-buffered-file/imm32
<span id="L323" class="LineNr">323 </span> 68/push <a href='../064write-byte.subx.html#L332'>_test-output-buffered-file</a>/imm32
<span id="L324" class="LineNr">324 </span> 68/push <a href='../061read-byte.subx.html#L319'>_test-input-buffered-file</a>/imm32
<span id="L325" class="LineNr">325 </span> <span class="subxS2Comment"># . . call</span>
<span id="L326" class="LineNr">326 </span> e8/call <a href='assort.subx.html#L87'>convert</a>/disp32
<span id="L327" class="LineNr">327 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L328" class="LineNr">328 </span> 81 0/subop/add 3/mod/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="L329" class="LineNr">329 </span> <span class="subxS1Comment"># . flush(_test-output-buffered-file)</span>
<span id="L330" class="LineNr">330 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L331" class="LineNr">331 </span> 68/push _test-output-buffered-file/imm32
<span id="L331" class="LineNr">331 </span> 68/push <a href='../064write-byte.subx.html#L332'>_test-output-buffered-file</a>/imm32
<span id="L332" class="LineNr">332 </span> <span class="subxS2Comment"># . . call</span>
<span id="L333" class="LineNr">333 </span> e8/call <a href='../064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L334" class="LineNr">334 </span> <span class="subxS2Comment"># . . discard args</span>
@ -393,7 +393,7 @@ if ('onhashchange' in window) {
<span id="L379" class="LineNr">379 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L380" class="LineNr">380 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/0&quot;</span>/imm32
<span id="L381" class="LineNr">381 </span> 68/push <span class="Constant">&quot;== code 0x09000000&quot;</span>/imm32
<span id="L382" class="LineNr">382 </span> 68/push _test-output-stream/imm32
<span id="L382" class="LineNr">382 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L383" class="LineNr">383 </span> <span class="subxS2Comment"># . . call</span>
<span id="L384" class="LineNr">384 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L385" class="LineNr">385 </span> <span class="subxS2Comment"># . . discard args</span>
@ -402,7 +402,7 @@ if ('onhashchange' in window) {
<span id="L388" class="LineNr">388 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L389" class="LineNr">389 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/1&quot;</span>/imm32
<span id="L390" class="LineNr">390 </span> 68/push <span class="Constant">&quot;1&quot;</span>/imm32
<span id="L391" class="LineNr">391 </span> 68/push _test-output-stream/imm32
<span id="L391" class="LineNr">391 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L392" class="LineNr">392 </span> <span class="subxS2Comment"># . . call</span>
<span id="L393" class="LineNr">393 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L394" class="LineNr">394 </span> <span class="subxS2Comment"># . . discard args</span>
@ -411,7 +411,7 @@ if ('onhashchange' in window) {
<span id="L397" class="LineNr">397 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L398" class="LineNr">398 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/2&quot;</span>/imm32
<span id="L399" class="LineNr">399 </span> 68/push <span class="Constant">&quot;2 3 # comment 4 inline with other contents&quot;</span>/imm32
<span id="L400" class="LineNr">400 </span> 68/push _test-output-stream/imm32
<span id="L400" class="LineNr">400 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-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='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L403" class="LineNr">403 </span> <span class="subxS2Comment"># . . discard args</span>
@ -420,7 +420,7 @@ if ('onhashchange' in window) {
<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 - <a href='assort.subx.html#L157'>test-convert</a>/3&quot;</span>/imm32
<span id="L408" class="LineNr">408 </span> 68/push <span class="Constant">&quot;6 7&quot;</span>/imm32
<span id="L409" class="LineNr">409 </span> 68/push _test-output-stream/imm32
<span id="L409" class="LineNr">409 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L410" class="LineNr">410 </span> <span class="subxS2Comment"># . . call</span>
<span id="L411" class="LineNr">411 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L412" class="LineNr">412 </span> <span class="subxS2Comment"># . . discard args</span>
@ -429,7 +429,7 @@ if ('onhashchange' in window) {
<span id="L415" class="LineNr">415 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L416" class="LineNr">416 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/4&quot;</span>/imm32
<span id="L417" class="LineNr">417 </span> 68/push <span class="Constant">&quot;8 9&quot;</span>/imm32
<span id="L418" class="LineNr">418 </span> 68/push _test-output-stream/imm32
<span id="L418" class="LineNr">418 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L419" class="LineNr">419 </span> <span class="subxS2Comment"># . . call</span>
<span id="L420" class="LineNr">420 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L421" class="LineNr">421 </span> <span class="subxS2Comment"># . . discard args</span>
@ -438,7 +438,7 @@ if ('onhashchange' in window) {
<span id="L424" class="LineNr">424 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L425" class="LineNr">425 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/5&quot;</span>/imm32
<span id="L426" class="LineNr">426 </span> 68/push <span class="Constant">&quot;10 11&quot;</span>/imm32
<span id="L427" class="LineNr">427 </span> 68/push _test-output-stream/imm32
<span id="L427" class="LineNr">427 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L428" class="LineNr">428 </span> <span class="subxS2Comment"># . . call</span>
<span id="L429" class="LineNr">429 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L430" class="LineNr">430 </span> <span class="subxS2Comment"># . . discard args</span>
@ -447,7 +447,7 @@ if ('onhashchange' in window) {
<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;F - <a href='assort.subx.html#L157'>test-convert</a>/6&quot;</span>/imm32
<span id="L435" class="LineNr">435 </span> 68/push <span class="Constant">&quot;== data 0x0a000000&quot;</span>/imm32
<span id="L436" class="LineNr">436 </span> 68/push _test-output-stream/imm32
<span id="L436" class="LineNr">436 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L437" class="LineNr">437 </span> <span class="subxS2Comment"># . . call</span>
<span id="L438" class="LineNr">438 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L439" class="LineNr">439 </span> <span class="subxS2Comment"># . . discard args</span>
@ -456,7 +456,7 @@ if ('onhashchange' in window) {
<span id="L442" class="LineNr">442 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L443" class="LineNr">443 </span> 68/push <span class="Constant">&quot;F - <a href='assort.subx.html#L157'>test-convert</a>/7&quot;</span>/imm32
<span id="L444" class="LineNr">444 </span> 68/push <span class="Constant">&quot;4 5/imm32&quot;</span>/imm32
<span id="L445" class="LineNr">445 </span> 68/push _test-output-stream/imm32
<span id="L445" class="LineNr">445 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L446" class="LineNr">446 </span> <span class="subxS2Comment"># . . call</span>
<span id="L447" class="LineNr">447 </span> e8/call <a href='../058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L448" class="LineNr">448 </span> <span class="subxS2Comment"># . . discard args</span>
@ -603,7 +603,7 @@ if ('onhashchange' in window) {
<span id="L727" class="LineNr">727 </span> 52/push-EDX
<span id="L728" class="LineNr">728 </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="L729" class="LineNr">729 </span> <span class="subxS2Comment"># . . call</span>
<span id="L730" class="LineNr">730 </span> e8/call leaky-get-or-insert-slice/disp32
<span id="L730" class="LineNr">730 </span> e8/call <a href='../078table.subx.html#L654'>leaky-get-or-insert-slice</a>/disp32
<span id="L731" class="LineNr">731 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L732" class="LineNr">732 </span> 81 0/subop/add 3/mod/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="L733" class="LineNr">733 </span> <span class="subxComment"># curr-segment = *segment-slot</span>

View File

@ -14,17 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -376,14 +375,14 @@ if ('onhashchange' in window) {
<span id="L314" class="LineNr">314 </span> 81 0/subop/add 3/mod/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="L315" class="LineNr">315 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L316" class="LineNr">316 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L317" class="LineNr">317 </span> 68/push <a href='crenshaw2-1.subx.html#L562'>_test-output-stream</a>/imm32
<span id="L317" class="LineNr">317 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L318" class="LineNr">318 </span> <span class="subxS2Comment"># . . call</span>
<span id="L319" class="LineNr">319 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L320" class="LineNr">320 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L321" class="LineNr">321 </span> 81 0/subop/add 3/mod/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="L322" class="LineNr">322 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L323" class="LineNr">323 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L324" class="LineNr">324 </span> 68/push <a href='crenshaw2-1.subx.html#L572'>_test-error-stream</a>/imm32
<span id="L324" class="LineNr">324 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L325" class="LineNr">325 </span> <span class="subxS2Comment"># . . call</span>
<span id="L326" class="LineNr">326 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L327" class="LineNr">327 </span> <span class="subxS2Comment"># . . discard args</span>
@ -406,7 +405,7 @@ if ('onhashchange' in window) {
<span id="L344" class="LineNr">344 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L345" class="LineNr">345 </span> 50/push-EAX/ed
<span id="L346" class="LineNr">346 </span> <span class="subxS2Comment"># . . call</span>
<span id="L347" class="LineNr">347 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L347" class="LineNr">347 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L348" class="LineNr">348 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L349" class="LineNr">349 </span> 81 0/subop/add 3/mod/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="L350" class="LineNr">350 </span> <span class="subxComment"># prime the pump</span>
@ -420,8 +419,8 @@ if ('onhashchange' in window) {
<span id="L358" class="LineNr">358 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L359" class="LineNr">359 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L360" class="LineNr">360 </span> 50/push-EAX/ed
<span id="L361" class="LineNr">361 </span> 68/push <a href='crenshaw2-1.subx.html#L572'>_test-error-stream</a>/imm32
<span id="L362" class="LineNr">362 </span> 68/push <a href='crenshaw2-1.subx.html#L562'>_test-output-stream</a>/imm32
<span id="L361" class="LineNr">361 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L362" class="LineNr">362 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L363" class="LineNr">363 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L364" class="LineNr">364 </span> <span class="subxS2Comment"># . . call</span>
<span id="L365" class="LineNr">365 </span> e8/call <a href='crenshaw2-1.subx.html#L190'>get-num</a>/disp32
@ -432,7 +431,7 @@ if ('onhashchange' in window) {
<span id="L370" class="LineNr">370 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L371" class="LineNr">371 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-single-digit&quot;</span>/imm32
<span id="L372" class="LineNr">372 </span> 68/push 0x33/imm32
<span id="L373" class="LineNr">373 </span> b8/copy-to-EAX <a href='crenshaw2-1.subx.html#L562'>_test-output-stream</a>/imm32
<span id="L373" class="LineNr">373 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L374" class="LineNr">374 </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="L375" class="LineNr">375 </span> <span class="subxS2Comment"># . . call</span>
<span id="L376" class="LineNr">376 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
@ -467,14 +466,14 @@ if ('onhashchange' in window) {
<span id="L405" class="LineNr">405 </span> 81 0/subop/add 3/mod/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="L406" class="LineNr">406 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L407" class="LineNr">407 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L408" class="LineNr">408 </span> 68/push <a href='crenshaw2-1.subx.html#L562'>_test-output-stream</a>/imm32
<span id="L408" class="LineNr">408 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L409" class="LineNr">409 </span> <span class="subxS2Comment"># . . call</span>
<span id="L410" class="LineNr">410 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L411" class="LineNr">411 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L412" class="LineNr">412 </span> 81 0/subop/add 3/mod/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="L413" class="LineNr">413 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L414" class="LineNr">414 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L415" class="LineNr">415 </span> 68/push <a href='crenshaw2-1.subx.html#L572'>_test-error-stream</a>/imm32
<span id="L415" class="LineNr">415 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L416" class="LineNr">416 </span> <span class="subxS2Comment"># . . call</span>
<span id="L417" class="LineNr">417 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L418" class="LineNr">418 </span> <span class="subxS2Comment"># . . discard args</span>
@ -497,15 +496,15 @@ if ('onhashchange' in window) {
<span id="L435" class="LineNr">435 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L436" class="LineNr">436 </span> 50/push-EAX/ed
<span id="L437" class="LineNr">437 </span> <span class="subxS2Comment"># . . call</span>
<span id="L438" class="LineNr">438 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L438" class="LineNr">438 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L439" class="LineNr">439 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L440" class="LineNr">440 </span> 81 0/subop/add 3/mod/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="L441" class="LineNr">441 </span> <span class="subxComment"># *don't* prime the pump</span>
<span id="L442" class="LineNr">442 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L443" class="LineNr">443 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L444" class="LineNr">444 </span> 50/push-EAX/ed
<span id="L445" class="LineNr">445 </span> 68/push <a href='crenshaw2-1.subx.html#L572'>_test-error-stream</a>/imm32
<span id="L446" class="LineNr">446 </span> 68/push <a href='crenshaw2-1.subx.html#L562'>_test-output-stream</a>/imm32
<span id="L445" class="LineNr">445 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L446" class="LineNr">446 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L447" class="LineNr">447 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L448" class="LineNr">448 </span> <span class="subxS2Comment"># . . call</span>
<span id="L449" class="LineNr">449 </span> e8/call <a href='crenshaw2-1.subx.html#L190'>get-num</a>/disp32
@ -564,7 +563,7 @@ if ('onhashchange' in window) {
<span id="L502" class="LineNr">502 </span> 68/push 1/imm32
<span id="L503" class="LineNr">503 </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="L504" class="LineNr">504 </span> <span class="subxS2Comment"># . . call</span>
<span id="L505" class="LineNr">505 </span> e8/call <a href='../059stop.subx.html#L91'>stop</a>/disp32
<span id="L505" class="LineNr">505 </span> e8/call <a href='../059stop.subx.html#L92'>stop</a>/disp32
<span id="L506" class="LineNr">506 </span> <span class="subxComment"># should never get past this point</span>
<span id="L507" class="LineNr">507 </span><span class="Constant">$expected:dead-end</span>:
<span id="L508" class="LineNr">508 </span> <span class="subxS1Comment"># . epilog</span>
@ -621,30 +620,7 @@ if ('onhashchange' in window) {
<span id="L559" class="LineNr">559 </span><span class="SpecialChar">Look</span>: <span class="subxComment"># (char with some extra padding)</span>
<span id="L560" class="LineNr">560 </span> 0/imm32
<span id="L561" class="LineNr">561 </span>
<span id="L562" class="LineNr">562 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L563" class="LineNr">563 </span> <span class="subxComment"># current write index</span>
<span id="L564" class="LineNr">564 </span> 0/imm32
<span id="L565" class="LineNr">565 </span> <span class="subxComment"># current read index</span>
<span id="L566" class="LineNr">566 </span> 0/imm32
<span id="L567" class="LineNr">567 </span> <span class="subxComment"># length</span>
<span id="L568" class="LineNr">568 </span> 8/imm32
<span id="L569" class="LineNr">569 </span> <span class="subxComment"># data</span>
<span id="L570" class="LineNr">570 </span> 00 00 00 00 00 00 00 00 <span class="subxComment"># 8 bytes</span>
<span id="L571" class="LineNr">571 </span>
<span id="L572" class="LineNr">572 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L573" class="LineNr">573 </span> <span class="subxComment"># current write index</span>
<span id="L574" class="LineNr">574 </span> 0/imm32
<span id="L575" class="LineNr">575 </span> <span class="subxComment"># current read index</span>
<span id="L576" class="LineNr">576 </span> 0/imm32
<span id="L577" class="LineNr">577 </span> <span class="subxComment"># length</span>
<span id="L578" class="LineNr">578 </span> 0x40/imm32
<span id="L579" class="LineNr">579 </span> <span class="subxComment"># data (4 lines x 16 bytes/line)</span>
<span id="L580" class="LineNr">580 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L581" class="LineNr">581 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L582" class="LineNr">582 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L583" class="LineNr">583 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L584" class="LineNr">584 </span>
<span id="L585" class="LineNr">585 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L562" class="LineNr">562 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -14,17 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -394,14 +393,14 @@ if ('onhashchange' in window) {
<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-output-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-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L335" class="LineNr">335 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-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="subxS1Comment"># . clear-stream(_test-error-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='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L342" class="LineNr">342 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-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>
@ -424,7 +423,7 @@ if ('onhashchange' in window) {
<span id="L362" class="LineNr">362 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L363" class="LineNr">363 </span> 50/push-EAX/ed
<span id="L364" class="LineNr">364 </span> <span class="subxS2Comment"># . . call</span>
<span id="L365" class="LineNr">365 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L365" class="LineNr">365 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L366" class="LineNr">366 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L367" class="LineNr">367 </span> 81 0/subop/add 3/mod/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="L368" class="LineNr">368 </span> <span class="subxComment"># prime the pump</span>
@ -438,8 +437,8 @@ if ('onhashchange' in window) {
<span id="L376" class="LineNr">376 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L377" class="LineNr">377 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L378" class="LineNr">378 </span> 50/push-EAX/ed
<span id="L379" class="LineNr">379 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L380" class="LineNr">380 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L379" class="LineNr">379 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L380" class="LineNr">380 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L381" class="LineNr">381 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L382" class="LineNr">382 </span> <span class="subxS2Comment"># . . call</span>
<span id="L383" class="LineNr">383 </span> e8/call <a href='crenshaw2-1b.subx.html#L191'>get-num</a>/disp32
@ -450,7 +449,7 @@ if ('onhashchange' in window) {
<span id="L388" class="LineNr">388 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L389" class="LineNr">389 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-single-digit&quot;</span>/imm32
<span id="L390" class="LineNr">390 </span> 68/push 0x33/imm32
<span id="L391" class="LineNr">391 </span> b8/copy-to-EAX <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L391" class="LineNr">391 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L392" class="LineNr">392 </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="L393" class="LineNr">393 </span> <span class="subxS2Comment"># . . call</span>
<span id="L394" class="LineNr">394 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
@ -485,14 +484,14 @@ if ('onhashchange' in window) {
<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-output-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-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L426" class="LineNr">426 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-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="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L432" class="LineNr">432 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L433" class="LineNr">433 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L433" class="LineNr">433 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-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='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L436" class="LineNr">436 </span> <span class="subxS2Comment"># . . discard args</span>
@ -515,15 +514,15 @@ if ('onhashchange' in window) {
<span id="L453" class="LineNr">453 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L454" class="LineNr">454 </span> 50/push-EAX/ed
<span id="L455" class="LineNr">455 </span> <span class="subxS2Comment"># . . call</span>
<span id="L456" class="LineNr">456 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L456" class="LineNr">456 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</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> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L459" class="LineNr">459 </span> <span class="subxComment"># *don't* prime the pump</span>
<span id="L460" class="LineNr">460 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L461" class="LineNr">461 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L462" class="LineNr">462 </span> 50/push-EAX/ed
<span id="L463" class="LineNr">463 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L464" class="LineNr">464 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L463" class="LineNr">463 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L464" class="LineNr">464 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L465" class="LineNr">465 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L466" class="LineNr">466 </span> <span class="subxS2Comment"># . . call</span>
<span id="L467" class="LineNr">467 </span> e8/call <a href='crenshaw2-1b.subx.html#L191'>get-num</a>/disp32
@ -570,14 +569,14 @@ if ('onhashchange' in window) {
<span id="L508" class="LineNr">508 </span> 81 0/subop/add 3/mod/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="L509" class="LineNr">509 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L510" class="LineNr">510 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L511" class="LineNr">511 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L511" class="LineNr">511 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L512" class="LineNr">512 </span> <span class="subxS2Comment"># . . call</span>
<span id="L513" class="LineNr">513 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L514" class="LineNr">514 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L515" class="LineNr">515 </span> 81 0/subop/add 3/mod/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="L516" class="LineNr">516 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L517" class="LineNr">517 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L518" class="LineNr">518 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L518" class="LineNr">518 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L519" class="LineNr">519 </span> <span class="subxS2Comment"># . . call</span>
<span id="L520" class="LineNr">520 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L521" class="LineNr">521 </span> <span class="subxS2Comment"># . . discard args</span>
@ -600,7 +599,7 @@ if ('onhashchange' in window) {
<span id="L538" class="LineNr">538 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L539" class="LineNr">539 </span> 50/push-EAX/ed
<span id="L540" class="LineNr">540 </span> <span class="subxS2Comment"># . . call</span>
<span id="L541" class="LineNr">541 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L541" class="LineNr">541 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L542" class="LineNr">542 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L543" class="LineNr">543 </span> 81 0/subop/add 3/mod/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="L544" class="LineNr">544 </span> <span class="subxComment"># prime the pump</span>
@ -614,8 +613,8 @@ if ('onhashchange' in window) {
<span id="L552" class="LineNr">552 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L553" class="LineNr">553 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L554" class="LineNr">554 </span> 50/push-EAX/ed
<span id="L555" class="LineNr">555 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L556" class="LineNr">556 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L555" class="LineNr">555 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L556" class="LineNr">556 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L557" class="LineNr">557 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</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='crenshaw2-1b.subx.html#L191'>get-num</a>/disp32
@ -626,7 +625,7 @@ if ('onhashchange' in window) {
<span id="L564" class="LineNr">564 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L565" class="LineNr">565 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-multiple-digits&quot;</span>/imm32
<span id="L566" class="LineNr">566 </span> 68/push 0x36353433/imm32
<span id="L567" class="LineNr">567 </span> b8/copy-to-EAX <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L567" class="LineNr">567 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L568" class="LineNr">568 </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="L569" class="LineNr">569 </span> <span class="subxS2Comment"># . . call</span>
<span id="L570" class="LineNr">570 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
@ -661,14 +660,14 @@ if ('onhashchange' in window) {
<span id="L599" class="LineNr">599 </span> 81 0/subop/add 3/mod/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="L600" class="LineNr">600 </span> <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L601" class="LineNr">601 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L602" class="LineNr">602 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L602" class="LineNr">602 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L603" class="LineNr">603 </span> <span class="subxS2Comment"># . . call</span>
<span id="L604" class="LineNr">604 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L605" class="LineNr">605 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L606" class="LineNr">606 </span> 81 0/subop/add 3/mod/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="L607" class="LineNr">607 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L608" class="LineNr">608 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L609" class="LineNr">609 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L609" class="LineNr">609 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L610" class="LineNr">610 </span> <span class="subxS2Comment"># . . call</span>
<span id="L611" class="LineNr">611 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L612" class="LineNr">612 </span> <span class="subxS2Comment"># . . discard args</span>
@ -691,7 +690,7 @@ if ('onhashchange' in window) {
<span id="L629" class="LineNr">629 </span> 68/push 0x10/imm32/nbytes-of-args-for-get-num
<span id="L630" class="LineNr">630 </span> 50/push-EAX/ed
<span id="L631" class="LineNr">631 </span> <span class="subxS2Comment"># . . call</span>
<span id="L632" class="LineNr">632 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L632" class="LineNr">632 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L633" class="LineNr">633 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L634" class="LineNr">634 </span> 81 0/subop/add 3/mod/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="L635" class="LineNr">635 </span> <span class="subxComment"># prime the pump</span>
@ -705,8 +704,8 @@ if ('onhashchange' in window) {
<span id="L643" class="LineNr">643 </span> <span class="subxComment"># get-num(in, out, err, ed)</span>
<span id="L644" class="LineNr">644 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L645" class="LineNr">645 </span> 50/push-EAX/ed
<span id="L646" class="LineNr">646 </span> 68/push <a href='crenshaw2-1b.subx.html#L772'>_test-error-stream</a>/imm32
<span id="L647" class="LineNr">647 </span> 68/push <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L646" class="LineNr">646 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L647" class="LineNr">647 </span> 68/push <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L648" class="LineNr">648 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L649" class="LineNr">649 </span> <span class="subxS2Comment"># . . call</span>
<span id="L650" class="LineNr">650 </span> e8/call <a href='crenshaw2-1b.subx.html#L191'>get-num</a>/disp32
@ -717,7 +716,7 @@ if ('onhashchange' in window) {
<span id="L655" class="LineNr">655 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L656" class="LineNr">656 </span> 68/push <span class="Constant">&quot;F - test-get-num-reads-multiple-digits-followed-by-nondigit&quot;</span>/imm32
<span id="L657" class="LineNr">657 </span> 68/push 0x36353433/imm32
<span id="L658" class="LineNr">658 </span> b8/copy-to-EAX <a href='crenshaw2-1b.subx.html#L762'>_test-output-stream</a>/imm32
<span id="L658" class="LineNr">658 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L290'>_test-output-stream</a>/imm32
<span id="L659" class="LineNr">659 </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="L660" class="LineNr">660 </span> <span class="subxS2Comment"># . . call</span>
<span id="L661" class="LineNr">661 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
@ -764,7 +763,7 @@ if ('onhashchange' in window) {
<span id="L702" class="LineNr">702 </span> 68/push 1/imm32
<span id="L703" class="LineNr">703 </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="L704" class="LineNr">704 </span> <span class="subxS2Comment"># . . call</span>
<span id="L705" class="LineNr">705 </span> e8/call <a href='../059stop.subx.html#L91'>stop</a>/disp32
<span id="L705" class="LineNr">705 </span> e8/call <a href='../059stop.subx.html#L92'>stop</a>/disp32
<span id="L706" class="LineNr">706 </span> <span class="subxComment"># should never get past this point</span>
<span id="L707" class="LineNr">707 </span><span class="Constant">$expected:dead-end</span>:
<span id="L708" class="LineNr">708 </span> <span class="subxS1Comment"># . epilog</span>
@ -821,30 +820,7 @@ if ('onhashchange' in window) {
<span id="L759" class="LineNr">759 </span><span class="SpecialChar">Look</span>: <span class="subxComment"># (char with some extra padding)</span>
<span id="L760" class="LineNr">760 </span> 0/imm32
<span id="L761" class="LineNr">761 </span>
<span id="L762" class="LineNr">762 </span><span class="subxMinorFunction">_test-output-stream</span>:
<span id="L763" class="LineNr">763 </span> <span class="subxComment"># current write index</span>
<span id="L764" class="LineNr">764 </span> 0/imm32
<span id="L765" class="LineNr">765 </span> <span class="subxComment"># current read index</span>
<span id="L766" class="LineNr">766 </span> 0/imm32
<span id="L767" class="LineNr">767 </span> <span class="subxComment"># length</span>
<span id="L768" class="LineNr">768 </span> 8/imm32
<span id="L769" class="LineNr">769 </span> <span class="subxComment"># data</span>
<span id="L770" class="LineNr">770 </span> 00 00 00 00 00 00 00 00 <span class="subxComment"># 8 bytes</span>
<span id="L771" class="LineNr">771 </span>
<span id="L772" class="LineNr">772 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L773" class="LineNr">773 </span> <span class="subxComment"># current write index</span>
<span id="L774" class="LineNr">774 </span> 0/imm32
<span id="L775" class="LineNr">775 </span> <span class="subxComment"># current read index</span>
<span id="L776" class="LineNr">776 </span> 0/imm32
<span id="L777" class="LineNr">777 </span> <span class="subxComment"># length</span>
<span id="L778" class="LineNr">778 </span> 0x40/imm32
<span id="L779" class="LineNr">779 </span> <span class="subxComment"># data (4 lines x 16 bytes/line)</span>
<span id="L780" class="LineNr">780 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L781" class="LineNr">781 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L782" class="LineNr">782 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L783" class="LineNr">783 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L784" class="LineNr">784 </span>
<span id="L785" class="LineNr">785 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L762" class="LineNr">762 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

3790
html/apps/desugar.subx.html Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,16 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

View File

@ -14,18 +14,18 @@ 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; }
.CommentedCode { color: #8a8a8a; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>

View File

@ -14,17 +14,16 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -286,14 +285,14 @@ if ('onhashchange' in window) {
<span id="L224" class="LineNr"> 224 </span> 81 0/subop/add 3/mod/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="L225" class="LineNr"> 225 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L226" class="LineNr"> 226 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L227" class="LineNr"> 227 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L227" class="LineNr"> 227 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L228" class="LineNr"> 228 </span> <span class="subxS2Comment"># . . call</span>
<span id="L229" class="LineNr"> 229 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</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"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L233" class="LineNr"> 233 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L234" class="LineNr"> 234 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L234" class="LineNr"> 234 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L235" class="LineNr"> 235 </span> 05/add-to-EAX 4/imm32
<span id="L236" class="LineNr"> 236 </span> 50/push-EAX
<span id="L237" class="LineNr"> 237 </span> <span class="subxS2Comment"># . . call</span>
@ -318,13 +317,13 @@ if ('onhashchange' in window) {
<span id="L256" class="LineNr"> 256 </span> 68/push 0xc/imm32/nbytes-of-args-for-convert-next-octet
<span id="L257" class="LineNr"> 257 </span> 51/push-ECX/ed
<span id="L258" class="LineNr"> 258 </span> <span class="subxS2Comment"># . . call</span>
<span id="L259" class="LineNr"> 259 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L259" class="LineNr"> 259 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L260" class="LineNr"> 260 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L261" class="LineNr"> 261 </span> 81 0/subop/add 3/mod/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="L262" class="LineNr"> 262 </span> <span class="subxComment"># EAX = convert-next-octet(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L263" class="LineNr"> 263 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L264" class="LineNr"> 264 </span> 51/push-ECX/ed
<span id="L265" class="LineNr"> 265 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L265" class="LineNr"> 265 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L266" class="LineNr"> 266 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L267" class="LineNr"> 267 </span> <span class="subxS2Comment"># . . call</span>
<span id="L268" class="LineNr"> 268 </span> e8/call <a href='hex.subx.html#L135'>convert-next-octet</a>/disp32
@ -388,14 +387,14 @@ if ('onhashchange' in window) {
<span id="L326" class="LineNr"> 326 </span> 81 0/subop/add 3/mod/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="L327" class="LineNr"> 327 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L328" class="LineNr"> 328 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L329" class="LineNr"> 329 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L329" class="LineNr"> 329 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L330" class="LineNr"> 330 </span> <span class="subxS2Comment"># . . call</span>
<span id="L331" class="LineNr"> 331 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L332" class="LineNr"> 332 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L333" class="LineNr"> 333 </span> 81 0/subop/add 3/mod/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="L334" class="LineNr"> 334 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L335" class="LineNr"> 335 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L336" class="LineNr"> 336 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L336" class="LineNr"> 336 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L337" class="LineNr"> 337 </span> 05/add-to-EAX 4/imm32
<span id="L338" class="LineNr"> 338 </span> 50/push-EAX
<span id="L339" class="LineNr"> 339 </span> <span class="subxS2Comment"># . . call</span>
@ -412,13 +411,13 @@ if ('onhashchange' in window) {
<span id="L350" class="LineNr"> 350 </span> 68/push 0xc/imm32/nbytes-of-args-for-convert-next-octet
<span id="L351" class="LineNr"> 351 </span> 51/push-ECX/ed
<span id="L352" class="LineNr"> 352 </span> <span class="subxS2Comment"># . . call</span>
<span id="L353" class="LineNr"> 353 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L353" class="LineNr"> 353 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</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="subxComment"># EAX = convert-next-octet(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L357" class="LineNr"> 357 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L358" class="LineNr"> 358 </span> 51/push-ECX/ed
<span id="L359" class="LineNr"> 359 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L359" class="LineNr"> 359 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L360" class="LineNr"> 360 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L361" class="LineNr"> 361 </span> <span class="subxS2Comment"># . . call</span>
<span id="L362" class="LineNr"> 362 </span> e8/call <a href='hex.subx.html#L135'>convert-next-octet</a>/disp32
@ -482,14 +481,14 @@ if ('onhashchange' in window) {
<span id="L420" class="LineNr"> 420 </span> 81 0/subop/add 3/mod/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="L421" class="LineNr"> 421 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L422" class="LineNr"> 422 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L423" class="LineNr"> 423 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L423" class="LineNr"> 423 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L424" class="LineNr"> 424 </span> <span class="subxS2Comment"># . . call</span>
<span id="L425" class="LineNr"> 425 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L426" class="LineNr"> 426 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L427" class="LineNr"> 427 </span> 81 0/subop/add 3/mod/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="L428" class="LineNr"> 428 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L429" class="LineNr"> 429 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L430" class="LineNr"> 430 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L430" class="LineNr"> 430 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L431" class="LineNr"> 431 </span> 05/add-to-EAX 4/imm32
<span id="L432" class="LineNr"> 432 </span> 50/push-EAX
<span id="L433" class="LineNr"> 433 </span> <span class="subxS2Comment"># . . call</span>
@ -514,13 +513,13 @@ if ('onhashchange' in window) {
<span id="L452" class="LineNr"> 452 </span> 68/push 0xc/imm32/nbytes-of-args-for-convert-next-octet
<span id="L453" class="LineNr"> 453 </span> 51/push-ECX/ed
<span id="L454" class="LineNr"> 454 </span> <span class="subxS2Comment"># . . call</span>
<span id="L455" class="LineNr"> 455 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L455" class="LineNr"> 455 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L456" class="LineNr"> 456 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L457" class="LineNr"> 457 </span> 81 0/subop/add 3/mod/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="L458" class="LineNr"> 458 </span> <span class="subxComment"># EAX = convert-next-octet(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L459" class="LineNr"> 459 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L460" class="LineNr"> 460 </span> 51/push-ECX/ed
<span id="L461" class="LineNr"> 461 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L461" class="LineNr"> 461 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L462" class="LineNr"> 462 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L463" class="LineNr"> 463 </span> <span class="subxS2Comment"># . . call</span>
<span id="L464" class="LineNr"> 464 </span> e8/call <a href='hex.subx.html#L135'>convert-next-octet</a>/disp32
@ -655,14 +654,14 @@ if ('onhashchange' in window) {
<span id="L593" class="LineNr"> 593 </span> 81 0/subop/add 3/mod/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="L594" class="LineNr"> 594 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L595" class="LineNr"> 595 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L596" class="LineNr"> 596 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L596" class="LineNr"> 596 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L597" class="LineNr"> 597 </span> <span class="subxS2Comment"># . . call</span>
<span id="L598" class="LineNr"> 598 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L599" class="LineNr"> 599 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L600" class="LineNr"> 600 </span> 81 0/subop/add 3/mod/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="L601" class="LineNr"> 601 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L602" class="LineNr"> 602 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L603" class="LineNr"> 603 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L603" class="LineNr"> 603 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L604" class="LineNr"> 604 </span> 05/add-to-EAX 4/imm32
<span id="L605" class="LineNr"> 605 </span> 50/push-EAX
<span id="L606" class="LineNr"> 606 </span> <span class="subxS2Comment"># . . call</span>
@ -687,13 +686,13 @@ if ('onhashchange' in window) {
<span id="L625" class="LineNr"> 625 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L626" class="LineNr"> 626 </span> 51/push-ECX/ed
<span id="L627" class="LineNr"> 627 </span> <span class="subxS2Comment"># . . call</span>
<span id="L628" class="LineNr"> 628 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L628" class="LineNr"> 628 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L629" class="LineNr"> 629 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L630" class="LineNr"> 630 </span> 81 0/subop/add 3/mod/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="L631" class="LineNr"> 631 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L632" class="LineNr"> 632 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L633" class="LineNr"> 633 </span> 51/push-ECX/ed
<span id="L634" class="LineNr"> 634 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L634" class="LineNr"> 634 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L635" class="LineNr"> 635 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L636" class="LineNr"> 636 </span> <span class="subxS2Comment"># . . call</span>
<span id="L637" class="LineNr"> 637 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -757,14 +756,14 @@ if ('onhashchange' in window) {
<span id="L695" class="LineNr"> 695 </span> 81 0/subop/add 3/mod/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="L696" class="LineNr"> 696 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L697" class="LineNr"> 697 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L698" class="LineNr"> 698 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L698" class="LineNr"> 698 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L699" class="LineNr"> 699 </span> <span class="subxS2Comment"># . . call</span>
<span id="L700" class="LineNr"> 700 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L701" class="LineNr"> 701 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L702" class="LineNr"> 702 </span> 81 0/subop/add 3/mod/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="L703" class="LineNr"> 703 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L704" class="LineNr"> 704 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L705" class="LineNr"> 705 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L705" class="LineNr"> 705 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L706" class="LineNr"> 706 </span> 05/add-to-EAX 4/imm32
<span id="L707" class="LineNr"> 707 </span> 50/push-EAX
<span id="L708" class="LineNr"> 708 </span> <span class="subxS2Comment"># . . call</span>
@ -789,13 +788,13 @@ if ('onhashchange' in window) {
<span id="L727" class="LineNr"> 727 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L728" class="LineNr"> 728 </span> 51/push-ECX/ed
<span id="L729" class="LineNr"> 729 </span> <span class="subxS2Comment"># . . call</span>
<span id="L730" class="LineNr"> 730 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L730" class="LineNr"> 730 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L731" class="LineNr"> 731 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L732" class="LineNr"> 732 </span> 81 0/subop/add 3/mod/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="L733" class="LineNr"> 733 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L734" class="LineNr"> 734 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L735" class="LineNr"> 735 </span> 51/push-ECX/ed
<span id="L736" class="LineNr"> 736 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L736" class="LineNr"> 736 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L737" class="LineNr"> 737 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L738" class="LineNr"> 738 </span> <span class="subxS2Comment"># . . call</span>
<span id="L739" class="LineNr"> 739 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -859,14 +858,14 @@ if ('onhashchange' in window) {
<span id="L797" class="LineNr"> 797 </span> 81 0/subop/add 3/mod/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="L798" class="LineNr"> 798 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L799" class="LineNr"> 799 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L800" class="LineNr"> 800 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L800" class="LineNr"> 800 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L801" class="LineNr"> 801 </span> <span class="subxS2Comment"># . . call</span>
<span id="L802" class="LineNr"> 802 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L803" class="LineNr"> 803 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L804" class="LineNr"> 804 </span> 81 0/subop/add 3/mod/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="L805" class="LineNr"> 805 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L806" class="LineNr"> 806 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L807" class="LineNr"> 807 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L807" class="LineNr"> 807 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L808" class="LineNr"> 808 </span> 05/add-to-EAX 4/imm32
<span id="L809" class="LineNr"> 809 </span> 50/push-EAX
<span id="L810" class="LineNr"> 810 </span> <span class="subxS2Comment"># . . call</span>
@ -899,13 +898,13 @@ if ('onhashchange' in window) {
<span id="L837" class="LineNr"> 837 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L838" class="LineNr"> 838 </span> 51/push-ECX/ed
<span id="L839" class="LineNr"> 839 </span> <span class="subxS2Comment"># . . call</span>
<span id="L840" class="LineNr"> 840 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L840" class="LineNr"> 840 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L841" class="LineNr"> 841 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L842" class="LineNr"> 842 </span> 81 0/subop/add 3/mod/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="L843" class="LineNr"> 843 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L844" class="LineNr"> 844 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L845" class="LineNr"> 845 </span> 51/push-ECX/ed
<span id="L846" class="LineNr"> 846 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L846" class="LineNr"> 846 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L847" class="LineNr"> 847 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L848" class="LineNr"> 848 </span> <span class="subxS2Comment"># . . call</span>
<span id="L849" class="LineNr"> 849 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -969,14 +968,14 @@ if ('onhashchange' in window) {
<span id="L907" class="LineNr"> 907 </span> 81 0/subop/add 3/mod/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="L908" class="LineNr"> 908 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L909" class="LineNr"> 909 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L910" class="LineNr"> 910 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L910" class="LineNr"> 910 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L911" class="LineNr"> 911 </span> <span class="subxS2Comment"># . . call</span>
<span id="L912" class="LineNr"> 912 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L913" class="LineNr"> 913 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L914" class="LineNr"> 914 </span> 81 0/subop/add 3/mod/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="L915" class="LineNr"> 915 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L916" class="LineNr"> 916 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L917" class="LineNr"> 917 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L917" class="LineNr"> 917 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L918" class="LineNr"> 918 </span> 05/add-to-EAX 4/imm32
<span id="L919" class="LineNr"> 919 </span> 50/push-EAX
<span id="L920" class="LineNr"> 920 </span> <span class="subxS2Comment"># . . call</span>
@ -1009,13 +1008,13 @@ if ('onhashchange' in window) {
<span id="L947" class="LineNr"> 947 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L948" class="LineNr"> 948 </span> 51/push-ECX/ed
<span id="L949" class="LineNr"> 949 </span> <span class="subxS2Comment"># . . call</span>
<span id="L950" class="LineNr"> 950 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L950" class="LineNr"> 950 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L951" class="LineNr"> 951 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L952" class="LineNr"> 952 </span> 81 0/subop/add 3/mod/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="L953" class="LineNr"> 953 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L954" class="LineNr"> 954 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L955" class="LineNr"> 955 </span> 51/push-ECX/ed
<span id="L956" class="LineNr"> 956 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L956" class="LineNr"> 956 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L957" class="LineNr"> 957 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L958" class="LineNr"> 958 </span> <span class="subxS2Comment"># . . call</span>
<span id="L959" class="LineNr"> 959 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -1079,14 +1078,14 @@ if ('onhashchange' in window) {
<span id="L1017" class="LineNr">1017 </span> 81 0/subop/add 3/mod/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="L1018" class="LineNr">1018 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L1019" class="LineNr">1019 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1020" class="LineNr">1020 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L1020" class="LineNr">1020 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L1021" class="LineNr">1021 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1022" class="LineNr">1022 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1023" class="LineNr">1023 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1024" class="LineNr">1024 </span> 81 0/subop/add 3/mod/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="L1025" class="LineNr">1025 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L1026" class="LineNr">1026 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1027" class="LineNr">1027 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1027" class="LineNr">1027 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1028" class="LineNr">1028 </span> 05/add-to-EAX 4/imm32
<span id="L1029" class="LineNr">1029 </span> 50/push-EAX
<span id="L1030" class="LineNr">1030 </span> <span class="subxS2Comment"># . . call</span>
@ -1119,13 +1118,13 @@ if ('onhashchange' in window) {
<span id="L1057" class="LineNr">1057 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L1058" class="LineNr">1058 </span> 51/push-ECX/ed
<span id="L1059" class="LineNr">1059 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1060" class="LineNr">1060 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L1060" class="LineNr">1060 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L1061" class="LineNr">1061 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1062" class="LineNr">1062 </span> 81 0/subop/add 3/mod/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="L1063" class="LineNr">1063 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L1064" class="LineNr">1064 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1065" class="LineNr">1065 </span> 51/push-ECX/ed
<span id="L1066" class="LineNr">1066 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1066" class="LineNr">1066 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1067" class="LineNr">1067 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L1068" class="LineNr">1068 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1069" class="LineNr">1069 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -1189,14 +1188,14 @@ if ('onhashchange' in window) {
<span id="L1127" class="LineNr">1127 </span> 81 0/subop/add 3/mod/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="L1128" class="LineNr">1128 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L1129" class="LineNr">1129 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1130" class="LineNr">1130 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L1130" class="LineNr">1130 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L1131" class="LineNr">1131 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1132" class="LineNr">1132 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1133" class="LineNr">1133 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1134" class="LineNr">1134 </span> 81 0/subop/add 3/mod/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="L1135" class="LineNr">1135 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L1136" class="LineNr">1136 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1137" class="LineNr">1137 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1137" class="LineNr">1137 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1138" class="LineNr">1138 </span> 05/add-to-EAX 4/imm32
<span id="L1139" class="LineNr">1139 </span> 50/push-EAX
<span id="L1140" class="LineNr">1140 </span> <span class="subxS2Comment"># . . call</span>
@ -1221,13 +1220,13 @@ if ('onhashchange' in window) {
<span id="L1159" class="LineNr">1159 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L1160" class="LineNr">1160 </span> 51/push-ECX/ed
<span id="L1161" class="LineNr">1161 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1162" class="LineNr">1162 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L1162" class="LineNr">1162 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L1163" class="LineNr">1163 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1164" class="LineNr">1164 </span> 81 0/subop/add 3/mod/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="L1165" class="LineNr">1165 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L1166" class="LineNr">1166 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1167" class="LineNr">1167 </span> 51/push-ECX/ed
<span id="L1168" class="LineNr">1168 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1168" class="LineNr">1168 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1169" class="LineNr">1169 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L1170" class="LineNr">1170 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1171" class="LineNr">1171 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -1291,14 +1290,14 @@ if ('onhashchange' in window) {
<span id="L1229" class="LineNr">1229 </span> 81 0/subop/add 3/mod/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="L1230" class="LineNr">1230 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L1231" class="LineNr">1231 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1232" class="LineNr">1232 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L1232" class="LineNr">1232 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L1233" class="LineNr">1233 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1234" class="LineNr">1234 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1235" class="LineNr">1235 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1236" class="LineNr">1236 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L1237" class="LineNr">1237 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L1238" class="LineNr">1238 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1239" class="LineNr">1239 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1239" class="LineNr">1239 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1240" class="LineNr">1240 </span> 05/add-to-EAX 4/imm32
<span id="L1241" class="LineNr">1241 </span> 50/push-EAX
<span id="L1242" class="LineNr">1242 </span> <span class="subxS2Comment"># . . call</span>
@ -1315,13 +1314,13 @@ if ('onhashchange' in window) {
<span id="L1253" class="LineNr">1253 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L1254" class="LineNr">1254 </span> 51/push-ECX/ed
<span id="L1255" class="LineNr">1255 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1256" class="LineNr">1256 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L1256" class="LineNr">1256 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L1257" class="LineNr">1257 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1258" class="LineNr">1258 </span> 81 0/subop/add 3/mod/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="L1259" class="LineNr">1259 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L1260" class="LineNr">1260 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1261" class="LineNr">1261 </span> 51/push-ECX/ed
<span id="L1262" class="LineNr">1262 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1262" class="LineNr">1262 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1263" class="LineNr">1263 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L1264" class="LineNr">1264 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1265" class="LineNr">1265 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -1385,14 +1384,14 @@ if ('onhashchange' in window) {
<span id="L1323" class="LineNr">1323 </span> 81 0/subop/add 3/mod/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="L1324" class="LineNr">1324 </span> <span class="subxS1Comment"># . clear-stream(_test-error-stream)</span>
<span id="L1325" class="LineNr">1325 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1326" class="LineNr">1326 </span> 68/push <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L1326" class="LineNr">1326 </span> 68/push <a href='../064write-byte.subx.html#L344'>_test-error-stream</a>/imm32
<span id="L1327" class="LineNr">1327 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1328" class="LineNr">1328 </span> e8/call <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1329" class="LineNr">1329 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1330" class="LineNr">1330 </span> 81 0/subop/add 3/mod/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="L1331" class="LineNr">1331 </span> <span class="subxS1Comment"># . clear-stream(_test-error-buffered-file+4)</span>
<span id="L1332" class="LineNr">1332 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1333" class="LineNr">1333 </span> b8/copy-to-EAX <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1333" class="LineNr">1333 </span> b8/copy-to-EAX <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1334" class="LineNr">1334 </span> 05/add-to-EAX 4/imm32
<span id="L1335" class="LineNr">1335 </span> 50/push-EAX
<span id="L1336" class="LineNr">1336 </span> <span class="subxS2Comment"># . . call</span>
@ -1417,13 +1416,13 @@ if ('onhashchange' in window) {
<span id="L1355" class="LineNr">1355 </span> 68/push 0xc/imm32/nbytes-of-args-for-scan-next-byte
<span id="L1356" class="LineNr">1356 </span> 51/push-ECX/ed
<span id="L1357" class="LineNr">1357 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1358" class="LineNr">1358 </span> e8/call <a href='../059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L1358" class="LineNr">1358 </span> e8/call <a href='../059stop.subx.html#L44'>tailor-exit-descriptor</a>/disp32
<span id="L1359" class="LineNr">1359 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L1360" class="LineNr">1360 </span> 81 0/subop/add 3/mod/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="L1361" class="LineNr">1361 </span> <span class="subxComment"># EAX = scan-next-byte(_test-buffered-file, _test-error-buffered-file, ed)</span>
<span id="L1362" class="LineNr">1362 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L1363" class="LineNr">1363 </span> 51/push-ECX/ed
<span id="L1364" class="LineNr">1364 </span> 68/push <a href='hex.subx.html#L1503'>_test-error-buffered-file</a>/imm32
<span id="L1364" class="LineNr">1364 </span> 68/push <a href='../064write-byte.subx.html#L362'>_test-error-buffered-file</a>/imm32
<span id="L1365" class="LineNr">1365 </span> 68/push <a href='../061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L1366" class="LineNr">1366 </span> <span class="subxS2Comment"># . . call</span>
<span id="L1367" class="LineNr">1367 </span> e8/call <a href='hex.subx.html#L493'>scan-next-byte</a>/disp32
@ -1542,39 +1541,7 @@ if ('onhashchange' in window) {
<span id="L1480" class="LineNr">1480 </span> <span class="subxS1Comment"># . end</span>
<span id="L1481" class="LineNr">1481 </span> c3/return
<span id="L1482" class="LineNr">1482 </span>
<span id="L1483" class="LineNr">1483 </span>== data
<span id="L1484" class="LineNr">1484 </span>
<span id="L1485" class="LineNr">1485 </span><span class="subxMinorFunction">_test-error-stream</span>:
<span id="L1486" class="LineNr">1486 </span> <span class="subxComment"># current write index</span>
<span id="L1487" class="LineNr">1487 </span> 0/imm32
<span id="L1488" class="LineNr">1488 </span> <span class="subxComment"># current read index</span>
<span id="L1489" class="LineNr">1489 </span> 0/imm32
<span id="L1490" class="LineNr">1490 </span> <span class="subxComment"># line</span>
<span id="L1491" class="LineNr">1491 </span> 0x80/imm32 <span class="subxComment"># 128 bytes</span>
<span id="L1492" class="LineNr">1492 </span> <span class="subxComment"># data (8 lines x 16 bytes/line)</span>
<span id="L1493" class="LineNr">1493 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1494" class="LineNr">1494 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1495" class="LineNr">1495 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1496" class="LineNr">1496 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1497" class="LineNr">1497 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1498" class="LineNr">1498 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1499" class="LineNr">1499 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1500" class="LineNr">1500 </span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
<span id="L1501" class="LineNr">1501 </span>
<span id="L1502" class="LineNr">1502 </span><span class="subxComment"># a test buffered file for _test-error-stream</span>
<span id="L1503" class="LineNr">1503 </span><span class="subxMinorFunction">_test-error-buffered-file</span>:
<span id="L1504" class="LineNr">1504 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L1505" class="LineNr">1505 </span> <a href='hex.subx.html#L1485'>_test-error-stream</a>/imm32
<span id="L1506" class="LineNr">1506 </span> <span class="subxComment"># current write index</span>
<span id="L1507" class="LineNr">1507 </span> 0/imm32
<span id="L1508" class="LineNr">1508 </span> <span class="subxComment"># current read index</span>
<span id="L1509" class="LineNr">1509 </span> 0/imm32
<span id="L1510" class="LineNr">1510 </span> <span class="subxComment"># length</span>
<span id="L1511" class="LineNr">1511 </span> 6/imm32
<span id="L1512" class="LineNr">1512 </span> <span class="subxComment"># data</span>
<span id="L1513" class="LineNr">1513 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L1514" class="LineNr">1514 </span>
<span id="L1515" class="LineNr">1515 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L1483" class="LineNr">1483 </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

View File

@ -14,15 +14,15 @@ 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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

View File

@ -15,9 +15,9 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -56,7 +56,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># First program: same as <a href="https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html">https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html</a></span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment"># Just return 42.</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment">#</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To run:</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx translate examples/ex1.2.subx -o examples/ex1</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx run examples/ex1</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># Expected result:</span>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -59,7 +59,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># String comparison: return 1 iff the two args passed in at the commandline are equal.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex10.subx -o examples/ex10</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex10 abc abd</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Expected result:</span>

View File

@ -14,17 +14,17 @@ 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; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxTest { color: #5f8700; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -67,7 +67,7 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># kernel in a few places. This layer implements a function for comparing</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># a null-terminated 'kernel string' with a length-prefixed 'SubX string'.</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment">#</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># To run:</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># $ ./subx translate examples/ex11.subx -o examples/ex11</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># $ ./subx run examples/ex11 # runs a series of tests</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxComment"># ...... # all tests pass</span>

View File

@ -15,11 +15,11 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -58,7 +58,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Example showing mmap syscall.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment"># Create a new segment using mmap, save the address, write to it.</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment">#</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># To run:</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx translate examples/ex12.subx -o examples/ex12</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># $ ./subx run examples/ex12</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># You shouldn't get a segmentation fault.</span>

View File

@ -15,9 +15,9 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -55,7 +55,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Add 1 and 1, and return the result in the exit code.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex2.subx -o examples/ex2</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex2</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Expected result:</span>

View File

@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -58,7 +58,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Add the first 10 numbers, and return the result in the exit code.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex3.subx -o examples/ex3</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex3</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Expected result:</span>

View File

@ -15,10 +15,10 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
-->
</style>
@ -56,7 +56,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Read a character from stdin, save it to a global, write it to stdout.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex4.subx -o examples/ex4</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex4</span>
<span id="L6" class="LineNr"> 6 </span>

View File

@ -15,11 +15,11 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -57,7 +57,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Read a character from stdin, save it to a local on the stack, write it to stdout.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex5.subx -o examples/ex5</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex5</span>
<span id="L6" class="LineNr"> 6 </span>

View File

@ -15,11 +15,11 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -57,7 +57,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Print out a (global variable) string to stdout.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex6.subx -o examples/ex6</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex6</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Hello, world!</span>

View File

@ -15,11 +15,11 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -61,7 +61,7 @@ if ('onhashchange' in window) {
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># it for reading, read a character from it, close it, delete it, and return</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># the character read.</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment">#</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># To run:</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># $ ./subx translate examples/ex7.subx -o examples/ex7</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># $ ./subx run examples/ex7</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># Expected result:</span>

View File

@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -59,7 +59,7 @@ if ('onhashchange' in window) {
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Example reading commandline arguments: compute length of first arg.</span>
<span id="L2" class="LineNr"> 2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># To run:</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># $ ./subx translate examples/ex8.subx -o examples/ex8</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment"># $ ./subx run examples/ex8 abc de fghi</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># Expected result:</span>

View File

@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -61,7 +61,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxComment"># Show difference between ascii codes of first letter of first arg and first</span>
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># letter of second arg.</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxComment">#</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># To run (from the subx directory):</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># To run:</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># $ ./subx translate examples/ex9.subx -o examples/ex9</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># $ ./subx run examples/ex9 z x</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxComment"># Expected result:</span>