about summary refs log blame commit diff stats
path: root/034check_operand_bounds.cc
blob: 72a66e3f99c2d60de2bb379cb55a3c77f7dc981a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12

                                                                                              


                                  
                     





                                                         



                                    








                                        
                             
                                     

                            
                                       

                                    
       
                                                
                                                              

                                                

                                                                  




                                                                                     
                                                                                                    
                                                     
                                                                                                                    

                                  







                                                                                                              




                                                                                                     
     
   
 


                                           
                     







                                                                                  
                     








                                                                                   
                     







                                                                                   
                     









                                                                                   
                     







                                                                                 
                     









                                                                                 
                     







                                                                                  
                     





                                                                                  
//:: Check that the different operands of an instruction aren't too large for their bitfields.

void test_check_bitfield_sizes() {
  Hide_errors = true;
  run(
      "== code 0x1\n"
      "01/add 4/mod 3/rm32 1/r32\n"  // add ECX to EBX
  );
  CHECK_TRACE_CONTENTS(
      "error: '4/mod' too large to fit in bitfield mod\n"
  );
}

:(before "End Globals")
map<string, uint32_t> Operand_bound;
:(before "End One-time Setup")
put_new(Operand_bound, "subop", 1<<3);
put_new(Operand_bound, "mod", 1<<2);
put_new(Operand_bound, "rm32", 1<<3);
put_new(Operand_bound, "base", 1<<3);
put_new(Operand_bound, "index", 1<<3);
put_new(Operand_bound, "scale", 1<<2);
put_new(Operand_bound, "r32", 1<<3);
put_new(Operand_bound, "disp8", 1<<8);
put_new(Operand_bound, "disp16", 1<<16);
// no bound needed for disp32
put_new(Operand_bound, "imm8", 1<<8);
// no bound needed for imm32

:(before "Pack Operands(segment code)")
check_operand_bounds(code);
if (trace_contains_errors()) return;
:(code)
void check_operand_bounds(const segment& code) {
  trace(3, "transform") << "-- check operand bounds" << end();
  for (int i = 0;  i < SIZE(code.lines);  ++i) {
    const line& inst = code.lines.at(i);
    for (int j = first_operand(inst);  j < SIZE(inst.words);  ++j)
      check_operand_bounds(inst.words.at(j));
    if (trace_contains_errors()) return;  // stop at the first mal-formed instruction
  }
}

void check_operand_bounds(const word& w) {
  for (map<string, uint32_t>::iterator p = Operand_bound.begin();  p != Operand_bound.end();  ++p) {
    if (!has_operand_metadata(w, p->first)) continue;
    if (!looks_like_hex_int(w.data)) continue;  // later transforms are on their own to do their own bounds checking
    int32_t x = parse_int(w.data);
    if (x >= 0) {
      if (p->first == "disp8" || p->first == "disp16") {
        if (static_cast<uint32_t>(x) >= p->second/2)
          raise << "'" << w.original << "' too large to fit in signed bitfield " << p->first << '\n' << end();
      }
      else {
        if (static_cast<uint32_t>(x) >= p->second)
          raise << "'" << w.original << "' too large to fit in bitfield " << p->first << '\n' << end();
      }
    }
    else {
      // hacky? assuming bound is a power of 2
      if (x < -1*static_cast<int32_t>(p->second/2))
        raise << "'" << w.original << "' too large to fit in bitfield " << p->first << '\n' << end();
    }
  }
}

void test_check_bitfield_sizes_for_imm8() {
  run(
      "== code 0x1\n"
      "c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX 0xff/imm8"  // shift EBX left
  );
  CHECK(!trace_contains_errors());
}

void test_check_bitfield_sizes_for_imm8_error() {
  Hide_errors = true;
  run(
      "== code 0x1\n"
      "c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX 0x100/imm8"  // shift EBX left
  );
  CHECK_TRACE_CONTENTS(
      "error: '0x100/imm8' too large to fit in bitfield imm8\n"
  );
}

void test_check_bitfield_sizes_for_negative_imm8() {
  run(
      "== code 0x1\n"
      "c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX -0x80/imm8"  // shift EBX left
  );
  CHECK(!trace_contains_errors());
}

void test_check_bitfield_sizes_for_negative_imm8_error() {
  Hide_errors = true;
  run(
      "== code 0x1\n"
      "c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX -0x81/imm8"  // shift EBX left
  );
  CHECK_TRACE_CONTENTS(
      "error: '-0x81/imm8' too large to fit in bitfield imm8\n"
  );
}

void test_check_bitfield_sizes_for_disp8() {
  // not bothering to run
  transform(
      "== code 0x1\n"
      "01/add 1/mod/*+disp8 3/rm32 1/r32 0x7f/disp8\n"  // add ECX to *(EBX+0x7f)
  );
  CHECK(!trace_contains_errors());
}

void test_check_bitfield_sizes_for_disp8_error() {
  Hide_errors = true;
  run(
      "== code 0x1\n"
      "01/add 1/mod/*+disp8 3/rm32 1/r32 0x80/disp8\n"  // add ECX to *(EBX+0x80)
  );
  CHECK_TRACE_CONTENTS(
      "error: '0x80/disp8' too large to fit in signed bitfield disp8\n"
  );
}

void test_check_bitfield_sizes_for_negative_disp8() {
  // not bothering to run
  transform(
      "== code 0x1\n"
      "01/add 1/mod/*+disp8 3/rm32 1/r32 -0x80/disp8\n"  // add ECX to *(EBX-0x80)
  );
  CHECK(!trace_contains_errors());
}

