5582
This commit is contained in:
parent
9ac3fde9ab
commit
6033844884
|
@ -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 << <span class="Constant">" f3 0f "</span> << p<span class="Delimiter">-></span>first << <span class="Constant">": "</span> << p<span class="Delimiter">-></span>second << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
|
||||
<span id="L368" class="LineNr">368 </span> cerr << <span class="Constant">"Run `subx help instructions` for details on <a href='011run.cc.html#L123'>words</a> like 'r32' and 'disp8'.\n"</span>
|
||||
<span id="L369" class="LineNr">369 </span> <span class="Constant">"For complete details on these instructions, consult the IA-32 manual (volume 2).\n"</span>
|
||||
<span id="L370" class="LineNr">370 </span> <span class="Constant">"There's various versions of it online, such as <a href="https://c9x.me/x86">https://c9x.me/x86</a>.\n"</span>
|
||||
<span id="L370" class="LineNr">370 </span> <span class="Constant">"There's various versions of it online, such as <a href="https://c9x.me/x86.">https://c9x.me/x86.</a>\n"</span>
|
||||
<span id="L371" class="LineNr">371 </span> <span class="Constant">"The mnemonics in brackets will help you locate each instruction.\n"</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>
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -66,189 +66,190 @@ if ('onhashchange' in window) {
|
|||
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Main")</span>
|
||||
<span id="L6" class="LineNr"> 6 </span>assert<span class="Delimiter">(</span>argc > <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">"run"</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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"=== Starting to run"</span> << end<span class="Delimiter">();</span>
|
||||
<span id="L10" class="LineNr"> 10 </span> assert<span class="Delimiter">(</span>argc > <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 << 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> < <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> << <span class="Constant">"executed past end of the world: "</span> << <a href='010---vm.cc.html#L29'>EIP</a> << <span class="Constant">" vs "</span> << <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> << <span class="cSpecial">'\n'</span> << 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& 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 < <span class="Constant">0</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << filename<span class="Delimiter">.</span>c_str<span class="Delimiter">()</span> << <span class="Constant">": open"</span> << <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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><<span class="Normal">uint8_t</span>*><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> << <span class="Constant">"malloc("</span> << size << <span class="Constant">')'</span> << <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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> << <span class="Constant">"read → "</span> << size << <span class="Constant">" (!= "</span> << read_size << <span class="Constant">')'</span> << <a href='012elf.cc.html#L176'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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">"\177ELF"</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> << <span class="Constant">"Invalid ELF file; starts with \"" << magic << '"</span>' << <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> << <span class="Constant">"Only 32-bit ELF files (4-byte words; virtual addresses up to 4GB) supported.\n"</span> << <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> << <span class="Constant">"Only little-endian ELF files supported.\n"</span> << <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>&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> << <span class="Constant">"ELF type/machine 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << e_machine_type << <span class="Constant">" isn't i386 executable\n"</span> << 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>&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>&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>&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 < <span class="Constant">52</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; ELF header too small\n"</span> << <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>&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>&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">"load"</span><span class="Delimiter">)</span> << e_phnum << <span class="Constant">" entries in the program header, each "</span> << e_phentsize << <span class="Constant">" bytes long"</span> << 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<<span class="Normal">uint32_t</span>> 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 < 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 >= <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 <= 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 < <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 < <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> << <span class="Constant">"The stack overflowed its segment. "</span>
|
||||
<span id="L95" class="LineNr"> 95 </span> << <span class="Constant">"Maybe SPACE_FOR_SEGMENT should be larger? "</span>
|
||||
<span id="L96" class="LineNr"> 96 </span> << <span class="Constant">"Or you need to carve out an exception for the stack segment "</span>
|
||||
<span id="L97" class="LineNr"> 97 </span> << <span class="Constant">"to be larger.\n"</span> << <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"pushing value 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << val << 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<<span class="Normal">uint32_t</span>>& 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>&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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"program header at offset "</span> << offset << <span class="Constant">": type "</span> << p_type << 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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"ignoring segment at offset "</span> << offset << <span class="Constant">" of non PT_LOAD type "</span> << p_type << <span class="Constant">" (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)"</span> << 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>&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>&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 > p_vaddr<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; program header overlaps ELF header\n"</span> << <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>&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>&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> << <span class="Constant">"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"</span> << 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 > size<span class="Delimiter">)</span>
|
||||
<span id="L121" class="LineNr">121 </span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; segment at offset "</span> << offset << <span class="Constant">" is too large: wants to end at "</span> << p_offset+p_filesz << <span class="Constant">" but the file ends at "</span> << size << <span class="cSpecial">'\n'</span> << <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 >= <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> << <span class="Constant">"Code segment too small for SubX; for now please manually increase SEGMENT_ALIGNMENT.\n"</span> << 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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"blitting file offsets ("</span> << p_offset << <span class="Constant">", "</span> << <span class="Delimiter">(</span>p_offset+p_filesz<span class="Delimiter">)</span> << <span class="Constant">") to addresses ("</span> << p_vaddr << <span class="Constant">", "</span> << <span class="Delimiter">(</span>p_vaddr+p_memsz<span class="Delimiter">)</span> << <span class="Constant">')'</span> << end<span class="Delimiter">();</span>
|
||||
<span id="L127" class="LineNr">127 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size > 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 < 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> && <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="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 "End Includes")</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 -> 0x08047fff</span>
|
||||
<span id="L141" class="LineNr">141 </span><span class="Comment">// code: 0x09000000 -> 0x09ffffff (specified in ELF binary)</span>
|
||||
<span id="L142" class="LineNr">142 </span><span class="Comment">// data: 0x0a000000 -> 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 -> 0xbd000000 (downward; not in ELF binary)</span>
|
||||
<span id="L145" class="LineNr">145 </span><span class="Comment">// argv hack: 0xbf000000 -> 0xbfffffff (not in ELF binary)</span>
|
||||
<span id="L146" class="LineNr">146 </span><span class="Comment">// --- reserved for kernel: 0xc0000000 -> ...</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 "End Dump Info for Instruction")</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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"stack:"</span> << 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 > <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << a << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <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> << <span class="Constant">" <=== ESP"</span> << 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 > <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << a << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> << 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>] << <span class="Constant">8</span> | p[<span class="Constant">2</span>] << <span class="Constant">16</span> | p[<span class="Constant">3</span>] << <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>] << <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 "End Types")</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& <span class="Normal">operator</span><<<span class="Delimiter">(</span>ostream& 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 << <span class="Constant">": "</span> << 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 "End Includes")</span>
|
||||
<span id="L185" class="LineNr">185 </span><span class="PreProc">#include </span><span class="Constant"><sys/types.h></span>
|
||||
<span id="L186" class="LineNr">186 </span><span class="PreProc">#include </span><span class="Constant"><sys/stat.h></span>
|
||||
<span id="L187" class="LineNr">187 </span><span class="PreProc">#include </span><span class="Constant"><fcntl.h></span>
|
||||
<span id="L188" class="LineNr">188 </span><span class="PreProc">#include </span><span class="Constant"><stdarg.h></span>
|
||||
<span id="L189" class="LineNr">189 </span><span class="PreProc">#include </span><span class="Constant"><errno.h></span>
|
||||
<span id="L190" class="LineNr">190 </span><span class="PreProc">#include </span><span class="Constant"><unistd.h></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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"=== Starting to run"</span> << end<span class="Delimiter">();</span>
|
||||
<span id="L11" class="LineNr"> 11 </span> assert<span class="Delimiter">(</span>argc > <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 << 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> < <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> << <span class="Constant">"executed past end of the world: "</span> << <a href='010---vm.cc.html#L29'>EIP</a> << <span class="Constant">" vs "</span> << <span class="Special"><a href='010---vm.cc.html#L160'>End_of_program</a></span> << <span class="cSpecial">'\n'</span> << 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& 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 < <span class="Constant">0</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << filename<span class="Delimiter">.</span>c_str<span class="Delimiter">()</span> << <span class="Constant">": open"</span> << <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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><<span class="Normal">uint8_t</span>*><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> << <span class="Constant">"malloc("</span> << size << <span class="Constant">')'</span> << <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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> << <span class="Constant">"read → "</span> << size << <span class="Constant">" (!= "</span> << read_size << <span class="Constant">')'</span> << <a href='012elf.cc.html#L177'>perr</a><span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <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">"\177ELF"</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> << <span class="Constant">"Invalid ELF file; starts with \"" << magic << '"</span>' << <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> << <span class="Constant">"Only 32-bit ELF files (4-byte words; virtual addresses up to 4GB) supported.\n"</span> << <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> << <span class="Constant">"Only little-endian ELF files supported.\n"</span> << <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>&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> << <span class="Constant">"ELF type/machine 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << e_machine_type << <span class="Constant">" isn't i386 executable\n"</span> << 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>&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>&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>&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 < <span class="Constant">52</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; ELF header too small\n"</span> << <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>&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>&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">"load"</span><span class="Delimiter">)</span> << e_phnum << <span class="Constant">" entries in the program header, each "</span> << e_phentsize << <span class="Constant">" bytes long"</span> << 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<<span class="Normal">uint32_t</span>> 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 < 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 >= <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 <= 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 < <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 < <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> << <span class="Constant">"The stack overflowed its segment. "</span>
|
||||
<span id="L96" class="LineNr"> 96 </span> << <span class="Constant">"Maybe SPACE_FOR_SEGMENT should be larger? "</span>
|
||||
<span id="L97" class="LineNr"> 97 </span> << <span class="Constant">"Or you need to carve out an exception for the stack segment "</span>
|
||||
<span id="L98" class="LineNr"> 98 </span> << <span class="Constant">"to be larger.\n"</span> << <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"pushing value 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << val << 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<<span class="Normal">uint32_t</span>>& 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>&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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"program header at offset "</span> << offset << <span class="Constant">": type "</span> << p_type << 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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"ignoring segment at offset "</span> << offset << <span class="Constant">" of non PT_LOAD type "</span> << p_type << <span class="Constant">" (see <a href="http://refspecs.linuxbase.org/elf/elf.pdf">http://refspecs.linuxbase.org/elf/elf.pdf</a>)"</span> << 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>&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>&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 > p_vaddr<span class="Delimiter">)</span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; program header overlaps ELF header\n"</span> << <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>&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>&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> << <span class="Constant">"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"</span> << 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 > size<span class="Delimiter">)</span>
|
||||
<span id="L122" class="LineNr">122 </span> <a href='003trace.cc.html#L226'>raise</a> << <span class="Constant">"Invalid binary; segment at offset "</span> << offset << <span class="Constant">" is too large: wants to end at "</span> << p_offset+p_filesz << <span class="Constant">" but the file ends at "</span> << size << <span class="cSpecial">'\n'</span> << <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 >= <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> << <span class="Constant">"Code segment too small for SubX; for now please manually increase SEGMENT_ALIGNMENT.\n"</span> << 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">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"blitting file offsets ("</span> << p_offset << <span class="Constant">", "</span> << <span class="Delimiter">(</span>p_offset+p_filesz<span class="Delimiter">)</span> << <span class="Constant">") to addresses ("</span> << p_vaddr << <span class="Constant">", "</span> << <span class="Delimiter">(</span>p_vaddr+p_memsz<span class="Delimiter">)</span> << <span class="Constant">')'</span> << end<span class="Delimiter">();</span>
|
||||
<span id="L128" class="LineNr">128 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size > 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 < 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> && <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="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 "End Includes")</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 -> 0x08047fff</span>
|
||||
<span id="L142" class="LineNr">142 </span><span class="Comment">// code: 0x09000000 -> 0x09ffffff (specified in ELF binary)</span>
|
||||
<span id="L143" class="LineNr">143 </span><span class="Comment">// data: 0x0a000000 -> 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 -> 0xbd000000 (downward; not in ELF binary)</span>
|
||||
<span id="L146" class="LineNr">146 </span><span class="Comment">// argv hack: 0xbf000000 -> 0xbfffffff (not in ELF binary)</span>
|
||||
<span id="L147" class="LineNr">147 </span><span class="Comment">// --- reserved for kernel: 0xc0000000 -> ...</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 "End Dump Info for Instruction")</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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"stack:"</span> << 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 > <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << a << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <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> << <span class="Constant">" <=== ESP"</span> << 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 > <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">" 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << a << <span class="Constant">" => 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L175'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> << 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>] << <span class="Constant">8</span> | p[<span class="Constant">2</span>] << <span class="Constant">16</span> | p[<span class="Constant">3</span>] << <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>] << <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 "End Types")</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& <span class="Normal">operator</span><<<span class="Delimiter">(</span>ostream& 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 << <span class="Constant">": "</span> << 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 "End Includes")</span>
|
||||
<span id="L186" class="LineNr">186 </span><span class="PreProc">#include </span><span class="Constant"><sys/types.h></span>
|
||||
<span id="L187" class="LineNr">187 </span><span class="PreProc">#include </span><span class="Constant"><sys/stat.h></span>
|
||||
<span id="L188" class="LineNr">188 </span><span class="PreProc">#include </span><span class="Constant"><fcntl.h></span>
|
||||
<span id="L189" class="LineNr">189 </span><span class="PreProc">#include </span><span class="Constant"><stdarg.h></span>
|
||||
<span id="L190" class="LineNr">190 </span><span class="PreProc">#include </span><span class="Constant"><errno.h></span>
|
||||
<span id="L191" class="LineNr">191 </span><span class="PreProc">#include </span><span class="Constant"><unistd.h></span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1260,7 +1260,7 @@ if ('onhashchange' in window) {
|
|||
<span id="L1199" class="LineNr">1199 </span> <span class="Constant">" 53 \n"</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">"run: <a href='012elf.cc.html#L91'>push</a> EBX\n"</span>
|
||||
<span id="L1202" class="LineNr">1202 </span> <span class="Constant">"run: <a href='012elf.cc.html#L92'>push</a> EBX\n"</span>
|
||||
<span id="L1203" class="LineNr">1203 </span> <span class="Constant">"run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000004\n"</span>
|
||||
<span id="L1204" class="LineNr">1204 </span> <span class="Constant">"run: pushing value 0x0000000a\n"</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 & <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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"push "</span> << <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> << end<span class="Delimiter">();</span>
|
||||
<span id="L1219" class="LineNr">1219 </span><span class="CommentedCode">//? cerr << "push: " << NUM(reg) << ": " << Reg[reg].u << " => " << Reg[ESP].u << '\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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"popping value 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << result << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << 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 < <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 < <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>
|
||||
|
|
|
@ -829,7 +829,7 @@ if ('onhashchange' in window) {
|
|||
<span id="L770" class="LineNr"> 770 </span> <span class="Constant">"af 00 00 00\n"</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">"run: <a href='012elf.cc.html#L91'>push</a> r/m32\n"</span>
|
||||
<span id="L773" class="LineNr"> 773 </span> <span class="Constant">"run: <a href='012elf.cc.html#L92'>push</a> r/m32\n"</span>
|
||||
<span id="L774" class="LineNr"> 774 </span> <span class="Constant">"run: effective address is 0x00002000 (EAX)\n"</span>
|
||||
<span id="L775" class="LineNr"> 775 </span> <span class="Constant">"run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000010\n"</span>
|
||||
<span id="L776" class="LineNr"> 776 </span> <span class="Constant">"run: pushing value 0x000000af\n"</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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"push r/m32"</span> << 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>
|
||||
|
|
|
@ -1315,7 +1315,7 @@ if ('onhashchange' in window) {
|
|||
<span id="L1254" class="LineNr">1254 </span> <span class="Constant">" 68 af 00 00 00 \n"</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">"run: <a href='012elf.cc.html#L91'>push</a> imm32 0x000000af\n"</span>
|
||||
<span id="L1257" class="LineNr">1257 </span> <span class="Constant">"run: <a href='012elf.cc.html#L92'>push</a> imm32 0x000000af\n"</span>
|
||||
<span id="L1258" class="LineNr">1258 </span> <span class="Constant">"run: <a href='010---vm.cc.html#L17'>ESP</a> is now 0xbd000010\n"</span>
|
||||
<span id="L1259" class="LineNr">1259 </span> <span class="Constant">"run: <a href='003trace.cc.html#L117'>contents</a> at <a href='010---vm.cc.html#L17'>ESP</a>: 0x000000af\n"</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><<span class="Normal">uint32_t</span>><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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"push imm32 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << val << end<span class="Delimiter">();</span>
|
||||
<span id="L1267" class="LineNr">1267 </span><span class="CommentedCode">//? cerr << "push: " << val << " => " << Reg[ESP].u << '\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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"ESP is now 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"contents at <a href='010---vm.cc.html#L17'>ESP</a>: 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <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> << end<span class="Delimiter">();</span>
|
||||
<span id="L1271" class="LineNr">1271 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
|
||||
|
|
|
@ -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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"call imm32 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << offset << end<span class="Delimiter">();</span>
|
||||
<span id="L29" class="LineNr"> 29 </span><span class="CommentedCode">//? cerr << "push: EIP: " << EIP << " => " << Reg[ESP].u << '\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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L29'>EIP</a> << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"call to r/m32"</span> << 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">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << <a href='010---vm.cc.html#L29'>EIP</a> << end<span class="Delimiter">();</span>
|
||||
<span id="L65" class="LineNr"> 65 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
|
||||
|
|
|
@ -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 "End Globals")</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 > <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> & <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 <= <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 <= <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> << <span class="Constant">"Allocated too many segments; the VM ran out of memory. "</span>
|
||||
<span id="L118" class="LineNr">118 </span> << <span class="Constant">"Maybe <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a> can be smaller?\n"</span> << <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
|
||||
<span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span>
|
||||
|
|
|
@ -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 "End Main")</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">"translate"</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 < 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">"-o"</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 >= 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 << <span class="Constant">"'-o' must be followed by a filename to write results to\n"</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">"parse"</span><span class="Delimiter">)</span> << argv[i] << 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 << <span class="Constant">"could not open "</span> << argv[i] << <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 << <span class="Constant">"nothing to do; must provide at least one file to read\n"</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 << <span class="Constant">"must provide a filename to write to using '-o'\n"</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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"begin"</span> << 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">"translate"</span><span class="Delimiter">)</span> << <span class="Constant">"begin"</span> << 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 << <span class="Constant">"Usage: subx translate file1 file2 ... -o output\n"</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& p<span class="Delimiter">,</span> <span class="Normal">const</span> string& 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& p<span class="Delimiter">,</span> ostream& 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> << <span class="Constant">"no 'Entry' label found\n"</span> << 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">"data"</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> << <span class="Constant">"must include a 'data' segment\n"</span> << 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 < 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& out<span class="Delimiter">,</span> <span class="Normal">const</span> program& 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(&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"><</span><span class="Normal">const</span><span class="PreProc"> </span><span class="Normal">char</span><span class="PreProc">*>(&</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 < <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 < <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& 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 < <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">"code"</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">// "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." -- <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> << <span class="Constant">"segment starting at 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << p_start << <span class="Constant">" is improperly aligned; alignment for p_offset "</span> << p_offset << <span class="Constant">" should be "</span> << <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> << <span class="Constant">" but is "</span> << <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << 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& s<span class="Delimiter">,</span> ostream& 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 < <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<word>& 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 < <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><<span class="Normal">const</span> <span class="Normal">char</span>*><span class="Delimiter">(</span>&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& 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 < <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 "End Includes")</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 < 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">"-o"</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 >= 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 << <span class="Constant">"'-o' must be followed by a filename to write results to\n"</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">"parse"</span><span class="Delimiter">)</span> << argv[i] << 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 << <span class="Constant">"could not open "</span> << argv[i] << <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 << <span class="Constant">"nothing to do; must provide at least one file to read\n"</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 << <span class="Constant">"must provide a filename to write to using '-o'\n"</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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"begin"</span> << 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">"translate"</span><span class="Delimiter">)</span> << <span class="Constant">"begin"</span> << 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 << <span class="Constant">"Usage: subx translate file1 file2 ... -o output\n"</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& p<span class="Delimiter">,</span> <span class="Normal">const</span> string& 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& p<span class="Delimiter">,</span> ostream& 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> << <span class="Constant">"no 'Entry' label found\n"</span> << 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">"data"</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> << <span class="Constant">"must include a 'data' segment\n"</span> << 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 < 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& out<span class="Delimiter">,</span> <span class="Normal">const</span> program& 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(&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"><</span><span class="Normal">const</span><span class="PreProc"> </span><span class="Normal">char</span><span class="PreProc">*>(&</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 < <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 < <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& 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 < <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">"code"</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">// "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." -- <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> << <span class="Constant">"segment starting at 0x"</span> << <a href='010---vm.cc.html#L398'>HEXWORD</a> << p_start << <span class="Constant">" is improperly aligned; alignment for p_offset "</span> << p_offset << <span class="Constant">" should be "</span> << <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> << <span class="Constant">" but is "</span> << <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << 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& s<span class="Delimiter">,</span> ostream& 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 < <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<word>& 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 < <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><<span class="Normal">const</span> <span class="Normal">char</span>*><span class="Delimiter">(</span>&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& 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 < <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 "End Includes")</span>
|
||||
<span id="L213" class="LineNr">213 </span><span class="Normal">using</span> std::ios<span class="Delimiter">;</span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">"transform: -- move literal strings to data segment\n"</span>
|
||||
<span id="L14" class="LineNr"> 14 </span> <span class="Constant">"transform: adding global variable '__subx_global_1' containing \"</span>test\<span class="Constant">"\n"</span>
|
||||
<span id="L15" class="LineNr"> 15 </span> <span class="Constant">"transform: instruction after transform: 'b8 __subx_global_1'\n"</span>
|
||||
<span id="L15" class="LineNr"> 15 </span> <span class="Constant">"transform: <a href='011run.cc.html#L122'>line</a> after transform: 'b8 __subx_global_1'\n"</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 "Begin Transforms")</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 "End Globals")</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& 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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- move literal strings to data segment"</span> << 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& code = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">"code"</span><span class="Delimiter">);</span>
|
||||
<span id="L34" class="LineNr"> 34 </span> segment& data = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">"data"</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 < <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& 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 < <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& 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">'"'</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 << <span class="Constant">"__subx_global_"</span> << <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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction after transform: '"</span> << data_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << 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& <a href='011run.cc.html#L112'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word& value<span class="Delimiter">,</span> segment& 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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"adding global variable '"</span> << name << <span class="Constant">"' containing "</span> << value<span class="Delimiter">.</span>data << 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& 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 < <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">"a \"</span>abc def\<span class="Constant">" z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L77" class="LineNr"> 77 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>abc def\<span class="Constant">"\n"</span>
|
||||
<span id="L78" class="LineNr"> 78 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: z\n"</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">"parse2"</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 "End Line Parsing Special-cases(line_data -> l)")</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">'"'</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& line_data<span class="Delimiter">,</span> vector<line>& 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 && 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> << <span class="Constant">"parse_instruction_character_by_character: should receive only a single line\n"</span> << 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 >> 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">'"'</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 << 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 >> 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 >> 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 << <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">'"'</span><span class="Delimiter">)</span> d << <span class="Constant">'"'</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 << <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> << <span class="Constant">"parse_instruction_character_by_character: unknown escape sequence '\\"</span> << c << <span class="Constant">"'\n"</span> << 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 << 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">'"'</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> && <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 >> 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">""</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 << 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 << 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> && <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 >> c<span class="Delimiter">;</span>
|
||||
<span id="L156" class="LineNr">156 </span> w << 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">"parse2"</span><span class="Delimiter">)</span> << <span class="Constant">"word: "</span> << 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> << 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& 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> && 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& 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> && 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> && 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">":"</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& line_data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
|
||||
<span id="L189" class="LineNr">189 </span> vector<line> 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">"a . z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L199" class="LineNr">199 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">"parse2"</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">"a .b c\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L212" class="LineNr">212 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: .b\n"</span>
|
||||
<span id="L213" class="LineNr">213 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: c\n"</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">". a b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L223" class="LineNr">223 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">"a b .\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L234" class="LineNr">234 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">".a b c\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: .a\n"</span>
|
||||
<span id="L245" class="LineNr">245 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</span>
|
||||
<span id="L246" class="LineNr">246 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: c\n"</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">".a b/c d\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: .a\n"</span>
|
||||
<span id="L256" class="LineNr">256 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b /c\n"</span>
|
||||
<span id="L257" class="LineNr">257 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: d\n"</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">"a \"</span>bc def\<span class="Constant">"/disp32 g\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L267" class="LineNr">267 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc def\<span class="Constant">" /disp32\n"</span>
|
||||
<span id="L268" class="LineNr">268 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: g\n"</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">"a \"</span>bc def\<span class="Constant">"/disp32\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L278" class="LineNr">278 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc def\<span class="Constant">" /disp32\n"</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">"68/push \"</span>test\<span class="Constant">"/f"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: 68 /push\n"</span>
|
||||
<span id="L288" class="LineNr">288 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>test\<span class="Constant">" /f\n"</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 "End Reset")</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& 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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- move literal strings to data segment"</span> << 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<line> 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 < <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& 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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"segment '"</span> << seg<span class="Delimiter">.</span>name << <span class="Constant">"'"</span> << 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 < <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 << seg.name << '/' << i << '\n';</span>
|
||||
<span id="L41" class="LineNr"> 41 </span> line& <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 < <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& 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">'"'</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 << <span class="Constant">"__subx_global_"</span> << <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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"line after transform: '"</span> << data_to_string<span class="Delimiter">(</span>line<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << 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">"data"</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">-></span><a href='011run.cc.html#L114'>lines</a><span class="Delimiter">.</span>insert<span class="Delimiter">(</span>data<span class="Delimiter">-></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& <a href='011run.cc.html#L112'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word& value<span class="Delimiter">,</span> vector<line>& 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">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"adding global variable '"</span> << name << <span class="Constant">"' containing "</span> << value<span class="Delimiter">.</span>data << 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& 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 < <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">"a \"</span>abc def\<span class="Constant">" z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L86" class="LineNr"> 86 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>abc def\<span class="Constant">"\n"</span>
|
||||
<span id="L87" class="LineNr"> 87 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: z\n"</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">"parse2"</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">"== code 0x1\n"</span>
|
||||
<span id="L96" class="LineNr"> 96 </span> <span class="Constant">"b8/copy X/imm32\n"</span>
|
||||
<span id="L97" class="LineNr"> 97 </span> <span class="Constant">"== data 0x2000\n"</span>
|
||||
<span id="L98" class="LineNr"> 98 </span> <span class="Constant">"X:\n"</span>
|
||||
<span id="L99" class="LineNr"> 99 </span> <span class="Constant">"\"</span>test\<span class="Constant">"/imm32\n"</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">"transform: -- move literal strings to data segment\n"</span>
|
||||
<span id="L103" class="LineNr">103 </span> <span class="Constant">"transform: adding global variable '__subx_global_1' containing \"</span>test\<span class="Constant">"\n"</span>
|
||||
<span id="L104" class="LineNr">104 </span> <span class="Constant">"transform: <a href='011run.cc.html#L122'>line</a> after transform: '__subx_global_1'\n"</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 "End Line Parsing Special-cases(line_data -> l)")</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">'"'</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& line_data<span class="Delimiter">,</span> vector<line>& 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 && 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> << <span class="Constant">"parse_instruction_character_by_character: should receive only a single line\n"</span> << 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 >> 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">'"'</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 << 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 >> 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 >> 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 << <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">'"'</span><span class="Delimiter">)</span> d << <span class="Constant">'"'</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 << <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> << <span class="Constant">"parse_instruction_character_by_character: unknown escape sequence '\\"</span> << c << <span class="Constant">"'\n"</span> << 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 << 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">'"'</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> && <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 >> 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">""</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 << 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 << 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> && <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 >> c<span class="Delimiter">;</span>
|
||||
<span id="L181" class="LineNr">181 </span> w << 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">"parse2"</span><span class="Delimiter">)</span> << <span class="Constant">"word: "</span> << 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> << 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& 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> && 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& 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> && 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> && 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">":"</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& line_data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
|
||||
<span id="L214" class="LineNr">214 </span> vector<line> 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">"a . z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L224" class="LineNr">224 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: z\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">"parse2"</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">"a .b c\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L237" class="LineNr">237 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: .b\n"</span>
|
||||
<span id="L238" class="LineNr">238 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: c\n"</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">". a b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L248" class="LineNr">248 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">"a b .\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L259" class="LineNr">259 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: ."</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">".a b c\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: .a\n"</span>
|
||||
<span id="L270" class="LineNr">270 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b\n"</span>
|
||||
<span id="L271" class="LineNr">271 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: c\n"</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">".a b/c d\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: .a\n"</span>
|
||||
<span id="L281" class="LineNr">281 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: b /c\n"</span>
|
||||
<span id="L282" class="LineNr">282 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: d\n"</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">"a \"</span>bc def\<span class="Constant">"/disp32 g\n"</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">"a \"</span>bc/def\<span class="Constant">"/disp32\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc/def\<span class="Constant">" /disp32\n"</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">"\"</span>a\\\<span class="Constant">"b\"</span>\n<span class="Constant">" // 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"> "</span>parse2: <a href='011run.cc.html#L128'>word</a>: \<span class="Constant">"a\"</span>b\<span class="Constant">"\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L292" class="LineNr">292 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc def\<span class="Constant">" /disp32\n"</span>
|
||||
<span id="L293" class="LineNr">293 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: g\n"</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">"a \"</span>bc def\<span class="Constant">"/disp32\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: a\n"</span>
|
||||
<span id="L303" class="LineNr">303 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc def\<span class="Constant">" /disp32\n"</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">"68/push \"</span>test\<span class="Constant">"/f"</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">"parse2"</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">"\"</span>a\\\\b\<span class="Constant">"\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>a\\b\<span class="Constant">"\n"</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">"parse2"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: 68 /push\n"</span>
|
||||
<span id="L313" class="LineNr">313 </span> <span class="Constant">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>test\<span class="Constant">" /f\n"</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">"a \"</span>bc/def\<span class="Constant">"/disp32\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>bc/def\<span class="Constant">" /disp32\n"</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">"\"</span>a\\\<span class="Constant">"b\"</span>\n<span class="Constant">" // 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"> "</span>parse2: <a href='011run.cc.html#L128'>word</a>: \<span class="Constant">"a\"</span>b\<span class="Constant">"\n"</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">"parse2"</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">"\"</span>a\\\\b\<span class="Constant">"\n"</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">"parse2: <a href='011run.cc.html#L128'>word</a>: \"</span>a\\b\<span class="Constant">"\n"</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">"parse2"</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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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; }
|
||||
-->
|
||||
|
|
|
@ -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 -> <void></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->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->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->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->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->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->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">"F - test-stop-skips-returns-on-exit"</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->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">"F - test-stop-skips-returns-on-exit"</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: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 -> <void></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->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->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->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->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->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->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">"F - test-stop-skips-returns-on-exit"</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->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">"F - test-stop-skips-returns-on-exit"</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:nowrap:textwidth=0</span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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: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:nowrap:textwidth=0</span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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: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:nowrap:textwidth=0</span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">"F - test-parse-hex-int-negative"</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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
@ -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>
|
||||
|
||||
|
|
|
@ -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->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->end = EAX</span>
|
||||
|
|
|
@ -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; }
|
||||
-->
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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, "# comment 1\n")</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">"# comment 1\n"</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, " # comment 2 indented\n")</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">" # comment 2 indented\n"</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, "== code 0x09000000\n")</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">"== code 0x09000000\n"</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, "# comment 3 inside a segment\n")</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">"# comment 3 inside a segment\n"</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, "1\n")</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">"1\n"</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, "\n") # 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">"\n"</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, "2 3 # comment 4 inline with other contents\n")</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">"2 3 # comment 4 inline with other contents\n"</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, "== data 0x0a000000\n")</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">"== data 0x0a000000\n"</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, "4 5/imm32\n")</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">"4 5/imm32\n"</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, "== code\n")</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">"== code\n"</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, "6 7\n")</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">"6 7\n"</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, "8 9\n")</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">"8 9\n"</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, "== code\n")</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">"== code\n"</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, "10 11\n")</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">"10 11\n"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/0"</span>/imm32
|
||||
<span id="L381" class="LineNr">381 </span> 68/push <span class="Constant">"== code 0x09000000"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/1"</span>/imm32
|
||||
<span id="L390" class="LineNr">390 </span> 68/push <span class="Constant">"1"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/2"</span>/imm32
|
||||
<span id="L399" class="LineNr">399 </span> 68/push <span class="Constant">"2 3 # comment 4 inline with other contents"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/3"</span>/imm32
|
||||
<span id="L408" class="LineNr">408 </span> 68/push <span class="Constant">"6 7"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/4"</span>/imm32
|
||||
<span id="L417" class="LineNr">417 </span> 68/push <span class="Constant">"8 9"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/5"</span>/imm32
|
||||
<span id="L426" class="LineNr">426 </span> 68/push <span class="Constant">"10 11"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/6"</span>/imm32
|
||||
<span id="L435" class="LineNr">435 </span> 68/push <span class="Constant">"== data 0x0a000000"</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">"F - <a href='assort.subx.html#L157'>test-convert</a>/7"</span>/imm32
|
||||
<span id="L444" class="LineNr">444 </span> 68/push <span class="Constant">"4 5/imm32"</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>
|
||||
|
|
|
@ -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">"F - test-get-num-reads-single-digit"</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:nowrap:textwidth=0</span>
|
||||
<span id="L562" class="LineNr">562 </span><span class="subxS2Comment"># . . vim:nowrap:textwidth=0</span>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -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">"F - test-get-num-reads-single-digit"</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">"F - test-get-num-reads-multiple-digits"</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">"F - test-get-num-reads-multiple-digits-followed-by-nondigit"</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:nowrap:textwidth=0</span>
|
||||
<span id="L762" class="LineNr">762 </span><span class="subxS2Comment"># . . vim: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
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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:nowrap:textwidth=0</span>
|
||||
<span id="L1483" class="LineNr">1483 </span><span class="subxS2Comment"># . . vim: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
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue