about summary refs log blame commit diff stats
path: root/cpp/022boolean
blob: e7fc9b4498ade1038fb5fcf8ff9c0f57b06c4f47 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                      
 
                                             
    

                                        

                                                

                                                                             
                           

                                                                             



                                               
                                                     








                                       
                        




                       
                             
 

                                             

                                        

                                                

                                                                             
                           

                                                                             



                                               
                                                     








                                      
                        




                       
                             
 

                                             

                                        

                                                

                                                                             



                                               
                                                     







                             
                        


                       
                             
//: Boolean primitives

:(before "End Primitive Recipe Declarations")
AND,
:(before "End Primitive Recipe Numbers")
Recipe_number["and"] = AND;
:(before "End Primitive Recipe Implementations")
case AND: {
  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
  vector<int> arg0 = read_memory(instructions[pc].ingredients[0]);
  assert(arg0.size() == 1);
  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
  vector<int> arg1 = read_memory(instructions[pc].ingredients[1]);
  assert(arg1.size() == 1);
  vector<int> result;
  result.push_back(arg0[0] && arg1[0]);
  trace("run") << "product 0 is " << result[0];
  write_memory(instructions[pc].products[0], result);
  break;
}

:(scenario "and")
recipe main [
  1:integer <- copy 1:literal
  2:integer <- copy 0:literal
  3:integer <- and 1:integer, 2:integer
]
+run: instruction main/2
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: ingredient 1 is 2
+mem: location 2 is 0
+run: product 0 is 0
+mem: storing 0 in location 3

:(before "End Primitive Recipe Declarations")
OR,
:(before "End Primitive Recipe Numbers")
Recipe_number["or"] = OR;
:(before "End Primitive Recipe Implementations")
case OR: {
  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
  vector<int> arg0 = read_memory(instructions[pc].ingredients[0]);
  assert(arg0.size() == 1);
  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
  vector<int> arg1 = read_memory(instructions[pc].ingredients[1]);
  assert(arg1.size() == 1);
  vector<int> result;
  result.push_back(arg0[0] || arg1[0]);
  trace("run") << "product 0 is " << result[0];
  write_memory(instructions[pc].products[0], result);
  break;
}

:(scenario "or")
recipe main [
  1:integer <- copy 1:literal
  2:integer <- copy 0:literal
  3:integer <- or 1:integer, 2:integer
]
+run: instruction main/2
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: ingredient 1 is 2
+mem: location 2 is 0
+run: product 0 is 1
+mem: storing 1 in location 3

:(before "End Primitive Recipe Declarations")
NOT,
:(before "End Primitive Recipe Numbers")
Recipe_number["not"] = NOT;
:(before "End Primitive Recipe Implementations")
case NOT: {
  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
  vector<int> arg0 = read_memory(instructions[pc].ingredients[0]);
  assert(arg0.size() == 1);
  vector<int> result;
  result.push_back(!arg0[0]);
  trace("run") << "product 0 is " << result[0];
  write_memory(instructions[pc].products[0], result);
  break;
}

:(scenario "not")
recipe main [
  1:integer <- copy 1:literal
  2:integer <- not 1:integer
]
+run: instruction main/1
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: product 0 is 0
+mem: storing 0 in location 2
'>1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109
<!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 - baremetal/123slice.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; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
-->
</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/main/baremetal/123slice.subx'>https://github.com/akkartik/mu/blob/main/baremetal/123slice.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">   1 </span><span class="subxComment"># new data structure: a slice is an open interval of addresses [start, end)</span>
<span id="L2" class="LineNr">   2 </span><span class="subxComment"># that includes 'start' but not 'end'</span>
<span id="L3" class="LineNr">   3 </span>
<span id="L4" class="LineNr">   4 </span>== code
<span id="L5" class="LineNr">   5 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L6" class="LineNr">   6 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L7" class="LineNr">   7 </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="L8" class="LineNr">   8 </span>
<span id="L9" class="LineNr">   9 </span><span class="subxFunction">slice-empty?</span>:  <span class="subxComment"># s: (addr slice) -&gt; result/eax: boolean</span>
<span id="L10" class="LineNr">  10 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L11" class="LineNr">  11 </span>    55/push-ebp
<span id="L12" class="LineNr">  12 </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="L13" class="LineNr">  13 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L14" class="LineNr">  14 </span>    51/push-ecx
<span id="L15" class="LineNr">  15 </span>    <span class="subxComment"># ecx = s</span>
<span id="L16" class="LineNr">  16 </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="L17" class="LineNr">  17 </span>    <span class="subxComment"># if (s-&gt;start &gt;= s-&gt;end) return true</span>
<span id="L18" class="LineNr">  18 </span>    <span class="subxS1Comment"># . eax = s-&gt;start</span>
<span id="L19" class="LineNr">  19 </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="L20" class="LineNr">  20 </span>    <span class="subxS1Comment"># . if (eax &gt;= s-&gt;end) return true</span>
<span id="L21" class="LineNr">  21 </span>    3b/compare                      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"># compare eax with *(ecx+4)</span>
<span id="L22" class="LineNr">  22 </span>    b8/copy-to-eax  1/imm32/true
<span id="L23" class="LineNr">  23 </span>    73/jump-if-addr&gt;=  $slice-empty?:end/disp8
<span id="L24" class="LineNr">  24 </span>    b8/copy-to-eax  0/imm32/false
<span id="L25" class="LineNr">  25 </span><span class="Constant">$slice-empty?:end</span>:
<span id="L26" class="LineNr">  26 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L27" class="LineNr">  27 </span>    59/pop-to-ecx
<span id="L28" class="LineNr">  28 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L29" class="LineNr">  29 </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="L30" class="LineNr">  30 </span>    5d/pop-to-ebp
<span id="L31" class="LineNr">  31 </span>    c3/return
<span id="L32" class="LineNr">  32 </span>
<span id="L33" class="LineNr">  33 </span><span class="subxTest">test-slice-empty-true</span>:
<span id="L34" class="LineNr">  34 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L35" class="LineNr">  35 </span>    55/push-ebp
<span id="L36" class="LineNr">  36 </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="L37" class="LineNr">  37 </span>    <span class="subxComment"># var slice/ecx: slice = {34, 34}</span>
<span id="L38" class="LineNr">  38 </span>    68/push  34/imm32/end
<span id="L39" class="LineNr">  39 </span>    68/push  34/imm32/start
<span id="L40" class="LineNr">  40 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L41" class="LineNr">  41 </span>    <span class="subxComment"># slice-empty?(slice)</span>
<span id="L42" class="LineNr">  42 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L43" class="LineNr">  43 </span>    51/push-ecx
<span id="L44" class="LineNr">  44 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L45" class="LineNr">  45 </span>    e8/call  <a href='123slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L46" class="LineNr">  46 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L47" class="LineNr">  47 </span>    81          0/subop/add         3/mod/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="L48" class="LineNr">  48 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L49" class="LineNr">  49 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L50" class="LineNr">  50 </span>    68/push  <span class="Constant">&quot;F - test-slice-empty-true&quot;</span>/imm32
<span id="L51" class="LineNr">  51 </span>    68/push  1/imm32
<span id="L52" class="LineNr">  52 </span>    50/push-eax
<span id="L53" class="LineNr">  53 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L54" class="LineNr">  54 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L55" class="LineNr">  55 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L56" class="LineNr">  56 </span>    81          0/subop/add         3/mod/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="L57" class="LineNr">  57 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L58" class="LineNr">  58 </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="L59" class="LineNr">  59 </span>    5d/pop-to-ebp
<span id="L60" class="LineNr">  60 </span>    c3/return
<span id="L61" class="LineNr">  61 </span>
<span id="L62" class="LineNr">  62 </span><span class="subxTest">test-slice-empty-false</span>:
<span id="L63" class="LineNr">  63 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L64" class="LineNr">  64 </span>    55/push-ebp
<span id="L65" class="LineNr">  65 </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="L66" class="LineNr">  66 </span>    <span class="subxComment"># var slice/ecx: slice = {32, 34}</span>
<span id="L67" class="LineNr">  67 </span>    68/push  34/imm32/end
<span id="L68" class="LineNr">  68 </span>    68/push  32/imm32/start
<span id="L69" class="LineNr">  69 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L70" class="LineNr">  70 </span>    <span class="subxComment"># slice-empty?(slice)</span>
<span id="L71" class="LineNr">  71 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L72" class="LineNr">  72 </span>    51/push-ecx
<span id="L73" class="LineNr">  73 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L74" class="LineNr">  74 </span>    e8/call  <a href='123slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L75" class="LineNr">  75 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L76" class="LineNr">  76 </span>    81          0/subop/add         3/mod/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="L77" class="LineNr">  77 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L78" class="LineNr">  78 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L79" class="LineNr">  79 </span>    68/push  <span class="Constant">&quot;F - test-slice-empty-false&quot;</span>/imm32
<span id="L80" class="LineNr">  80 </span>    68/push  0/imm32
<span id="L81" class="LineNr">  81 </span>    50/push-eax
<span id="L82" class="LineNr">  82 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L83" class="LineNr">  83 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L84" class="LineNr">  84 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L85" class="LineNr">  85 </span>    81          0/subop/add         3/mod/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="L86" class="LineNr">  86 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L87" class="LineNr">  87 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L88" class="LineNr">  88 </span>    5d/pop-to-ebp
<span id="L89" class="LineNr">  89 </span>    c3/return
<span id="L90" class="LineNr">  90 </span>
<span id="L91" class="LineNr">  91 </span><span class="subxTest">test-slice-empty-if-start-greater-than-end</span>:
<span id="L92" class="LineNr">  92 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L93" class="LineNr">  93 </span>    55/push-ebp
<span id="L94" class="LineNr">  94 </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="L95" class="LineNr">  95 </span>    <span class="subxComment"># var slice/ecx: slice = {34, 32}</span>
<span id="L96" class="LineNr">  96 </span>    68/push  32/imm32/end
<span id="L97" class="LineNr">  97 </span>    68/push  34/imm32/start
<span id="L98" class="LineNr">  98 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L99" class="LineNr">  99 </span>    <span class="subxComment"># slice-empty?(slice)</span>
<span id="L100" class="LineNr"> 100 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L101" class="LineNr"> 101 </span>    51/push-ecx
<span id="L102" class="LineNr"> 102 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L103" class="LineNr"> 103 </span>    e8/call  <a href='123slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L104" class="LineNr"> 104 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L105" class="LineNr"> 105 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L106" class="LineNr"> 106 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L107" class="LineNr"> 107 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L108" class="LineNr"> 108 </span>    68/push  <span class="Constant">&quot;F - test-slice-empty-if-start-greater-than-end&quot;</span>/imm32
<span id="L109" class="LineNr"> 109 </span>    68/push  1/imm32
<span id="L110" class="LineNr"> 110 </span>    50/push-eax
<span id="L111" class="LineNr"> 111 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L112" class="LineNr"> 112 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L113" class="LineNr"> 113 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L114" class="LineNr"> 114 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L115" class="LineNr"> 115 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L116" class="LineNr"> 116 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L117" class="LineNr"> 117 </span>    5d/pop-to-ebp
<span id="L118" class="LineNr"> 118 </span>    c3/return
<span id="L119" class="LineNr"> 119 </span>
<span id="L120" class="LineNr"> 120 </span><span class="subxFunction">slice-equal?</span>:  <span class="subxComment"># s: (addr slice), p: (addr array byte) -&gt; result/eax: boolean</span>
<span id="L121" class="LineNr"> 121 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L122" class="LineNr"> 122 </span>    <span class="subxComment">#   if (p == 0) return (s == 0)</span>
<span id="L123" class="LineNr"> 123 </span>    <span class="subxComment">#   currs = s-&gt;start</span>
<span id="L124" class="LineNr"> 124 </span>    <span class="subxComment">#   maxs = s-&gt;end</span>
<span id="L125" class="LineNr"> 125 </span>    <span class="subxComment">#   if (maxs - currs != p-&gt;size) return false</span>
<span id="L126" class="LineNr"> 126 </span>    <span class="subxComment">#   currp = p-&gt;data</span>
<span id="L127" class="LineNr"> 127 </span>    <span class="subxComment">#   while currs &lt; maxs</span>
<span id="L128" class="LineNr"> 128 </span>    <span class="subxComment">#     if (*currs != *currp) return false</span>
<span id="L129" class="LineNr"> 129 </span>    <span class="subxComment">#     ++currs</span>
<span id="L130" class="LineNr"> 130 </span>    <span class="subxComment">#     ++currp</span>
<span id="L131" class="LineNr"> 131 </span>    <span class="subxComment">#   return true</span>
<span id="L132" class="LineNr"> 132 </span>    <span class="subxComment">#</span>
<span id="L133" class="LineNr"> 133 </span>    <span class="subxComment"># registers:</span>
<span id="L134" class="LineNr"> 134 </span>    <span class="subxComment">#   currs: edx</span>
<span id="L135" class="LineNr"> 135 </span>    <span class="subxComment">#   maxs: esi</span>
<span id="L136" class="LineNr"> 136 </span>    <span class="subxComment">#   currp: ebx</span>
<span id="L137" class="LineNr"> 137 </span>    <span class="subxComment">#   *currs: eax</span>
<span id="L138" class="LineNr"> 138 </span>    <span class="subxComment">#   *currp: ecx</span>
<span id="L139" class="LineNr"> 139 </span>    <span class="subxComment">#</span>
<span id="L140" class="LineNr"> 140 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L141" class="LineNr"> 141 </span>    55/push-ebp
<span id="L142" class="LineNr"> 142 </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="L143" class="LineNr"> 143 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L144" class="LineNr"> 144 </span>    51/push-ecx
<span id="L145" class="LineNr"> 145 </span>    52/push-edx
<span id="L146" class="LineNr"> 146 </span>    53/push-ebx
<span id="L147" class="LineNr"> 147 </span>    56/push-esi
<span id="L148" class="LineNr"> 148 </span>    <span class="subxComment"># esi = s</span>
<span id="L149" class="LineNr"> 149 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L150" class="LineNr"> 150 </span>    <span class="subxComment"># var currs/edx: (addr byte) = s-&gt;start</span>
<span id="L151" class="LineNr"> 151 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <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"># copy *esi to edx</span>
<span id="L152" class="LineNr"> 152 </span>    <span class="subxComment"># var maxs/esi: (addr byte) = s-&gt;end</span>
<span id="L153" class="LineNr"> 153 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <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 *(esi+4) to esi</span>
<span id="L154" class="LineNr"> 154 </span>    <span class="subxComment"># var ssize/eax: int = maxs - currs</span>
<span id="L155" class="LineNr"> 155 </span>    89/copy                         3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esi to eax</span>
<span id="L156" class="LineNr"> 156 </span>    29/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract edx from eax</span>
<span id="L157" class="LineNr"> 157 </span>    <span class="subxComment"># ebx = p</span>
<span id="L158" class="LineNr"> 158 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <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 *(ebp+12) to ebx</span>
<span id="L159" class="LineNr"> 159 </span>    <span class="subxComment"># if (p != 0) goto next check</span>
<span id="L160" class="LineNr"> 160 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># compare ebx</span>
<span id="L161" class="LineNr"> 161 </span>    75/jump-if-!=  $slice-equal?:nonnull-string/disp8
<span id="L162" class="LineNr"> 162 </span><span class="Constant">$slice-equal?:null-string</span>:
<span id="L163" class="LineNr"> 163 </span>    <span class="subxComment"># return s-&gt;start == s-&gt;end</span>
<span id="L164" class="LineNr"> 164 </span>    3d/compare-eax-and  0/imm32
<span id="L165" class="LineNr"> 165 </span>    74/jump-if-=  $slice-equal?:true/disp8
<span id="L166" class="LineNr"> 166 </span>    eb/jump  $slice-equal?:false/disp8
<span id="L167" class="LineNr"> 167 </span><span class="Constant">$slice-equal?:nonnull-string</span>:
<span id="L168" class="LineNr"> 168 </span>    <span class="subxComment"># if (ssize != p-&gt;size) return false</span>
<span id="L169" class="LineNr"> 169 </span>    39/compare                      0/mod/indirect  3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare *ebx and eax</span>
<span id="L170" class="LineNr"> 170 </span>    75/jump-if-!=  $slice-equal?:false/disp8
<span id="L171" class="LineNr"> 171 </span>    <span class="subxComment"># var currp/ebx: (addr byte) = p-&gt;data</span>
<span id="L172" class="LineNr"> 172 </span>    81          0/subop/add         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to ebx</span>
<span id="L173" class="LineNr"> 173 </span>    <span class="subxComment"># var c1/eax: byte = 0</span>
<span id="L174" class="LineNr"> 174 </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="L175" class="LineNr"> 175 </span>    <span class="subxComment"># var c2/ecx: byte = 0</span>
<span id="L176" class="LineNr"> 176 </span>    31/xor                          3/mod/direct    1/rm32/ecx   <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"># clear ecx</span>
<span id="L177" class="LineNr"> 177 </span><span class="Constant">$slice-equal?:loop</span>:
<span id="L178" class="LineNr"> 178 </span>    <span class="subxComment"># if (currs &gt;= maxs) return true</span>
<span id="L179" class="LineNr"> 179 </span>    39/compare                      3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare edx with esi</span>
<span id="L180" class="LineNr"> 180 </span>    73/jump-if-addr&gt;=  $slice-equal?:true/disp8
<span id="L181" class="LineNr"> 181 </span>    <span class="subxComment"># c1 = *currp</span>
<span id="L182" class="LineNr"> 182 </span>    8a/copy-byte                    0/mod/indirect  3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *ebx to AL</span>
<span id="L183" class="LineNr"> 183 </span>    <span class="subxComment"># c2 = *currs</span>
<span id="L184" class="LineNr"> 184 </span>    8a/copy-byte                    0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/CL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *edx to CL</span>
<span id="L185" class="LineNr"> 185 </span>    <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L186" class="LineNr"> 186 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax and ecx</span>
<span id="L187" class="LineNr"> 187 </span>    75/jump-if-!=  $slice-equal?:false/disp8
<span id="L188" class="LineNr"> 188 </span>    <span class="subxComment"># ++currp</span>
<span id="L189" class="LineNr"> 189 </span>    43/increment-ebx
<span id="L190" class="LineNr"> 190 </span>    <span class="subxComment"># ++currs</span>
<span id="L191" class="LineNr"> 191 </span>    42/increment-edx
<span id="L192" class="LineNr"> 192 </span>    eb/jump $slice-equal?:<span class="Constant">loop</span>/disp8
<span id="L193" class="LineNr"> 193 </span><span class="Constant">$slice-equal?:false</span>:
<span id="L194" class="LineNr"> 194 </span>    b8/copy-to-eax  0/imm32
<span id="L195" class="LineNr"> 195 </span>    eb/jump  $slice-equal?:end/disp8
<span id="L196" class="LineNr"> 196 </span><span class="Constant">$slice-equal?:true</span>:
<span id="L197" class="LineNr"> 197 </span>    b8/copy-to-eax  1/imm32
<span id="L198" class="LineNr"> 198 </span><span class="Constant">$slice-equal?:end</span>:
<span id="L199" class="LineNr"> 199 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L200" class="LineNr"> 200 </span>    5e/pop-to-esi
<span id="L201" class="LineNr"> 201 </span>    5b/pop-to-ebx
<span id="L202" class="LineNr"> 202 </span>    5a/pop-to-edx
<span id="L203" class="LineNr"> 203 </span>    59/pop-to-ecx
<span id="L204" class="LineNr"> 204 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L205" class="LineNr"> 205 </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="L206" class="LineNr"> 206 </span>    5d/pop-to-ebp
<span id="L207" class="LineNr"> 207 </span>    c3/return
<span id="L208" class="LineNr"> 208 </span>
<span id="L209" class="LineNr"> 209 </span><span class="subxTest">test-slice-equal</span>:
<span id="L210" class="LineNr"> 210 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;Abc&quot;), &quot;Abc&quot;) == 1</span>
<span id="L211" class="LineNr"> 211 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L212" class="LineNr"> 212 </span>    55/push-ebp
<span id="L213" class="LineNr"> 213 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L214" class="LineNr"> 214 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L215" class="LineNr"> 215 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L216" class="LineNr"> 216 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L217" class="LineNr"> 217 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L218" class="LineNr"> 218 </span>    05/add-to-eax  4/imm32
<span id="L219" class="LineNr"> 219 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L220" class="LineNr"> 220 </span>    51/push-ecx
<span id="L221" class="LineNr"> 221 </span>    50/push-eax
<span id="L222" class="LineNr"> 222 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L223" class="LineNr"> 223 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;Abc&quot;)</span>
<span id="L224" class="LineNr"> 224 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L225" class="LineNr"> 225 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L226" class="LineNr"> 226 </span>    51/push-ecx
<span id="L227" class="LineNr"> 227 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L228" class="LineNr"> 228 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L229" class="LineNr"> 229 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L230" class="LineNr"> 230 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L231" class="LineNr"> 231 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L232" class="LineNr"> 232 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L233" class="LineNr"> 233 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal&quot;</span>/imm32
<span id="L234" class="LineNr"> 234 </span>    68/push  1/imm32
<span id="L235" class="LineNr"> 235 </span>    50/push-eax
<span id="L236" class="LineNr"> 236 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L237" class="LineNr"> 237 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L238" class="LineNr"> 238 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L239" class="LineNr"> 239 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L240" class="LineNr"> 240 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L241" class="LineNr"> 241 </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="L242" class="LineNr"> 242 </span>    5d/pop-to-ebp
<span id="L243" class="LineNr"> 243 </span>    c3/return
<span id="L244" class="LineNr"> 244 </span>
<span id="L245" class="LineNr"> 245 </span><span class="subxTest">test-slice-equal-false</span>:
<span id="L246" class="LineNr"> 246 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;bcd&quot;), &quot;Abc&quot;) == 0</span>
<span id="L247" class="LineNr"> 247 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L248" class="LineNr"> 248 </span>    55/push-ebp
<span id="L249" class="LineNr"> 249 </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="L250" class="LineNr"> 250 </span>    <span class="subxComment"># (eax..ecx) = &quot;bcd&quot;</span>
<span id="L251" class="LineNr"> 251 </span>    b8/copy-to-eax  <span class="Constant">&quot;bcd&quot;</span>/imm32
<span id="L252" class="LineNr"> 252 </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="L253" class="LineNr"> 253 </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="L254" class="LineNr"> 254 </span>    05/add-to-eax  4/imm32
<span id="L255" class="LineNr"> 255 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L256" class="LineNr"> 256 </span>    51/push-ecx
<span id="L257" class="LineNr"> 257 </span>    50/push-eax
<span id="L258" class="LineNr"> 258 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L259" class="LineNr"> 259 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;Abc&quot;)</span>
<span id="L260" class="LineNr"> 260 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L261" class="LineNr"> 261 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L262" class="LineNr"> 262 </span>    51/push-ecx
<span id="L263" class="LineNr"> 263 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L264" class="LineNr"> 264 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L265" class="LineNr"> 265 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L266" class="LineNr"> 266 </span>    81          0/subop/add         3/mod/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="L267" class="LineNr"> 267 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L268" class="LineNr"> 268 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L269" class="LineNr"> 269 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-false&quot;</span>/imm32
<span id="L270" class="LineNr"> 270 </span>    68/push  0/imm32
<span id="L271" class="LineNr"> 271 </span>    50/push-eax
<span id="L272" class="LineNr"> 272 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L273" class="LineNr"> 273 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L274" class="LineNr"> 274 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L275" class="LineNr"> 275 </span>    81          0/subop/add         3/mod/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="L276" class="LineNr"> 276 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L277" class="LineNr"> 277 </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="L278" class="LineNr"> 278 </span>    5d/pop-to-ebp
<span id="L279" class="LineNr"> 279 </span>    c3/return
<span id="L280" class="LineNr"> 280 </span>
<span id="L281" class="LineNr"> 281 </span><span class="subxTest">test-slice-equal-too-long</span>:
<span id="L282" class="LineNr"> 282 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;Abcd&quot;), &quot;Abc&quot;) == 0</span>
<span id="L283" class="LineNr"> 283 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L284" class="LineNr"> 284 </span>    55/push-ebp
<span id="L285" class="LineNr"> 285 </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="L286" class="LineNr"> 286 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abcd&quot;</span>
<span id="L287" class="LineNr"> 287 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abcd&quot;</span>/imm32
<span id="L288" class="LineNr"> 288 </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="L289" class="LineNr"> 289 </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="L290" class="LineNr"> 290 </span>    05/add-to-eax  4/imm32
<span id="L291" class="LineNr"> 291 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L292" class="LineNr"> 292 </span>    51/push-ecx
<span id="L293" class="LineNr"> 293 </span>    50/push-eax
<span id="L294" class="LineNr"> 294 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L295" class="LineNr"> 295 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;Abc&quot;)</span>
<span id="L296" class="LineNr"> 296 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L297" class="LineNr"> 297 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L298" class="LineNr"> 298 </span>    51/push-ecx
<span id="L299" class="LineNr"> 299 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L300" class="LineNr"> 300 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L301" class="LineNr"> 301 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L302" class="LineNr"> 302 </span>    81          0/subop/add         3/mod/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="L303" class="LineNr"> 303 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L304" class="LineNr"> 304 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L305" class="LineNr"> 305 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-too-long&quot;</span>/imm32
<span id="L306" class="LineNr"> 306 </span>    68/push  0/imm32
<span id="L307" class="LineNr"> 307 </span>    50/push-eax
<span id="L308" class="LineNr"> 308 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L309" class="LineNr"> 309 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L310" class="LineNr"> 310 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L311" class="LineNr"> 311 </span>    81          0/subop/add         3/mod/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="L312" class="LineNr"> 312 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L313" class="LineNr"> 313 </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="L314" class="LineNr"> 314 </span>    5d/pop-to-ebp
<span id="L315" class="LineNr"> 315 </span>    c3/return
<span id="L316" class="LineNr"> 316 </span>
<span id="L317" class="LineNr"> 317 </span><span class="subxTest">test-slice-equal-too-short</span>:
<span id="L318" class="LineNr"> 318 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;A&quot;), &quot;Abc&quot;) == 0</span>
<span id="L319" class="LineNr"> 319 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L320" class="LineNr"> 320 </span>    55/push-ebp
<span id="L321" class="LineNr"> 321 </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="L322" class="LineNr"> 322 </span>    <span class="subxComment"># (eax..ecx) = &quot;A&quot;</span>
<span id="L323" class="LineNr"> 323 </span>    b8/copy-to-eax  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L324" class="LineNr"> 324 </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="L325" class="LineNr"> 325 </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="L326" class="LineNr"> 326 </span>    05/add-to-eax  4/imm32
<span id="L327" class="LineNr"> 327 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L328" class="LineNr"> 328 </span>    51/push-ecx
<span id="L329" class="LineNr"> 329 </span>    50/push-eax
<span id="L330" class="LineNr"> 330 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L331" class="LineNr"> 331 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;Abc&quot;)</span>
<span id="L332" class="LineNr"> 332 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L333" class="LineNr"> 333 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L334" class="LineNr"> 334 </span>    51/push-ecx
<span id="L335" class="LineNr"> 335 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L336" class="LineNr"> 336 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L337" class="LineNr"> 337 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L338" class="LineNr"> 338 </span>    81          0/subop/add         3/mod/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="L339" class="LineNr"> 339 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L340" class="LineNr"> 340 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L341" class="LineNr"> 341 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-too-short&quot;</span>/imm32
<span id="L342" class="LineNr"> 342 </span>    68/push  0/imm32
<span id="L343" class="LineNr"> 343 </span>    50/push-eax
<span id="L344" class="LineNr"> 344 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L345" class="LineNr"> 345 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L346" class="LineNr"> 346 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L347" class="LineNr"> 347 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L348" class="LineNr"> 348 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L349" class="LineNr"> 349 </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="L350" class="LineNr"> 350 </span>    5d/pop-to-ebp
<span id="L351" class="LineNr"> 351 </span>    c3/return
<span id="L352" class="LineNr"> 352 </span>
<span id="L353" class="LineNr"> 353 </span><span class="subxTest">test-slice-equal-empty</span>:
<span id="L354" class="LineNr"> 354 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;&quot;), &quot;Abc&quot;) == 0</span>
<span id="L355" class="LineNr"> 355 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L356" class="LineNr"> 356 </span>    55/push-ebp
<span id="L357" class="LineNr"> 357 </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="L358" class="LineNr"> 358 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L359" class="LineNr"> 359 </span>    68/push  0/imm32/end
<span id="L360" class="LineNr"> 360 </span>    68/push  0/imm32/start
<span id="L361" class="LineNr"> 361 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L362" class="LineNr"> 362 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;Abc&quot;)</span>
<span id="L363" class="LineNr"> 363 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L364" class="LineNr"> 364 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L365" class="LineNr"> 365 </span>    51/push-ecx
<span id="L366" class="LineNr"> 366 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L367" class="LineNr"> 367 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L368" class="LineNr"> 368 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L369" class="LineNr"> 369 </span>    81          0/subop/add         3/mod/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="L370" class="LineNr"> 370 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L371" class="LineNr"> 371 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L372" class="LineNr"> 372 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-empty&quot;</span>/imm32
<span id="L373" class="LineNr"> 373 </span>    68/push  0/imm32
<span id="L374" class="LineNr"> 374 </span>    50/push-eax
<span id="L375" class="LineNr"> 375 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L376" class="LineNr"> 376 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L377" class="LineNr"> 377 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L378" class="LineNr"> 378 </span>    81          0/subop/add         3/mod/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="L379" class="LineNr"> 379 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L380" class="LineNr"> 380 </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="L381" class="LineNr"> 381 </span>    5d/pop-to-ebp
<span id="L382" class="LineNr"> 382 </span>    c3/return
<span id="L383" class="LineNr"> 383 </span>
<span id="L384" class="LineNr"> 384 </span><span class="subxTest">test-slice-equal-with-empty</span>:
<span id="L385" class="LineNr"> 385 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;Ab&quot;), &quot;&quot;) == 0</span>
<span id="L386" class="LineNr"> 386 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L387" class="LineNr"> 387 </span>    55/push-ebp
<span id="L388" class="LineNr"> 388 </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="L389" class="LineNr"> 389 </span>    <span class="subxComment"># (eax..ecx) = &quot;Ab&quot;</span>
<span id="L390" class="LineNr"> 390 </span>    b8/copy-to-eax  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L391" class="LineNr"> 391 </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="L392" class="LineNr"> 392 </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="L393" class="LineNr"> 393 </span>    05/add-to-eax  4/imm32
<span id="L394" class="LineNr"> 394 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L395" class="LineNr"> 395 </span>    51/push-ecx
<span id="L396" class="LineNr"> 396 </span>    50/push-eax
<span id="L397" class="LineNr"> 397 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L398" class="LineNr"> 398 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;&quot;)</span>
<span id="L399" class="LineNr"> 399 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L400" class="LineNr"> 400 </span>    68/push  <span class="Constant">&quot;&quot;</span>/imm32
<span id="L401" class="LineNr"> 401 </span>    51/push-ecx
<span id="L402" class="LineNr"> 402 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L403" class="LineNr"> 403 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L404" class="LineNr"> 404 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L405" class="LineNr"> 405 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L406" class="LineNr"> 406 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L407" class="LineNr"> 407 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L408" class="LineNr"> 408 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-with-empty&quot;</span>/imm32
<span id="L409" class="LineNr"> 409 </span>    68/push  0/imm32
<span id="L410" class="LineNr"> 410 </span>    50/push-eax
<span id="L411" class="LineNr"> 411 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L412" class="LineNr"> 412 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L413" class="LineNr"> 413 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L414" class="LineNr"> 414 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L415" class="LineNr"> 415 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L416" class="LineNr"> 416 </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="L417" class="LineNr"> 417 </span>    5d/pop-to-ebp
<span id="L418" class="LineNr"> 418 </span>    c3/return
<span id="L419" class="LineNr"> 419 </span>
<span id="L420" class="LineNr"> 420 </span><span class="subxTest">test-slice-equal-empty-with-empty</span>:
<span id="L421" class="LineNr"> 421 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;&quot;), &quot;&quot;) == 1</span>
<span id="L422" class="LineNr"> 422 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L423" class="LineNr"> 423 </span>    55/push-ebp
<span id="L424" class="LineNr"> 424 </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="L425" class="LineNr"> 425 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L426" class="LineNr"> 426 </span>    68/push  0/imm32/end
<span id="L427" class="LineNr"> 427 </span>    68/push  0/imm32/start
<span id="L428" class="LineNr"> 428 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L429" class="LineNr"> 429 </span>    <span class="subxComment"># eax = slice-equal?(ecx, &quot;&quot;)</span>
<span id="L430" class="LineNr"> 430 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L431" class="LineNr"> 431 </span>    68/push  <span class="Constant">&quot;&quot;</span>/imm32
<span id="L432" class="LineNr"> 432 </span>    51/push-ecx
<span id="L433" class="LineNr"> 433 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L434" class="LineNr"> 434 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L435" class="LineNr"> 435 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L436" class="LineNr"> 436 </span>    81          0/subop/add         3/mod/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="L437" class="LineNr"> 437 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L438" class="LineNr"> 438 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L439" class="LineNr"> 439 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-empty-with-empty&quot;</span>/imm32
<span id="L440" class="LineNr"> 440 </span>    68/push  1/imm32
<span id="L441" class="LineNr"> 441 </span>    50/push-eax
<span id="L442" class="LineNr"> 442 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L443" class="LineNr"> 443 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L444" class="LineNr"> 444 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L445" class="LineNr"> 445 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L446" class="LineNr"> 446 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L447" class="LineNr"> 447 </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="L448" class="LineNr"> 448 </span>    5d/pop-to-ebp
<span id="L449" class="LineNr"> 449 </span>    c3/return
<span id="L450" class="LineNr"> 450 </span>
<span id="L451" class="LineNr"> 451 </span><span class="subxTest">test-slice-equal-with-null</span>:
<span id="L452" class="LineNr"> 452 </span>    <span class="subxH1Comment"># - slice-equal?(slice(&quot;Ab&quot;), null) == 0</span>
<span id="L453" class="LineNr"> 453 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L454" class="LineNr"> 454 </span>    55/push-ebp
<span id="L455" class="LineNr"> 455 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L456" class="LineNr"> 456 </span>    <span class="subxComment"># (eax..ecx) = &quot;Ab&quot;</span>
<span id="L457" class="LineNr"> 457 </span>    b8/copy-to-eax  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L458" class="LineNr"> 458 </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="L459" class="LineNr"> 459 </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="L460" class="LineNr"> 460 </span>    05/add-to-eax  4/imm32
<span id="L461" class="LineNr"> 461 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L462" class="LineNr"> 462 </span>    51/push-ecx
<span id="L463" class="LineNr"> 463 </span>    50/push-eax
<span id="L464" class="LineNr"> 464 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L465" class="LineNr"> 465 </span>    <span class="subxComment"># eax = slice-equal?(ecx, 0)</span>
<span id="L466" class="LineNr"> 466 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L467" class="LineNr"> 467 </span>    68/push  0/imm32
<span id="L468" class="LineNr"> 468 </span>    51/push-ecx
<span id="L469" class="LineNr"> 469 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L470" class="LineNr"> 470 </span>    e8/call  <a href='123slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L471" class="LineNr"> 471 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L472" class="LineNr"> 472 </span>    81          0/subop/add         3/mod/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="L473" class="LineNr"> 473 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L474" class="LineNr"> 474 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L475" class="LineNr"> 475 </span>    68/push  <span class="Constant">&quot;F - test-slice-equal-with-null&quot;</span>/imm32
<span id="L476" class="LineNr"> 476 </span>    68/push  0/imm32
<span id="L477" class="LineNr"> 477 </span>    50/push-eax
<span id="L478" class="LineNr"> 478 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L479" class="LineNr"> 479 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</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>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L482" class="LineNr"> 482 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L483" class="LineNr"> 483 </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="L484" class="LineNr"> 484 </span>    5d/pop-to-ebp
<span id="L485" class="LineNr"> 485 </span>    c3/return
<span id="L486" class="LineNr"> 486 </span>
<span id="L487" class="LineNr"> 487 </span><span class="subxFunction">slice-starts-with?</span>:  <span class="subxComment"># s: (addr slice), head: (addr array byte) -&gt; result/eax: boolean</span>
<span id="L488" class="LineNr"> 488 </span>    <span class="subxComment"># pseudocode</span>
<span id="L489" class="LineNr"> 489 </span>    <span class="subxComment">#   hsize = head-&gt;size</span>
<span id="L490" class="LineNr"> 490 </span>    <span class="subxComment">#   if (hsize &gt; s-&gt;end - s-&gt;start) return false</span>
<span id="L491" class="LineNr"> 491 </span>    <span class="subxComment">#   i = 0</span>
<span id="L492" class="LineNr"> 492 </span>    <span class="subxComment">#   currs = s-&gt;start</span>
<span id="L493" class="LineNr"> 493 </span>    <span class="subxComment">#   currp = head-&gt;data</span>
<span id="L494" class="LineNr"> 494 </span>    <span class="subxComment">#   while i &lt; hsize</span>
<span id="L495" class="LineNr"> 495 </span>    <span class="subxComment">#     if (*currs != *currh) return false</span>
<span id="L496" class="LineNr"> 496 </span>    <span class="subxComment">#     ++i</span>
<span id="L497" class="LineNr"> 497 </span>    <span class="subxComment">#     ++currs</span>
<span id="L498" class="LineNr"> 498 </span>    <span class="subxComment">#     ++currh</span>
<span id="L499" class="LineNr"> 499 </span>    <span class="subxComment">#   return true</span>
<span id="L500" class="LineNr"> 500 </span>    <span class="subxComment">#</span>
<span id="L501" class="LineNr"> 501 </span>    <span class="subxComment"># registers:</span>
<span id="L502" class="LineNr"> 502 </span>    <span class="subxComment">#   currs: esi</span>
<span id="L503" class="LineNr"> 503 </span>    <span class="subxComment">#   currh: edi</span>
<span id="L504" class="LineNr"> 504 </span>    <span class="subxComment">#   *currs: eax</span>
<span id="L505" class="LineNr"> 505 </span>    <span class="subxComment">#   *currh: ebx</span>
<span id="L506" class="LineNr"> 506 </span>    <span class="subxComment">#   i: ecx</span>
<span id="L507" class="LineNr"> 507 </span>    <span class="subxComment">#   hsize: edx</span>
<span id="L508" class="LineNr"> 508 </span>    <span class="subxComment">#</span>
<span id="L509" class="LineNr"> 509 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L510" class="LineNr"> 510 </span>    55/push-ebp
<span id="L511" class="LineNr"> 511 </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="L512" class="LineNr"> 512 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L513" class="LineNr"> 513 </span>    51/push-ecx
<span id="L514" class="LineNr"> 514 </span>    52/push-edx
<span id="L515" class="LineNr"> 515 </span>    53/push-ebx
<span id="L516" class="LineNr"> 516 </span>    56/push-esi
<span id="L517" class="LineNr"> 517 </span>    57/push-edi
<span id="L518" class="LineNr"> 518 </span>    <span class="subxComment"># esi = s</span>
<span id="L519" class="LineNr"> 519 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L520" class="LineNr"> 520 </span>    <span class="subxComment"># var lens/ecx: int = s-&gt;end - s-&gt;start</span>
<span id="L521" class="LineNr"> 521 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L522" class="LineNr"> 522 </span>    2b/subtract                     0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *esi from ecx</span>
<span id="L523" class="LineNr"> 523 </span>    <span class="subxComment"># edi = head</span>
<span id="L524" class="LineNr"> 524 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to edi</span>
<span id="L525" class="LineNr"> 525 </span>    <span class="subxComment"># var hsize/edx: int = head-&gt;size</span>
<span id="L526" class="LineNr"> 526 </span>    8b/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to edx</span>
<span id="L527" class="LineNr"> 527 </span>    <span class="subxComment"># if (hsize &gt; lens) return false</span>
<span id="L528" class="LineNr"> 528 </span>    39/compare                      3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare edx with ecx</span>
<span id="L529" class="LineNr"> 529 </span>    7f/jump-if-&gt;  $slice-starts-with?:false/disp8
<span id="L530" class="LineNr"> 530 </span>    <span class="subxComment"># var currs/esi: (addr byte) = s-&gt;start</span>
<span id="L531" class="LineNr"> 531 </span>    8b/subtract                     0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to esi</span>
<span id="L532" class="LineNr"> 532 </span>    <span class="subxComment"># var currh/edi: (addr byte) = head-&gt;data</span>
<span id="L533" class="LineNr"> 533 </span>    81          0/subop/add         3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to edi</span>
<span id="L534" class="LineNr"> 534 </span>    <span class="subxComment"># var i/ecx: int = 0</span>
<span id="L535" class="LineNr"> 535 </span>    31/xor                          3/mod/direct    1/rm32/ecx   <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"># clear ecx</span>
<span id="L536" class="LineNr"> 536 </span>    <span class="subxComment"># var c1/eax: byte = 0</span>
<span id="L537" class="LineNr"> 537 </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="L538" class="LineNr"> 538 </span>    <span class="subxComment"># var c2/ebx: byte = 0</span>
<span id="L539" class="LineNr"> 539 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L540" class="LineNr"> 540 </span><span class="Constant">$slice-starts-with?:loop</span>:
<span id="L541" class="LineNr"> 541 </span>    <span class="subxComment"># if (i &gt;= hsize) return true</span>
<span id="L542" class="LineNr"> 542 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with edx</span>
<span id="L543" class="LineNr"> 543 </span>    7d/jump-if-&gt;=  $slice-starts-with?:true/disp8
<span id="L544" class="LineNr"> 544 </span>    <span class="subxComment"># c1 = *currs</span>
<span id="L545" class="LineNr"> 545 </span>    8a/copy-byte                    0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *esi to AL</span>
<span id="L546" class="LineNr"> 546 </span>    <span class="subxComment"># c2 = *currh</span>
<span id="L547" class="LineNr"> 547 </span>    8a/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 *edi to BL</span>
<span id="L548" class="LineNr"> 548 </span>    <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L549" class="LineNr"> 549 </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="L550" class="LineNr"> 550 </span>    75/jump-if-!=  $slice-starts-with?:false/disp8
<span id="L551" class="LineNr"> 551 </span>    <span class="subxComment"># ++i</span>
<span id="L552" class="LineNr"> 552 </span>    41/increment-ecx
<span id="L553" class="LineNr"> 553 </span>    <span class="subxComment"># ++currs</span>
<span id="L554" class="LineNr"> 554 </span>    46/increment-esi
<span id="L555" class="LineNr"> 555 </span>    <span class="subxComment"># ++currh</span>
<span id="L556" class="LineNr"> 556 </span>    47/increment-edi
<span id="L557" class="LineNr"> 557 </span>    eb/jump $slice-starts-with?:<span class="Constant">loop</span>/disp8
<span id="L558" class="LineNr"> 558 </span><span class="Constant">$slice-starts-with?:true</span>:
<span id="L559" class="LineNr"> 559 </span>    b8/copy-to-eax  1/imm32
<span id="L560" class="LineNr"> 560 </span>    eb/jump  $slice-starts-with?:end/disp8
<span id="L561" class="LineNr"> 561 </span><span class="Constant">$slice-starts-with?:false</span>:
<span id="L562" class="LineNr"> 562 </span>    b8/copy-to-eax  0/imm32
<span id="L563" class="LineNr"> 563 </span><span class="Constant">$slice-starts-with?:end</span>:
<span id="L564" class="LineNr"> 564 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L565" class="LineNr"> 565 </span>    5f/pop-to-edi
<span id="L566" class="LineNr"> 566 </span>    5e/pop-to-esi
<span id="L567" class="LineNr"> 567 </span>    5b/pop-to-ebx
<span id="L568" class="LineNr"> 568 </span>    5a/pop-to-edx
<span id="L569" class="LineNr"> 569 </span>    59/pop-to-ecx
<span id="L570" class="LineNr"> 570 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L571" class="LineNr"> 571 </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="L572" class="LineNr"> 572 </span>    5d/pop-to-ebp
<span id="L573" class="LineNr"> 573 </span>    c3/return
<span id="L574" class="LineNr"> 574 </span>
<span id="L575" class="LineNr"> 575 </span><span class="subxTest">test-slice-starts-with-single-character</span>:
<span id="L576" class="LineNr"> 576 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;A&quot;) == 1</span>
<span id="L577" class="LineNr"> 577 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L578" class="LineNr"> 578 </span>    55/push-ebp
<span id="L579" class="LineNr"> 579 </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="L580" class="LineNr"> 580 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L581" class="LineNr"> 581 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L582" class="LineNr"> 582 </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="L583" class="LineNr"> 583 </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="L584" class="LineNr"> 584 </span>    05/add-to-eax  4/imm32
<span id="L585" class="LineNr"> 585 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L586" class="LineNr"> 586 </span>    51/push-ecx
<span id="L587" class="LineNr"> 587 </span>    50/push-eax
<span id="L588" class="LineNr"> 588 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L589" class="LineNr"> 589 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;A&quot;)</span>
<span id="L590" class="LineNr"> 590 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L591" class="LineNr"> 591 </span>    68/push  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L592" class="LineNr"> 592 </span>    51/push-ecx
<span id="L593" class="LineNr"> 593 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L594" class="LineNr"> 594 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L595" class="LineNr"> 595 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L596" class="LineNr"> 596 </span>    81          0/subop/add         3/mod/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="L597" class="LineNr"> 597 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L598" class="LineNr"> 598 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L599" class="LineNr"> 599 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-single-character&quot;</span>/imm32
<span id="L600" class="LineNr"> 600 </span>    68/push  1/imm32
<span id="L601" class="LineNr"> 601 </span>    50/push-eax
<span id="L602" class="LineNr"> 602 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L603" class="LineNr"> 603 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L604" class="LineNr"> 604 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L605" class="LineNr"> 605 </span>    81          0/subop/add         3/mod/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="L606" class="LineNr"> 606 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L607" class="LineNr"> 607 </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="L608" class="LineNr"> 608 </span>    5d/pop-to-ebp
<span id="L609" class="LineNr"> 609 </span>    c3/return
<span id="L610" class="LineNr"> 610 </span>
<span id="L611" class="LineNr"> 611 </span><span class="subxTest">test-slice-starts-with-empty-string</span>:
<span id="L612" class="LineNr"> 612 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;&quot;) == 1</span>
<span id="L613" class="LineNr"> 613 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L614" class="LineNr"> 614 </span>    55/push-ebp
<span id="L615" class="LineNr"> 615 </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="L616" class="LineNr"> 616 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L617" class="LineNr"> 617 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L618" class="LineNr"> 618 </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="L619" class="LineNr"> 619 </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="L620" class="LineNr"> 620 </span>    05/add-to-eax  4/imm32
<span id="L621" class="LineNr"> 621 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L622" class="LineNr"> 622 </span>    51/push-ecx
<span id="L623" class="LineNr"> 623 </span>    50/push-eax
<span id="L624" class="LineNr"> 624 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L625" class="LineNr"> 625 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;&quot;)</span>
<span id="L626" class="LineNr"> 626 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L627" class="LineNr"> 627 </span>    68/push  <span class="Constant">&quot;&quot;</span>/imm32
<span id="L628" class="LineNr"> 628 </span>    51/push-ecx
<span id="L629" class="LineNr"> 629 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L630" class="LineNr"> 630 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L631" class="LineNr"> 631 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L632" class="LineNr"> 632 </span>    81          0/subop/add         3/mod/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="L633" class="LineNr"> 633 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L634" class="LineNr"> 634 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L635" class="LineNr"> 635 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-empty-string&quot;</span>/imm32
<span id="L636" class="LineNr"> 636 </span>    68/push  1/imm32
<span id="L637" class="LineNr"> 637 </span>    50/push-eax
<span id="L638" class="LineNr"> 638 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L639" class="LineNr"> 639 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L640" class="LineNr"> 640 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L641" class="LineNr"> 641 </span>    81          0/subop/add         3/mod/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="L642" class="LineNr"> 642 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L643" class="LineNr"> 643 </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="L644" class="LineNr"> 644 </span>    5d/pop-to-ebp
<span id="L645" class="LineNr"> 645 </span>    c3/return
<span id="L646" class="LineNr"> 646 </span>
<span id="L647" class="LineNr"> 647 </span><span class="subxTest">test-slice-starts-with-multiple-characters</span>:
<span id="L648" class="LineNr"> 648 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;Ab&quot;) == 1</span>
<span id="L649" class="LineNr"> 649 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L650" class="LineNr"> 650 </span>    55/push-ebp
<span id="L651" class="LineNr"> 651 </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="L652" class="LineNr"> 652 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L653" class="LineNr"> 653 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L654" class="LineNr"> 654 </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="L655" class="LineNr"> 655 </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="L656" class="LineNr"> 656 </span>    05/add-to-eax  4/imm32
<span id="L657" class="LineNr"> 657 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L658" class="LineNr"> 658 </span>    51/push-ecx
<span id="L659" class="LineNr"> 659 </span>    50/push-eax
<span id="L660" class="LineNr"> 660 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L661" class="LineNr"> 661 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;Ab&quot;)</span>
<span id="L662" class="LineNr"> 662 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L663" class="LineNr"> 663 </span>    68/push  <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L664" class="LineNr"> 664 </span>    51/push-ecx
<span id="L665" class="LineNr"> 665 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L666" class="LineNr"> 666 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L667" class="LineNr"> 667 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L668" class="LineNr"> 668 </span>    81          0/subop/add         3/mod/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="L669" class="LineNr"> 669 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L670" class="LineNr"> 670 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L671" class="LineNr"> 671 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-multiple-characters&quot;</span>/imm32
<span id="L672" class="LineNr"> 672 </span>    68/push  1/imm32
<span id="L673" class="LineNr"> 673 </span>    50/push-eax
<span id="L674" class="LineNr"> 674 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L675" class="LineNr"> 675 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L676" class="LineNr"> 676 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L677" class="LineNr"> 677 </span>    81          0/subop/add         3/mod/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="L678" class="LineNr"> 678 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L679" class="LineNr"> 679 </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="L680" class="LineNr"> 680 </span>    5d/pop-to-ebp
<span id="L681" class="LineNr"> 681 </span>    c3/return
<span id="L682" class="LineNr"> 682 </span>
<span id="L683" class="LineNr"> 683 </span><span class="subxTest">test-slice-starts-with-entire-string</span>:
<span id="L684" class="LineNr"> 684 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;Abc&quot;) == 1</span>
<span id="L685" class="LineNr"> 685 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L686" class="LineNr"> 686 </span>    55/push-ebp
<span id="L687" class="LineNr"> 687 </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="L688" class="LineNr"> 688 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L689" class="LineNr"> 689 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L690" class="LineNr"> 690 </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="L691" class="LineNr"> 691 </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="L692" class="LineNr"> 692 </span>    05/add-to-eax  4/imm32
<span id="L693" class="LineNr"> 693 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L694" class="LineNr"> 694 </span>    51/push-ecx
<span id="L695" class="LineNr"> 695 </span>    50/push-eax
<span id="L696" class="LineNr"> 696 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L697" class="LineNr"> 697 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;Abc&quot;)</span>
<span id="L698" class="LineNr"> 698 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L699" class="LineNr"> 699 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L700" class="LineNr"> 700 </span>    51/push-ecx
<span id="L701" class="LineNr"> 701 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L702" class="LineNr"> 702 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L703" class="LineNr"> 703 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L704" class="LineNr"> 704 </span>    81          0/subop/add         3/mod/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="L705" class="LineNr"> 705 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L706" class="LineNr"> 706 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L707" class="LineNr"> 707 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-entire-string&quot;</span>/imm32
<span id="L708" class="LineNr"> 708 </span>    68/push  1/imm32
<span id="L709" class="LineNr"> 709 </span>    50/push-eax
<span id="L710" class="LineNr"> 710 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L711" class="LineNr"> 711 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L712" class="LineNr"> 712 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L713" class="LineNr"> 713 </span>    81          0/subop/add         3/mod/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="L714" class="LineNr"> 714 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L715" class="LineNr"> 715 </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="L716" class="LineNr"> 716 </span>    5d/pop-to-ebp
<span id="L717" class="LineNr"> 717 </span>    c3/return
<span id="L718" class="LineNr"> 718 </span>
<span id="L719" class="LineNr"> 719 </span><span class="subxTest">test-slice-starts-with-fails</span>:
<span id="L720" class="LineNr"> 720 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;Abd&quot;) == 1</span>
<span id="L721" class="LineNr"> 721 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L722" class="LineNr"> 722 </span>    55/push-ebp
<span id="L723" class="LineNr"> 723 </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="L724" class="LineNr"> 724 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L725" class="LineNr"> 725 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L726" class="LineNr"> 726 </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="L727" class="LineNr"> 727 </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="L728" class="LineNr"> 728 </span>    05/add-to-eax  4/imm32
<span id="L729" class="LineNr"> 729 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L730" class="LineNr"> 730 </span>    51/push-ecx
<span id="L731" class="LineNr"> 731 </span>    50/push-eax
<span id="L732" class="LineNr"> 732 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L733" class="LineNr"> 733 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;Abd&quot;)</span>
<span id="L734" class="LineNr"> 734 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L735" class="LineNr"> 735 </span>    68/push  <span class="Constant">&quot;Abd&quot;</span>/imm32
<span id="L736" class="LineNr"> 736 </span>    51/push-ecx
<span id="L737" class="LineNr"> 737 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L738" class="LineNr"> 738 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L739" class="LineNr"> 739 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L740" class="LineNr"> 740 </span>    81          0/subop/add         3/mod/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="L741" class="LineNr"> 741 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L742" class="LineNr"> 742 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L743" class="LineNr"> 743 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-fails&quot;</span>/imm32
<span id="L744" class="LineNr"> 744 </span>    68/push  0/imm32
<span id="L745" class="LineNr"> 745 </span>    50/push-eax
<span id="L746" class="LineNr"> 746 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L747" class="LineNr"> 747 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L748" class="LineNr"> 748 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L749" class="LineNr"> 749 </span>    81          0/subop/add         3/mod/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="L750" class="LineNr"> 750 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L751" class="LineNr"> 751 </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="L752" class="LineNr"> 752 </span>    5d/pop-to-ebp
<span id="L753" class="LineNr"> 753 </span>    c3/return
<span id="L754" class="LineNr"> 754 </span>
<span id="L755" class="LineNr"> 755 </span><span class="subxTest">test-slice-starts-with-fails-2</span>:
<span id="L756" class="LineNr"> 756 </span>    <span class="subxH1Comment"># - slice-starts-with?(slice(&quot;Abc&quot;), &quot;Ac&quot;) == 1</span>
<span id="L757" class="LineNr"> 757 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L758" class="LineNr"> 758 </span>    55/push-ebp
<span id="L759" class="LineNr"> 759 </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="L760" class="LineNr"> 760 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L761" class="LineNr"> 761 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L762" class="LineNr"> 762 </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="L763" class="LineNr"> 763 </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="L764" class="LineNr"> 764 </span>    05/add-to-eax  4/imm32
<span id="L765" class="LineNr"> 765 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L766" class="LineNr"> 766 </span>    51/push-ecx
<span id="L767" class="LineNr"> 767 </span>    50/push-eax
<span id="L768" class="LineNr"> 768 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L769" class="LineNr"> 769 </span>    <span class="subxComment"># eax = slice-starts-with?(ecx, &quot;Ac&quot;)</span>
<span id="L770" class="LineNr"> 770 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L771" class="LineNr"> 771 </span>    68/push  <span class="Constant">&quot;Ac&quot;</span>/imm32
<span id="L772" class="LineNr"> 772 </span>    51/push-ecx
<span id="L773" class="LineNr"> 773 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L774" class="LineNr"> 774 </span>    e8/call  <a href='123slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L775" class="LineNr"> 775 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L776" class="LineNr"> 776 </span>    81          0/subop/add         3/mod/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="L777" class="LineNr"> 777 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L778" class="LineNr"> 778 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L779" class="LineNr"> 779 </span>    68/push  <span class="Constant">&quot;F - test-slice-starts-with-fails-2&quot;</span>/imm32
<span id="L780" class="LineNr"> 780 </span>    68/push  0/imm32
<span id="L781" class="LineNr"> 781 </span>    50/push-eax
<span id="L782" class="LineNr"> 782 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L783" class="LineNr"> 783 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L784" class="LineNr"> 784 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L785" class="LineNr"> 785 </span>    81          0/subop/add         3/mod/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="L786" class="LineNr"> 786 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L787" class="LineNr"> 787 </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="L788" class="LineNr"> 788 </span>    5d/pop-to-ebp
<span id="L789" class="LineNr"> 789 </span>    c3/return
<span id="L790" class="LineNr"> 790 </span>
<span id="L791" class="LineNr"> 791 </span><span class="subxComment"># write a slice to a stream</span>
<span id="L792" class="LineNr"> 792 </span><span class="subxComment"># abort if the stream doesn't have enough space</span>
<span id="L793" class="LineNr"> 793 </span><span class="subxFunction">write-slice</span>:  <span class="subxComment"># out: (addr stream byte), s: (addr slice)</span>
<span id="L794" class="LineNr"> 794 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L795" class="LineNr"> 795 </span>    55/push-ebp
<span id="L796" class="LineNr"> 796 </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="L797" class="LineNr"> 797 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L798" class="LineNr"> 798 </span>    50/push-eax
<span id="L799" class="LineNr"> 799 </span>    51/push-ecx
<span id="L800" class="LineNr"> 800 </span>    52/push-edx
<span id="L801" class="LineNr"> 801 </span>    53/push-ebx
<span id="L802" class="LineNr"> 802 </span>    56/push-esi
<span id="L803" class="LineNr"> 803 </span>    57/push-edi
<span id="L804" class="LineNr"> 804 </span>    <span class="subxComment"># esi = s</span>
<span id="L805" class="LineNr"> 805 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to esi</span>
<span id="L806" class="LineNr"> 806 </span>    <span class="subxComment"># var curr/ecx: (addr byte) = s-&gt;start</span>
<span id="L807" class="LineNr"> 807 </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="Normal"> . </span>                <span class="subxComment"># copy *esi to ecx</span>
<span id="L808" class="LineNr"> 808 </span>    <span class="subxComment"># var max/esi: (addr byte) = s-&gt;end</span>
<span id="L809" class="LineNr"> 809 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <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 *(esi+4) to esi</span>
<span id="L810" class="LineNr"> 810 </span>    <span class="subxComment"># edi = out</span>
<span id="L811" class="LineNr"> 811 </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="L812" class="LineNr"> 812 </span>    <span class="subxComment"># edx = out-&gt;size</span>
<span id="L813" class="LineNr"> 813 </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="L814" class="LineNr"> 814 </span>    <span class="subxComment"># ebx = out-&gt;write</span>
<span id="L815" class="LineNr"> 815 </span>    8b/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edi to ebx</span>
<span id="L816" class="LineNr"> 816 </span><span class="Constant">$write-slice:loop</span>:
<span id="L817" class="LineNr"> 817 </span>    <span class="subxComment"># if (curr &gt;= max) break</span>
<span id="L818" class="LineNr"> 818 </span>    39/compare                      3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ecx with esi</span>
<span id="L819" class="LineNr"> 819 </span>    73/jump-if-addr&gt;=  $write-slice:loop-end/disp8
<span id="L820" class="LineNr"> 820 </span>    <span class="subxComment"># if (out-&gt;write &gt;= out-&gt;size) abort</span>
<span id="L821" class="LineNr"> 821 </span>    39/compare                      3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare ebx with edx</span>
<span id="L822" class="LineNr"> 822 </span>    7d/jump-if-&gt;=  $write-slice:abort/disp8
<span id="L823" class="LineNr"> 823 </span>    <span class="subxComment"># out-&gt;data[out-&gt;write] = *in</span>
<span id="L824" class="LineNr"> 824 </span>    <span class="subxS1Comment"># . AL = *in</span>
<span id="L825" class="LineNr"> 825 </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="L826" class="LineNr"> 826 </span>    8a/copy-byte                    0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *ecx to AL</span>
<span id="L827" class="LineNr"> 827 </span>    <span class="subxS1Comment"># . out-&gt;data[out-&gt;write] = AL</span>
<span id="L828" class="LineNr"> 828 </span>    88/copy-byte                    1/mod/*+disp8   4/rm32/sib    7/base/edi  3/index/ebx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy AL to *(edi+ebx+12)</span>
<span id="L829" class="LineNr"> 829 </span>    <span class="subxComment"># ++out-&gt;write</span>
<span id="L830" class="LineNr"> 830 </span>    43/increment-ebx
<span id="L831" class="LineNr"> 831 </span>    <span class="subxComment"># ++in</span>
<span id="L832" class="LineNr"> 832 </span>    41/increment-ecx
<span id="L833" class="LineNr"> 833 </span>    eb/jump  $write-slice:<span class="Constant">loop</span>/disp8
<span id="L834" class="LineNr"> 834 </span><span class="Constant">$write-slice:loop-end</span>:
<span id="L835" class="LineNr"> 835 </span>    <span class="subxComment"># persist out-&gt;write</span>
<span id="L836" class="LineNr"> 836 </span>    89/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebx to *edi</span>
<span id="L837" class="LineNr"> 837 </span><span class="Constant">$write-slice:end</span>:
<span id="L838" class="LineNr"> 838 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L839" class="LineNr"> 839 </span>    5f/pop-to-edi
<span id="L840" class="LineNr"> 840 </span>    5e/pop-to-esi
<span id="L841" class="LineNr"> 841 </span>    5b/pop-to-ebx
<span id="L842" class="LineNr"> 842 </span>    5a/pop-to-edx
<span id="L843" class="LineNr"> 843 </span>    59/pop-to-ecx
<span id="L844" class="LineNr"> 844 </span>    58/pop-to-eax
<span id="L845" class="LineNr"> 845 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L846" class="LineNr"> 846 </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="L847" class="LineNr"> 847 </span>    5d/pop-to-ebp
<span id="L848" class="LineNr"> 848 </span>    c3/return
<span id="L849" class="LineNr"> 849 </span>
<span id="L850" class="LineNr"> 850 </span><span class="Constant">$write-slice:abort</span>:
<span id="L851" class="LineNr"> 851 </span>    (<a href='501draw-text.mu.html#L206'>draw-text-wrapping-right-then-down-from-cursor-over-full-screen</a> 0 <span class="Constant">&quot;write-slice: out of space&quot;</span> 3)  <span class="subxComment"># 3=cyan</span>
<span id="L852" class="LineNr"> 852 </span>    {
<span id="L853" class="LineNr"> 853 </span>      eb/jump <span class="Constant">loop</span>/disp8
<span id="L854" class="LineNr"> 854 </span>    }
<span id="L855" class="LineNr"> 855 </span>    <span class="subxComment"># never gets here</span>
<span id="L856" class="LineNr"> 856 </span>
<span id="L857" class="LineNr"> 857 </span><span class="subxTest">test-write-slice</span>:
<span id="L858" class="LineNr"> 858 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L859" class="LineNr"> 859 </span>    55/push-ebp
<span id="L860" class="LineNr"> 860 </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="L861" class="LineNr"> 861 </span>    <span class="subxComment"># setup</span>
<span id="L862" class="LineNr"> 862 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L863" class="LineNr"> 863 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L864" class="LineNr"> 864 </span>    68/push  <a href='108write.subx.html#L125'>_test-stream</a>/imm32
<span id="L865" class="LineNr"> 865 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L866" class="LineNr"> 866 </span>    e8/call  <a href='106stream.subx.html#L20'>clear-stream</a>/disp32
<span id="L867" class="LineNr"> 867 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L868" class="LineNr"> 868 </span>    81          0/subop/add         3/mod/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="L869" class="LineNr"> 869 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L870" class="LineNr"> 870 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L871" class="LineNr"> 871 </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="L872" class="LineNr"> 872 </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="L873" class="LineNr"> 873 </span>    05/add-to-eax  4/imm32
<span id="L874" class="LineNr"> 874 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L875" class="LineNr"> 875 </span>    51/push-ecx
<span id="L876" class="LineNr"> 876 </span>    50/push-eax
<span id="L877" class="LineNr"> 877 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L878" class="LineNr"> 878 </span>    <span class="subxComment"># write-slice(_test-stream, slice)</span>
<span id="L879" class="LineNr"> 879 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L880" class="LineNr"> 880 </span>    51/push-ecx
<span id="L881" class="LineNr"> 881 </span>    68/push  <a href='108write.subx.html#L125'>_test-stream</a>/imm32
<span id="L882" class="LineNr"> 882 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L883" class="LineNr"> 883 </span>    e8/call  <a href='123slice.subx.html#L793'>write-slice</a>/disp32
<span id="L884" class="LineNr"> 884 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L885" class="LineNr"> 885 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L886" class="LineNr"> 886 </span>    <span class="subxComment"># check-stream-equal(_test-stream, &quot;Abc&quot;, msg)</span>
<span id="L887" class="LineNr"> 887 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L888" class="LineNr"> 888 </span>    68/push  <span class="Constant">&quot;F - test-write-slice&quot;</span>/imm32
<span id="L889" class="LineNr"> 889 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L890" class="LineNr"> 890 </span>    68/push  <a href='108write.subx.html#L125'>_test-stream</a>/imm32
<span id="L891" class="LineNr"> 891 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L892" class="LineNr"> 892 </span>    e8/call  <a href='109stream-equal.subx.html#L197'>check-stream-equal</a>/disp32
<span id="L893" class="LineNr"> 893 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L894" class="LineNr"> 894 </span>    81          0/subop/add         3/mod/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="L895" class="LineNr"> 895 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L896" class="LineNr"> 896 </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="L897" class="LineNr"> 897 </span>    5d/pop-to-ebp
<span id="L898" class="LineNr"> 898 </span>    c3/return
<span id="L899" class="LineNr"> 899 </span>
<span id="L900" class="LineNr"> 900 </span><span class="subxComment"># copy a slice into a new (dynamically allocated) string</span>
<span id="L901" class="LineNr"> 901 </span><span class="subxFunction">slice-to-string</span>:  <span class="subxComment"># ad: (addr allocation-descriptor), in: (addr slice), out: (addr handle array byte)</span>
<span id="L902" class="LineNr"> 902 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L903" class="LineNr"> 903 </span>    55/push-ebp
<span id="L904" class="LineNr"> 904 </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="L905" class="LineNr"> 905 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L906" class="LineNr"> 906 </span>    50/push-eax
<span id="L907" class="LineNr"> 907 </span>    51/push-ecx
<span id="L908" class="LineNr"> 908 </span>    52/push-edx
<span id="L909" class="LineNr"> 909 </span>    53/push-ebx
<span id="L910" class="LineNr"> 910 </span>    56/push-esi
<span id="L911" class="LineNr"> 911 </span>    <span class="subxComment"># esi = in</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>          6/r32/esi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to esi</span>
<span id="L913" class="LineNr"> 913 </span>    <span class="subxComment"># var curr/edx: (addr byte) = in-&gt;start</span>
<span id="L914" class="LineNr"> 914 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <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"># copy *esi to edx</span>
<span id="L915" class="LineNr"> 915 </span>    <span class="subxComment"># var max/ebx: (addr byte) = in-&gt;end</span>
<span id="L916" class="LineNr"> 916 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ebx</span>
<span id="L917" class="LineNr"> 917 </span>    <span class="subxComment"># var size/ecx: int = max - curr + 4  # total size of output string (including the initial 'size' field)</span>
<span id="L918" class="LineNr"> 918 </span>    89/copy                         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"># copy ebx to ecx</span>
<span id="L919" class="LineNr"> 919 </span>    29/subtract                     3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract edx from ecx</span>
<span id="L920" class="LineNr"> 920 </span>    81          0/subop/add         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>              4/imm32           <span class="subxComment"># add to ecx</span>
<span id="L921" class="LineNr"> 921 </span>    <span class="subxComment"># allocate(ad, size, out)</span>
<span id="L922" class="LineNr"> 922 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L923" class="LineNr"> 923 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L924" class="LineNr"> 924 </span>    51/push-ecx
<span id="L925" class="LineNr"> 925 </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="L926" class="LineNr"> 926 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L927" class="LineNr"> 927 </span>    e8/call  <a href='120allocate.subx.html#L43'>allocate</a>/disp32
<span id="L928" class="LineNr"> 928 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L929" class="LineNr"> 929 </span>    81          0/subop/add         3/mod/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="L930" class="LineNr"> 930 </span>    <span class="subxComment"># eax = out-&gt;payload</span>
<span id="L931" class="LineNr"> 931 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <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="L932" class="LineNr"> 932 </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="L933" class="LineNr"> 933 </span>    <span class="subxComment"># skip payload-&gt;allocid</span>
<span id="L934" class="LineNr"> 934 </span>    05/add-to-eax  4/imm32
<span id="L935" class="LineNr"> 935 </span>    <span class="subxComment"># if (eax == 0) abort</span>
<span id="L936" class="LineNr"> 936 </span>    3d/compare-eax-and  0/imm32
<span id="L937" class="LineNr"> 937 </span>    74/jump-if-=  $slice-to-string:abort/disp8
<span id="L938" class="LineNr"> 938 </span>    <span class="subxComment"># out-&gt;size = size-4</span>
<span id="L939" class="LineNr"> 939 </span>    89/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 ecx to *eax</span>
<span id="L940" class="LineNr"> 940 </span>    81          5/subop/subtract    0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># subtract 4 from *eax</span>
<span id="L941" class="LineNr"> 941 </span>    <span class="subxComment"># save out</span>
<span id="L942" class="LineNr"> 942 </span>    50/push-eax
<span id="L943" class="LineNr"> 943 </span><span class="Constant">$slice-to-string:initialize</span>:
<span id="L944" class="LineNr"> 944 </span>    <span class="subxComment"># eax = _append-4(eax+4, eax+size, curr, max)  # clobbering ecx</span>
<span id="L945" class="LineNr"> 945 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L946" class="LineNr"> 946 </span>    53/push-ebx
<span id="L947" class="LineNr"> 947 </span>    52/push-edx
<span id="L948" class="LineNr"> 948 </span>    <span class="subxS2Comment"># . . push eax+size (clobbering ecx)</span>
<span id="L949" class="LineNr"> 949 </span>    01/add                          3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add eax to ecx</span>
<span id="L950" class="LineNr"> 950 </span>    51/push-ecx
<span id="L951" class="LineNr"> 951 </span>    <span class="subxS2Comment"># . . push eax+4 (clobbering eax)</span>
<span id="L952" class="LineNr"> 952 </span>    81          0/subop/add         3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to eax</span>
<span id="L953" class="LineNr"> 953 </span>    50/push-eax
<span id="L954" class="LineNr"> 954 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L955" class="LineNr"> 955 </span>    e8/call  <a href='108write.subx.html#L171'>_append-4</a>/disp32
<span id="L956" class="LineNr"> 956 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L957" class="LineNr"> 957 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L958" class="LineNr"> 958 </span>    <span class="subxComment"># restore out (assumes _append-4 can't error)</span>
<span id="L959" class="LineNr"> 959 </span>    58/pop-to-eax
<span id="L960" class="LineNr"> 960 </span><span class="Constant">$slice-to-string:end</span>:
<span id="L961" class="LineNr"> 961 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L962" class="LineNr"> 962 </span>    5e/pop-to-esi
<span id="L963" class="LineNr"> 963 </span>    5b/pop-to-ebx
<span id="L964" class="LineNr"> 964 </span>    5a/pop-to-edx
<span id="L965" class="LineNr"> 965 </span>    59/pop-to-ecx
<span id="L966" class="LineNr"> 966 </span>    58/pop-to-eax
<span id="L967" class="LineNr"> 967 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L968" class="LineNr"> 968 </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="L969" class="LineNr"> 969 </span>    5d/pop-to-ebp
<span id="L970" class="LineNr"> 970 </span>    c3/return
<span id="L971" class="LineNr"> 971 </span>
<span id="L972" class="LineNr"> 972 </span><span class="Constant">$slice-to-string:abort</span>:
<span id="L973" class="LineNr"> 973 </span>    (<a href='501draw-text.mu.html#L206'>draw-text-wrapping-right-then-down-from-cursor-over-full-screen</a> 0 <span class="Constant">&quot;slice-to-string: out of space\n&quot;</span> 3)  <span class="subxComment"># 3=cyan</span>
<span id="L974" class="LineNr"> 974 </span>    {
<span id="L975" class="LineNr"> 975 </span>      eb/jump <span class="Constant">loop</span>/disp8
<span id="L976" class="LineNr"> 976 </span>    }
<span id="L977" class="LineNr"> 977 </span>    <span class="subxComment"># never gets here</span>
<span id="L978" class="LineNr"> 978 </span>
<span id="L979" class="LineNr"> 979 </span><span class="subxTest">test-slice-to-string</span>:
<span id="L980" class="LineNr"> 980 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L981" class="LineNr"> 981 </span>    55/push-ebp
<span id="L982" class="LineNr"> 982 </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="L983" class="LineNr"> 983 </span>    <span class="subxComment"># var ad/edx: allocation-descriptor containing 16 bytes</span>
<span id="L984" class="LineNr"> 984 </span>    <span class="subxS1Comment"># . var end/ecx: (addr byte)</span>
<span id="L985" class="LineNr"> 985 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L986" class="LineNr"> 986 </span>    81 5/subop/subtract %esp 0x10/imm32
<span id="L987" class="LineNr"> 987 </span>    <span class="subxS1Comment"># . var start/edx: (addr byte) = end - 0x10</span>
<span id="L988" class="LineNr"> 988 </span>    89/&lt;- %edx 4/r32/esp
<span id="L989" class="LineNr"> 989 </span>    <span class="subxS1Comment"># . ad = {start, end}</span>
<span id="L990" class="LineNr"> 990 </span>    51/push-ecx
<span id="L991" class="LineNr"> 991 </span>    52/push-edx
<span id="L992" class="LineNr"> 992 </span>    89/copy                         3/mod/direct    2/rm32/edx   <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 edx</span>
<span id="L993" class="LineNr"> 993 </span>    <span class="subxComment"># (eax..ecx) = &quot;Abc&quot;</span>
<span id="L994" class="LineNr"> 994 </span>    b8/copy-to-eax  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L995" class="LineNr"> 995 </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="L996" class="LineNr"> 996 </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="L997" class="LineNr"> 997 </span>    05/add-to-eax  4/imm32
<span id="L998" class="LineNr"> 998 </span>    <span class="subxComment"># var slice/ecx: slice = {eax, ecx}</span>
<span id="L999" class="LineNr"> 999 </span>    51/push-ecx
<span id="L1000" class="LineNr">1000 </span>    50/push-eax
<span id="L1001" class="LineNr">1001 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L1002" class="LineNr">1002 </span>    <span class="subxComment"># var h/ebx: (handle array byte)</span>
<span id="L1003" class="LineNr">1003 </span>    68/push  0/imm32
<span id="L1004" class="LineNr">1004 </span>    68/push  0/imm32
<span id="L1005" class="LineNr">1005 </span>    89/copy                         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebx</span>
<span id="L1006" class="LineNr">1006 </span>    <span class="subxComment"># slice-to-string(ad, slice, h)</span>
<span id="L1007" class="LineNr">1007 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1008" class="LineNr">1008 </span>    53/push-ebx
<span id="L1009" class="LineNr">1009 </span>    51/push-ecx
<span id="L1010" class="LineNr">1010 </span>    52/push-edx
<span id="L1011" class="LineNr">1011 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1012" class="LineNr">1012 </span>    e8/call  <a href='123slice.subx.html#L901'>slice-to-string</a>/disp32
<span id="L1013" class="LineNr">1013 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1014" class="LineNr">1014 </span>    81          0/subop/add         3/mod/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="L1015" class="LineNr">1015 </span>    <span class="subxComment"># eax = h-&gt;payload</span>
<span id="L1016" class="LineNr">1016 </span>    8b/copy                         1/mod/*+disp8   3/rm32/ebx   <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 *(ebx+4) to eax</span>
<span id="L1017" class="LineNr">1017 </span>    <span class="subxComment"># skip payload-&gt;allocid</span>
<span id="L1018" class="LineNr">1018 </span>    05/add-to-eax  4/imm32
<span id="L1019" class="Folded">1019 </span><span class="Folded">+-- 26 lines: #?     # dump eax ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span id="L1045" class="LineNr">1045 </span>    <span class="subxComment"># eax = string-equal?(eax, &quot;Abc&quot;)</span>
<span id="L1046" class="LineNr">1046 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1047" class="LineNr">1047 </span>    68/push  <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L1048" class="LineNr">1048 </span>    50/push-eax
<span id="L1049" class="LineNr">1049 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1050" class="LineNr">1050 </span>    e8/call  <a href='105string-equal.subx.html#L8'>string-equal?</a>/disp32
<span id="L1051" class="LineNr">1051 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1052" class="LineNr">1052 </span>    81          0/subop/add         3/mod/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="L1053" class="LineNr">1053 </span>    <span class="subxComment"># check-ints-equal(eax, 1, msg)</span>
<span id="L1054" class="LineNr">1054 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1055" class="LineNr">1055 </span>    68/push  <span class="Constant">&quot;F - test-slice-to-string&quot;</span>/imm32
<span id="L1056" class="LineNr">1056 </span>    68/push  1/imm32/true
<span id="L1057" class="LineNr">1057 </span>    50/push-eax
<span id="L1058" class="LineNr">1058 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1059" class="LineNr">1059 </span>    e8/call  <a href='502test.mu.html#L2'>check-ints-equal</a>/disp32
<span id="L1060" class="LineNr">1060 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1061" class="LineNr">1061 </span>    81          0/subop/add         3/mod/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="L1062" class="LineNr">1062 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L1063" class="LineNr">1063 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x18/imm32        <span class="subxComment"># add to esp</span>
<span id="L1064" class="LineNr">1064 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1065" class="LineNr">1065 </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="L1066" class="LineNr">1066 </span>    5d/pop-to-ebp
<span id="L1067" class="LineNr">1067 </span>    c3/return
<span id="L1068" class="LineNr">1068 </span>
<span id="L1069" class="LineNr">1069 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->