void test_check_bitfield_sizes_for_negative_disp8_error() {
  Hide_errors = true;
  run(
      "== code 0x1\n"
      "01/add 1/mod/*+disp8 3/rm32 1/r32 -0x81/disp8\n"  // add ECX to *(EBX-0x81)
  );
  CHECK_TRACE_CONTENTS(
      "error: '-0x81/disp8' too large to fit in bitfield disp8\n"
  );
}
a> 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 124next-token.subx</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxTest { color: #5f8700; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/124next-token.subx'>https://github.com/akkartik/mu/blob/master/124next-token.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">   1 </span><span class="subxComment"># Some tokenization primitives.</span>
<span id="L2" class="LineNr">   2 </span>
<span id="L3" class="LineNr">   3 </span>== code
<span id="L4" class="LineNr">   4 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L5" class="LineNr">   5 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L6" class="LineNr">   6 </span><span class="subxS1Comment"># . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes</span>
<span id="L7" class="LineNr">   7 </span>
<span id="L8" class="LineNr">   8 </span><span class="subxComment"># extract the next run of characters that are different from a given 'delimiter' (skipping multiple delimiters if necessary)</span>
<span id="L9" class="LineNr">   9 </span><span class="subxComment"># on reaching end of file, return an empty interval</span>
<span id="L10" class="LineNr">  10 </span><span class="subxFunction">next-token</span>:  <span class="subxComment"># in: (addr stream byte), delimiter: byte, out: (addr slice)</span>
<span id="L11" class="LineNr">  11 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L12" class="LineNr">  12 </span>    55/push-ebp
<span id="L13" class="LineNr">  13 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L14" class="LineNr">  14 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L15" class="LineNr">  15 </span>    50/push-eax
<span id="L16" class="LineNr">  16 </span>    51/push-ecx
<span id="L17" class="LineNr">  17 </span>    56/push-esi
<span id="L18" class="LineNr">  18 </span>    57/push-edi
<span id="L19" class="LineNr">  19 </span>    <span class="subxComment"># esi = in</span>
<span id="L20" class="LineNr">  20 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L21" class="LineNr">  21 </span>    <span class="subxComment"># edi = out</span>
<span id="L22" class="LineNr">  22 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to edi</span>
<span id="L23" class="LineNr">  23 </span>    <span class="subxComment"># skip-chars-matching(in, delimiter)</span>
<span id="L24" class="LineNr">  24 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L25" class="LineNr">  25 </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="L26" class="LineNr">  26 </span>    56/push-esi
<span id="L27" class="LineNr">  27 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L28" class="LineNr">  28 </span>    e8/call  <a href='124next-token.subx.html#L341'>skip-chars-matching</a>/disp32
<span id="L29" class="LineNr">  29 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L30" class="LineNr">  30 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L31" class="LineNr">  31 </span>    <span class="subxComment"># out-&gt;start = &amp;in-&gt;data[in-&gt;read]</span>
<span id="L32" class="LineNr">  32 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L33" class="LineNr">  33 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L34" class="LineNr">  34 </span>    89/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *edi</span>
<span id="L35" class="LineNr">  35 </span>    <span class="subxComment"># skip-chars-not-matching(in, delimiter)</span>
<span id="L36" class="LineNr">  36 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L37" class="LineNr">  37 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L38" class="LineNr">  38 </span>    56/push-esi
<span id="L39" class="LineNr">  39 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L40" class="LineNr">  40 </span>    e8/call  <a href='124next-token.subx.html#L554'>skip-chars-not-matching</a>/disp32
<span id="L41" class="LineNr">  41 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L42" class="LineNr">  42 </span>    81          0/subop/add         3/mod/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="L43" class="LineNr">  43 </span>    <span class="subxComment"># out-&gt;end = &amp;in-&gt;data[in-&gt;read]</span>
<span id="L44" class="LineNr">  44 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L45" class="LineNr">  45 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L46" class="LineNr">  46 </span>    89/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(edi+4)</span>
<span id="L47" class="LineNr">  47 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L48" class="LineNr">  48 </span>    5f/pop-to-edi
<span id="L49" class="LineNr">  49 </span>    5e/pop-to-esi
<span id="L50" class="LineNr">  50 </span>    59/pop-to-ecx
<span id="L51" class="LineNr">  51 </span>    58/pop-to-eax
<span id="L52" class="LineNr">  52 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L53" class="LineNr">  53 </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="L54" class="LineNr">  54 </span>    5d/pop-to-ebp
<span id="L55" class="LineNr">  55 </span>    c3/return
<span id="L56" class="LineNr">  56 </span>
<span id="L57" class="LineNr">  57 </span><span class="subxTest">test-next-token</span>:
<span id="L58" class="LineNr">  58 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L59" class="LineNr">  59 </span>    55/push-ebp
<span id="L60" class="LineNr">  60 </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="L61" class="LineNr">  61 </span>    <span class="subxComment"># setup</span>
<span id="L62" class="LineNr">  62 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L63" class="LineNr">  63 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L64" class="LineNr">  64 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L65" class="LineNr">  65 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L66" class="LineNr">  66 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L67" class="LineNr">  67 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L68" class="LineNr">  68 </span>    81          0/subop/add         3/mod/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="L69" class="LineNr">  69 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L70" class="LineNr">  70 </span>    68/push  0/imm32/end
<span id="L71" class="LineNr">  71 </span>    68/push  0/imm32/start
<span id="L72" class="LineNr">  72 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L73" class="LineNr">  73 </span>    <span class="subxComment"># write(_test-stream, &quot;  ab&quot;)</span>
<span id="L74" class="LineNr">  74 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L75" class="LineNr">  75 </span>    68/push  <span class="Constant">&quot;  ab&quot;</span>/imm32
<span id="L76" class="LineNr">  76 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L77" class="LineNr">  77 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L78" class="LineNr">  78 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L79" class="LineNr">  79 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L80" class="LineNr">  80 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L81" class="LineNr">  81 </span>    <span class="subxComment"># next-token(_test-stream, 0x20/space, slice)</span>
<span id="L82" class="LineNr">  82 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L83" class="LineNr">  83 </span>    51/push-ecx
<span id="L84" class="LineNr">  84 </span>    68/push  0x20/imm32
<span id="L85" class="LineNr">  85 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L86" class="LineNr">  86 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L87" class="LineNr">  87 </span>    e8/call  <a href='124next-token.subx.html#L10'>next-token</a>/disp32
<span id="L88" class="LineNr">  88 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L89" class="LineNr">  89 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L90" class="LineNr">  90 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-stream-&gt;data, 2, msg)</span>
<span id="L91" class="LineNr">  91 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-stream, 14, msg)</span>
<span id="L92" class="LineNr">  92 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L93" class="LineNr">  93 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L57'>test-next-token</a>: start&quot;</span>/imm32
<span id="L94" class="LineNr">  94 </span>    68/push  0xe/imm32
<span id="L95" class="LineNr">  95 </span>    <span class="subxS2Comment"># . . push slice-&gt;start - _test-stream</span>
<span id="L96" class="LineNr">  96 </span>    8b/copy                         0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *ecx to eax</span>
<span id="L97" class="LineNr">  97 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L98" class="LineNr">  98 </span>    50/push-eax
<span id="L99" class="LineNr">  99 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L100" class="LineNr"> 100 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L101" class="LineNr"> 101 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L102" class="LineNr"> 102 </span>    81          0/subop/add         3/mod/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="L103" class="LineNr"> 103 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-stream-&gt;data, 4, msg)</span>
<span id="L104" class="LineNr"> 104 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-stream, 16, msg)</span>
<span id="L105" class="LineNr"> 105 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L106" class="LineNr"> 106 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L57'>test-next-token</a>: end&quot;</span>/imm32
<span id="L107" class="LineNr"> 107 </span>    68/push  0x10/imm32
<span id="L108" class="LineNr"> 108 </span>    <span class="subxS2Comment"># . . push slice-&gt;end - _test-stream</span>
<span id="L109" class="LineNr"> 109 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to eax</span>
<span id="L110" class="LineNr"> 110 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L111" class="LineNr"> 111 </span>    50/push-eax
<span id="L112" class="LineNr"> 112 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L113" class="LineNr"> 113 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L114" class="LineNr"> 114 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L115" class="LineNr"> 115 </span>    81          0/subop/add         3/mod/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="L116" class="LineNr"> 116 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L117" class="LineNr"> 117 </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="L118" class="LineNr"> 118 </span>    5d/pop-to-ebp
<span id="L119" class="LineNr"> 119 </span>    c3/return
<span id="L120" class="LineNr"> 120 </span>
<span id="L121" class="LineNr"> 121 </span><span class="subxTest">test-next-token-Eof</span>:
<span id="L122" class="LineNr"> 122 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L123" class="LineNr"> 123 </span>    55/push-ebp
<span id="L124" class="LineNr"> 124 </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="L125" class="LineNr"> 125 </span>    <span class="subxComment"># setup</span>
<span id="L126" class="LineNr"> 126 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L127" class="LineNr"> 127 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr"> 128 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L129" class="LineNr"> 129 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L130" class="LineNr"> 130 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L131" class="LineNr"> 131 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L132" class="LineNr"> 132 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L133" class="LineNr"> 133 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L134" class="LineNr"> 134 </span>    68/push  0/imm32/end
<span id="L135" class="LineNr"> 135 </span>    68/push  0/imm32/start
<span id="L136" class="LineNr"> 136 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L137" class="LineNr"> 137 </span>    <span class="subxComment"># write nothing to _test-stream</span>
<span id="L138" class="LineNr"> 138 </span>    <span class="subxComment"># next-token(_test-stream, 0x20/space, slice)</span>
<span id="L139" class="LineNr"> 139 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L140" class="LineNr"> 140 </span>    51/push-ecx
<span id="L141" class="LineNr"> 141 </span>    68/push  0x20/imm32
<span id="L142" class="LineNr"> 142 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L143" class="LineNr"> 143 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L144" class="LineNr"> 144 </span>    e8/call  <a href='124next-token.subx.html#L10'>next-token</a>/disp32
<span id="L145" class="LineNr"> 145 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L146" class="LineNr"> 146 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L147" class="LineNr"> 147 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end, slice-&gt;start, msg)</span>
<span id="L148" class="LineNr"> 148 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L149" class="LineNr"> 149 </span>    68/push  <span class="Constant">&quot;F - test-next-token-Eof&quot;</span>/imm32
<span id="L150" class="LineNr"> 150 </span>    ff          6/subop/push        1/mod/*+disp8   1/rm32/ecx   <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 *(ecx+4)</span>
<span id="L151" class="LineNr"> 151 </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="L152" class="LineNr"> 152 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L153" class="LineNr"> 153 </span>    e8/call  <a href='102test.subx.html#L23'>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"># . epilogue</span>
<span id="L157" class="LineNr"> 157 </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="L158" class="LineNr"> 158 </span>    5d/pop-to-ebp
<span id="L159" class="LineNr"> 159 </span>    c3/return
<span id="L160" class="LineNr"> 160 </span>
<span id="L161" class="LineNr"> 161 </span><span class="subxComment"># extract the next run of characters that are different from a given 'delimiter' (skipping multiple delimiters if necessary)</span>
<span id="L162" class="LineNr"> 162 </span><span class="subxComment"># on reaching end of file, return an empty interval</span>
<span id="L163" class="LineNr"> 163 </span><span class="subxFunction">next-token-from-slice</span>:  <span class="subxComment"># start: (addr byte), end: (addr byte), delimiter: byte, out: (addr slice)</span>
<span id="L164" class="LineNr"> 164 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L165" class="LineNr"> 165 </span>    55/push-ebp
<span id="L166" class="LineNr"> 166 </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="L167" class="LineNr"> 167 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L168" class="LineNr"> 168 </span>    50/push-eax
<span id="L169" class="LineNr"> 169 </span>    51/push-ecx
<span id="L170" class="LineNr"> 170 </span>    52/push-edx
<span id="L171" class="LineNr"> 171 </span>    57/push-edi
<span id="L172" class="LineNr"> 172 </span>    <span class="subxComment"># ecx = end</span>
<span id="L173" class="LineNr"> 173 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L174" class="LineNr"> 174 </span>    <span class="subxComment"># edx = delimiter</span>
<span id="L175" class="LineNr"> 175 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to edx</span>
<span id="L176" class="LineNr"> 176 </span>    <span class="subxComment"># edi = out</span>
<span id="L177" class="LineNr"> 177 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+20) to edi</span>
<span id="L178" class="LineNr"> 178 </span>    <span class="subxComment"># eax = skip-chars-matching-in-slice(start, end, delimiter)</span>
<span id="L179" class="LineNr"> 179 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L180" class="LineNr"> 180 </span>    52/push-edx
<span id="L181" class="LineNr"> 181 </span>    51/push-ecx
<span id="L182" class="LineNr"> 182 </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="L183" class="LineNr"> 183 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L184" class="LineNr"> 184 </span>    e8/call  <a href='124next-token.subx.html#L804'>skip-chars-matching-in-slice</a>/disp32
<span id="L185" class="LineNr"> 185 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L186" class="LineNr"> 186 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L187" class="LineNr"> 187 </span>    <span class="subxComment"># out-&gt;start = eax</span>
<span id="L188" class="LineNr"> 188 </span>    89/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *edi</span>
<span id="L189" class="LineNr"> 189 </span>    <span class="subxComment"># eax = skip-chars-not-matching-in-slice(eax, end, delimiter)</span>
<span id="L190" class="LineNr"> 190 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L191" class="LineNr"> 191 </span>    52/push-edx
<span id="L192" class="LineNr"> 192 </span>    51/push-ecx
<span id="L193" class="LineNr"> 193 </span>    50/push-eax
<span id="L194" class="LineNr"> 194 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L195" class="LineNr"> 195 </span>    e8/call  <a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L196" class="LineNr"> 196 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L197" class="LineNr"> 197 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L198" class="LineNr"> 198 </span>    <span class="subxComment"># out-&gt;end = eax</span>
<span id="L199" class="LineNr"> 199 </span>    89/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(edi+4)</span>
<span id="L200" class="LineNr"> 200 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L201" class="LineNr"> 201 </span>    5f/pop-to-edi
<span id="L202" class="LineNr"> 202 </span>    5a/pop-to-edx
<span id="L203" class="LineNr"> 203 </span>    59/pop-to-ecx
<span id="L204" class="LineNr"> 204 </span>    58/pop-to-eax
<span id="L205" class="LineNr"> 205 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L206" class="LineNr"> 206 </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="L207" class="LineNr"> 207 </span>    5d/pop-to-ebp
<span id="L208" class="LineNr"> 208 </span>    c3/return
<span id="L209" class="LineNr"> 209 </span>
<span id="L210" class="LineNr"> 210 </span><span class="subxTest">test-next-token-from-slice</span>:
<span id="L211" class="LineNr"> 211 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L212" class="LineNr"> 212 </span>    55/push-ebp
<span id="L213" class="LineNr"> 213 </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="L214" class="LineNr"> 214 </span>    <span class="subxComment"># (eax..ecx) = &quot;  ab&quot;</span>
<span id="L215" class="LineNr"> 215 </span>    b8/copy-to-eax  <span class="Constant">&quot;  ab&quot;</span>/imm32
<span id="L216" class="LineNr"> 216 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L217" class="LineNr"> 217 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L218" class="LineNr"> 218 </span>    05/add-to-eax  4/imm32
<span id="L219" class="LineNr"> 219 </span>    <span class="subxComment"># var out/edi: slice</span>
<span id="L220" class="LineNr"> 220 </span>    68/push  0/imm32/end
<span id="L221" class="LineNr"> 221 </span>    68/push  0/imm32/start
<span id="L222" class="LineNr"> 222 </span>    89/copy                         3/mod/direct    7/rm32/edi   <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 edi</span>
<span id="L223" class="LineNr"> 223 </span>    <span class="subxComment"># next-token-from-slice(eax, ecx, 0x20/space, out)</span>
<span id="L224" class="LineNr"> 224 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L225" class="LineNr"> 225 </span>    57/push-edi
<span id="L226" class="LineNr"> 226 </span>    68/push  0x20/imm32
<span id="L227" class="LineNr"> 227 </span>    51/push-ecx
<span id="L228" class="LineNr"> 228 </span>    50/push-eax
<span id="L229" class="LineNr"> 229 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L230" class="LineNr"> 230 </span>    e8/call  <a href='124next-token.subx.html#L163'>next-token-from-slice</a>/disp32
<span id="L231" class="LineNr"> 231 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L232" class="LineNr"> 232 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L233" class="LineNr"> 233 </span>    <span class="subxComment"># out-&gt;start should be at the 'a'</span>
<span id="L234" class="LineNr"> 234 </span>    <span class="subxS1Comment"># . check-ints-equal(out-&gt;start - in-&gt;start, 2, msg)</span>
<span id="L235" class="LineNr"> 235 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L236" class="LineNr"> 236 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L210'>test-next-token-from-slice</a>: start&quot;</span>/imm32
<span id="L237" class="LineNr"> 237 </span>    68/push  2/imm32
<span id="L238" class="LineNr"> 238 </span>    <span class="subxS2Comment"># . . push out-&gt;start - in-&gt;start</span>
<span id="L239" class="LineNr"> 239 </span>    8b/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to ecx</span>
<span id="L240" class="LineNr"> 240 </span>    2b/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L241" class="LineNr"> 241 </span>    51/push-ecx
<span id="L242" class="LineNr"> 242 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L243" class="LineNr"> 243 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L244" class="LineNr"> 244 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L245" class="LineNr"> 245 </span>    81          0/subop/add         3/mod/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="L246" class="LineNr"> 246 </span>    <span class="subxComment"># out-&gt;end should be after the 'b'</span>
<span id="L247" class="LineNr"> 247 </span>    <span class="subxComment"># check-ints-equal(out-&gt;end - in-&gt;start, 4, msg)</span>
<span id="L248" class="LineNr"> 248 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L249" class="LineNr"> 249 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L210'>test-next-token-from-slice</a>: end&quot;</span>/imm32
<span id="L250" class="LineNr"> 250 </span>    68/push  4/imm32
<span id="L251" class="LineNr"> 251 </span>    <span class="subxS2Comment"># . . push out-&gt;end - in-&gt;start</span>
<span id="L252" class="LineNr"> 252 </span>    8b/copy                         1/mod/*+disp8   7/rm32/edi   <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 *(edi+4) to ecx</span>
<span id="L253" class="LineNr"> 253 </span>    2b/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L254" class="LineNr"> 254 </span>    51/push-ecx
<span id="L255" class="LineNr"> 255 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L256" class="LineNr"> 256 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L257" class="LineNr"> 257 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L258" class="LineNr"> 258 </span>    81          0/subop/add         3/mod/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="L259" class="LineNr"> 259 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L260" class="LineNr"> 260 </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="L261" class="LineNr"> 261 </span>    5d/pop-to-ebp
<span id="L262" class="LineNr"> 262 </span>    c3/return
<span id="L263" class="LineNr"> 263 </span>
<span id="L264" class="LineNr"> 264 </span><span class="subxTest">test-next-token-from-slice-Eof</span>:
<span id="L265" class="LineNr"> 265 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L266" class="LineNr"> 266 </span>    55/push-ebp
<span id="L267" class="LineNr"> 267 </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="L268" class="LineNr"> 268 </span>    <span class="subxComment"># var out/edi: slice</span>
<span id="L269" class="LineNr"> 269 </span>    68/push  0/imm32/end
<span id="L270" class="LineNr"> 270 </span>    68/push  0/imm32/start
<span id="L271" class="LineNr"> 271 </span>    89/copy                         3/mod/direct    7/rm32/edi   <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 edi</span>
<span id="L272" class="LineNr"> 272 </span>    <span class="subxComment"># next-token-from-slice(0, 0, 0x20/space, out)</span>
<span id="L273" class="LineNr"> 273 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L274" class="LineNr"> 274 </span>    57/push-edi
<span id="L275" class="LineNr"> 275 </span>    68/push  0x20/imm32
<span id="L276" class="LineNr"> 276 </span>    68/push  0/imm32
<span id="L277" class="LineNr"> 277 </span>    68/push  0/imm32
<span id="L278" class="LineNr"> 278 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L279" class="LineNr"> 279 </span>    e8/call  <a href='124next-token.subx.html#L163'>next-token-from-slice</a>/disp32
<span id="L280" class="LineNr"> 280 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L281" class="LineNr"> 281 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L282" class="LineNr"> 282 </span>    <span class="subxComment"># out should be empty</span>
<span id="L283" class="LineNr"> 283 </span>    <span class="subxS1Comment"># . check-ints-equal(out-&gt;end - out-&gt;start, 0, msg)</span>
<span id="L284" class="LineNr"> 284 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L285" class="LineNr"> 285 </span>    68/push  <span class="Constant">&quot;F - test-next-token-from-slice-Eof&quot;</span>/imm32
<span id="L286" class="LineNr"> 286 </span>    68/push  0/imm32
<span id="L287" class="LineNr"> 287 </span>    <span class="subxS2Comment"># . . push out-&gt;start - in-&gt;start</span>
<span id="L288" class="LineNr"> 288 </span>    8b/copy                         1/mod/*+disp8   7/rm32/edi   <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 *(edi+4) to ecx</span>
<span id="L289" class="LineNr"> 289 </span>    2b/subtract                     0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *edi from ecx</span>
<span id="L290" class="LineNr"> 290 </span>    51/push-ecx
<span id="L291" class="LineNr"> 291 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L292" class="LineNr"> 292 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L293" class="LineNr"> 293 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L294" class="LineNr"> 294 </span>    81          0/subop/add         3/mod/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="L295" class="LineNr"> 295 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L296" class="LineNr"> 296 </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="L297" class="LineNr"> 297 </span>    5d/pop-to-ebp
<span id="L298" class="LineNr"> 298 </span>    c3/return
<span id="L299" class="LineNr"> 299 </span>
<span id="L300" class="LineNr"> 300 </span><span class="subxTest">test-next-token-from-slice-nothing</span>:
<span id="L301" class="LineNr"> 301 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L302" class="LineNr"> 302 </span>    55/push-ebp
<span id="L303" class="LineNr"> 303 </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="L304" class="LineNr"> 304 </span>    <span class="subxComment"># (eax..ecx) = &quot;    &quot;</span>
<span id="L305" class="LineNr"> 305 </span>    b8/copy-to-eax  <span class="Constant">&quot;    &quot;</span>/imm32
<span id="L306" class="LineNr"> 306 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L307" class="LineNr"> 307 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L308" class="LineNr"> 308 </span>    05/add-to-eax  4/imm32
<span id="L309" class="LineNr"> 309 </span>    <span class="subxComment"># var out/edi: slice</span>
<span id="L310" class="LineNr"> 310 </span>    68/push  0/imm32/end
<span id="L311" class="LineNr"> 311 </span>    68/push  0/imm32/start
<span id="L312" class="LineNr"> 312 </span>    89/copy                         3/mod/direct    7/rm32/edi   <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 edi</span>
<span id="L313" class="LineNr"> 313 </span>    <span class="subxComment"># next-token-from-slice(in, 0x20/space, out)</span>
<span id="L314" class="LineNr"> 314 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L315" class="LineNr"> 315 </span>    57/push-edi
<span id="L316" class="LineNr"> 316 </span>    68/push  0x20/imm32
<span id="L317" class="LineNr"> 317 </span>    51/push-ecx
<span id="L318" class="LineNr"> 318 </span>    50/push-eax
<span id="L319" class="LineNr"> 319 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L320" class="LineNr"> 320 </span>    e8/call  <a href='124next-token.subx.html#L163'>next-token-from-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>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L323" class="LineNr"> 323 </span>    <span class="subxComment"># out should be empty</span>
<span id="L324" class="LineNr"> 324 </span>    <span class="subxS1Comment"># . check-ints-equal(out-&gt;end - out-&gt;start, 0, msg)</span>
<span id="L325" class="LineNr"> 325 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L326" class="LineNr"> 326 </span>    68/push  <span class="Constant">&quot;F - test-next-token-from-slice-Eof&quot;</span>/imm32
<span id="L327" class="LineNr"> 327 </span>    68/push  0/imm32
<span id="L328" class="LineNr"> 328 </span>    <span class="subxS2Comment"># . . push out-&gt;start - in-&gt;start</span>
<span id="L329" class="LineNr"> 329 </span>    8b/copy                         1/mod/*+disp8   7/rm32/edi   <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 *(edi+4) to ecx</span>
<span id="L330" class="LineNr"> 330 </span>    2b/subtract                     0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *edi from ecx</span>
<span id="L331" class="LineNr"> 331 </span>    51/push-ecx
<span id="L332" class="LineNr"> 332 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L333" class="LineNr"> 333 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L334" class="LineNr"> 334 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L335" class="LineNr"> 335 </span>    81          0/subop/add         3/mod/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="L336" class="LineNr"> 336 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L337" class="LineNr"> 337 </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="L338" class="LineNr"> 338 </span>    5d/pop-to-ebp
<span id="L339" class="LineNr"> 339 </span>    c3/return
<span id="L340" class="LineNr"> 340 </span>
<span id="L341" class="LineNr"> 341 </span><span class="subxFunction">skip-chars-matching</span>:  <span class="subxComment"># in: (addr stream byte), delimiter: byte</span>
<span id="L342" class="LineNr"> 342 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L343" class="LineNr"> 343 </span>    55/push-ebp
<span id="L344" class="LineNr"> 344 </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="L345" class="LineNr"> 345 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L346" class="LineNr"> 346 </span>    50/push-eax
<span id="L347" class="LineNr"> 347 </span>    51/push-ecx
<span id="L348" class="LineNr"> 348 </span>    52/push-edx
<span id="L349" class="LineNr"> 349 </span>    53/push-ebx
<span id="L350" class="LineNr"> 350 </span>    56/push-esi
<span id="L351" class="LineNr"> 351 </span>    <span class="subxComment"># esi = in</span>
<span id="L352" class="LineNr"> 352 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L353" class="LineNr"> 353 </span>    <span class="subxComment"># ecx = in-&gt;read</span>
<span id="L354" class="LineNr"> 354 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L355" class="LineNr"> 355 </span>    <span class="subxComment"># ebx = in-&gt;write</span>
<span id="L356" class="LineNr"> 356 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ebx</span>
<span id="L357" class="LineNr"> 357 </span>    <span class="subxComment"># edx = delimiter</span>
<span id="L358" class="LineNr"> 358 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to edx</span>
<span id="L359" class="LineNr"> 359 </span><span class="Constant">$skip-chars-matching:loop</span>:
<span id="L360" class="LineNr"> 360 </span>    <span class="subxComment"># if (in-&gt;read &gt;= in-&gt;write) break</span>
<span id="L361" class="LineNr"> 361 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with ebx</span>
<span id="L362" class="LineNr"> 362 </span>    7d/jump-if-&gt;=  $skip-chars-matching:end/disp8
<span id="L363" class="LineNr"> 363 </span>    <span class="subxComment"># eax = in-&gt;data[in-&gt;read]</span>
<span id="L364" class="LineNr"> 364 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L365" class="LineNr"> 365 </span>    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *(esi+ecx+12) to AL</span>
<span id="L366" class="LineNr"> 366 </span>    <span class="subxComment"># if (eax != delimiter) break</span>
<span id="L367" class="LineNr"> 367 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax and edx</span>
<span id="L368" class="LineNr"> 368 </span>    75/jump-if-!=  $skip-chars-matching:end/disp8
<span id="L369" class="LineNr"> 369 </span>    <span class="subxComment"># ++in-&gt;read</span>
<span id="L370" class="LineNr"> 370 </span>    41/increment-ecx
<span id="L371" class="LineNr"> 371 </span>    eb/jump  $skip-chars-matching:<span class="Constant">loop</span>/disp8
<span id="L372" class="LineNr"> 372 </span><span class="Constant">$skip-chars-matching:end</span>:
<span id="L373" class="LineNr"> 373 </span>    <span class="subxComment"># persist in-&gt;read</span>
<span id="L374" class="LineNr"> 374 </span>    89/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *(esi+4)</span>
<span id="L375" class="LineNr"> 375 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L376" class="LineNr"> 376 </span>    5e/pop-to-esi
<span id="L377" class="LineNr"> 377 </span>    5b/pop-to-ebx
<span id="L378" class="LineNr"> 378 </span>    5a/pop-to-edx
<span id="L379" class="LineNr"> 379 </span>    59/pop-to-ecx
<span id="L380" class="LineNr"> 380 </span>    58/pop-to-eax
<span id="L381" class="LineNr"> 381 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L382" class="LineNr"> 382 </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="L383" class="LineNr"> 383 </span>    5d/pop-to-ebp
<span id="L384" class="LineNr"> 384 </span>    c3/return
<span id="L385" class="LineNr"> 385 </span>
<span id="L386" class="LineNr"> 386 </span><span class="subxTest">test-skip-chars-matching</span>:
<span id="L387" class="LineNr"> 387 </span>    <span class="subxComment"># setup</span>
<span id="L388" class="LineNr"> 388 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L389" class="LineNr"> 389 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L390" class="LineNr"> 390 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L391" class="LineNr"> 391 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L392" class="LineNr"> 392 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L393" class="LineNr"> 393 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L394" class="LineNr"> 394 </span>    81          0/subop/add         3/mod/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="L395" class="LineNr"> 395 </span>    <span class="subxComment"># write(_test-stream, &quot;  ab&quot;)</span>
<span id="L396" class="LineNr"> 396 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L397" class="LineNr"> 397 </span>    68/push  <span class="Constant">&quot;  ab&quot;</span>/imm32
<span id="L398" class="LineNr"> 398 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L399" class="LineNr"> 399 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L400" class="LineNr"> 400 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L401" class="LineNr"> 401 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L402" class="LineNr"> 402 </span>    81          0/subop/add         3/mod/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="L403" class="LineNr"> 403 </span>    <span class="subxComment"># skip-chars-matching(_test-stream, 0x20/space)</span>
<span id="L404" class="LineNr"> 404 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L405" class="LineNr"> 405 </span>    68/push  0x20/imm32
<span id="L406" class="LineNr"> 406 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L407" class="LineNr"> 407 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L408" class="LineNr"> 408 </span>    e8/call  <a href='124next-token.subx.html#L341'>skip-chars-matching</a>/disp32
<span id="L409" class="LineNr"> 409 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L410" class="LineNr"> 410 </span>    81          0/subop/add         3/mod/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="L411" class="LineNr"> 411 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 2, msg)</span>
<span id="L412" class="LineNr"> 412 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L413" class="LineNr"> 413 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching&quot;</span>/imm32
<span id="L414" class="LineNr"> 414 </span>    68/push  2/imm32
<span id="L415" class="LineNr"> 415 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L416" class="LineNr"> 416 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L417" class="LineNr"> 417 </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="L418" class="LineNr"> 418 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L419" class="LineNr"> 419 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L420" class="LineNr"> 420 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L421" class="LineNr"> 421 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L422" class="LineNr"> 422 </span>    <span class="subxComment"># end</span>
<span id="L423" class="LineNr"> 423 </span>    c3/return
<span id="L424" class="LineNr"> 424 </span>
<span id="L425" class="LineNr"> 425 </span><span class="subxTest">test-skip-chars-matching-none</span>:
<span id="L426" class="LineNr"> 426 </span>    <span class="subxComment"># setup</span>
<span id="L427" class="LineNr"> 427 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L428" class="LineNr"> 428 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L429" class="LineNr"> 429 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L430" class="LineNr"> 430 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L431" class="LineNr"> 431 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L432" class="LineNr"> 432 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L433" class="LineNr"> 433 </span>    81          0/subop/add         3/mod/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="L434" class="LineNr"> 434 </span>    <span class="subxComment"># write(_test-stream, &quot;ab&quot;)</span>
<span id="L435" class="LineNr"> 435 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L436" class="LineNr"> 436 </span>    68/push  <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L437" class="LineNr"> 437 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L438" class="LineNr"> 438 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L439" class="LineNr"> 439 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L440" class="LineNr"> 440 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L441" class="LineNr"> 441 </span>    81          0/subop/add         3/mod/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="L442" class="LineNr"> 442 </span>    <span class="subxComment"># skip-chars-matching(_test-stream, 0x20/space)</span>
<span id="L443" class="LineNr"> 443 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L444" class="LineNr"> 444 </span>    68/push  0x20/imm32
<span id="L445" class="LineNr"> 445 </span>    68/push  <a href='108write.subx.html#L151'>_test-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='124next-token.subx.html#L341'>skip-chars-matching</a>/disp32
<span id="L448" class="LineNr"> 448 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L449" class="LineNr"> 449 </span>    81          0/subop/add         3/mod/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="L450" class="LineNr"> 450 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 0, msg)</span>
<span id="L451" class="LineNr"> 451 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L452" class="LineNr"> 452 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching-none&quot;</span>/imm32
<span id="L453" class="LineNr"> 453 </span>    68/push  0/imm32
<span id="L454" class="LineNr"> 454 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L455" class="LineNr"> 455 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L456" class="LineNr"> 456 </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="L457" class="LineNr"> 457 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L458" class="LineNr"> 458 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L459" class="LineNr"> 459 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L460" class="LineNr"> 460 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L461" class="LineNr"> 461 </span>    <span class="subxComment"># end</span>
<span id="L462" class="LineNr"> 462 </span>    c3/return
<span id="L463" class="LineNr"> 463 </span>
<span id="L464" class="LineNr"> 464 </span><span class="subxFunction">skip-chars-matching-whitespace</span>:  <span class="subxComment"># in: (addr stream byte)</span>
<span id="L465" class="LineNr"> 465 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L466" class="LineNr"> 466 </span>    55/push-ebp
<span id="L467" class="LineNr"> 467 </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="L468" class="LineNr"> 468 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L469" class="LineNr"> 469 </span>    50/push-eax
<span id="L470" class="LineNr"> 470 </span>    51/push-ecx
<span id="L471" class="LineNr"> 471 </span>    53/push-ebx
<span id="L472" class="LineNr"> 472 </span>    56/push-esi
<span id="L473" class="LineNr"> 473 </span>    <span class="subxComment"># esi = in</span>
<span id="L474" class="LineNr"> 474 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L475" class="LineNr"> 475 </span>    <span class="subxComment"># ecx = in-&gt;read</span>
<span id="L476" class="LineNr"> 476 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L477" class="LineNr"> 477 </span>    <span class="subxComment"># ebx = in-&gt;write</span>
<span id="L478" class="LineNr"> 478 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ebx</span>
<span id="L479" class="LineNr"> 479 </span><span class="Constant">$skip-chars-matching-whitespace:loop</span>:
<span id="L480" class="LineNr"> 480 </span>    <span class="subxComment"># if (in-&gt;read &gt;= in-&gt;write) break</span>
<span id="L481" class="LineNr"> 481 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with ebx</span>
<span id="L482" class="LineNr"> 482 </span>    7d/jump-if-&gt;=  $skip-chars-matching-whitespace:end/disp8
<span id="L483" class="LineNr"> 483 </span>    <span class="subxComment"># eax = in-&gt;data[in-&gt;read]</span>
<span id="L484" class="LineNr"> 484 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L485" class="LineNr"> 485 </span>    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *(esi+ecx+12) to AL</span>
<span id="L486" class="LineNr"> 486 </span>    <span class="subxComment"># if (eax == ' ') goto body</span>
<span id="L487" class="LineNr"> 487 </span>    3d/compare-eax-and  0x20/imm32/space
<span id="L488" class="LineNr"> 488 </span>    74/jump-if-=  $skip-chars-matching-whitespace:body/disp8
<span id="L489" class="LineNr"> 489 </span>    <span class="subxComment"># if (eax == '\n') goto body</span>
<span id="L490" class="LineNr"> 490 </span>    3d/compare-eax-and  0x0a/imm32/newline
<span id="L491" class="LineNr"> 491 </span>    74/jump-if-=  $skip-chars-matching-whitespace:body/disp8
<span id="L492" class="LineNr"> 492 </span>    <span class="subxComment"># if (eax == '\t') goto body</span>
<span id="L493" class="LineNr"> 493 </span>    3d/compare-eax-and  0x09/imm32/tab
<span id="L494" class="LineNr"> 494 </span>    74/jump-if-=  $skip-chars-matching-whitespace:body/disp8
<span id="L495" class="LineNr"> 495 </span>    <span class="subxComment"># if (eax != '\r') break</span>
<span id="L496" class="LineNr"> 496 </span>    3d/compare-eax-and  0x0d/imm32/cr
<span id="L497" class="LineNr"> 497 </span>    75/jump-if-!=  $skip-chars-matching-whitespace:end/disp8
<span id="L498" class="LineNr"> 498 </span><span class="Constant">$skip-chars-matching-whitespace:body</span>:
<span id="L499" class="LineNr"> 499 </span>    <span class="subxComment"># ++in-&gt;read</span>
<span id="L500" class="LineNr"> 500 </span>    41/increment-ecx
<span id="L501" class="LineNr"> 501 </span>    eb/jump  $skip-chars-matching-whitespace:<span class="Constant">loop</span>/disp8
<span id="L502" class="LineNr"> 502 </span><span class="Constant">$skip-chars-matching-whitespace:end</span>:
<span id="L503" class="LineNr"> 503 </span>    <span class="subxComment"># persist in-&gt;read</span>
<span id="L504" class="LineNr"> 504 </span>    89/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *(esi+4)</span>
<span id="L505" class="LineNr"> 505 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L506" class="LineNr"> 506 </span>    5e/pop-to-esi
<span id="L507" class="LineNr"> 507 </span>    5b/pop-to-ebx
<span id="L508" class="LineNr"> 508 </span>    59/pop-to-ecx
<span id="L509" class="LineNr"> 509 </span>    58/pop-to-eax
<span id="L510" class="LineNr"> 510 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L511" class="LineNr"> 511 </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="L512" class="LineNr"> 512 </span>    5d/pop-to-ebp
<span id="L513" class="LineNr"> 513 </span>    c3/return
<span id="L514" class="LineNr"> 514 </span>
<span id="L515" class="LineNr"> 515 </span><span class="subxTest">test-skip-chars-matching-whitespace</span>:
<span id="L516" class="LineNr"> 516 </span>    <span class="subxComment"># setup</span>
<span id="L517" class="LineNr"> 517 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L518" class="LineNr"> 518 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L519" class="LineNr"> 519 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L520" class="LineNr"> 520 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L521" class="LineNr"> 521 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L522" class="LineNr"> 522 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L523" class="LineNr"> 523 </span>    81          0/subop/add         3/mod/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="L524" class="LineNr"> 524 </span>    <span class="subxComment"># write(_test-stream, &quot; \nab&quot;)</span>
<span id="L525" class="LineNr"> 525 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L526" class="LineNr"> 526 </span>    68/push  <span class="Constant">&quot; \nab&quot;</span>/imm32
<span id="L527" class="LineNr"> 527 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L528" class="LineNr"> 528 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L529" class="LineNr"> 529 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L530" class="LineNr"> 530 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L531" class="LineNr"> 531 </span>    81          0/subop/add         3/mod/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="L532" class="LineNr"> 532 </span>    <span class="subxComment"># skip-chars-matching-whitespace(_test-stream)</span>
<span id="L533" class="LineNr"> 533 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L534" class="LineNr"> 534 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L535" class="LineNr"> 535 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L536" class="LineNr"> 536 </span>    e8/call  <a href='124next-token.subx.html#L464'>skip-chars-matching-whitespace</a>/disp32
<span id="L537" class="LineNr"> 537 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L538" class="LineNr"> 538 </span>    81          0/subop/add         3/mod/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="L539" class="LineNr"> 539 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 2, msg)</span>
<span id="L540" class="LineNr"> 540 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L541" class="LineNr"> 541 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching-whitespace&quot;</span>/imm32
<span id="L542" class="LineNr"> 542 </span>    68/push  2/imm32
<span id="L543" class="LineNr"> 543 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L544" class="LineNr"> 544 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L545" class="LineNr"> 545 </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="L546" class="LineNr"> 546 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L547" class="LineNr"> 547 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L548" class="LineNr"> 548 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L549" class="LineNr"> 549 </span>    81          0/subop/add         3/mod/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="L550" class="LineNr"> 550 </span>    <span class="subxComment"># end</span>
<span id="L551" class="LineNr"> 551 </span>    c3/return
<span id="L552" class="LineNr"> 552 </span>
<span id="L553" class="LineNr"> 553 </span><span class="subxComment"># minor fork of 'skip-chars-matching'</span>
<span id="L554" class="LineNr"> 554 </span><span class="subxFunction">skip-chars-not-matching</span>:  <span class="subxComment"># in: (addr stream byte), delimiter: byte</span>
<span id="L555" class="LineNr"> 555 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L556" class="LineNr"> 556 </span>    55/push-ebp
<span id="L557" class="LineNr"> 557 </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="L558" class="LineNr"> 558 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L559" class="LineNr"> 559 </span>    50/push-eax
<span id="L560" class="LineNr"> 560 </span>    51/push-ecx
<span id="L561" class="LineNr"> 561 </span>    52/push-edx
<span id="L562" class="LineNr"> 562 </span>    53/push-ebx
<span id="L563" class="LineNr"> 563 </span>    56/push-esi
<span id="L564" class="LineNr"> 564 </span>    <span class="subxComment"># esi = in</span>
<span id="L565" class="LineNr"> 565 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L566" class="LineNr"> 566 </span>    <span class="subxComment"># ecx = in-&gt;read</span>
<span id="L567" class="LineNr"> 567 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L568" class="LineNr"> 568 </span>    <span class="subxComment"># ebx = in-&gt;write</span>
<span id="L569" class="LineNr"> 569 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ebx</span>
<span id="L570" class="LineNr"> 570 </span>    <span class="subxComment"># edx = delimiter</span>
<span id="L571" class="LineNr"> 571 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to edx</span>
<span id="L572" class="LineNr"> 572 </span><span class="Constant">$skip-chars-not-matching:loop</span>:
<span id="L573" class="LineNr"> 573 </span>    <span class="subxComment"># if (in-&gt;read &gt;= in-&gt;write) break</span>
<span id="L574" class="LineNr"> 574 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with ebx</span>
<span id="L575" class="LineNr"> 575 </span>    7d/jump-if-&gt;=  $skip-chars-not-matching:end/disp8
<span id="L576" class="LineNr"> 576 </span>    <span class="subxComment"># eax = in-&gt;data[in-&gt;read]</span>
<span id="L577" class="LineNr"> 577 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L578" class="LineNr"> 578 </span>    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *(esi+ecx+12) to AL</span>
<span id="L579" class="LineNr"> 579 </span>    <span class="subxComment"># if (eax == delimiter) break</span>
<span id="L580" class="LineNr"> 580 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax and edx</span>
<span id="L581" class="LineNr"> 581 </span>    74/jump-if-=  $skip-chars-not-matching:end/disp8
<span id="L582" class="LineNr"> 582 </span>    <span class="subxComment"># ++in-&gt;read</span>
<span id="L583" class="LineNr"> 583 </span>    41/increment-ecx
<span id="L584" class="LineNr"> 584 </span>    eb/jump  $skip-chars-not-matching:<span class="Constant">loop</span>/disp8
<span id="L585" class="LineNr"> 585 </span><span class="Constant">$skip-chars-not-matching:end</span>:
<span id="L586" class="LineNr"> 586 </span>    <span class="subxComment"># persist in-&gt;read</span>
<span id="L587" class="LineNr"> 587 </span>    89/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *(esi+4)</span>
<span id="L588" class="LineNr"> 588 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L589" class="LineNr"> 589 </span>    5e/pop-to-esi
<span id="L590" class="LineNr"> 590 </span>    5b/pop-to-ebx
<span id="L591" class="LineNr"> 591 </span>    5a/pop-to-edx
<span id="L592" class="LineNr"> 592 </span>    59/pop-to-ecx
<span id="L593" class="LineNr"> 593 </span>    58/pop-to-eax
<span id="L594" class="LineNr"> 594 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L595" class="LineNr"> 595 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L596" class="LineNr"> 596 </span>    5d/pop-to-ebp
<span id="L597" class="LineNr"> 597 </span>    c3/return
<span id="L598" class="LineNr"> 598 </span>
<span id="L599" class="LineNr"> 599 </span><span class="subxTest">test-skip-chars-not-matching</span>:
<span id="L600" class="LineNr"> 600 </span>    <span class="subxComment"># setup</span>
<span id="L601" class="LineNr"> 601 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L602" class="LineNr"> 602 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L603" class="LineNr"> 603 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L604" class="LineNr"> 604 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L605" class="LineNr"> 605 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L606" class="LineNr"> 606 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L607" class="LineNr"> 607 </span>    81          0/subop/add         3/mod/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="L608" class="LineNr"> 608 </span>    <span class="subxComment"># write(_test-stream, &quot;ab &quot;)</span>
<span id="L609" class="LineNr"> 609 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L610" class="LineNr"> 610 </span>    68/push  <span class="Constant">&quot;ab &quot;</span>/imm32
<span id="L611" class="LineNr"> 611 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L612" class="LineNr"> 612 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L613" class="LineNr"> 613 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L614" class="LineNr"> 614 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L615" class="LineNr"> 615 </span>    81          0/subop/add         3/mod/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="L616" class="LineNr"> 616 </span>    <span class="subxComment"># skip-chars-not-matching(_test-stream, 0x20/space)</span>
<span id="L617" class="LineNr"> 617 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L618" class="LineNr"> 618 </span>    68/push  0x20/imm32
<span id="L619" class="LineNr"> 619 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L620" class="LineNr"> 620 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L621" class="LineNr"> 621 </span>    e8/call  <a href='124next-token.subx.html#L554'>skip-chars-not-matching</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>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L624" class="LineNr"> 624 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 2, msg)</span>
<span id="L625" class="LineNr"> 625 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L626" class="LineNr"> 626 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching&quot;</span>/imm32
<span id="L627" class="LineNr"> 627 </span>    68/push  2/imm32
<span id="L628" class="LineNr"> 628 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L629" class="LineNr"> 629 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L630" class="LineNr"> 630 </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="L631" class="LineNr"> 631 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L632" class="LineNr"> 632 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</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>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L635" class="LineNr"> 635 </span>    <span class="subxComment"># end</span>
<span id="L636" class="LineNr"> 636 </span>    c3/return
<span id="L637" class="LineNr"> 637 </span>
<span id="L638" class="LineNr"> 638 </span><span class="subxTest">test-skip-chars-not-matching-none</span>:
<span id="L639" class="LineNr"> 639 </span>    <span class="subxComment"># setup</span>
<span id="L640" class="LineNr"> 640 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L641" class="LineNr"> 641 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L642" class="LineNr"> 642 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L643" class="LineNr"> 643 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L644" class="LineNr"> 644 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L645" class="LineNr"> 645 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L646" class="LineNr"> 646 </span>    81          0/subop/add         3/mod/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="L647" class="LineNr"> 647 </span>    <span class="subxComment"># write(_test-stream, &quot; ab&quot;)</span>
<span id="L648" class="LineNr"> 648 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L649" class="LineNr"> 649 </span>    68/push  <span class="Constant">&quot; ab&quot;</span>/imm32
<span id="L650" class="LineNr"> 650 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L651" class="LineNr"> 651 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L652" class="LineNr"> 652 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L653" class="LineNr"> 653 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L654" class="LineNr"> 654 </span>    81          0/subop/add         3/mod/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="L655" class="LineNr"> 655 </span>    <span class="subxComment"># skip-chars-not-matching(_test-stream, 0x20/space)</span>
<span id="L656" class="LineNr"> 656 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L657" class="LineNr"> 657 </span>    68/push  0x20/imm32
<span id="L658" class="LineNr"> 658 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L659" class="LineNr"> 659 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L660" class="LineNr"> 660 </span>    e8/call  <a href='124next-token.subx.html#L554'>skip-chars-not-matching</a>/disp32
<span id="L661" class="LineNr"> 661 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L662" class="LineNr"> 662 </span>    81          0/subop/add         3/mod/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="L663" class="LineNr"> 663 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 0, msg)</span>
<span id="L664" class="LineNr"> 664 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L665" class="LineNr"> 665 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-none&quot;</span>/imm32
<span id="L666" class="LineNr"> 666 </span>    68/push  0/imm32
<span id="L667" class="LineNr"> 667 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L668" class="LineNr"> 668 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L669" class="LineNr"> 669 </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="L670" class="LineNr"> 670 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L671" class="LineNr"> 671 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L672" class="LineNr"> 672 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L673" class="LineNr"> 673 </span>    81          0/subop/add         3/mod/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="L674" class="LineNr"> 674 </span>    <span class="subxComment"># end</span>
<span id="L675" class="LineNr"> 675 </span>    c3/return
<span id="L676" class="LineNr"> 676 </span>
<span id="L677" class="LineNr"> 677 </span><span class="subxTest">test-skip-chars-not-matching-all</span>:
<span id="L678" class="LineNr"> 678 </span>    <span class="subxComment"># setup</span>
<span id="L679" class="LineNr"> 679 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L680" class="LineNr"> 680 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L681" class="LineNr"> 681 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L682" class="LineNr"> 682 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L683" class="LineNr"> 683 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L684" class="LineNr"> 684 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L685" class="LineNr"> 685 </span>    81          0/subop/add         3/mod/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="L686" class="LineNr"> 686 </span>    <span class="subxComment"># write(_test-stream, &quot;ab&quot;)</span>
<span id="L687" class="LineNr"> 687 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L688" class="LineNr"> 688 </span>    68/push  <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L689" class="LineNr"> 689 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L690" class="LineNr"> 690 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L691" class="LineNr"> 691 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L692" class="LineNr"> 692 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L693" class="LineNr"> 693 </span>    81          0/subop/add         3/mod/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="L694" class="LineNr"> 694 </span>    <span class="subxComment"># skip-chars-not-matching(_test-stream, 0x20/space)</span>
<span id="L695" class="LineNr"> 695 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L696" class="LineNr"> 696 </span>    68/push  0x20/imm32
<span id="L697" class="LineNr"> 697 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L698" class="LineNr"> 698 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L699" class="LineNr"> 699 </span>    e8/call  <a href='124next-token.subx.html#L554'>skip-chars-not-matching</a>/disp32
<span id="L700" class="LineNr"> 700 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L701" class="LineNr"> 701 </span>    81          0/subop/add         3/mod/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="L702" class="LineNr"> 702 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 2, msg)</span>
<span id="L703" class="LineNr"> 703 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L704" class="LineNr"> 704 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-all&quot;</span>/imm32
<span id="L705" class="LineNr"> 705 </span>    68/push  2/imm32
<span id="L706" class="LineNr"> 706 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L707" class="LineNr"> 707 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L708" class="LineNr"> 708 </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="L709" class="LineNr"> 709 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L710" class="LineNr"> 710 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L711" class="LineNr"> 711 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L712" class="LineNr"> 712 </span>    81          0/subop/add         3/mod/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="L713" class="LineNr"> 713 </span>    <span class="subxComment"># end</span>
<span id="L714" class="LineNr"> 714 </span>    c3/return
<span id="L715" class="LineNr"> 715 </span>
<span id="L716" class="LineNr"> 716 </span><span class="subxFunction">skip-chars-not-matching-whitespace</span>:  <span class="subxComment"># in: (addr stream byte)</span>
<span id="L717" class="LineNr"> 717 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L718" class="LineNr"> 718 </span>    55/push-ebp
<span id="L719" class="LineNr"> 719 </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="L720" class="LineNr"> 720 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L721" class="LineNr"> 721 </span>    50/push-eax
<span id="L722" class="LineNr"> 722 </span>    51/push-ecx
<span id="L723" class="LineNr"> 723 </span>    53/push-ebx
<span id="L724" class="LineNr"> 724 </span>    56/push-esi
<span id="L725" class="LineNr"> 725 </span>    <span class="subxComment"># esi = in</span>
<span id="L726" class="LineNr"> 726 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L727" class="LineNr"> 727 </span>    <span class="subxComment"># ecx = in-&gt;read</span>
<span id="L728" class="LineNr"> 728 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L729" class="LineNr"> 729 </span>    <span class="subxComment"># ebx = in-&gt;write</span>
<span id="L730" class="LineNr"> 730 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ebx</span>
<span id="L731" class="LineNr"> 731 </span><span class="Constant">$skip-chars-not-matching-whitespace:loop</span>:
<span id="L732" class="LineNr"> 732 </span>    <span class="subxComment"># if (in-&gt;read &gt;= in-&gt;write) break</span>
<span id="L733" class="LineNr"> 733 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with ebx</span>
<span id="L734" class="LineNr"> 734 </span>    7d/jump-if-&gt;=  $skip-chars-not-matching-whitespace:end/disp8
<span id="L735" class="LineNr"> 735 </span>    <span class="subxComment"># eax = in-&gt;data[in-&gt;read]</span>
<span id="L736" class="LineNr"> 736 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L737" class="LineNr"> 737 </span>    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *(esi+ecx+12) to AL</span>
<span id="L738" class="LineNr"> 738 </span>    <span class="subxComment"># if (eax == ' ') break</span>
<span id="L739" class="LineNr"> 739 </span>    3d/compare-eax-and  0x20/imm32/space
<span id="L740" class="LineNr"> 740 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace:end/disp8
<span id="L741" class="LineNr"> 741 </span>    <span class="subxComment"># if (eax == '\n') break</span>
<span id="L742" class="LineNr"> 742 </span>    3d/compare-eax-and  0x0a/imm32/newline
<span id="L743" class="LineNr"> 743 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace:end/disp8
<span id="L744" class="LineNr"> 744 </span>    <span class="subxComment"># if (eax == '\t') break</span>
<span id="L745" class="LineNr"> 745 </span>    3d/compare-eax-and  0x09/imm32/tab
<span id="L746" class="LineNr"> 746 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace:end/disp8
<span id="L747" class="LineNr"> 747 </span>    <span class="subxComment"># if (eax == '\r') break</span>
<span id="L748" class="LineNr"> 748 </span>    3d/compare-eax-and  0x0d/imm32/cr
<span id="L749" class="LineNr"> 749 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace:end/disp8
<span id="L750" class="LineNr"> 750 </span>    <span class="subxComment"># ++in-&gt;read</span>
<span id="L751" class="LineNr"> 751 </span>    41/increment-ecx
<span id="L752" class="LineNr"> 752 </span>    eb/jump  $skip-chars-not-matching-whitespace:<span class="Constant">loop</span>/disp8
<span id="L753" class="LineNr"> 753 </span><span class="Constant">$skip-chars-not-matching-whitespace:end</span>:
<span id="L754" class="LineNr"> 754 </span>    <span class="subxComment"># persist in-&gt;read</span>
<span id="L755" class="LineNr"> 755 </span>    89/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *(esi+4)</span>
<span id="L756" class="LineNr"> 756 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L757" class="LineNr"> 757 </span>    5e/pop-to-esi
<span id="L758" class="LineNr"> 758 </span>    5b/pop-to-ebx
<span id="L759" class="LineNr"> 759 </span>    59/pop-to-ecx
<span id="L760" class="LineNr"> 760 </span>    58/pop-to-eax
<span id="L761" class="LineNr"> 761 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L762" class="LineNr"> 762 </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="L763" class="LineNr"> 763 </span>    5d/pop-to-ebp
<span id="L764" class="LineNr"> 764 </span>    c3/return
<span id="L765" class="LineNr"> 765 </span>
<span id="L766" class="LineNr"> 766 </span><span class="subxTest">test-skip-chars-not-matching-whitespace</span>:
<span id="L767" class="LineNr"> 767 </span>    <span class="subxComment"># setup</span>
<span id="L768" class="LineNr"> 768 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L769" class="LineNr"> 769 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L770" class="LineNr"> 770 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L771" class="LineNr"> 771 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L772" class="LineNr"> 772 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L773" class="LineNr"> 773 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L774" class="LineNr"> 774 </span>    81          0/subop/add         3/mod/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="L775" class="LineNr"> 775 </span>    <span class="subxComment"># write(_test-stream, &quot;ab\n&quot;)</span>
<span id="L776" class="LineNr"> 776 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L777" class="LineNr"> 777 </span>    68/push  <span class="Constant">&quot;ab\n&quot;</span>/imm32
<span id="L778" class="LineNr"> 778 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L779" class="LineNr"> 779 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L780" class="LineNr"> 780 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L781" class="LineNr"> 781 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L782" class="LineNr"> 782 </span>    81          0/subop/add         3/mod/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="L783" class="LineNr"> 783 </span>    <span class="subxComment"># skip-chars-not-matching-whitespace(_test-stream)</span>
<span id="L784" class="LineNr"> 784 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L785" class="LineNr"> 785 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L786" class="LineNr"> 786 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L787" class="LineNr"> 787 </span>    e8/call  <a href='124next-token.subx.html#L716'>skip-chars-not-matching-whitespace</a>/disp32
<span id="L788" class="LineNr"> 788 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L789" class="LineNr"> 789 </span>    81          0/subop/add         3/mod/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="L790" class="LineNr"> 790 </span>    <span class="subxComment"># check-ints-equal(_test-stream-&gt;read, 2, msg)</span>
<span id="L791" class="LineNr"> 791 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L792" class="LineNr"> 792 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-whitespace&quot;</span>/imm32
<span id="L793" class="LineNr"> 793 </span>    68/push  2/imm32
<span id="L794" class="LineNr"> 794 </span>    <span class="subxS2Comment"># . . push *_test-stream-&gt;read</span>
<span id="L795" class="LineNr"> 795 </span>    b8/copy-to-eax  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L796" class="LineNr"> 796 </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="L797" class="LineNr"> 797 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L798" class="LineNr"> 798 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L799" class="LineNr"> 799 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L800" class="LineNr"> 800 </span>    81          0/subop/add         3/mod/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="L801" class="LineNr"> 801 </span>    <span class="subxComment"># end</span>
<span id="L802" class="LineNr"> 802 </span>    c3/return
<span id="L803" class="LineNr"> 803 </span>
<span id="L804" class="LineNr"> 804 </span><span class="subxFunction">skip-chars-matching-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte), delimiter: byte -&gt; curr/eax: (addr byte)</span>
<span id="L805" class="LineNr"> 805 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L806" class="LineNr"> 806 </span>    55/push-ebp
<span id="L807" class="LineNr"> 807 </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="L808" class="LineNr"> 808 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L809" class="LineNr"> 809 </span>    51/push-ecx
<span id="L810" class="LineNr"> 810 </span>    52/push-edx
<span id="L811" class="LineNr"> 811 </span>    53/push-ebx
<span id="L812" class="LineNr"> 812 </span>    <span class="subxComment"># eax = curr</span>
<span id="L813" class="LineNr"> 813 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to eax</span>
<span id="L814" class="LineNr"> 814 </span>    <span class="subxComment"># ecx = end</span>
<span id="L815" class="LineNr"> 815 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L816" class="LineNr"> 816 </span>    <span class="subxComment"># edx = delimiter</span>
<span id="L817" class="LineNr"> 817 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   0x10/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to edx</span>
<span id="L818" class="LineNr"> 818 </span>    <span class="subxComment"># var c/ebx: byte = 0</span>
<span id="L819" class="LineNr"> 819 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L820" class="LineNr"> 820 </span><span class="Constant">$skip-chars-matching-in-slice:loop</span>:
<span id="L821" class="LineNr"> 821 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L822" class="LineNr"> 822 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L823" class="LineNr"> 823 </span>    73/jump-if-addr&gt;=  $skip-chars-matching-in-slice:end/disp8
<span id="L824" class="LineNr"> 824 </span>    <span class="subxComment"># c = *curr</span>
<span id="L825" class="LineNr"> 825 </span>    8a/copy-byte                    0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *eax to BL</span>
<span id="L826" class="LineNr"> 826 </span>    <span class="subxComment"># if (c != delimiter) break</span>
<span id="L827" class="LineNr"> 827 </span>    39/compare                      3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ebx and edx</span>
<span id="L828" class="LineNr"> 828 </span>    75/jump-if-!=  $skip-chars-matching-in-slice:end/disp8
<span id="L829" class="LineNr"> 829 </span>    <span class="subxComment"># ++curr</span>
<span id="L830" class="LineNr"> 830 </span>    40/increment-eax
<span id="L831" class="LineNr"> 831 </span>    eb/jump  $skip-chars-matching-in-slice:<span class="Constant">loop</span>/disp8
<span id="L832" class="LineNr"> 832 </span><span class="Constant">$skip-chars-matching-in-slice:end</span>:
<span id="L833" class="LineNr"> 833 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L834" class="LineNr"> 834 </span>    5b/pop-to-ebx
<span id="L835" class="LineNr"> 835 </span>    5a/pop-to-edx
<span id="L836" class="LineNr"> 836 </span>    59/pop-to-ecx
<span id="L837" class="LineNr"> 837 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L838" class="LineNr"> 838 </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="L839" class="LineNr"> 839 </span>    5d/pop-to-ebp
<span id="L840" class="LineNr"> 840 </span>    c3/return
<span id="L841" class="LineNr"> 841 </span>
<span id="L842" class="LineNr"> 842 </span><span class="subxTest">test-skip-chars-matching-in-slice</span>:
<span id="L843" class="LineNr"> 843 </span>    <span class="subxComment"># (eax..ecx) = &quot;  ab&quot;</span>
<span id="L844" class="LineNr"> 844 </span>    b8/copy-to-eax  <span class="Constant">&quot;  ab&quot;</span>/imm32
<span id="L845" class="LineNr"> 845 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L846" class="LineNr"> 846 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L847" class="LineNr"> 847 </span>    05/add-to-eax  4/imm32
<span id="L848" class="LineNr"> 848 </span>    <span class="subxComment"># eax = skip-chars-matching-in-slice(eax, ecx, 0x20/space)</span>
<span id="L849" class="LineNr"> 849 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L850" class="LineNr"> 850 </span>    68/push  0x20/imm32/space
<span id="L851" class="LineNr"> 851 </span>    51/push-ecx
<span id="L852" class="LineNr"> 852 </span>    50/push-eax
<span id="L853" class="LineNr"> 853 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L854" class="LineNr"> 854 </span>    e8/call  <a href='124next-token.subx.html#L804'>skip-chars-matching-in-slice</a>/disp32
<span id="L855" class="LineNr"> 855 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L856" class="LineNr"> 856 </span>    81          0/subop/add         3/mod/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="L857" class="LineNr"> 857 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 2, msg)</span>
<span id="L858" class="LineNr"> 858 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L859" class="LineNr"> 859 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching-in-slice&quot;</span>/imm32
<span id="L860" class="LineNr"> 860 </span>    68/push  2/imm32
<span id="L861" class="LineNr"> 861 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L862" class="LineNr"> 862 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L863" class="LineNr"> 863 </span>    51/push-ecx
<span id="L864" class="LineNr"> 864 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L865" class="LineNr"> 865 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L866" class="LineNr"> 866 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L867" class="LineNr"> 867 </span>    81          0/subop/add         3/mod/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="L868" class="LineNr"> 868 </span>    <span class="subxComment"># end</span>
<span id="L869" class="LineNr"> 869 </span>    c3/return
<span id="L870" class="LineNr"> 870 </span>
<span id="L871" class="LineNr"> 871 </span><span class="subxTest">test-skip-chars-matching-in-slice-none</span>:
<span id="L872" class="LineNr"> 872 </span>    <span class="subxComment"># (eax..ecx) = &quot;ab&quot;</span>
<span id="L873" class="LineNr"> 873 </span>    b8/copy-to-eax  <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L874" class="LineNr"> 874 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L875" class="LineNr"> 875 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L876" class="LineNr"> 876 </span>    05/add-to-eax  4/imm32
<span id="L877" class="LineNr"> 877 </span>    <span class="subxComment"># eax = skip-chars-matching-in-slice(eax, ecx, 0x20/space)</span>
<span id="L878" class="LineNr"> 878 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L879" class="LineNr"> 879 </span>    68/push  0x20/imm32/space
<span id="L880" class="LineNr"> 880 </span>    51/push-ecx
<span id="L881" class="LineNr"> 881 </span>    50/push-eax
<span id="L882" class="LineNr"> 882 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L883" class="LineNr"> 883 </span>    e8/call  <a href='124next-token.subx.html#L804'>skip-chars-matching-in-slice</a>/disp32
<span id="L884" class="LineNr"> 884 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L885" class="LineNr"> 885 </span>    81          0/subop/add         3/mod/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="L886" class="LineNr"> 886 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 2, msg)</span>
<span id="L887" class="LineNr"> 887 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L888" class="LineNr"> 888 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching-in-slice-none&quot;</span>/imm32
<span id="L889" class="LineNr"> 889 </span>    68/push  2/imm32
<span id="L890" class="LineNr"> 890 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L891" class="LineNr"> 891 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L892" class="LineNr"> 892 </span>    51/push-ecx
<span id="L893" class="LineNr"> 893 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L894" class="LineNr"> 894 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L895" class="LineNr"> 895 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L896" class="LineNr"> 896 </span>    81          0/subop/add         3/mod/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="L897" class="LineNr"> 897 </span>    <span class="subxComment"># end</span>
<span id="L898" class="LineNr"> 898 </span>    c3/return
<span id="L899" class="LineNr"> 899 </span>
<span id="L900" class="LineNr"> 900 </span><span class="subxFunction">skip-chars-matching-whitespace-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte) -&gt; curr/eax: (addr byte)</span>
<span id="L901" class="LineNr"> 901 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L902" class="LineNr"> 902 </span>    55/push-ebp
<span id="L903" class="LineNr"> 903 </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="L904" class="LineNr"> 904 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L905" class="LineNr"> 905 </span>    51/push-ecx
<span id="L906" class="LineNr"> 906 </span>    53/push-ebx
<span id="L907" class="LineNr"> 907 </span>    <span class="subxComment"># eax = curr</span>
<span id="L908" class="LineNr"> 908 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to eax</span>
<span id="L909" class="LineNr"> 909 </span>    <span class="subxComment"># ecx = end</span>
<span id="L910" class="LineNr"> 910 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L911" class="LineNr"> 911 </span>    <span class="subxComment"># var c/ebx: byte = 0</span>
<span id="L912" class="LineNr"> 912 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L913" class="LineNr"> 913 </span><span class="Constant">$skip-chars-matching-whitespace-in-slice:loop</span>:
<span id="L914" class="LineNr"> 914 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L915" class="LineNr"> 915 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L916" class="LineNr"> 916 </span>    0f 83/jump-if-addr&gt;=  $skip-chars-matching-in-slice:end/disp32
<span id="L917" class="LineNr"> 917 </span>    <span class="subxComment"># c = *curr</span>
<span id="L918" class="LineNr"> 918 </span>    8a/copy-byte                    0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *eax to BL</span>
<span id="L919" class="LineNr"> 919 </span>    <span class="subxComment"># if (c == ' ') goto body</span>
<span id="L920" class="LineNr"> 920 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x20/imm32/space  <span class="subxComment"># compare ebx</span>
<span id="L921" class="LineNr"> 921 </span>    74/jump-if-=  $skip-chars-matching-whitespace-in-slice:body/disp8
<span id="L922" class="LineNr"> 922 </span>    <span class="subxComment"># if (c == '\n') goto body</span>
<span id="L923" class="LineNr"> 923 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x0a/imm32/newline  <span class="subxComment"># compare ebx</span>
<span id="L924" class="LineNr"> 924 </span>    74/jump-if-=  $skip-chars-matching-whitespace-in-slice:body/disp8
<span id="L925" class="LineNr"> 925 </span>    <span class="subxComment"># if (c == '\t') goto body</span>
<span id="L926" class="LineNr"> 926 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x09/imm32/tab    <span class="subxComment"># compare ebx</span>
<span id="L927" class="LineNr"> 927 </span>    74/jump-if-=  $skip-chars-matching-whitespace-in-slice:body/disp8
<span id="L928" class="LineNr"> 928 </span>    <span class="subxComment"># if (c != '\r') break</span>
<span id="L929" class="LineNr"> 929 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x0d/imm32/cr     <span class="subxComment"># compare ebx</span>
<span id="L930" class="LineNr"> 930 </span>    75/jump-if-!=  $skip-chars-matching-whitespace-in-slice:end/disp8
<span id="L931" class="LineNr"> 931 </span><span class="Constant">$skip-chars-matching-whitespace-in-slice:body</span>:
<span id="L932" class="LineNr"> 932 </span>    <span class="subxComment"># ++curr</span>
<span id="L933" class="LineNr"> 933 </span>    40/increment-eax
<span id="L934" class="LineNr"> 934 </span>    eb/jump  $skip-chars-matching-whitespace-in-slice:<span class="Constant">loop</span>/disp8
<span id="L935" class="LineNr"> 935 </span><span class="Constant">$skip-chars-matching-whitespace-in-slice:end</span>:
<span id="L936" class="LineNr"> 936 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L937" class="LineNr"> 937 </span>    5b/pop-to-ebx
<span id="L938" class="LineNr"> 938 </span>    59/pop-to-ecx
<span id="L939" class="LineNr"> 939 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L940" class="LineNr"> 940 </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="L941" class="LineNr"> 941 </span>    5d/pop-to-ebp
<span id="L942" class="LineNr"> 942 </span>    c3/return
<span id="L943" class="LineNr"> 943 </span>
<span id="L944" class="LineNr"> 944 </span><span class="subxTest">test-skip-chars-matching-whitespace-in-slice</span>:
<span id="L945" class="LineNr"> 945 </span>    <span class="subxComment"># (eax..ecx) = &quot; \nab&quot;</span>
<span id="L946" class="LineNr"> 946 </span>    b8/copy-to-eax  <span class="Constant">&quot; \nab&quot;</span>/imm32
<span id="L947" class="LineNr"> 947 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L948" class="LineNr"> 948 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L949" class="LineNr"> 949 </span>    05/add-to-eax  4/imm32
<span id="L950" class="LineNr"> 950 </span>    <span class="subxComment"># eax = skip-chars-matching-whitespace-in-slice(eax, ecx)</span>
<span id="L951" class="LineNr"> 951 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L952" class="LineNr"> 952 </span>    51/push-ecx
<span id="L953" class="LineNr"> 953 </span>    50/push-eax
<span id="L954" class="LineNr"> 954 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L955" class="LineNr"> 955 </span>    e8/call  <a href='124next-token.subx.html#L900'>skip-chars-matching-whitespace-in-slice</a>/disp32
<span id="L956" class="LineNr"> 956 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L957" class="LineNr"> 957 </span>    81          0/subop/add         3/mod/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="L958" class="LineNr"> 958 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 2, msg)</span>
<span id="L959" class="LineNr"> 959 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L960" class="LineNr"> 960 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-matching-whitespace-in-slice&quot;</span>/imm32
<span id="L961" class="LineNr"> 961 </span>    68/push  2/imm32
<span id="L962" class="LineNr"> 962 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L963" class="LineNr"> 963 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L964" class="LineNr"> 964 </span>    51/push-ecx
<span id="L965" class="LineNr"> 965 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L966" class="LineNr"> 966 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L967" class="LineNr"> 967 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L968" class="LineNr"> 968 </span>    81          0/subop/add         3/mod/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="L969" class="LineNr"> 969 </span>    <span class="subxComment"># end</span>
<span id="L970" class="LineNr"> 970 </span>    c3/return
<span id="L971" class="LineNr"> 971 </span>
<span id="L972" class="LineNr"> 972 </span><span class="subxComment"># minor fork of 'skip-chars-matching-in-slice'</span>
<span id="L973" class="LineNr"> 973 </span><span class="subxFunction">skip-chars-not-matching-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte), delimiter: byte -&gt; curr/eax: (addr byte)</span>
<span id="L974" class="LineNr"> 974 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L975" class="LineNr"> 975 </span>    55/push-ebp
<span id="L976" class="LineNr"> 976 </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="L977" class="LineNr"> 977 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L978" class="LineNr"> 978 </span>    51/push-ecx
<span id="L979" class="LineNr"> 979 </span>    52/push-edx
<span id="L980" class="LineNr"> 980 </span>    53/push-ebx
<span id="L981" class="LineNr"> 981 </span>    <span class="subxComment"># eax = curr</span>
<span id="L982" class="LineNr"> 982 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to eax</span>
<span id="L983" class="LineNr"> 983 </span>    <span class="subxComment"># ecx = end</span>
<span id="L984" class="LineNr"> 984 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L985" class="LineNr"> 985 </span>    <span class="subxComment"># edx = delimiter</span>
<span id="L986" class="LineNr"> 986 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   0x10/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to edx</span>
<span id="L987" class="LineNr"> 987 </span>    <span class="subxComment"># var c/ebx: byte = 0</span>
<span id="L988" class="LineNr"> 988 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L989" class="LineNr"> 989 </span><span class="Constant">$skip-chars-not-matching-in-slice:loop</span>:
<span id="L990" class="LineNr"> 990 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L991" class="LineNr"> 991 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L992" class="LineNr"> 992 </span>    73/jump-if-addr&gt;=  $skip-chars-not-matching-in-slice:end/disp8
<span id="L993" class="LineNr"> 993 </span>    <span class="subxComment"># c = *curr</span>
<span id="L994" class="LineNr"> 994 </span>    8a/copy-byte                    0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *eax to BL</span>
<span id="L995" class="LineNr"> 995 </span>    <span class="subxComment"># if (c == delimiter) break</span>
<span id="L996" class="LineNr"> 996 </span>    39/compare                      3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ebx and edx</span>
<span id="L997" class="LineNr"> 997 </span>    74/jump-if-=  $skip-chars-not-matching-in-slice:end/disp8
<span id="L998" class="LineNr"> 998 </span>    <span class="subxComment"># ++curr</span>
<span id="L999" class="LineNr"> 999 </span>    40/increment-eax
<span id="L1000" class="LineNr">1000 </span>    eb/jump  $skip-chars-not-matching-in-slice:<span class="Constant">loop</span>/disp8
<span id="L1001" class="LineNr">1001 </span><span class="Constant">$skip-chars-not-matching-in-slice:end</span>:
<span id="L1002" class="LineNr">1002 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1003" class="LineNr">1003 </span>    5b/pop-to-ebx
<span id="L1004" class="LineNr">1004 </span>    5a/pop-to-edx
<span id="L1005" class="LineNr">1005 </span>    59/pop-to-ecx
<span id="L1006" class="LineNr">1006 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1007" class="LineNr">1007 </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="L1008" class="LineNr">1008 </span>    5d/pop-to-ebp
<span id="L1009" class="LineNr">1009 </span>    c3/return
<span id="L1010" class="LineNr">1010 </span>
<span id="L1011" class="LineNr">1011 </span><span class="subxTest">test-skip-chars-not-matching-in-slice</span>:
<span id="L1012" class="LineNr">1012 </span>    <span class="subxComment"># (eax..ecx) = &quot;ab &quot;</span>
<span id="L1013" class="LineNr">1013 </span>    b8/copy-to-eax  <span class="Constant">&quot;ab &quot;</span>/imm32
<span id="L1014" class="LineNr">1014 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1015" class="LineNr">1015 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1016" class="LineNr">1016 </span>    05/add-to-eax  4/imm32
<span id="L1017" class="LineNr">1017 </span>    <span class="subxComment"># eax = skip-chars-not-matching-in-slice(eax, ecx, 0x20/space)</span>
<span id="L1018" class="LineNr">1018 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1019" class="LineNr">1019 </span>    68/push  0x20/imm32/space
<span id="L1020" class="LineNr">1020 </span>    51/push-ecx
<span id="L1021" class="LineNr">1021 </span>    50/push-eax
<span id="L1022" class="LineNr">1022 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1023" class="LineNr">1023 </span>    e8/call  <a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L1024" class="LineNr">1024 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1025" class="LineNr">1025 </span>    81          0/subop/add         3/mod/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="L1026" class="LineNr">1026 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 1, msg)</span>
<span id="L1027" class="LineNr">1027 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1028" class="LineNr">1028 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-in-slice&quot;</span>/imm32
<span id="L1029" class="LineNr">1029 </span>    68/push  1/imm32
<span id="L1030" class="LineNr">1030 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1031" class="LineNr">1031 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1032" class="LineNr">1032 </span>    51/push-ecx
<span id="L1033" class="LineNr">1033 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1034" class="LineNr">1034 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1035" class="LineNr">1035 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1036" class="LineNr">1036 </span>    81          0/subop/add         3/mod/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="L1037" class="LineNr">1037 </span>    <span class="subxComment"># end</span>
<span id="L1038" class="LineNr">1038 </span>    c3/return
<span id="L1039" class="LineNr">1039 </span>
<span id="L1040" class="LineNr">1040 </span><span class="subxTest">test-skip-chars-not-matching-in-slice-none</span>:
<span id="L1041" class="LineNr">1041 </span>    <span class="subxComment"># (eax..ecx) = &quot; ab&quot;</span>
<span id="L1042" class="LineNr">1042 </span>    b8/copy-to-eax  <span class="Constant">&quot; ab&quot;</span>/imm32
<span id="L1043" class="LineNr">1043 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1044" class="LineNr">1044 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1045" class="LineNr">1045 </span>    05/add-to-eax  4/imm32
<span id="L1046" class="LineNr">1046 </span>    <span class="subxComment"># eax = skip-chars-not-matching-in-slice(eax, ecx, 0x20/space)</span>
<span id="L1047" class="LineNr">1047 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1048" class="LineNr">1048 </span>    68/push  0x20/imm32/space
<span id="L1049" class="LineNr">1049 </span>    51/push-ecx
<span id="L1050" class="LineNr">1050 </span>    50/push-eax
<span id="L1051" class="LineNr">1051 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1052" class="LineNr">1052 </span>    e8/call  <a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L1053" class="LineNr">1053 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1054" class="LineNr">1054 </span>    81          0/subop/add         3/mod/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="L1055" class="LineNr">1055 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 3, msg)</span>
<span id="L1056" class="LineNr">1056 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1057" class="LineNr">1057 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-in-slice-none&quot;</span>/imm32
<span id="L1058" class="LineNr">1058 </span>    68/push  3/imm32
<span id="L1059" class="LineNr">1059 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1060" class="LineNr">1060 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1061" class="LineNr">1061 </span>    51/push-ecx
<span id="L1062" class="LineNr">1062 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1063" class="LineNr">1063 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1064" class="LineNr">1064 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1065" class="LineNr">1065 </span>    81          0/subop/add         3/mod/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="L1066" class="LineNr">1066 </span>    <span class="subxComment"># end</span>
<span id="L1067" class="LineNr">1067 </span>    c3/return
<span id="L1068" class="LineNr">1068 </span>
<span id="L1069" class="LineNr">1069 </span><span class="subxTest">test-skip-chars-not-matching-in-slice-all</span>:
<span id="L1070" class="LineNr">1070 </span>    <span class="subxComment"># (eax..ecx) = &quot;ab&quot;</span>
<span id="L1071" class="LineNr">1071 </span>    b8/copy-to-eax  <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L1072" class="LineNr">1072 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1073" class="LineNr">1073 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1074" class="LineNr">1074 </span>    05/add-to-eax  4/imm32
<span id="L1075" class="LineNr">1075 </span>    <span class="subxComment"># eax = skip-chars-not-matching-in-slice(eax, ecx, 0x20/space)</span>
<span id="L1076" class="LineNr">1076 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1077" class="LineNr">1077 </span>    68/push  0x20/imm32/space
<span id="L1078" class="LineNr">1078 </span>    51/push-ecx
<span id="L1079" class="LineNr">1079 </span>    50/push-eax
<span id="L1080" class="LineNr">1080 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1081" class="LineNr">1081 </span>    e8/call  <a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L1082" class="LineNr">1082 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1083" class="LineNr">1083 </span>    81          0/subop/add         3/mod/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="L1084" class="LineNr">1084 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 0, msg)</span>
<span id="L1085" class="LineNr">1085 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1086" class="LineNr">1086 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-in-slice-all&quot;</span>/imm32
<span id="L1087" class="LineNr">1087 </span>    68/push  0/imm32
<span id="L1088" class="LineNr">1088 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1089" class="LineNr">1089 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1090" class="LineNr">1090 </span>    51/push-ecx
<span id="L1091" class="LineNr">1091 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1092" class="LineNr">1092 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1093" class="LineNr">1093 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1094" class="LineNr">1094 </span>    81          0/subop/add         3/mod/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="L1095" class="LineNr">1095 </span>    <span class="subxComment"># end</span>
<span id="L1096" class="LineNr">1096 </span>    c3/return
<span id="L1097" class="LineNr">1097 </span>
<span id="L1098" class="LineNr">1098 </span><span class="subxFunction">skip-chars-not-matching-whitespace-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte) -&gt; curr/eax: (addr byte)</span>
<span id="L1099" class="LineNr">1099 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1100" class="LineNr">1100 </span>    55/push-ebp
<span id="L1101" class="LineNr">1101 </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="L1102" class="LineNr">1102 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1103" class="LineNr">1103 </span>    51/push-ecx
<span id="L1104" class="LineNr">1104 </span>    53/push-ebx
<span id="L1105" class="LineNr">1105 </span>    <span class="subxComment"># eax = curr</span>
<span id="L1106" class="LineNr">1106 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to eax</span>
<span id="L1107" class="LineNr">1107 </span>    <span class="subxComment"># ecx = end</span>
<span id="L1108" class="LineNr">1108 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L1109" class="LineNr">1109 </span>    <span class="subxComment"># var c/ebx: byte = 0</span>
<span id="L1110" class="LineNr">1110 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L1111" class="LineNr">1111 </span><span class="Constant">$skip-chars-not-matching-whitespace-in-slice:loop</span>:
<span id="L1112" class="LineNr">1112 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L1113" class="LineNr">1113 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L1114" class="LineNr">1114 </span>    0f 83/jump-if-addr&gt;=  $skip-chars-not-matching-in-slice:end/disp32
<span id="L1115" class="LineNr">1115 </span>    <span class="subxComment"># c = *curr</span>
<span id="L1116" class="LineNr">1116 </span>    8a/copy-byte                    0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *eax to BL</span>
<span id="L1117" class="LineNr">1117 </span>    <span class="subxComment"># if (c == ' ') break</span>
<span id="L1118" class="LineNr">1118 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x20/imm32/space  <span class="subxComment"># compare ebx</span>
<span id="L1119" class="LineNr">1119 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace-in-slice:end/disp8
<span id="L1120" class="LineNr">1120 </span>    <span class="subxComment"># if (c == '\n') break</span>
<span id="L1121" class="LineNr">1121 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x0a/imm32/newline  <span class="subxComment"># compare ebx</span>
<span id="L1122" class="LineNr">1122 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace-in-slice:end/disp8
<span id="L1123" class="LineNr">1123 </span>    <span class="subxComment"># if (c == '\t') break</span>
<span id="L1124" class="LineNr">1124 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x09/imm32/tab    <span class="subxComment"># compare ebx</span>
<span id="L1125" class="LineNr">1125 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace-in-slice:end/disp8
<span id="L1126" class="LineNr">1126 </span>    <span class="subxComment"># if (c == '\r') break</span>
<span id="L1127" class="LineNr">1127 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x0d/imm32/cr     <span class="subxComment"># compare ebx</span>
<span id="L1128" class="LineNr">1128 </span>    74/jump-if-=  $skip-chars-not-matching-whitespace-in-slice:end/disp8
<span id="L1129" class="LineNr">1129 </span>    <span class="subxComment"># ++curr</span>
<span id="L1130" class="LineNr">1130 </span>    40/increment-eax
<span id="L1131" class="LineNr">1131 </span>    eb/jump  $skip-chars-not-matching-whitespace-in-slice:<span class="Constant">loop</span>/disp8
<span id="L1132" class="LineNr">1132 </span><span class="Constant">$skip-chars-not-matching-whitespace-in-slice:end</span>:
<span id="L1133" class="LineNr">1133 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1134" class="LineNr">1134 </span>    5b/pop-to-ebx
<span id="L1135" class="LineNr">1135 </span>    59/pop-to-ecx
<span id="L1136" class="LineNr">1136 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1137" class="LineNr">1137 </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="L1138" class="LineNr">1138 </span>    5d/pop-to-ebp
<span id="L1139" class="LineNr">1139 </span>    c3/return
<span id="L1140" class="LineNr">1140 </span>
<span id="L1141" class="LineNr">1141 </span><span class="subxTest">test-skip-chars-not-matching-whitespace-in-slice</span>:
<span id="L1142" class="LineNr">1142 </span>    <span class="subxComment"># (eax..ecx) = &quot;ab\n&quot;</span>
<span id="L1143" class="LineNr">1143 </span>    b8/copy-to-eax  <span class="Constant">&quot;ab\n&quot;</span>/imm32
<span id="L1144" class="LineNr">1144 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1145" class="LineNr">1145 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1146" class="LineNr">1146 </span>    05/add-to-eax  4/imm32
<span id="L1147" class="LineNr">1147 </span>    <span class="subxComment"># eax = skip-chars-not-matching-whitespace-in-slice(eax, ecx)</span>
<span id="L1148" class="LineNr">1148 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1149" class="LineNr">1149 </span>    51/push-ecx
<span id="L1150" class="LineNr">1150 </span>    50/push-eax
<span id="L1151" class="LineNr">1151 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1152" class="LineNr">1152 </span>    e8/call  <a href='124next-token.subx.html#L1098'>skip-chars-not-matching-whitespace-in-slice</a>/disp32
<span id="L1153" class="LineNr">1153 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1154" class="LineNr">1154 </span>    81          0/subop/add         3/mod/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="L1155" class="LineNr">1155 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 1, msg)</span>
<span id="L1156" class="LineNr">1156 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1157" class="LineNr">1157 </span>    68/push  <span class="Constant">&quot;F - test-skip-chars-not-matching-whitespace-in-slice&quot;</span>/imm32
<span id="L1158" class="LineNr">1158 </span>    68/push  1/imm32
<span id="L1159" class="LineNr">1159 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1160" class="LineNr">1160 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1161" class="LineNr">1161 </span>    51/push-ecx
<span id="L1162" class="LineNr">1162 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1163" class="LineNr">1163 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1164" class="LineNr">1164 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1165" class="LineNr">1165 </span>    81          0/subop/add         3/mod/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="L1166" class="LineNr">1166 </span>    <span class="subxComment"># end</span>
<span id="L1167" class="LineNr">1167 </span>    c3/return
<span id="L1168" class="LineNr">1168 </span>
<span id="L1169" class="LineNr">1169 </span><span class="subxComment"># update line-&gt;read to end of string literal surrounded by double quotes</span>
<span id="L1170" class="LineNr">1170 </span><span class="subxComment"># line-&gt;read must start out at a double-quote</span>
<span id="L1171" class="LineNr">1171 </span><span class="subxFunction">skip-string</span>:  <span class="subxComment"># line: (addr stream byte)</span>
<span id="L1172" class="LineNr">1172 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1173" class="LineNr">1173 </span>    55/push-ebp
<span id="L1174" class="LineNr">1174 </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="L1175" class="LineNr">1175 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1176" class="LineNr">1176 </span>    50/push-eax
<span id="L1177" class="LineNr">1177 </span>    51/push-ecx
<span id="L1178" class="LineNr">1178 </span>    52/push-edx
<span id="L1179" class="LineNr">1179 </span>    <span class="subxComment"># ecx = line</span>
<span id="L1180" class="LineNr">1180 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to ecx</span>
<span id="L1181" class="LineNr">1181 </span>    <span class="subxComment"># eax = skip-string-in-slice(&amp;line-&gt;data[line-&gt;read], &amp;line-&gt;data[line-&gt;write])</span>
<span id="L1182" class="LineNr">1182 </span>    <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;write]</span>
<span id="L1183" class="LineNr">1183 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+8) to edx</span>
<span id="L1184" class="LineNr">1184 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx  <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy ecx+edx+12 to edx</span>
<span id="L1185" class="LineNr">1185 </span>    52/push-edx
<span id="L1186" class="LineNr">1186 </span>    <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;read]</span>
<span id="L1187" class="LineNr">1187 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to edx</span>
<span id="L1188" class="LineNr">1188 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx  <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy ecx+edx+12 to edx</span>
<span id="L1189" class="LineNr">1189 </span>    52/push-edx
<span id="L1190" class="LineNr">1190 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1191" class="LineNr">1191 </span>    e8/call  <a href='124next-token.subx.html#L1413'>skip-string-in-slice</a>/disp32
<span id="L1192" class="LineNr">1192 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1193" class="LineNr">1193 </span>    81          0/subop/add         3/mod/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="L1194" class="LineNr">1194 </span>    <span class="subxComment"># line-&gt;read = eax - line-&gt;data</span>
<span id="L1195" class="LineNr">1195 </span>    29/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ecx from eax</span>
<span id="L1196" class="LineNr">1196 </span>    2d/subtract-from-eax  0xc/imm32
<span id="L1197" class="LineNr">1197 </span>    89/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(ecx+4)</span>
<span id="L1198" class="LineNr">1198 </span><span class="Constant">$skip-string:end</span>:
<span id="L1199" class="LineNr">1199 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1200" class="LineNr">1200 </span>    5a/pop-to-edx
<span id="L1201" class="LineNr">1201 </span>    59/pop-to-ecx
<span id="L1202" class="LineNr">1202 </span>    58/pop-to-eax
<span id="L1203" class="LineNr">1203 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1204" class="LineNr">1204 </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="L1205" class="LineNr">1205 </span>    5d/pop-to-ebp
<span id="L1206" class="LineNr">1206 </span>    c3/return
<span id="L1207" class="LineNr">1207 </span>
<span id="L1208" class="LineNr">1208 </span><span class="subxTest">test-skip-string</span>:
<span id="L1209" class="LineNr">1209 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1210" class="LineNr">1210 </span>    55/push-ebp
<span id="L1211" class="LineNr">1211 </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="L1212" class="LineNr">1212 </span>    <span class="subxComment"># setup</span>
<span id="L1213" class="LineNr">1213 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1214" class="LineNr">1214 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1215" class="LineNr">1215 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1216" class="LineNr">1216 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1217" class="LineNr">1217 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1218" class="LineNr">1218 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1219" class="LineNr">1219 </span>    81          0/subop/add         3/mod/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="L1220" class="LineNr">1220 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;abc\&quot; def&quot;)</span>
<span id="L1221" class="LineNr">1221 </span>    <span class="subxS1Comment"># .                   indices:  0123 45</span>
<span id="L1222" class="LineNr">1222 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1223" class="LineNr">1223 </span>    68/push  <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L1224" class="LineNr">1224 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1225" class="LineNr">1225 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1226" class="LineNr">1226 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1227" class="LineNr">1227 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1228" class="LineNr">1228 </span>    81          0/subop/add         3/mod/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="L1229" class="LineNr">1229 </span>    <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L1230" class="LineNr">1230 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1231" class="LineNr">1231 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L1208'>test-skip-string</a>/precondition&quot;</span>/imm32
<span id="L1232" class="LineNr">1232 </span>    68/push  0/imm32
<span id="L1233" class="LineNr">1233 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1234" class="LineNr">1234 </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="L1235" class="LineNr">1235 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1236" class="LineNr">1236 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1237" class="LineNr">1237 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1238" class="LineNr">1238 </span>    81          0/subop/add         3/mod/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="L1239" class="LineNr">1239 </span>    <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L1240" class="LineNr">1240 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1241" class="LineNr">1241 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1242" class="LineNr">1242 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1243" class="LineNr">1243 </span>    e8/call  <a href='124next-token.subx.html#L1171'>skip-string</a>/disp32
<span id="L1244" class="LineNr">1244 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1245" class="LineNr">1245 </span>    81          0/subop/add         3/mod/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="L1246" class="LineNr">1246 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L1247" class="LineNr">1247 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1248" class="LineNr">1248 </span>    68/push  <span class="Constant">&quot;F - test-skip-string&quot;</span>/imm32
<span id="L1249" class="LineNr">1249 </span>    68/push  5/imm32
<span id="L1250" class="LineNr">1250 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1251" class="LineNr">1251 </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="L1252" class="LineNr">1252 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1253" class="LineNr">1253 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1254" class="LineNr">1254 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1255" class="LineNr">1255 </span>    81          0/subop/add         3/mod/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="L1256" class="LineNr">1256 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1257" class="LineNr">1257 </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="L1258" class="LineNr">1258 </span>    5d/pop-to-ebp
<span id="L1259" class="LineNr">1259 </span>    c3/return
<span id="L1260" class="LineNr">1260 </span>
<span id="L1261" class="LineNr">1261 </span><span class="subxTest">test-skip-string-ignores-spaces</span>:
<span id="L1262" class="LineNr">1262 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1263" class="LineNr">1263 </span>    55/push-ebp
<span id="L1264" class="LineNr">1264 </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="L1265" class="LineNr">1265 </span>    <span class="subxComment"># setup</span>
<span id="L1266" class="LineNr">1266 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1267" class="LineNr">1267 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1268" class="LineNr">1268 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1269" class="LineNr">1269 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1270" class="LineNr">1270 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1271" class="LineNr">1271 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1272" class="LineNr">1272 </span>    81          0/subop/add         3/mod/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="L1273" class="LineNr">1273 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;a b\&quot;/yz&quot;)</span>
<span id="L1274" class="LineNr">1274 </span>    <span class="subxS1Comment"># .                   indices:  0123 45</span>
<span id="L1275" class="LineNr">1275 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1276" class="LineNr">1276 </span>    68/push  <span class="Constant">&quot;\&quot;</span>a b\<span class="Constant">&quot;/yz&quot;</span>/imm32
<span id="L1277" class="LineNr">1277 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1278" class="LineNr">1278 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1279" class="LineNr">1279 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1280" class="LineNr">1280 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1281" class="LineNr">1281 </span>    81          0/subop/add         3/mod/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="L1282" class="LineNr">1282 </span>    <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L1283" class="LineNr">1283 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1284" class="LineNr">1284 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L1261'>test-skip-string-ignores-spaces</a>/precondition&quot;</span>/imm32
<span id="L1285" class="LineNr">1285 </span>    68/push  0/imm32
<span id="L1286" class="LineNr">1286 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1287" class="LineNr">1287 </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="L1288" class="LineNr">1288 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1289" class="LineNr">1289 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1290" class="LineNr">1290 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1291" class="LineNr">1291 </span>    81          0/subop/add         3/mod/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="L1292" class="LineNr">1292 </span>    <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L1293" class="LineNr">1293 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1294" class="LineNr">1294 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1295" class="LineNr">1295 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1296" class="LineNr">1296 </span>    e8/call  <a href='124next-token.subx.html#L1171'>skip-string</a>/disp32
<span id="L1297" class="LineNr">1297 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1298" class="LineNr">1298 </span>    81          0/subop/add         3/mod/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="L1299" class="LineNr">1299 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L1300" class="LineNr">1300 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1301" class="LineNr">1301 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-ignores-spaces&quot;</span>/imm32
<span id="L1302" class="LineNr">1302 </span>    68/push  5/imm32
<span id="L1303" class="LineNr">1303 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1304" class="LineNr">1304 </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="L1305" class="LineNr">1305 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1306" class="LineNr">1306 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1307" class="LineNr">1307 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1308" class="LineNr">1308 </span>    81          0/subop/add         3/mod/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="L1309" class="LineNr">1309 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1310" class="LineNr">1310 </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="L1311" class="LineNr">1311 </span>    5d/pop-to-ebp
<span id="L1312" class="LineNr">1312 </span>    c3/return
<span id="L1313" class="LineNr">1313 </span>
<span id="L1314" class="LineNr">1314 </span><span class="subxTest">test-skip-string-ignores-escapes</span>:
<span id="L1315" class="LineNr">1315 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1316" class="LineNr">1316 </span>    55/push-ebp
<span id="L1317" class="LineNr">1317 </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="L1318" class="LineNr">1318 </span>    <span class="subxComment"># setup</span>
<span id="L1319" class="LineNr">1319 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1320" class="LineNr">1320 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1321" class="LineNr">1321 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1322" class="LineNr">1322 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1323" class="LineNr">1323 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1324" class="LineNr">1324 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1325" class="LineNr">1325 </span>    81          0/subop/add         3/mod/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="L1326" class="LineNr">1326 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;\&quot;a\\\&quot;b\&quot;/yz&quot;)</span>
<span id="L1327" class="LineNr">1327 </span>    <span class="subxS1Comment"># .                   indices:  01 2 34 56</span>
<span id="L1328" class="LineNr">1328 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1329" class="LineNr">1329 </span>    68/push  <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L1330" class="LineNr">1330 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1331" class="LineNr">1331 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1332" class="LineNr">1332 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1333" class="LineNr">1333 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1334" class="LineNr">1334 </span>    81          0/subop/add         3/mod/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="L1335" class="LineNr">1335 </span>    <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L1336" class="LineNr">1336 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1337" class="LineNr">1337 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L1314'>test-skip-string-ignores-escapes</a>/precondition&quot;</span>/imm32
<span id="L1338" class="LineNr">1338 </span>    68/push  0/imm32
<span id="L1339" class="LineNr">1339 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1340" class="LineNr">1340 </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="L1341" class="LineNr">1341 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1342" class="LineNr">1342 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1343" class="LineNr">1343 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1344" class="LineNr">1344 </span>    81          0/subop/add         3/mod/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="L1345" class="LineNr">1345 </span>    <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L1346" class="LineNr">1346 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1347" class="LineNr">1347 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1348" class="LineNr">1348 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1349" class="LineNr">1349 </span>    e8/call  <a href='124next-token.subx.html#L1171'>skip-string</a>/disp32
<span id="L1350" class="LineNr">1350 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1351" class="LineNr">1351 </span>    81          0/subop/add         3/mod/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="L1352" class="LineNr">1352 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 6, msg)</span>
<span id="L1353" class="LineNr">1353 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1354" class="LineNr">1354 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-ignores-escapes&quot;</span>/imm32
<span id="L1355" class="LineNr">1355 </span>    68/push  6/imm32
<span id="L1356" class="LineNr">1356 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1357" class="LineNr">1357 </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="L1358" class="LineNr">1358 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1359" class="LineNr">1359 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1360" class="LineNr">1360 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1361" class="LineNr">1361 </span>    81          0/subop/add         3/mod/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="L1362" class="LineNr">1362 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1363" class="LineNr">1363 </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="L1364" class="LineNr">1364 </span>    5d/pop-to-ebp
<span id="L1365" class="LineNr">1365 </span>    c3/return
<span id="L1366" class="LineNr">1366 </span>
<span id="L1367" class="LineNr">1367 </span><span class="subxTest">test-skip-string-works-from-mid-stream</span>:
<span id="L1368" class="LineNr">1368 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1369" class="LineNr">1369 </span>    55/push-ebp
<span id="L1370" class="LineNr">1370 </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="L1371" class="LineNr">1371 </span>    <span class="subxComment"># setup</span>
<span id="L1372" class="LineNr">1372 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1373" class="LineNr">1373 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1374" class="LineNr">1374 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1375" class="LineNr">1375 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1376" class="LineNr">1376 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1377" class="LineNr">1377 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1378" class="LineNr">1378 </span>    81          0/subop/add         3/mod/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="L1379" class="LineNr">1379 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;0 \&quot;a\\\&quot;b\&quot;/yz&quot;)</span>
<span id="L1380" class="LineNr">1380 </span>    <span class="subxS1Comment"># .                   indices:  01 2 34 56</span>
<span id="L1381" class="LineNr">1381 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1382" class="LineNr">1382 </span>    68/push  <span class="Constant">&quot;0 \&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L1383" class="LineNr">1383 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1384" class="LineNr">1384 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1385" class="LineNr">1385 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1386" class="LineNr">1386 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1387" class="LineNr">1387 </span>    81          0/subop/add         3/mod/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="L1388" class="LineNr">1388 </span>    <span class="subxComment"># precondition: line-&gt;read == 2</span>
<span id="L1389" class="LineNr">1389 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1390" class="LineNr">1390 </span>    c7          0/subop/copy        1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8         2/imm32           <span class="subxComment"># copy to *(eax+4)</span>
<span id="L1391" class="LineNr">1391 </span>    <span class="subxComment"># skip-string(_test-input-stream)</span>
<span id="L1392" class="LineNr">1392 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1393" class="LineNr">1393 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1394" class="LineNr">1394 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1395" class="LineNr">1395 </span>    e8/call  <a href='124next-token.subx.html#L1171'>skip-string</a>/disp32
<span id="L1396" class="LineNr">1396 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1397" class="LineNr">1397 </span>    81          0/subop/add         3/mod/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="L1398" class="LineNr">1398 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 8, msg)</span>
<span id="L1399" class="LineNr">1399 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1400" class="LineNr">1400 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-works-from-mid-stream&quot;</span>/imm32
<span id="L1401" class="LineNr">1401 </span>    68/push  8/imm32
<span id="L1402" class="LineNr">1402 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1403" class="LineNr">1403 </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="L1404" class="LineNr">1404 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1405" class="LineNr">1405 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1406" class="LineNr">1406 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1407" class="LineNr">1407 </span>    81          0/subop/add         3/mod/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="L1408" class="LineNr">1408 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1409" class="LineNr">1409 </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="L1410" class="LineNr">1410 </span>    5d/pop-to-ebp
<span id="L1411" class="LineNr">1411 </span>    c3/return
<span id="L1412" class="LineNr">1412 </span>
<span id="L1413" class="LineNr">1413 </span><span class="subxFunction">skip-string-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte) -&gt; curr/eax: (addr byte)</span>
<span id="L1414" class="LineNr">1414 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1415" class="LineNr">1415 </span>    55/push-ebp
<span id="L1416" class="LineNr">1416 </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="L1417" class="LineNr">1417 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1418" class="LineNr">1418 </span>    51/push-ecx
<span id="L1419" class="LineNr">1419 </span>    52/push-edx
<span id="L1420" class="LineNr">1420 </span>    53/push-ebx
<span id="L1421" class="LineNr">1421 </span>    <span class="subxComment"># ecx = curr</span>
<span id="L1422" class="LineNr">1422 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to ecx</span>
<span id="L1423" class="LineNr">1423 </span>    <span class="subxComment"># edx = end</span>
<span id="L1424" class="LineNr">1424 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   0xc/disp8        <span class="Normal"> . </span>              <span class="subxComment"># copy *(ebp+12) to edx</span>
<span id="L1425" class="LineNr">1425 </span>    <span class="subxComment"># var c/eax: byte = 0</span>
<span id="L1426" class="LineNr">1426 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L1427" class="LineNr">1427 </span>    <span class="subxComment"># skip initial dquote</span>
<span id="L1428" class="LineNr">1428 </span>    41/increment-ecx
<span id="L1429" class="LineNr">1429 </span><span class="Constant">$skip-string-in-slice:loop</span>:
<span id="L1430" class="LineNr">1430 </span>    <span class="subxComment"># if (curr &gt;= end) return curr</span>
<span id="L1431" class="LineNr">1431 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with edx</span>
<span id="L1432" class="LineNr">1432 </span>    73/jump-if-addr&gt;=  $skip-string-in-slice:return-curr/disp8
<span id="L1433" class="LineNr">1433 </span>    <span class="subxComment"># c = *curr</span>
<span id="L1434" class="LineNr">1434 </span>    8a/copy-byte                    0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *ecx to AL</span>
<span id="L1435" class="LineNr">1435 </span><span class="Constant">$skip-string-in-slice:dquote</span>:
<span id="L1436" class="LineNr">1436 </span>    <span class="subxComment"># if (c == '&quot;') break</span>
<span id="L1437" class="LineNr">1437 </span>    3d/compare-eax-and  0x22/imm32/double-quote
<span id="L1438" class="LineNr">1438 </span>    74/jump-if-=  $skip-string-in-slice:<span class="Constant">break</span>/disp8
<span id="L1439" class="LineNr">1439 </span><span class="Constant">$skip-string-in-slice:check-for-escape</span>:
<span id="L1440" class="LineNr">1440 </span>    <span class="subxComment"># if (c == '\') escape next char</span>
<span id="L1441" class="LineNr">1441 </span>    3d/compare-eax-and  0x5c/imm32/backslash
<span id="L1442" class="LineNr">1442 </span>    75/jump-if-!=  $skip-string-in-slice:continue/disp8
<span id="L1443" class="LineNr">1443 </span><span class="Constant">$skip-string-in-slice:escape</span>:
<span id="L1444" class="LineNr">1444 </span>    41/increment-ecx
<span id="L1445" class="LineNr">1445 </span><span class="Constant">$skip-string-in-slice:continue</span>:
<span id="L1446" class="LineNr">1446 </span>    <span class="subxComment"># ++curr</span>
<span id="L1447" class="LineNr">1447 </span>    41/increment-ecx
<span id="L1448" class="LineNr">1448 </span>    eb/jump  $skip-string-in-slice:<span class="Constant">loop</span>/disp8
<span id="L1449" class="LineNr">1449 </span><span class="Constant">$skip-string-in-slice:break</span>:
<span id="L1450" class="LineNr">1450 </span>    <span class="subxComment"># skip final dquote</span>
<span id="L1451" class="LineNr">1451 </span>    41/increment-ecx
<span id="L1452" class="LineNr">1452 </span><span class="Constant">$skip-string-in-slice:return-curr</span>:
<span id="L1453" class="LineNr">1453 </span>    <span class="subxComment"># return curr</span>
<span id="L1454" class="LineNr">1454 </span>    89/copy                         3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to eax</span>
<span id="L1455" class="LineNr">1455 </span><span class="Constant">$skip-string-in-slice:end</span>:
<span id="L1456" class="LineNr">1456 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1457" class="LineNr">1457 </span>    5b/pop-to-ebx
<span id="L1458" class="LineNr">1458 </span>    5a/pop-to-edx
<span id="L1459" class="LineNr">1459 </span>    59/pop-to-ecx
<span id="L1460" class="LineNr">1460 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1461" class="LineNr">1461 </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="L1462" class="LineNr">1462 </span>    5d/pop-to-ebp
<span id="L1463" class="LineNr">1463 </span>    c3/return
<span id="L1464" class="LineNr">1464 </span>
<span id="L1465" class="LineNr">1465 </span><span class="subxTest">test-skip-string-in-slice</span>:
<span id="L1466" class="LineNr">1466 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1467" class="LineNr">1467 </span>    55/push-ebp
<span id="L1468" class="LineNr">1468 </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="L1469" class="LineNr">1469 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;\&quot;abc\&quot; def&quot;</span>
<span id="L1470" class="LineNr">1470 </span>    b8/copy-to-eax  <span class="Constant">&quot;\&quot;</span>abc\<span class="Constant">&quot; def&quot;</span>/imm32
<span id="L1471" class="LineNr">1471 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1472" class="LineNr">1472 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1473" class="LineNr">1473 </span>    05/add-to-eax  4/imm32
<span id="L1474" class="LineNr">1474 </span>    <span class="subxComment"># eax = skip-string-in-slice(eax, ecx)</span>
<span id="L1475" class="LineNr">1475 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1476" class="LineNr">1476 </span>    51/push-ecx
<span id="L1477" class="LineNr">1477 </span>    50/push-eax
<span id="L1478" class="LineNr">1478 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1479" class="LineNr">1479 </span>    e8/call  <a href='124next-token.subx.html#L1413'>skip-string-in-slice</a>/disp32
<span id="L1480" class="LineNr">1480 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1481" class="LineNr">1481 </span>    81          0/subop/add         3/mod/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="L1482" class="LineNr">1482 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 4, msg)  # number of chars remaining after the string literal</span>
<span id="L1483" class="LineNr">1483 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1484" class="LineNr">1484 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-in-slice&quot;</span>/imm32
<span id="L1485" class="LineNr">1485 </span>    68/push  4/imm32
<span id="L1486" class="LineNr">1486 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1487" class="LineNr">1487 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1488" class="LineNr">1488 </span>    51/push-ecx
<span id="L1489" class="LineNr">1489 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1490" class="LineNr">1490 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1491" class="LineNr">1491 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1492" class="LineNr">1492 </span>    81          0/subop/add         3/mod/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="L1493" class="LineNr">1493 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1494" class="LineNr">1494 </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="L1495" class="LineNr">1495 </span>    5d/pop-to-ebp
<span id="L1496" class="LineNr">1496 </span>    c3/return
<span id="L1497" class="LineNr">1497 </span>
<span id="L1498" class="LineNr">1498 </span><span class="subxTest">test-skip-string-in-slice-ignores-spaces</span>:
<span id="L1499" class="LineNr">1499 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1500" class="LineNr">1500 </span>    55/push-ebp
<span id="L1501" class="LineNr">1501 </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="L1502" class="LineNr">1502 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;\&quot;a b\&quot;/yz&quot;</span>
<span id="L1503" class="LineNr">1503 </span>    b8/copy-to-eax  <span class="Constant">&quot;\&quot;</span>a b\<span class="Constant">&quot;/yz&quot;</span>/imm32
<span id="L1504" class="LineNr">1504 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1505" class="LineNr">1505 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1506" class="LineNr">1506 </span>    05/add-to-eax  4/imm32
<span id="L1507" class="LineNr">1507 </span>    <span class="subxComment"># eax = skip-string-in-slice(eax, ecx)</span>
<span id="L1508" class="LineNr">1508 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1509" class="LineNr">1509 </span>    51/push-ecx
<span id="L1510" class="LineNr">1510 </span>    50/push-eax
<span id="L1511" class="LineNr">1511 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1512" class="LineNr">1512 </span>    e8/call  <a href='124next-token.subx.html#L1413'>skip-string-in-slice</a>/disp32
<span id="L1513" class="LineNr">1513 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1514" class="LineNr">1514 </span>    81          0/subop/add         3/mod/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="L1515" class="LineNr">1515 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 3, msg)  # number of chars remaining after the string literal</span>
<span id="L1516" class="LineNr">1516 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1517" class="LineNr">1517 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-in-slice-ignores-spaces&quot;</span>/imm32
<span id="L1518" class="LineNr">1518 </span>    68/push  3/imm32
<span id="L1519" class="LineNr">1519 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1520" class="LineNr">1520 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1521" class="LineNr">1521 </span>    51/push-ecx
<span id="L1522" class="LineNr">1522 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1523" class="LineNr">1523 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1524" class="LineNr">1524 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1525" class="LineNr">1525 </span>    81          0/subop/add         3/mod/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="L1526" class="LineNr">1526 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1527" class="LineNr">1527 </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="L1528" class="LineNr">1528 </span>    5d/pop-to-ebp
<span id="L1529" class="LineNr">1529 </span>    c3/return
<span id="L1530" class="LineNr">1530 </span>
<span id="L1531" class="LineNr">1531 </span><span class="subxTest">test-skip-string-in-slice-ignores-escapes</span>:
<span id="L1532" class="LineNr">1532 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1533" class="LineNr">1533 </span>    55/push-ebp
<span id="L1534" class="LineNr">1534 </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="L1535" class="LineNr">1535 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;\&quot;a\\\&quot;b\&quot;/yz&quot;</span>
<span id="L1536" class="LineNr">1536 </span>    b8/copy-to-eax  <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>/yz&quot;/imm32
<span id="L1537" class="LineNr">1537 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1538" class="LineNr">1538 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1539" class="LineNr">1539 </span>    05/add-to-eax  4/imm32
<span id="L1540" class="LineNr">1540 </span>    <span class="subxComment"># eax = skip-string-in-slice(eax, ecx)</span>
<span id="L1541" class="LineNr">1541 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1542" class="LineNr">1542 </span>    51/push-ecx
<span id="L1543" class="LineNr">1543 </span>    50/push-eax
<span id="L1544" class="LineNr">1544 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1545" class="LineNr">1545 </span>    e8/call  <a href='124next-token.subx.html#L1413'>skip-string-in-slice</a>/disp32
<span id="L1546" class="LineNr">1546 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1547" class="LineNr">1547 </span>    81          0/subop/add         3/mod/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="L1548" class="LineNr">1548 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 3, msg)  # number of chars remaining after the string literal</span>
<span id="L1549" class="LineNr">1549 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1550" class="LineNr">1550 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-in-slice-ignores-escapes&quot;</span>/imm32
<span id="L1551" class="LineNr">1551 </span>    68/push  3/imm32
<span id="L1552" class="LineNr">1552 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1553" class="LineNr">1553 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1554" class="LineNr">1554 </span>    51/push-ecx
<span id="L1555" class="LineNr">1555 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1556" class="LineNr">1556 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1557" class="LineNr">1557 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1558" class="LineNr">1558 </span>    81          0/subop/add         3/mod/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="L1559" class="LineNr">1559 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1560" class="LineNr">1560 </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="L1561" class="LineNr">1561 </span>    5d/pop-to-ebp
<span id="L1562" class="LineNr">1562 </span>    c3/return
<span id="L1563" class="LineNr">1563 </span>
<span id="L1564" class="LineNr">1564 </span><span class="subxTest">test-skip-string-in-slice-stops-at-end</span>:
<span id="L1565" class="LineNr">1565 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1566" class="LineNr">1566 </span>    55/push-ebp
<span id="L1567" class="LineNr">1567 </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="L1568" class="LineNr">1568 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;\&quot;abc&quot;  # unbalanced dquote</span>
<span id="L1569" class="LineNr">1569 </span>    b8/copy-to-eax  <span class="Constant">&quot;\&quot;</span>abc&quot;/imm32
<span id="L1570" class="LineNr">1570 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1571" class="LineNr">1571 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1572" class="LineNr">1572 </span>    05/add-to-eax  4/imm32
<span id="L1573" class="LineNr">1573 </span>    <span class="subxComment"># eax = skip-string-in-slice(eax, ecx)</span>
<span id="L1574" class="LineNr">1574 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1575" class="LineNr">1575 </span>    51/push-ecx
<span id="L1576" class="LineNr">1576 </span>    50/push-eax
<span id="L1577" class="LineNr">1577 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1578" class="LineNr">1578 </span>    e8/call  <a href='124next-token.subx.html#L1413'>skip-string-in-slice</a>/disp32
<span id="L1579" class="LineNr">1579 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1580" class="LineNr">1580 </span>    81          0/subop/add         3/mod/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="L1581" class="LineNr">1581 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 0, msg)  # skipped to end of slice</span>
<span id="L1582" class="LineNr">1582 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1583" class="LineNr">1583 </span>    68/push  <span class="Constant">&quot;F - test-skip-string-in-slice-stops-at-end&quot;</span>/imm32
<span id="L1584" class="LineNr">1584 </span>    68/push  0/imm32
<span id="L1585" class="LineNr">1585 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1586" class="LineNr">1586 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1587" class="LineNr">1587 </span>    51/push-ecx
<span id="L1588" class="LineNr">1588 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1589" class="LineNr">1589 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1590" class="LineNr">1590 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1591" class="LineNr">1591 </span>    81          0/subop/add         3/mod/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="L1592" class="LineNr">1592 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1593" class="LineNr">1593 </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="L1594" class="LineNr">1594 </span>    5d/pop-to-ebp
<span id="L1595" class="LineNr">1595 </span>    c3/return
<span id="L1596" class="LineNr">1596 </span>
<span id="L1597" class="LineNr">1597 </span><span class="subxComment"># update line-&gt;read to ')'</span>
<span id="L1598" class="LineNr">1598 </span><span class="subxComment"># line-&gt;read ends at ')'</span>
<span id="L1599" class="LineNr">1599 </span><span class="subxFunction">skip-until-close-paren</span>:  <span class="subxComment"># line: (addr stream byte)</span>
<span id="L1600" class="LineNr">1600 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1601" class="LineNr">1601 </span>    55/push-ebp
<span id="L1602" class="LineNr">1602 </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="L1603" class="LineNr">1603 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1604" class="LineNr">1604 </span>    50/push-eax
<span id="L1605" class="LineNr">1605 </span>    51/push-ecx
<span id="L1606" class="LineNr">1606 </span>    52/push-edx
<span id="L1607" class="LineNr">1607 </span>    <span class="subxComment"># ecx = line</span>
<span id="L1608" class="LineNr">1608 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to ecx</span>
<span id="L1609" class="LineNr">1609 </span>    <span class="subxComment"># eax = skip-until-close-paren-in-slice(&amp;line-&gt;data[line-&gt;read], &amp;line-&gt;data[line-&gt;write])</span>
<span id="L1610" class="LineNr">1610 </span>    <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;write]</span>
<span id="L1611" class="LineNr">1611 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+8) to edx</span>
<span id="L1612" class="LineNr">1612 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx  <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy ecx+edx+12 to edx</span>
<span id="L1613" class="LineNr">1613 </span>    52/push-edx
<span id="L1614" class="LineNr">1614 </span>    <span class="subxS2Comment"># . . push &amp;line-&gt;data[line-&gt;read]</span>
<span id="L1615" class="LineNr">1615 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to edx</span>
<span id="L1616" class="LineNr">1616 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx  <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy ecx+edx+12 to edx</span>
<span id="L1617" class="LineNr">1617 </span>    52/push-edx
<span id="L1618" class="LineNr">1618 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1619" class="LineNr">1619 </span>    e8/call  <a href='124next-token.subx.html#L1786'>skip-until-close-paren-in-slice</a>/disp32
<span id="L1620" class="LineNr">1620 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1621" class="LineNr">1621 </span>    81          0/subop/add         3/mod/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="L1622" class="LineNr">1622 </span>    <span class="subxComment"># line-&gt;read = eax - line-&gt;data</span>
<span id="L1623" class="LineNr">1623 </span>    29/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ecx from eax</span>
<span id="L1624" class="LineNr">1624 </span>    2d/subtract-from-eax  0xc/imm32
<span id="L1625" class="LineNr">1625 </span>    89/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(ecx+4)</span>
<span id="L1626" class="LineNr">1626 </span><span class="Constant">$skip-until-close-paren:end</span>:
<span id="L1627" class="LineNr">1627 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1628" class="LineNr">1628 </span>    5a/pop-to-edx
<span id="L1629" class="LineNr">1629 </span>    59/pop-to-ecx
<span id="L1630" class="LineNr">1630 </span>    58/pop-to-eax
<span id="L1631" class="LineNr">1631 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1632" class="LineNr">1632 </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="L1633" class="LineNr">1633 </span>    5d/pop-to-ebp
<span id="L1634" class="LineNr">1634 </span>    c3/return
<span id="L1635" class="LineNr">1635 </span>
<span id="L1636" class="LineNr">1636 </span><span class="subxTest">test-skip-until-close-paren</span>:
<span id="L1637" class="LineNr">1637 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1638" class="LineNr">1638 </span>    55/push-ebp
<span id="L1639" class="LineNr">1639 </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="L1640" class="LineNr">1640 </span>    <span class="subxComment"># setup</span>
<span id="L1641" class="LineNr">1641 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1642" class="LineNr">1642 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1643" class="LineNr">1643 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1644" class="LineNr">1644 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1645" class="LineNr">1645 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1646" class="LineNr">1646 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1647" class="LineNr">1647 </span>    81          0/subop/add         3/mod/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="L1648" class="LineNr">1648 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;*(abc) def&quot;)</span>
<span id="L1649" class="LineNr">1649 </span>    <span class="subxS1Comment"># .                   indices:  0123 45</span>
<span id="L1650" class="LineNr">1650 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1651" class="LineNr">1651 </span>    68/push  <span class="Constant">&quot;*(abc) def&quot;</span>/imm32
<span id="L1652" class="LineNr">1652 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1653" class="LineNr">1653 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1654" class="LineNr">1654 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1655" class="LineNr">1655 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1656" class="LineNr">1656 </span>    81          0/subop/add         3/mod/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="L1657" class="LineNr">1657 </span>    <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L1658" class="LineNr">1658 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1659" class="LineNr">1659 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L1636'>test-skip-until-close-paren</a>/precondition&quot;</span>/imm32
<span id="L1660" class="LineNr">1660 </span>    68/push  0/imm32
<span id="L1661" class="LineNr">1661 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1662" class="LineNr">1662 </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="L1663" class="LineNr">1663 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1664" class="LineNr">1664 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1665" class="LineNr">1665 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1666" class="LineNr">1666 </span>    81          0/subop/add         3/mod/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="L1667" class="LineNr">1667 </span>    <span class="subxComment"># skip-until-close-paren(_test-input-stream)</span>
<span id="L1668" class="LineNr">1668 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1669" class="LineNr">1669 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1670" class="LineNr">1670 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1671" class="LineNr">1671 </span>    e8/call  <a href='124next-token.subx.html#L1599'>skip-until-close-paren</a>/disp32
<span id="L1672" class="LineNr">1672 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1673" class="LineNr">1673 </span>    81          0/subop/add         3/mod/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="L1674" class="LineNr">1674 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L1675" class="LineNr">1675 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1676" class="LineNr">1676 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren&quot;</span>/imm32
<span id="L1677" class="LineNr">1677 </span>    68/push  5/imm32
<span id="L1678" class="LineNr">1678 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1679" class="LineNr">1679 </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="L1680" class="LineNr">1680 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1681" class="LineNr">1681 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1682" class="LineNr">1682 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1683" class="LineNr">1683 </span>    81          0/subop/add         3/mod/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="L1684" class="LineNr">1684 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1685" class="LineNr">1685 </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="L1686" class="LineNr">1686 </span>    5d/pop-to-ebp
<span id="L1687" class="LineNr">1687 </span>    c3/return
<span id="L1688" class="LineNr">1688 </span>
<span id="L1689" class="LineNr">1689 </span><span class="subxTest">test-skip-until-close-paren-ignores-spaces</span>:
<span id="L1690" class="LineNr">1690 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1691" class="LineNr">1691 </span>    55/push-ebp
<span id="L1692" class="LineNr">1692 </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="L1693" class="LineNr">1693 </span>    <span class="subxComment"># setup</span>
<span id="L1694" class="LineNr">1694 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1695" class="LineNr">1695 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1696" class="LineNr">1696 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1697" class="LineNr">1697 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1698" class="LineNr">1698 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1699" class="LineNr">1699 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1700" class="LineNr">1700 </span>    81          0/subop/add         3/mod/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="L1701" class="LineNr">1701 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;*(a b)/yz&quot;)</span>
<span id="L1702" class="LineNr">1702 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1703" class="LineNr">1703 </span>    68/push  <span class="Constant">&quot;*(a b)/yz&quot;</span>/imm32
<span id="L1704" class="LineNr">1704 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1705" class="LineNr">1705 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1706" class="LineNr">1706 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1707" class="LineNr">1707 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1708" class="LineNr">1708 </span>    81          0/subop/add         3/mod/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="L1709" class="LineNr">1709 </span>    <span class="subxComment"># precondition: line-&gt;read == 0</span>
<span id="L1710" class="LineNr">1710 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1711" class="LineNr">1711 </span>    68/push  <span class="Constant">&quot;F - <a href='124next-token.subx.html#L1689'>test-skip-until-close-paren-ignores-spaces</a>/precondition&quot;</span>/imm32
<span id="L1712" class="LineNr">1712 </span>    68/push  0/imm32
<span id="L1713" class="LineNr">1713 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1714" class="LineNr">1714 </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="L1715" class="LineNr">1715 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1716" class="LineNr">1716 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1717" class="LineNr">1717 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1718" class="LineNr">1718 </span>    81          0/subop/add         3/mod/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="L1719" class="LineNr">1719 </span>    <span class="subxComment"># skip-until-close-paren(_test-input-stream)</span>
<span id="L1720" class="LineNr">1720 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1721" class="LineNr">1721 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1722" class="LineNr">1722 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1723" class="LineNr">1723 </span>    e8/call  <a href='124next-token.subx.html#L1599'>skip-until-close-paren</a>/disp32
<span id="L1724" class="LineNr">1724 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1725" class="LineNr">1725 </span>    81          0/subop/add         3/mod/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="L1726" class="LineNr">1726 </span>    <span class="subxComment"># check-ints-equal(line-&gt;read, 5, msg)</span>
<span id="L1727" class="LineNr">1727 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1728" class="LineNr">1728 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren-ignores-spaces&quot;</span>/imm32
<span id="L1729" class="LineNr">1729 </span>    68/push  5/imm32
<span id="L1730" class="LineNr">1730 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1731" class="LineNr">1731 </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="L1732" class="LineNr">1732 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1733" class="LineNr">1733 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1734" class="LineNr">1734 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1735" class="LineNr">1735 </span>    81          0/subop/add         3/mod/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="L1736" class="LineNr">1736 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1737" class="LineNr">1737 </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="L1738" class="LineNr">1738 </span>    5d/pop-to-ebp
<span id="L1739" class="LineNr">1739 </span>    c3/return
<span id="L1740" class="LineNr">1740 </span>
<span id="L1741" class="LineNr">1741 </span><span class="subxTest">test-skip-until-close-paren-works-from-mid-stream</span>:
<span id="L1742" class="LineNr">1742 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1743" class="LineNr">1743 </span>    55/push-ebp
<span id="L1744" class="LineNr">1744 </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="L1745" class="LineNr">1745 </span>    <span class="subxComment"># setup</span>
<span id="L1746" class="LineNr">1746 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1747" class="LineNr">1747 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1748" class="LineNr">1748 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1749" class="LineNr">1749 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1750" class="LineNr">1750 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1751" class="LineNr">1751 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1752" class="LineNr">1752 </span>    81          0/subop/add         3/mod/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="L1753" class="LineNr">1753 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;0 *(a b)/yz&quot;)</span>
<span id="L1754" class="LineNr">1754 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1755" class="LineNr">1755 </span>    68/push  <span class="Constant">&quot;0 *(a b)/yz&quot;</span>/imm32
<span id="L1756" class="LineNr">1756 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1757" class="LineNr">1757 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1758" class="LineNr">1758 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L1759" class="LineNr">1759 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1760" class="LineNr">1760 </span>    81          0/subop/add         3/mod/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="L1761" class="LineNr">1761 </span>    <span class="subxComment"># precondition: _test-input-stream-&gt;read == 2</span>
<span id="L1762" class="LineNr">1762 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1763" class="LineNr">1763 </span>    c7          0/subop/copy        1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8         2/imm32           <span class="subxComment"># copy to *(eax+4)</span>
<span id="L1764" class="LineNr">1764 </span>    <span class="subxComment"># skip-until-close-paren(_test-input-stream)</span>
<span id="L1765" class="LineNr">1765 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1766" class="LineNr">1766 </span>    68/push  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1767" class="LineNr">1767 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1768" class="LineNr">1768 </span>    e8/call  <a href='124next-token.subx.html#L1599'>skip-until-close-paren</a>/disp32
<span id="L1769" class="LineNr">1769 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1770" class="LineNr">1770 </span>    81          0/subop/add         3/mod/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="L1771" class="LineNr">1771 </span>    <span class="subxComment"># check-ints-equal(_test-input-stream-&gt;read, 7, msg)</span>
<span id="L1772" class="LineNr">1772 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1773" class="LineNr">1773 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren-works-from-mid-stream&quot;</span>/imm32
<span id="L1774" class="LineNr">1774 </span>    68/push  7/imm32
<span id="L1775" class="LineNr">1775 </span>    b8/copy-to-eax  <a href='112read-byte.subx.html#L331'>_test-input-stream</a>/imm32
<span id="L1776" class="LineNr">1776 </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="L1777" class="LineNr">1777 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1778" class="LineNr">1778 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1779" class="LineNr">1779 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1780" class="LineNr">1780 </span>    81          0/subop/add         3/mod/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="L1781" class="LineNr">1781 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1782" class="LineNr">1782 </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="L1783" class="LineNr">1783 </span>    5d/pop-to-ebp
<span id="L1784" class="LineNr">1784 </span>    c3/return
<span id="L1785" class="LineNr">1785 </span>
<span id="L1786" class="LineNr">1786 </span><span class="subxFunction">skip-until-close-paren-in-slice</span>:  <span class="subxComment"># curr: (addr byte), end: (addr byte) -&gt; curr/eax: (addr byte)</span>
<span id="L1787" class="LineNr">1787 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1788" class="LineNr">1788 </span>    55/push-ebp
<span id="L1789" class="LineNr">1789 </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="L1790" class="LineNr">1790 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1791" class="LineNr">1791 </span>    51/push-ecx
<span id="L1792" class="LineNr">1792 </span>    52/push-edx
<span id="L1793" class="LineNr">1793 </span>    <span class="subxComment"># ecx = curr</span>
<span id="L1794" class="LineNr">1794 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to ecx</span>
<span id="L1795" class="LineNr">1795 </span>    <span class="subxComment"># edx = end</span>
<span id="L1796" class="LineNr">1796 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        2/r32/edx   0xc/disp8        <span class="Normal"> . </span>              <span class="subxComment"># copy *(ebp+12) to edx</span>
<span id="L1797" class="LineNr">1797 </span>    <span class="subxComment"># var c/eax: byte = 0</span>
<span id="L1798" class="LineNr">1798 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L1799" class="LineNr">1799 </span>    <span class="subxComment"># skip initial dquote</span>
<span id="L1800" class="LineNr">1800 </span>    41/increment-ecx
<span id="L1801" class="LineNr">1801 </span><span class="Constant">$skip-until-close-paren-in-slice:loop</span>:
<span id="L1802" class="LineNr">1802 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L1803" class="LineNr">1803 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with edx</span>
<span id="L1804" class="LineNr">1804 </span>    73/jump-if-addr&gt;=  $skip-until-close-paren-in-slice:<span class="Constant">break</span>/disp8
<span id="L1805" class="LineNr">1805 </span>    <span class="subxComment"># c = *curr</span>
<span id="L1806" class="LineNr">1806 </span>    8a/copy-byte                    0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *ecx to AL</span>
<span id="L1807" class="LineNr">1807 </span><span class="Constant">$skip-until-close-paren-in-slice:check-close</span>:
<span id="L1808" class="LineNr">1808 </span>    <span class="subxComment"># if (c == ')') break</span>
<span id="L1809" class="LineNr">1809 </span>    3d/compare-eax-and  0x29/imm32/close-paren
<span id="L1810" class="LineNr">1810 </span>    74/jump-if-=  $skip-until-close-paren-in-slice:<span class="Constant">break</span>/disp8
<span id="L1811" class="LineNr">1811 </span>    <span class="subxComment"># ++curr</span>
<span id="L1812" class="LineNr">1812 </span>    41/increment-ecx
<span id="L1813" class="LineNr">1813 </span>    eb/jump  $skip-until-close-paren-in-slice:<span class="Constant">loop</span>/disp8
<span id="L1814" class="LineNr">1814 </span><span class="Constant">$skip-until-close-paren-in-slice:break</span>:
<span id="L1815" class="LineNr">1815 </span>    <span class="subxComment"># return curr</span>
<span id="L1816" class="LineNr">1816 </span>    89/copy                         3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to eax</span>
<span id="L1817" class="LineNr">1817 </span><span class="Constant">$skip-until-close-paren-in-slice:end</span>:
<span id="L1818" class="LineNr">1818 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1819" class="LineNr">1819 </span>    5a/pop-to-edx
<span id="L1820" class="LineNr">1820 </span>    59/pop-to-ecx
<span id="L1821" class="LineNr">1821 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1822" class="LineNr">1822 </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="L1823" class="LineNr">1823 </span>    5d/pop-to-ebp
<span id="L1824" class="LineNr">1824 </span>    c3/return
<span id="L1825" class="LineNr">1825 </span>
<span id="L1826" class="LineNr">1826 </span><span class="subxTest">test-skip-until-close-paren-in-slice</span>:
<span id="L1827" class="LineNr">1827 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1828" class="LineNr">1828 </span>    55/push-ebp
<span id="L1829" class="LineNr">1829 </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="L1830" class="LineNr">1830 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;*(abc) def&quot;</span>
<span id="L1831" class="LineNr">1831 </span>    b8/copy-to-eax  <span class="Constant">&quot;*(abc) def&quot;</span>/imm32
<span id="L1832" class="LineNr">1832 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1833" class="LineNr">1833 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1834" class="LineNr">1834 </span>    05/add-to-eax  4/imm32
<span id="L1835" class="LineNr">1835 </span>    <span class="subxComment"># eax = skip-until-close-paren-in-slice(eax, ecx)</span>
<span id="L1836" class="LineNr">1836 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1837" class="LineNr">1837 </span>    51/push-ecx
<span id="L1838" class="LineNr">1838 </span>    50/push-eax
<span id="L1839" class="LineNr">1839 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1840" class="LineNr">1840 </span>    e8/call  <a href='124next-token.subx.html#L1786'>skip-until-close-paren-in-slice</a>/disp32
<span id="L1841" class="LineNr">1841 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1842" class="LineNr">1842 </span>    81          0/subop/add         3/mod/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="L1843" class="LineNr">1843 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 5, msg)  # eax is at the ')'</span>
<span id="L1844" class="LineNr">1844 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1845" class="LineNr">1845 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren-in-slice&quot;</span>/imm32
<span id="L1846" class="LineNr">1846 </span>    68/push  5/imm32
<span id="L1847" class="LineNr">1847 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1848" class="LineNr">1848 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1849" class="LineNr">1849 </span>    51/push-ecx
<span id="L1850" class="LineNr">1850 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1851" class="LineNr">1851 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1852" class="LineNr">1852 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1853" class="LineNr">1853 </span>    81          0/subop/add         3/mod/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="L1854" class="LineNr">1854 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1855" class="LineNr">1855 </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="L1856" class="LineNr">1856 </span>    5d/pop-to-ebp
<span id="L1857" class="LineNr">1857 </span>    c3/return
<span id="L1858" class="LineNr">1858 </span>
<span id="L1859" class="LineNr">1859 </span><span class="subxTest">test-skip-until-close-paren-in-slice-ignores-spaces</span>:
<span id="L1860" class="LineNr">1860 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1861" class="LineNr">1861 </span>    55/push-ebp
<span id="L1862" class="LineNr">1862 </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="L1863" class="LineNr">1863 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;*(a b)/yz&quot;</span>
<span id="L1864" class="LineNr">1864 </span>    b8/copy-to-eax  <span class="Constant">&quot;*(a b)/yz&quot;</span>/imm32
<span id="L1865" class="LineNr">1865 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1866" class="LineNr">1866 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1867" class="LineNr">1867 </span>    05/add-to-eax  4/imm32
<span id="L1868" class="LineNr">1868 </span>    <span class="subxComment"># eax = skip-until-close-paren-in-slice(eax, ecx)</span>
<span id="L1869" class="LineNr">1869 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1870" class="LineNr">1870 </span>    51/push-ecx
<span id="L1871" class="LineNr">1871 </span>    50/push-eax
<span id="L1872" class="LineNr">1872 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1873" class="LineNr">1873 </span>    e8/call  <a href='124next-token.subx.html#L1786'>skip-until-close-paren-in-slice</a>/disp32
<span id="L1874" class="LineNr">1874 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1875" class="LineNr">1875 </span>    81          0/subop/add         3/mod/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="L1876" class="LineNr">1876 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 4, msg)  # eax is at the ')'</span>
<span id="L1877" class="LineNr">1877 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1878" class="LineNr">1878 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren-in-slice-ignores-spaces&quot;</span>/imm32
<span id="L1879" class="LineNr">1879 </span>    68/push  4/imm32
<span id="L1880" class="LineNr">1880 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1881" class="LineNr">1881 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1882" class="LineNr">1882 </span>    51/push-ecx
<span id="L1883" class="LineNr">1883 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1884" class="LineNr">1884 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1885" class="LineNr">1885 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1886" class="LineNr">1886 </span>    81          0/subop/add         3/mod/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="L1887" class="LineNr">1887 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1888" class="LineNr">1888 </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="L1889" class="LineNr">1889 </span>    5d/pop-to-ebp
<span id="L1890" class="LineNr">1890 </span>    c3/return
<span id="L1891" class="LineNr">1891 </span>
<span id="L1892" class="LineNr">1892 </span><span class="subxTest">test-skip-until-close-paren-in-slice-stops-at-end</span>:
<span id="L1893" class="LineNr">1893 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1894" class="LineNr">1894 </span>    55/push-ebp
<span id="L1895" class="LineNr">1895 </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="L1896" class="LineNr">1896 </span>    <span class="subxComment"># setup: (eax..ecx) = &quot;*(abc&quot;  # unbalanced dquote</span>
<span id="L1897" class="LineNr">1897 </span>    b8/copy-to-eax  <span class="Constant">&quot;*(abc&quot;</span>/imm32
<span id="L1898" class="LineNr">1898 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L1899" class="LineNr">1899 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L1900" class="LineNr">1900 </span>    05/add-to-eax  4/imm32
<span id="L1901" class="LineNr">1901 </span>    <span class="subxComment"># eax = skip-until-close-paren-in-slice(eax, ecx)</span>
<span id="L1902" class="LineNr">1902 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1903" class="LineNr">1903 </span>    51/push-ecx
<span id="L1904" class="LineNr">1904 </span>    50/push-eax
<span id="L1905" class="LineNr">1905 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1906" class="LineNr">1906 </span>    e8/call  <a href='124next-token.subx.html#L1786'>skip-until-close-paren-in-slice</a>/disp32
<span id="L1907" class="LineNr">1907 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1908" class="LineNr">1908 </span>    81          0/subop/add         3/mod/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="L1909" class="LineNr">1909 </span>    <span class="subxComment"># check-ints-equal(ecx-eax, 0, msg)  # skipped to end of slice</span>
<span id="L1910" class="LineNr">1910 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1911" class="LineNr">1911 </span>    68/push  <span class="Constant">&quot;F - test-skip-until-close-paren-in-slice-stops-at-end&quot;</span>/imm32
<span id="L1912" class="LineNr">1912 </span>    68/push  0/imm32
<span id="L1913" class="LineNr">1913 </span>    <span class="subxS2Comment"># . . push ecx-eax</span>
<span id="L1914" class="LineNr">1914 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract eax from ecx</span>
<span id="L1915" class="LineNr">1915 </span>    51/push-ecx
<span id="L1916" class="LineNr">1916 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1917" class="LineNr">1917 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L1918" class="LineNr">1918 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1919" class="LineNr">1919 </span>    81          0/subop/add         3/mod/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="L1920" class="LineNr">1920 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1921" class="LineNr">1921 </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="L1922" class="LineNr">1922 </span>    5d/pop-to-ebp
<span id="L1923" class="LineNr">1923 </span>    c3/return
<span id="L1924" class="LineNr">1924 </span>
<span id="L1925" class="LineNr">1925 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->