about summary refs log tree commit diff stats
path: root/subx/examples/Readme.md
blob: d4bb1ff5e0e7617cc85daa7562d68ceffe1bada2 (plain) (blame)
1
2
3
4
5
6
Small example programs, each with a simple pedagogical goal.

They also help to validate SubX instruction semantics against native x86
hardware. For example, loading a single byte to a register would for some time
clear the rest of the register. This behavior was internally consistent with
unit tests. It took running an example binary natively to catch the discrepancy.
192'>192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
<!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 - 034check_operand_bounds.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; 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; }
.cSpecial { color: #008000; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Delimiter { color: #c000c0; }
.SalientComment { color: #0000af; }
-->
</style>

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

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

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

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/034check_operand_bounds.cc'>https://github.com/akkartik/mu/blob/master/034check_operand_bounds.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="SalientComment">//:: Check that the different operands of an instruction aren't too large for their bitfields.</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L3'>test_check_bitfield_sizes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L4" class="LineNr">  4 </span>  <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L5" class="LineNr">  5 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L6" class="LineNr">  6 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L7" class="LineNr">  7 </span>      <span class="Constant">&quot;01/add 4/mod 3/rm32 1/r32\n&quot;</span>  <span class="Comment">// add ECX to EBX</span>
<span id="L8" class="LineNr">  8 </span>  <span class="Delimiter">);</span>
<span id="L9" class="LineNr">  9 </span>  <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L10" class="LineNr"> 10 </span>      <span class="Constant">&quot;error: '4/mod' too large to fit in bitfield mod\n&quot;</span>
<span id="L11" class="LineNr"> 11 </span>  <span class="Delimiter">);</span>
<span id="L12" class="LineNr"> 12 </span><span class="Delimiter">}</span>
<span id="L13" class="LineNr"> 13 </span>
<span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L15" class="LineNr"> 15 </span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt; <span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">;</span>
<span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L17" class="LineNr"> 17 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;subop&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L18" class="LineNr"> 18 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L19" class="LineNr"> 19 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L20" class="LineNr"> 20 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;base&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L21" class="LineNr"> 21 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L22" class="LineNr"> 22 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;scale&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L23" class="LineNr"> 23 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;r32&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L24" class="LineNr"> 24 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;disp8&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">8</span><span class="Delimiter">);</span>
<span id="L25" class="LineNr"> 25 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">16</span><span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span><span class="Comment">// no bound needed for disp32</span>
<span id="L27" class="LineNr"> 27 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;imm8&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span>&lt;&lt;<span class="Constant">8</span><span class="Delimiter">);</span>
<span id="L28" class="LineNr"> 28 </span><span class="Comment">// no bound needed for imm32</span>
<span id="L29" class="LineNr"> 29 </span>
<span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;Pack Operands(segment code)&quot;)</span>
<span id="L31" class="LineNr"> 31 </span>check_operand_bounds<span class="Delimiter">(</span>code<span class="Delimiter">);</span>
<span id="L32" class="LineNr"> 32 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(code)</span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">void</span> check_operand_bounds<span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; code<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr"> 35 </span>  <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- check operand bounds&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L36" class="LineNr"> 36 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span>    <span class="Normal">const</span> line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <a href='033check_operands.cc.html#L310'>first_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>  j &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
<span id="L39" class="LineNr"> 39 </span>      check_operand_bounds<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span>
<span id="L40" class="LineNr"> 40 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// stop at the first mal-formed instruction</span>
<span id="L41" class="LineNr"> 41 </span>  <span class="Delimiter">}</span>
<span id="L42" class="LineNr"> 42 </span><span class="Delimiter">}</span>
<span id="L43" class="LineNr"> 43 </span>
<span id="L44" class="LineNr"> 44 </span><span class="Normal">void</span> check_operand_bounds<span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L45" class="LineNr"> 45 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;::iterator p = <span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != <span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L46" class="LineNr"> 46 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!has_operand_metadata<span class="Delimiter">(</span>w<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr"> 47 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!looks_like_hex_int<span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// later transforms are on their own to do their own bounds checking</span>
<span id="L48" class="LineNr"> 48 </span>    <span class="Normal">int32_t</span> x = <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>x &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L50" class="LineNr"> 50 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;disp8&quot;</span> || p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt;= p<span class="Delimiter">-&gt;</span>second/<span class="Constant">2</span><span class="Delimiter">)</span>
<span id="L52" class="LineNr"> 52 </span>          <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' too large to fit in signed bitfield &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L53" class="LineNr"> 53 </span>      <span class="Delimiter">}</span>
<span id="L54" class="LineNr"> 54 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L55" class="LineNr"> 55 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt;= p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span>
<span id="L56" class="LineNr"> 56 </span>          <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' too large to fit in bitfield &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L57" class="LineNr"> 57 </span>      <span class="Delimiter">}</span>
<span id="L58" class="LineNr"> 58 </span>    <span class="Delimiter">}</span>
<span id="L59" class="LineNr"> 59 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span>      <span class="Comment">// hacky? assuming bound is a power of 2</span>
<span id="L61" class="LineNr"> 61 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>x &lt; -<span class="Constant">1</span>*<span class="Normal">static_cast</span>&lt;<span class="Normal">int32_t</span>&gt;<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second/<span class="Constant">2</span><span class="Delimiter">))</span>
<span id="L62" class="LineNr"> 62 </span>        <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' too large to fit in bitfield &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span>    <span class="Delimiter">}</span>
<span id="L64" class="LineNr"> 64 </span>  <span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span><span class="Delimiter">}</span>
<span id="L66" class="LineNr"> 66 </span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L67'>test_check_bitfield_sizes_for_imm8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L69" class="LineNr"> 69 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L70" class="LineNr"> 70 </span>      <span class="Constant">&quot;c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX 0xff/imm8&quot;</span>  <span class="Comment">// shift EBX left</span>
<span id="L71" class="LineNr"> 71 </span>  <span class="Delimiter">);</span>
<span id="L72" class="LineNr"> 72 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">());</span>
<span id="L73" class="LineNr"> 73 </span><span class="Delimiter">}</span>
<span id="L74" class="LineNr"> 74 </span>
<span id="L75" class="LineNr"> 75 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L75'>test_check_bitfield_sizes_for_imm8_error</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L76" class="LineNr"> 76 </span>  <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L77" class="LineNr"> 77 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L78" class="LineNr"> 78 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L79" class="LineNr"> 79 </span>      <span class="Constant">&quot;c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX 0x100/imm8&quot;</span>  <span class="Comment">// shift EBX left</span>
<span id="L80" class="LineNr"> 80 </span>  <span class="Delimiter">);</span>
<span id="L81" class="LineNr"> 81 </span>  <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L82" class="LineNr"> 82 </span>      <span class="Constant">&quot;error: '0x100/imm8' too large to fit in bitfield imm8\n&quot;</span>
<span id="L83" class="LineNr"> 83 </span>  <span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">}</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L86'>test_check_bitfield_sizes_for_negative_imm8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L87" class="LineNr"> 87 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L88" class="LineNr"> 88 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L89" class="LineNr"> 89 </span>      <span class="Constant">&quot;c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX -0x80/imm8&quot;</span>  <span class="Comment">// shift EBX left</span>
<span id="L90" class="LineNr"> 90 </span>  <span class="Delimiter">);</span>
<span id="L91" class="LineNr"> 91 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">());</span>
<span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
<span id="L93" class="LineNr"> 93 </span>
<span id="L94" class="LineNr"> 94 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L94'>test_check_bitfield_sizes_for_negative_imm8_error</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L95" class="LineNr"> 95 </span>  <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L97" class="LineNr"> 97 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L98" class="LineNr"> 98 </span>      <span class="Constant">&quot;c1/shift 4/subop/left 3/mod/direct 1/rm32/ECX -0x81/imm8&quot;</span>  <span class="Comment">// shift EBX left</span>
<span id="L99" class="LineNr"> 99 </span>  <span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span>  <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L101" class="LineNr">101 </span>      <span class="Constant">&quot;error: '-0x81/imm8' too large to fit in bitfield imm8\n&quot;</span>
<span id="L102" class="LineNr">102 </span>  <span class="Delimiter">);</span>
<span id="L103" class="LineNr">103 </span><span class="Delimiter">}</span>
<span id="L104" class="LineNr">104 </span>
<span id="L105" class="LineNr">105 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L105'>test_check_bitfield_sizes_for_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span>  <span class="Comment">// not bothering to run</span>
<span id="L107" class="LineNr">107 </span>  transform<span class="Delimiter">(</span>
<span id="L108" class="LineNr">108 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L109" class="LineNr">109 </span>      <span class="Constant">&quot;01/add 1/mod/*+disp8 3/rm32 1/r32 0x7f/disp8\n&quot;</span>  <span class="Comment">// add ECX to *(EBX+0x7f)</span>
<span id="L110" class="LineNr">110 </span>  <span class="Delimiter">);</span>
<span id="L111" class="LineNr">111 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">());</span>
<span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span>
<span id="L113" class="LineNr">113 </span>
<span id="L114" class="LineNr">114 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L114'>test_check_bitfield_sizes_for_disp8_error</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L115" class="LineNr">115 </span>  <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L116" class="LineNr">116 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L117" class="LineNr">117 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L118" class="LineNr">118 </span>      <span class="Constant">&quot;01/add 1/mod/*+disp8 3/rm32 1/r32 0x80/disp8\n&quot;</span>  <span class="Comment">// add ECX to *(EBX+0x80)</span>
<span id="L119" class="LineNr">119 </span>  <span class="Delimiter">);</span>
<span id="L120" class="LineNr">120 </span>  <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L121" class="LineNr">121 </span>      <span class="Constant">&quot;error: '0x80/disp8' too large to fit in signed bitfield disp8\n&quot;</span>
<span id="L122" class="LineNr">122 </span>  <span class="Delimiter">);</span>
<span id="L123" class="LineNr">123 </span><span class="Delimiter">}</span>
<span id="L124" class="LineNr">124 </span>
<span id="L125" class="LineNr">125 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L125'>test_check_bitfield_sizes_for_negative_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L126" class="LineNr">126 </span>  <span class="Comment">// not bothering to run</span>
<span id="L127" class="LineNr">127 </span>  transform<span class="Delimiter">(</span>
<span id="L128" class="LineNr">128 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L129" class="LineNr">129 </span>      <span class="Constant">&quot;01/add 1/mod/*+disp8 3/rm32 1/r32 -0x80/disp8\n&quot;</span>  <span class="Comment">// add ECX to *(EBX-0x80)</span>
<span id="L130" class="LineNr">130 </span>  <span class="Delimiter">);</span>
<span id="L131" class="LineNr">131 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">());</span>
<span id="L132" class="LineNr">132 </span><span class="Delimiter">}</span>
<span id="L133" class="LineNr">133 </span>
<span id="L134" class="LineNr">134 </span><span class="Normal">void</span> <a href='034check_operand_bounds.cc.html#L134'>test_check_bitfield_sizes_for_negative_disp8_error</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L135" class="LineNr">135 </span>  <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L136" class="LineNr">136 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L137" class="LineNr">137 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L138" class="LineNr">138 </span>      <span class="Constant">&quot;01/add 1/mod/*+disp8 3/rm32 1/r32 -0x81/disp8\n&quot;</span>  <span class="Comment">// add ECX to *(EBX-0x81)</span>
<span id="L139" class="LineNr">139 </span>  <span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>  <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L141" class="LineNr">141 </span>      <span class="Constant">&quot;error: '-0x81/disp8' too large to fit in bitfield disp8\n&quot;</span>
<span id="L142" class="LineNr">142 </span>  <span class="Delimiter">);</span>
<span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->