about summary refs log tree commit diff stats
path: root/016index_addressing.cc
blob: 6e1f63e6c848688f4c64b009ed6111c7ae163759 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//: operating on memory at the address provided by some register plus optional scale and offset

:(code)
void test_add_r32_to_mem_at_r32_with_sib() {
  Reg[EBX].i = 0x10;
  Reg[EAX].i = 0x2000;
  run(
      "== code 0x1\n"
      // op     ModR/M  SIB   displacement  immediate
      "  01     1c      20                              \n"  // add EBX to *EAX
      // ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB)
      // SIB in binary: 00 (scale 1) 100 (no index) 000 (base EAX)
      "== data 0x2000\n"
      "01 00 00 00\n"  // 0x00000001
  );
  CHECK_TRACE_CONTENTS(
      "run: add EBX to r/m32\n"
      "run: effective address is initially 0x00002000 (EAX)\n"
      "run: effective address is 0x00002000\n"
      "run: storing 0x00000011\n"
  );
}

:(before "End Mod 0 Special-cases(addr)")
case 4:  // exception: mod 0b00 rm 0b100 => incoming SIB (scale-index-base) byte
  addr = effective_address_from_sib(mod);
  break;
:(code)
uint32_t effective_address_from_sib(uint8_t mod) {
  const uint8_t sib = next();
  const uint8_t base = sib&0x7;
  uint32_t addr = 0;
  if (base != EBP || mod != 0) {
    addr = Reg[base].u;
    trace(Callstack_depth+1, "run") << "effective address is initially 0x" << HEXWORD << addr << " (" << rname(base) << ")" << end();
  }
  else {
    // base == EBP && mod == 0
    addr = next32();  // ignore base
    trace(Callstack_depth+1, "run") << "effective address is initially 0x" << HEXWORD << addr << " (disp32)" << end();
  }
  const uint8_t index = (sib>>3)&0x7;
  if (index == ESP) {
    // ignore index and scale
    trace(Callstack_depth+1, "run") << "effective address is 0x" << HEXWORD << addr << end();
  }
  else {
    const uint8_t scale = (1 << (sib>>6));
    addr += Reg[index].i*scale;  // treat index register as signed. Maybe base as well? But we'll always ensure it's non-negative.
    trace(Callstack_depth+1, "run") << "effective address is 0x" << HEXWORD << addr << " (after adding " << rname(index) << "*" << NUM(scale) << ")" << end();
  }
  return addr;
}

:(code)
void test_add_r32_to_mem_at_base_r32_index_r32() {
  Reg[EBX].i = 0x10;  // source
  Reg[EAX].i = 0x1ffe;  // dest base
  Reg[ECX].i = 0x2;  // dest index
  run(
      "== code 0x1\n"
      // op     ModR/M  SIB   displacement  immediate
      "  01     1c      08                              \n"  // add EBX to *(EAX+ECX)
      // ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB)
      // SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX)
      "== data 0x2000\n"
      "01 00 00 00\n"  // 0x00000001
  );
  CHECK_TRACE_CONTENTS(
      "run: add EBX to r/m32\n"
      "run: effective address is initially 0x00001ffe (EAX)\n"
      "run: effective address is 0x00002000 (after adding ECX*1)\n"
      "run: storing 0x00000011\n"
  );
}

:(code)
void test_add_r32_to_mem_at_displacement_using_sib() {
  Reg[EBX].i = 0x10;  // source
  run(
      "== code 0x1\n"
      // op     ModR/M  SIB   displacement  immediate
      "  01     1c      25    00 20 00 00               \n"  // add EBX to *0x2000
      // ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB)
      // SIB in binary: 00 (scale 1) 100 (no index) 101 (not EBP but disp32)
      "== data 0x2000\n"
      "01 00 00 00\n"  // 0x00000001
  );
  CHECK_TRACE_CONTENTS(
      "run: add EBX to r/m32\n"
      "run: effective address is initially 0x00002000 (disp32)\n"
      "run: effective address is 0x00002000\n"
      "run: storing 0x00000011\n"
  );
}

//:

:(code)
void test_add_r32_to_mem_at_base_r32_index_r32_plus_disp8() {
  Reg[EBX].i = 0x10;  // source
  Reg[EAX].i = 0x1ff9;  // dest base
  Reg[ECX].i = 0x5;  // dest index
  run(
      "== code 0x1\n"
      // op     ModR/M  SIB   displacement  immediate
      "  01     5c      08    02                        \n"  // add EBX to *(EAX+ECX+2)
      // ModR/M in binary: 01 (indirect+disp8 mode) 011 (src EBX) 100 (dest in SIB)
      // SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX)
      "== data 0x2000\n"
      "01 00 00 00\n"  // 0x00000001
  );
  CHECK_TRACE_CONTENTS(
      "run: add EBX to r/m32\n"
      "run: effective address is initially 0x00001ff9 (EAX)\n"
      "run: effective address is 0x00001ffe (after adding ECX*1)\n"
      "run: effective address is 0x00002000 (after adding disp8)\n"
      "run: storing 0x00000011\n"
  );
}

:(before "End Mod 1 Special-cases(addr)")
case 4:  // exception: mod 0b01 rm 0b100 => incoming SIB (scale-index-base) byte
  addr = effective_address_from_sib(mod);
  break;

//:

:(code)
void test_add_r32_to_mem_at_base_r32_index_r32_plus_disp32() {
  Reg[EBX].i = 0x10;  // source
  Reg[EAX].i = 0x1ff9;  // dest base
  Reg[ECX].i = 0x5;  // dest index
  run(
      "== code 0x1\n"
      // op     ModR/M  SIB   displacement  immediate
      "  01     9c      08    02 00 00 00               \n"  // add EBX to *(EAX+ECX+2)
      // ModR/M in binary: 10 (indirect+disp32 mode) 011 (src EBX) 100 (dest in SIB)
      // SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX)
      "== data 0x2000\n"
      "01 00 00 00\n"  // 0x00000001
  );
  CHECK_TRACE_CONTENTS(
      "run: add EBX to r/m32\n"
      "run: effective address is initially 0x00001ff9 (EAX)\n"
      "run: effective address is 0x00001ffe (after adding ECX*1)\n"
      "run: effective address is 0x00002000 (after adding disp32)\n"
      "run: storing 0x00000011\n"
  );
}

:(before "End Mod 2 Special-cases(addr)")
case 4:  // exception: mod 0b10 rm 0b100 => incoming SIB (scale-index-base) byte
  addr = effective_address_from_sib(mod);
  break;
/* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
<!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 - 056trace.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; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</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/056trace.subx'>https://github.com/akkartik/mu/blob/master/056trace.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="subxComment"># primitives for emitting traces to a 'trace' stream, and for tests to make assertions on its contents</span>
<span id="L2" class="LineNr">  2 </span><span class="subxComment">#</span>
<span id="L3" class="LineNr">  3 </span><span class="subxComment"># A trace stream looks like a regular stream:</span>
<span id="L4" class="LineNr">  4 </span><span class="subxComment">#   write: int  # index at which writes go</span>
<span id="L5" class="LineNr">  5 </span><span class="subxComment">#   read: int  # index that we've read until</span>
<span id="L6" class="LineNr">  6 </span><span class="subxComment">#   data: (array byte)  # prefixed by length as usual</span>
<span id="L7" class="LineNr">  7 </span><span class="subxComment"># Usually the trace stream will be in a separate segment set aside for the purpose.</span>
<span id="L8" class="LineNr">  8 </span><span class="subxComment">#</span>
<span id="L9" class="LineNr">  9 </span><span class="subxComment"># primitives for operating on traces (arguments in quotes):</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment">#   - initialize-trace-stream: populates Trace-stream with a new segment of the given 'size'</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxComment">#   - trace: adds a 'line' to Trace-stream</span>
<span id="L12" class="LineNr"> 12 </span><span class="subxComment">#   - check-trace-contains: scans from Trace-stream's start for a matching 'line', prints a 'message' to stderr on failure</span>
<span id="L13" class="LineNr"> 13 </span><span class="subxComment">#   - check-trace-scans-to: scans from Trace-stream's read pointer for a matching 'line', prints a 'message' to stderr on failure</span>
<span id="L14" class="LineNr"> 14 </span>
<span id="L15" class="LineNr"> 15 </span>== data
<span id="L16" class="LineNr"> 16 </span>
<span id="L17" class="LineNr"> 17 </span><span class="subxComment"># Handles are addresses created on the heap.</span>
<span id="L18" class="LineNr"> 18 </span><span class="subxComment"># In safe Mu they'll be fat pointers. But in SubX they're just addresses, since</span>
<span id="L19" class="LineNr"> 19 </span><span class="subxComment"># SubX programs never reclaim memory.</span>
<span id="L20" class="LineNr"> 20 </span>
<span id="L21" class="LineNr"> 21 </span><span class="SpecialChar">Trace-stream</span>:  <span class="subxComment"># (handle stream byte)</span>
<span id="L22" class="LineNr"> 22 </span>    0/imm32
<span id="L23" class="LineNr"> 23 </span>    <span class="subxComment"># we don't have safe handles (fat pointers) yet</span>
<span id="L24" class="LineNr"> 24 </span>
<span id="L25" class="LineNr"> 25 </span><span class="SpecialChar">Trace-segment</span>:
<span id="L26" class="LineNr"> 26 </span>    0/imm32/curr
<span id="L27" class="LineNr"> 27 </span>    0/imm32/limit
<span id="L28" class="LineNr"> 28 </span>
<span id="L29" class="LineNr"> 29 </span><span class="subxComment"># Fake trace-stream for tests.</span>
<span id="L30" class="LineNr"> 30 </span><span class="subxComment"># Also illustrates the layout of the real trace-stream (segment).</span>
<span id="L31" class="LineNr"> 31 </span><span class="subxMinorFunction">_test-trace-stream</span>:  <span class="subxComment"># (stream byte)</span>
<span id="L32" class="LineNr"> 32 </span>    <span class="subxComment"># current write index</span>
<span id="L33" class="LineNr"> 33 </span>    0/imm32
<span id="L34" class="LineNr"> 34 </span>    <span class="subxComment"># current read index</span>
<span id="L35" class="LineNr"> 35 </span>    0/imm32
<span id="L36" class="LineNr"> 36 </span>    <span class="subxComment"># length</span>
<span id="L37" class="LineNr"> 37 </span>    8/imm32
<span id="L38" class="LineNr"> 38 </span>    <span class="subxComment"># data</span>
<span id="L39" class="LineNr"> 39 </span>    00 00 00 00 00 00 00 00  <span class="subxComment"># 8 bytes</span>
<span id="L40" class="LineNr"> 40 </span>
<span id="L41" class="LineNr"> 41 </span>== code
<span id="L42" class="LineNr"> 42 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L43" class="LineNr"> 43 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L44" class="LineNr"> 44 </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="L45" class="LineNr"> 45 </span>
<span id="L46" class="LineNr"> 46 </span><span class="subxComment"># Allocate a new segment for the trace stream, initialize its length, and save its address to Trace-stream.</span>
<span id="L47" class="LineNr"> 47 </span><span class="subxComment"># The Trace-stream segment will consist of variable-length lines separated by newlines (0x0a)</span>
<span id="L48" class="LineNr"> 48 </span><span class="subxFunction">initialize-trace-stream</span>:  <span class="subxComment"># n: int</span>
<span id="L49" class="LineNr"> 49 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L50" class="LineNr"> 50 </span>    55/push-ebp
<span id="L51" class="LineNr"> 51 </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="L52" class="LineNr"> 52 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L53" class="LineNr"> 53 </span>    50/push-eax
<span id="L54" class="LineNr"> 54 </span>    51/push-ecx
<span id="L55" class="LineNr"> 55 </span>    <span class="subxComment"># ecx = n</span>
<span id="L56" class="LineNr"> 56 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to ecx</span>
<span id="L57" class="LineNr"> 57 </span>    <span class="subxComment"># Trace-segment = new-segment(n)</span>
<span id="L58" class="LineNr"> 58 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L59" class="LineNr"> 59 </span>    68/push  <span class="SpecialChar"><a href='056trace.subx.html#L25'>Trace-segment</a></span>/imm32
<span id="L60" class="LineNr"> 60 </span>    51/push-ecx
<span id="L61" class="LineNr"> 61 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L62" class="LineNr"> 62 </span>    e8/call  <a href='053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L63" class="LineNr"> 63 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L64" class="LineNr"> 64 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L65" class="LineNr"> 65 </span>    <span class="subxComment"># copy Trace-segment-&gt;curr to *Trace-stream</span>
<span id="L66" class="LineNr"> 66 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L25'>Trace-segment</a></span>/disp32              <span class="subxComment"># copy *Trace-segment to eax</span>
<span id="L67" class="LineNr"> 67 </span><span class="CommentedCode">#?     # watch point to catch Trace-stream leaks</span>
<span id="L68" class="LineNr"> 68 </span><span class="CommentedCode">#? $watch-1:</span>
<span id="L69" class="LineNr"> 69 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L70" class="LineNr"> 70 </span>    <span class="subxComment"># Trace-stream-&gt;length = n - 12</span>
<span id="L71" class="LineNr"> 71 </span>    <span class="subxS1Comment"># . ecx -= 12</span>
<span id="L72" class="LineNr"> 72 </span>    81          5/subop/subtract    3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># subtract from ecx</span>
<span id="L73" class="LineNr"> 73 </span>    <span class="subxS1Comment"># . Trace-stream-&gt;length = ecx</span>
<span id="L74" class="LineNr"> 74 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *(eax+8)</span>
<span id="L75" class="LineNr"> 75 </span><span class="Constant">$initialize-trace-stream:end</span>:
<span id="L76" class="LineNr"> 76 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L77" class="LineNr"> 77 </span>    59/pop-to-ecx
<span id="L78" class="LineNr"> 78 </span>    58/pop-to-eax
<span id="L79" class="LineNr"> 79 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L80" class="LineNr"> 80 </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="L81" class="LineNr"> 81 </span>    5d/pop-to-ebp
<span id="L82" class="LineNr"> 82 </span>    c3/return
<span id="L83" class="LineNr"> 83 </span>
<span id="L84" class="LineNr"> 84 </span><span class="subxComment"># Append a string to the given trace stream.</span>
<span id="L85" class="LineNr"> 85 </span><span class="subxComment"># Silently give up if it's already full. Or truncate the string if there isn't enough room.</span>
<span id="L86" class="LineNr"> 86 </span><span class="subxFunction">trace</span>:  <span class="subxComment"># line: (addr array byte)</span>
<span id="L87" class="LineNr"> 87 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L88" class="LineNr"> 88 </span>    55/push-ebp
<span id="L89" class="LineNr"> 89 </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="L90" class="LineNr"> 90 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L91" class="LineNr"> 91 </span>    50/push-eax
<span id="L92" class="LineNr"> 92 </span>    51/push-ecx
<span id="L93" class="LineNr"> 93 </span>    52/push-edx
<span id="L94" class="LineNr"> 94 </span>    53/push-ebx
<span id="L95" class="LineNr"> 95 </span>    56/push-esi
<span id="L96" class="LineNr"> 96 </span>    57/push-edi
<span id="L97" class="LineNr"> 97 </span>    <span class="subxComment"># var edi: (addr stream byte) = *Trace-stream</span>
<span id="L98" class="LineNr"> 98 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to edi</span>
<span id="L99" class="LineNr"> 99 </span>    <span class="subxComment"># esi = line</span>
<span id="L100" class="LineNr">100 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <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="L101" class="LineNr">101 </span>    <span class="subxComment"># var ecx: int = t-&gt;write</span>
<span id="L102" class="LineNr">102 </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="L103" class="LineNr">103 </span>    <span class="subxComment"># var edx: int = t-&gt;length</span>
<span id="L104" class="LineNr">104 </span>    8b/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(edi+8) to edx</span>
<span id="L105" class="LineNr">105 </span>    <span class="subxComment"># eax = _append-3(&amp;t-&gt;data[t-&gt;write], &amp;t-&gt;data[t-&gt;length], line)</span>
<span id="L106" class="LineNr">106 </span>    <span class="subxS2Comment"># . . push line</span>
<span id="L107" class="LineNr">107 </span>    56/push-esi
<span id="L108" class="LineNr">108 </span>    <span class="subxS2Comment"># . . push &amp;t-&gt;data[t-&gt;length]</span>
<span id="L109" class="LineNr">109 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    7/base/edi  2/index/edx  <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy edi+edx+12 to ebx</span>
<span id="L110" class="LineNr">110 </span>    53/push-ebx
<span id="L111" class="LineNr">111 </span>    <span class="subxS2Comment"># . . push &amp;t-&gt;data[t-&gt;write]</span>
<span id="L112" class="LineNr">112 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    7/base/edi  1/index/ecx  <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy edi+ecx+12 to ebx</span>
<span id="L113" class="LineNr">113 </span>    53/push-ebx
<span id="L114" class="LineNr">114 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L115" class="LineNr">115 </span>    e8/call  <a href='056trace.subx.html#L865'>_append-3</a>/disp32
<span id="L116" class="LineNr">116 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L117" class="LineNr">117 </span>    81          0/subop/add         3/mod/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="L118" class="LineNr">118 </span>    <span class="subxComment"># if (eax == 0) return</span>
<span id="L119" class="LineNr">119 </span>    3d/compare-eax-and  0/imm32
<span id="L120" class="LineNr">120 </span>    74/jump-if-=  $trace:end/disp8
<span id="L121" class="LineNr">121 </span>    <span class="subxComment"># t-&gt;write += eax</span>
<span id="L122" class="LineNr">122 </span>    01/add                          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"># add eax to *edi</span>
<span id="L123" class="LineNr">123 </span>    <span class="subxComment"># refresh ecx = t-&gt;write</span>
<span id="L124" class="LineNr">124 </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="L125" class="LineNr">125 </span>    <span class="subxComment"># eax = _append-3(&amp;t-&gt;data[t-&gt;write], &amp;t-&gt;data[t-&gt;length], line)</span>
<span id="L126" class="LineNr">126 </span>    <span class="subxS2Comment"># . . push line</span>
<span id="L127" class="LineNr">127 </span>    68/push  <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L128" class="LineNr">128 </span>    <span class="subxS2Comment"># . . push &amp;t-&gt;data[t-&gt;length]</span>
<span id="L129" class="LineNr">129 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    7/base/edi  2/index/edx  <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy edi+edx+12 to ebx</span>
<span id="L130" class="LineNr">130 </span>    53/push-ebx
<span id="L131" class="LineNr">131 </span>    <span class="subxS2Comment"># . . push &amp;t-&gt;data[t-&gt;write]</span>
<span id="L132" class="LineNr">132 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    7/base/edi  1/index/ecx  <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy edi+ecx+12 to ebx</span>
<span id="L133" class="LineNr">133 </span>    53/push-ebx
<span id="L134" class="LineNr">134 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L135" class="LineNr">135 </span>    e8/call  <a href='056trace.subx.html#L865'>_append-3</a>/disp32
<span id="L136" class="LineNr">136 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L137" class="LineNr">137 </span>    81          0/subop/add         3/mod/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="L138" class="LineNr">138 </span>    <span class="subxComment"># t-&gt;write += eax</span>
<span id="L139" class="LineNr">139 </span>    01/add                          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"># add eax to *edi</span>
<span id="L140" class="LineNr">140 </span><span class="Constant">$trace:end</span>:
<span id="L141" class="LineNr">141 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L142" class="LineNr">142 </span>    5f/pop-to-edi
<span id="L143" class="LineNr">143 </span>    5e/pop-to-esi
<span id="L144" class="LineNr">144 </span>    5b/pop-to-ebx
<span id="L145" class="LineNr">145 </span>    5a/pop-to-edx
<span id="L146" class="LineNr">146 </span>    59/pop-to-ecx
<span id="L147" class="LineNr">147 </span>    58/pop-to-eax
<span id="L148" class="LineNr">148 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L149" class="LineNr">149 </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="L150" class="LineNr">150 </span>    5d/pop-to-ebp
<span id="L151" class="LineNr">151 </span>    c3/return
<span id="L152" class="LineNr">152 </span>
<span id="L153" class="LineNr">153 </span><span class="subxTest">test-trace-single</span>:
<span id="L154" class="LineNr">154 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L155" class="LineNr">155 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L156" class="LineNr">156 </span>    <span class="subxComment"># *Trace-stream = _test-trace-stream</span>
<span id="L157" class="LineNr">157 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L158" class="LineNr">158 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L159" class="LineNr">159 </span>    <span class="subxComment"># clear-trace-stream()</span>
<span id="L160" class="LineNr">160 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L161" class="LineNr">161 </span>    <span class="subxComment"># trace(&quot;Ab&quot;)</span>
<span id="L162" class="LineNr">162 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L163" class="LineNr">163 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L164" class="LineNr">164 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L165" class="LineNr">165 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L166" class="LineNr">166 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L167" class="LineNr">167 </span>    81          0/subop/add         3/mod/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="L168" class="LineNr">168 </span>    <span class="subxComment"># check-ints-equal(*_test-trace-stream-&gt;data, 41/A 62/b 0a/newline 00, msg)</span>
<span id="L169" class="LineNr">169 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L170" class="LineNr">170 </span>    68/push  <span class="Constant">&quot;F - test-trace-single&quot;</span>/imm32
<span id="L171" class="LineNr">171 </span>    68/push  0x0a6241/imm32/Ab-newline
<span id="L172" class="LineNr">172 </span>    <span class="subxS2Comment"># . . push *_test-trace-stream-&gt;data</span>
<span id="L173" class="LineNr">173 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L174" class="LineNr">174 </span>    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(eax+12)</span>
<span id="L175" class="LineNr">175 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L176" class="LineNr">176 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L177" class="LineNr">177 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L178" class="LineNr">178 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L179" class="LineNr">179 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L180" class="LineNr">180 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L181" class="LineNr">181 </span>    <span class="subxComment"># end</span>
<span id="L182" class="LineNr">182 </span>    c3/return
<span id="L183" class="LineNr">183 </span>
<span id="L184" class="LineNr">184 </span><span class="subxTest">test-trace-appends</span>:
<span id="L185" class="LineNr">185 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L186" class="LineNr">186 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L187" class="LineNr">187 </span>    <span class="subxComment"># *Trace-stream = _test-trace-stream</span>
<span id="L188" class="LineNr">188 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L189" class="LineNr">189 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L190" class="LineNr">190 </span>    <span class="subxComment"># clear-trace-stream()</span>
<span id="L191" class="LineNr">191 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L192" class="LineNr">192 </span>    <span class="subxComment"># trace(&quot;C&quot;)</span>
<span id="L193" class="LineNr">193 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L194" class="LineNr">194 </span>    68/push  <span class="Constant">&quot;C&quot;</span>/imm32
<span id="L195" class="LineNr">195 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L196" class="LineNr">196 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L197" class="LineNr">197 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L198" class="LineNr">198 </span>    81          0/subop/add         3/mod/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="L199" class="LineNr">199 </span>    <span class="subxComment"># trace(&quot;D&quot;)</span>
<span id="L200" class="LineNr">200 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L201" class="LineNr">201 </span>    68/push  <span class="Constant">&quot;D&quot;</span>/imm32
<span id="L202" class="LineNr">202 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L204" class="LineNr">204 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L206" class="LineNr">206 </span>    <span class="subxComment"># check-ints-equal(*_test-trace-stream-&gt;data, 43/C 0a/newline 44/D 0a/newline, msg)</span>
<span id="L207" class="LineNr">207 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L208" class="LineNr">208 </span>    68/push  <span class="Constant">&quot;F - test-trace-appends&quot;</span>/imm32
<span id="L209" class="LineNr">209 </span>    68/push  0x0a440a43/imm32/C-newline-D-newline
<span id="L210" class="LineNr">210 </span>    <span class="subxS2Comment"># . . push *_test-trace-stream-&gt;data</span>
<span id="L211" class="LineNr">211 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L212" class="LineNr">212 </span>    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(eax+12)</span>
<span id="L213" class="LineNr">213 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L214" class="LineNr">214 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L215" class="LineNr">215 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L216" class="LineNr">216 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L217" class="LineNr">217 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L218" class="LineNr">218 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L219" class="LineNr">219 </span>    <span class="subxComment"># end</span>
<span id="L220" class="LineNr">220 </span>    c3/return
<span id="L221" class="LineNr">221 </span>
<span id="L222" class="LineNr">222 </span><span class="subxTest">test-trace-empty-line</span>:
<span id="L223" class="LineNr">223 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L224" class="LineNr">224 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L225" class="LineNr">225 </span>    <span class="subxComment"># *Trace-stream = _test-trace-stream</span>
<span id="L226" class="LineNr">226 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L227" class="LineNr">227 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L228" class="LineNr">228 </span>    <span class="subxComment"># clear-trace-stream()</span>
<span id="L229" class="LineNr">229 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L230" class="LineNr">230 </span>    <span class="subxComment"># trace(&quot;&quot;)</span>
<span id="L231" class="LineNr">231 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L232" class="LineNr">232 </span>    68/push  <span class="Constant">&quot;&quot;</span>/imm32
<span id="L233" class="LineNr">233 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L234" class="LineNr">234 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L235" class="LineNr">235 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L236" class="LineNr">236 </span>    81          0/subop/add         3/mod/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="L237" class="LineNr">237 </span>    <span class="subxComment"># check-ints-equal(*_test-trace-stream-&gt;data, 0, msg)</span>
<span id="L238" class="LineNr">238 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L239" class="LineNr">239 </span>    68/push  <span class="Constant">&quot;F - test-trace-empty-line&quot;</span>/imm32
<span id="L240" class="LineNr">240 </span>    68/push  0/imm32
<span id="L241" class="LineNr">241 </span>    <span class="subxS2Comment"># . . push *_test-trace-stream-&gt;data</span>
<span id="L242" class="LineNr">242 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L243" class="LineNr">243 </span>    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(eax+12)</span>
<span id="L244" class="LineNr">244 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L245" class="LineNr">245 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L246" class="LineNr">246 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L247" class="LineNr">247 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L248" class="LineNr">248 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L249" class="LineNr">249 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L250" class="LineNr">250 </span>    <span class="subxComment"># end</span>
<span id="L251" class="LineNr">251 </span>    c3/return
<span id="L252" class="LineNr">252 </span>
<span id="L253" class="LineNr">253 </span><span class="subxFunction">check-trace-contains</span>:  <span class="subxComment"># line: (addr string), msg: (addr string)</span>
<span id="L254" class="LineNr">254 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L255" class="LineNr">255 </span>    55/push-ebp
<span id="L256" class="LineNr">256 </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="L257" class="LineNr">257 </span>    <span class="subxComment"># rewind-stream(*Trace-stream)</span>
<span id="L258" class="LineNr">258 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L259" class="LineNr">259 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L260" class="LineNr">260 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L261" class="LineNr">261 </span>    e8/call  <a href='055stream.subx.html#L56'>rewind-stream</a>/disp32
<span id="L262" class="LineNr">262 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L263" class="LineNr">263 </span>    81          0/subop/add         3/mod/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="L264" class="LineNr">264 </span>    <span class="subxComment"># check-trace-scans-to(line, msg)</span>
<span id="L265" class="LineNr">265 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L266" class="LineNr">266 </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="L267" class="LineNr">267 </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="L268" class="LineNr">268 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L269" class="LineNr">269 </span>    e8/call  <a href='056trace.subx.html#L278'>check-trace-scans-to</a>/disp32
<span id="L270" class="LineNr">270 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L271" class="LineNr">271 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L272" class="LineNr">272 </span><span class="Constant">$check-trace-contains:end</span>:
<span id="L273" class="LineNr">273 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L274" class="LineNr">274 </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="L275" class="LineNr">275 </span>    5d/pop-to-ebp
<span id="L276" class="LineNr">276 </span>    c3/return
<span id="L277" class="LineNr">277 </span>
<span id="L278" class="LineNr">278 </span><span class="subxFunction">check-trace-scans-to</span>:  <span class="subxComment"># line: (addr string), msg: (addr string)</span>
<span id="L279" class="LineNr">279 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L280" class="LineNr">280 </span>    55/push-ebp
<span id="L281" class="LineNr">281 </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="L282" class="LineNr">282 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L283" class="LineNr">283 </span>    50/push-eax
<span id="L284" class="LineNr">284 </span>    <span class="subxComment"># eax = trace-scan(line)</span>
<span id="L285" class="LineNr">285 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L286" class="LineNr">286 </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="L287" class="LineNr">287 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L288" class="LineNr">288 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L289" class="LineNr">289 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L290" class="LineNr">290 </span>    81          0/subop/add         3/mod/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="L291" class="LineNr">291 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L292" class="LineNr">292 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L293" class="LineNr">293 </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="L294" class="LineNr">294 </span>    68/push  1/imm32
<span id="L295" class="LineNr">295 </span>    50/push-eax
<span id="L296" class="LineNr">296 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L297" class="LineNr">297 </span>    e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L298" class="LineNr">298 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L299" class="LineNr">299 </span>    81          0/subop/add         3/mod/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="L300" class="LineNr">300 </span><span class="Constant">$check-trace-scans-to:end</span>:
<span id="L301" class="LineNr">301 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L302" class="LineNr">302 </span>    58/pop-to-eax
<span id="L303" class="LineNr">303 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L304" class="LineNr">304 </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="L305" class="LineNr">305 </span>    5d/pop-to-ebp
<span id="L306" class="LineNr">306 </span>    c3/return
<span id="L307" class="LineNr">307 </span>
<span id="L308" class="LineNr">308 </span><span class="subxComment"># Start scanning from Trace-stream-&gt;read for 'line'. If found, update Trace-stream-&gt;read and return true.</span>
<span id="L309" class="LineNr">309 </span><span class="subxFunction">trace-scan</span>:  <span class="subxComment"># line: (addr array byte) -&gt; result/eax: boolean</span>
<span id="L310" class="LineNr">310 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L311" class="LineNr">311 </span>    <span class="subxComment">#   push Trace-stream-&gt;read</span>
<span id="L312" class="LineNr">312 </span>    <span class="subxComment">#   while true:</span>
<span id="L313" class="LineNr">313 </span>    <span class="subxComment">#     if Trace-stream-&gt;read &gt;= Trace-stream-&gt;write</span>
<span id="L314" class="LineNr">314 </span>    <span class="subxComment">#       break</span>
<span id="L315" class="LineNr">315 </span>    <span class="subxComment">#     if next-line-matches?(Trace-stream, line)</span>
<span id="L316" class="LineNr">316 </span>    <span class="subxComment">#       skip-next-line(Trace-stream)</span>
<span id="L317" class="LineNr">317 </span>    <span class="subxComment">#       dump saved copy of Trace-stream-&gt;read</span>
<span id="L318" class="LineNr">318 </span>    <span class="subxComment">#       return true</span>
<span id="L319" class="LineNr">319 </span>    <span class="subxComment">#     skip-next-line(Trace-stream)</span>
<span id="L320" class="LineNr">320 </span>    <span class="subxComment">#   pop saved copy of Trace-stream-&gt;read</span>
<span id="L321" class="LineNr">321 </span>    <span class="subxComment">#   return false</span>
<span id="L322" class="LineNr">322 </span>    <span class="subxComment">#</span>
<span id="L323" class="LineNr">323 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L324" class="LineNr">324 </span>    55/push-ebp
<span id="L325" class="LineNr">325 </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="L326" class="LineNr">326 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L327" class="LineNr">327 </span>    51/push-ecx
<span id="L328" class="LineNr">328 </span>    56/push-esi
<span id="L329" class="LineNr">329 </span>    <span class="subxComment"># esi = *Trace-stream</span>
<span id="L330" class="LineNr">330 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to esi</span>
<span id="L331" class="LineNr">331 </span>    <span class="subxComment"># ecx = Trace-stream-&gt;write</span>
<span id="L332" class="LineNr">332 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx                  <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ecx</span>
<span id="L333" class="LineNr">333 </span>    <span class="subxComment"># push Trace-stream-&gt;read</span>
<span id="L334" class="LineNr">334 </span>    ff          6/subop/push        1/mod/*+disp8   6/rm32/esi   <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 *(esi+4)</span>
<span id="L335" class="LineNr">335 </span><span class="Constant">$trace-scan:loop</span>:
<span id="L336" class="LineNr">336 </span>    <span class="subxComment"># if (Trace-stream-&gt;read &gt;= Trace-stream-&gt;write) return false</span>
<span id="L337" class="LineNr">337 </span>    39/compare                      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"># compare ecx with *(esi+4)</span>
<span id="L338" class="LineNr">338 </span>    7d/jump-if-&gt;=  $trace-scan:false/disp8
<span id="L339" class="LineNr">339 </span>    <span class="subxComment"># eax = next-line-matches?(Trace-stream, line)</span>
<span id="L340" class="LineNr">340 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L341" class="LineNr">341 </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="L342" class="LineNr">342 </span>    56/push-esi
<span id="L343" class="LineNr">343 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L344" class="LineNr">344 </span>    e8/call  <a href='056trace.subx.html#L561'>next-line-matches?</a>/disp32
<span id="L345" class="LineNr">345 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L346" class="LineNr">346 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L347" class="LineNr">347 </span>    <span class="subxComment"># if (eax == false) continue</span>
<span id="L348" class="LineNr">348 </span>    3d/compare-eax-and  0/imm32/false
<span id="L349" class="LineNr">349 </span>    74/jump-if-=  $trace-scan:continue/disp8
<span id="L350" class="LineNr">350 </span><span class="Constant">$trace-scan:true</span>:
<span id="L351" class="LineNr">351 </span>    <span class="subxComment"># skip-next-line(Trace-stream)</span>
<span id="L352" class="LineNr">352 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L353" class="LineNr">353 </span>    56/push-esi
<span id="L354" class="LineNr">354 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L355" class="LineNr">355 </span>    e8/call  <a href='056trace.subx.html#L737'>skip-next-line</a>/disp32
<span id="L356" class="LineNr">356 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L357" class="LineNr">357 </span>    81          0/subop/add         3/mod/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="L358" class="LineNr">358 </span>    <span class="subxComment"># dump saved copy of Trace-stream-&gt;read</span>
<span id="L359" class="LineNr">359 </span>    81          0/subop/add         3/mod/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="L360" class="LineNr">360 </span>    <span class="subxComment"># return true</span>
<span id="L361" class="LineNr">361 </span>    b8/copy-to-eax  1/imm32/true
<span id="L362" class="LineNr">362 </span>    eb/jump  $trace-scan:end/disp8
<span id="L363" class="LineNr">363 </span><span class="Constant">$trace-scan:continue</span>:
<span id="L364" class="LineNr">364 </span>    <span class="subxComment"># skip-next-line(Trace-stream)</span>
<span id="L365" class="LineNr">365 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L366" class="LineNr">366 </span>    56/push-esi
<span id="L367" class="LineNr">367 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L368" class="LineNr">368 </span>    e8/call  <a href='056trace.subx.html#L737'>skip-next-line</a>/disp32
<span id="L369" class="LineNr">369 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L370" class="LineNr">370 </span>    81          0/subop/add         3/mod/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="L371" class="LineNr">371 </span>    eb/jump  $trace-scan:<span class="Constant">loop</span>/disp8
<span id="L372" class="LineNr">372 </span><span class="Constant">$trace-scan:false</span>:
<span id="L373" class="LineNr">373 </span>    <span class="subxComment"># restore saved copy of Trace-stream-&gt;read</span>
<span id="L374" class="LineNr">374 </span>    8f          0/subop/pop         1/mod/*+disp8   6/rm32/esi   <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"># pop to *(esi+4)</span>
<span id="L375" class="LineNr">375 </span>    <span class="subxComment"># return false</span>
<span id="L376" class="LineNr">376 </span>    b8/copy-to-eax  0/imm32/false
<span id="L377" class="LineNr">377 </span><span class="Constant">$trace-scan:end</span>:
<span id="L378" class="LineNr">378 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L379" class="LineNr">379 </span>    59/pop-to-ecx
<span id="L380" class="LineNr">380 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L381" class="LineNr">381 </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="L382" class="LineNr">382 </span>    5d/pop-to-ebp
<span id="L383" class="LineNr">383 </span>    c3/return
<span id="L384" class="LineNr">384 </span>
<span id="L385" class="LineNr">385 </span><span class="subxTest">test-trace-scan-first</span>:
<span id="L386" class="LineNr">386 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L387" class="LineNr">387 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L388" class="LineNr">388 </span>    <span class="subxComment"># setup</span>
<span id="L389" class="LineNr">389 </span>    <span class="subxS1Comment"># . *Trace-stream = _test-trace-stream</span>
<span id="L390" class="LineNr">390 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L391" class="LineNr">391 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L392" class="LineNr">392 </span>    <span class="subxS1Comment"># . clear-trace-stream()</span>
<span id="L393" class="LineNr">393 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L394" class="LineNr">394 </span>    <span class="subxS1Comment"># . trace(&quot;Ab&quot;)</span>
<span id="L395" class="LineNr">395 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L396" class="LineNr">396 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L397" class="LineNr">397 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L398" class="LineNr">398 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L399" class="LineNr">399 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L400" class="LineNr">400 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L401" class="LineNr">401 </span>    <span class="subxComment"># eax = trace-scan(&quot;Ab&quot;)</span>
<span id="L402" class="LineNr">402 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L403" class="LineNr">403 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L404" class="LineNr">404 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L405" class="LineNr">405 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L406" class="LineNr">406 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L407" class="LineNr">407 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L408" class="LineNr">408 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L409" class="LineNr">409 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L410" class="LineNr">410 </span>    68/push  <span class="Constant">&quot;F - test-trace-scan-first&quot;</span>/imm32
<span id="L411" class="LineNr">411 </span>    68/push  1/imm32
<span id="L412" class="LineNr">412 </span>    50/push-eax
<span id="L413" class="LineNr">413 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L414" class="LineNr">414 </span>    e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L415" class="LineNr">415 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L416" class="LineNr">416 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L417" class="LineNr">417 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L418" class="LineNr">418 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L419" class="LineNr">419 </span>    <span class="subxS1Comment"># . end</span>
<span id="L420" class="LineNr">420 </span>    c3/return
<span id="L421" class="LineNr">421 </span>
<span id="L422" class="LineNr">422 </span><span class="subxTest">test-trace-scan-skips-lines-until-found</span>:
<span id="L423" class="LineNr">423 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L424" class="LineNr">424 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L425" class="LineNr">425 </span>    <span class="subxComment"># setup</span>
<span id="L426" class="LineNr">426 </span>    <span class="subxS1Comment"># . *Trace-stream = _test-trace-stream</span>
<span id="L427" class="LineNr">427 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L428" class="LineNr">428 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L429" class="LineNr">429 </span>    <span class="subxS1Comment"># . clear-trace-stream()</span>
<span id="L430" class="LineNr">430 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L431" class="LineNr">431 </span>    <span class="subxS1Comment"># . trace(&quot;Ab&quot;)</span>
<span id="L432" class="LineNr">432 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L433" class="LineNr">433 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L434" class="LineNr">434 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L435" class="LineNr">435 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L436" class="LineNr">436 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L437" class="LineNr">437 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L438" class="LineNr">438 </span>    <span class="subxS1Comment"># . trace(&quot;cd&quot;)</span>
<span id="L439" class="LineNr">439 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L440" class="LineNr">440 </span>    68/push  <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L441" class="LineNr">441 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L442" class="LineNr">442 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L443" class="LineNr">443 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L444" class="LineNr">444 </span>    81          0/subop/add         3/mod/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="L445" class="LineNr">445 </span>    <span class="subxComment"># eax = trace-scan(&quot;cd&quot;)</span>
<span id="L446" class="LineNr">446 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L447" class="LineNr">447 </span>    68/push  <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L448" class="LineNr">448 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L449" class="LineNr">449 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L450" class="LineNr">450 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L451" class="LineNr">451 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L452" class="LineNr">452 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L453" class="LineNr">453 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L454" class="LineNr">454 </span>    68/push  <span class="Constant">&quot;F - test-trace-scan-skips-lines-until-found&quot;</span>/imm32
<span id="L455" class="LineNr">455 </span>    68/push  1/imm32
<span id="L456" class="LineNr">456 </span>    50/push-eax
<span id="L457" class="LineNr">457 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L458" class="LineNr">458 </span>    e8/call <a href='051test.subx.html#L24'>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"># pop into *Trace-stream</span>
<span id="L462" class="LineNr">462 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L463" class="LineNr">463 </span>    <span class="subxS1Comment"># . end</span>
<span id="L464" class="LineNr">464 </span>    c3/return
<span id="L465" class="LineNr">465 </span>
<span id="L466" class="LineNr">466 </span><span class="subxTest">test-trace-second-scan-starts-where-first-left-off</span>:
<span id="L467" class="LineNr">467 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L468" class="LineNr">468 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L469" class="LineNr">469 </span>    <span class="subxComment"># setup</span>
<span id="L470" class="LineNr">470 </span>    <span class="subxS1Comment"># . *Trace-stream = _test-trace-stream</span>
<span id="L471" class="LineNr">471 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L472" class="LineNr">472 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L473" class="LineNr">473 </span>    <span class="subxS1Comment"># . clear-trace-stream()</span>
<span id="L474" class="LineNr">474 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L475" class="LineNr">475 </span>    <span class="subxS1Comment"># . trace(&quot;Ab&quot;)</span>
<span id="L476" class="LineNr">476 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L477" class="LineNr">477 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L478" class="LineNr">478 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L479" class="LineNr">479 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L480" class="LineNr">480 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L481" class="LineNr">481 </span>    81          0/subop/add         3/mod/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="L482" class="LineNr">482 </span>    <span class="subxS1Comment"># . eax = trace-scan(&quot;Ab&quot;)</span>
<span id="L483" class="LineNr">483 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L484" class="LineNr">484 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L485" class="LineNr">485 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L486" class="LineNr">486 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L487" class="LineNr">487 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L488" class="LineNr">488 </span>    81          0/subop/add         3/mod/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="L489" class="LineNr">489 </span>    <span class="subxComment"># second scan fails</span>
<span id="L490" class="LineNr">490 </span>    <span class="subxS1Comment"># . eax = trace-scan(&quot;Ab&quot;)</span>
<span id="L491" class="LineNr">491 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L492" class="LineNr">492 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L493" class="LineNr">493 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L494" class="LineNr">494 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L495" class="LineNr">495 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L496" class="LineNr">496 </span>    81          0/subop/add         3/mod/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="L497" class="LineNr">497 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L498" class="LineNr">498 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L499" class="LineNr">499 </span>    68/push  <span class="Constant">&quot;F - test-trace-second-scan-starts-where-first-left-off&quot;</span>/imm32
<span id="L500" class="LineNr">500 </span>    68/push  0/imm32
<span id="L501" class="LineNr">501 </span>    50/push-eax
<span id="L502" class="LineNr">502 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L503" class="LineNr">503 </span>    e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L504" class="LineNr">504 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L505" class="LineNr">505 </span>    81          0/subop/add         3/mod/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="L506" class="LineNr">506 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L507" class="LineNr">507 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L508" class="LineNr">508 </span>    <span class="subxS1Comment"># . end</span>
<span id="L509" class="LineNr">509 </span>    c3/return
<span id="L510" class="LineNr">510 </span>
<span id="L511" class="LineNr">511 </span><span class="subxTest">test-trace-scan-failure-leaves-read-index-untouched</span>:
<span id="L512" class="LineNr">512 </span>    <span class="subxComment"># push *Trace-stream</span>
<span id="L513" class="LineNr">513 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L514" class="LineNr">514 </span>    <span class="subxComment"># setup</span>
<span id="L515" class="LineNr">515 </span>    <span class="subxS1Comment"># . *Trace-stream = _test-trace-stream</span>
<span id="L516" class="LineNr">516 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L517" class="LineNr">517 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy eax to *Trace-stream</span>
<span id="L518" class="LineNr">518 </span>    <span class="subxS1Comment"># . clear-trace-stream()</span>
<span id="L519" class="LineNr">519 </span>    e8/call  <a href='056trace.subx.html#L845'>clear-trace-stream</a>/disp32
<span id="L520" class="LineNr">520 </span>    <span class="subxS1Comment"># . trace(&quot;Ab&quot;)</span>
<span id="L521" class="LineNr">521 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L522" class="LineNr">522 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L523" class="LineNr">523 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L524" class="LineNr">524 </span>    e8/call  <a href='056trace.subx.html#L86'>trace</a>/disp32
<span id="L525" class="LineNr">525 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L526" class="LineNr">526 </span>    81          0/subop/add         3/mod/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="L527" class="LineNr">527 </span>    <span class="subxS1Comment"># . check-ints-equal(_test-trace-stream-&gt;read, 0, msg)</span>
<span id="L528" class="LineNr">528 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L529" class="LineNr">529 </span>    68/push  <span class="Constant">&quot;F - <a href='056trace.subx.html#L466'>test-trace-second-scan-starts-where-first-left-off</a>/precondition-failure&quot;</span>/imm32
<span id="L530" class="LineNr">530 </span>    68/push  0/imm32
<span id="L531" class="LineNr">531 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L532" class="LineNr">532 </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="L533" class="LineNr">533 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L534" class="LineNr">534 </span>    e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L535" class="LineNr">535 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L536" class="LineNr">536 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L537" class="LineNr">537 </span>    <span class="subxComment"># perform a failing scan</span>
<span id="L538" class="LineNr">538 </span>    <span class="subxS1Comment"># . eax = trace-scan(&quot;Ax&quot;)</span>
<span id="L539" class="LineNr">539 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L540" class="LineNr">540 </span>    68/push  <span class="Constant">&quot;Ax&quot;</span>/imm32
<span id="L541" class="LineNr">541 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L542" class="LineNr">542 </span>    e8/call  <a href='056trace.subx.html#L309'>trace-scan</a>/disp32
<span id="L543" class="LineNr">543 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L544" class="LineNr">544 </span>    81          0/subop/add         3/mod/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="L545" class="LineNr">545 </span>    <span class="subxComment"># no change in read index</span>
<span id="L546" class="LineNr">546 </span>    <span class="subxS1Comment"># . check-ints-equal(_test-trace-stream-&gt;read, 0, msg)</span>
<span id="L547" class="LineNr">547 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L548" class="LineNr">548 </span>    68/push  <span class="Constant">&quot;F - test-trace-second-scan-starts-where-first-left-off&quot;</span>/imm32
<span id="L549" class="LineNr">549 </span>    68/push  0/imm32
<span id="L550" class="LineNr">550 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L31'>_test-trace-stream</a>/imm32
<span id="L551" class="LineNr">551 </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="L552" class="LineNr">552 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L553" class="LineNr">553 </span>    e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L554" class="LineNr">554 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L555" class="LineNr">555 </span>    81          0/subop/add         3/mod/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="L556" class="LineNr">556 </span>    <span class="subxComment"># pop into *Trace-stream</span>
<span id="L557" class="LineNr">557 </span>    8f          0/subop/pop         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># pop into *Trace-stream</span>
<span id="L558" class="LineNr">558 </span>    <span class="subxS1Comment"># . end</span>
<span id="L559" class="LineNr">559 </span>    c3/return
<span id="L560" class="LineNr">560 </span>
<span id="L561" class="LineNr">561 </span><span class="subxFunction">next-line-matches?</span>:  <span class="subxComment"># t: (addr stream byte), line: (addr array byte) -&gt; result/eax: boolean</span>
<span id="L562" class="LineNr">562 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L563" class="LineNr">563 </span>    <span class="subxComment">#   while true:</span>
<span id="L564" class="LineNr">564 </span>    <span class="subxComment">#     if (currl &gt;= maxl) break</span>
<span id="L565" class="LineNr">565 </span>    <span class="subxComment">#     if (currt &gt;= maxt) return false</span>
<span id="L566" class="LineNr">566 </span>    <span class="subxComment">#     if (*currt != *currl) return false</span>
<span id="L567" class="LineNr">567 </span>    <span class="subxComment">#     ++currt</span>
<span id="L568" class="LineNr">568 </span>    <span class="subxComment">#     ++currl</span>
<span id="L569" class="LineNr">569 </span>    <span class="subxComment">#   return *currt == '\n'</span>
<span id="L570" class="LineNr">570 </span>    <span class="subxComment">#</span>
<span id="L571" class="LineNr">571 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L572" class="LineNr">572 </span>    55/push-ebp
<span id="L573" class="LineNr">573 </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="L574" class="LineNr">574 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L575" class="LineNr">575 </span>    51/push-ecx
<span id="L576" class="LineNr">576 </span>    52/push-edx
<span id="L577" class="LineNr">577 </span>    53/push-ebx
<span id="L578" class="LineNr">578 </span>    56/push-esi
<span id="L579" class="LineNr">579 </span>    57/push-edi
<span id="L580" class="LineNr">580 </span>    <span class="subxComment"># edx = line</span>
<span id="L581" class="LineNr">581 </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="L582" class="LineNr">582 </span>    <span class="subxComment"># var currl/esi: (addr byte) = line-&gt;data</span>
<span id="L583" class="LineNr">583 </span>    <span class="subxS1Comment"># . esi = line/edx-&gt;data</span>
<span id="L584" class="LineNr">584 </span>    8d/copy-address                 1/mod/*+disp8   2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy edx+4 to esi</span>
<span id="L585" class="LineNr">585 </span>    <span class="subxComment"># var maxl/ecx: (addr byte) = &amp;line-&gt;data[line-&gt;size]</span>
<span id="L586" class="LineNr">586 </span>    <span class="subxS1Comment"># . eax = line/edx-&gt;size</span>
<span id="L587" class="LineNr">587 </span>    8b/copy                         0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edx to eax</span>
<span id="L588" class="LineNr">588 </span>    <span class="subxS1Comment"># . maxl = &amp;line-&gt;data[line-&gt;size]</span>
<span id="L589" class="LineNr">589 </span>    8d/copy-address                 0/mod/indirect  4/rm32/sib    6/base/esi  0/index/eax  <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy edx+eax to ecx</span>
<span id="L590" class="LineNr">590 </span>    <span class="subxComment"># edi = t</span>
<span id="L591" class="LineNr">591 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        7/r32/edi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to edi</span>
<span id="L592" class="LineNr">592 </span>    <span class="subxComment"># var ebx: (addr byte) = t-&gt;data</span>
<span id="L593" class="LineNr">593 </span>    8d/copy-address                 1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy edi+12 to ebx</span>
<span id="L594" class="LineNr">594 </span>    <span class="subxComment"># var maxt/edx: (addr byte) = &amp;t-&gt;data[t-&gt;write]</span>
<span id="L595" class="LineNr">595 </span>    <span class="subxS1Comment"># . eax = t-&gt;write</span>
<span id="L596" class="LineNr">596 </span>    8b/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to eax</span>
<span id="L597" class="LineNr">597 </span>    <span class="subxS1Comment"># . maxt = &amp;t-&gt;data[t-&gt;write]</span>
<span id="L598" class="LineNr">598 </span>    8d/copy-address                 0/mod/indirect  4/rm32/sib    3/base/ebx  0/index/eax  <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebx+eax to edx</span>
<span id="L599" class="LineNr">599 </span>    <span class="subxComment"># var currt/edi: (addr byte) = &amp;t-&gt;data[t-&gt;read]</span>
<span id="L600" class="LineNr">600 </span>    <span class="subxS1Comment"># . eax = t/edi-&gt;read</span>
<span id="L601" class="LineNr">601 </span>    8b/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(edi+4) to eax</span>
<span id="L602" class="LineNr">602 </span>    <span class="subxS1Comment"># . currt = &amp;t-&gt;data[t-&gt;read]</span>
<span id="L603" class="LineNr">603 </span>    8d/copy-address                 0/mod/indirect  4/rm32/sib    3/base/ebx  0/index/eax  <span class="Normal"> . </span>          7/r32/edi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebx+eax to edi</span>
<span id="L604" class="LineNr">604 </span><span class="Constant">$next-line-matches?:loop</span>:
<span id="L605" class="LineNr">605 </span>    <span class="subxComment"># if (currl &gt;= maxl) break</span>
<span id="L606" class="LineNr">606 </span>    39/compare                      3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare esi and ecx</span>
<span id="L607" class="LineNr">607 </span>    73/jump-if-addr&gt;=  $next-line-matches?:<span class="Constant">break</span>/disp8
<span id="L608" class="LineNr">608 </span>    <span class="subxComment"># if (currt &gt;= maxt) return false</span>
<span id="L609" class="LineNr">609 </span>    <span class="subxS1Comment"># . eax = false</span>
<span id="L610" class="LineNr">610 </span>    b8/copy-to-eax  0/imm32/false
<span id="L611" class="LineNr">611 </span>    39/compare                      3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare edi and edx</span>
<span id="L612" class="LineNr">612 </span>    73/jump-if-addr&gt;=  $next-line-matches?:end/disp8
<span id="L613" class="LineNr">613 </span>    <span class="subxComment"># if (*currt != *currl) return false</span>
<span id="L614" class="LineNr">614 </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="L615" class="LineNr">615 </span>    31/xor                          3/mod/direct    3/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L616" class="LineNr">616 </span>    <span class="subxS1Comment"># . eax: byte = *currt</span>
<span id="L617" class="LineNr">617 </span>    8a/copy-byte                    0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to eax</span>
<span id="L618" class="LineNr">618 </span>    <span class="subxS1Comment"># . ebx: byte = *currl</span>
<span id="L619" class="LineNr">619 </span>    8a/copy-byte                    0/mod/indirect  6/rm32/esi   <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="L620" class="LineNr">620 </span>    <span class="subxS1Comment"># . eax &gt;= ebx</span>
<span id="L621" class="LineNr">621 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax and ebx</span>
<span id="L622" class="LineNr">622 </span>    <span class="subxS1Comment"># . eax = false</span>
<span id="L623" class="LineNr">623 </span>    b8/copy-to-eax  0/imm32/false
<span id="L624" class="LineNr">624 </span>    75/jump-if-!=  $next-line-matches?:end/disp8
<span id="L625" class="LineNr">625 </span>    <span class="subxComment"># ++currt</span>
<span id="L626" class="LineNr">626 </span>    47/increment-edi
<span id="L627" class="LineNr">627 </span>    <span class="subxComment"># ++currl</span>
<span id="L628" class="LineNr">628 </span>    46/increment-esi
<span id="L629" class="LineNr">629 </span>    eb/jump  $next-line-matches?:<span class="Constant">loop</span>/disp8
<span id="L630" class="LineNr">630 </span><span class="Constant">$next-line-matches?:break</span>:
<span id="L631" class="LineNr">631 </span>    <span class="subxComment"># return *currt == '\n'</span>
<span id="L632" class="LineNr">632 </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="L633" class="LineNr">633 </span>    <span class="subxS1Comment"># . eax: byte = *currt</span>
<span id="L634" class="LineNr">634 </span>    8a/copy-byte                    0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to eax</span>
<span id="L635" class="LineNr">635 </span>    3d/compare-eax-and  0xa/imm32/newline
<span id="L636" class="LineNr">636 </span>    <span class="subxS1Comment"># . eax = false</span>
<span id="L637" class="LineNr">637 </span>    b8/copy-to-eax  1/imm32/true
<span id="L638" class="LineNr">638 </span>    74/jump-if-=  $next-line-matches?:end/disp8
<span id="L639" class="LineNr">639 </span>    b8/copy-to-eax  0/imm32/true
<span id="L640" class="LineNr">640 </span><span class="Constant">$next-line-matches?:end</span>:
<span id="L641" class="LineNr">641 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L642" class="LineNr">642 </span>    5f/pop-to-edi
<span id="L643" class="LineNr">643 </span>    5e/pop-to-esi
<span id="L644" class="LineNr">644 </span>    5b/pop-to-ebx
<span id="L645" class="LineNr">645 </span>    5a/pop-to-edx
<span id="L646" class="LineNr">646 </span>    59/pop-to-ecx
<span id="L647" class="LineNr">647 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L648" class="LineNr">648 </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="L649" class="LineNr">649 </span>    5d/pop-to-ebp
<span id="L650" class="LineNr">650 </span>    c3/return
<span id="L651" class="LineNr">651 </span>
<span id="L652" class="LineNr">652 </span><span class="subxTest">test-next-line-matches?-no-match-1</span>:
<span id="L653" class="LineNr">653 </span>    <span class="subxComment"># next line of &quot;ABABA&quot; does not match &quot;blah blah&quot;</span>
<span id="L654" class="LineNr">654 </span>    <span class="subxS1Comment"># . eax = next-line-matches?(_test-stream-line-ABABA, &quot;blah blah&quot;)</span>
<span id="L655" class="LineNr">655 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L656" class="LineNr">656 </span>    68/push  <span class="Constant">&quot;blah blah&quot;</span>/imm32
<span id="L657" class="LineNr">657 </span>    68/push  <a href='056trace.subx.html#L963'>_test-stream-line-ABABA</a>/imm32
<span id="L658" class="LineNr">658 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L659" class="LineNr">659 </span>    e8/call  <a href='056trace.subx.html#L561'>next-line-matches?</a>/disp32
<span id="L660" class="LineNr">660 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L661" class="LineNr">661 </span>    81          0/subop/add         3/mod/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="L662" class="LineNr">662 </span>    <span class="subxS1Comment"># . check-ints-equal(eax, 0, msg)</span>
<span id="L663" class="LineNr">663 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L664" class="LineNr">664 </span>    68/push  <span class="Constant">&quot;F - test-next-line-matches?-no-match-1&quot;</span>/imm32
<span id="L665" class="LineNr">665 </span>    68/push  0/imm32
<span id="L666" class="LineNr">666 </span>    50/push-eax
<span id="L667" class="LineNr">667 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L668" class="LineNr">668 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L669" class="LineNr">669 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L670" class="LineNr">670 </span>    81          0/subop/add         3/mod/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="L671" class="LineNr">671 </span>    c3/return
<span id="L672" class="LineNr">672 </span>
<span id="L673" class="LineNr">673 </span><span class="subxTest">test-next-line-matches?-no-match-2</span>:
<span id="L674" class="LineNr">674 </span>    <span class="subxComment"># next line of &quot;ABABA&quot; does not match &quot;&quot;</span>
<span id="L675" class="LineNr">675 </span>    <span class="subxS1Comment"># . eax = next-line-matches?(_test-stream-line-ABABA, &quot;&quot;)</span>
<span id="L676" class="LineNr">676 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L677" class="LineNr">677 </span>    68/push  <span class="Constant">&quot;&quot;</span>/imm32
<span id="L678" class="LineNr">678 </span>    68/push  <a href='056trace.subx.html#L963'>_test-stream-line-ABABA</a>/imm32
<span id="L679" class="LineNr">679 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L680" class="LineNr">680 </span>    e8/call  <a href='056trace.subx.html#L561'>next-line-matches?</a>/disp32
<span id="L681" class="LineNr">681 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L682" class="LineNr">682 </span>    81          0/subop/add         3/mod/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="L683" class="LineNr">683 </span>    <span class="subxS1Comment"># . check-ints-equal(eax, 0, msg)</span>
<span id="L684" class="LineNr">684 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L685" class="LineNr">685 </span>    68/push  <span class="Constant">&quot;F - test-next-line-matches?-no-match-2&quot;</span>/imm32
<span id="L686" class="LineNr">686 </span>    68/push  0/imm32
<span id="L687" class="LineNr">687 </span>    50/push-eax
<span id="L688" class="LineNr">688 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L689" class="LineNr">689 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L690" class="LineNr">690 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L691" class="LineNr">691 </span>    81          0/subop/add         3/mod/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="L692" class="LineNr">692 </span>    c3/return
<span id="L693" class="LineNr">693 </span>
<span id="L694" class="LineNr">694 </span><span class="subxTest">test-next-line-matches?-no-match-3</span>:
<span id="L695" class="LineNr">695 </span>    <span class="subxComment"># next line of &quot;ABABA&quot; does not match  &quot;AA&quot;</span>
<span id="L696" class="LineNr">696 </span>    <span class="subxS1Comment"># . eax = next-line-matches?(_test-stream-line-ABABA, &quot;AA&quot;)</span>
<span id="L697" class="LineNr">697 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L698" class="LineNr">698 </span>    68/push  <span class="Constant">&quot;AA&quot;</span>/imm32
<span id="L699" class="LineNr">699 </span>    68/push  <a href='056trace.subx.html#L963'>_test-stream-line-ABABA</a>/imm32
<span id="L700" class="LineNr">700 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L701" class="LineNr">701 </span>    e8/call  <a href='056trace.subx.html#L561'>next-line-matches?</a>/disp32
<span id="L702" class="LineNr">702 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L703" class="LineNr">703 </span>    81          0/subop/add         3/mod/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="L704" class="LineNr">704 </span>    <span class="subxS1Comment"># . check-ints-equal(eax, 0, msg)</span>
<span id="L705" class="LineNr">705 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L706" class="LineNr">706 </span>    68/push  <span class="Constant">&quot;F - test-next-line-matches?-no-match-3&quot;</span>/imm32
<span id="L707" class="LineNr">707 </span>    68/push  0/imm32
<span id="L708" class="LineNr">708 </span>    50/push-eax
<span id="L709" class="LineNr">709 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L710" class="LineNr">710 </span>    e8/call  <a href='051test.subx.html#L24'>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>    c3/return
<span id="L714" class="LineNr">714 </span>
<span id="L715" class="LineNr">715 </span><span class="subxTest">test-next-line-matches?-match</span>:
<span id="L716" class="LineNr">716 </span>    <span class="subxComment"># next line of &quot;ABABA&quot; matches &quot;ABABA&quot;</span>
<span id="L717" class="LineNr">717 </span>    <span class="subxS1Comment"># . eax = next-line-matches?(_test-stream-line-ABABA, &quot;ABABA&quot;)</span>
<span id="L718" class="LineNr">718 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L719" class="LineNr">719 </span>    68/push  <span class="Constant">&quot;ABABA&quot;</span>/imm32
<span id="L720" class="LineNr">720 </span>    68/push  <a href='056trace.subx.html#L963'>_test-stream-line-ABABA</a>/imm32
<span id="L721" class="LineNr">721 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L722" class="LineNr">722 </span>    e8/call  <a href='056trace.subx.html#L561'>next-line-matches?</a>/disp32
<span id="L723" class="LineNr">723 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L724" class="LineNr">724 </span>    81          0/subop/add         3/mod/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="L725" class="LineNr">725 </span>    <span class="subxS1Comment"># . check-ints-equal(eax, 1, msg)</span>
<span id="L726" class="LineNr">726 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L727" class="LineNr">727 </span>    68/push  <span class="Constant">&quot;F - test-next-line-matches?-match&quot;</span>/imm32
<span id="L728" class="LineNr">728 </span>    68/push  1/imm32
<span id="L729" class="LineNr">729 </span>    50/push-eax
<span id="L730" class="LineNr">730 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L731" class="LineNr">731 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L732" class="LineNr">732 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L733" class="LineNr">733 </span>    81          0/subop/add         3/mod/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="L734" class="LineNr">734 </span>    c3/return
<span id="L735" class="LineNr">735 </span>
<span id="L736" class="LineNr">736 </span><span class="subxComment"># move t-&gt;read to _after_ next newline</span>
<span id="L737" class="LineNr">737 </span><span class="subxFunction">skip-next-line</span>:  <span class="subxComment"># t: (addr stream byte)</span>
<span id="L738" class="LineNr">738 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L739" class="LineNr">739 </span>    <span class="subxComment">#   max = &amp;t-&gt;data[t-&gt;write]</span>
<span id="L740" class="LineNr">740 </span>    <span class="subxComment">#   i = t-&gt;read</span>
<span id="L741" class="LineNr">741 </span>    <span class="subxComment">#   curr = &amp;t-&gt;data[t-&gt;read]</span>
<span id="L742" class="LineNr">742 </span>    <span class="subxComment">#   while true</span>
<span id="L743" class="LineNr">743 </span>    <span class="subxComment">#     if (curr &gt;= max) break</span>
<span id="L744" class="LineNr">744 </span>    <span class="subxComment">#     ++i</span>
<span id="L745" class="LineNr">745 </span>    <span class="subxComment">#     if (*curr == '\n') break</span>
<span id="L746" class="LineNr">746 </span>    <span class="subxComment">#     ++curr</span>
<span id="L747" class="LineNr">747 </span>    <span class="subxComment">#   t-&gt;read = i</span>
<span id="L748" class="LineNr">748 </span>    <span class="subxComment">#</span>
<span id="L749" class="LineNr">749 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L750" class="LineNr">750 </span>    55/push-ebp
<span id="L751" class="LineNr">751 </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="L752" class="LineNr">752 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L753" class="LineNr">753 </span>    50/push-eax
<span id="L754" class="LineNr">754 </span>    51/push-ecx
<span id="L755" class="LineNr">755 </span>    52/push-edx
<span id="L756" class="LineNr">756 </span>    53/push-ebx
<span id="L757" class="LineNr">757 </span>    <span class="subxComment"># ecx = t</span>
<span id="L758" class="LineNr">758 </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="L759" class="LineNr">759 </span>    <span class="subxComment"># edx = t-&gt;data</span>
<span id="L760" class="LineNr">760 </span>    8d/copy-address                 1/mod/*+disp8   1/rm32/ecx   <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 ecx+12 to edx</span>
<span id="L761" class="LineNr">761 </span>    <span class="subxComment"># eax = t-&gt;write</span>
<span id="L762" class="LineNr">762 </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="L763" class="LineNr">763 </span>    <span class="subxComment"># var max/ebx: (addr byte) = &amp;t-&gt;data[t-&gt;write]</span>
<span id="L764" class="LineNr">764 </span>    8d/copy-address                 0/mod/indirect  4/rm32/sib    2/base/edx  0/index/eax  <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy edx+eax to ebx</span>
<span id="L765" class="LineNr">765 </span>    <span class="subxComment"># eax = t-&gt;read</span>
<span id="L766" class="LineNr">766 </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 edx</span>
<span id="L767" class="LineNr">767 </span>    <span class="subxComment"># var curr/ecx: (addr byte) = &amp;t-&gt;data[t-&gt;read]</span>
<span id="L768" class="LineNr">768 </span>    8d/copy-address                 0/mod/indirect  4/rm32/sib    2/base/edx  0/index/eax  <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy edx+eax to ecx</span>
<span id="L769" class="LineNr">769 </span>    <span class="subxComment"># var i/edx: int = t-&gt;read</span>
<span id="L770" class="LineNr">770 </span>    89/copy                         3/mod/direct    2/rm32/edx   <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 edx</span>
<span id="L771" class="LineNr">771 </span><span class="Constant">$skip-next-line:loop</span>:
<span id="L772" class="LineNr">772 </span>    <span class="subxComment"># if (curr &gt;= max) break</span>
<span id="L773" class="LineNr">773 </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 and ebx</span>
<span id="L774" class="LineNr">774 </span>    73/jump-if-addr&gt;=  $skip-next-line:end/disp8
<span id="L775" class="LineNr">775 </span>    <span class="subxComment"># ++i</span>
<span id="L776" class="LineNr">776 </span>    42/increment-edx
<span id="L777" class="LineNr">777 </span>    <span class="subxComment"># if (*curr == '\n') break</span>
<span id="L778" class="LineNr">778 </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="L779" class="LineNr">779 </span>    8a/copy-byte                    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="L780" class="LineNr">780 </span>    3d/compare-eax-and  0a/imm32/newline
<span id="L781" class="LineNr">781 </span>    74/jump-if-=  $skip-next-line:end/disp8
<span id="L782" class="LineNr">782 </span>    <span class="subxComment"># ++curr</span>
<span id="L783" class="LineNr">783 </span>    41/increment-ecx
<span id="L784" class="LineNr">784 </span>    <span class="subxComment"># loop</span>
<span id="L785" class="LineNr">785 </span>    eb/jump  $skip-next-line:<span class="Constant">loop</span>/disp8
<span id="L786" class="LineNr">786 </span><span class="Constant">$skip-next-line:end</span>:
<span id="L787" class="LineNr">787 </span>    <span class="subxComment"># ecx = t</span>
<span id="L788" class="LineNr">788 </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="L789" class="LineNr">789 </span>    <span class="subxComment"># t-&gt;read = i</span>
<span id="L790" class="LineNr">790 </span>    89/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy edx to *(ecx+4)</span>
<span id="L791" class="LineNr">791 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L792" class="LineNr">792 </span>    5b/pop-to-ebx
<span id="L793" class="LineNr">793 </span>    5a/pop-to-edx
<span id="L794" class="LineNr">794 </span>    59/pop-to-ecx
<span id="L795" class="LineNr">795 </span>    58/pop-to-eax
<span id="L796" class="LineNr">796 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L797" class="LineNr">797 </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="L798" class="LineNr">798 </span>    5d/pop-to-ebp
<span id="L799" class="LineNr">799 </span>    c3/return
<span id="L800" class="LineNr">800 </span>
<span id="L801" class="LineNr">801 </span><span class="subxTest">test-skip-next-line-empty</span>:
<span id="L802" class="LineNr">802 </span>    <span class="subxComment"># skipping next line in empty stream leaves read pointer at 0</span>
<span id="L803" class="LineNr">803 </span>    <span class="subxS1Comment"># . skip-next-line(_test-stream-empty)</span>
<span id="L804" class="LineNr">804 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L805" class="LineNr">805 </span>    68/push  <a href='056trace.subx.html#L973'>_test-stream-empty</a>/imm32
<span id="L806" class="LineNr">806 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L807" class="LineNr">807 </span>    e8/call  <a href='056trace.subx.html#L737'>skip-next-line</a>/disp32
<span id="L808" class="LineNr">808 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L809" class="LineNr">809 </span>    81          0/subop/add         3/mod/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="L810" class="LineNr">810 </span>    <span class="subxS1Comment"># . check-ints-equal(_test-stream-empty-&gt;read, 0, msg)</span>
<span id="L811" class="LineNr">811 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L812" class="LineNr">812 </span>    68/push  <span class="Constant">&quot;F - test-skip-next-line-empty&quot;</span>/imm32
<span id="L813" class="LineNr">813 </span>    68/push  0/imm32
<span id="L814" class="LineNr">814 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L973'>_test-stream-empty</a>/imm32
<span id="L815" class="LineNr">815 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <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+4) to eax</span>
<span id="L816" class="LineNr">816 </span>    50/push-eax
<span id="L817" class="LineNr">817 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L818" class="LineNr">818 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L819" class="LineNr">819 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L820" class="LineNr">820 </span>    81          0/subop/add         3/mod/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="L821" class="LineNr">821 </span>    c3/return
<span id="L822" class="LineNr">822 </span>
<span id="L823" class="LineNr">823 </span><span class="subxTest">test-skip-next-line-filled</span>:
<span id="L824" class="LineNr">824 </span>    <span class="subxComment"># skipping next line increments read pointer by length of line + 1 (for newline)</span>
<span id="L825" class="LineNr">825 </span>    <span class="subxS1Comment"># . skip-next-line(_test-stream-filled)</span>
<span id="L826" class="LineNr">826 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L827" class="LineNr">827 </span>    68/push  <a href='056trace.subx.html#L983'>_test-stream-filled</a>/imm32
<span id="L828" class="LineNr">828 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L829" class="LineNr">829 </span>    e8/call  <a href='056trace.subx.html#L737'>skip-next-line</a>/disp32
<span id="L830" class="LineNr">830 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L831" class="LineNr">831 </span>    81          0/subop/add         3/mod/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="L832" class="LineNr">832 </span>    <span class="subxS1Comment"># . check-ints-equal(_test-stream-filled-&gt;read, 5, msg)</span>
<span id="L833" class="LineNr">833 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L834" class="LineNr">834 </span>    68/push  <span class="Constant">&quot;F - test-skip-next-line-filled&quot;</span>/imm32
<span id="L835" class="LineNr">835 </span>    68/push  5/imm32
<span id="L836" class="LineNr">836 </span>    b8/copy-to-eax  <a href='056trace.subx.html#L983'>_test-stream-filled</a>/imm32
<span id="L837" class="LineNr">837 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <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+4) to eax</span>
<span id="L838" class="LineNr">838 </span>    50/push-eax
<span id="L839" class="LineNr">839 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L840" class="LineNr">840 </span>    e8/call  <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L841" class="LineNr">841 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L842" class="LineNr">842 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L843" class="LineNr">843 </span>    c3/return
<span id="L844" class="LineNr">844 </span>
<span id="L845" class="LineNr">845 </span><span class="subxFunction">clear-trace-stream</span>:
<span id="L846" class="LineNr">846 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L847" class="LineNr">847 </span>    55/push-ebp
<span id="L848" class="LineNr">848 </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="L849" class="LineNr">849 </span>    <span class="subxComment"># clear-stream(*Trace-stream)</span>
<span id="L850" class="LineNr">850 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L851" class="LineNr">851 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L852" class="LineNr">852 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L853" class="LineNr">853 </span>    e8/call  <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L854" class="LineNr">854 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L855" class="LineNr">855 </span>    81          0/subop/add         3/mod/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="L856" class="LineNr">856 </span><span class="Constant">$clear-trace-stream:end</span>:
<span id="L857" class="LineNr">857 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L858" class="LineNr">858 </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="L859" class="LineNr">859 </span>    5d/pop-to-ebp
<span id="L860" class="LineNr">860 </span>    c3/return
<span id="L861" class="LineNr">861 </span>
<span id="L862" class="LineNr">862 </span><span class="subxH1Comment"># - helpers</span>
<span id="L863" class="LineNr">863 </span>
<span id="L864" class="LineNr">864 </span><span class="subxComment"># 3-argument variant of _append</span>
<span id="L865" class="LineNr">865 </span><span class="subxMinorFunction">_append-3</span>:  <span class="subxComment"># out: (addr byte), outend: (addr byte), s: (addr array byte) -&gt; num_bytes_appended/eax</span>
<span id="L866" class="LineNr">866 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L867" class="LineNr">867 </span>    55/push-ebp
<span id="L868" class="LineNr">868 </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="L869" class="LineNr">869 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L870" class="LineNr">870 </span>    51/push-ecx
<span id="L871" class="LineNr">871 </span>    <span class="subxComment"># eax = _append-4(out, outend, &amp;s-&gt;data[0], &amp;s-&gt;data[s-&gt;length])</span>
<span id="L872" class="LineNr">872 </span>    <span class="subxS2Comment"># . . push &amp;s-&gt;data[s-&gt;length]</span>
<span id="L873" class="LineNr">873 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        0/r32/eax   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to eax</span>
<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>    51/push-ecx
<span id="L877" class="LineNr">877 </span>    <span class="subxS2Comment"># . . push &amp;s-&gt;data[0]</span>
<span id="L878" class="LineNr">878 </span>    8d/copy-address                 1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+4 to ecx</span>
<span id="L879" class="LineNr">879 </span>    51/push-ecx
<span id="L880" class="LineNr">880 </span>    <span class="subxS2Comment"># . . push outend</span>
<span id="L881" class="LineNr">881 </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="L882" class="LineNr">882 </span>    <span class="subxS2Comment"># . . push out</span>
<span id="L883" class="LineNr">883 </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="L884" class="LineNr">884 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L885" class="LineNr">885 </span>    e8/call  <a href='056trace.subx.html#L897'>_append-4</a>/disp32
<span id="L886" class="LineNr">886 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L887" class="LineNr">887 </span>    81          0/subop/add         3/mod/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="L888" class="LineNr">888 </span><span class="Constant">$_append-3:end</span>:
<span id="L889" class="LineNr">889 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L890" class="LineNr">890 </span>    59/pop-to-ecx
<span id="L891" class="LineNr">891 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L892" class="LineNr">892 </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="L893" class="LineNr">893 </span>    5d/pop-to-ebp
<span id="L894" class="LineNr">894 </span>    c3/return
<span id="L895" class="LineNr">895 </span>
<span id="L896" class="LineNr">896 </span><span class="subxComment"># 4-argument variant of _append</span>
<span id="L897" class="LineNr">897 </span><span class="subxMinorFunction">_append-4</span>:  <span class="subxComment"># out: (addr byte), outend: (addr byte), in: (addr byte), inend: (addr byte) -&gt; num_bytes_appended/eax: int</span>
<span id="L898" class="LineNr">898 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L899" class="LineNr">899 </span>    55/push-ebp
<span id="L900" class="LineNr">900 </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="L901" class="LineNr">901 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L902" class="LineNr">902 </span>    51/push-ecx
<span id="L903" class="LineNr">903 </span>    52/push-edx
<span id="L904" class="LineNr">904 </span>    53/push-ebx
<span id="L905" class="LineNr">905 </span>    56/push-esi
<span id="L906" class="LineNr">906 </span>    57/push-edi
<span id="L907" class="LineNr">907 </span>    <span class="subxComment"># num_bytes_appended = 0</span>
<span id="L908" class="LineNr">908 </span>    b8/copy-to-eax  0/imm32
<span id="L909" class="LineNr">909 </span>    <span class="subxComment"># edi = out</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>          7/r32/edi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to edi</span>
<span id="L911" class="LineNr">911 </span>    <span class="subxComment"># edx = outend</span>
<span id="L912" class="LineNr">912 </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="L913" class="LineNr">913 </span>    <span class="subxComment"># esi = in</span>
<span id="L914" class="LineNr">914 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to esi</span>
<span id="L915" class="LineNr">915 </span>    <span class="subxComment"># ecx = inend</span>
<span id="L916" class="LineNr">916 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+20) to ecx</span>
<span id="L917" class="LineNr">917 </span><span class="Constant">$_append-4:loop</span>:
<span id="L918" class="LineNr">918 </span>    <span class="subxComment"># if (in &gt;= inend) break</span>
<span id="L919" class="LineNr">919 </span>    39/compare                      3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare esi with ecx</span>
<span id="L920" class="LineNr">920 </span>    73/jump-if-addr&gt;=  $_append-4:end/disp8
<span id="L921" class="LineNr">921 </span>    <span class="subxComment"># if (out &gt;= outend) abort  # just to catch test failures fast</span>
<span id="L922" class="LineNr">922 </span>    39/compare                      3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare edi with edx</span>
<span id="L923" class="LineNr">923 </span>    73/jump-if-addr&gt;=  $_append-4:abort/disp8
<span id="L924" class="LineNr">924 </span>    <span class="subxComment"># *out = *in</span>
<span id="L925" class="LineNr">925 </span>    8a/copy-byte                    0/mod/indirect  6/rm32/esi   <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 *esi to BL</span>
<span id="L926" class="LineNr">926 </span>    88/copy-byte                    0/mod/indirect  7/rm32/edi   <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 BL to *edi</span>
<span id="L927" class="LineNr">927 </span>    <span class="subxComment"># ++num_bytes_appended</span>
<span id="L928" class="LineNr">928 </span>    40/increment-eax
<span id="L929" class="LineNr">929 </span>    <span class="subxComment"># ++in</span>
<span id="L930" class="LineNr">930 </span>    46/increment-esi
<span id="L931" class="LineNr">931 </span>    <span class="subxComment"># ++out</span>
<span id="L932" class="LineNr">932 </span>    47/increment-edi
<span id="L933" class="LineNr">933 </span>    eb/jump  $_append-4:<span class="Constant">loop</span>/disp8
<span id="L934" class="LineNr">934 </span><span class="Constant">$_append-4:end</span>:
<span id="L935" class="LineNr">935 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L936" class="LineNr">936 </span>    5f/pop-to-edi
<span id="L937" class="LineNr">937 </span>    5e/pop-to-esi
<span id="L938" class="LineNr">938 </span>    5b/pop-to-ebx
<span id="L939" class="LineNr">939 </span>    5a/pop-to-edx
<span id="L940" class="LineNr">940 </span>    59/pop-to-ecx
<span id="L941" class="LineNr">941 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L942" class="LineNr">942 </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="L943" class="LineNr">943 </span>    5d/pop-to-ebp
<span id="L944" class="LineNr">944 </span>    c3/return
<span id="L945" class="LineNr">945 </span>
<span id="L946" class="LineNr">946 </span><span class="Constant">$_append-4:abort</span>:
<span id="L947" class="LineNr">947 </span>    <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L948" class="LineNr">948 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L949" class="LineNr">949 </span>    68/push  <span class="Constant">&quot;stream overflow\n&quot;</span>/imm32
<span id="L950" class="LineNr">950 </span>    68/push  2/imm32/stderr
<span id="L951" class="LineNr">951 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L952" class="LineNr">952 </span>    e8/call  <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L953" class="LineNr">953 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L954" class="LineNr">954 </span>    81          0/subop/add         3/mod/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="L955" class="LineNr">955 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L956" class="LineNr">956 </span>    bb/copy-to-ebx  1/imm32
<span id="L957" class="LineNr">957 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L958" class="LineNr">958 </span>    cd/syscall  0x80/imm8
<span id="L959" class="LineNr">959 </span>    <span class="subxComment"># never gets here</span>
<span id="L960" class="LineNr">960 </span>
<span id="L961" class="LineNr">961 </span>== data
<span id="L962" class="LineNr">962 </span>
<span id="L963" class="LineNr">963 </span><span class="subxMinorFunction">_test-stream-line-ABABA</span>:  <span class="subxComment"># (stream byte)</span>
<span id="L964" class="LineNr">964 </span>    <span class="subxComment"># write</span>
<span id="L965" class="LineNr">965 </span>    8/imm32
<span id="L966" class="LineNr">966 </span>    <span class="subxComment"># read</span>
<span id="L967" class="LineNr">967 </span>    0/imm32
<span id="L968" class="LineNr">968 </span>    <span class="subxComment"># length</span>
<span id="L969" class="LineNr">969 </span>    8/imm32
<span id="L970" class="LineNr">970 </span>    <span class="subxComment"># data</span>
<span id="L971" class="LineNr">971 </span>    41 42 41 42 41 0a 00 00  <span class="subxComment"># 8 bytes</span>
<span id="L972" class="LineNr">972 </span>
<span id="L973" class="LineNr">973 </span><span class="subxMinorFunction">_test-stream-empty</span>:  <span class="subxComment"># (stream byte)</span>
<span id="L974" class="LineNr">974 </span>    <span class="subxComment"># write</span>
<span id="L975" class="LineNr">975 </span>    0/imm32
<span id="L976" class="LineNr">976 </span>    <span class="subxComment"># read</span>
<span id="L977" class="LineNr">977 </span>    0/imm32
<span id="L978" class="LineNr">978 </span>    <span class="subxComment"># length</span>
<span id="L979" class="LineNr">979 </span>    8/imm32
<span id="L980" class="LineNr">980 </span>    <span class="subxComment"># data</span>
<span id="L981" class="LineNr">981 </span>    00 00 00 00 00 00 00 00  <span class="subxComment"># 8 bytes</span>
<span id="L982" class="LineNr">982 </span>
<span id="L983" class="LineNr">983 </span><span class="subxMinorFunction">_test-stream-filled</span>:  <span class="subxComment"># (stream byte)</span>
<span id="L984" class="LineNr">984 </span>    <span class="subxComment"># write</span>
<span id="L985" class="LineNr">985 </span>    8/imm32
<span id="L986" class="LineNr">986 </span>    <span class="subxComment"># read</span>
<span id="L987" class="LineNr">987 </span>    0/imm32
<span id="L988" class="LineNr">988 </span>    <span class="subxComment"># length</span>
<span id="L989" class="LineNr">989 </span>    8/imm32
<span id="L990" class="LineNr">990 </span>    <span class="subxComment"># data</span>
<span id="L991" class="LineNr">991 </span>    41 41 41 41 0a 41 41 41  <span class="subxComment"># 8 bytes</span>
<span id="L992" class="LineNr">992 </span>
<span id="L993" class="LineNr">993 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->