This commit is contained in:
Kartik Agaram 2019-07-14 09:42:36 -07:00
parent c4412d299e
commit ce2c1efc41
67 changed files with 26591 additions and 20809 deletions

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/000organization.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,12 +14,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Delimiter { color: #c000c0; }
.LineNr { }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.PreProc { color: #c000c0; }
-->
</style>
@ -37,7 +37,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/001help.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/002test.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,16 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.CommentedCode { color: #8a8a8a; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/003trace.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,15 +14,15 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.PreProc { color: #c000c0; }
.SalientComment { color: #0000af; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/003trace.test.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,9 +16,9 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Delimiter { color: #c000c0; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Delimiter { color: #c000c0; }
-->
</style>
@ -35,7 +35,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/010---vm.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,15 +14,15 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.cSpecial { color: #008000; }
.SalientComment { color: #0000af; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -245,7 +245,7 @@ if ('onhashchange' in window) {
<span id="L184" class="LineNr">184 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int8_t</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
<span id="L186" class="LineNr">186 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L187" class="LineNr">187 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L212'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L187" class="LineNr">187 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L213'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L188" class="LineNr">188 </span> <span class="Identifier">return</span> handle ? *handle : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span>
<span id="L190" class="LineNr">190 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span> <a href='010---vm.cc.html#L190'>read_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -257,224 +257,219 @@ if ('onhashchange' in window) {
<span id="L196" class="LineNr">196 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L197" class="LineNr">197 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L105'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L198" class="LineNr">198 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L199" class="LineNr">199 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L199" class="LineNr">199 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L200" class="LineNr">200 </span> result = &amp;<span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span>
<span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span>
<span id="L203" class="LineNr">203 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L204" class="LineNr">204 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">.</span><a href='011run.cc.html#L197'>flush</a><span class="Delimiter">();</span>
<span id="L205" class="LineNr">205 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L206" class="LineNr">206 </span> <span class="Delimiter">}</span>
<span id="L207" class="LineNr">207 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span><span class="Delimiter">}</span>
<span id="L209" class="LineNr">209 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span>* <a href='010---vm.cc.html#L209'>mem_addr_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L210" class="LineNr">210 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int8_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L211" class="LineNr">211 </span><span class="Delimiter">}</span>
<span id="L212" class="LineNr">212 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span>* <a href='010---vm.cc.html#L212'>mem_addr_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L213" class="LineNr">213 </span> <span class="Normal">uint32_t</span>* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L214" class="LineNr">214 </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#L165'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L215" class="LineNr">215 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L108'>match32</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L216" class="LineNr">216 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L217" class="LineNr">217 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L218" class="LineNr">218 </span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint32_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L222" class="LineNr">222 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">.</span><a href='011run.cc.html#L197'>flush</a><span class="Delimiter">();</span>
<span id="L223" class="LineNr">223 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L224" class="LineNr">224 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;The entire 4-byte <a href='011run.cc.html#L126'>word</a> should be initialized and lie in a single segment.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L225" class="LineNr">225 </span> <span class="Delimiter">}</span>
<span id="L226" class="LineNr">226 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span>
<span id="L228" class="LineNr">228 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span>* <a href='010---vm.cc.html#L228'>mem_addr_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L229" class="LineNr">229 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int32_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L212'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L230" class="LineNr">230 </span><span class="Delimiter">}</span>
<span id="L231" class="LineNr">231 </span><span class="Comment">// helper for some syscalls. But read-only.</span>
<span id="L232" class="LineNr">232 </span><span class="Normal">inline</span> <span class="Normal">const</span> <span class="Normal">char</span>* <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L233" class="LineNr">233 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L234" class="LineNr">234 </span><span class="Delimiter">}</span>
<span id="L235" class="LineNr">235 </span><span class="Normal">inline</span> string <a href='010---vm.cc.html#L235'>mem_addr_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L237" class="LineNr">237 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L238" class="LineNr">238 </span> out &lt;&lt; <a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>addr+i<span class="Delimiter">);</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span>
<span id="L205" class="LineNr">205 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L206" class="LineNr">206 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span>
<span id="L208" class="LineNr">208 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span><span class="Delimiter">}</span>
<span id="L210" class="LineNr">210 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span>* <a href='010---vm.cc.html#L210'>mem_addr_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L211" class="LineNr">211 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int8_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L212" class="LineNr">212 </span><span class="Delimiter">}</span>
<span id="L213" class="LineNr">213 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span>* <a href='010---vm.cc.html#L213'>mem_addr_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L214" class="LineNr">214 </span> <span class="Normal">uint32_t</span>* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L215" class="LineNr">215 </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#L165'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L216" class="LineNr">216 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L108'>match32</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L217" class="LineNr">217 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L218" class="LineNr">218 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L219" class="LineNr">219 </span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint32_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span>
<span id="L222" class="LineNr">222 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L223" class="LineNr">223 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">.</span><a href='011run.cc.html#L197'>flush</a><span class="Delimiter">();</span>
<span id="L224" class="LineNr">224 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L225" class="LineNr">225 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;The entire 4-byte <a href='011run.cc.html#L126'>word</a> should be initialized and lie in a single segment.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L226" class="LineNr">226 </span> <span class="Delimiter">}</span>
<span id="L227" class="LineNr">227 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L228" class="LineNr">228 </span><span class="Delimiter">}</span>
<span id="L229" class="LineNr">229 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span>* <a href='010---vm.cc.html#L229'>mem_addr_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L230" class="LineNr">230 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int32_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L213'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L231" class="LineNr">231 </span><span class="Delimiter">}</span>
<span id="L232" class="LineNr">232 </span><span class="Comment">// helper for some syscalls. But read-only.</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">inline</span> <span class="Normal">const</span> <span class="Normal">char</span>* <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L234" class="LineNr">234 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span>
<span id="L236" class="LineNr">236 </span><span class="Normal">inline</span> string <a href='010---vm.cc.html#L236'>mem_addr_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L237" class="LineNr">237 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L239" class="LineNr">239 </span> out &lt;&lt; <a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>addr+i<span class="Delimiter">);</span>
<span id="L240" class="LineNr">240 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L241" class="LineNr">241 </span><span class="Delimiter">}</span>
<span id="L242" class="LineNr">242 </span>
<span id="L243" class="LineNr">243 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L243'>write_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> <span class="Normal">uint8_t</span>* handle = <a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L245" class="LineNr">245 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span><span class="Delimiter">}</span>
<span id="L247" class="LineNr">247 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L247'>write_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L248" class="LineNr">248 </span> <span class="Normal">int8_t</span>* handle = <a href='010---vm.cc.html#L209'>mem_addr_i8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L249" class="LineNr">249 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L250" class="LineNr">250 </span><span class="Delimiter">}</span>
<span id="L251" class="LineNr">251 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L251'>write_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L252" class="LineNr">252 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L212'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L253" class="LineNr">253 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L254" class="LineNr">254 </span><span class="Delimiter">}</span>
<span id="L255" class="LineNr">255 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L255'>write_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L256" class="LineNr">256 </span> <span class="Normal">int32_t</span>* handle = <a href='010---vm.cc.html#L228'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L257" class="LineNr">257 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L258" class="LineNr">258 </span><span class="Delimiter">}</span>
<span id="L259" class="LineNr">259 </span>
<span id="L260" class="LineNr">260 </span><span class="Normal">inline</span> <span class="Normal">bool</span> <a href='010---vm.cc.html#L260'>already_allocated</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L261" class="LineNr">261 </span> <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L262" class="LineNr">262 </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#L165'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L263" class="LineNr">263 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L105'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L264" class="LineNr">264 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L265" class="LineNr">265 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L266" class="LineNr">266 </span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L267" class="LineNr">267 </span> <span class="Delimiter">}</span>
<span id="L268" class="LineNr">268 </span> <span class="Delimiter">}</span>
<span id="L269" class="LineNr">269 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
<span id="L271" class="LineNr">271 </span>
<span id="L272" class="LineNr">272 </span><span class="SalientComment">//:: core interpreter loop</span>
<span id="L273" class="LineNr">273 </span>
<span id="L274" class="LineNr">274 </span><span class="Delimiter">:(code)</span>
<span id="L275" class="LineNr">275 </span><span class="Comment">// skeleton of how x86 instructions are decoded</span>
<span id="L276" class="LineNr">276 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L276'>run_one_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L277" class="LineNr">277 </span> <span class="Normal">uint8_t</span> op=<span class="Constant">0</span><span class="Delimiter">,</span> op2=<span class="Constant">0</span><span class="Delimiter">,</span> op3=<span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L278" class="LineNr">278 </span> <span class="Comment">// Run One Instruction</span>
<span id="L279" class="LineNr">279 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L280" class="LineNr">280 </span> <a href='010---vm.cc.html#L347'>dump_registers</a><span class="Delimiter">();</span>
<span id="L281" class="LineNr">281 </span> <span class="Comment">// End Dump Info for Instruction</span>
<span id="L282" class="LineNr">282 </span> <span class="Delimiter">}</span>
<span id="L283" class="LineNr">283 </span> <span class="Normal">uint32_t</span> inst_start_address = EIP<span class="Delimiter">;</span>
<span id="L284" class="LineNr">284 </span> op = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L285" class="LineNr">285 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; inst_start_address &lt;&lt; <span class="Constant">&quot; opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L286" class="LineNr">286 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L287" class="LineNr">287 </span> <span class="Normal">case</span> <span class="Constant">0xf4</span>: <span class="Comment">// hlt</span>
<span id="L288" class="LineNr">288 </span> EIP = <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span><span class="Delimiter">;</span>
<span id="L289" class="LineNr">289 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L290" class="LineNr">290 </span> <span class="Comment">// End Single-Byte Opcodes</span>
<span id="L291" class="LineNr">291 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L292" class="LineNr">292 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L293" class="LineNr">293 </span> <span class="Comment">// End Two-Byte Opcodes Starting With 0f</span>
<span id="L294" class="LineNr">294 </span> <span class="Normal">default</span>:
<span id="L295" class="LineNr">295 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L296" class="LineNr">296 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L243" class="LineNr">243 </span>
<span id="L244" class="LineNr">244 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L244'>write_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L245" class="LineNr">245 </span> <span class="Normal">uint8_t</span>* handle = <a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L246" class="LineNr">246 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span>
<span id="L248" class="LineNr">248 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L248'>write_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L249" class="LineNr">249 </span> <span class="Normal">int8_t</span>* handle = <a href='010---vm.cc.html#L210'>mem_addr_i8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L251" class="LineNr">251 </span><span class="Delimiter">}</span>
<span id="L252" class="LineNr">252 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L252'>write_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L253" class="LineNr">253 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L213'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L254" class="LineNr">254 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L255" class="LineNr">255 </span><span class="Delimiter">}</span>
<span id="L256" class="LineNr">256 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L256'>write_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L257" class="LineNr">257 </span> <span class="Normal">int32_t</span>* handle = <a href='010---vm.cc.html#L229'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L259" class="LineNr">259 </span><span class="Delimiter">}</span>
<span id="L260" class="LineNr">260 </span>
<span id="L261" class="LineNr">261 </span><span class="Normal">inline</span> <span class="Normal">bool</span> <a href='010---vm.cc.html#L261'>already_allocated</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L262" class="LineNr">262 </span> <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L263" class="LineNr">263 </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#L165'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L264" class="LineNr">264 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L105'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L265" class="LineNr">265 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L266" class="LineNr">266 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L267" class="LineNr">267 </span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L268" class="LineNr">268 </span> <span class="Delimiter">}</span>
<span id="L269" class="LineNr">269 </span> <span class="Delimiter">}</span>
<span id="L270" class="LineNr">270 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span><span class="Delimiter">}</span>
<span id="L272" class="LineNr">272 </span>
<span id="L273" class="LineNr">273 </span><span class="SalientComment">//:: core interpreter loop</span>
<span id="L274" class="LineNr">274 </span>
<span id="L275" class="LineNr">275 </span><span class="Delimiter">:(code)</span>
<span id="L276" class="LineNr">276 </span><span class="Comment">// skeleton of how x86 instructions are decoded</span>
<span id="L277" class="LineNr">277 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L277'>run_one_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L278" class="LineNr">278 </span> <span class="Normal">uint8_t</span> op=<span class="Constant">0</span><span class="Delimiter">,</span> op2=<span class="Constant">0</span><span class="Delimiter">,</span> op3=<span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L279" class="LineNr">279 </span> <span class="Comment">// Run One Instruction</span>
<span id="L280" class="LineNr">280 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L437'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L281" class="LineNr">281 </span> <a href='010---vm.cc.html#L342'>dump_registers</a><span class="Delimiter">();</span>
<span id="L282" class="LineNr">282 </span> <span class="Comment">// End Dump Info for Instruction</span>
<span id="L283" class="LineNr">283 </span> <span class="Delimiter">}</span>
<span id="L284" class="LineNr">284 </span> <span class="Normal">uint32_t</span> inst_start_address = EIP<span class="Delimiter">;</span>
<span id="L285" class="LineNr">285 </span> op = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L286" class="LineNr">286 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; inst_start_address &lt;&lt; <span class="Constant">&quot; opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L287" class="LineNr">287 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L288" class="LineNr">288 </span> <span class="Normal">case</span> <span class="Constant">0xf4</span>: <span class="Comment">// hlt</span>
<span id="L289" class="LineNr">289 </span> EIP = <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span><span class="Delimiter">;</span>
<span id="L290" class="LineNr">290 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L291" class="LineNr">291 </span> <span class="Comment">// End Single-Byte Opcodes</span>
<span id="L292" class="LineNr">292 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L293" class="LineNr">293 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L294" class="LineNr">294 </span> <span class="Comment">// End Two-Byte Opcodes Starting With 0f</span>
<span id="L295" class="LineNr">295 </span> <span class="Normal">default</span>:
<span id="L296" class="LineNr">296 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L297" class="LineNr">297 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L298" class="LineNr">298 </span> <span class="Delimiter">}</span>
<span id="L299" class="LineNr">299 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span> <span class="Normal">case</span> <span class="Constant">0xf2</span>:
<span id="L301" class="LineNr">301 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L301" class="LineNr">301 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L302" class="LineNr">302 </span> <span class="Comment">// End Two-Byte Opcodes Starting With f2</span>
<span id="L303" class="LineNr">303 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L304" class="LineNr">304 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L304" class="LineNr">304 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L305" class="LineNr">305 </span> <span class="Comment">// End Three-Byte Opcodes Starting With f2 0f</span>
<span id="L306" class="LineNr">306 </span> <span class="Normal">default</span>:
<span id="L307" class="LineNr">307 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f2 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L309" class="LineNr">309 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L310" class="LineNr">310 </span> <span class="Delimiter">}</span>
<span id="L311" class="LineNr">311 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L312" class="LineNr">312 </span> <span class="Normal">default</span>:
<span id="L313" class="LineNr">313 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f2: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L314" class="LineNr">314 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L315" class="LineNr">315 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L316" class="LineNr">316 </span> <span class="Delimiter">}</span>
<span id="L317" class="LineNr">317 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L318" class="LineNr">318 </span> <span class="Normal">case</span> <span class="Constant">0xf3</span>:
<span id="L319" class="LineNr">319 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L320" class="LineNr">320 </span> <span class="Comment">// End Two-Byte Opcodes Starting With f3</span>
<span id="L321" class="LineNr">321 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L322" class="LineNr">322 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L323" class="LineNr">323 </span> <span class="Comment">// End Three-Byte Opcodes Starting With f3 0f</span>
<span id="L324" class="LineNr">324 </span> <span class="Normal">default</span>:
<span id="L325" class="LineNr">325 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f3 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L326" class="LineNr">326 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L327" class="LineNr">327 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L328" class="LineNr">328 </span> <span class="Delimiter">}</span>
<span id="L329" class="LineNr">329 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L330" class="LineNr">330 </span> <span class="Normal">default</span>:
<span id="L331" class="LineNr">331 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f3: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L332" class="LineNr">332 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L333" class="LineNr">333 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L334" class="LineNr">334 </span> <span class="Delimiter">}</span>
<span id="L335" class="LineNr">335 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> <span class="Normal">default</span>:
<span id="L337" class="LineNr">337 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L338" class="LineNr">338 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L339" class="LineNr">339 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L340" class="LineNr">340 </span> <span class="Delimiter">}</span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
<span id="L342" class="LineNr">342 </span>
<span id="L343" class="LineNr">343 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L344" class="LineNr">344 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>EIP++<span class="Delimiter">);</span>
<span id="L345" class="LineNr">345 </span><span class="Delimiter">}</span>
<span id="L346" class="LineNr">346 </span>
<span id="L347" class="LineNr">347 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L347'>dump_registers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L348" class="LineNr">348 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L349" class="LineNr">349 </span> out &lt;&lt; <span class="Constant">&quot;registers before: &quot;</span><span class="Delimiter">;</span>
<span id="L350" class="LineNr">350 </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='010---vm.cc.html#L21'>NUM_INT_REGISTERS</a><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L351" class="LineNr">351 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;; &quot;</span><span class="Delimiter">;</span>
<span id="L352" class="LineNr">352 </span> out &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; std::hex &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">8</span><span class="Delimiter">)</span> &lt;&lt; std::setfill<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[i]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L353" class="LineNr">353 </span> <span class="Delimiter">}</span>
<span id="L354" class="LineNr">354 </span> out &lt;&lt; <span class="Constant">&quot; -- SF: &quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L83'>ZF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L84'>CF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L85'>OF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L356" class="LineNr">356 </span><span class="Delimiter">}</span>
<span id="L357" class="LineNr">357 </span>
<span id="L358" class="LineNr">358 </span><span class="Comment">//: start tracking supported opcodes</span>
<span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L360" class="LineNr">360 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">;</span>
<span id="L361" class="LineNr">361 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">;</span>
<span id="L362" class="LineNr">362 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L362'>Name_f3</a></span><span class="Delimiter">;</span>
<span id="L363" class="LineNr">363 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L363'>Name_f3_0f</a></span><span class="Delimiter">;</span>
<span id="L364" class="LineNr">364 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L365" class="LineNr">365 </span><a href='010---vm.cc.html#L367'>init_op_names</a><span class="Delimiter">();</span>
<span id="L366" class="LineNr">366 </span><span class="Delimiter">:(code)</span>
<span id="L367" class="LineNr">367 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L367'>init_op_names</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L368" class="LineNr">368 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f4&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;halt (hlt)&quot;</span><span class="Delimiter">);</span>
<span id="L369" class="LineNr">369 </span> <span class="Comment">// End Initialize Op Names</span>
<span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
<span id="L371" class="LineNr">371 </span>
<span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Special-cases(key)&quot;)</span>
<span id="L373" class="LineNr">373 </span><span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">&quot;opcodes&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L374" class="LineNr">374 </span> cerr &lt;&lt; <span class="Constant">&quot;Opcodes currently supported by SubX:\n&quot;</span><span class="Delimiter">;</span>
<span id="L375" class="LineNr">375 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L376" class="LineNr">376 </span> cerr &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L378" class="LineNr">378 </span> cerr &lt;&lt; <span class="Constant">&quot; 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L379" class="LineNr">379 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L362'>Name_f3</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L362'>Name_f3</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L380" class="LineNr">380 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L363'>Name_f3_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L363'>Name_f3_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L382" class="LineNr">382 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L383" class="LineNr">383 </span> cerr &lt;&lt; <span class="Constant">&quot;Run `subx help instructions` for details on <a href='011run.cc.html#L121'>words</a> like 'r32' and 'disp8'.\n&quot;</span>
<span id="L384" class="LineNr">384 </span> <span class="Constant">&quot;For complete details on these instructions, consult the IA-32 manual (volume 2).\n&quot;</span>
<span id="L385" class="LineNr">385 </span> <span class="Constant">&quot;There's various versions of it online, such as <a href="https://c9x.me/x86">https://c9x.me/x86</a>.\n&quot;</span>
<span id="L386" class="LineNr">386 </span> <span class="Constant">&quot;The mnemonics in brackets will help you locate each instruction.\n&quot;</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Contents&quot;)</span>
<span id="L390" class="LineNr">390 </span>cerr &lt;&lt; <span class="Constant">&quot; opcodes\n&quot;</span><span class="Delimiter">;</span>
<span id="L391" class="LineNr">391 </span>
<span id="L392" class="LineNr">392 </span><span class="Comment">//: Helpers for managing trace depths</span>
<span id="L393" class="LineNr">393 </span><span class="Comment">//:</span>
<span id="L394" class="LineNr">394 </span><span class="Comment">//: We're going to use trace depths primarily to segment code running at</span>
<span id="L395" class="LineNr">395 </span><span class="Comment">//: different frames of the call stack. This will make it easy for the trace</span>
<span id="L396" class="LineNr">396 </span><span class="Comment">//: browser to collapse over entire calls.</span>
<span id="L397" class="LineNr">397 </span><span class="Comment">//:</span>
<span id="L398" class="LineNr">398 </span><span class="Comment">//: Errors will be at depth 0.</span>
<span id="L399" class="LineNr">399 </span><span class="Comment">//: Warnings will be at depth 1.</span>
<span id="L400" class="LineNr">400 </span><span class="Comment">//: SubX instructions will occupy depth 2 and up to Max_depth, organized by</span>
<span id="L401" class="LineNr">401 </span><span class="Comment">//: stack frames. Each instruction's internal details will be one level deeper</span>
<span id="L402" class="LineNr">402 </span><span class="Comment">//: than its 'main' depth. So 'call' instruction details will be at the same</span>
<span id="L403" class="LineNr">403 </span><span class="Comment">//: depth as the instructions of the function it calls.</span>
<span id="L404" class="LineNr">404 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L405" class="LineNr">405 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> <span class="Special"><a href='010---vm.cc.html#L405'>Initial_callstack_depth</a></span> = <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L406" class="LineNr">406 </span><span class="Normal">int</span> <span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L405'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L407" class="LineNr">407 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L408" class="LineNr">408 </span><span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L405'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L409" class="LineNr">409 </span>
<span id="L410" class="LineNr">410 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L411" class="LineNr">411 </span><span class="PreProc">#include </span><span class="Constant">&lt;iomanip&gt;</span>
<span id="L412" class="LineNr">412 </span><span class="PreProc">#define HEXBYTE std::hex &lt;&lt; std::setw(</span><span class="Constant">2</span><span class="PreProc">) &lt;&lt; std::setfill(</span><span class="Constant">'0'</span><span class="PreProc">)</span>
<span id="L413" class="LineNr">413 </span><span class="PreProc">#define HEXWORD std::hex &lt;&lt; std::setw(</span><span class="Constant">8</span><span class="PreProc">) &lt;&lt; std::setfill(</span><span class="Constant">'0'</span><span class="PreProc">)</span>
<span id="L414" class="LineNr">414 </span><span class="Comment">// ugly that iostream doesn't print uint8_t as an integer</span>
<span id="L415" class="LineNr">415 </span><span class="PreProc">#define NUM(</span><span class="Special">X</span><span class="PreProc">) </span><span class="Normal">static_cast</span><span class="PreProc">&lt;</span><span class="Normal">int</span><span class="PreProc">&gt;(</span><span class="Special">X</span><span class="PreProc">)</span>
<span id="L416" class="LineNr">416 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdint.h&gt;</span>
<span id="L307" class="LineNr">307 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f2 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L309" class="LineNr">309 </span> <span class="Delimiter">}</span>
<span id="L310" class="LineNr">310 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L311" class="LineNr">311 </span> <span class="Normal">default</span>:
<span id="L312" class="LineNr">312 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f2: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L313" class="LineNr">313 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L314" class="LineNr">314 </span> <span class="Delimiter">}</span>
<span id="L315" class="LineNr">315 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L316" class="LineNr">316 </span> <span class="Normal">case</span> <span class="Constant">0xf3</span>:
<span id="L317" class="LineNr">317 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L318" class="LineNr">318 </span> <span class="Comment">// End Two-Byte Opcodes Starting With f3</span>
<span id="L319" class="LineNr">319 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L320" class="LineNr">320 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L321" class="LineNr">321 </span> <span class="Comment">// End Three-Byte Opcodes Starting With f3 0f</span>
<span id="L322" class="LineNr">322 </span> <span class="Normal">default</span>:
<span id="L323" class="LineNr">323 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f3 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L324" class="LineNr">324 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L325" class="LineNr">325 </span> <span class="Delimiter">}</span>
<span id="L326" class="LineNr">326 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L327" class="LineNr">327 </span> <span class="Normal">default</span>:
<span id="L328" class="LineNr">328 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f3: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L329" class="LineNr">329 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span> <span class="Delimiter">}</span>
<span id="L331" class="LineNr">331 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L332" class="LineNr">332 </span> <span class="Normal">default</span>:
<span id="L333" class="LineNr">333 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L335" class="LineNr">335 </span> <span class="Delimiter">}</span>
<span id="L336" class="LineNr">336 </span><span class="Delimiter">}</span>
<span id="L337" class="LineNr">337 </span>
<span id="L338" class="LineNr">338 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L339" class="LineNr">339 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>EIP++<span class="Delimiter">);</span>
<span id="L340" class="LineNr">340 </span><span class="Delimiter">}</span>
<span id="L341" class="LineNr">341 </span>
<span id="L342" class="LineNr">342 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L342'>dump_registers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L343" class="LineNr">343 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L344" class="LineNr">344 </span> out &lt;&lt; <span class="Constant">&quot;registers before: &quot;</span><span class="Delimiter">;</span>
<span id="L345" class="LineNr">345 </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='010---vm.cc.html#L21'>NUM_INT_REGISTERS</a><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L346" class="LineNr">346 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;; &quot;</span><span class="Delimiter">;</span>
<span id="L347" class="LineNr">347 </span> out &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; std::hex &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">8</span><span class="Delimiter">)</span> &lt;&lt; std::setfill<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[i]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span>
<span id="L349" class="LineNr">349 </span> out &lt;&lt; <span class="Constant">&quot; -- SF: &quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L83'>ZF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L84'>CF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L85'>OF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">;</span>
<span id="L350" class="LineNr">350 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">}</span>
<span id="L352" class="LineNr">352 </span>
<span id="L353" class="LineNr">353 </span><span class="Comment">//: start tracking supported opcodes</span>
<span id="L354" class="LineNr">354 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L355" class="LineNr">355 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">;</span>
<span id="L356" class="LineNr">356 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">;</span>
<span id="L357" class="LineNr">357 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L357'>Name_f3</a></span><span class="Delimiter">;</span>
<span id="L358" class="LineNr">358 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L358'>Name_f3_0f</a></span><span class="Delimiter">;</span>
<span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L360" class="LineNr">360 </span><a href='010---vm.cc.html#L362'>init_op_names</a><span class="Delimiter">();</span>
<span id="L361" class="LineNr">361 </span><span class="Delimiter">:(code)</span>
<span id="L362" class="LineNr">362 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L362'>init_op_names</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L363" class="LineNr">363 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f4&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;halt (hlt)&quot;</span><span class="Delimiter">);</span>
<span id="L364" class="LineNr">364 </span> <span class="Comment">// End Initialize Op Names</span>
<span id="L365" class="LineNr">365 </span><span class="Delimiter">}</span>
<span id="L366" class="LineNr">366 </span>
<span id="L367" class="LineNr">367 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Special-cases(key)&quot;)</span>
<span id="L368" class="LineNr">368 </span><span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">&quot;opcodes&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L369" class="LineNr">369 </span> cerr &lt;&lt; <span class="Constant">&quot;Opcodes currently supported by SubX:\n&quot;</span><span class="Delimiter">;</span>
<span id="L370" class="LineNr">370 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L371" class="LineNr">371 </span> cerr &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L372" class="LineNr">372 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L373" class="LineNr">373 </span> cerr &lt;&lt; <span class="Constant">&quot; 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L357'>Name_f3</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L357'>Name_f3</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L375" class="LineNr">375 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L376" class="LineNr">376 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L358'>Name_f3_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L358'>Name_f3_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L377" class="LineNr">377 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L378" class="LineNr">378 </span> cerr &lt;&lt; <span class="Constant">&quot;Run `subx help instructions` for details on <a href='011run.cc.html#L121'>words</a> like 'r32' and 'disp8'.\n&quot;</span>
<span id="L379" class="LineNr">379 </span> <span class="Constant">&quot;For complete details on these instructions, consult the IA-32 manual (volume 2).\n&quot;</span>
<span id="L380" class="LineNr">380 </span> <span class="Constant">&quot;There's various versions of it online, such as <a href="https://c9x.me/x86">https://c9x.me/x86</a>.\n&quot;</span>
<span id="L381" class="LineNr">381 </span> <span class="Constant">&quot;The mnemonics in brackets will help you locate each instruction.\n&quot;</span><span class="Delimiter">;</span>
<span id="L382" class="LineNr">382 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L383" class="LineNr">383 </span><span class="Delimiter">}</span>
<span id="L384" class="LineNr">384 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Contents&quot;)</span>
<span id="L385" class="LineNr">385 </span>cerr &lt;&lt; <span class="Constant">&quot; opcodes\n&quot;</span><span class="Delimiter">;</span>
<span id="L386" class="LineNr">386 </span>
<span id="L387" class="LineNr">387 </span><span class="Comment">//: Helpers for managing trace depths</span>
<span id="L388" class="LineNr">388 </span><span class="Comment">//:</span>
<span id="L389" class="LineNr">389 </span><span class="Comment">//: We're going to use trace depths primarily to segment code running at</span>
<span id="L390" class="LineNr">390 </span><span class="Comment">//: different frames of the call stack. This will make it easy for the trace</span>
<span id="L391" class="LineNr">391 </span><span class="Comment">//: browser to collapse over entire calls.</span>
<span id="L392" class="LineNr">392 </span><span class="Comment">//:</span>
<span id="L393" class="LineNr">393 </span><span class="Comment">//: Errors will be at depth 0.</span>
<span id="L394" class="LineNr">394 </span><span class="Comment">//: Warnings will be at depth 1.</span>
<span id="L395" class="LineNr">395 </span><span class="Comment">//: SubX instructions will occupy depth 2 and up to Max_depth, organized by</span>
<span id="L396" class="LineNr">396 </span><span class="Comment">//: stack frames. Each instruction's internal details will be one level deeper</span>
<span id="L397" class="LineNr">397 </span><span class="Comment">//: than its 'main' depth. So 'call' instruction details will be at the same</span>
<span id="L398" class="LineNr">398 </span><span class="Comment">//: depth as the instructions of the function it calls.</span>
<span id="L399" class="LineNr">399 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L400" class="LineNr">400 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> <span class="Special"><a href='010---vm.cc.html#L400'>Initial_callstack_depth</a></span> = <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L401" class="LineNr">401 </span><span class="Normal">int</span> <span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L400'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L402" class="LineNr">402 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L403" class="LineNr">403 </span><span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L400'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L404" class="LineNr">404 </span>
<span id="L405" class="LineNr">405 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L406" class="LineNr">406 </span><span class="PreProc">#include </span><span class="Constant">&lt;iomanip&gt;</span>
<span id="L407" class="LineNr">407 </span><span class="PreProc">#define HEXBYTE std::hex &lt;&lt; std::setw(</span><span class="Constant">2</span><span class="PreProc">) &lt;&lt; std::setfill(</span><span class="Constant">'0'</span><span class="PreProc">)</span>
<span id="L408" class="LineNr">408 </span><span class="PreProc">#define HEXWORD std::hex &lt;&lt; std::setw(</span><span class="Constant">8</span><span class="PreProc">) &lt;&lt; std::setfill(</span><span class="Constant">'0'</span><span class="PreProc">)</span>
<span id="L409" class="LineNr">409 </span><span class="Comment">// ugly that iostream doesn't print uint8_t as an integer</span>
<span id="L410" class="LineNr">410 </span><span class="PreProc">#define NUM(</span><span class="Special">X</span><span class="PreProc">) </span><span class="Normal">static_cast</span><span class="PreProc">&lt;</span><span class="Normal">int</span><span class="PreProc">&gt;(</span><span class="Special">X</span><span class="PreProc">)</span>
<span id="L411" class="LineNr">411 </span><span class="PreProc">#include </span><span class="Constant">&lt;stdint.h&gt;</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/011run.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,14 +14,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -152,7 +152,7 @@ if ('onhashchange' in window) {
<span id="L92" class="LineNr"> 92 </span> <a href='011run.cc.html#L260'>load</a><span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>EIP &lt; <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span><span class="Delimiter">)</span>
<span id="L95" class="LineNr"> 95 </span> <a href='010---vm.cc.html#L276'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L95" class="LineNr"> 95 </span> <a href='010---vm.cc.html#L277'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L96" class="LineNr"> 96 </span><span class="Delimiter">}</span>
<span id="L97" class="LineNr"> 97 </span>
<span id="L98" class="LineNr"> 98 </span><span class="SalientComment">//:: core data structures</span>
@ -227,7 +227,7 @@ if ('onhashchange' in window) {
<span id="L167" class="LineNr">167 </span> curr_segment<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L110'>name</a> = segment_name<span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span> curr_segment<span class="Delimiter">-&gt;</span>start = seg_start<span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </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;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;starts at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; curr_segment<span class="Delimiter">-&gt;</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L170" class="LineNr">170 </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;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;starts at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; curr_segment<span class="Delimiter">-&gt;</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// skip rest of line</span>
<span id="L173" class="LineNr">173 </span> <span class="Delimiter">}</span>
@ -329,7 +329,7 @@ if ('onhashchange' in window) {
<span id="L269" class="LineNr">269 </span> <span class="Normal">uint32_t</span> addr = seg<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!already_allocated<span class="Delimiter">(</span>addr<span class="Delimiter">))</span>
<span id="L271" class="LineNr">271 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>seg<span class="Delimiter">.</span>start<span class="Delimiter">));</span>
<span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;loading segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; from &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;loading segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; from &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L273" class="LineNr">273 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L112'>lines</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">const</span> line&amp; l = seg<span class="Delimiter">.</span><a href='011run.cc.html#L112'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L275" class="LineNr">275 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> k = <span class="Constant">0</span><span class="Delimiter">;</span> k &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>l<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span> ++k<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -337,9 +337,9 @@ if ('onhashchange' in window) {
<span id="L277" class="LineNr">277 </span> <span class="Normal">uint8_t</span> val = <a href='011run.cc.html#L302'>hex_byte</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L278" class="LineNr">278 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L279" class="LineNr">279 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>addr<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L280" class="LineNr">280 </span> <a href='010---vm.cc.html#L243'>write_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L280" class="LineNr">280 </span> <a href='010---vm.cc.html#L244'>write_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L281" class="LineNr">281 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L282" class="LineNr">282 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L282" class="LineNr">282 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L283" class="LineNr">283 </span> ++addr<span class="Delimiter">;</span>
<span id="L284" class="LineNr">284 </span> <span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span>
@ -464,14 +464,14 @@ if ('onhashchange' in window) {
<span id="L404" class="LineNr">404 </span><span class="SalientComment">//:: run</span>
<span id="L405" class="LineNr">405 </span>
<span id="L406" class="LineNr">406 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L407" class="LineNr">407 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L13'>EAX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L407" class="LineNr">407 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L13'>EAX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L408" class="LineNr">408 </span>
<span id="L409" class="LineNr">409 </span><span class="Comment">//: our first opcode</span>
<span id="L410" class="LineNr">410 </span>
<span id="L411" class="LineNr">411 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L412" class="LineNr">412 </span><span class="Normal">case</span> <span class="Constant">0xb8</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm32 to EAX</span>
<span id="L413" class="LineNr">413 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> src = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L414" class="LineNr">414 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L414" class="LineNr">414 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L415" class="LineNr">415 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = src<span class="Delimiter">;</span>
<span id="L416" class="LineNr">416 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L417" class="LineNr">417 </span><span class="Delimiter">}</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/012elf.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -73,7 +73,7 @@ if ('onhashchange' in window) {
<span id="L12" class="LineNr"> 12 </span> cerr &lt;&lt; std::hex<span class="Delimiter">;</span>
<span id="L13" class="LineNr"> 13 </span> <a href='012elf.cc.html#L21'>load_elf</a><span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L14" class="LineNr"> 14 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>EIP &lt; <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span><span class="Delimiter">)</span> <span class="Comment">// weak final-gasp termination check</span>
<span id="L15" class="LineNr"> 15 </span> <a href='010---vm.cc.html#L276'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L15" class="LineNr"> 15 </span> <a href='010---vm.cc.html#L277'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;executed past end of the world: &quot;</span> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L18" class="LineNr"> 18 </span><span class="Delimiter">}</span>
@ -104,7 +104,7 @@ if ('onhashchange' in window) {
<span id="L43" class="LineNr"> 43 </span> <span class="Comment">// unused: remaining 10 bytes of e_ident</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Normal">uint32_t</span> e_machine_type = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_machine_type != <span class="Constant">0x00030002</span><span class="Delimiter">)</span>
<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Comment">// unused: e_version. We only support version 1, and later versions will be backwards compatible.</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">uint32_t</span> <a href='035labels.cc.html#L44'>e_entry</a> = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">24</span>]<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Normal">uint32_t</span> e_phoff = <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">28</span>]<span class="Delimiter">);</span>
@ -141,7 +141,7 @@ if ('onhashchange' in window) {
<span id="L80" class="LineNr"> 80 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">);</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt;= strlen<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L82" class="LineNr"> 82 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>argv_data<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span> <span class="Comment">// don't bother comparing ARGV and STACK</span>
<span id="L83" class="LineNr"> 83 </span> <a href='010---vm.cc.html#L243'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L83" class="LineNr"> 83 </span> <a href='010---vm.cc.html#L244'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span> argv_data += <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">char</span><span class="Delimiter">);</span>
<span id="L85" class="LineNr"> 85 </span> assert<span class="Delimiter">(</span>argv_data &lt; <a href='012elf.cc.html#L152'>ARGV_DATA_SEGMENT</a> + <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span>
@ -158,9 +158,9 @@ if ('onhashchange' in window) {
<span id="L97" class="LineNr"> 97 </span> &lt;&lt; <span class="Constant">&quot;to be larger.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L98" class="LineNr"> 98 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">}</span>
<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L102" class="LineNr">102 </span> <a href='010---vm.cc.html#L251'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L102" class="LineNr">102 </span> <a href='010---vm.cc.html#L252'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L103" class="LineNr">103 </span><span class="Delimiter">}</span>
<span id="L104" class="LineNr">104 </span>
<span id="L105" class="LineNr">105 </span><span class="Normal">void</span> <a href='012elf.cc.html#L105'>load_segment_from_program_header</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">int</span> segment_index<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> offset<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> e_ehsize<span class="Delimiter">,</span> set&lt;<span class="Normal">uint32_t</span>&gt;&amp; overlap<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -190,7 +190,7 @@ if ('onhashchange' in window) {
<span id="L129" class="LineNr">129 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>p_vaddr<span class="Delimiter">));</span>
<span id="L130" class="LineNr">130 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p_filesz<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L131" class="LineNr">131 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L132" class="LineNr">132 </span> <a href='010---vm.cc.html#L243'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L132" class="LineNr">132 </span> <a href='010---vm.cc.html#L244'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L133" class="LineNr">133 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">);</span>
<span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span>
<span id="L135" class="LineNr">135 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>segment_index == <span class="Constant">0</span> &amp;&amp; <span class="Special"><a href='010---vm.cc.html#L171'>End_of_program</a></span> &lt; p_vaddr+p_memsz<span class="Delimiter">)</span>
@ -220,10 +220,10 @@ if ('onhashchange' in window) {
<span id="L159" class="LineNr">159 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L160" class="LineNr">160 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;stack:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = AFTER_STACK-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">40</span><span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span><span class="Delimiter">}</span>
<span id="L167" class="LineNr">167 </span>
<span id="L168" class="LineNr">168 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L168'>u32_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/013direct_addressing.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,13 +16,13 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.SalientComment { color: #0000af; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -62,7 +62,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: operating directly on a register</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;01&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;add r32 to rm32 (add)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;01&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;add r32 to rm32 (add)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(code)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L7'>test_add_r32_to_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -83,7 +83,7 @@ if ('onhashchange' in window) {
<span id="L22" class="LineNr"> 22 </span>
<span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L24" class="LineNr"> 24 </span><span class="Normal">case</span> <span class="Constant">0x01</span>: <span class="Delimiter">{</span> <span class="Comment">// add r32 to r/m32</span>
<span id="L25" class="LineNr"> 25 </span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L25" class="LineNr"> 25 </span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L26" class="LineNr"> 26 </span> <span class="Normal">uint8_t</span> arg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L27" class="LineNr"> 27 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;add &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
@ -99,7 +99,7 @@ if ('onhashchange' in window) {
<span id="L38" class="LineNr"> 38 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> *signed_arg1 = signed_result<span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span><span class="Delimiter">}</span>
<span id="L44" class="LineNr"> 44 </span>
@ -170,7 +170,7 @@ if ('onhashchange' in window) {
<span id="L109" class="LineNr"> 109 </span> <span class="Delimiter">}</span>
<span id="L110" class="LineNr"> 110 </span> <span class="Normal">uint32_t</span> addr = <a href='013direct_addressing.cc.html#L116'>effective_address_number</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L111" class="LineNr"> 111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address contains &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L190'>read_mem_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr"> 112 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L228'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L112" class="LineNr"> 112 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L229'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L113" class="LineNr"> 113 </span><span class="Delimiter">}</span>
<span id="L114" class="LineNr"> 114 </span>
<span id="L115" class="LineNr"> 115 </span><span class="Comment">// beware: will eventually have side-effects</span>
@ -186,7 +186,7 @@ if ('onhashchange' in window) {
<span id="L125" class="LineNr"> 125 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L126" class="LineNr"> 126 </span> <span class="Comment">// End Mod Special-cases(addr)</span>
<span id="L127" class="LineNr"> 127 </span> <span class="Normal">default</span>:
<span id="L128" class="LineNr"> 128 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized mod bits: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>mod<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L128" class="LineNr"> 128 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized mod bits: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>mod<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L129" class="LineNr"> 129 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L130" class="LineNr"> 130 </span> <span class="Delimiter">}</span>
<span id="L131" class="LineNr"> 131 </span> <span class="Comment">//: other mods are indirect, and they'll set addr appropriately</span>
@ -211,7 +211,7 @@ if ('onhashchange' in window) {
<span id="L150" class="LineNr"> 150 </span><span class="SalientComment">//:: subtract</span>
<span id="L151" class="LineNr"> 151 </span>
<span id="L152" class="LineNr"> 152 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L153" class="LineNr"> 153 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;29&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;subtract r32 from rm32 (sub)&quot;</span><span class="Delimiter">);</span>
<span id="L153" class="LineNr"> 153 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;29&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;subtract r32 from rm32 (sub)&quot;</span><span class="Delimiter">);</span>
<span id="L154" class="LineNr"> 154 </span>
<span id="L155" class="LineNr"> 155 </span><span class="Delimiter">:(code)</span>
<span id="L156" class="LineNr"> 156 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L156'>test_subtract_r32_from_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -232,7 +232,7 @@ if ('onhashchange' in window) {
<span id="L171" class="LineNr"> 171 </span>
<span id="L172" class="LineNr"> 172 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L173" class="LineNr"> 173 </span><span class="Normal">case</span> <span class="Constant">0x29</span>: <span class="Delimiter">{</span> <span class="Comment">// subtract r32 from r/m32</span>
<span id="L174" class="LineNr"> 174 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L174" class="LineNr"> 174 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L175" class="LineNr"> 175 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> arg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L176" class="LineNr"> 176 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subtract &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; from r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L177" class="LineNr"> 177 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
@ -248,7 +248,7 @@ if ('onhashchange' in window) {
<span id="L187" class="LineNr"> 187 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L188" class="LineNr"> 188 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L189" class="LineNr"> 189 </span> *signed_arg1 = signed_result<span class="Delimiter">;</span>
<span id="L190" class="LineNr"> 190 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L190" class="LineNr"> 190 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L191" class="LineNr"> 191 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L192" class="LineNr"> 192 </span><span class="Delimiter">}</span>
<span id="L193" class="LineNr"> 193 </span>
@ -307,7 +307,7 @@ if ('onhashchange' in window) {
<span id="L246" class="LineNr"> 246 </span><span class="SalientComment">//:: multiply</span>
<span id="L247" class="LineNr"> 247 </span>
<span id="L248" class="LineNr"> 248 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L249" class="LineNr"> 249 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f7&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;negate/multiply/divide rm32 (with <a href='010---vm.cc.html#L13'>EAX</a> and <a href='010---vm.cc.html#L15'>EDX</a> if necessary) depending on subop (neg/mul/idiv)&quot;</span><span class="Delimiter">);</span>
<span id="L249" class="LineNr"> 249 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f7&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;negate/multiply/divide rm32 (with <a href='010---vm.cc.html#L13'>EAX</a> and <a href='010---vm.cc.html#L15'>EDX</a> if necessary) depending on subop (neg/mul/idiv)&quot;</span><span class="Delimiter">);</span>
<span id="L250" class="LineNr"> 250 </span>
<span id="L251" class="LineNr"> 251 </span><span class="Delimiter">:(code)</span>
<span id="L252" class="LineNr"> 252 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L252'>test_multiply_EAX_by_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -329,7 +329,7 @@ if ('onhashchange' in window) {
<span id="L268" class="LineNr"> 268 </span>
<span id="L269" class="LineNr"> 269 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L270" class="LineNr"> 270 </span><span class="Normal">case</span> <span class="Constant">0xf7</span>: <span class="Delimiter">{</span>
<span id="L271" class="LineNr"> 271 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L271" class="LineNr"> 271 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L272" class="LineNr"> 272 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;operate on r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L273" class="LineNr"> 273 </span> <span class="Normal">int32_t</span>* arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L274" class="LineNr"> 274 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
@ -342,12 +342,12 @@ if ('onhashchange' in window) {
<span id="L281" class="LineNr"> 281 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u != <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L282" class="LineNr"> 282 </span> <a href='010---vm.cc.html#L84'>CF</a> = <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">;</span>
<span id="L283" class="LineNr"> 283 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L284" class="LineNr"> 284 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L284" class="LineNr"> 284 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L285" class="LineNr"> 285 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L286" class="LineNr"> 286 </span> <span class="Delimiter">}</span>
<span id="L287" class="LineNr"> 287 </span> <span class="Comment">// End Op f7 Subops</span>
<span id="L288" class="LineNr"> 288 </span> <span class="Normal">default</span>:
<span id="L289" class="LineNr"> 289 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode f7: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L289" class="LineNr"> 289 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode f7: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L290" class="LineNr"> 290 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L291" class="LineNr"> 291 </span> <span class="Delimiter">}</span>
<span id="L292" class="LineNr"> 292 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -356,7 +356,7 @@ if ('onhashchange' in window) {
<span id="L295" class="LineNr"> 295 </span><span class="Comment">//:</span>
<span id="L296" class="LineNr"> 296 </span>
<span id="L297" class="LineNr"> 297 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L298" class="LineNr"> 298 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;multiply rm32 into r32 (imul)&quot;</span><span class="Delimiter">);</span>
<span id="L298" class="LineNr"> 298 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;multiply rm32 into r32 (imul)&quot;</span><span class="Delimiter">);</span>
<span id="L299" class="LineNr"> 299 </span>
<span id="L300" class="LineNr"> 300 </span><span class="Delimiter">:(code)</span>
<span id="L301" class="LineNr"> 301 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L301'>test_multiply_r32_into_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -377,7 +377,7 @@ if ('onhashchange' in window) {
<span id="L316" class="LineNr"> 316 </span>
<span id="L317" class="LineNr"> 317 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L318" class="LineNr"> 318 </span><span class="Normal">case</span> <span class="Constant">0xaf</span>: <span class="Delimiter">{</span> <span class="Comment">// multiply r32 by r/m32</span>
<span id="L319" class="LineNr"> 319 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L319" class="LineNr"> 319 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L320" class="LineNr"> 320 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> arg1 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L321" class="LineNr"> 321 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;multiply &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg1<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; by r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L322" class="LineNr"> 322 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* arg2 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
@ -389,7 +389,7 @@ if ('onhashchange' in window) {
<span id="L328" class="LineNr"> 328 </span> <a href='010---vm.cc.html#L84'>CF</a> = <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">;</span>
<span id="L329" class="LineNr"> 329 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L330" class="LineNr"> 330 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg1]<span class="Delimiter">.</span>i = result<span class="Delimiter">;</span>
<span id="L331" class="LineNr"> 331 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg1]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L331" class="LineNr"> 331 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg1]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L332" class="LineNr"> 332 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L333" class="LineNr"> 333 </span><span class="Delimiter">}</span>
<span id="L334" class="LineNr"> 334 </span>
@ -430,7 +430,7 @@ if ('onhashchange' in window) {
<span id="L369" class="LineNr"> 369 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>*arg1 != <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L370" class="LineNr"> 370 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L371" class="LineNr"> 371 </span> *arg1 = result<span class="Delimiter">;</span>
<span id="L372" class="LineNr"> 372 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L372" class="LineNr"> 372 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L373" class="LineNr"> 373 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L374" class="LineNr"> 374 </span><span class="Delimiter">}</span>
<span id="L375" class="LineNr"> 375 </span>
@ -482,8 +482,8 @@ if ('onhashchange' in window) {
<span id="L421" class="LineNr"> 421 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = dividend/divisor<span class="Delimiter">;</span> <span class="Comment">// quotient</span>
<span id="L422" class="LineNr"> 422 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i = dividend%divisor<span class="Delimiter">;</span> <span class="Comment">// remainder</span>
<span id="L423" class="LineNr"> 423 </span> <span class="Comment">// flag state undefined</span>
<span id="L424" class="LineNr"> 424 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;quotient: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L425" class="LineNr"> 425 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;remainder: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L424" class="LineNr"> 424 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;quotient: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L425" class="LineNr"> 425 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;remainder: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L426" class="LineNr"> 426 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L427" class="LineNr"> 427 </span><span class="Delimiter">}</span>
<span id="L428" class="LineNr"> 428 </span>
@ -548,7 +548,7 @@ if ('onhashchange' in window) {
<span id="L487" class="LineNr"> 487 </span><span class="SalientComment">//:: shift left</span>
<span id="L488" class="LineNr"> 488 </span>
<span id="L489" class="LineNr"> 489 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L490" class="LineNr"> 490 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;d3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;shift rm32 by CL bits depending on subop (sal/sar/shl/shr)&quot;</span><span class="Delimiter">);</span>
<span id="L490" class="LineNr"> 490 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;d3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;shift rm32 by CL bits depending on subop (sal/sar/shl/shr)&quot;</span><span class="Delimiter">);</span>
<span id="L491" class="LineNr"> 491 </span>
<span id="L492" class="LineNr"> 492 </span><span class="Delimiter">:(code)</span>
<span id="L493" class="LineNr"> 493 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L493'>test_shift_left_r32_with_cl</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -570,7 +570,7 @@ if ('onhashchange' in window) {
<span id="L509" class="LineNr"> 509 </span>
<span id="L510" class="LineNr"> 510 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L511" class="LineNr"> 511 </span><span class="Normal">case</span> <span class="Constant">0xd3</span>: <span class="Delimiter">{</span>
<span id="L512" class="LineNr"> 512 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L512" class="LineNr"> 512 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L513" class="LineNr"> 513 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;operate on r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L514" class="LineNr"> 514 </span> <span class="Normal">int32_t</span>* arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L515" class="LineNr"> 515 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
@ -590,12 +590,12 @@ if ('onhashchange' in window) {
<span id="L529" class="LineNr"> 529 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>*arg1 &lt;&lt; <span class="Delimiter">(</span>count-<span class="Constant">1</span><span class="Delimiter">))</span> &amp; <span class="Constant">0x80000000</span><span class="Delimiter">;</span>
<span id="L530" class="LineNr"> 530 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L531" class="LineNr"> 531 </span> *arg1 = result<span class="Delimiter">;</span>
<span id="L532" class="LineNr"> 532 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L532" class="LineNr"> 532 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L533" class="LineNr"> 533 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L534" class="LineNr"> 534 </span> <span class="Delimiter">}</span>
<span id="L535" class="LineNr"> 535 </span> <span class="Comment">// End Op d3 Subops</span>
<span id="L536" class="LineNr"> 536 </span> <span class="Normal">default</span>:
<span id="L537" class="LineNr"> 537 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode d3: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L537" class="LineNr"> 537 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode d3: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L538" class="LineNr"> 538 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L539" class="LineNr"> 539 </span> <span class="Delimiter">}</span>
<span id="L540" class="LineNr"> 540 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -631,7 +631,7 @@ if ('onhashchange' in window) {
<span id="L570" class="LineNr"> 570 </span> <span class="Comment">// OF is only defined if count is 1</span>
<span id="L571" class="LineNr"> 571 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count == <span class="Constant">1</span><span class="Delimiter">)</span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L572" class="LineNr"> 572 </span> <span class="Comment">// CF undefined</span>
<span id="L573" class="LineNr"> 573 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L573" class="LineNr"> 573 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L574" class="LineNr"> 574 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L575" class="LineNr"> 575 </span><span class="Delimiter">}</span>
<span id="L576" class="LineNr"> 576 </span>
@ -709,7 +709,7 @@ if ('onhashchange' in window) {
<span id="L648" class="LineNr"> 648 </span> <span class="Comment">// result is always positive by definition</span>
<span id="L649" class="LineNr"> 649 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L650" class="LineNr"> 650 </span> <span class="Comment">// CF undefined</span>
<span id="L651" class="LineNr"> 651 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L651" class="LineNr"> 651 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L652" class="LineNr"> 652 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L653" class="LineNr"> 653 </span><span class="Delimiter">}</span>
<span id="L654" class="LineNr"> 654 </span>
@ -752,7 +752,7 @@ if ('onhashchange' in window) {
<span id="L691" class="LineNr"> 691 </span><span class="SalientComment">//:: and</span>
<span id="L692" class="LineNr"> 692 </span>
<span id="L693" class="LineNr"> 693 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L694" class="LineNr"> 694 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;21&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise AND of r32 with rm32 (and)&quot;</span><span class="Delimiter">);</span>
<span id="L694" class="LineNr"> 694 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;21&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise AND of r32 with rm32 (and)&quot;</span><span class="Delimiter">);</span>
<span id="L695" class="LineNr"> 695 </span>
<span id="L696" class="LineNr"> 696 </span><span class="Delimiter">:(code)</span>
<span id="L697" class="LineNr"> 697 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L697'>test_and_r32_with_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -773,14 +773,14 @@ if ('onhashchange' in window) {
<span id="L712" class="LineNr"> 712 </span>
<span id="L713" class="LineNr"> 713 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L714" class="LineNr"> 714 </span><span class="Normal">case</span> <span class="Constant">0x21</span>: <span class="Delimiter">{</span> <span class="Comment">// and r32 with r/m32</span>
<span id="L715" class="LineNr"> 715 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L715" class="LineNr"> 715 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L716" class="LineNr"> 716 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> arg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L717" class="LineNr"> 717 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;and &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; with r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L718" class="LineNr"> 718 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L719" class="LineNr"> 719 </span> <span class="Comment">// difference</span>
<span id="L720" class="LineNr"> 720 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L721" class="LineNr"> 721 </span> *signed_arg1 &amp;= <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg2]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L722" class="LineNr"> 722 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L722" class="LineNr"> 722 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L723" class="LineNr"> 723 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L724" class="LineNr"> 724 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L725" class="LineNr"> 725 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -792,7 +792,7 @@ if ('onhashchange' in window) {
<span id="L731" class="LineNr"> 731 </span><span class="SalientComment">//:: or</span>
<span id="L732" class="LineNr"> 732 </span>
<span id="L733" class="LineNr"> 733 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L734" class="LineNr"> 734 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;09&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise OR of r32 with rm32 (or)&quot;</span><span class="Delimiter">);</span>
<span id="L734" class="LineNr"> 734 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;09&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise OR of r32 with rm32 (or)&quot;</span><span class="Delimiter">);</span>
<span id="L735" class="LineNr"> 735 </span>
<span id="L736" class="LineNr"> 736 </span><span class="Delimiter">:(code)</span>
<span id="L737" class="LineNr"> 737 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L737'>test_or_r32_with_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -813,14 +813,14 @@ if ('onhashchange' in window) {
<span id="L752" class="LineNr"> 752 </span>
<span id="L753" class="LineNr"> 753 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L754" class="LineNr"> 754 </span><span class="Normal">case</span> <span class="Constant">0x09</span>: <span class="Delimiter">{</span> <span class="Comment">// or r32 with r/m32</span>
<span id="L755" class="LineNr"> 755 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L755" class="LineNr"> 755 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L756" class="LineNr"> 756 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> arg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L757" class="LineNr"> 757 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;or &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; with r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L758" class="LineNr"> 758 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L759" class="LineNr"> 759 </span> <span class="Comment">// difference</span>
<span id="L760" class="LineNr"> 760 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L761" class="LineNr"> 761 </span> *signed_arg1 |= <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg2]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L762" class="LineNr"> 762 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L762" class="LineNr"> 762 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L763" class="LineNr"> 763 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L764" class="LineNr"> 764 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L765" class="LineNr"> 765 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -832,7 +832,7 @@ if ('onhashchange' in window) {
<span id="L771" class="LineNr"> 771 </span><span class="SalientComment">//:: xor</span>
<span id="L772" class="LineNr"> 772 </span>
<span id="L773" class="LineNr"> 773 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L774" class="LineNr"> 774 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;31&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise XOR of r32 with rm32 (xor)&quot;</span><span class="Delimiter">);</span>
<span id="L774" class="LineNr"> 774 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;31&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;rm32 = bitwise XOR of r32 with rm32 (xor)&quot;</span><span class="Delimiter">);</span>
<span id="L775" class="LineNr"> 775 </span>
<span id="L776" class="LineNr"> 776 </span><span class="Delimiter">:(code)</span>
<span id="L777" class="LineNr"> 777 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L777'>test_xor_r32_with_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -853,14 +853,14 @@ if ('onhashchange' in window) {
<span id="L792" class="LineNr"> 792 </span>
<span id="L793" class="LineNr"> 793 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L794" class="LineNr"> 794 </span><span class="Normal">case</span> <span class="Constant">0x31</span>: <span class="Delimiter">{</span> <span class="Comment">// xor r32 with r/m32</span>
<span id="L795" class="LineNr"> 795 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L795" class="LineNr"> 795 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L796" class="LineNr"> 796 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> arg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L797" class="LineNr"> 797 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;xor &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>arg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; with r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L798" class="LineNr"> 798 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L799" class="LineNr"> 799 </span> <span class="Comment">// difference</span>
<span id="L800" class="LineNr"> 800 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L801" class="LineNr"> 801 </span> *signed_arg1 ^= <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[arg2]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L802" class="LineNr"> 802 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L802" class="LineNr"> 802 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L803" class="LineNr"> 803 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L804" class="LineNr"> 804 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L805" class="LineNr"> 805 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -892,7 +892,7 @@ if ('onhashchange' in window) {
<span id="L831" class="LineNr"> 831 </span><span class="Normal">case</span> <span class="Constant">2</span>: <span class="Delimiter">{</span> <span class="Comment">// not r/m32</span>
<span id="L832" class="LineNr"> 832 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subop: not&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L833" class="LineNr"> 833 </span> *arg1 = ~<span class="Delimiter">(</span>*arg1<span class="Delimiter">);</span>
<span id="L834" class="LineNr"> 834 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L834" class="LineNr"> 834 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L835" class="LineNr"> 835 </span> <span class="Comment">// no flags affected</span>
<span id="L836" class="LineNr"> 836 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L837" class="LineNr"> 837 </span><span class="Delimiter">}</span>
@ -900,7 +900,7 @@ if ('onhashchange' in window) {
<span id="L839" class="LineNr"> 839 </span><span class="SalientComment">//:: compare (cmp)</span>
<span id="L840" class="LineNr"> 840 </span>
<span id="L841" class="LineNr"> 841 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L842" class="LineNr"> 842 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;39&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;compare: set SF if rm32 &lt; r32 (cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L842" class="LineNr"> 842 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;39&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;compare: set SF if rm32 &lt; r32 (cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L843" class="LineNr"> 843 </span>
<span id="L844" class="LineNr"> 844 </span><span class="Delimiter">:(code)</span>
<span id="L845" class="LineNr"> 845 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L845'>test_compare_r32_with_r32_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -921,7 +921,7 @@ if ('onhashchange' in window) {
<span id="L860" class="LineNr"> 860 </span>
<span id="L861" class="LineNr"> 861 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L862" class="LineNr"> 862 </span><span class="Normal">case</span> <span class="Constant">0x39</span>: <span class="Delimiter">{</span> <span class="Comment">// set SF if r/m32 &lt; r32</span>
<span id="L863" class="LineNr"> 863 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L863" class="LineNr"> 863 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L864" class="LineNr"> 864 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> reg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L865" class="LineNr"> 865 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compare r/m32 with &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>reg2<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L866" class="LineNr"> 866 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
@ -1023,7 +1023,7 @@ if ('onhashchange' in window) {
<span id="L962" class="LineNr"> 962 </span><span class="SalientComment">//:: copy (mov)</span>
<span id="L963" class="LineNr"> 963 </span>
<span id="L964" class="LineNr"> 964 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L965" class="LineNr"> 965 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;89&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r32 to rm32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L965" class="LineNr"> 965 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;89&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r32 to rm32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L966" class="LineNr"> 966 </span>
<span id="L967" class="LineNr"> 967 </span><span class="Delimiter">:(code)</span>
<span id="L968" class="LineNr"> 968 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L968'>test_copy_r32_to_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1043,19 +1043,19 @@ if ('onhashchange' in window) {
<span id="L982" class="LineNr"> 982 </span>
<span id="L983" class="LineNr"> 983 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L984" class="LineNr"> 984 </span><span class="Normal">case</span> <span class="Constant">0x89</span>: <span class="Delimiter">{</span> <span class="Comment">// copy r32 to r/m32</span>
<span id="L985" class="LineNr"> 985 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L985" class="LineNr"> 985 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L986" class="LineNr"> 986 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rsrc = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L987" class="LineNr"> 987 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rsrc<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L988" class="LineNr"> 988 </span> <span class="Normal">int32_t</span>* dest = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L989" class="LineNr"> 989 </span> *dest = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[rsrc]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L990" class="LineNr"> 990 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *dest &lt;&lt; end<span class="Delimiter">();</span>
<span id="L990" class="LineNr"> 990 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *dest &lt;&lt; end<span class="Delimiter">();</span>
<span id="L991" class="LineNr"> 991 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L992" class="LineNr"> 992 </span><span class="Delimiter">}</span>
<span id="L993" class="LineNr"> 993 </span>
<span id="L994" class="LineNr"> 994 </span><span class="SalientComment">//:: xchg</span>
<span id="L995" class="LineNr"> 995 </span>
<span id="L996" class="LineNr"> 996 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L997" class="LineNr"> 997 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;swap the <a href='003trace.cc.html#L117'>contents</a> of r32 and rm32 (xchg)&quot;</span><span class="Delimiter">);</span>
<span id="L997" class="LineNr"> 997 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;swap the <a href='003trace.cc.html#L117'>contents</a> of r32 and rm32 (xchg)&quot;</span><span class="Delimiter">);</span>
<span id="L998" class="LineNr"> 998 </span>
<span id="L999" class="LineNr"> 999 </span><span class="Delimiter">:(code)</span>
<span id="L1000" class="LineNr">1000 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1000'>test_xchg_r32_with_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1077,29 +1077,29 @@ if ('onhashchange' in window) {
<span id="L1016" class="LineNr">1016 </span>
<span id="L1017" class="LineNr">1017 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1018" class="LineNr">1018 </span><span class="Normal">case</span> <span class="Constant">0x87</span>: <span class="Delimiter">{</span> <span class="Comment">// exchange r32 with r/m32</span>
<span id="L1019" class="LineNr">1019 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L1019" class="LineNr">1019 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L1020" class="LineNr">1020 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> reg2 = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1021" class="LineNr">1021 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;exchange &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>reg2<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; with r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1022" class="LineNr">1022 </span> <span class="Normal">int32_t</span>* arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L1023" class="LineNr">1023 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> tmp = *arg1<span class="Delimiter">;</span>
<span id="L1024" class="LineNr">1024 </span> *arg1 = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg2]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L1025" class="LineNr">1025 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg2]<span class="Delimiter">.</span>i = tmp<span class="Delimiter">;</span>
<span id="L1026" class="LineNr">1026 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; <span class="Constant">&quot; in r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1027" class="LineNr">1027 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg2]<span class="Delimiter">.</span>i &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>reg2<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1026" class="LineNr">1026 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; <span class="Constant">&quot; in r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1027" class="LineNr">1027 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg2]<span class="Delimiter">.</span>i &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>reg2<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1028" class="LineNr">1028 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1029" class="LineNr">1029 </span><span class="Delimiter">}</span>
<span id="L1030" class="LineNr">1030 </span>
<span id="L1031" class="LineNr">1031 </span><span class="SalientComment">//:: increment</span>
<span id="L1032" class="LineNr">1032 </span>
<span id="L1033" class="LineNr">1033 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1034" class="LineNr">1034 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;40&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L13'>EAX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1035" class="LineNr">1035 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;41&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L14'>ECX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1036" class="LineNr">1036 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;42&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L15'>EDX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1037" class="LineNr">1037 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;43&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L16'>EBX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1038" class="LineNr">1038 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;44&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L17'>ESP</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1039" class="LineNr">1039 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;45&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L18'>EBP</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1040" class="LineNr">1040 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;46&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L19'>ESI</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1041" class="LineNr">1041 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;47&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L20'>EDI</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1034" class="LineNr">1034 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;40&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L13'>EAX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1035" class="LineNr">1035 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;41&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L14'>ECX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1036" class="LineNr">1036 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;42&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L15'>EDX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1037" class="LineNr">1037 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;43&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L16'>EBX</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1038" class="LineNr">1038 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;44&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L17'>ESP</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1039" class="LineNr">1039 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;45&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L18'>EBP</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1040" class="LineNr">1040 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;46&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L19'>ESI</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1041" class="LineNr">1041 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;47&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment <a href='010---vm.cc.html#L20'>EDI</a> (inc)&quot;</span><span class="Delimiter">);</span>
<span id="L1042" class="LineNr">1042 </span>
<span id="L1043" class="LineNr">1043 </span><span class="Delimiter">:(code)</span>
<span id="L1044" class="LineNr">1044 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1044'>test_increment_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1127,12 +1127,12 @@ if ('onhashchange' in window) {
<span id="L1066" class="LineNr">1066 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1067" class="LineNr">1067 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;increment &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1068" class="LineNr">1068 </span> ++<span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L1069" class="LineNr">1069 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1069" class="LineNr">1069 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1070" class="LineNr">1070 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1071" class="LineNr">1071 </span><span class="Delimiter">}</span>
<span id="L1072" class="LineNr">1072 </span>
<span id="L1073" class="LineNr">1073 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1074" class="LineNr">1074 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment/decrement/jump/push/call rm32 based on subop (inc/dec/jmp/push/call)&quot;</span><span class="Delimiter">);</span>
<span id="L1074" class="LineNr">1074 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;increment/decrement/jump/push/call rm32 based on subop (inc/dec/jmp/push/call)&quot;</span><span class="Delimiter">);</span>
<span id="L1075" class="LineNr">1075 </span>
<span id="L1076" class="LineNr">1076 </span><span class="Delimiter">:(code)</span>
<span id="L1077" class="LineNr">1077 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1077'>test_increment_rm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1152,193 +1152,192 @@ if ('onhashchange' in window) {
<span id="L1091" class="LineNr">1091 </span>
<span id="L1092" class="LineNr">1092 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1093" class="LineNr">1093 </span><span class="Normal">case</span> <span class="Constant">0xff</span>: <span class="Delimiter">{</span>
<span id="L1094" class="LineNr">1094 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L1094" class="LineNr">1094 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L1095" class="LineNr">1095 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L1096" class="LineNr">1096 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>subop<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L1097" class="LineNr">1097 </span> <span class="Normal">case</span> <span class="Constant">0</span>: <span class="Delimiter">{</span> <span class="Comment">// increment r/m32</span>
<span id="L1098" class="LineNr">1098 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;increment r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1099" class="LineNr">1099 </span> <span class="Normal">int32_t</span>* <a href='001help.cc.html#L15'>arg</a> = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L1100" class="LineNr">1100 </span> ++*arg<span class="Delimiter">;</span>
<span id="L1101" class="LineNr">1101 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1101" class="LineNr">1101 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1102" class="LineNr">1102 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1103" class="LineNr">1103 </span> <span class="Delimiter">}</span>
<span id="L1104" class="LineNr">1104 </span> <span class="Normal">default</span>:
<span id="L1105" class="LineNr">1105 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for ff: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L1106" class="LineNr">1106 </span> <a href='003trace.cc.html#L426'>DUMP</a><span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L1107" class="LineNr">1107 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L1108" class="LineNr">1108 </span> <span class="Comment">// End Op ff Subops</span>
<span id="L1109" class="LineNr">1109 </span> <span class="Delimiter">}</span>
<span id="L1110" class="LineNr">1110 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1111" class="LineNr">1111 </span><span class="Delimiter">}</span>
<span id="L1112" class="LineNr">1112 </span>
<span id="L1113" class="LineNr">1113 </span><span class="SalientComment">//:: decrement</span>
<span id="L1114" class="LineNr">1114 </span>
<span id="L1115" class="LineNr">1115 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1116" class="LineNr">1116 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;48&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L13'>EAX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1117" class="LineNr">1117 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;49&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L14'>ECX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1118" class="LineNr">1118 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L15'>EDX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1119" class="LineNr">1119 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4b&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L16'>EBX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1120" class="LineNr">1120 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L17'>ESP</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1121" class="LineNr">1121 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L18'>EBP</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1122" class="LineNr">1122 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L19'>ESI</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1123" class="LineNr">1123 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L20'>EDI</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1124" class="LineNr">1124 </span>
<span id="L1125" class="LineNr">1125 </span><span class="Delimiter">:(code)</span>
<span id="L1126" class="LineNr">1126 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1126'>test_decrement_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1127" class="LineNr">1127 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u = <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L1128" class="LineNr">1128 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1129" class="LineNr">1129 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1130" class="LineNr">1130 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1131" class="LineNr">1131 </span> <span class="Constant">&quot; 49 \n&quot;</span> <span class="Comment">// decrement ECX</span>
<span id="L1132" class="LineNr">1132 </span> <span class="Delimiter">);</span>
<span id="L1133" class="LineNr">1133 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1134" class="LineNr">1134 </span> <span class="Constant">&quot;run: decrement ECX\n&quot;</span>
<span id="L1135" class="LineNr">1135 </span> <span class="Constant">&quot;run: storing value 0x0000001e\n&quot;</span>
<span id="L1136" class="LineNr">1136 </span> <span class="Delimiter">);</span>
<span id="L1137" class="LineNr">1137 </span><span class="Delimiter">}</span>
<span id="L1138" class="LineNr">1138 </span>
<span id="L1139" class="LineNr">1139 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1140" class="LineNr">1140 </span><span class="Normal">case</span> <span class="Constant">0x48</span>:
<span id="L1141" class="LineNr">1141 </span><span class="Normal">case</span> <span class="Constant">0x49</span>:
<span id="L1142" class="LineNr">1142 </span><span class="Normal">case</span> <span class="Constant">0x4a</span>:
<span id="L1143" class="LineNr">1143 </span><span class="Normal">case</span> <span class="Constant">0x4b</span>:
<span id="L1144" class="LineNr">1144 </span><span class="Normal">case</span> <span class="Constant">0x4c</span>:
<span id="L1145" class="LineNr">1145 </span><span class="Normal">case</span> <span class="Constant">0x4d</span>:
<span id="L1146" class="LineNr">1146 </span><span class="Normal">case</span> <span class="Constant">0x4e</span>:
<span id="L1147" class="LineNr">1147 </span><span class="Normal">case</span> <span class="Constant">0x4f</span>: <span class="Delimiter">{</span> <span class="Comment">// decrement r32</span>
<span id="L1148" class="LineNr">1148 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1149" class="LineNr">1149 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrement &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1150" class="LineNr">1150 </span> --<span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L1151" class="LineNr">1151 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1152" class="LineNr">1152 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1153" class="LineNr">1153 </span><span class="Delimiter">}</span>
<span id="L1154" class="LineNr">1154 </span>
<span id="L1155" class="LineNr">1155 </span><span class="Delimiter">:(code)</span>
<span id="L1156" class="LineNr">1156 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1156'>test_decrement_rm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1157" class="LineNr">1157 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x20</span><span class="Delimiter">;</span>
<span id="L1158" class="LineNr">1158 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1159" class="LineNr">1159 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1160" class="LineNr">1160 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1161" class="LineNr">1161 </span> <span class="Constant">&quot; ff c8 \n&quot;</span> <span class="Comment">// decrement EAX</span>
<span id="L1162" class="LineNr">1162 </span> <span class="Comment">// ModR/M in binary: 11 (direct mode) 001 (subop inc) 000 (EAX)</span>
<span id="L1163" class="LineNr">1163 </span> <span class="Delimiter">);</span>
<span id="L1164" class="LineNr">1164 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1165" class="LineNr">1165 </span> <span class="Constant">&quot;run: decrement r/m32\n&quot;</span>
<span id="L1166" class="LineNr">1166 </span> <span class="Constant">&quot;run: r/m32 is EAX\n&quot;</span>
<span id="L1167" class="LineNr">1167 </span> <span class="Constant">&quot;run: storing value 0x0000001f\n&quot;</span>
<span id="L1168" class="LineNr">1168 </span> <span class="Delimiter">);</span>
<span id="L1169" class="LineNr">1169 </span><span class="Delimiter">}</span>
<span id="L1170" class="LineNr">1170 </span>
<span id="L1171" class="LineNr">1171 </span><span class="Delimiter">:(before &quot;End Op ff Subops&quot;)</span>
<span id="L1172" class="LineNr">1172 </span><span class="Normal">case</span> <span class="Constant">1</span>: <span class="Delimiter">{</span> <span class="Comment">// decrement r/m32</span>
<span id="L1173" class="LineNr">1173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrement r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1174" class="LineNr">1174 </span> <span class="Normal">int32_t</span>* <a href='001help.cc.html#L15'>arg</a> = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L1175" class="LineNr">1175 </span> --*arg<span class="Delimiter">;</span>
<span id="L1176" class="LineNr">1176 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1177" class="LineNr">1177 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1178" class="LineNr">1178 </span><span class="Delimiter">}</span>
<span id="L1179" class="LineNr">1179 </span>
<span id="L1180" class="LineNr">1180 </span><span class="SalientComment">//:: push</span>
<span id="L1181" class="LineNr">1181 </span>
<span id="L1182" class="LineNr">1182 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1183" class="LineNr">1183 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;50&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L13'>EAX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1184" class="LineNr">1184 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;51&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L14'>ECX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1185" class="LineNr">1185 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;52&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L15'>EDX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1186" class="LineNr">1186 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;53&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L16'>EBX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1187" class="LineNr">1187 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;54&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L17'>ESP</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1188" class="LineNr">1188 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;55&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L18'>EBP</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1189" class="LineNr">1189 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;56&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L19'>ESI</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1190" class="LineNr">1190 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;57&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L20'>EDI</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1191" class="LineNr">1191 </span>
<span id="L1192" class="LineNr">1192 </span><span class="Delimiter">:(code)</span>
<span id="L1193" class="LineNr">1193 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1193'>test_push_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1194" class="LineNr">1194 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L1195" class="LineNr">1195 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000008</span><span class="Delimiter">;</span>
<span id="L1196" class="LineNr">1196 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x0000000a</span><span class="Delimiter">;</span>
<span id="L1197" class="LineNr">1197 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1198" class="LineNr">1198 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1199" class="LineNr">1199 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1200" class="LineNr">1200 </span> <span class="Constant">&quot; 53 \n&quot;</span> <span class="Comment">// push EBX to stack</span>
<span id="L1201" class="LineNr">1201 </span> <span class="Delimiter">);</span>
<span id="L1202" class="LineNr">1202 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1203" class="LineNr">1203 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L91'>push</a> EBX\n&quot;</span>
<span id="L1204" class="LineNr">1204 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000004\n&quot;</span>
<span id="L1205" class="LineNr">1205 </span> <span class="Constant">&quot;run: pushing value 0x0000000a\n&quot;</span>
<span id="L1206" class="LineNr">1206 </span> <span class="Delimiter">);</span>
<span id="L1207" class="LineNr">1207 </span><span class="Delimiter">}</span>
<span id="L1208" class="LineNr">1208 </span>
<span id="L1209" class="LineNr">1209 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1210" class="LineNr">1210 </span><span class="Normal">case</span> <span class="Constant">0x50</span>:
<span id="L1211" class="LineNr">1211 </span><span class="Normal">case</span> <span class="Constant">0x51</span>:
<span id="L1212" class="LineNr">1212 </span><span class="Normal">case</span> <span class="Constant">0x52</span>:
<span id="L1213" class="LineNr">1213 </span><span class="Normal">case</span> <span class="Constant">0x53</span>:
<span id="L1214" class="LineNr">1214 </span><span class="Normal">case</span> <span class="Constant">0x54</span>:
<span id="L1215" class="LineNr">1215 </span><span class="Normal">case</span> <span class="Constant">0x55</span>:
<span id="L1216" class="LineNr">1216 </span><span class="Normal">case</span> <span class="Constant">0x56</span>:
<span id="L1217" class="LineNr">1217 </span><span class="Normal">case</span> <span class="Constant">0x57</span>: <span class="Delimiter">{</span> <span class="Comment">// push r32 to stack</span>
<span id="L1218" class="LineNr">1218 </span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1219" class="LineNr">1219 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1220" class="LineNr">1220 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: &quot; &lt;&lt; NUM(reg) &lt;&lt; &quot;: &quot; &lt;&lt; Reg[reg].u &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1221" class="LineNr">1221 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1222" class="LineNr">1222 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1223" class="LineNr">1223 </span><span class="Delimiter">}</span>
<span id="L1224" class="LineNr">1224 </span>
<span id="L1225" class="LineNr">1225 </span><span class="SalientComment">//:: pop</span>
<span id="L1226" class="LineNr">1226 </span>
<span id="L1227" class="LineNr">1227 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1228" class="LineNr">1228 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;58&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L13'>EAX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1229" class="LineNr">1229 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;59&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L14'>ECX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1230" class="LineNr">1230 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L15'>EDX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1231" class="LineNr">1231 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5b&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L16'>EBX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1232" class="LineNr">1232 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L17'>ESP</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1233" class="LineNr">1233 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L18'>EBP</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1234" class="LineNr">1234 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L19'>ESI</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1235" class="LineNr">1235 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L20'>EDI</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1236" class="LineNr">1236 </span>
<span id="L1237" class="LineNr">1237 </span><span class="Delimiter">:(code)</span>
<span id="L1238" class="LineNr">1238 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1238'>test_pop_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1239" class="LineNr">1239 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L1240" class="LineNr">1240 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000008</span><span class="Delimiter">;</span>
<span id="L1241" class="LineNr">1241 </span> <a href='010---vm.cc.html#L255'>write_mem_i32</a><span class="Delimiter">(</span><span class="Constant">0xbd000008</span><span class="Delimiter">,</span> <span class="Constant">0x0000000a</span><span class="Delimiter">);</span> <span class="Comment">// ..before this write</span>
<span id="L1242" class="LineNr">1242 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1243" class="LineNr">1243 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1244" class="LineNr">1244 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1245" class="LineNr">1245 </span> <span class="Constant">&quot; 5b \n&quot;</span> <span class="Comment">// pop stack to EBX</span>
<span id="L1246" class="LineNr">1246 </span> <span class="Constant">&quot;== data 0x2000\n&quot;</span> <span class="Comment">// data segment</span>
<span id="L1247" class="LineNr">1247 </span> <span class="Constant">&quot;0a 00 00 00\n&quot;</span> <span class="Comment">// 0x0000000a</span>
<span id="L1248" class="LineNr">1248 </span> <span class="Delimiter">);</span>
<span id="L1249" class="LineNr">1249 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1250" class="LineNr">1250 </span> <span class="Constant">&quot;run: <a href='013direct_addressing.cc.html#L1273'>pop</a> into EBX\n&quot;</span>
<span id="L1251" class="LineNr">1251 </span> <span class="Constant">&quot;run: popping value 0x0000000a\n&quot;</span>
<span id="L1252" class="LineNr">1252 </span> <span class="Constant">&quot;run: incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd00000c\n&quot;</span>
<span id="L1253" class="LineNr">1253 </span> <span class="Delimiter">);</span>
<span id="L1254" class="LineNr">1254 </span><span class="Delimiter">}</span>
<span id="L1255" class="LineNr">1255 </span>
<span id="L1256" class="LineNr">1256 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1257" class="LineNr">1257 </span><span class="Normal">case</span> <span class="Constant">0x58</span>:
<span id="L1258" class="LineNr">1258 </span><span class="Normal">case</span> <span class="Constant">0x59</span>:
<span id="L1259" class="LineNr">1259 </span><span class="Normal">case</span> <span class="Constant">0x5a</span>:
<span id="L1260" class="LineNr">1260 </span><span class="Normal">case</span> <span class="Constant">0x5b</span>:
<span id="L1261" class="LineNr">1261 </span><span class="Normal">case</span> <span class="Constant">0x5c</span>:
<span id="L1262" class="LineNr">1262 </span><span class="Normal">case</span> <span class="Constant">0x5d</span>:
<span id="L1263" class="LineNr">1263 </span><span class="Normal">case</span> <span class="Constant">0x5e</span>:
<span id="L1264" class="LineNr">1264 </span><span class="Normal">case</span> <span class="Constant">0x5f</span>: <span class="Delimiter">{</span> <span class="Comment">// pop stack into r32</span>
<span id="L1265" class="LineNr">1265 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1266" class="LineNr">1266 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pop into &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1267" class="LineNr">1267 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;pop from &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1268" class="LineNr">1268 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u = <a href='013direct_addressing.cc.html#L1273'>pop</a><span class="Delimiter">();</span>
<span id="L1269" class="LineNr">1269 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;=&gt; &quot; &lt;&lt; NUM(reg) &lt;&lt; &quot;: &quot; &lt;&lt; Reg[reg].u &lt;&lt; '\n';</span>
<span id="L1270" class="LineNr">1270 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1271" class="LineNr">1271 </span><span class="Delimiter">}</span>
<span id="L1272" class="LineNr">1272 </span><span class="Delimiter">:(code)</span>
<span id="L1273" class="LineNr">1273 </span><span class="Normal">uint32_t</span> <a href='013direct_addressing.cc.html#L1273'>pop</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1274" class="LineNr">1274 </span> <span class="Normal">const</span> <span class="Normal">uint32_t</span> result = <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1275" class="LineNr">1275 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;popping value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1276" class="LineNr">1276 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u += <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L1277" class="LineNr">1277 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1278" class="LineNr">1278 </span> assert<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L151'>AFTER_STACK</a><span class="Delimiter">);</span>
<span id="L1279" class="LineNr">1279 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L1280" class="LineNr">1280 </span><span class="Delimiter">}</span>
<span id="L1105" class="LineNr">1105 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for ff: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L1106" class="LineNr">1106 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L1107" class="LineNr">1107 </span> <span class="Comment">// End Op ff Subops</span>
<span id="L1108" class="LineNr">1108 </span> <span class="Delimiter">}</span>
<span id="L1109" class="LineNr">1109 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1110" class="LineNr">1110 </span><span class="Delimiter">}</span>
<span id="L1111" class="LineNr">1111 </span>
<span id="L1112" class="LineNr">1112 </span><span class="SalientComment">//:: decrement</span>
<span id="L1113" class="LineNr">1113 </span>
<span id="L1114" class="LineNr">1114 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1115" class="LineNr">1115 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;48&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L13'>EAX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1116" class="LineNr">1116 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;49&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L14'>ECX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1117" class="LineNr">1117 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L15'>EDX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1118" class="LineNr">1118 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4b&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L16'>EBX</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1119" class="LineNr">1119 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L17'>ESP</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1120" class="LineNr">1120 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L18'>EBP</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1121" class="LineNr">1121 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L19'>ESI</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1122" class="LineNr">1122 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;4f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;decrement <a href='010---vm.cc.html#L20'>EDI</a> (dec)&quot;</span><span class="Delimiter">);</span>
<span id="L1123" class="LineNr">1123 </span>
<span id="L1124" class="LineNr">1124 </span><span class="Delimiter">:(code)</span>
<span id="L1125" class="LineNr">1125 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1125'>test_decrement_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1126" class="LineNr">1126 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u = <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L1127" class="LineNr">1127 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1128" class="LineNr">1128 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1129" class="LineNr">1129 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1130" class="LineNr">1130 </span> <span class="Constant">&quot; 49 \n&quot;</span> <span class="Comment">// decrement ECX</span>
<span id="L1131" class="LineNr">1131 </span> <span class="Delimiter">);</span>
<span id="L1132" class="LineNr">1132 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1133" class="LineNr">1133 </span> <span class="Constant">&quot;run: decrement ECX\n&quot;</span>
<span id="L1134" class="LineNr">1134 </span> <span class="Constant">&quot;run: storing value 0x0000001e\n&quot;</span>
<span id="L1135" class="LineNr">1135 </span> <span class="Delimiter">);</span>
<span id="L1136" class="LineNr">1136 </span><span class="Delimiter">}</span>
<span id="L1137" class="LineNr">1137 </span>
<span id="L1138" class="LineNr">1138 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1139" class="LineNr">1139 </span><span class="Normal">case</span> <span class="Constant">0x48</span>:
<span id="L1140" class="LineNr">1140 </span><span class="Normal">case</span> <span class="Constant">0x49</span>:
<span id="L1141" class="LineNr">1141 </span><span class="Normal">case</span> <span class="Constant">0x4a</span>:
<span id="L1142" class="LineNr">1142 </span><span class="Normal">case</span> <span class="Constant">0x4b</span>:
<span id="L1143" class="LineNr">1143 </span><span class="Normal">case</span> <span class="Constant">0x4c</span>:
<span id="L1144" class="LineNr">1144 </span><span class="Normal">case</span> <span class="Constant">0x4d</span>:
<span id="L1145" class="LineNr">1145 </span><span class="Normal">case</span> <span class="Constant">0x4e</span>:
<span id="L1146" class="LineNr">1146 </span><span class="Normal">case</span> <span class="Constant">0x4f</span>: <span class="Delimiter">{</span> <span class="Comment">// decrement r32</span>
<span id="L1147" class="LineNr">1147 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1148" class="LineNr">1148 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrement &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1149" class="LineNr">1149 </span> --<span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L1150" class="LineNr">1150 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1151" class="LineNr">1151 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1152" class="LineNr">1152 </span><span class="Delimiter">}</span>
<span id="L1153" class="LineNr">1153 </span>
<span id="L1154" class="LineNr">1154 </span><span class="Delimiter">:(code)</span>
<span id="L1155" class="LineNr">1155 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1155'>test_decrement_rm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1156" class="LineNr">1156 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x20</span><span class="Delimiter">;</span>
<span id="L1157" class="LineNr">1157 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1158" class="LineNr">1158 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1159" class="LineNr">1159 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1160" class="LineNr">1160 </span> <span class="Constant">&quot; ff c8 \n&quot;</span> <span class="Comment">// decrement EAX</span>
<span id="L1161" class="LineNr">1161 </span> <span class="Comment">// ModR/M in binary: 11 (direct mode) 001 (subop inc) 000 (EAX)</span>
<span id="L1162" class="LineNr">1162 </span> <span class="Delimiter">);</span>
<span id="L1163" class="LineNr">1163 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1164" class="LineNr">1164 </span> <span class="Constant">&quot;run: decrement r/m32\n&quot;</span>
<span id="L1165" class="LineNr">1165 </span> <span class="Constant">&quot;run: r/m32 is EAX\n&quot;</span>
<span id="L1166" class="LineNr">1166 </span> <span class="Constant">&quot;run: storing value 0x0000001f\n&quot;</span>
<span id="L1167" class="LineNr">1167 </span> <span class="Delimiter">);</span>
<span id="L1168" class="LineNr">1168 </span><span class="Delimiter">}</span>
<span id="L1169" class="LineNr">1169 </span>
<span id="L1170" class="LineNr">1170 </span><span class="Delimiter">:(before &quot;End Op ff Subops&quot;)</span>
<span id="L1171" class="LineNr">1171 </span><span class="Normal">case</span> <span class="Constant">1</span>: <span class="Delimiter">{</span> <span class="Comment">// decrement r/m32</span>
<span id="L1172" class="LineNr">1172 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrement r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1173" class="LineNr">1173 </span> <span class="Normal">int32_t</span>* <a href='001help.cc.html#L15'>arg</a> = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L1174" class="LineNr">1174 </span> --*arg<span class="Delimiter">;</span>
<span id="L1175" class="LineNr">1175 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1176" class="LineNr">1176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1177" class="LineNr">1177 </span><span class="Delimiter">}</span>
<span id="L1178" class="LineNr">1178 </span>
<span id="L1179" class="LineNr">1179 </span><span class="SalientComment">//:: push</span>
<span id="L1180" class="LineNr">1180 </span>
<span id="L1181" class="LineNr">1181 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1182" class="LineNr">1182 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;50&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L13'>EAX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1183" class="LineNr">1183 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;51&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L14'>ECX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1184" class="LineNr">1184 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;52&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L15'>EDX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1185" class="LineNr">1185 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;53&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L16'>EBX</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1186" class="LineNr">1186 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;54&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L17'>ESP</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1187" class="LineNr">1187 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;55&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L18'>EBP</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1188" class="LineNr">1188 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;56&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L19'>ESI</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1189" class="LineNr">1189 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;57&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push <a href='010---vm.cc.html#L20'>EDI</a> to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1190" class="LineNr">1190 </span>
<span id="L1191" class="LineNr">1191 </span><span class="Delimiter">:(code)</span>
<span id="L1192" class="LineNr">1192 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1192'>test_push_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1193" class="LineNr">1193 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L1194" class="LineNr">1194 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000008</span><span class="Delimiter">;</span>
<span id="L1195" class="LineNr">1195 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x0000000a</span><span class="Delimiter">;</span>
<span id="L1196" class="LineNr">1196 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1197" class="LineNr">1197 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1198" class="LineNr">1198 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1199" class="LineNr">1199 </span> <span class="Constant">&quot; 53 \n&quot;</span> <span class="Comment">// push EBX to stack</span>
<span id="L1200" class="LineNr">1200 </span> <span class="Delimiter">);</span>
<span id="L1201" class="LineNr">1201 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1202" class="LineNr">1202 </span> <span class="Constant">&quot;run: <a href='012elf.cc.html#L91'>push</a> EBX\n&quot;</span>
<span id="L1203" class="LineNr">1203 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd000004\n&quot;</span>
<span id="L1204" class="LineNr">1204 </span> <span class="Constant">&quot;run: pushing value 0x0000000a\n&quot;</span>
<span id="L1205" class="LineNr">1205 </span> <span class="Delimiter">);</span>
<span id="L1206" class="LineNr">1206 </span><span class="Delimiter">}</span>
<span id="L1207" class="LineNr">1207 </span>
<span id="L1208" class="LineNr">1208 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1209" class="LineNr">1209 </span><span class="Normal">case</span> <span class="Constant">0x50</span>:
<span id="L1210" class="LineNr">1210 </span><span class="Normal">case</span> <span class="Constant">0x51</span>:
<span id="L1211" class="LineNr">1211 </span><span class="Normal">case</span> <span class="Constant">0x52</span>:
<span id="L1212" class="LineNr">1212 </span><span class="Normal">case</span> <span class="Constant">0x53</span>:
<span id="L1213" class="LineNr">1213 </span><span class="Normal">case</span> <span class="Constant">0x54</span>:
<span id="L1214" class="LineNr">1214 </span><span class="Normal">case</span> <span class="Constant">0x55</span>:
<span id="L1215" class="LineNr">1215 </span><span class="Normal">case</span> <span class="Constant">0x56</span>:
<span id="L1216" class="LineNr">1216 </span><span class="Normal">case</span> <span class="Constant">0x57</span>: <span class="Delimiter">{</span> <span class="Comment">// push r32 to stack</span>
<span id="L1217" class="LineNr">1217 </span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1218" class="LineNr">1218 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1219" class="LineNr">1219 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: &quot; &lt;&lt; NUM(reg) &lt;&lt; &quot;: &quot; &lt;&lt; Reg[reg].u &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1220" class="LineNr">1220 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1221" class="LineNr">1221 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1222" class="LineNr">1222 </span><span class="Delimiter">}</span>
<span id="L1223" class="LineNr">1223 </span>
<span id="L1224" class="LineNr">1224 </span><span class="SalientComment">//:: pop</span>
<span id="L1225" class="LineNr">1225 </span>
<span id="L1226" class="LineNr">1226 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1227" class="LineNr">1227 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;58&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L13'>EAX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1228" class="LineNr">1228 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;59&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L14'>ECX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1229" class="LineNr">1229 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L15'>EDX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1230" class="LineNr">1230 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5b&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L16'>EBX</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1231" class="LineNr">1231 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L17'>ESP</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1232" class="LineNr">1232 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L18'>EBP</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1233" class="LineNr">1233 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L19'>ESI</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1234" class="LineNr">1234 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;5f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;pop top of stack to <a href='010---vm.cc.html#L20'>EDI</a> (pop)&quot;</span><span class="Delimiter">);</span>
<span id="L1235" class="LineNr">1235 </span>
<span id="L1236" class="LineNr">1236 </span><span class="Delimiter">:(code)</span>
<span id="L1237" class="LineNr">1237 </span><span class="Normal">void</span> <a href='013direct_addressing.cc.html#L1237'>test_pop_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1238" class="LineNr">1238 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L1239" class="LineNr">1239 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000008</span><span class="Delimiter">;</span>
<span id="L1240" class="LineNr">1240 </span> <a href='010---vm.cc.html#L256'>write_mem_i32</a><span class="Delimiter">(</span><span class="Constant">0xbd000008</span><span class="Delimiter">,</span> <span class="Constant">0x0000000a</span><span class="Delimiter">);</span> <span class="Comment">// ..before this write</span>
<span id="L1241" class="LineNr">1241 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L1242" class="LineNr">1242 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L1243" class="LineNr">1243 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L1244" class="LineNr">1244 </span> <span class="Constant">&quot; 5b \n&quot;</span> <span class="Comment">// pop stack to EBX</span>
<span id="L1245" class="LineNr">1245 </span> <span class="Constant">&quot;== data 0x2000\n&quot;</span> <span class="Comment">// data segment</span>
<span id="L1246" class="LineNr">1246 </span> <span class="Constant">&quot;0a 00 00 00\n&quot;</span> <span class="Comment">// 0x0000000a</span>
<span id="L1247" class="LineNr">1247 </span> <span class="Delimiter">);</span>
<span id="L1248" class="LineNr">1248 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L1249" class="LineNr">1249 </span> <span class="Constant">&quot;run: <a href='013direct_addressing.cc.html#L1272'>pop</a> into EBX\n&quot;</span>
<span id="L1250" class="LineNr">1250 </span> <span class="Constant">&quot;run: popping value 0x0000000a\n&quot;</span>
<span id="L1251" class="LineNr">1251 </span> <span class="Constant">&quot;run: incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0xbd00000c\n&quot;</span>
<span id="L1252" class="LineNr">1252 </span> <span class="Delimiter">);</span>
<span id="L1253" class="LineNr">1253 </span><span class="Delimiter">}</span>
<span id="L1254" class="LineNr">1254 </span>
<span id="L1255" class="LineNr">1255 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1256" class="LineNr">1256 </span><span class="Normal">case</span> <span class="Constant">0x58</span>:
<span id="L1257" class="LineNr">1257 </span><span class="Normal">case</span> <span class="Constant">0x59</span>:
<span id="L1258" class="LineNr">1258 </span><span class="Normal">case</span> <span class="Constant">0x5a</span>:
<span id="L1259" class="LineNr">1259 </span><span class="Normal">case</span> <span class="Constant">0x5b</span>:
<span id="L1260" class="LineNr">1260 </span><span class="Normal">case</span> <span class="Constant">0x5c</span>:
<span id="L1261" class="LineNr">1261 </span><span class="Normal">case</span> <span class="Constant">0x5d</span>:
<span id="L1262" class="LineNr">1262 </span><span class="Normal">case</span> <span class="Constant">0x5e</span>:
<span id="L1263" class="LineNr">1263 </span><span class="Normal">case</span> <span class="Constant">0x5f</span>: <span class="Delimiter">{</span> <span class="Comment">// pop stack into r32</span>
<span id="L1264" class="LineNr">1264 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L23'>reg</a> = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1265" class="LineNr">1265 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pop into &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1266" class="LineNr">1266 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;pop from &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1267" class="LineNr">1267 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u = <a href='013direct_addressing.cc.html#L1272'>pop</a><span class="Delimiter">();</span>
<span id="L1268" class="LineNr">1268 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;=&gt; &quot; &lt;&lt; NUM(reg) &lt;&lt; &quot;: &quot; &lt;&lt; Reg[reg].u &lt;&lt; '\n';</span>
<span id="L1269" class="LineNr">1269 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1270" class="LineNr">1270 </span><span class="Delimiter">}</span>
<span id="L1271" class="LineNr">1271 </span><span class="Delimiter">:(code)</span>
<span id="L1272" class="LineNr">1272 </span><span class="Normal">uint32_t</span> <a href='013direct_addressing.cc.html#L1272'>pop</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L1273" class="LineNr">1273 </span> <span class="Normal">const</span> <span class="Normal">uint32_t</span> result = <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L1274" class="LineNr">1274 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;popping value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; result &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1275" class="LineNr">1275 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u += <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L1276" class="LineNr">1276 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;incrementing <a href='010---vm.cc.html#L17'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1277" class="LineNr">1277 </span> assert<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L151'>AFTER_STACK</a><span class="Delimiter">);</span>
<span id="L1278" class="LineNr">1278 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L1279" class="LineNr">1279 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/015immediate_addressing.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,13 +16,13 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.SalientComment { color: #0000af; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -62,12 +62,12 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: instructions that (immediately) contain an argument to act with</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;05&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;add imm32 to <a href='010---vm.cc.html#L13'>EAX</a> (add)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;05&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;add imm32 to <a href='010---vm.cc.html#L13'>EAX</a> (add)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">case</span> <span class="Constant">0x05</span>: <span class="Delimiter">{</span> <span class="Comment">// add imm32 to EAX</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;add imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;add imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L10" class="LineNr"> 10 </span> <span class="Normal">int32_t</span> signed_result = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i + signed_arg2<span class="Delimiter">;</span>
<span id="L11" class="LineNr"> 11 </span> SF = <span class="Delimiter">(</span>signed_result &lt; <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L12" class="LineNr"> 12 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>signed_result == <span class="Constant">0</span><span class="Delimiter">);</span>
@ -80,7 +80,7 @@ if ('onhashchange' in window) {
<span id="L19" class="LineNr"> 19 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L20" class="LineNr"> 20 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = signed_result<span class="Delimiter">;</span>
<span id="L22" class="LineNr"> 22 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L22" class="LineNr"> 22 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L24" class="LineNr"> 24 </span><span class="Delimiter">}</span>
<span id="L25" class="LineNr"> 25 </span>
@ -131,7 +131,7 @@ if ('onhashchange' in window) {
<span id="L70" class="LineNr"> 70 </span><span class="Comment">//:</span>
<span id="L71" class="LineNr"> 71 </span>
<span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L73" class="LineNr"> 73 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;81&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;combine rm32 with imm32 based on subop (add/sub/and/or/xor/cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L73" class="LineNr"> 73 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;81&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;combine rm32 with imm32 based on subop (add/sub/and/or/xor/cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L74" class="LineNr"> 74 </span>
<span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(code)</span>
<span id="L76" class="LineNr"> 76 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L76'>test_add_imm32_to_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -154,10 +154,10 @@ if ('onhashchange' in window) {
<span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L94" class="LineNr"> 94 </span><span class="Normal">case</span> <span class="Constant">0x81</span>: <span class="Delimiter">{</span> <span class="Comment">// combine r/m32 with imm32</span>
<span id="L95" class="LineNr"> 95 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;combine r/m32 with imm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Normal">int32_t</span>* signed_arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L99" class="LineNr"> 99 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm32 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L99" class="LineNr"> 99 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm32 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L100" class="LineNr"> 100 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L101" class="LineNr"> 101 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>subop<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L102" class="LineNr"> 102 </span> <span class="Normal">case</span> <span class="Constant">0</span>: <span class="Delimiter">{</span>
@ -175,12 +175,12 @@ if ('onhashchange' in window) {
<span id="L114" class="LineNr"> 114 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L115" class="LineNr"> 115 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L116" class="LineNr"> 116 </span> *signed_arg1 = signed_result<span class="Delimiter">;</span>
<span id="L117" class="LineNr"> 117 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L117" class="LineNr"> 117 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L118" class="LineNr"> 118 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr"> 119 </span> <span class="Delimiter">}</span>
<span id="L120" class="LineNr"> 120 </span> <span class="Comment">// End Op 81 Subops</span>
<span id="L121" class="LineNr"> 121 </span> <span class="Normal">default</span>:
<span id="L122" class="LineNr"> 122 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode 81: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L122" class="LineNr"> 122 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode 81: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L123" class="LineNr"> 123 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L124" class="LineNr"> 124 </span> <span class="Delimiter">}</span>
<span id="L125" class="LineNr"> 125 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -266,7 +266,7 @@ if ('onhashchange' in window) {
<span id="L205" class="LineNr"> 205 </span><span class="SalientComment">//:: subtract</span>
<span id="L206" class="LineNr"> 206 </span>
<span id="L207" class="LineNr"> 207 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L208" class="LineNr"> 208 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;2d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;subtract imm32 from <a href='010---vm.cc.html#L13'>EAX</a> (sub)&quot;</span><span class="Delimiter">);</span>
<span id="L208" class="LineNr"> 208 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;2d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;subtract imm32 from <a href='010---vm.cc.html#L13'>EAX</a> (sub)&quot;</span><span class="Delimiter">);</span>
<span id="L209" class="LineNr"> 209 </span>
<span id="L210" class="LineNr"> 210 </span><span class="Delimiter">:(code)</span>
<span id="L211" class="LineNr"> 211 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L211'>test_subtract_imm32_from_EAX</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -285,7 +285,7 @@ if ('onhashchange' in window) {
<span id="L224" class="LineNr"> 224 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L225" class="LineNr"> 225 </span><span class="Normal">case</span> <span class="Constant">0x2d</span>: <span class="Delimiter">{</span> <span class="Comment">// subtract imm32 from EAX</span>
<span id="L226" class="LineNr"> 226 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L227" class="LineNr"> 227 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subtract imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; from EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L227" class="LineNr"> 227 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subtract imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; from EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L228" class="LineNr"> 228 </span> <span class="Normal">int32_t</span> signed_result = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i - signed_arg2<span class="Delimiter">;</span>
<span id="L229" class="LineNr"> 229 </span> SF = <span class="Delimiter">(</span>signed_result &lt; <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L230" class="LineNr"> 230 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>signed_result == <span class="Constant">0</span><span class="Delimiter">);</span>
@ -298,7 +298,7 @@ if ('onhashchange' in window) {
<span id="L237" class="LineNr"> 237 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L238" class="LineNr"> 238 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L239" class="LineNr"> 239 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = signed_result<span class="Delimiter">;</span>
<span id="L240" class="LineNr"> 240 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L240" class="LineNr"> 240 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L241" class="LineNr"> 241 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L242" class="LineNr"> 242 </span><span class="Delimiter">}</span>
<span id="L243" class="LineNr"> 243 </span>
@ -382,7 +382,7 @@ if ('onhashchange' in window) {
<span id="L321" class="LineNr"> 321 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">(</span>unsigned_result != unsigned_full_result<span class="Delimiter">);</span>
<span id="L322" class="LineNr"> 322 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L323" class="LineNr"> 323 </span> *signed_arg1 = signed_result<span class="Delimiter">;</span>
<span id="L324" class="LineNr"> 324 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L324" class="LineNr"> 324 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L325" class="LineNr"> 325 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L326" class="LineNr"> 326 </span><span class="Delimiter">}</span>
<span id="L327" class="LineNr"> 327 </span>
@ -472,7 +472,7 @@ if ('onhashchange' in window) {
<span id="L411" class="LineNr"> 411 </span><span class="SalientComment">//:: shift left</span>
<span id="L412" class="LineNr"> 412 </span>
<span id="L413" class="LineNr"> 413 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L414" class="LineNr"> 414 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;shift rm32 by imm8 bits depending on subop (sal/sar/shl/shr)&quot;</span><span class="Delimiter">);</span>
<span id="L414" class="LineNr"> 414 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c1&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;shift rm32 by imm8 bits depending on subop (sal/sar/shl/shr)&quot;</span><span class="Delimiter">);</span>
<span id="L415" class="LineNr"> 415 </span>
<span id="L416" class="LineNr"> 416 </span><span class="Delimiter">:(code)</span>
<span id="L417" class="LineNr"> 417 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L417'>test_shift_left_r32_with_imm8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -493,14 +493,14 @@ if ('onhashchange' in window) {
<span id="L432" class="LineNr"> 432 </span>
<span id="L433" class="LineNr"> 433 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L434" class="LineNr"> 434 </span><span class="Normal">case</span> <span class="Constant">0xc1</span>: <span class="Delimiter">{</span>
<span id="L435" class="LineNr"> 435 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L435" class="LineNr"> 435 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L436" class="LineNr"> 436 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;operate on r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L437" class="LineNr"> 437 </span> <span class="Normal">int32_t</span>* arg1 = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L438" class="LineNr"> 438 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L439" class="LineNr"> 439 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>subop<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L440" class="LineNr"> 440 </span> <span class="Normal">case</span> <span class="Constant">4</span>: <span class="Delimiter">{</span> <span class="Comment">// shift left r/m32 by CL</span>
<span id="L441" class="LineNr"> 441 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subop: shift left by CL bits&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L442" class="LineNr"> 442 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L442" class="LineNr"> 442 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L443" class="LineNr"> 443 </span> <span class="Comment">// OF is only defined if count is 1</span>
<span id="L444" class="LineNr"> 444 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L445" class="LineNr"> 445 </span> <span class="Normal">bool</span> msb = <span class="Delimiter">(</span>*arg1 &amp; <span class="Constant">0x80000000</span><span class="Delimiter">)</span> &gt;&gt; <span class="Constant">1</span><span class="Delimiter">;</span>
@ -512,12 +512,12 @@ if ('onhashchange' in window) {
<span id="L451" class="LineNr"> 451 </span> SF = <span class="Delimiter">(</span>*arg1 &lt; <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L452" class="LineNr"> 452 </span> <span class="Comment">// CF undefined</span>
<span id="L453" class="LineNr"> 453 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L454" class="LineNr"> 454 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L454" class="LineNr"> 454 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L455" class="LineNr"> 455 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L456" class="LineNr"> 456 </span> <span class="Delimiter">}</span>
<span id="L457" class="LineNr"> 457 </span> <span class="Comment">// End Op c1 Subops</span>
<span id="L458" class="LineNr"> 458 </span> <span class="Normal">default</span>:
<span id="L459" class="LineNr"> 459 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c1: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L459" class="LineNr"> 459 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c1: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L460" class="LineNr"> 460 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L461" class="LineNr"> 461 </span> <span class="Delimiter">}</span>
<span id="L462" class="LineNr"> 462 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -545,7 +545,7 @@ if ('onhashchange' in window) {
<span id="L484" class="LineNr"> 484 </span><span class="Delimiter">:(before &quot;End Op c1 Subops&quot;)</span>
<span id="L485" class="LineNr"> 485 </span><span class="Normal">case</span> <span class="Constant">7</span>: <span class="Delimiter">{</span> <span class="Comment">// shift right r/m32 by CL, preserving sign</span>
<span id="L486" class="LineNr"> 486 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subop: shift right by CL bits, while preserving sign&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L487" class="LineNr"> 487 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L487" class="LineNr"> 487 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L488" class="LineNr"> 488 </span> <span class="Normal">int32_t</span> result = <span class="Delimiter">(</span>*arg1 &gt;&gt; count<span class="Delimiter">);</span>
<span id="L489" class="LineNr"> 489 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L490" class="LineNr"> 490 </span> SF = <span class="Delimiter">(</span>*arg1 &lt; <span class="Constant">0</span><span class="Delimiter">);</span>
@ -555,7 +555,7 @@ if ('onhashchange' in window) {
<span id="L494" class="LineNr"> 494 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Delimiter">((</span>*arg1 &gt;&gt; <span class="Delimiter">(</span>count-<span class="Constant">1</span><span class="Delimiter">))</span> &amp; <span class="Constant">0x1</span><span class="Delimiter">);</span>
<span id="L495" class="LineNr"> 495 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L496" class="LineNr"> 496 </span> *arg1 = result<span class="Delimiter">;</span>
<span id="L497" class="LineNr"> 497 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L497" class="LineNr"> 497 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L498" class="LineNr"> 498 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L499" class="LineNr"> 499 </span><span class="Delimiter">}</span>
<span id="L500" class="LineNr"> 500 </span>
@ -617,7 +617,7 @@ if ('onhashchange' in window) {
<span id="L556" class="LineNr"> 556 </span><span class="Delimiter">:(before &quot;End Op c1 Subops&quot;)</span>
<span id="L557" class="LineNr"> 557 </span><span class="Normal">case</span> <span class="Constant">5</span>: <span class="Delimiter">{</span> <span class="Comment">// shift right r/m32 by CL, preserving sign</span>
<span id="L558" class="LineNr"> 558 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;subop: shift right by CL bits, while padding zeroes&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L559" class="LineNr"> 559 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L559" class="LineNr"> 559 </span> <span class="Normal">uint8_t</span> count = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">()</span> &amp; <span class="Constant">0x1f</span><span class="Delimiter">;</span>
<span id="L560" class="LineNr"> 560 </span> <span class="Comment">// OF is only defined if count is 1</span>
<span id="L561" class="LineNr"> 561 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L562" class="LineNr"> 562 </span> <span class="Normal">bool</span> msb = <span class="Delimiter">(</span>*arg1 &amp; <span class="Constant">0x80000000</span><span class="Delimiter">)</span> &gt;&gt; <span class="Constant">1</span><span class="Delimiter">;</span>
@ -631,7 +631,7 @@ if ('onhashchange' in window) {
<span id="L570" class="LineNr"> 570 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L571" class="LineNr"> 571 </span> <span class="Comment">// CF undefined</span>
<span id="L572" class="LineNr"> 572 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;SF=&quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; ZF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L83'>ZF</a> &lt;&lt; <span class="Constant">&quot;; CF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L84'>CF</a> &lt;&lt; <span class="Constant">&quot;; OF=&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L85'>OF</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L573" class="LineNr"> 573 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L573" class="LineNr"> 573 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L574" class="LineNr"> 574 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L575" class="LineNr"> 575 </span><span class="Delimiter">}</span>
<span id="L576" class="LineNr"> 576 </span>
@ -672,7 +672,7 @@ if ('onhashchange' in window) {
<span id="L611" class="LineNr"> 611 </span><span class="SalientComment">//:: and</span>
<span id="L612" class="LineNr"> 612 </span>
<span id="L613" class="LineNr"> 613 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L614" class="LineNr"> 614 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;25&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise AND of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (and)&quot;</span><span class="Delimiter">);</span>
<span id="L614" class="LineNr"> 614 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;25&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise AND of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (and)&quot;</span><span class="Delimiter">);</span>
<span id="L615" class="LineNr"> 615 </span>
<span id="L616" class="LineNr"> 616 </span><span class="Delimiter">:(code)</span>
<span id="L617" class="LineNr"> 617 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L617'>test_and_EAX_with_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -693,9 +693,9 @@ if ('onhashchange' in window) {
<span id="L632" class="LineNr"> 632 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L633" class="LineNr"> 633 </span> <span class="Comment">// difference</span>
<span id="L634" class="LineNr"> 634 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L635" class="LineNr"> 635 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;and imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L635" class="LineNr"> 635 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;and imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L636" class="LineNr"> 636 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &amp;= signed_arg2<span class="Delimiter">;</span>
<span id="L637" class="LineNr"> 637 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L637" class="LineNr"> 637 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L638" class="LineNr"> 638 </span> SF = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L639" class="LineNr"> 639 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L640" class="LineNr"> 640 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -732,7 +732,7 @@ if ('onhashchange' in window) {
<span id="L671" class="LineNr"> 671 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L672" class="LineNr"> 672 </span> <span class="Comment">// difference</span>
<span id="L673" class="LineNr"> 673 </span> *signed_arg1 &amp;= signed_arg2<span class="Delimiter">;</span>
<span id="L674" class="LineNr"> 674 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L674" class="LineNr"> 674 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L675" class="LineNr"> 675 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L676" class="LineNr"> 676 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L677" class="LineNr"> 677 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -764,7 +764,7 @@ if ('onhashchange' in window) {
<span id="L703" class="LineNr"> 703 </span><span class="SalientComment">//:: or</span>
<span id="L704" class="LineNr"> 704 </span>
<span id="L705" class="LineNr"> 705 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L706" class="LineNr"> 706 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;0d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise OR of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (or)&quot;</span><span class="Delimiter">);</span>
<span id="L706" class="LineNr"> 706 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;0d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise OR of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (or)&quot;</span><span class="Delimiter">);</span>
<span id="L707" class="LineNr"> 707 </span>
<span id="L708" class="LineNr"> 708 </span><span class="Delimiter">:(code)</span>
<span id="L709" class="LineNr"> 709 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L709'>test_or_EAX_with_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -785,9 +785,9 @@ if ('onhashchange' in window) {
<span id="L724" class="LineNr"> 724 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L725" class="LineNr"> 725 </span> <span class="Comment">// difference</span>
<span id="L726" class="LineNr"> 726 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L727" class="LineNr"> 727 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;or imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L727" class="LineNr"> 727 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;or imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L728" class="LineNr"> 728 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i |= signed_arg2<span class="Delimiter">;</span>
<span id="L729" class="LineNr"> 729 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L729" class="LineNr"> 729 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L730" class="LineNr"> 730 </span> SF = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L731" class="LineNr"> 731 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L732" class="LineNr"> 732 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -824,7 +824,7 @@ if ('onhashchange' in window) {
<span id="L763" class="LineNr"> 763 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L764" class="LineNr"> 764 </span> <span class="Comment">// difference</span>
<span id="L765" class="LineNr"> 765 </span> *signed_arg1 |= signed_arg2<span class="Delimiter">;</span>
<span id="L766" class="LineNr"> 766 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L766" class="LineNr"> 766 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L767" class="LineNr"> 767 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L768" class="LineNr"> 768 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L769" class="LineNr"> 769 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -854,7 +854,7 @@ if ('onhashchange' in window) {
<span id="L793" class="LineNr"> 793 </span><span class="SalientComment">//:: xor</span>
<span id="L794" class="LineNr"> 794 </span>
<span id="L795" class="LineNr"> 795 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L796" class="LineNr"> 796 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;35&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise XOR of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (xor)&quot;</span><span class="Delimiter">);</span>
<span id="L796" class="LineNr"> 796 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;35&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;EAX = bitwise XOR of imm32 with <a href='010---vm.cc.html#L13'>EAX</a> (xor)&quot;</span><span class="Delimiter">);</span>
<span id="L797" class="LineNr"> 797 </span>
<span id="L798" class="LineNr"> 798 </span><span class="Delimiter">:(code)</span>
<span id="L799" class="LineNr"> 799 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L799'>test_xor_EAX_with_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -875,9 +875,9 @@ if ('onhashchange' in window) {
<span id="L814" class="LineNr"> 814 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L815" class="LineNr"> 815 </span> <span class="Comment">// difference</span>
<span id="L816" class="LineNr"> 816 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L817" class="LineNr"> 817 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;xor imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L817" class="LineNr"> 817 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;xor imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; <span class="Constant">&quot; with EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L818" class="LineNr"> 818 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i ^= signed_arg2<span class="Delimiter">;</span>
<span id="L819" class="LineNr"> 819 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L819" class="LineNr"> 819 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L820" class="LineNr"> 820 </span> SF = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L821" class="LineNr"> 821 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L822" class="LineNr"> 822 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -914,7 +914,7 @@ if ('onhashchange' in window) {
<span id="L853" class="LineNr"> 853 </span> <span class="Comment">// bitwise ops technically operate on unsigned numbers, but it makes no</span>
<span id="L854" class="LineNr"> 854 </span> <span class="Comment">// difference</span>
<span id="L855" class="LineNr"> 855 </span> *signed_arg1 ^= signed_arg2<span class="Delimiter">;</span>
<span id="L856" class="LineNr"> 856 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L856" class="LineNr"> 856 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; *signed_arg1 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L857" class="LineNr"> 857 </span> SF = <span class="Delimiter">(</span>*signed_arg1 &gt;&gt; <span class="Constant">31</span><span class="Delimiter">);</span>
<span id="L858" class="LineNr"> 858 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>*signed_arg1 == <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L859" class="LineNr"> 859 </span> <a href='010---vm.cc.html#L84'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -944,7 +944,7 @@ if ('onhashchange' in window) {
<span id="L883" class="LineNr"> 883 </span><span class="SalientComment">//:: compare (cmp)</span>
<span id="L884" class="LineNr"> 884 </span>
<span id="L885" class="LineNr"> 885 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L886" class="LineNr"> 886 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;3d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;compare: set SF if <a href='010---vm.cc.html#L13'>EAX</a> &lt; imm32 (cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L886" class="LineNr"> 886 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;3d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;compare: set SF if <a href='010---vm.cc.html#L13'>EAX</a> &lt; imm32 (cmp)&quot;</span><span class="Delimiter">);</span>
<span id="L887" class="LineNr"> 887 </span>
<span id="L888" class="LineNr"> 888 </span><span class="Delimiter">:(code)</span>
<span id="L889" class="LineNr"> 889 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L889'>test_compare_EAX_with_imm32_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -964,7 +964,7 @@ if ('onhashchange' in window) {
<span id="L903" class="LineNr"> 903 </span><span class="Normal">case</span> <span class="Constant">0x3d</span>: <span class="Delimiter">{</span> <span class="Comment">// compare EAX with imm32</span>
<span id="L904" class="LineNr"> 904 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg1 = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i<span class="Delimiter">;</span>
<span id="L905" class="LineNr"> 905 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_arg2 = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L906" class="LineNr"> 906 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compare <a href='010---vm.cc.html#L13'>EAX</a> with imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L906" class="LineNr"> 906 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compare <a href='010---vm.cc.html#L13'>EAX</a> with imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; signed_arg2 &lt;&lt; end<span class="Delimiter">();</span>
<span id="L907" class="LineNr"> 907 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> signed_difference = signed_arg1 - signed_arg2<span class="Delimiter">;</span>
<span id="L908" class="LineNr"> 908 </span> SF = <span class="Delimiter">(</span>signed_difference &lt; <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L909" class="LineNr"> 909 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Delimiter">(</span>signed_difference == <span class="Constant">0</span><span class="Delimiter">);</span>
@ -1228,13 +1228,13 @@ if ('onhashchange' in window) {
<span id="L1167" class="LineNr">1167 </span>
<span id="L1168" class="LineNr">1168 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1169" class="LineNr">1169 </span><span class="Comment">// b8 defined earlier to copy imm32 to EAX</span>
<span id="L1170" class="LineNr">1170 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L14'>ECX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1171" class="LineNr">1171 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ba&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L15'>EDX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1172" class="LineNr">1172 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L16'>EBX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1173" class="LineNr">1173 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bc&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L17'>ESP</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1174" class="LineNr">1174 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L18'>EBP</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1175" class="LineNr">1175 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;be&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L19'>ESI</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1176" class="LineNr">1176 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bf&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L20'>EDI</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1170" class="LineNr">1170 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L14'>ECX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1171" class="LineNr">1171 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ba&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L15'>EDX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1172" class="LineNr">1172 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L16'>EBX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1173" class="LineNr">1173 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bc&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L17'>ESP</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1174" class="LineNr">1174 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L18'>EBP</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1175" class="LineNr">1175 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;be&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L19'>ESI</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1176" class="LineNr">1176 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;bf&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L20'>EDI</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1177" class="LineNr">1177 </span>
<span id="L1178" class="LineNr">1178 </span><span class="Delimiter">:(code)</span>
<span id="L1179" class="LineNr">1179 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L1179'>test_copy_imm32_to_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1258,7 +1258,7 @@ if ('onhashchange' in window) {
<span id="L1197" class="LineNr">1197 </span><span class="Normal">case</span> <span class="Constant">0xbf</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm32 to r32</span>
<span id="L1198" class="LineNr">1198 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rdest = op &amp; <span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L1199" class="LineNr">1199 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> src = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L1200" class="LineNr">1200 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1200" class="LineNr">1200 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1201" class="LineNr">1201 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[rdest]<span class="Delimiter">.</span>i = src<span class="Delimiter">;</span>
<span id="L1202" class="LineNr">1202 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1203" class="LineNr">1203 </span><span class="Delimiter">}</span>
@ -1266,7 +1266,7 @@ if ('onhashchange' in window) {
<span id="L1205" class="LineNr">1205 </span><span class="Comment">//:</span>
<span id="L1206" class="LineNr">1206 </span>
<span id="L1207" class="LineNr">1207 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1208" class="LineNr">1208 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c7&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to rm32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1208" class="LineNr">1208 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c7&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to rm32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L1209" class="LineNr">1209 </span>
<span id="L1210" class="LineNr">1210 </span><span class="Delimiter">:(code)</span>
<span id="L1211" class="LineNr">1211 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L1211'>test_copy_imm32_to_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1286,16 +1286,16 @@ if ('onhashchange' in window) {
<span id="L1225" class="LineNr">1225 </span>
<span id="L1226" class="LineNr">1226 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1227" class="LineNr">1227 </span><span class="Normal">case</span> <span class="Constant">0xc7</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm32 to r32</span>
<span id="L1228" class="LineNr">1228 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L1228" class="LineNr">1228 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L1229" class="LineNr">1229 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 to r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1230" class="LineNr">1230 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L1231" class="LineNr">1231 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>subop != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L1232" class="LineNr">1232 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c7: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L1232" class="LineNr">1232 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c7: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L1233" class="LineNr">1233 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L1234" class="LineNr">1234 </span> <span class="Delimiter">}</span>
<span id="L1235" class="LineNr">1235 </span> <span class="Normal">int32_t</span>* dest = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L1236" class="LineNr">1236 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> src = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L1237" class="LineNr">1237 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm32 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1237" class="LineNr">1237 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm32 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1238" class="LineNr">1238 </span> *dest = src<span class="Delimiter">;</span>
<span id="L1239" class="LineNr">1239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1240" class="LineNr">1240 </span><span class="Delimiter">}</span>
@ -1303,7 +1303,7 @@ if ('onhashchange' in window) {
<span id="L1242" class="LineNr">1242 </span><span class="SalientComment">//:: push</span>
<span id="L1243" class="LineNr">1243 </span>
<span id="L1244" class="LineNr">1244 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L1245" class="LineNr">1245 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;68&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push imm32 to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1245" class="LineNr">1245 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;68&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;push imm32 to stack (push)&quot;</span><span class="Delimiter">);</span>
<span id="L1246" class="LineNr">1246 </span>
<span id="L1247" class="LineNr">1247 </span><span class="Delimiter">:(code)</span>
<span id="L1248" class="LineNr">1248 </span><span class="Normal">void</span> <a href='015immediate_addressing.cc.html#L1248'>test_push_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -1324,11 +1324,11 @@ if ('onhashchange' in window) {
<span id="L1263" class="LineNr">1263 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L1264" class="LineNr">1264 </span><span class="Normal">case</span> <span class="Constant">0x68</span>: <span class="Delimiter">{</span>
<span id="L1265" class="LineNr">1265 </span> <span class="Normal">const</span> <span class="Normal">uint32_t</span> val = <span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span><a href='011run.cc.html#L432'>next32</a><span class="Delimiter">());</span>
<span id="L1266" class="LineNr">1266 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1266" class="LineNr">1266 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;push imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1267" class="LineNr">1267 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: &quot; &lt;&lt; val &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L1268" class="LineNr">1268 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L1269" class="LineNr">1269 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ESP is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1270" class="LineNr">1270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;contents at <a href='010---vm.cc.html#L17'>ESP</a>: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1269" class="LineNr">1269 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;ESP is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1270" class="LineNr">1270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;contents at <a href='010---vm.cc.html#L17'>ESP</a>: 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L1271" class="LineNr">1271 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L1272" class="LineNr">1272 </span><span class="Delimiter">}</span>
</pre>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/016index_addressing.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
-->
</style>
@ -37,7 +37,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -85,27 +85,27 @@ if ('onhashchange' in window) {
<span id="L27" class="LineNr"> 27 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(code)</span>
<span id="L29" class="LineNr"> 29 </span><span class="Normal">uint32_t</span> <a href='016index_addressing.cc.html#L29'>effective_address_from_sib</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> mod<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> sib = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> sib = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> base = sib&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Normal">uint32_t</span> addr = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base != <a href='010---vm.cc.html#L18'>EBP</a> || mod != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span> addr = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[base]<span class="Delimiter">.</span>u<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="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>base<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<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="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>base<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span> <span class="Comment">// base == EBP &amp;&amp; mod == 0</span>
<span id="L39" class="LineNr"> 39 </span> addr = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span> <span class="Comment">// ignore base</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (disp32)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (disp32)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Delimiter">}</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> index = <span class="Delimiter">(</span>sib&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index == <a href='010---vm.cc.html#L17'>ESP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Comment">// ignore index and scale</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> scale = <span class="Delimiter">(</span><span class="Constant">1</span> &lt;&lt; <span class="Delimiter">(</span>sib&gt;&gt;<span class="Constant">6</span><span class="Delimiter">));</span>
<span id="L49" class="LineNr"> 49 </span> addr += <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[index]<span class="Delimiter">.</span>i*scale<span class="Delimiter">;</span> <span class="Comment">// treat index register as signed. Maybe base as well? But we'll always ensure it's non-negative.</span>
<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (after adding &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>index<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;*&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>scale<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (after adding &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>index<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;*&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>scale<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Delimiter">}</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Identifier">return</span> addr<span class="Delimiter">;</span>
<span id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/017jump_disp8.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -62,10 +62,10 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="SalientComment">//:: jump</span>
<span id="L4" class="LineNr"> 4 </span>
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;eb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;eb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(code)</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L9'>test_jump_rel8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L9'>test_jump_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L10" class="LineNr"> 10 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L11" class="LineNr"> 11 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L12" class="LineNr"> 12 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -82,9 +82,9 @@ if ('onhashchange' in window) {
<span id="L23" class="LineNr"> 23 </span><span class="Delimiter">}</span>
<span id="L24" class="LineNr"> 24 </span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> <span class="Constant">0xeb</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> <span class="Constant">0xeb</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">}</span>
@ -92,10 +92,10 @@ if ('onhashchange' in window) {
<span id="L33" class="LineNr"> 33 </span><span class="SalientComment">//:: jump if equal/zero</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;74&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;74&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L39'>test_je_rel8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L39'>test_je_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -113,17 +113,17 @@ if ('onhashchange' in window) {
<span id="L54" class="LineNr"> 54 </span><span class="Delimiter">}</span>
<span id="L55" class="LineNr"> 55 </span>
<span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> <span class="Constant">0x74</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if ZF</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> <span class="Constant">0x74</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span>
<span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(code)</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L67'>test_je_rel8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L67'>test_je_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -143,10 +143,10 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span><span class="SalientComment">//:: jump if not equal/not zero</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;75&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if not equal, if <a href='010---vm.cc.html#L83'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;75&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if not equal, if <a href='010---vm.cc.html#L83'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(code)</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L90'>test_jne_rel8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L90'>test_jne_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -164,17 +164,17 @@ if ('onhashchange' in window) {
<span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span>
<span id="L106" class="LineNr">106 </span>
<span id="L107" class="LineNr">107 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L108" class="LineNr">108 </span><span class="Normal">case</span> <span class="Constant">0x75</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 unless ZF</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L108" class="LineNr">108 </span><span class="Normal">case</span> <span class="Constant">0x75</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 unless ZF</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr">112 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="Delimiter">:(code)</span>
<span id="L118" class="LineNr">118 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L118'>test_jne_rel8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L118" class="LineNr">118 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L118'>test_jne_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L121" class="LineNr">121 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -194,11 +194,11 @@ if ('onhashchange' in window) {
<span id="L135" class="LineNr">135 </span><span class="SalientComment">//:: jump if greater</span>
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;77&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;77&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L142'>test_jg_rel8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L142'>test_jg_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -218,25 +218,25 @@ if ('onhashchange' in window) {
<span id="L159" class="LineNr">159 </span><span class="Delimiter">}</span>
<span id="L160" class="LineNr">160 </span>
<span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L162" class="LineNr">162 </span><span class="Normal">case</span> <span class="Constant">0x7f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if SF == OF and !ZF</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L162" class="LineNr">162 </span><span class="Normal">case</span> <span class="Constant">0x7f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF == OF and !ZF</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L85'>OF</a> &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span>
<span id="L168" class="LineNr">168 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span><span class="Normal">case</span> <span class="Constant">0x77</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if !CF and !ZF</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L170" class="LineNr">170 </span><span class="Normal">case</span> <span class="Constant">0x77</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if !CF and !ZF</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span>
<span id="L178" class="LineNr">178 </span>
<span id="L179" class="LineNr">179 </span><span class="Delimiter">:(code)</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L180'>test_jg_rel8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L180'>test_jg_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -258,11 +258,11 @@ if ('onhashchange' in window) {
<span id="L199" class="LineNr">199 </span><span class="SalientComment">//:: jump if greater or equal</span>
<span id="L200" class="LineNr">200 </span>
<span id="L201" class="LineNr">201 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (signed), if SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;73&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (signed), if SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;73&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L206'>test_jge_rel8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L206'>test_jge_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
@ -281,25 +281,25 @@ if ('onhashchange' in window) {
<span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span>
<span id="L223" class="LineNr">223 </span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x7d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if SF == OF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x7d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF == OF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span>
<span id="L231" class="LineNr">231 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">case</span> <span class="Constant">0x73</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if !CF</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">case</span> <span class="Constant">0x73</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if !CF</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L235" class="LineNr">235 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L237" class="LineNr">237 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <span class="Delimiter">}</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span>
<span id="L242" class="LineNr">242 </span><span class="Delimiter">:(code)</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L243'>test_jge_rel8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L243'>test_jge_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
@ -320,11 +320,11 @@ if ('onhashchange' in window) {
<span id="L261" class="LineNr">261 </span><span class="SalientComment">//:: jump if lesser</span>
<span id="L262" class="LineNr">262 </span>
<span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (signed), if SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;72&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (signed), if SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;72&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span>
<span id="L267" class="LineNr">267 </span><span class="Delimiter">:(code)</span>
<span id="L268" class="LineNr">268 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L268'>test_jl_rel8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L268" class="LineNr">268 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L268'>test_jl_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L269" class="LineNr">269 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -344,25 +344,25 @@ if ('onhashchange' in window) {
<span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span>
<span id="L286" class="LineNr">286 </span>
<span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">case</span> <span class="Constant">0x7c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if SF != OF</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">case</span> <span class="Constant">0x7c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF != OF</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L292" class="LineNr">292 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span> <span class="Delimiter">}</span>
<span id="L294" class="LineNr">294 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span><span class="Normal">case</span> <span class="Constant">0x72</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if CF</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L296" class="LineNr">296 </span><span class="Normal">case</span> <span class="Constant">0x72</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if CF</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L84'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L300" class="LineNr">300 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">:(code)</span>
<span id="L306" class="LineNr">306 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L306'>test_jl_rel8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L306" class="LineNr">306 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L306'>test_jl_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -384,11 +384,11 @@ if ('onhashchange' in window) {
<span id="L325" class="LineNr">325 </span><span class="SalientComment">//:: jump if lesser or equal</span>
<span id="L326" class="LineNr">326 </span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is set or SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;76&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is set or <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is set or SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;76&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is set or <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span>
<span id="L332" class="LineNr">332 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L332'>test_jle_rel8_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L332" class="LineNr">332 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L332'>test_jle_disp8_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -408,7 +408,7 @@ if ('onhashchange' in window) {
<span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
<span id="L350" class="LineNr">350 </span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">:(code)</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L352'>test_jle_rel8_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L352'>test_jle_disp8_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L354" class="LineNr">354 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
@ -428,25 +428,25 @@ if ('onhashchange' in window) {
<span id="L369" class="LineNr">369 </span><span class="Delimiter">}</span>
<span id="L370" class="LineNr">370 </span>
<span id="L371" class="LineNr">371 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L372" class="LineNr">372 </span><span class="Normal">case</span> <span class="Constant">0x7e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if ZF or SF != OF</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L372" class="LineNr">372 </span><span class="Normal">case</span> <span class="Constant">0x7e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF or SF != OF</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a> || SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L376" class="LineNr">376 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span>
<span id="L378" class="LineNr">378 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span><span class="Normal">case</span> <span class="Constant">0x76</span>: <span class="Delimiter">{</span> <span class="Comment">// jump rel8 if ZF or CF</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">());</span>
<span id="L380" class="LineNr">380 </span><span class="Normal">case</span> <span class="Constant">0x76</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF or CF</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">());</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a> || <a href='010---vm.cc.html#L84'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L384" class="LineNr">384 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L385" class="LineNr">385 </span> <span class="Delimiter">}</span>
<span id="L386" class="LineNr">386 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span><span class="Delimiter">}</span>
<span id="L388" class="LineNr">388 </span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L390'>test_jle_rel8_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L390'>test_jle_disp8_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L392" class="LineNr">392 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/018jump_disp32.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -62,7 +62,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="SalientComment">//:: jump</span>
<span id="L4" class="LineNr"> 4 </span>
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(code)</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L9'>test_jump_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -92,7 +92,7 @@ if ('onhashchange' in window) {
<span id="L33" class="LineNr"> 33 </span><span class="SalientComment">//:: jump if equal/zero</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L39'>test_je_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -116,7 +116,7 @@ if ('onhashchange' in window) {
<span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> <span class="Constant">0x84</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if ZF</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -143,7 +143,7 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span><span class="SalientComment">//:: jump if not equal/not zero</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if not equal, if <a href='010---vm.cc.html#L83'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if not equal, if <a href='010---vm.cc.html#L83'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(code)</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L90'>test_jne_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -167,7 +167,7 @@ if ('onhashchange' in window) {
<span id="L108" class="LineNr">108 </span><span class="Normal">case</span> <span class="Constant">0x85</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 unless ZF</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr">112 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -194,240 +194,276 @@ if ('onhashchange' in window) {
<span id="L135" class="LineNr">135 </span><span class="SalientComment">//:: jump if greater</span>
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater, if <a href='010---vm.cc.html#L83'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span>
<span id="L140" class="LineNr">140 </span><span class="Delimiter">:(code)</span>
<span id="L141" class="LineNr">141 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L141'>test_jg_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L142" class="LineNr">142 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L146" class="LineNr">146 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L147" class="LineNr">147 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L148" class="LineNr">148 </span> <span class="Constant">&quot; 0f 8f 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L149" class="LineNr">149 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L150" class="LineNr">150 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L151" class="LineNr">151 </span> <span class="Delimiter">);</span>
<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L153" class="LineNr">153 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L154" class="LineNr">154 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L155" class="LineNr">155 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L156" class="LineNr">156 </span> <span class="Delimiter">);</span>
<span id="L157" class="LineNr">157 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L158" class="LineNr">158 </span><span class="Delimiter">}</span>
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L161" class="LineNr">161 </span><span class="Normal">case</span> <span class="Constant">0x8f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF and !ZF</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF &amp;&amp; SF == <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span>
<span id="L167" class="LineNr">167 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
<span id="L169" class="LineNr">169 </span>
<span id="L170" class="LineNr">170 </span><span class="Delimiter">:(code)</span>
<span id="L171" class="LineNr">171 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L171'>test_jg_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L172" class="LineNr">172 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L173" class="LineNr">173 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L174" class="LineNr">174 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L176" class="LineNr">176 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L177" class="LineNr">177 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L178" class="LineNr">178 </span> <span class="Constant">&quot; 0f 8f 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L179" class="LineNr">179 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L180" class="LineNr">180 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L181" class="LineNr">181 </span> <span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L183" class="LineNr">183 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L184" class="LineNr">184 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L185" class="LineNr">185 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L186" class="LineNr">186 </span> <span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
<span id="L189" class="LineNr">189 </span>
<span id="L190" class="LineNr">190 </span><span class="SalientComment">//:: jump if greater or equal</span>
<span id="L191" class="LineNr">191 </span>
<span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L193" class="LineNr">193 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater or equal, if SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L194" class="LineNr">194 </span>
<span id="L195" class="LineNr">195 </span><span class="Delimiter">:(code)</span>
<span id="L196" class="LineNr">196 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L196'>test_jge_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L197" class="LineNr">197 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L198" class="LineNr">198 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L199" class="LineNr">199 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L200" class="LineNr">200 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L201" class="LineNr">201 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L202" class="LineNr">202 </span> <span class="Constant">&quot; 0f 8d 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L203" class="LineNr">203 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L204" class="LineNr">204 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L205" class="LineNr">205 </span> <span class="Delimiter">);</span>
<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L207" class="LineNr">207 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L208" class="LineNr">208 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L209" class="LineNr">209 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L210" class="LineNr">210 </span> <span class="Delimiter">);</span>
<span id="L211" class="LineNr">211 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L212" class="LineNr">212 </span><span class="Delimiter">}</span>
<span id="L213" class="LineNr">213 </span>
<span id="L214" class="LineNr">214 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L215" class="LineNr">215 </span><span class="Normal">case</span> <span class="Constant">0x8d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF</span>
<span id="L216" class="LineNr">216 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L217" class="LineNr">217 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L218" class="LineNr">218 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L219" class="LineNr">219 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is unset and <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L142'>test_jg_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L147" class="LineNr">147 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L148" class="LineNr">148 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L149" class="LineNr">149 </span> <span class="Constant">&quot; 0f 8f 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L150" class="LineNr">150 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L151" class="LineNr">151 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L152" class="LineNr">152 </span> <span class="Delimiter">);</span>
<span id="L153" class="LineNr">153 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L154" class="LineNr">154 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L155" class="LineNr">155 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L156" class="LineNr">156 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L157" class="LineNr">157 </span> <span class="Delimiter">);</span>
<span id="L158" class="LineNr">158 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L159" class="LineNr">159 </span><span class="Delimiter">}</span>
<span id="L160" class="LineNr">160 </span>
<span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L162" class="LineNr">162 </span><span class="Normal">case</span> <span class="Constant">0x8f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF and !ZF</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF &amp;&amp; SF == <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span>
<span id="L168" class="LineNr">168 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span><span class="Normal">case</span> <span class="Constant">0x87</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !CF and !ZF</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span>
<span id="L178" class="LineNr">178 </span>
<span id="L179" class="LineNr">179 </span><span class="Delimiter">:(code)</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L180'>test_jg_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L184" class="LineNr">184 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L185" class="LineNr">185 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L186" class="LineNr">186 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L187" class="LineNr">187 </span> <span class="Constant">&quot; 0f 8f 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L188" class="LineNr">188 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L189" class="LineNr">189 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L190" class="LineNr">190 </span> <span class="Delimiter">);</span>
<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L192" class="LineNr">192 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L193" class="LineNr">193 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L194" class="LineNr">194 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L195" class="LineNr">195 </span> <span class="Delimiter">);</span>
<span id="L196" class="LineNr">196 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span>
<span id="L198" class="LineNr">198 </span>
<span id="L199" class="LineNr">199 </span><span class="SalientComment">//:: jump if greater or equal</span>
<span id="L200" class="LineNr">200 </span>
<span id="L201" class="LineNr">201 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater or equal (signed), if SF == <a href='010---vm.cc.html#L85'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if greater or equal (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L206'>test_jge_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L210" class="LineNr">210 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L211" class="LineNr">211 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L212" class="LineNr">212 </span> <span class="Constant">&quot; 0f 8d 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L213" class="LineNr">213 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L214" class="LineNr">214 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L215" class="LineNr">215 </span> <span class="Delimiter">);</span>
<span id="L216" class="LineNr">216 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L217" class="LineNr">217 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L218" class="LineNr">218 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L219" class="LineNr">219 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">);</span>
<span id="L221" class="LineNr">221 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span>
<span id="L223" class="LineNr">223 </span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(code)</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L225'>test_jge_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L226" class="LineNr">226 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L227" class="LineNr">227 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L228" class="LineNr">228 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L229" class="LineNr">229 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L230" class="LineNr">230 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L231" class="LineNr">231 </span> <span class="Constant">&quot; 0f 8d 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L232" class="LineNr">232 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L233" class="LineNr">233 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L234" class="LineNr">234 </span> <span class="Delimiter">);</span>
<span id="L235" class="LineNr">235 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L236" class="LineNr">236 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L237" class="LineNr">237 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L238" class="LineNr">238 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L239" class="LineNr">239 </span> <span class="Delimiter">);</span>
<span id="L240" class="LineNr">240 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L241" class="LineNr">241 </span><span class="Delimiter">}</span>
<span id="L242" class="LineNr">242 </span>
<span id="L243" class="LineNr">243 </span><span class="SalientComment">//:: jump if lesser</span>
<span id="L244" class="LineNr">244 </span>
<span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L246" class="LineNr">246 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if lesser, if SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L247" class="LineNr">247 </span>
<span id="L248" class="LineNr">248 </span><span class="Delimiter">:(code)</span>
<span id="L249" class="LineNr">249 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L249'>test_jl_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L250" class="LineNr">250 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L251" class="LineNr">251 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L252" class="LineNr">252 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L253" class="LineNr">253 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L254" class="LineNr">254 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L255" class="LineNr">255 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L256" class="LineNr">256 </span> <span class="Constant">&quot; 0f 8c 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L257" class="LineNr">257 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L258" class="LineNr">258 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L259" class="LineNr">259 </span> <span class="Delimiter">);</span>
<span id="L260" class="LineNr">260 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L261" class="LineNr">261 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L262" class="LineNr">262 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L263" class="LineNr">263 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L264" class="LineNr">264 </span> <span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span><span class="Delimiter">}</span>
<span id="L267" class="LineNr">267 </span>
<span id="L268" class="LineNr">268 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L269" class="LineNr">269 </span><span class="Normal">case</span> <span class="Constant">0x8c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF and !ZF</span>
<span id="L270" class="LineNr">270 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L273" class="LineNr">273 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L274" class="LineNr">274 </span> <span class="Delimiter">}</span>
<span id="L275" class="LineNr">275 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L276" class="LineNr">276 </span><span class="Delimiter">}</span>
<span id="L277" class="LineNr">277 </span>
<span id="L278" class="LineNr">278 </span><span class="Delimiter">:(code)</span>
<span id="L279" class="LineNr">279 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L279'>test_jl_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L280" class="LineNr">280 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L281" class="LineNr">281 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L282" class="LineNr">282 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L283" class="LineNr">283 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L284" class="LineNr">284 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L285" class="LineNr">285 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L286" class="LineNr">286 </span> <span class="Constant">&quot; 0f 8c 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L287" class="LineNr">287 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L288" class="LineNr">288 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L289" class="LineNr">289 </span> <span class="Delimiter">);</span>
<span id="L290" class="LineNr">290 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L291" class="LineNr">291 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L292" class="LineNr">292 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L293" class="LineNr">293 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L294" class="LineNr">294 </span> <span class="Delimiter">);</span>
<span id="L295" class="LineNr">295 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L296" class="LineNr">296 </span><span class="Delimiter">}</span>
<span id="L297" class="LineNr">297 </span>
<span id="L298" class="LineNr">298 </span><span class="SalientComment">//:: jump if lesser or equal</span>
<span id="L299" class="LineNr">299 </span>
<span id="L300" class="LineNr">300 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L301" class="LineNr">301 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if lesser or equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set or SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L302" class="LineNr">302 </span>
<span id="L303" class="LineNr">303 </span><span class="Delimiter">:(code)</span>
<span id="L304" class="LineNr">304 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L304'>test_jle_disp32_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L305" class="LineNr">305 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L306" class="LineNr">306 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L307" class="LineNr">307 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L309" class="LineNr">309 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L310" class="LineNr">310 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L311" class="LineNr">311 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L312" class="LineNr">312 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L313" class="LineNr">313 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L314" class="LineNr">314 </span> <span class="Delimiter">);</span>
<span id="L315" class="LineNr">315 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L316" class="LineNr">316 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L317" class="LineNr">317 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L318" class="LineNr">318 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L319" class="LineNr">319 </span> <span class="Delimiter">);</span>
<span id="L320" class="LineNr">320 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
<span id="L322" class="LineNr">322 </span>
<span id="L323" class="LineNr">323 </span><span class="Delimiter">:(code)</span>
<span id="L324" class="LineNr">324 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L324'>test_jle_disp32_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L325" class="LineNr">325 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L326" class="LineNr">326 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L327" class="LineNr">327 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L328" class="LineNr">328 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L329" class="LineNr">329 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L330" class="LineNr">330 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L331" class="LineNr">331 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L332" class="LineNr">332 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L333" class="LineNr">333 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L334" class="LineNr">334 </span> <span class="Delimiter">);</span>
<span id="L335" class="LineNr">335 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L336" class="LineNr">336 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L338" class="LineNr">338 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L339" class="LineNr">339 </span> <span class="Delimiter">);</span>
<span id="L340" class="LineNr">340 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
<span id="L342" class="LineNr">342 </span>
<span id="L343" class="LineNr">343 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L344" class="LineNr">344 </span><span class="Normal">case</span> <span class="Constant">0x8e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF or ZF</span>
<span id="L345" class="LineNr">345 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L346" class="LineNr">346 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a> || SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L347" class="LineNr">347 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L348" class="LineNr">348 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L349" class="LineNr">349 </span> <span class="Delimiter">}</span>
<span id="L350" class="LineNr">350 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">}</span>
<span id="L352" class="LineNr">352 </span>
<span id="L353" class="LineNr">353 </span><span class="Delimiter">:(code)</span>
<span id="L354" class="LineNr">354 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L354'>test_jle_disp32_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L355" class="LineNr">355 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L356" class="LineNr">356 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L357" class="LineNr">357 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L358" class="LineNr">358 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L359" class="LineNr">359 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L360" class="LineNr">360 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L361" class="LineNr">361 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L362" class="LineNr">362 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L363" class="LineNr">363 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L364" class="LineNr">364 </span> <span class="Delimiter">);</span>
<span id="L365" class="LineNr">365 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L366" class="LineNr">366 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L367" class="LineNr">367 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L368" class="LineNr">368 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L369" class="LineNr">369 </span> <span class="Delimiter">);</span>
<span id="L370" class="LineNr">370 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L371" class="LineNr">371 </span><span class="Delimiter">}</span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x8d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span>
<span id="L231" class="LineNr">231 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">case</span> <span class="Constant">0x83</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !CF</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L235" class="LineNr">235 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L237" class="LineNr">237 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <span class="Delimiter">}</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span>
<span id="L242" class="LineNr">242 </span><span class="Delimiter">:(code)</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L243'>test_jge_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L247" class="LineNr">247 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L248" class="LineNr">248 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L249" class="LineNr">249 </span> <span class="Constant">&quot; 0f 8d 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L250" class="LineNr">250 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L251" class="LineNr">251 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L252" class="LineNr">252 </span> <span class="Delimiter">);</span>
<span id="L253" class="LineNr">253 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L254" class="LineNr">254 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L255" class="LineNr">255 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L256" class="LineNr">256 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L257" class="LineNr">257 </span> <span class="Delimiter">);</span>
<span id="L258" class="LineNr">258 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L259" class="LineNr">259 </span><span class="Delimiter">}</span>
<span id="L260" class="LineNr">260 </span>
<span id="L261" class="LineNr">261 </span><span class="SalientComment">//:: jump if lesser</span>
<span id="L262" class="LineNr">262 </span>
<span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if lesser (signed), if SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if lesser (unsigned), if <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span>
<span id="L267" class="LineNr">267 </span><span class="Delimiter">:(code)</span>
<span id="L268" class="LineNr">268 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L268'>test_jl_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L269" class="LineNr">269 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L273" class="LineNr">273 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L274" class="LineNr">274 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L275" class="LineNr">275 </span> <span class="Constant">&quot; 0f 8c 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L276" class="LineNr">276 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L277" class="LineNr">277 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L278" class="LineNr">278 </span> <span class="Delimiter">);</span>
<span id="L279" class="LineNr">279 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L280" class="LineNr">280 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L281" class="LineNr">281 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L282" class="LineNr">282 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L283" class="LineNr">283 </span> <span class="Delimiter">);</span>
<span id="L284" class="LineNr">284 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span>
<span id="L286" class="LineNr">286 </span>
<span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">case</span> <span class="Constant">0x8c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF and !ZF</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L292" class="LineNr">292 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span> <span class="Delimiter">}</span>
<span id="L294" class="LineNr">294 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span><span class="Normal">case</span> <span class="Constant">0x72</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if CF</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L84'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L300" class="LineNr">300 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">:(code)</span>
<span id="L306" class="LineNr">306 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L306'>test_jl_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L310" class="LineNr">310 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L311" class="LineNr">311 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L312" class="LineNr">312 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L313" class="LineNr">313 </span> <span class="Constant">&quot; 0f 8c 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L314" class="LineNr">314 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L315" class="LineNr">315 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L316" class="LineNr">316 </span> <span class="Delimiter">);</span>
<span id="L317" class="LineNr">317 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L318" class="LineNr">318 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L319" class="LineNr">319 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L320" class="LineNr">320 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L321" class="LineNr">321 </span> <span class="Delimiter">);</span>
<span id="L322" class="LineNr">322 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L323" class="LineNr">323 </span><span class="Delimiter">}</span>
<span id="L324" class="LineNr">324 </span>
<span id="L325" class="LineNr">325 </span><span class="SalientComment">//:: jump if lesser or equal</span>
<span id="L326" class="LineNr">326 </span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if lesser or equal (signed), if <a href='010---vm.cc.html#L83'>ZF</a> is set or SF != <a href='010---vm.cc.html#L85'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (unsigned), if <a href='010---vm.cc.html#L83'>ZF</a> is set or <a href='010---vm.cc.html#L84'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span>
<span id="L332" class="LineNr">332 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L332'>test_jle_disp32_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L338" class="LineNr">338 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L339" class="LineNr">339 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L340" class="LineNr">340 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L341" class="LineNr">341 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L342" class="LineNr">342 </span> <span class="Delimiter">);</span>
<span id="L343" class="LineNr">343 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L344" class="LineNr">344 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L345" class="LineNr">345 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L346" class="LineNr">346 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L347" class="LineNr">347 </span> <span class="Delimiter">);</span>
<span id="L348" class="LineNr">348 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
<span id="L350" class="LineNr">350 </span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">:(code)</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L352'>test_jle_disp32_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L354" class="LineNr">354 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L356" class="LineNr">356 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L357" class="LineNr">357 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L358" class="LineNr">358 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L359" class="LineNr">359 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L360" class="LineNr">360 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L361" class="LineNr">361 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L362" class="LineNr">362 </span> <span class="Delimiter">);</span>
<span id="L363" class="LineNr">363 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L364" class="LineNr">364 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L365" class="LineNr">365 </span> <span class="Constant">&quot;run: jump 5\n&quot;</span>
<span id="L366" class="LineNr">366 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L367" class="LineNr">367 </span> <span class="Delimiter">);</span>
<span id="L368" class="LineNr">368 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000007 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L369" class="LineNr">369 </span><span class="Delimiter">}</span>
<span id="L370" class="LineNr">370 </span>
<span id="L371" class="LineNr">371 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L372" class="LineNr">372 </span><span class="Normal">case</span> <span class="Constant">0x8e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF or ZF</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a> || SF != <a href='010---vm.cc.html#L85'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L376" class="LineNr">376 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span>
<span id="L378" class="LineNr">378 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span><span class="Normal">case</span> <span class="Constant">0x86</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if ZF or CF</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L83'>ZF</a> || <a href='010---vm.cc.html#L84'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L384" class="LineNr">384 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L385" class="LineNr">385 </span> <span class="Delimiter">}</span>
<span id="L386" class="LineNr">386 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span><span class="Delimiter">}</span>
<span id="L388" class="LineNr">388 </span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L390'>test_jle_disp32_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span> <a href='010---vm.cc.html#L83'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L392" class="LineNr">392 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010---vm.cc.html#L85'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L394" class="LineNr">394 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L395" class="LineNr">395 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L396" class="LineNr">396 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
<span id="L397" class="LineNr">397 </span> <span class="Constant">&quot; 0f 8e 05 00 00 00 \n&quot;</span> <span class="Comment">// skip 1 instruction</span>
<span id="L398" class="LineNr">398 </span> <span class="Constant">&quot; 05 00 00 00 01 \n&quot;</span>
<span id="L399" class="LineNr">399 </span> <span class="Constant">&quot; 05 00 00 00 02 \n&quot;</span>
<span id="L400" class="LineNr">400 </span> <span class="Delimiter">);</span>
<span id="L401" class="LineNr">401 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L402" class="LineNr">402 </span> <span class="Constant">&quot;run: 0x00000001 opcode: 0f\n&quot;</span>
<span id="L403" class="LineNr">403 </span> <span class="Constant">&quot;run: 0x00000007 opcode: 05\n&quot;</span>
<span id="L404" class="LineNr">404 </span> <span class="Constant">&quot;run: 0x0000000c opcode: 05\n&quot;</span>
<span id="L405" class="LineNr">405 </span> <span class="Delimiter">);</span>
<span id="L406" class="LineNr">406 </span> <a href='003trace.cc.html#L283'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: jump 5&quot;</span><span class="Delimiter">);</span>
<span id="L407" class="LineNr">407 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/019functions.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,12 +16,12 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -61,7 +61,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="SalientComment">//:: call</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;call <a href='040---tests.cc.html#L84'>disp32</a> (call)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;call <a href='040---tests.cc.html#L84'>disp32</a> (call)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(code)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">void</span> <a href='019functions.cc.html#L7'>test_call_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -85,11 +85,11 @@ if ('onhashchange' in window) {
<span id="L25" class="LineNr"> 25 </span><span class="Normal">case</span> <span class="Constant">0xe8</span>: <span class="Delimiter">{</span> <span class="Comment">// call disp32 relative to next EIP</span>
<span id="L26" class="LineNr"> 26 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L432'>next32</a><span class="Delimiter">();</span>
<span id="L27" class="LineNr"> 27 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: EIP: &quot; &lt;&lt; EIP &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>EIP<span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span> EIP += offset<span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span>
<span id="L35" class="LineNr"> 35 </span>
@ -121,7 +121,7 @@ if ('onhashchange' in window) {
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* offset = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> <a href='012elf.cc.html#L91'>push</a><span class="Delimiter">(</span>EIP<span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span> EIP += *offset<span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span><span class="Delimiter">}</span>
@ -151,13 +151,13 @@ if ('onhashchange' in window) {
<span id="L91" class="LineNr"> 91 </span><span class="SalientComment">//:: ret</span>
<span id="L92" class="LineNr"> 92 </span>
<span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L94" class="LineNr"> 94 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;return from most recent unfinished call (ret)&quot;</span><span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;return from most recent unfinished call (ret)&quot;</span><span class="Delimiter">);</span>
<span id="L95" class="LineNr"> 95 </span>
<span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(code)</span>
<span id="L97" class="LineNr"> 97 </span><span class="Normal">void</span> <a href='019functions.cc.html#L97'>test_ret</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Special"><a href='010---vm.cc.html#L157'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> <a href='010---vm.cc.html#L251'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span> <a href='010---vm.cc.html#L252'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L101" class="LineNr">101 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L102" class="LineNr">102 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L103" class="LineNr">103 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -176,8 +176,8 @@ if ('onhashchange' in window) {
<span id="L116" class="LineNr">116 </span><span class="Normal">case</span> <span class="Constant">0xc3</span>: <span class="Delimiter">{</span> <span class="Comment">// return from a call</span>
<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;return&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L118" class="LineNr">118 </span> --<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> EIP = <a href='013direct_addressing.cc.html#L1273'>pop</a><span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L119" class="LineNr">119 </span> EIP = <a href='013direct_addressing.cc.html#L1272'>pop</a><span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; end<span class="Delimiter">();</span>
<span id="L121" class="LineNr">121 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span><span class="Delimiter">}</span>
</pre>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/020syscalls.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,14 +14,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -59,14 +59,14 @@ if ('onhashchange' in window) {
<a href='https://github.com/akkartik/mu/blob/master/subx/020syscalls.cc'>https://github.com/akkartik/mu/blob/master/subx/020syscalls.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L2" class="LineNr"> 2 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;cd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;software interrupt (int)&quot;</span><span class="Delimiter">);</span>
<span id="L2" class="LineNr"> 2 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;cd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;software interrupt (int)&quot;</span><span class="Delimiter">);</span>
<span id="L3" class="LineNr"> 3 </span>
<span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L5" class="LineNr"> 5 </span><span class="Normal">case</span> <span class="Constant">0xcd</span>: <span class="Delimiter">{</span> <span class="Comment">// int imm8 (software interrupt)</span>
<span id="L6" class="LineNr"> 6 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;syscall&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L7" class="LineNr"> 7 </span> <span class="Normal">uint8_t</span> code = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L7" class="LineNr"> 7 </span> <span class="Normal">uint8_t</span> code = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>code != <span class="Constant">0x80</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Unimplemented interrupt code &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; code &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;Unimplemented interrupt code &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; code &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L10" class="LineNr"> 10 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot; Only `int 80h` supported for now.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L11" class="LineNr"> 11 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L12" class="LineNr"> 12 </span> <span class="Delimiter">}</span>
@ -88,7 +88,7 @@ if ('onhashchange' in window) {
<span id="L28" class="LineNr"> 28 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Normal">case</span> <span class="Constant">4</span>:
<span id="L30" class="LineNr"> 30 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L235'>mem_addr_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L236'>mem_addr_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = write<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">memory buffer</span><span class="Comment">*/</span><a href='010---vm.cc.html#L194'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">size</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
@ -97,8 +97,8 @@ if ('onhashchange' in window) {
<span id="L37" class="LineNr"> 37 </span> <a href='020syscalls.cc.html#L93'>check_flags</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L14'>ECX</a><span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span> <a href='020syscalls.cc.html#L105'>check_mode</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L15'>EDX</a><span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = open<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">flags</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = open<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">flags</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -112,23 +112,23 @@ if ('onhashchange' in window) {
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">case</span> <span class="Constant">8</span>:
<span id="L53" class="LineNr"> 53 </span> <a href='020syscalls.cc.html#L105'>check_mode</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L14'>ECX</a><span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = creat<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = creat<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Normal">case</span> <span class="Constant">10</span>:
<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = unlink<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = unlink<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Normal">case</span> <span class="Constant">38</span>:
<span id="L68" class="LineNr"> 68 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = rename<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">old filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">new filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L232'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = rename<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">old filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">new filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L233'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@ -144,7 +144,7 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Normal">default</span>:
<span id="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: unimplemented syscall &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: unimplemented syscall &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span>
@ -153,18 +153,18 @@ if ('onhashchange' in window) {
<span id="L93" class="LineNr"> 93 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L93'>check_flags</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Normal">uint32_t</span> flags = <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>flags != <span class="Delimiter">((</span>flags &amp; O_RDONLY<span class="Delimiter">)</span> | <span class="Delimiter">(</span>flags &amp; O_WRONLY<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L96" class="LineNr"> 96 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n&quot;</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n&quot;</span><span class="Delimiter">;</span>
<span id="L97" class="LineNr"> 97 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>flags &amp; O_RDONLY<span class="Delimiter">)</span> &amp;&amp; <span class="Delimiter">(</span>flags &amp; O_WRONLY<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L100" class="LineNr">100 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: can't open a file for both reading and writing at once. See <a href="http://man7.org/linux/man-pages/man2/open.2.html">http://man7.org/linux/man-pages/man2/open.2.html</a>.\n&quot;</span><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: can't open a file for both reading and writing at once. See <a href="http://man7.org/linux/man-pages/man2/open.2.html">http://man7.org/linux/man-pages/man2/open.2.html</a>.\n&quot;</span><span class="Delimiter">;</span>
<span id="L101" class="LineNr">101 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</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='020syscalls.cc.html#L105'>check_mode</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010---vm.cc.html#L23'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[reg]<span class="Delimiter">.</span>u != <span class="PreProc">0</span><span class="Constant">600</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L107" class="LineNr">107 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: SubX is oblivious to file permissions; register &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L23'>reg</a> &lt;&lt; <span class="Constant">&quot; must be 0.\n&quot;</span><span class="Delimiter">;</span>
<span id="L107" class="LineNr">107 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: SubX is oblivious to file permissions; register &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L23'>reg</a> &lt;&lt; <span class="Constant">&quot; must be 0.\n&quot;</span><span class="Delimiter">;</span>
<span id="L108" class="LineNr">108 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L109" class="LineNr">109 </span> <span class="Delimiter">}</span>
<span id="L110" class="LineNr">110 </span><span class="Delimiter">}</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/021byte_addressing.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.cSpecial { color: #008000; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -97,7 +97,7 @@ if ('onhashchange' in window) {
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L41" class="LineNr"> 41 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;88&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8 to r8/m8-at-r32&quot;</span><span class="Delimiter">);</span>
<span id="L41" class="LineNr"> 41 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;88&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8 to r8/m8-at-r32&quot;</span><span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span>
<span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(code)</span>
<span id="L44" class="LineNr"> 44 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L44'>test_copy_r8_to_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -121,21 +121,21 @@ if ('onhashchange' in window) {
<span id="L62" class="LineNr"> 62 </span>
<span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L64" class="LineNr"> 64 </span><span class="Normal">case</span> <span class="Constant">0x88</span>: <span class="Delimiter">{</span> <span class="Comment">// copy r8 to r/m8</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rsrc = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy &quot;</span> &lt;&lt; <a href='021byte_addressing.cc.html#L7'>rname_8bit</a><span class="Delimiter">(</span>rsrc<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to r8/m8-at-r32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Normal">uint8_t</span>* dest = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span><a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">));</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span>* src = <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span>rsrc<span class="Delimiter">);</span>
<span id="L71" class="LineNr"> 71 </span> *dest = *src<span class="Delimiter">;</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="Comment">//:</span>
<span id="L77" class="LineNr"> 77 </span>
<span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L79" class="LineNr"> 79 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8/m8-at-r32 to r8&quot;</span><span class="Delimiter">);</span>
<span id="L79" class="LineNr"> 79 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8/m8-at-r32 to r8&quot;</span><span class="Delimiter">);</span>
<span id="L80" class="LineNr"> 80 </span>
<span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(code)</span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L82'>test_copy_mem_at_r32_to_r8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -160,16 +160,16 @@ if ('onhashchange' in window) {
<span id="L101" class="LineNr">101 </span>
<span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L103" class="LineNr">103 </span><span class="Normal">case</span> <span class="Constant">0x8a</span>: <span class="Delimiter">{</span> <span class="Comment">// copy r/m8 to r8</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rdest = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy r8/m8-at-r32 to &quot;</span> &lt;&lt; <a href='021byte_addressing.cc.html#L7'>rname_8bit</a><span class="Delimiter">(</span>rdest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L107" class="LineNr">107 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L108" class="LineNr">108 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span>* src = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span><a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">));</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span>rdest<span class="Delimiter">);</span>
<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>*src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>*src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L111" class="LineNr">111 </span> *dest = *src<span class="Delimiter">;</span>
<span id="L112" class="LineNr">112 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rdest_32bit = rdest &amp; <span class="Constant">0x3</span><span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest_32bit<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; now contains 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[rdest_32bit]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest_32bit<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; now contains 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[rdest_32bit]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>
@ -195,7 +195,7 @@ if ('onhashchange' in window) {
<span id="L136" class="LineNr">136 </span><span class="Comment">//:</span>
<span id="L137" class="LineNr">137 </span>
<span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm8 to r8/m8-at-r32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm8 to r8/m8-at-r32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L142'>test_copy_imm8_to_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -218,19 +218,19 @@ if ('onhashchange' in window) {
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L161" class="LineNr">161 </span><span class="Normal">case</span> <span class="Constant">0xc6</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm8 to r/m8</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> src = <a href='010---vm.cc.html#L343'>next</a><span class="Delimiter">();</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> src = <a href='010---vm.cc.html#L338'>next</a><span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm8 to r8/m8-at-r32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm8 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm8 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L167" class="LineNr">167 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>subop != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L168" class="LineNr">168 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c6: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c6: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L170" class="LineNr">170 </span> <span class="Delimiter">}</span>
<span id="L171" class="LineNr">171 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">uint8_t</span>* dest = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span><a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">));</span>
<span id="L173" class="LineNr">173 </span> *dest = src<span class="Delimiter">;</span>
<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L175" class="LineNr">175 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span>
</pre>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/022div.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
-->
</style>
@ -37,7 +37,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -59,7 +59,7 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: helper for division operations: sign-extend EAX into EDX</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;99&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;sign-extend <a href='010---vm.cc.html#L13'>EAX</a> into <a href='010---vm.cc.html#L15'>EDX</a> (cdq)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;99&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;sign-extend <a href='010---vm.cc.html#L13'>EAX</a> into <a href='010---vm.cc.html#L15'>EDX</a> (cdq)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(code)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">void</span> <a href='022div.cc.html#L7'>test_cdq</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -78,7 +78,7 @@ if ('onhashchange' in window) {
<span id="L20" class="LineNr">20 </span><span class="Normal">case</span> <span class="Constant">0x99</span>: <span class="Delimiter">{</span> <span class="Comment">// sign-extend EAX into EDX</span>
<span id="L21" class="LineNr">21 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;sign-extend <a href='010---vm.cc.html#L13'>EAX</a> into EDX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L22" class="LineNr">22 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt; <span class="Constant">0</span><span class="Delimiter">)</span> ? -<span class="Constant">1</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L23" class="LineNr">23 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;EDX is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L23" class="LineNr">23 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;EDX is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L24" class="LineNr">24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L25" class="LineNr">25 </span><span class="Delimiter">}</span>
<span id="L26" class="LineNr">26 </span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/028translate.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,15 +14,15 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.PreProc { color: #c000c0; }
.LineNr { }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.PreProc { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -227,7 +227,7 @@ if ('onhashchange' in window) {
<span id="L166" class="LineNr">166 </span> <span class="Normal">uint32_t</span> p_align = <span class="Constant">0x1000</span><span class="Delimiter">;</span> <span class="Comment">// default page size on linux</span>
<span id="L167" class="LineNr">167 </span> emit<span class="Delimiter">(</span>p_align<span class="Delimiter">);</span>
<span id="L168" class="LineNr">168 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset % p_align != p_start % p_align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L169" class="LineNr">169 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L169" class="LineNr">169 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L170" class="LineNr">170 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/029transforms.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,8 +15,8 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
-->
</style>
@ -33,7 +33,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/030---operands.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,12 +15,12 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -352,7 +352,7 @@ if ('onhashchange' in window) {
<span id="L293" class="LineNr">293 </span>string <a href='030---operands.cc.html#L293'>hex_byte_to_string</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L294" class="LineNr">294 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span> <span class="Comment">// uint8_t prints without padding, but int8_t will expand to 32 bits again</span>
<span id="L296" class="LineNr">296 </span> out &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L296" class="LineNr">296 </span> out &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L297" class="LineNr">297 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L298" class="LineNr">298 </span><span class="Delimiter">}</span>
<span id="L299" class="LineNr">299 </span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/031check_operands.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -17,13 +17,13 @@ a { color:inherit; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.PreProc { color: #c000c0; }
.SalientComment { color: #0000af; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -93,14 +93,14 @@ if ('onhashchange' in window) {
<span id="L32" class="LineNr"> 32 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Delimiter">}</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>op<span class="Delimiter">.</span>data == <span class="Constant">&quot;f3&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr"> 35 </span> <a href='031check_operands.cc.html#L609'>check_operands_f3</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L35" class="LineNr"> 35 </span> <a href='031check_operands.cc.html#L608'>check_operands_f3</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Delimiter">}</span>
<span id="L38" class="LineNr"> 38 </span> check_operands<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span>
<span id="L40" class="LineNr"> 40 </span>
<span id="L41" class="LineNr"> 41 </span><a href='011run.cc.html#L126'>word</a> <a href='031check_operands.cc.html#L41'>preprocess_op</a><span class="Delimiter">(</span><a href='011run.cc.html#L126'>word</a><span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L42" class="LineNr"> 42 </span> op<span class="Delimiter">.</span>data = <a href='031check_operands.cc.html#L676'>tolower</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
<span id="L42" class="LineNr"> 42 </span> op<span class="Delimiter">.</span>data = <a href='031check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Comment">// opcodes can't be negative</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L101'>starts_with</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">,</span> <span class="Constant">&quot;0x&quot;</span><span class="Delimiter">))</span>
<span id="L45" class="LineNr"> 45 </span> op<span class="Delimiter">.</span>data = op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
@ -286,467 +286,470 @@ if ('onhashchange' in window) {
<span id="L225" class="LineNr">225 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
<span id="L226" class="LineNr">226 </span> <span class="Comment">// copy address (lea)</span>
<span id="L227" class="LineNr">227 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
<span id="L228" class="LineNr">228 </span> <span class="Comment">// pop</span>
<span id="L229" class="LineNr">229 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
<span id="L230" class="LineNr">230 </span>
<span id="L231" class="LineNr">231 </span> <span class="SalientComment">//// Class N: op, ModR/M and subop (not r32)</span>
<span id="L232" class="LineNr">232 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L233" class="LineNr">233 </span> <span class="Comment">// 0 0 0 |0 0 1 1</span>
<span id="L234" class="LineNr">234 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;d3&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// shift</span>
<span id="L235" class="LineNr">235 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f7&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// test/not/mul/div</span>
<span id="L236" class="LineNr">236 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// jump/push/call</span>
<span id="L237" class="LineNr">237 </span>
<span id="L238" class="LineNr">238 </span> <span class="SalientComment">//// Class O: op, ModR/M, subop (not r32) and imm8</span>
<span id="L239" class="LineNr">239 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L240" class="LineNr">240 </span> <span class="Comment">// 0 1 0 |0 0 1 1</span>
<span id="L241" class="LineNr">241 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c1&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x23</span><span class="Delimiter">);</span> <span class="Comment">// combine</span>
<span id="L242" class="LineNr">242 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x23</span><span class="Delimiter">);</span> <span class="Comment">// copy</span>
<span id="L243" class="LineNr">243 </span>
<span id="L244" class="LineNr">244 </span> <span class="SalientComment">//// Class P: op, ModR/M, subop (not r32) and imm32</span>
<span id="L245" class="LineNr">245 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L246" class="LineNr">246 </span> <span class="Comment">// 1 0 0 |0 0 1 1</span>
<span id="L247" class="LineNr">247 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;81&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x43</span><span class="Delimiter">);</span> <span class="Comment">// combine</span>
<span id="L248" class="LineNr">248 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c7&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x43</span><span class="Delimiter">);</span> <span class="Comment">// copy</span>
<span id="L249" class="LineNr">249 </span>
<span id="L250" class="LineNr">250 </span> <span class="Comment">// End Init Permitted Operands</span>
<span id="L251" class="LineNr">251 </span><span class="Delimiter">}</span>
<span id="L252" class="LineNr">252 </span>
<span id="L253" class="LineNr">253 </span><span class="PreProc">#define HAS(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) &amp; (</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit)))</span>
<span id="L254" class="LineNr">254 </span><span class="PreProc">#define SET(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) | (</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit)))</span>
<span id="L255" class="LineNr">255 </span><span class="PreProc">#define CLEAR(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) &amp; (~(</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit))))</span>
<span id="L256" class="LineNr">256 </span>
<span id="L257" class="LineNr">257 </span><span class="Normal">void</span> check_operands<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L259" class="LineNr">259 </span> <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L260" class="LineNr">260 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L261" class="LineNr">261 </span> <a href='031check_operands.cc.html#L373'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span> <a href='031check_operands.cc.html#L399'>compare_bitvector_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L263" class="LineNr">263 </span> <span class="Delimiter">}</span>
<span id="L264" class="LineNr">264 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L265" class="LineNr">265 </span> <a href='031check_operands.cc.html#L271'>compare_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span> <span class="Delimiter">}</span>
<span id="L267" class="LineNr">267 </span><span class="Delimiter">}</span>
<span id="L268" class="LineNr">268 </span>
<span id="L269" class="LineNr">269 </span><span class="Comment">//: Many instructions can be checked just by comparing bitvectors.</span>
<span id="L270" class="LineNr">270 </span>
<span id="L271" class="LineNr">271 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L271'>compare_bitvector</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L272" class="LineNr">272 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L307'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L273" class="LineNr">273 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L297'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L275" class="LineNr">275 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L276" class="LineNr">276 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L277" class="LineNr">277 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L278" class="LineNr">278 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L279" class="LineNr">279 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L280" class="LineNr">280 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L281" class="LineNr">281 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L282" class="LineNr">282 </span> <span class="Normal">else</span>
<span id="L283" class="LineNr">283 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L284" class="LineNr">284 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span>
<span id="L286" class="LineNr">286 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L287" class="LineNr">287 </span><span class="Delimiter">}</span>
<span id="L288" class="LineNr">288 </span>
<span id="L289" class="LineNr">289 </span>string <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L291" class="LineNr">291 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L292" class="LineNr">292 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L293" class="LineNr">293 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L360'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L294" class="LineNr">294 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span>
<span id="L297" class="LineNr">297 </span><span class="Normal">uint32_t</span> <a href='031check_operands.cc.html#L297'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L298" class="LineNr">298 </span> set&lt;string&gt; operands_found<span class="Delimiter">;</span>
<span id="L299" class="LineNr">299 </span> <span class="Normal">uint32_t</span> bitvector = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip op</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L301" class="LineNr">301 </span> bitvector = bitvector | <a href='031check_operands.cc.html#L324'>expected_bit_for_received_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> operands_found<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
<span id="L302" class="LineNr">302 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L303" class="LineNr">303 </span> <span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span> <span class="Identifier">return</span> bitvector<span class="Delimiter">;</span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">}</span>
<span id="L306" class="LineNr">306 </span>
<span id="L307" class="LineNr">307 </span><span class="Normal">bool</span> <a href='031check_operands.cc.html#L307'>has_operands</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L308" class="LineNr">308 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">)</span> &gt; <a href='031check_operands.cc.html#L311'>first_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span>
<span id="L310" class="LineNr">310 </span>
<span id="L311" class="LineNr">311 </span><span class="Normal">int</span> <a href='031check_operands.cc.html#L311'>first_operand</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L312" class="LineNr">312 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L313" class="LineNr">313 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f2&quot;</span> || inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f3&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L314" class="LineNr">314 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span>
<span id="L315" class="LineNr">315 </span> <span class="Identifier">return</span> <span class="Constant">3</span><span class="Delimiter">;</span>
<span id="L316" class="LineNr">316 </span> <span class="Normal">else</span>
<span id="L317" class="LineNr">317 </span> <span class="Identifier">return</span> <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L318" class="LineNr">318 </span> <span class="Delimiter">}</span>
<span id="L319" class="LineNr">319 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L320" class="LineNr">320 </span><span class="Delimiter">}</span>
<span id="L321" class="LineNr">321 </span>
<span id="L322" class="LineNr">322 </span><span class="Comment">// Scan the metadata of 'w' and return the expected bit corresponding to any operand type.</span>
<span id="L323" class="LineNr">323 </span><span class="Comment">// Also raise an error if metadata contains multiple operand types.</span>
<span id="L324" class="LineNr">324 </span><span class="Normal">uint32_t</span> <a href='031check_operands.cc.html#L324'>expected_bit_for_received_operand</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">,</span> set&lt;string&gt;&amp; instruction_operands<span class="Delimiter">,</span> <span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L325" class="LineNr">325 </span> <span class="Normal">uint32_t</span> bv = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L326" class="LineNr">326 </span> <span class="Normal">bool</span> found = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L327" class="LineNr">327 </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#L165'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L328" class="LineNr">328 </span> string<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> curr = w<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span> string expected_metadata = curr<span class="Delimiter">;</span>
<span id="L330" class="LineNr">330 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">&quot;mod&quot;</span> || curr == <span class="Constant">&quot;rm32&quot;</span> || curr == <span class="Constant">&quot;r32&quot;</span> || curr == <span class="Constant">&quot;scale&quot;</span> || curr == <span class="Constant">&quot;index&quot;</span> || curr == <span class="Constant">&quot;base&quot;</span><span class="Delimiter">)</span>
<span id="L331" class="LineNr">331 </span> expected_metadata = <span class="Constant">&quot;modrm&quot;</span><span class="Delimiter">;</span>
<span id="L332" class="LineNr">332 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L80'>Operand_type</a></span><span class="Delimiter">,</span> curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// ignore unrecognized metadata</span>
<span id="L333" class="LineNr">333 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>found<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L334" class="LineNr">334 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' has conflicting operand types; it should have only one\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L335" class="LineNr">335 </span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> <span class="Delimiter">}</span>
<span id="L337" class="LineNr">337 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>instruction_operands<span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> != instruction_operands<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L338" class="LineNr">338 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': duplicate &quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L339" class="LineNr">339 </span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span>
<span id="L340" class="LineNr">340 </span> <span class="Delimiter">}</span>
<span id="L341" class="LineNr">341 </span> instruction_operands<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L342" class="LineNr">342 </span> bv = <span class="Delimiter">(</span><span class="Constant">1</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L80'>Operand_type</a></span><span class="Delimiter">,</span> expected_metadata<span class="Delimiter">));</span>
<span id="L343" class="LineNr">343 </span> found = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L344" class="LineNr">344 </span> <span class="Delimiter">}</span>
<span id="L345" class="LineNr">345 </span> <span class="Identifier">return</span> bv<span class="Delimiter">;</span>
<span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span>
<span id="L347" class="LineNr">347 </span>
<span id="L348" class="LineNr">348 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L348'>test_conflicting_operand_type</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L349" class="LineNr">349 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L350" class="LineNr">350 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L351" class="LineNr">351 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L352" class="LineNr">352 </span> <span class="Constant">&quot;cd/software-interrupt 80/imm8/imm32\n&quot;</span>
<span id="L353" class="LineNr">353 </span> <span class="Delimiter">);</span>
<span id="L354" class="LineNr">354 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L355" class="LineNr">355 </span> <span class="Constant">&quot;error: '80/imm8/imm32' has conflicting operand types; it should have only one\n&quot;</span>
<span id="L356" class="LineNr">356 </span> <span class="Delimiter">);</span>
<span id="L357" class="LineNr">357 </span><span class="Delimiter">}</span>
<span id="L358" class="LineNr">358 </span>
<span id="L359" class="LineNr">359 </span><span class="Comment">//: Instructions computing effective addresses have more complex rules, so</span>
<span id="L360" class="LineNr">360 </span><span class="Comment">//: we'll hard-code a common set of instruction-decoding rules.</span>
<span id="L361" class="LineNr">361 </span>
<span id="L362" class="LineNr">362 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L362'>test_check_missing_mod_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L363" class="LineNr">363 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L364" class="LineNr">364 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L365" class="LineNr">365 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L366" class="LineNr">366 </span> <span class="Constant">&quot;81 0/add/subop 3/rm32/ebx 1/imm32\n&quot;</span>
<span id="L367" class="LineNr">367 </span> <span class="Delimiter">);</span>
<span id="L368" class="LineNr">368 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L369" class="LineNr">369 </span> <span class="Constant">&quot;error: '81 0/add/subop 3/rm32/ebx 1/imm32' (combine rm32 with imm32 based on subop): missing mod operand\n&quot;</span>
<span id="L370" class="LineNr">370 </span> <span class="Delimiter">);</span>
<span id="L371" class="LineNr">371 </span><span class="Delimiter">}</span>
<span id="L372" class="LineNr">372 </span>
<span id="L373" class="LineNr">373 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L373'>check_operands_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L375" class="LineNr">375 </span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L376" class="LineNr">376 </span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L377" class="LineNr">377 </span> <span class="Comment">// no check for r32; some instructions don't use it; just assume it's 0 if missing</span>
<span id="L378" class="LineNr">378 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>op<span class="Delimiter">.</span>data == <span class="Constant">&quot;81&quot;</span> || op<span class="Delimiter">.</span>data == <span class="Constant">&quot;8f&quot;</span> || op<span class="Delimiter">.</span>data == <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// keep sync'd with 'help subop'</span>
<span id="L379" class="LineNr">379 </span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;subop&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L380" class="LineNr">380 </span> <a href='031check_operands.cc.html#L438'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;r32&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;should be replaced by subop&quot;</span><span class="Delimiter">);</span>
<span id="L381" class="LineNr">381 </span> <span class="Delimiter">}</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L383" class="LineNr">383 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data != <span class="Constant">&quot;4&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L384" class="LineNr">384 </span> <span class="Comment">// SIB byte checks</span>
<span id="L385" class="LineNr">385 </span> <span class="Normal">uint8_t</span> mod = <a href='011run.cc.html#L302'>hex_byte</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L386" class="LineNr">386 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>mod != <span class="Comment">/*</span><span class="Comment">direct</span><span class="Comment">*/</span><span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L387" class="LineNr">387 </span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;base&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L388" class="LineNr">388 </span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span> <span class="Comment">// otherwise why go to SIB?</span>
<span id="L389" class="LineNr">389 </span> <span class="Delimiter">}</span>
<span id="L390" class="LineNr">390 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span> <a href='031check_operands.cc.html#L438'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;base&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;direct mode&quot;</span><span class="Delimiter">);</span>
<span id="L392" class="LineNr">392 </span> <a href='031check_operands.cc.html#L438'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;direct mode&quot;</span><span class="Delimiter">);</span>
<span id="L393" class="LineNr">393 </span> <span class="Delimiter">}</span>
<span id="L394" class="LineNr">394 </span> <span class="Comment">// no check for scale; 0 (2**0 = 1) by default</span>
<span id="L395" class="LineNr">395 </span><span class="Delimiter">}</span>
<span id="L396" class="LineNr">396 </span>
<span id="L397" class="LineNr">397 </span><span class="Comment">// same as compare_bitvector, with one additional exception for modrm-based</span>
<span id="L398" class="LineNr">398 </span><span class="Comment">// instructions: they may use an extra displacement on occasion</span>
<span id="L399" class="LineNr">399 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L399'>compare_bitvector_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L400" class="LineNr">400 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L307'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L401" class="LineNr">401 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L297'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L402" class="LineNr">402 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L403" class="LineNr">403 </span> <span class="Comment">// update 'expected' bitvector for the additional exception</span>
<span id="L404" class="LineNr">404 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L405" class="LineNr">405 </span> <span class="Normal">int32_t</span> mod = <a href='011run.cc.html#L448'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L406" class="LineNr">406 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>mod<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L407" class="LineNr">407 </span> <span class="Normal">case</span> <span class="Constant">0</span>:
<span id="L408" class="LineNr">408 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">)</span> &amp;&amp; <a href='011run.cc.html#L448'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">)</span> == <span class="Constant">5</span><span class="Delimiter">)</span>
<span id="L409" class="LineNr">409 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP32<span class="Delimiter">);</span>
<span id="L410" class="LineNr">410 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L411" class="LineNr">411 </span> <span class="Normal">case</span> <span class="Constant">1</span>:
<span id="L412" class="LineNr">412 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP8<span class="Delimiter">);</span>
<span id="L413" class="LineNr">413 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L414" class="LineNr">414 </span> <span class="Normal">case</span> <span class="Constant">2</span>:
<span id="L415" class="LineNr">415 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP32<span class="Delimiter">);</span>
<span id="L416" class="LineNr">416 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L417" class="LineNr">417 </span> <span class="Delimiter">}</span>
<span id="L418" class="LineNr">418 </span> <span class="Delimiter">}</span>
<span id="L419" class="LineNr">419 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L420" class="LineNr">420 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L421" class="LineNr">421 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing for modrm &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L422" class="LineNr">422 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L423" class="LineNr">423 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L424" class="LineNr">424 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L425" class="LineNr">425 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L426" class="LineNr">426 </span> <span class="Normal">else</span>
<span id="L427" class="LineNr">427 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L428" class="LineNr">428 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L429" class="LineNr">429 </span> <span class="Delimiter">}</span>
<span id="L430" class="LineNr">430 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L431" class="LineNr">431 </span><span class="Delimiter">}</span>
<span id="L432" class="LineNr">432 </span>
<span id="L433" class="LineNr">433 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L433'>check_operand_metadata_present</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L434" class="LineNr">434 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> type<span class="Delimiter">))</span>
<span id="L435" class="LineNr">435 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; type &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L436" class="LineNr">436 </span><span class="Delimiter">}</span>
<span id="L437" class="LineNr">437 </span>
<span id="L438" class="LineNr">438 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L438'>check_operand_metadata_absent</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; msg<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L439" class="LineNr">439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> type<span class="Delimiter">))</span>
<span id="L440" class="LineNr">440 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L289'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; type &lt;&lt; <span class="Constant">&quot; operand (&quot;</span> &lt;&lt; msg &lt;&lt; <span class="Constant">&quot;)\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L441" class="LineNr">441 </span><span class="Delimiter">}</span>
<span id="L442" class="LineNr">442 </span>
<span id="L443" class="LineNr">443 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L443'>test_modrm_with_displacement</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L444" class="LineNr">444 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L445" class="LineNr">445 </span> transform<span class="Delimiter">(</span>
<span id="L446" class="LineNr">446 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L447" class="LineNr">447 </span> <span class="Comment">// just avoid null pointer</span>
<span id="L448" class="LineNr">448 </span> <span class="Constant">&quot;8b/copy 1/mod/lookup+disp8 0/rm32/EAX 2/r32/EDX 4/disp8\n&quot;</span> <span class="Comment">// copy *(EAX+4) to EDX</span>
<span id="L449" class="LineNr">449 </span> <span class="Delimiter">);</span>
<span id="L450" class="LineNr">450 </span> <a href='003trace.cc.html#L285'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L451" class="LineNr">451 </span><span class="Delimiter">}</span>
<span id="L452" class="LineNr">452 </span>
<span id="L453" class="LineNr">453 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L453'>test_check_missing_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L454" class="LineNr">454 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L455" class="LineNr">455 </span> transform<span class="Delimiter">(</span>
<span id="L456" class="LineNr">456 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L457" class="LineNr">457 </span> <span class="Constant">&quot;89/copy 1/mod/lookup+disp8 0/rm32/EAX 1/r32/ECX\n&quot;</span> <span class="Comment">// missing disp8</span>
<span id="L458" class="LineNr">458 </span> <span class="Delimiter">);</span>
<span id="L459" class="LineNr">459 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L460" class="LineNr">460 </span> <span class="Constant">&quot;error: '89/copy 1/mod/lookup+disp8 0/rm32/EAX 1/r32/ECX' (copy r32 to rm32): missing disp8 operand\n&quot;</span>
<span id="L461" class="LineNr">461 </span> <span class="Delimiter">);</span>
<span id="L462" class="LineNr">462 </span><span class="Delimiter">}</span>
<span id="L463" class="LineNr">463 </span>
<span id="L464" class="LineNr">464 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L464'>test_check_missing_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L465" class="LineNr">465 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L466" class="LineNr">466 </span> transform<span class="Delimiter">(</span>
<span id="L467" class="LineNr">467 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L468" class="LineNr">468 </span> <span class="Constant">&quot;8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX\n&quot;</span> <span class="Comment">// missing disp32</span>
<span id="L469" class="LineNr">469 </span> <span class="Delimiter">);</span>
<span id="L470" class="LineNr">470 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L471" class="LineNr">471 </span> <span class="Constant">&quot;error: '8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX' (copy rm32 to r32): missing <a href='040---tests.cc.html#L84'>disp32</a> operand\n&quot;</span>
<span id="L472" class="LineNr">472 </span> <span class="Delimiter">);</span>
<span id="L473" class="LineNr">473 </span><span class="Delimiter">}</span>
<span id="L474" class="LineNr">474 </span>
<span id="L475" class="LineNr">475 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L475'>test_conflicting_operands_in_modrm_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L476" class="LineNr">476 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L477" class="LineNr">477 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L478" class="LineNr">478 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L479" class="LineNr">479 </span> <span class="Constant">&quot;01/add 0/mod 3/mod\n&quot;</span>
<span id="L480" class="LineNr">480 </span> <span class="Delimiter">);</span>
<span id="L481" class="LineNr">481 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L482" class="LineNr">482 </span> <span class="Constant">&quot;error: '01/add 0/mod 3/mod' has conflicting mod operands\n&quot;</span>
<span id="L483" class="LineNr">483 </span> <span class="Delimiter">);</span>
<span id="L484" class="LineNr">484 </span><span class="Delimiter">}</span>
<span id="L485" class="LineNr">485 </span>
<span id="L486" class="LineNr">486 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L486'>test_conflicting_operand_type_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L487" class="LineNr">487 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L488" class="LineNr">488 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L489" class="LineNr">489 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L490" class="LineNr">490 </span> <span class="Constant">&quot;01/add 0/mod 3/rm32/r32\n&quot;</span>
<span id="L491" class="LineNr">491 </span> <span class="Delimiter">);</span>
<span id="L492" class="LineNr">492 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L493" class="LineNr">493 </span> <span class="Constant">&quot;error: '3/rm32/r32' has conflicting operand types; it should have only one\n&quot;</span>
<span id="L494" class="LineNr">494 </span> <span class="Delimiter">);</span>
<span id="L495" class="LineNr">495 </span><span class="Delimiter">}</span>
<span id="L496" class="LineNr">496 </span>
<span id="L497" class="LineNr">497 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L497'>test_check_missing_rm32_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L498" class="LineNr">498 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L499" class="LineNr">499 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L500" class="LineNr">500 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L501" class="LineNr">501 </span> <span class="Constant">&quot;81 0/add/subop 0/mod 1/imm32\n&quot;</span>
<span id="L502" class="LineNr">502 </span> <span class="Delimiter">);</span>
<span id="L503" class="LineNr">503 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L504" class="LineNr">504 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod 1/imm32' (combine rm32 with imm32 based on subop): missing rm32 operand\n&quot;</span>
<span id="L505" class="LineNr">505 </span> <span class="Delimiter">);</span>
<span id="L506" class="LineNr">506 </span><span class="Delimiter">}</span>
<span id="L507" class="LineNr">507 </span>
<span id="L508" class="LineNr">508 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L508'>test_check_missing_subop_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L509" class="LineNr">509 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L510" class="LineNr">510 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L511" class="LineNr">511 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L512" class="LineNr">512 </span> <span class="Constant">&quot;81 0/mod 3/rm32/ebx 1/imm32\n&quot;</span>
<span id="L513" class="LineNr">513 </span> <span class="Delimiter">);</span>
<span id="L514" class="LineNr">514 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L515" class="LineNr">515 </span> <span class="Constant">&quot;error: '81 0/mod 3/rm32/ebx 1/imm32' (combine rm32 with imm32 based on subop): missing subop operand\n&quot;</span>
<span id="L516" class="LineNr">516 </span> <span class="Delimiter">);</span>
<span id="L517" class="LineNr">517 </span><span class="Delimiter">}</span>
<span id="L518" class="LineNr">518 </span>
<span id="L519" class="LineNr">519 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L519'>test_check_missing_base_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L520" class="LineNr">520 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L521" class="LineNr">521 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L522" class="LineNr">522 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L523" class="LineNr">523 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 1/imm32\n&quot;</span>
<span id="L524" class="LineNr">524 </span> <span class="Delimiter">);</span>
<span id="L525" class="LineNr">525 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L526" class="LineNr">526 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 1/imm32' (combine rm32 with imm32 based on subop): missing base operand\n&quot;</span>
<span id="L527" class="LineNr">527 </span> <span class="Delimiter">);</span>
<span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
<span id="L529" class="LineNr">529 </span>
<span id="L530" class="LineNr">530 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L530'>test_check_missing_index_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L531" class="LineNr">531 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L532" class="LineNr">532 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L533" class="LineNr">533 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L534" class="LineNr">534 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 0/base 1/imm32\n&quot;</span>
<span id="L535" class="LineNr">535 </span> <span class="Delimiter">);</span>
<span id="L536" class="LineNr">536 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L537" class="LineNr">537 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 0/base 1/imm32' (combine rm32 with imm32 based on subop): missing index operand\n&quot;</span>
<span id="L538" class="LineNr">538 </span> <span class="Delimiter">);</span>
<span id="L539" class="LineNr">539 </span><span class="Delimiter">}</span>
<span id="L540" class="LineNr">540 </span>
<span id="L541" class="LineNr">541 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L541'>test_check_missing_base_operand_2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L542" class="LineNr">542 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L543" class="LineNr">543 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L544" class="LineNr">544 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L545" class="LineNr">545 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 2/index 3/scale 1/imm32\n&quot;</span>
<span id="L546" class="LineNr">546 </span> <span class="Delimiter">);</span>
<span id="L547" class="LineNr">547 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L548" class="LineNr">548 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 2/index 3/scale 1/imm32' (combine rm32 with imm32 based on subop): missing base operand\n&quot;</span>
<span id="L549" class="LineNr">549 </span> <span class="Delimiter">);</span>
<span id="L550" class="LineNr">550 </span><span class="Delimiter">}</span>
<span id="L551" class="LineNr">551 </span>
<span id="L552" class="LineNr">552 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L552'>test_check_extra_displacement</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L553" class="LineNr">553 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L554" class="LineNr">554 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L555" class="LineNr">555 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L556" class="LineNr">556 </span> <span class="Constant">&quot;89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 4/disp8\n&quot;</span>
<span id="L557" class="LineNr">557 </span> <span class="Delimiter">);</span>
<span id="L558" class="LineNr">558 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L559" class="LineNr">559 </span> <span class="Constant">&quot;error: '89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 4/disp8' (copy r32 to rm32): unexpected disp8 operand\n&quot;</span>
<span id="L560" class="LineNr">560 </span> <span class="Delimiter">);</span>
<span id="L561" class="LineNr">561 </span><span class="Delimiter">}</span>
<span id="L562" class="LineNr">562 </span>
<span id="L563" class="LineNr">563 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L563'>test_check_duplicate_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L564" class="LineNr">564 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L565" class="LineNr">565 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L566" class="LineNr">566 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L567" class="LineNr">567 </span> <span class="Constant">&quot;89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 1/r32\n&quot;</span>
<span id="L568" class="LineNr">568 </span> <span class="Delimiter">);</span>
<span id="L569" class="LineNr">569 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L570" class="LineNr">570 </span> <span class="Constant">&quot;error: '89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 1/r32': duplicate r32 operand\n&quot;</span>
<span id="L571" class="LineNr">571 </span> <span class="Delimiter">);</span>
<span id="L572" class="LineNr">572 </span><span class="Delimiter">}</span>
<span id="L573" class="LineNr">573 </span>
<span id="L574" class="LineNr">574 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L574'>test_check_base_operand_not_needed_in_direct_mode</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L575" class="LineNr">575 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L576" class="LineNr">576 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L577" class="LineNr">577 </span> <span class="Constant">&quot;81 0/add/subop 3/mod/indirect 4/rm32/use-sib 1/imm32\n&quot;</span>
<span id="L578" class="LineNr">578 </span> <span class="Delimiter">);</span>
<span id="L579" class="LineNr">579 </span> <a href='003trace.cc.html#L285'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L580" class="LineNr">580 </span><span class="Delimiter">}</span>
<span id="L581" class="LineNr">581 </span>
<span id="L582" class="LineNr">582 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L582'>test_extra_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L583" class="LineNr">583 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L584" class="LineNr">584 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L585" class="LineNr">585 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L586" class="LineNr">586 </span> <span class="Constant">&quot;59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP\n&quot;</span>
<span id="L587" class="LineNr">587 </span> <span class="Delimiter">);</span>
<span id="L588" class="LineNr">588 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L589" class="LineNr">589 </span> <span class="Constant">&quot;error: '59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP' (pop top of stack to ECX): unexpected modrm operand\n&quot;</span>
<span id="L590" class="LineNr">590 </span> <span class="Delimiter">);</span>
<span id="L591" class="LineNr">591 </span><span class="Delimiter">}</span>
<span id="L592" class="LineNr">592 </span>
<span id="L593" class="LineNr">593 </span><span class="SalientComment">//:: similarly handle multi-byte opcodes</span>
<span id="L594" class="LineNr">594 </span>
<span id="L595" class="LineNr">595 </span><span class="Normal">void</span> check_operands_0f<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L596" class="LineNr">596 </span> assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">);</span>
<span id="L597" class="LineNr">597 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L598" class="LineNr">598 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;opcode '0f' requires a second opcode\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L599" class="LineNr">599 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L600" class="LineNr">600 </span> <span class="Delimiter">}</span>
<span id="L601" class="LineNr">601 </span> <a href='011run.cc.html#L126'>word</a> op = <a href='031check_operands.cc.html#L41'>preprocess_op</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
<span id="L602" class="LineNr">602 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L603" class="LineNr">603 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;unknown 2-byte opcode '0f &quot;</span> &lt;&lt; op<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L604" class="LineNr">604 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L605" class="LineNr">605 </span> <span class="Delimiter">}</span>
<span id="L606" class="LineNr">606 </span> check_operands_0f<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L607" class="LineNr">607 </span><span class="Delimiter">}</span>
<span id="L608" class="LineNr">608 </span>
<span id="L609" class="LineNr">609 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L609'>check_operands_f3</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L610" class="LineNr">610 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;no supported opcodes starting with f3\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L611" class="LineNr">611 </span><span class="Delimiter">}</span>
<span id="L612" class="LineNr">612 </span>
<span id="L613" class="LineNr">613 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L613'>test_check_missing_disp32_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L614" class="LineNr">614 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L615" class="LineNr">615 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L616" class="LineNr">616 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L617" class="LineNr">617 </span> <span class="Constant">&quot; 0f 84 # jmp if ZF to ??\n&quot;</span>
<span id="L618" class="LineNr">618 </span> <span class="Delimiter">);</span>
<span id="L619" class="LineNr">619 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L620" class="LineNr">620 </span> <span class="Constant">&quot;error: '0f 84' (jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set): missing <a href='040---tests.cc.html#L84'>disp32</a> operand\n&quot;</span>
<span id="L621" class="LineNr">621 </span> <span class="Delimiter">);</span>
<span id="L622" class="LineNr">622 </span><span class="Delimiter">}</span>
<span id="L623" class="LineNr">623 </span>
<span id="L624" class="LineNr">624 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L625" class="LineNr">625 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">bitvector</span><span class="Comment">*/</span><span class="Normal">uint8_t</span>&gt; <span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">;</span>
<span id="L626" class="LineNr">626 </span><span class="Delimiter">:(before &quot;End Init Permitted Operands&quot;)</span>
<span id="L627" class="LineNr">627 </span><span class="SalientComment">//// Class D: just op and disp32</span>
<span id="L628" class="LineNr">628 </span><span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L629" class="LineNr">629 </span><span class="Comment">// 0 0 1 |0 0 0 0</span>
<span id="L630" class="LineNr">630 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L631" class="LineNr">631 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L632" class="LineNr">632 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L633" class="LineNr">633 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L634" class="LineNr">634 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L635" class="LineNr">635 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L636" class="LineNr">636 </span>
<span id="L637" class="LineNr">637 </span><span class="SalientComment">//// Class M: using ModR/M byte</span>
<span id="L638" class="LineNr">638 </span><span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L639" class="LineNr">639 </span><span class="Comment">// 0 0 0 |0 0 0 1</span>
<span id="L640" class="LineNr">640 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
<span id="L641" class="LineNr">641 </span>
<span id="L642" class="LineNr">642 </span><span class="Delimiter">:(code)</span>
<span id="L643" class="LineNr">643 </span><span class="Normal">void</span> check_operands_0f<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L644" class="LineNr">644 </span> <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L625'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L645" class="LineNr">645 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span>
<span id="L646" class="LineNr">646 </span> <a href='031check_operands.cc.html#L373'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L647" class="LineNr">647 </span> <a href='031check_operands.cc.html#L650'>compare_bitvector_0f</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> CLEAR<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">),</span> op<span class="Delimiter">);</span>
<span id="L648" class="LineNr">648 </span><span class="Delimiter">}</span>
<span id="L649" class="LineNr">649 </span>
<span id="L650" class="LineNr">650 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L650'>compare_bitvector_0f</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L651" class="LineNr">651 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L307'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L652" class="LineNr">652 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L297'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L653" class="LineNr">653 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L654" class="LineNr">654 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L655" class="LineNr">655 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L656" class="LineNr">656 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L657" class="LineNr">657 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L658" class="LineNr">658 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L659" class="LineNr">659 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L660" class="LineNr">660 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L668'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L661" class="LineNr">661 </span> <span class="Normal">else</span>
<span id="L662" class="LineNr">662 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L668'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L663" class="LineNr">663 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L664" class="LineNr">664 </span> <span class="Delimiter">}</span>
<span id="L665" class="LineNr">665 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L666" class="LineNr">666 </span><span class="Delimiter">}</span>
<span id="L667" class="LineNr">667 </span>
<span id="L668" class="LineNr">668 </span>string <a href='031check_operands.cc.html#L668'>maybe_name_0f</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L669" class="LineNr">669 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L670" class="LineNr">670 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L671" class="LineNr">671 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L672" class="LineNr">672 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L361'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L673" class="LineNr">673 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L674" class="LineNr">674 </span><span class="Delimiter">}</span>
<span id="L675" class="LineNr">675 </span>
<span id="L676" class="LineNr">676 </span>string <a href='031check_operands.cc.html#L676'>tolower</a><span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L677" class="LineNr">677 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L678" class="LineNr">678 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span> *s<span class="Delimiter">;</span> ++s<span class="Delimiter">)</span>
<span id="L679" class="LineNr">679 </span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><a href='031check_operands.cc.html#L676'>tolower</a><span class="Delimiter">(</span>*s<span class="Delimiter">));</span>
<span id="L680" class="LineNr">680 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L681" class="LineNr">681 </span><span class="Delimiter">}</span>
<span id="L682" class="LineNr">682 </span>
<span id="L683" class="LineNr">683 </span><span class="PreProc">#undef HAS</span>
<span id="L684" class="LineNr">684 </span><span class="PreProc">#undef SET</span>
<span id="L685" class="LineNr">685 </span><span class="PreProc">#undef CLEAR</span>
<span id="L686" class="LineNr">686 </span>
<span id="L687" class="LineNr">687 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L688" class="LineNr">688 </span><span class="PreProc">#include</span><span class="Constant">&lt;cctype&gt;</span>
<span id="L228" class="LineNr">228 </span>
<span id="L229" class="LineNr">229 </span> <span class="SalientComment">//// Class N: op, ModR/M and subop (not r32)</span>
<span id="L230" class="LineNr">230 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L231" class="LineNr">231 </span> <span class="Comment">// 0 0 0 |0 0 1 1</span>
<span id="L232" class="LineNr">232 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// pop</span>
<span id="L233" class="LineNr">233 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;d3&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// shift</span>
<span id="L234" class="LineNr">234 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f7&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// test/not/mul/div</span>
<span id="L235" class="LineNr">235 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x03</span><span class="Delimiter">);</span> <span class="Comment">// jump/push/call</span>
<span id="L236" class="LineNr">236 </span>
<span id="L237" class="LineNr">237 </span> <span class="SalientComment">//// Class O: op, ModR/M, subop (not r32) and imm8</span>
<span id="L238" class="LineNr">238 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L239" class="LineNr">239 </span> <span class="Comment">// 0 1 0 |0 0 1 1</span>
<span id="L240" class="LineNr">240 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c1&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x23</span><span class="Delimiter">);</span> <span class="Comment">// combine</span>
<span id="L241" class="LineNr">241 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x23</span><span class="Delimiter">);</span> <span class="Comment">// copy</span>
<span id="L242" class="LineNr">242 </span>
<span id="L243" class="LineNr">243 </span> <span class="SalientComment">//// Class P: op, ModR/M, subop (not r32) and imm32</span>
<span id="L244" class="LineNr">244 </span> <span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L245" class="LineNr">245 </span> <span class="Comment">// 1 0 0 |0 0 1 1</span>
<span id="L246" class="LineNr">246 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;81&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x43</span><span class="Delimiter">);</span> <span class="Comment">// combine</span>
<span id="L247" class="LineNr">247 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c7&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x43</span><span class="Delimiter">);</span> <span class="Comment">// copy</span>
<span id="L248" class="LineNr">248 </span>
<span id="L249" class="LineNr">249 </span> <span class="Comment">// End Init Permitted Operands</span>
<span id="L250" class="LineNr">250 </span><span class="Delimiter">}</span>
<span id="L251" class="LineNr">251 </span>
<span id="L252" class="LineNr">252 </span><span class="PreProc">#define HAS(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) &amp; (</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit)))</span>
<span id="L253" class="LineNr">253 </span><span class="PreProc">#define SET(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) | (</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit)))</span>
<span id="L254" class="LineNr">254 </span><span class="PreProc">#define CLEAR(bitvector</span><span class="Delimiter">,</span><span class="PreProc"> bit) ((bitvector) &amp; (~(</span><span class="Constant">1</span><span class="PreProc"> &lt;&lt; (bit))))</span>
<span id="L255" class="LineNr">255 </span>
<span id="L256" class="LineNr">256 </span><span class="Normal">void</span> check_operands<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L257" class="LineNr">257 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L259" class="LineNr">259 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L260" class="LineNr">260 </span> <a href='031check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L261" class="LineNr">261 </span> <a href='031check_operands.cc.html#L398'>compare_bitvector_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span> <span class="Delimiter">}</span>
<span id="L263" class="LineNr">263 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L264" class="LineNr">264 </span> <a href='031check_operands.cc.html#L270'>compare_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span> <span class="Delimiter">}</span>
<span id="L266" class="LineNr">266 </span><span class="Delimiter">}</span>
<span id="L267" class="LineNr">267 </span>
<span id="L268" class="LineNr">268 </span><span class="Comment">//: Many instructions can be checked just by comparing bitvectors.</span>
<span id="L269" class="LineNr">269 </span>
<span id="L270" class="LineNr">270 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L270'>compare_bitvector</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L306'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L272" class="LineNr">272 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L273" class="LineNr">273 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L275" class="LineNr">275 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L276" class="LineNr">276 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L277" class="LineNr">277 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L278" class="LineNr">278 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L279" class="LineNr">279 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L280" class="LineNr">280 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L281" class="LineNr">281 </span> <span class="Normal">else</span>
<span id="L282" class="LineNr">282 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L283" class="LineNr">283 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L284" class="LineNr">284 </span> <span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L286" class="LineNr">286 </span><span class="Delimiter">}</span>
<span id="L287" class="LineNr">287 </span>
<span id="L288" class="LineNr">288 </span>string <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L291" class="LineNr">291 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L292" class="LineNr">292 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L293" class="LineNr">293 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span>
<span id="L295" class="LineNr">295 </span>
<span id="L296" class="LineNr">296 </span><span class="Normal">uint32_t</span> <a href='031check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L297" class="LineNr">297 </span> set&lt;string&gt; operands_found<span class="Delimiter">;</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">uint32_t</span> bitvector = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L299" class="LineNr">299 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip op</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L300" class="LineNr">300 </span> bitvector = bitvector | <a href='031check_operands.cc.html#L323'>expected_bit_for_received_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> operands_found<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
<span id="L301" class="LineNr">301 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L302" class="LineNr">302 </span> <span class="Delimiter">}</span>
<span id="L303" class="LineNr">303 </span> <span class="Identifier">return</span> bitvector<span class="Delimiter">;</span>
<span id="L304" class="LineNr">304 </span><span class="Delimiter">}</span>
<span id="L305" class="LineNr">305 </span>
<span id="L306" class="LineNr">306 </span><span class="Normal">bool</span> <a href='031check_operands.cc.html#L306'>has_operands</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">)</span> &gt; <a href='031check_operands.cc.html#L310'>first_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span>
<span id="L309" class="LineNr">309 </span>
<span id="L310" class="LineNr">310 </span><span class="Normal">int</span> <a href='031check_operands.cc.html#L310'>first_operand</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L311" class="LineNr">311 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L312" class="LineNr">312 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f2&quot;</span> || inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f3&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L313" class="LineNr">313 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span>
<span id="L314" class="LineNr">314 </span> <span class="Identifier">return</span> <span class="Constant">3</span><span class="Delimiter">;</span>
<span id="L315" class="LineNr">315 </span> <span class="Normal">else</span>
<span id="L316" class="LineNr">316 </span> <span class="Identifier">return</span> <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L317" class="LineNr">317 </span> <span class="Delimiter">}</span>
<span id="L318" class="LineNr">318 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L319" class="LineNr">319 </span><span class="Delimiter">}</span>
<span id="L320" class="LineNr">320 </span>
<span id="L321" class="LineNr">321 </span><span class="Comment">// Scan the metadata of 'w' and return the expected bit corresponding to any operand type.</span>
<span id="L322" class="LineNr">322 </span><span class="Comment">// Also raise an error if metadata contains multiple operand types.</span>
<span id="L323" class="LineNr">323 </span><span class="Normal">uint32_t</span> <a href='031check_operands.cc.html#L323'>expected_bit_for_received_operand</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">,</span> set&lt;string&gt;&amp; instruction_operands<span class="Delimiter">,</span> <span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L324" class="LineNr">324 </span> <span class="Normal">uint32_t</span> bv = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L325" class="LineNr">325 </span> <span class="Normal">bool</span> found = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L326" class="LineNr">326 </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#L165'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L327" class="LineNr">327 </span> string<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> curr = w<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L328" class="LineNr">328 </span> string expected_metadata = curr<span class="Delimiter">;</span>
<span id="L329" class="LineNr">329 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">&quot;mod&quot;</span> || curr == <span class="Constant">&quot;rm32&quot;</span> || curr == <span class="Constant">&quot;r32&quot;</span> || curr == <span class="Constant">&quot;scale&quot;</span> || curr == <span class="Constant">&quot;index&quot;</span> || curr == <span class="Constant">&quot;base&quot;</span><span class="Delimiter">)</span>
<span id="L330" class="LineNr">330 </span> expected_metadata = <span class="Constant">&quot;modrm&quot;</span><span class="Delimiter">;</span>
<span id="L331" class="LineNr">331 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L80'>Operand_type</a></span><span class="Delimiter">,</span> curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// ignore unrecognized metadata</span>
<span id="L332" class="LineNr">332 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>found<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' has conflicting operand types; it should have only one\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L334" class="LineNr">334 </span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <span class="Delimiter">}</span>
<span id="L336" class="LineNr">336 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>instruction_operands<span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> != instruction_operands<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L337" class="LineNr">337 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': duplicate &quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L338" class="LineNr">338 </span> <span class="Identifier">return</span> <a href='031check_operands.cc.html#L100'>INVALID_OPERANDS</a><span class="Delimiter">;</span>
<span id="L339" class="LineNr">339 </span> <span class="Delimiter">}</span>
<span id="L340" class="LineNr">340 </span> instruction_operands<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L341" class="LineNr">341 </span> bv = <span class="Delimiter">(</span><span class="Constant">1</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L80'>Operand_type</a></span><span class="Delimiter">,</span> expected_metadata<span class="Delimiter">));</span>
<span id="L342" class="LineNr">342 </span> found = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L343" class="LineNr">343 </span> <span class="Delimiter">}</span>
<span id="L344" class="LineNr">344 </span> <span class="Identifier">return</span> bv<span class="Delimiter">;</span>
<span id="L345" class="LineNr">345 </span><span class="Delimiter">}</span>
<span id="L346" class="LineNr">346 </span>
<span id="L347" class="LineNr">347 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L347'>test_conflicting_operand_type</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L348" class="LineNr">348 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L349" class="LineNr">349 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L350" class="LineNr">350 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L351" class="LineNr">351 </span> <span class="Constant">&quot;cd/software-interrupt 80/imm8/imm32\n&quot;</span>
<span id="L352" class="LineNr">352 </span> <span class="Delimiter">);</span>
<span id="L353" class="LineNr">353 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L354" class="LineNr">354 </span> <span class="Constant">&quot;error: '80/imm8/imm32' has conflicting operand types; it should have only one\n&quot;</span>
<span id="L355" class="LineNr">355 </span> <span class="Delimiter">);</span>
<span id="L356" class="LineNr">356 </span><span class="Delimiter">}</span>
<span id="L357" class="LineNr">357 </span>
<span id="L358" class="LineNr">358 </span><span class="Comment">//: Instructions computing effective addresses have more complex rules, so</span>
<span id="L359" class="LineNr">359 </span><span class="Comment">//: we'll hard-code a common set of instruction-decoding rules.</span>
<span id="L360" class="LineNr">360 </span>
<span id="L361" class="LineNr">361 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L361'>test_check_missing_mod_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L362" class="LineNr">362 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L363" class="LineNr">363 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L364" class="LineNr">364 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L365" class="LineNr">365 </span> <span class="Constant">&quot;81 0/add/subop 3/rm32/ebx 1/imm32\n&quot;</span>
<span id="L366" class="LineNr">366 </span> <span class="Delimiter">);</span>
<span id="L367" class="LineNr">367 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L368" class="LineNr">368 </span> <span class="Constant">&quot;error: '81 0/add/subop 3/rm32/ebx 1/imm32' (combine rm32 with imm32 based on subop): missing mod operand\n&quot;</span>
<span id="L369" class="LineNr">369 </span> <span class="Delimiter">);</span>
<span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
<span id="L371" class="LineNr">371 </span>
<span id="L372" class="LineNr">372 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L374" class="LineNr">374 </span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L375" class="LineNr">375 </span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L376" class="LineNr">376 </span> <span class="Comment">// no check for r32; some instructions don't use it; just assume it's 0 if missing</span>
<span id="L377" class="LineNr">377 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>op<span class="Delimiter">.</span>data == <span class="Constant">&quot;81&quot;</span> || op<span class="Delimiter">.</span>data == <span class="Constant">&quot;8f&quot;</span> || op<span class="Delimiter">.</span>data == <span class="Constant">&quot;ff&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// keep sync'd with 'help subop'</span>
<span id="L378" class="LineNr">378 </span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;subop&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L379" class="LineNr">379 </span> <a href='031check_operands.cc.html#L437'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;r32&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;should be replaced by subop&quot;</span><span class="Delimiter">);</span>
<span id="L380" class="LineNr">380 </span> <span class="Delimiter">}</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data != <span class="Constant">&quot;4&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L383" class="LineNr">383 </span> <span class="Comment">// SIB byte checks</span>
<span id="L384" class="LineNr">384 </span> <span class="Normal">uint8_t</span> mod = <a href='011run.cc.html#L302'>hex_byte</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L385" class="LineNr">385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>mod != <span class="Comment">/*</span><span class="Comment">direct</span><span class="Comment">*/</span><span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L386" class="LineNr">386 </span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;base&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L387" class="LineNr">387 </span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span> <span class="Comment">// otherwise why go to SIB?</span>
<span id="L388" class="LineNr">388 </span> <span class="Delimiter">}</span>
<span id="L389" class="LineNr">389 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L390" class="LineNr">390 </span> <a href='031check_operands.cc.html#L437'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;base&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;direct mode&quot;</span><span class="Delimiter">);</span>
<span id="L391" class="LineNr">391 </span> <a href='031check_operands.cc.html#L437'>check_operand_metadata_absent</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">,</span> <span class="Constant">&quot;direct mode&quot;</span><span class="Delimiter">);</span>
<span id="L392" class="LineNr">392 </span> <span class="Delimiter">}</span>
<span id="L393" class="LineNr">393 </span> <span class="Comment">// no check for scale; 0 (2**0 = 1) by default</span>
<span id="L394" class="LineNr">394 </span><span class="Delimiter">}</span>
<span id="L395" class="LineNr">395 </span>
<span id="L396" class="LineNr">396 </span><span class="Comment">// same as compare_bitvector, with one additional exception for modrm-based</span>
<span id="L397" class="LineNr">397 </span><span class="Comment">// instructions: they may use an extra displacement on occasion</span>
<span id="L398" class="LineNr">398 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L398'>compare_bitvector_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L399" class="LineNr">399 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L306'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L400" class="LineNr">400 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L401" class="LineNr">401 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L402" class="LineNr">402 </span> <span class="Comment">// update 'expected' bitvector for the additional exception</span>
<span id="L403" class="LineNr">403 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L404" class="LineNr">404 </span> <span class="Normal">int32_t</span> mod = <a href='011run.cc.html#L448'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L405" class="LineNr">405 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>mod<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L406" class="LineNr">406 </span> <span class="Normal">case</span> <span class="Constant">0</span>:
<span id="L407" class="LineNr">407 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">)</span> &amp;&amp; <a href='011run.cc.html#L448'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">)</span> == <span class="Constant">5</span><span class="Delimiter">)</span>
<span id="L408" class="LineNr">408 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP32<span class="Delimiter">);</span>
<span id="L409" class="LineNr">409 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L410" class="LineNr">410 </span> <span class="Normal">case</span> <span class="Constant">1</span>:
<span id="L411" class="LineNr">411 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP8<span class="Delimiter">);</span>
<span id="L412" class="LineNr">412 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L413" class="LineNr">413 </span> <span class="Normal">case</span> <span class="Constant">2</span>:
<span id="L414" class="LineNr">414 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP32<span class="Delimiter">);</span>
<span id="L415" class="LineNr">415 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L416" class="LineNr">416 </span> <span class="Delimiter">}</span>
<span id="L417" class="LineNr">417 </span> <span class="Delimiter">}</span>
<span id="L418" class="LineNr">418 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L419" class="LineNr">419 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L420" class="LineNr">420 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing for modrm &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L421" class="LineNr">421 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L422" class="LineNr">422 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L423" class="LineNr">423 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L424" class="LineNr">424 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L425" class="LineNr">425 </span> <span class="Normal">else</span>
<span id="L426" class="LineNr">426 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L427" class="LineNr">427 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L428" class="LineNr">428 </span> <span class="Delimiter">}</span>
<span id="L429" class="LineNr">429 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span>
<span id="L431" class="LineNr">431 </span>
<span id="L432" class="LineNr">432 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L432'>check_operand_metadata_present</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L433" class="LineNr">433 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> type<span class="Delimiter">))</span>
<span id="L434" class="LineNr">434 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; type &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L435" class="LineNr">435 </span><span class="Delimiter">}</span>
<span id="L436" class="LineNr">436 </span>
<span id="L437" class="LineNr">437 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L437'>check_operand_metadata_absent</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; msg<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> type<span class="Delimiter">))</span>
<span id="L439" class="LineNr">439 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; type &lt;&lt; <span class="Constant">&quot; operand (&quot;</span> &lt;&lt; msg &lt;&lt; <span class="Constant">&quot;)\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L440" class="LineNr">440 </span><span class="Delimiter">}</span>
<span id="L441" class="LineNr">441 </span>
<span id="L442" class="LineNr">442 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L442'>test_modrm_with_displacement</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L443" class="LineNr">443 </span> <span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L444" class="LineNr">444 </span> transform<span class="Delimiter">(</span>
<span id="L445" class="LineNr">445 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L446" class="LineNr">446 </span> <span class="Comment">// just avoid null pointer</span>
<span id="L447" class="LineNr">447 </span> <span class="Constant">&quot;8b/copy 1/mod/lookup+disp8 0/rm32/EAX 2/r32/EDX 4/disp8\n&quot;</span> <span class="Comment">// copy *(EAX+4) to EDX</span>
<span id="L448" class="LineNr">448 </span> <span class="Delimiter">);</span>
<span id="L449" class="LineNr">449 </span> <a href='003trace.cc.html#L285'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L450" class="LineNr">450 </span><span class="Delimiter">}</span>
<span id="L451" class="LineNr">451 </span>
<span id="L452" class="LineNr">452 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L452'>test_check_missing_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L453" class="LineNr">453 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L454" class="LineNr">454 </span> transform<span class="Delimiter">(</span>
<span id="L455" class="LineNr">455 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L456" class="LineNr">456 </span> <span class="Constant">&quot;89/copy 1/mod/lookup+disp8 0/rm32/EAX 1/r32/ECX\n&quot;</span> <span class="Comment">// missing disp8</span>
<span id="L457" class="LineNr">457 </span> <span class="Delimiter">);</span>
<span id="L458" class="LineNr">458 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L459" class="LineNr">459 </span> <span class="Constant">&quot;error: '89/copy 1/mod/lookup+disp8 0/rm32/EAX 1/r32/ECX' (copy r32 to rm32): missing disp8 operand\n&quot;</span>
<span id="L460" class="LineNr">460 </span> <span class="Delimiter">);</span>
<span id="L461" class="LineNr">461 </span><span class="Delimiter">}</span>
<span id="L462" class="LineNr">462 </span>
<span id="L463" class="LineNr">463 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L463'>test_check_missing_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L464" class="LineNr">464 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L465" class="LineNr">465 </span> transform<span class="Delimiter">(</span>
<span id="L466" class="LineNr">466 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L467" class="LineNr">467 </span> <span class="Constant">&quot;8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX\n&quot;</span> <span class="Comment">// missing disp32</span>
<span id="L468" class="LineNr">468 </span> <span class="Delimiter">);</span>
<span id="L469" class="LineNr">469 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L470" class="LineNr">470 </span> <span class="Constant">&quot;error: '8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX' (copy rm32 to r32): missing <a href='040---tests.cc.html#L84'>disp32</a> operand\n&quot;</span>
<span id="L471" class="LineNr">471 </span> <span class="Delimiter">);</span>
<span id="L472" class="LineNr">472 </span><span class="Delimiter">}</span>
<span id="L473" class="LineNr">473 </span>
<span id="L474" class="LineNr">474 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L474'>test_conflicting_operands_in_modrm_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L475" class="LineNr">475 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L476" class="LineNr">476 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L477" class="LineNr">477 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L478" class="LineNr">478 </span> <span class="Constant">&quot;01/add 0/mod 3/mod\n&quot;</span>
<span id="L479" class="LineNr">479 </span> <span class="Delimiter">);</span>
<span id="L480" class="LineNr">480 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L481" class="LineNr">481 </span> <span class="Constant">&quot;error: '01/add 0/mod 3/mod' has conflicting mod operands\n&quot;</span>
<span id="L482" class="LineNr">482 </span> <span class="Delimiter">);</span>
<span id="L483" class="LineNr">483 </span><span class="Delimiter">}</span>
<span id="L484" class="LineNr">484 </span>
<span id="L485" class="LineNr">485 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L485'>test_conflicting_operand_type_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L486" class="LineNr">486 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L487" class="LineNr">487 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L488" class="LineNr">488 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L489" class="LineNr">489 </span> <span class="Constant">&quot;01/add 0/mod 3/rm32/r32\n&quot;</span>
<span id="L490" class="LineNr">490 </span> <span class="Delimiter">);</span>
<span id="L491" class="LineNr">491 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L492" class="LineNr">492 </span> <span class="Constant">&quot;error: '3/rm32/r32' has conflicting operand types; it should have only one\n&quot;</span>
<span id="L493" class="LineNr">493 </span> <span class="Delimiter">);</span>
<span id="L494" class="LineNr">494 </span><span class="Delimiter">}</span>
<span id="L495" class="LineNr">495 </span>
<span id="L496" class="LineNr">496 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L496'>test_check_missing_rm32_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L497" class="LineNr">497 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L498" class="LineNr">498 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L499" class="LineNr">499 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L500" class="LineNr">500 </span> <span class="Constant">&quot;81 0/add/subop 0/mod 1/imm32\n&quot;</span>
<span id="L501" class="LineNr">501 </span> <span class="Delimiter">);</span>
<span id="L502" class="LineNr">502 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L503" class="LineNr">503 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod 1/imm32' (combine rm32 with imm32 based on subop): missing rm32 operand\n&quot;</span>
<span id="L504" class="LineNr">504 </span> <span class="Delimiter">);</span>
<span id="L505" class="LineNr">505 </span><span class="Delimiter">}</span>
<span id="L506" class="LineNr">506 </span>
<span id="L507" class="LineNr">507 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L507'>test_check_missing_subop_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L508" class="LineNr">508 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L509" class="LineNr">509 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L510" class="LineNr">510 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L511" class="LineNr">511 </span> <span class="Constant">&quot;81 0/mod 3/rm32/ebx 1/imm32\n&quot;</span>
<span id="L512" class="LineNr">512 </span> <span class="Delimiter">);</span>
<span id="L513" class="LineNr">513 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L514" class="LineNr">514 </span> <span class="Constant">&quot;error: '81 0/mod 3/rm32/ebx 1/imm32' (combine rm32 with imm32 based on subop): missing subop operand\n&quot;</span>
<span id="L515" class="LineNr">515 </span> <span class="Delimiter">);</span>
<span id="L516" class="LineNr">516 </span><span class="Delimiter">}</span>
<span id="L517" class="LineNr">517 </span>
<span id="L518" class="LineNr">518 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L518'>test_check_missing_base_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L519" class="LineNr">519 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L520" class="LineNr">520 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L521" class="LineNr">521 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L522" class="LineNr">522 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 1/imm32\n&quot;</span>
<span id="L523" class="LineNr">523 </span> <span class="Delimiter">);</span>
<span id="L524" class="LineNr">524 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L525" class="LineNr">525 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 1/imm32' (combine rm32 with imm32 based on subop): missing base operand\n&quot;</span>
<span id="L526" class="LineNr">526 </span> <span class="Delimiter">);</span>
<span id="L527" class="LineNr">527 </span><span class="Delimiter">}</span>
<span id="L528" class="LineNr">528 </span>
<span id="L529" class="LineNr">529 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L529'>test_check_missing_index_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L530" class="LineNr">530 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L531" class="LineNr">531 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L532" class="LineNr">532 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L533" class="LineNr">533 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 0/base 1/imm32\n&quot;</span>
<span id="L534" class="LineNr">534 </span> <span class="Delimiter">);</span>
<span id="L535" class="LineNr">535 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L536" class="LineNr">536 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 0/base 1/imm32' (combine rm32 with imm32 based on subop): missing index operand\n&quot;</span>
<span id="L537" class="LineNr">537 </span> <span class="Delimiter">);</span>
<span id="L538" class="LineNr">538 </span><span class="Delimiter">}</span>
<span id="L539" class="LineNr">539 </span>
<span id="L540" class="LineNr">540 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L540'>test_check_missing_base_operand_2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L541" class="LineNr">541 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L542" class="LineNr">542 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L543" class="LineNr">543 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L544" class="LineNr">544 </span> <span class="Constant">&quot;81 0/add/subop 0/mod/indirect 4/rm32/use-sib 2/index 3/scale 1/imm32\n&quot;</span>
<span id="L545" class="LineNr">545 </span> <span class="Delimiter">);</span>
<span id="L546" class="LineNr">546 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L547" class="LineNr">547 </span> <span class="Constant">&quot;error: '81 0/add/subop 0/mod/indirect 4/rm32/use-sib 2/index 3/scale 1/imm32' (combine rm32 with imm32 based on subop): missing base operand\n&quot;</span>
<span id="L548" class="LineNr">548 </span> <span class="Delimiter">);</span>
<span id="L549" class="LineNr">549 </span><span class="Delimiter">}</span>
<span id="L550" class="LineNr">550 </span>
<span id="L551" class="LineNr">551 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L551'>test_check_extra_displacement</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L552" class="LineNr">552 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L553" class="LineNr">553 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L554" class="LineNr">554 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L555" class="LineNr">555 </span> <span class="Constant">&quot;89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 4/disp8\n&quot;</span>
<span id="L556" class="LineNr">556 </span> <span class="Delimiter">);</span>
<span id="L557" class="LineNr">557 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L558" class="LineNr">558 </span> <span class="Constant">&quot;error: '89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 4/disp8' (copy r32 to rm32): unexpected disp8 operand\n&quot;</span>
<span id="L559" class="LineNr">559 </span> <span class="Delimiter">);</span>
<span id="L560" class="LineNr">560 </span><span class="Delimiter">}</span>
<span id="L561" class="LineNr">561 </span>
<span id="L562" class="LineNr">562 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L562'>test_check_duplicate_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L563" class="LineNr">563 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L564" class="LineNr">564 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L565" class="LineNr">565 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L566" class="LineNr">566 </span> <span class="Constant">&quot;89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 1/r32\n&quot;</span>
<span id="L567" class="LineNr">567 </span> <span class="Delimiter">);</span>
<span id="L568" class="LineNr">568 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L569" class="LineNr">569 </span> <span class="Constant">&quot;error: '89/copy 0/mod/indirect 0/rm32/EAX 1/r32/ECX 1/r32': duplicate r32 operand\n&quot;</span>
<span id="L570" class="LineNr">570 </span> <span class="Delimiter">);</span>
<span id="L571" class="LineNr">571 </span><span class="Delimiter">}</span>
<span id="L572" class="LineNr">572 </span>
<span id="L573" class="LineNr">573 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L573'>test_check_base_operand_not_needed_in_direct_mode</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L574" class="LineNr">574 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L575" class="LineNr">575 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L576" class="LineNr">576 </span> <span class="Constant">&quot;81 0/add/subop 3/mod/indirect 4/rm32/use-sib 1/imm32\n&quot;</span>
<span id="L577" class="LineNr">577 </span> <span class="Delimiter">);</span>
<span id="L578" class="LineNr">578 </span> <a href='003trace.cc.html#L285'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L579" class="LineNr">579 </span><span class="Delimiter">}</span>
<span id="L580" class="LineNr">580 </span>
<span id="L581" class="LineNr">581 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L581'>test_extra_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L582" class="LineNr">582 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L583" class="LineNr">583 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L584" class="LineNr">584 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L585" class="LineNr">585 </span> <span class="Constant">&quot;59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP\n&quot;</span>
<span id="L586" class="LineNr">586 </span> <span class="Delimiter">);</span>
<span id="L587" class="LineNr">587 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L588" class="LineNr">588 </span> <span class="Constant">&quot;error: '59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP' (pop top of stack to ECX): unexpected modrm operand\n&quot;</span>
<span id="L589" class="LineNr">589 </span> <span class="Delimiter">);</span>
<span id="L590" class="LineNr">590 </span><span class="Delimiter">}</span>
<span id="L591" class="LineNr">591 </span>
<span id="L592" class="LineNr">592 </span><span class="SalientComment">//:: similarly handle multi-byte opcodes</span>
<span id="L593" class="LineNr">593 </span>
<span id="L594" class="LineNr">594 </span><span class="Normal">void</span> check_operands_0f<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L595" class="LineNr">595 </span> assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">);</span>
<span id="L596" class="LineNr">596 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L597" class="LineNr">597 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;opcode '0f' requires a second opcode\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L598" class="LineNr">598 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L599" class="LineNr">599 </span> <span class="Delimiter">}</span>
<span id="L600" class="LineNr">600 </span> <a href='011run.cc.html#L126'>word</a> op = <a href='031check_operands.cc.html#L41'>preprocess_op</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
<span id="L601" class="LineNr">601 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L602" class="LineNr">602 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;unknown 2-byte opcode '0f &quot;</span> &lt;&lt; op<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L603" class="LineNr">603 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L604" class="LineNr">604 </span> <span class="Delimiter">}</span>
<span id="L605" class="LineNr">605 </span> check_operands_0f<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L606" class="LineNr">606 </span><span class="Delimiter">}</span>
<span id="L607" class="LineNr">607 </span>
<span id="L608" class="LineNr">608 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L608'>check_operands_f3</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L609" class="LineNr">609 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;no supported opcodes starting with f3\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L610" class="LineNr">610 </span><span class="Delimiter">}</span>
<span id="L611" class="LineNr">611 </span>
<span id="L612" class="LineNr">612 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L612'>test_check_missing_disp32_operand</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L613" class="LineNr">613 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L614" class="LineNr">614 </span> <a href='011run.cc.html#L85'>run</a><span class="Delimiter">(</span>
<span id="L615" class="LineNr">615 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L616" class="LineNr">616 </span> <span class="Constant">&quot; 0f 84 # jmp if ZF to ??\n&quot;</span>
<span id="L617" class="LineNr">617 </span> <span class="Delimiter">);</span>
<span id="L618" class="LineNr">618 </span> <a href='003trace.cc.html#L281'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L619" class="LineNr">619 </span> <span class="Constant">&quot;error: '0f 84' (jump <a href='040---tests.cc.html#L84'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L83'>ZF</a> is set): missing <a href='040---tests.cc.html#L84'>disp32</a> operand\n&quot;</span>
<span id="L620" class="LineNr">620 </span> <span class="Delimiter">);</span>
<span id="L621" class="LineNr">621 </span><span class="Delimiter">}</span>
<span id="L622" class="LineNr">622 </span>
<span id="L623" class="LineNr">623 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L624" class="LineNr">624 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">bitvector</span><span class="Comment">*/</span><span class="Normal">uint8_t</span>&gt; <span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">;</span>
<span id="L625" class="LineNr">625 </span><span class="Delimiter">:(before &quot;End Init Permitted Operands&quot;)</span>
<span id="L626" class="LineNr">626 </span><span class="SalientComment">//// Class D: just op and disp32</span>
<span id="L627" class="LineNr">627 </span><span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L628" class="LineNr">628 </span><span class="Comment">// 0 0 1 |0 0 0 0</span>
<span id="L629" class="LineNr">629 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L630" class="LineNr">630 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L631" class="LineNr">631 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L632" class="LineNr">632 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L633" class="LineNr">633 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L634" class="LineNr">634 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L635" class="LineNr">635 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L636" class="LineNr">636 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L637" class="LineNr">637 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L638" class="LineNr">638 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L639" class="LineNr">639 </span>
<span id="L640" class="LineNr">640 </span><span class="SalientComment">//// Class M: using ModR/M byte</span>
<span id="L641" class="LineNr">641 </span><span class="Comment">// imm32 imm8 disp32 |disp16 disp8 subop modrm</span>
<span id="L642" class="LineNr">642 </span><span class="Comment">// 0 0 0 |0 0 0 1</span>
<span id="L643" class="LineNr">643 </span><a href='001help.cc.html#L261'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
<span id="L644" class="LineNr">644 </span>
<span id="L645" class="LineNr">645 </span><span class="Delimiter">:(code)</span>
<span id="L646" class="LineNr">646 </span><span class="Normal">void</span> check_operands_0f<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L647" class="LineNr">647 </span> <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='031check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L648" class="LineNr">648 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span>
<span id="L649" class="LineNr">649 </span> <a href='031check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L650" class="LineNr">650 </span> <a href='031check_operands.cc.html#L653'>compare_bitvector_0f</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> CLEAR<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='031check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">),</span> op<span class="Delimiter">);</span>
<span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span>
<span id="L652" class="LineNr">652 </span>
<span id="L653" class="LineNr">653 </span><span class="Normal">void</span> <a href='031check_operands.cc.html#L653'>compare_bitvector_0f</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L654" class="LineNr">654 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L416'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='031check_operands.cc.html#L306'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L655" class="LineNr">655 </span> <span class="Normal">uint8_t</span> bitvector = <a href='031check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L656" class="LineNr">656 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L253'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L657" class="LineNr">657 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
<span id="L658" class="LineNr">658 </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='031check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L659" class="LineNr">659 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;comparing &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
<span id="L660" class="LineNr">660 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// all good with this operand</span>
<span id="L661" class="LineNr">661 </span> <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='031check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L662" class="LineNr">662 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
<span id="L663" class="LineNr">663 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L671'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L664" class="LineNr">664 </span> <span class="Normal">else</span>
<span id="L665" class="LineNr">665 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='031check_operands.cc.html#L671'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L666" class="LineNr">666 </span> <span class="Comment">// continue giving all errors for a single instruction</span>
<span id="L667" class="LineNr">667 </span> <span class="Delimiter">}</span>
<span id="L668" class="LineNr">668 </span> <span class="Comment">// ignore settings in any unused bits</span>
<span id="L669" class="LineNr">669 </span><span class="Delimiter">}</span>
<span id="L670" class="LineNr">670 </span>
<span id="L671" class="LineNr">671 </span>string <a href='031check_operands.cc.html#L671'>maybe_name_0f</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L672" class="LineNr">672 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L673" class="LineNr">673 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L674" class="LineNr">674 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L675" class="LineNr">675 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L356'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L676" class="LineNr">676 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L677" class="LineNr">677 </span><span class="Delimiter">}</span>
<span id="L678" class="LineNr">678 </span>
<span id="L679" class="LineNr">679 </span>string <a href='031check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L680" class="LineNr">680 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L681" class="LineNr">681 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span> *s<span class="Delimiter">;</span> ++s<span class="Delimiter">)</span>
<span id="L682" class="LineNr">682 </span> out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><a href='031check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span>*s<span class="Delimiter">));</span>
<span id="L683" class="LineNr">683 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L684" class="LineNr">684 </span><span class="Delimiter">}</span>
<span id="L685" class="LineNr">685 </span>
<span id="L686" class="LineNr">686 </span><span class="PreProc">#undef HAS</span>
<span id="L687" class="LineNr">687 </span><span class="PreProc">#undef SET</span>
<span id="L688" class="LineNr">688 </span><span class="PreProc">#undef CLEAR</span>
<span id="L689" class="LineNr">689 </span>
<span id="L690" class="LineNr">690 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L691" class="LineNr">691 </span><span class="PreProc">#include</span><span class="Constant">&lt;cctype&gt;</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/032check_operand_bounds.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,14 +14,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.Constant { color: #008787; }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.cSpecial { color: #008000; }
.SalientComment { color: #0000af; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -95,7 +95,7 @@ if ('onhashchange' in window) {
<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#L165'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L112'>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#L112'>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='031check_operands.cc.html#L311'>first_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span> j &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span> ++j<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='031check_operands.cc.html#L310'>first_operand</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span> j &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>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#L121'>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#L253'>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>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/034compute_segment_address.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
-->
</style>
@ -37,7 +37,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -96,7 +96,7 @@ if ('onhashchange' in window) {
<span id="L38" class="LineNr">38 </span> <span class="Comment">// valid address for user space, so assume we're creating a real ELF binary, not just running a test</span>
<span id="L39" class="LineNr">39 </span> curr<span class="Delimiter">.</span>start &amp;= <span class="Constant">0xfffff000</span><span class="Delimiter">;</span> <span class="Comment">// same number of zeros as the p_align used when emitting the ELF binary</span>
<span id="L40" class="LineNr">40 </span> curr<span class="Delimiter">.</span>start |= p_offset<span class="Delimiter">;</span>
<span id="L41" class="LineNr">41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; begins at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; curr<span class="Delimiter">.</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr">41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; begins at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; curr<span class="Delimiter">.</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L42" class="LineNr">42 </span> <span class="Delimiter">}</span>
<span id="L43" class="LineNr">43 </span> p_offset += size_of<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L44" class="LineNr">44 </span> assert<span class="Delimiter">(</span>p_offset &lt; <a href='010---vm.cc.html#L92'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span> <span class="Comment">// for now we get less and less available space in each successive segment</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/035labels.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -198,7 +198,7 @@ if ('onhashchange' in window) {
<span id="L139" class="LineNr">139 </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#L165'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L112'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L140" class="LineNr">140 </span> <span class="Normal">const</span> line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L112'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L141" class="LineNr">141 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='035labels.cc.html#L190'>Source_lines_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">()</span> &amp;&amp; !inst<span class="Delimiter">.</span>original<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; <span class="Comment">/*</span><span class="Comment">not a label</span><span class="Comment">*/</span> *inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">':'</span><span class="Delimiter">)</span>
<span id="L142" class="LineNr">142 </span> <span class="Special"><a href='035labels.cc.html#L190'>Source_lines_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>original &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span> <span class="Special"><a href='035labels.cc.html#L190'>Source_lines_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>original &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L165'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L144" class="LineNr">144 </span> <span class="Normal">const</span> word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L145" class="LineNr">145 </span> <span class="Comment">// hack: if we have any operand metadata left after previous transforms,</span>
@ -230,7 +230,7 @@ if ('onhashchange' in window) {
<span id="L171" class="LineNr">171 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L172" class="LineNr">172 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': labels can only be the first <a href='011run.cc.html#L126'>word</a> in a line.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L173" class="LineNr">173 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L174" class="LineNr">174 </span> <span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L174" class="LineNr">174 </span> <span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span>byte_index<span class="Delimiter">,</span> label<span class="Delimiter">)</span> &amp;&amp; label != <span class="Constant">&quot;Entry&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr">176 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;duplicate label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L177" class="LineNr">177 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/036global_variables.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -17,12 +17,12 @@ a { color:inherit; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.SalientComment { color: #0000af; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.SalientComment { color: #0000af; }
.cSpecial { color: #008000; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -118,13 +118,13 @@ if ('onhashchange' in window) {
<span id="L57" class="LineNr"> 57 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': global variable names can only be the first <a href='011run.cc.html#L126'>word</a> in a line.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; variable &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Special"><a href='035labels.cc.html#L189'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; variable &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L217'>raise</a> &lt;&lt; <span class="Constant">&quot;duplicate global '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">,</span> current_address<span class="Delimiter">);</span>
<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;global variable '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;' is at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; end<span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;global variable '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;' is at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; end<span class="Delimiter">();</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Comment">// no modifying current_address; global variable definitions won't be in the final binary</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Delimiter">}</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Delimiter">}</span>
@ -201,7 +201,7 @@ if ('onhashchange' in window) {
<span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span>
<span id="L141" class="LineNr">141 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span> <span class="Delimiter">}</span>
<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot; maps to &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot; maps to &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L144" class="LineNr">144 </span> emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">),</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span>
<span id="L146" class="LineNr">146 </span> l<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_l<span class="Delimiter">.</span><a href='011run.cc.html#L121'>words</a><span class="Delimiter">);</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/038---literal_strings.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Delimiter { color: #c000c0; }
.Comment { color: #005faf; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.cSpecial { color: #008000; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/039debug.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,14 +14,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.Todo { color: #000000; background-color: #ffff00; padding-bottom: 1px; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.Todo { color: #000000; background-color: #ffff00; padding-bottom: 1px; }
.SalientComment { color: #0000af; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -91,7 +91,7 @@ if ('onhashchange' in window) {
<span id="L31" class="LineNr"> 31 </span> fin &gt;&gt; addr<span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> string <a href='011run.cc.html#L120'>line</a><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> getline<span class="Delimiter">(</span>fin<span class="Delimiter">,</span> <a href='011run.cc.html#L120'>line</a><span class="Delimiter">);</span>
<span id="L34" class="LineNr"> 34 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> addr<span class="Delimiter">,</span> <a href='039debug.cc.html#L97'>hacky_squeeze_out_whitespace</a><span class="Delimiter">(</span><a href='011run.cc.html#L120'>line</a><span class="Delimiter">));</span>
<span id="L34" class="LineNr"> 34 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> addr<span class="Delimiter">,</span> <a href='039debug.cc.html#L111'>hacky_squeeze_out_whitespace</a><span class="Delimiter">(</span><a href='011run.cc.html#L120'>line</a><span class="Delimiter">));</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span>
<span id="L36" class="LineNr"> 36 </span><span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span>
@ -99,17 +99,17 @@ if ('onhashchange' in window) {
<span id="L39" class="LineNr"> 39 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">))</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;== label &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">))</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span><span class="Normal">else</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Comment">// no source line info; do what you can</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='039debug.cc.html#L48'>debug_info</a><span class="Delimiter">(</span>EIP<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; EIP &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='039debug.cc.html#L48'>debug_info</a><span class="Delimiter">(</span>EIP<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L46" class="LineNr"> 46 </span>
<span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(code)</span>
<span id="L48" class="LineNr"> 48 </span>string <a href='039debug.cc.html#L48'>debug_info</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> inst_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Normal">uint8_t</span> op = <a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>inst_address<span class="Delimiter">);</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>op != <span class="Constant">0xe8</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L52" class="LineNr"> 52 </span> out &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span> out &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">);</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L54" class="LineNr"> 54 </span> <span class="Delimiter">}</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Normal">int32_t</span> offset = <a href='010---vm.cc.html#L190'>read_mem_i32</a><span class="Delimiter">(</span>inst_address+<span class="Comment">/*</span><span class="Comment">skip op</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
@ -117,7 +117,7 @@ if ('onhashchange' in window) {
<span id="L57" class="LineNr"> 57 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> next_eip<span class="Delimiter">))</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Identifier">return</span> <span class="Constant">&quot;e8/call &quot;</span>+get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> next_eip<span class="Delimiter">);</span>
<span id="L59" class="LineNr"> 59 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> out &lt;&lt; <span class="Constant">&quot;e8/call 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; next_eip<span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> out &lt;&lt; <span class="Constant">&quot;e8/call 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; next_eip<span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span><span class="Delimiter">}</span>
<span id="L63" class="LineNr"> 63 </span>
@ -134,9 +134,9 @@ if ('onhashchange' in window) {
<span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(code)</span>
<span id="L75" class="LineNr"> 75 </span><span class="Normal">void</span> <a href='039debug.cc.html#L75'>dump_watch_points</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L71'>Watch_points</a></span><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L77" class="LineNr"> 77 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot;watch points:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L77" class="LineNr"> 77 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;dbg&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;watch points:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L78" class="LineNr"> 78 </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='039debug.cc.html#L71'>Watch_points</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='039debug.cc.html#L71'>Watch_points</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L79" class="LineNr"> 79 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L79" class="LineNr"> 79 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;dbg&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L186'>read_mem_u32</a><span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L80" class="LineNr"> 80 </span><span class="Delimiter">}</span>
<span id="L81" class="LineNr"> 81 </span>
<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
@ -147,50 +147,64 @@ if ('onhashchange' in window) {
<span id="L87" class="LineNr"> 87 </span> <span class="Special">Watch_this_effective_address</span> = get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(after &quot;Found effective_address(addr)&quot;)</span>
<span id="L89" class="LineNr"> 89 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!<span class="Special">Watch_this_effective_address</span><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot;now watching &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L413'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; for &quot;</span> &lt;&lt; <span class="Special">Watch_this_effective_address</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot;now watching &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; for &quot;</span> &lt;&lt; <span class="Special">Watch_this_effective_address</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L91" class="LineNr"> 91 </span> <a href='001help.cc.html#L251'>put</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L71'>Watch_points</a></span><span class="Delimiter">,</span> <span class="Special">Watch_this_effective_address</span><span class="Delimiter">,</span> addr<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="Comment">//: helpers</span>
<span id="L95" class="LineNr"> 95 </span>
<span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(code)</span>
<span id="L97" class="LineNr"> 97 </span>string <a href='039debug.cc.html#L97'>hacky_squeeze_out_whitespace</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Comment">// strip whitespace at start</span>
<span id="L99" class="LineNr"> 99 </span> string::const_iterator first = s<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
<span id="L100" class="LineNr">100 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>first != s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span>
<span id="L101" class="LineNr">101 </span> ++first<span class="Delimiter">;</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>first == s<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L103" class="LineNr">103 </span>
<span id="L104" class="LineNr">104 </span> <span class="Comment">// strip whitespace at end</span>
<span id="L105" class="LineNr">105 </span> string::const_iterator last = --s<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
<span id="L106" class="LineNr">106 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>last != s<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*last<span class="Delimiter">))</span>
<span id="L107" class="LineNr">107 </span> --last<span class="Delimiter">;</span>
<span id="L108" class="LineNr">108 </span> ++last<span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span><span class="Comment">//: Special label that dumps regions of memory.</span>
<span id="L95" class="LineNr"> 95 </span><span class="Comment">//: Not a general mechanism; by the time you get here you're willing to hack</span>
<span id="L96" class="LineNr"> 96 </span><span class="Comment">//: on the emulator.</span>
<span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(after &quot;Run One Instruction&quot;)</span>
<span id="L98" class="LineNr"> 98 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L255'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> EIP<span class="Delimiter">)</span> == <span class="Constant">&quot;$dump-stream-at-EAX&quot;</span><span class="Delimiter">)</span>
<span id="L99" class="LineNr"> 99 </span> <a href='039debug.cc.html#L101'>dump_stream_at</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L28'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span><span class="Delimiter">:(code)</span>
<span id="L101" class="LineNr">101 </span><span class="Normal">void</span> <a href='039debug.cc.html#L101'>dump_stream_at</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> stream_start<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">int32_t</span> stream_length = <a href='010---vm.cc.html#L190'>read_mem_i32</a><span class="Delimiter">(</span>stream_start + <span class="Constant">8</span><span class="Delimiter">);</span>
<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot;stream length: &quot;</span> &lt;&lt; std::dec &lt;&lt; stream_length &lt;&lt; end<span class="Delimiter">();</span>
<span id="L104" class="LineNr">104 </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; stream_length + <span class="Constant">12</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L105" class="LineNr">105 </span> <a href='003trace.cc.html#L430'>dbg</a> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L408'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>stream_start+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L179'>read_mem_u8</a><span class="Delimiter">(</span>stream_start+i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L106" class="LineNr">106 </span><span class="Delimiter">}</span>
<span id="L107" class="LineNr">107 </span>
<span id="L108" class="LineNr">108 </span><span class="Comment">//: helpers</span>
<span id="L109" class="LineNr">109 </span>
<span id="L110" class="LineNr">110 </span> <span class="Comment">// replace runs of spaces/dots with single space until comment or string</span>
<span id="L111" class="LineNr">111 </span> <span class="Comment">// </span><span class="Todo">TODO</span><span class="Comment">:</span>
<span id="L112" class="LineNr">112 </span> <span class="Comment">// leave alone dots not surrounded by whitespace</span>
<span id="L113" class="LineNr">113 </span> <span class="Comment">// leave alone '#' within word</span>
<span id="L114" class="LineNr">114 </span> <span class="Comment">// leave alone '&quot;' within word</span>
<span id="L115" class="LineNr">115 </span> <span class="Comment">// squeeze spaces after end of string</span>
<span id="L116" class="LineNr">116 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L117" class="LineNr">117 </span> <span class="Normal">bool</span> previous_was_space = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span> <span class="Normal">bool</span> in_comment_or_string = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>string::const_iterator curr = first<span class="Delimiter">;</span> curr != last<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L120" class="LineNr">120 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in_comment_or_string<span class="Delimiter">)</span>
<span id="L121" class="LineNr">121 </span> out &lt;&lt; *curr<span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>*curr<span class="Delimiter">)</span> || *curr == <span class="Constant">'.'</span><span class="Delimiter">)</span>
<span id="L123" class="LineNr">123 </span> previous_was_space = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L124" class="LineNr">124 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>previous_was_space<span class="Delimiter">)</span>
<span id="L126" class="LineNr">126 </span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
<span id="L127" class="LineNr">127 </span> out &lt;&lt; *curr<span class="Delimiter">;</span>
<span id="L128" class="LineNr">128 </span> previous_was_space = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L129" class="LineNr">129 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*curr == <span class="Constant">'#'</span> || *curr == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> in_comment_or_string = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span>
<span id="L131" class="LineNr">131 </span> <span class="Delimiter">}</span>
<span id="L132" class="LineNr">132 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L133" class="LineNr">133 </span><span class="Delimiter">}</span>
<span id="L110" class="LineNr">110 </span><span class="Delimiter">:(code)</span>
<span id="L111" class="LineNr">111 </span>string <a href='039debug.cc.html#L111'>hacky_squeeze_out_whitespace</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L112" class="LineNr">112 </span> <span class="Comment">// strip whitespace at start</span>
<span id="L113" class="LineNr">113 </span> string::const_iterator first = s<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
<span id="L114" class="LineNr">114 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>first != s<span class="Delimiter">.</span>end<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span>
<span id="L115" class="LineNr">115 </span> ++first<span class="Delimiter">;</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>first == s<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L117" class="LineNr">117 </span>
<span id="L118" class="LineNr">118 </span> <span class="Comment">// strip whitespace at end</span>
<span id="L119" class="LineNr">119 </span> string::const_iterator last = --s<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>last != s<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> &amp;&amp; isspace<span class="Delimiter">(</span>*last<span class="Delimiter">))</span>
<span id="L121" class="LineNr">121 </span> --last<span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span> ++last<span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span>
<span id="L124" class="LineNr">124 </span> <span class="Comment">// replace runs of spaces/dots with single space until comment or string</span>
<span id="L125" class="LineNr">125 </span> <span class="Comment">// </span><span class="Todo">TODO</span><span class="Comment">:</span>
<span id="L126" class="LineNr">126 </span> <span class="Comment">// leave alone dots not surrounded by whitespace</span>
<span id="L127" class="LineNr">127 </span> <span class="Comment">// leave alone '#' within word</span>
<span id="L128" class="LineNr">128 </span> <span class="Comment">// leave alone '&quot;' within word</span>
<span id="L129" class="LineNr">129 </span> <span class="Comment">// squeeze spaces after end of string</span>
<span id="L130" class="LineNr">130 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span> <span class="Normal">bool</span> previous_was_space = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L132" class="LineNr">132 </span> <span class="Normal">bool</span> in_comment_or_string = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L133" class="LineNr">133 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>string::const_iterator curr = first<span class="Delimiter">;</span> curr != last<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in_comment_or_string<span class="Delimiter">)</span>
<span id="L135" class="LineNr">135 </span> out &lt;&lt; *curr<span class="Delimiter">;</span>
<span id="L136" class="LineNr">136 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>*curr<span class="Delimiter">)</span> || *curr == <span class="Constant">'.'</span><span class="Delimiter">)</span>
<span id="L137" class="LineNr">137 </span> previous_was_space = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L139" class="LineNr">139 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>previous_was_space<span class="Delimiter">)</span>
<span id="L140" class="LineNr">140 </span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
<span id="L141" class="LineNr">141 </span> out &lt;&lt; *curr<span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span> previous_was_space = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*curr == <span class="Constant">'#'</span> || *curr == <span class="Constant">'&quot;'</span><span class="Delimiter">)</span> in_comment_or_string = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> <span class="Delimiter">}</span>
<span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span>
<span id="L146" class="LineNr">146 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L147" class="LineNr">147 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/040---tests.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -16,11 +16,11 @@ a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.cSpecial { color: #008000; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/049memory_layout.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
@ -32,7 +32,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/050_write.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/051test.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/052kernel-string-equal.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,17 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.subxMinorFunction { color: #875f5f; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxTest { color: #5f8700; }
-->
</style>
@ -41,7 +41,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/053new-segment.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/054string-equal.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,17 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.CommentedCode { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>
@ -41,7 +41,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -77,171 +77,219 @@ if ('onhashchange' in window) {
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="subxFunction">string-equal?</span>: <span class="subxComment"># s : (address string), benchmark : (address string) -&gt; EAX : boolean</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># pseudocode:</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># lens = s-&gt;length</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># if (lens != benchmark-&gt;length) return false</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># i = 0</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># currs = s-&gt;data</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># currb = benchmark-&gt;data</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># while i &lt; s-&gt;length</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># c1 = *currs</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># c2 = *currb</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># ++i, ++currs, ++currb</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment"># return true</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment">#</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># registers:</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># i: ECX</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># lens: EDX</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># currs: ESI</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># currb: EDI</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># c1: EAX</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># c2: EBX</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment">#</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L39" class="LineNr"> 39 </span> 55/push-EBP
<span id="L40" class="LineNr"> 40 </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="L41" class="LineNr"> 41 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L42" class="LineNr"> 42 </span> 51/push-ECX
<span id="L43" class="LineNr"> 43 </span> 52/push-EDX
<span id="L44" class="LineNr"> 44 </span> 53/push-EBX
<span id="L45" class="LineNr"> 45 </span> 56/push-ESI
<span id="L46" class="LineNr"> 46 </span> 57/push-EDI
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment"># ESI = s</span>
<span id="L48" class="LineNr"> 48 </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="L49" class="LineNr"> 49 </span> <span class="subxComment"># EDI = benchmark</span>
<span id="L50" class="LineNr"> 50 </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="L51" class="LineNr"> 51 </span> <span class="subxComment"># lens/EDX = s-&gt;length</span>
<span id="L52" class="LineNr"> 52 </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="L53" class="LineNr"> 53 </span><span class="Constant">$string-equal?:lengths</span>:
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># if (lens != benchmark-&gt;length) return false</span>
<span id="L55" class="LineNr"> 55 </span> 39/compare 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"># compare *EDI and EDX</span>
<span id="L56" class="LineNr"> 56 </span> 75/jump-if-not-equal $string-equal?:false/disp8
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># currs/ESI = s-&gt;data</span>
<span id="L58" class="LineNr"> 58 </span> 81 0/subop/add 3/mod/direct 6/rm32/ESI <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 ESI</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># currb/EDI = benchmark-&gt;data</span>
<span id="L60" class="LineNr"> 60 </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="L61" class="LineNr"> 61 </span> <span class="subxComment"># i/ECX = c1/EAX = c2/EBX = 0</span>
<span id="L62" class="LineNr"> 62 </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="L63" class="LineNr"> 63 </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="L64" class="LineNr"> 64 </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="L65" class="LineNr"> 65 </span><span class="Constant">$string-equal?:loop</span>:
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># if (i &gt;= lens) return true</span>
<span id="L67" class="LineNr"> 67 </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="L68" class="LineNr"> 68 </span> 7d/jump-if-greater-or-equal $string-equal?:true/disp8
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># c1 = *currs</span>
<span id="L70" class="LineNr"> 70 </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="L71" class="LineNr"> 71 </span> <span class="subxComment"># c2 = *currb</span>
<span id="L72" class="LineNr"> 72 </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="L73" class="LineNr"> 73 </span> <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L74" class="LineNr"> 74 </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="L75" class="LineNr"> 75 </span> 75/jump-if-not-equal $string-equal?:false/disp8
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># ++i</span>
<span id="L77" class="LineNr"> 77 </span> 41/increment-ECX
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># ++currs</span>
<span id="L79" class="LineNr"> 79 </span> 46/increment-ESI
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># ++currb</span>
<span id="L81" class="LineNr"> 81 </span> 47/increment-EDI
<span id="L82" class="LineNr"> 82 </span> eb/jump $string-equal?:loop/disp8
<span id="L83" class="LineNr"> 83 </span><span class="Constant">$string-equal?:true</span>:
<span id="L84" class="LineNr"> 84 </span> b8/copy-to-EAX 1/imm32
<span id="L85" class="LineNr"> 85 </span> eb/jump $string-equal?:end/disp8
<span id="L86" class="LineNr"> 86 </span><span class="Constant">$string-equal?:false</span>:
<span id="L87" class="LineNr"> 87 </span> b8/copy-to-EAX 0/imm32
<span id="L88" class="LineNr"> 88 </span><span class="Constant">$string-equal?:end</span>:
<span id="L89" class="LineNr"> 89 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L90" class="LineNr"> 90 </span> 5f/pop-to-EDI
<span id="L91" class="LineNr"> 91 </span> 5e/pop-to-ESI
<span id="L92" class="LineNr"> 92 </span> 5b/pop-to-EBX
<span id="L93" class="LineNr"> 93 </span> 5a/pop-to-EDX
<span id="L94" class="LineNr"> 94 </span> 59/pop-to-ECX
<span id="L95" class="LineNr"> 95 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L96" class="LineNr"> 96 </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="L97" class="LineNr"> 97 </span> 5d/pop-to-EBP
<span id="L98" class="LineNr"> 98 </span> c3/return
<span id="L99" class="LineNr"> 99 </span>
<span id="L100" class="LineNr">100 </span><span class="subxH1Comment"># - tests</span>
<span id="L101" class="LineNr">101 </span>
<span id="L102" class="LineNr">102 </span><span class="subxTest">test-compare-empty-with-empty-string</span>:
<span id="L103" class="LineNr">103 </span> <span class="subxComment"># EAX = string-equal?(&quot;&quot;, &quot;&quot;)</span>
<span id="L104" class="LineNr">104 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L105" class="LineNr">105 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L106" class="LineNr">106 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L107" class="LineNr">107 </span> <span class="subxS2Comment"># . . call</span>
<span id="L108" class="LineNr">108 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L109" class="LineNr">109 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L110" class="LineNr">110 </span> 81 0/subop/add 3/mod/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="L111" class="LineNr">111 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L112" class="LineNr">112 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L113" class="LineNr">113 </span> 68/push <span class="Constant">&quot;F - test-compare-empty-with-empty-string&quot;</span>/imm32
<span id="L114" class="LineNr">114 </span> 68/push 1/imm32/true
<span id="L115" class="LineNr">115 </span> 50/push-EAX
<span id="L116" class="LineNr">116 </span> <span class="subxS2Comment"># . . call</span>
<span id="L117" class="LineNr">117 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L119" class="LineNr">119 </span> 81 0/subop/add 3/mod/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="L120" class="LineNr">120 </span> c3/return
<span id="L121" class="LineNr">121 </span>
<span id="L122" class="LineNr">122 </span><span class="subxTest">test-compare-empty-with-non-empty-string</span>: <span class="subxComment"># also checks length-mismatch code path</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># EAX = string-equal?(&quot;&quot;, &quot;Abc&quot;)</span>
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L125" class="LineNr">125 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L126" class="LineNr">126 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . call</span>
<span id="L128" class="LineNr">128 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L130" class="LineNr">130 </span> 81 0/subop/add 3/mod/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="L131" class="LineNr">131 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L133" class="LineNr">133 </span> 68/push <span class="Constant">&quot;F - test-compare-empty-with-non-empty-string&quot;</span>/imm32
<span id="L134" class="LineNr">134 </span> 68/push 0/imm32/false
<span id="L135" class="LineNr">135 </span> 50/push-EAX
<span id="L136" class="LineNr">136 </span> <span class="subxS2Comment"># . . call</span>
<span id="L137" class="LineNr">137 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L139" class="LineNr">139 </span> 81 0/subop/add 3/mod/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="L140" class="LineNr">140 </span> c3/return
<span id="L141" class="LineNr">141 </span>
<span id="L142" class="LineNr">142 </span><span class="subxTest">test-compare-equal-strings</span>:
<span id="L143" class="LineNr">143 </span> <span class="subxComment"># EAX = string-equal?(&quot;Abc&quot;, &quot;Abc&quot;)</span>
<span id="L144" class="LineNr">144 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L145" class="LineNr">145 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L146" class="LineNr">146 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . call</span>
<span id="L148" class="LineNr">148 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L149" class="LineNr">149 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L150" class="LineNr">150 </span> 81 0/subop/add 3/mod/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="L151" class="LineNr">151 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L153" class="LineNr">153 </span> 68/push <span class="Constant">&quot;F - test-compare-equal-strings&quot;</span>/imm32
<span id="L154" class="LineNr">154 </span> 68/push 1/imm32/true
<span id="L155" class="LineNr">155 </span> 50/push-EAX
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . call</span>
<span id="L157" class="LineNr">157 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L159" class="LineNr">159 </span> 81 0/subop/add 3/mod/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="L160" class="LineNr">160 </span> c3/return
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="subxTest">test-compare-inequal-strings-equal-lengths</span>:
<span id="L163" class="LineNr">163 </span> <span class="subxComment"># EAX = string-equal?(&quot;Abc&quot;, &quot;Adc&quot;)</span>
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L165" class="LineNr">165 </span> 68/push <span class="Constant">&quot;Adc&quot;</span>/imm32
<span id="L166" class="LineNr">166 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
<span id="L168" class="LineNr">168 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L170" class="LineNr">170 </span> 81 0/subop/add 3/mod/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="L171" class="LineNr">171 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L173" class="LineNr">173 </span> 68/push <span class="Constant">&quot;F - test-compare-inequal-strings-equal-lengths&quot;</span>/imm32
<span id="L174" class="LineNr">174 </span> 68/push 0/imm32/false
<span id="L175" class="LineNr">175 </span> 50/push-EAX
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . call</span>
<span id="L177" class="LineNr">177 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L179" class="LineNr">179 </span> 81 0/subop/add 3/mod/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="L180" class="LineNr">180 </span> c3/return
<span id="L181" class="LineNr">181 </span>
<span id="L182" class="LineNr">182 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># if (s-&gt;length != benchmark-&gt;length) return false</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># currs = s-&gt;data</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># currb = benchmark-&gt;data</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># maxs = s-&gt;data + s-&gt;length</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># while currs &lt; maxs</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># c1 = *currs</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># c2 = *currb</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># ++currs, ++currb</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># return true</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment">#</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># registers:</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># currs: ESI</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># maxs: ECX</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># currb: EDI</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># c1: EAX</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># c2: EBX</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment">#</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L37" class="LineNr"> 37 </span> 55/push-EBP
<span id="L38" class="LineNr"> 38 </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="L39" class="LineNr"> 39 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L40" class="LineNr"> 40 </span> 51/push-ECX
<span id="L41" class="LineNr"> 41 </span> 52/push-EDX
<span id="L42" class="LineNr"> 42 </span> 56/push-ESI
<span id="L43" class="LineNr"> 43 </span> 57/push-EDI
<span id="L44" class="LineNr"> 44 </span> <span class="subxComment"># ESI = s</span>
<span id="L45" class="LineNr"> 45 </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="L46" class="LineNr"> 46 </span> <span class="subxComment"># EDI = benchmark</span>
<span id="L47" class="LineNr"> 47 </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="L48" class="LineNr"> 48 </span> <span class="subxComment"># ECX = s-&gt;length</span>
<span id="L49" class="LineNr"> 49 </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="L50" class="LineNr"> 50 </span><span class="Constant">$string-equal?:lengths</span>:
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># if (ECX != benchmark-&gt;length) return false</span>
<span id="L52" class="LineNr"> 52 </span> 39/compare 0/mod/indirect 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare *EDI and ECX</span>
<span id="L53" class="LineNr"> 53 </span> 75/jump-if-not-equal $string-equal?:false/disp8
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># currs/ESI = s-&gt;data</span>
<span id="L55" class="LineNr"> 55 </span> 81 0/subop/add 3/mod/direct 6/rm32/ESI <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 ESI</span>
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># maxs/ECX = s-&gt;data + s-&gt;length</span>
<span id="L57" class="LineNr"> 57 </span> 01/add 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"># add ESI to ECX</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># currb/EDI = benchmark-&gt;data</span>
<span id="L59" class="LineNr"> 59 </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="L60" class="LineNr"> 60 </span> <span class="subxComment"># c1/EAX = c2/EDX = 0</span>
<span id="L61" class="LineNr"> 61 </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="L62" class="LineNr"> 62 </span> 31/xor 3/mod/direct 2/rm32/EDX <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"># clear EDX</span>
<span id="L63" class="LineNr"> 63 </span><span class="Constant">$string-equal?:loop</span>:
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># if (currs &gt;= maxs) return true</span>
<span id="L65" class="LineNr"> 65 </span> 39/compare 3/mod/direct 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ESI with ECX</span>
<span id="L66" class="LineNr"> 66 </span> 73/jump-if-greater-or-equal-unsigned $string-equal?:true/disp8
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># c1 = *currs</span>
<span id="L68" class="LineNr"> 68 </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="L69" class="LineNr"> 69 </span> <span class="subxComment"># c2 = *currb</span>
<span id="L70" class="LineNr"> 70 </span> 8a/copy-byte 0/mod/indirect 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/DL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *EDI to DL</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L72" class="LineNr"> 72 </span> 39/compare 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare EAX and EDX</span>
<span id="L73" class="LineNr"> 73 </span> 75/jump-if-not-equal $string-equal?:false/disp8
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># ++currs</span>
<span id="L75" class="LineNr"> 75 </span> 46/increment-ESI
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># ++currb</span>
<span id="L77" class="LineNr"> 77 </span> 47/increment-EDI
<span id="L78" class="LineNr"> 78 </span> eb/jump $string-equal?:loop/disp8
<span id="L79" class="LineNr"> 79 </span><span class="Constant">$string-equal?:true</span>:
<span id="L80" class="LineNr"> 80 </span> b8/copy-to-EAX 1/imm32
<span id="L81" class="LineNr"> 81 </span> eb/jump $string-equal?:end/disp8
<span id="L82" class="LineNr"> 82 </span><span class="Constant">$string-equal?:false</span>:
<span id="L83" class="LineNr"> 83 </span> b8/copy-to-EAX 0/imm32
<span id="L84" class="LineNr"> 84 </span><span class="Constant">$string-equal?:end</span>:
<span id="L85" class="LineNr"> 85 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L86" class="LineNr"> 86 </span> 5f/pop-to-EDI
<span id="L87" class="LineNr"> 87 </span> 5e/pop-to-ESI
<span id="L88" class="LineNr"> 88 </span> 5a/pop-to-EDX
<span id="L89" class="LineNr"> 89 </span> 59/pop-to-ECX
<span id="L90" class="LineNr"> 90 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L91" class="LineNr"> 91 </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="L92" class="LineNr"> 92 </span> 5d/pop-to-EBP
<span id="L93" class="LineNr"> 93 </span> c3/return
<span id="L94" class="LineNr"> 94 </span>
<span id="L95" class="LineNr"> 95 </span><span class="subxH1Comment"># - tests</span>
<span id="L96" class="LineNr"> 96 </span>
<span id="L97" class="LineNr"> 97 </span><span class="subxTest">test-compare-empty-with-empty-string</span>:
<span id="L98" class="LineNr"> 98 </span> <span class="subxComment"># EAX = string-equal?(&quot;&quot;, &quot;&quot;)</span>
<span id="L99" class="LineNr"> 99 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L100" class="LineNr">100 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L101" class="LineNr">101 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L102" class="LineNr">102 </span> <span class="subxS2Comment"># . . call</span>
<span id="L103" class="LineNr">103 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</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> 8/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-compare-empty-with-empty-string&quot;</span>/imm32
<span id="L109" class="LineNr">109 </span> 68/push 1/imm32/true
<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='051test.subx.html#L24'>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> c3/return
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="subxTest">test-compare-empty-with-non-empty-string</span>: <span class="subxComment"># also checks length-mismatch code path</span>
<span id="L118" class="LineNr">118 </span> <span class="subxComment"># EAX = string-equal?(&quot;&quot;, &quot;Abc&quot;)</span>
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L120" class="LineNr">120 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L121" class="LineNr">121 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . call</span>
<span id="L123" class="LineNr">123 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L125" class="LineNr">125 </span> 81 0/subop/add 3/mod/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="L126" class="LineNr">126 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr">128 </span> 68/push <span class="Constant">&quot;F - test-compare-empty-with-non-empty-string&quot;</span>/imm32
<span id="L129" class="LineNr">129 </span> 68/push 0/imm32/false
<span id="L130" class="LineNr">130 </span> 50/push-EAX
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . call</span>
<span id="L132" class="LineNr">132 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L134" class="LineNr">134 </span> 81 0/subop/add 3/mod/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="L135" class="LineNr">135 </span> c3/return
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="subxTest">test-compare-equal-strings</span>:
<span id="L138" class="LineNr">138 </span> <span class="subxComment"># EAX = string-equal?(&quot;Abc&quot;, &quot;Abc&quot;)</span>
<span id="L139" class="LineNr">139 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L140" class="LineNr">140 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L141" class="LineNr">141 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . call</span>
<span id="L143" class="LineNr">143 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L144" class="LineNr">144 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L145" class="LineNr">145 </span> 81 0/subop/add 3/mod/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="L146" class="LineNr">146 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L148" class="LineNr">148 </span> 68/push <span class="Constant">&quot;F - test-compare-equal-strings&quot;</span>/imm32
<span id="L149" class="LineNr">149 </span> 68/push 1/imm32/true
<span id="L150" class="LineNr">150 </span> 50/push-EAX
<span id="L151" class="LineNr">151 </span> <span class="subxS2Comment"># . . call</span>
<span id="L152" class="LineNr">152 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L154" class="LineNr">154 </span> 81 0/subop/add 3/mod/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="L155" class="LineNr">155 </span> c3/return
<span id="L156" class="LineNr">156 </span>
<span id="L157" class="LineNr">157 </span><span class="subxTest">test-compare-inequal-strings-equal-lengths</span>:
<span id="L158" class="LineNr">158 </span> <span class="subxComment"># EAX = string-equal?(&quot;Abc&quot;, &quot;Adc&quot;)</span>
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L160" class="LineNr">160 </span> 68/push <span class="Constant">&quot;Adc&quot;</span>/imm32
<span id="L161" class="LineNr">161 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . call</span>
<span id="L163" class="LineNr">163 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L165" class="LineNr">165 </span> 81 0/subop/add 3/mod/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="L166" class="LineNr">166 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L168" class="LineNr">168 </span> 68/push <span class="Constant">&quot;F - test-compare-inequal-strings-equal-lengths&quot;</span>/imm32
<span id="L169" class="LineNr">169 </span> 68/push 0/imm32/false
<span id="L170" class="LineNr">170 </span> 50/push-EAX
<span id="L171" class="LineNr">171 </span> <span class="subxS2Comment"># . . call</span>
<span id="L172" class="LineNr">172 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L174" class="LineNr">174 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L175" class="LineNr">175 </span> c3/return
<span id="L176" class="LineNr">176 </span>
<span id="L177" class="LineNr">177 </span><span class="subxComment"># helper for later tests</span>
<span id="L178" class="LineNr">178 </span><span class="subxFunction">check-string-equal</span>: <span class="subxComment"># s : (address string), expected : (address string), msg : (address string)</span>
<span id="L179" class="LineNr">179 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L180" class="LineNr">180 </span> 55/push-EBP
<span id="L181" class="LineNr">181 </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="L182" class="LineNr">182 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L183" class="LineNr">183 </span> 50/push-EAX
<span id="L184" class="LineNr">184 </span> <span class="subxComment"># EAX = string-equal?(s, expected)</span>
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L186" class="LineNr">186 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L187" class="LineNr">187 </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="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . call</span>
<span id="L189" class="LineNr">189 </span> e8/call <a href='054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L190" class="LineNr">190 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L191" class="LineNr">191 </span> 81 0/subop/add 3/mod/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="L192" class="LineNr">192 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L194" class="LineNr">194 </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="L195" class="LineNr">195 </span> 68/push 1/imm32
<span id="L196" class="LineNr">196 </span> 50/push-EAX
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . call</span>
<span id="L198" class="LineNr">198 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L200" class="LineNr">200 </span> 81 0/subop/add 3/mod/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="L201" class="LineNr">201 </span><span class="Constant">$check-string-equal:end</span>:
<span id="L202" class="LineNr">202 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L203" class="LineNr">203 </span> 58/pop-to-EAX
<span id="L204" class="LineNr">204 </span> <span class="subxS1Comment"># . epilog</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="subxComment"># test the helper</span>
<span id="L210" class="LineNr">210 </span><span class="subxTest">test-check-string-equal</span>:
<span id="L211" class="LineNr">211 </span> <span class="subxComment"># check-string-equal?(&quot;Abc&quot;, &quot;Abc&quot;)</span>
<span id="L212" class="LineNr">212 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L213" class="LineNr">213 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L214" class="LineNr">214 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . call</span>
<span id="L216" class="LineNr">216 </span> e8/call <a href='054string-equal.subx.html#L178'>check-string-equal</a>/disp32
<span id="L217" class="LineNr">217 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L218" class="LineNr">218 </span> 81 0/subop/add 3/mod/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="L219" class="LineNr">219 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L221" class="LineNr">221 </span> 68/push <span class="Constant">&quot;F - test-check-string-equal&quot;</span>/imm32
<span id="L222" class="LineNr">222 </span> 68/push 0/imm32/false
<span id="L223" class="LineNr">223 </span> 50/push-EAX
<span id="L224" class="LineNr">224 </span> <span class="subxS2Comment"># . . call</span>
<span id="L225" class="LineNr">225 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L226" class="LineNr">226 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L227" class="LineNr">227 </span> 81 0/subop/add 3/mod/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="L228" class="LineNr">228 </span> c3/return
<span id="L229" class="LineNr">229 </span>
<span id="L230" class="LineNr">230 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/055stream.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,11 +15,11 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -37,7 +37,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -95,7 +95,7 @@ if ('onhashchange' in window) {
<span id="L37" class="LineNr">37 </span><span class="Constant">$clear-stream:loop</span>:
<span id="L38" class="LineNr">38 </span> <span class="subxComment"># if (EAX &gt;= ECX) break</span>
<span id="L39" class="LineNr">39 </span> 39/compare 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare EAX with ECX</span>
<span id="L40" class="LineNr">40 </span> 7d/jump-if-greater-or-equal $clear-stream:end/disp8
<span id="L40" class="LineNr">40 </span> 73/jump-if-greater-or-equal-unsigned $clear-stream:end/disp8
<span id="L41" class="LineNr">41 </span> <span class="subxComment"># *EAX = 0</span>
<span id="L42" class="LineNr">42 </span> c6 0/subop/copy 0/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> 0/imm8 <span class="subxComment"># copy byte to *EAX</span>
<span id="L43" class="LineNr">43 </span> <span class="subxComment"># ++EAX</span>

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/057write.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,14 +15,14 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -119,7 +119,7 @@ if ('onhashchange' in window) {
<span id="L59" class="LineNr"> 59 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX <span class="Normal"> . </span> 3/r32/EBX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX+EDX+12 to EBX</span>
<span id="L60" class="LineNr"> 60 </span> 53/push-EBX
<span id="L61" class="LineNr"> 61 </span> <span class="subxS2Comment"># . . call</span>
<span id="L62" class="LineNr"> 62 </span> e8/call <a href='056trace.subx.html#L269'>_append-3</a>/disp32
<span id="L62" class="LineNr"> 62 </span> e8/call <a href='056trace.subx.html#L881'>_append-3</a>/disp32
<span id="L63" class="LineNr"> 63 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L64" class="LineNr"> 64 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># f-&gt;write += EAX</span>

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/059stop.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.subxMinorFunction { color: #875f5f; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxTest { color: #5f8700; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -98,180 +98,173 @@ if ('onhashchange' in window) {
<span id="L37" class="LineNr"> 37 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L38" class="LineNr"> 38 </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="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">#? e8/call test-stop-skips-returns-on-exit/disp32</span>
<span id="L42" class="LineNr"> 42 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L43" class="LineNr"> 43 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L44" class="LineNr"> 44 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L45" class="LineNr"> 45 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L46" class="LineNr"> 46 </span>
<span id="L47" class="LineNr"> 47 </span><span class="subxComment"># Configure an exit-descriptor for a call pushing 'nbytes' bytes of args to</span>
<span id="L48" class="LineNr"> 48 </span><span class="subxComment"># the stack.</span>
<span id="L49" class="LineNr"> 49 </span><span class="subxComment"># Ugly that we need to know the size of args, but so it goes.</span>
<span id="L50" class="LineNr"> 50 </span><span class="subxFunction">tailor-exit-descriptor</span>: <span class="subxComment"># ed : (address exit-descriptor), nbytes : int -&gt; &lt;void&gt;</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L52" class="LineNr"> 52 </span> 55/push-EBP
<span id="L53" class="LineNr"> 53 </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="L54" class="LineNr"> 54 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L55" class="LineNr"> 55 </span> 50/push-EAX
<span id="L56" class="LineNr"> 56 </span> 51/push-ECX
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># EAX = nbytes</span>
<span id="L58" class="LineNr"> 58 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># Let X be the value of ESP in the caller, before the call to tailor-exit-descriptor.</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxComment"># The return address for a call in the caller's body will be at:</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># X-8 if the caller takes 4 bytes of args for the exit-descriptor (add 4 bytes for the return address)</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># X-12 if the caller takes 8 bytes of args</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment"># ..and so on</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># That's the value we need to return: X-nbytes-4</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment">#</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># However, we also need to account for the perturbance to ESP caused by the</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># call to tailor-exit-descriptor. It pushes 8 bytes of args followed by 4</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># bytes for the return address and 4 bytes to push EBP above.</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># So EBP at this point is X-16.</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment">#</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># So the return address for the next call in the caller is:</span>
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># EBP+8 if the caller takes 4 bytes of args</span>
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># EBP+4 if the caller takes 8 bytes of args</span>
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># EBP if the caller takes 12 bytes of args</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># EBP-4 if the caller takes 16 bytes of args</span>
<span id="L76" class="LineNr"> 76 </span> <span class="subxComment"># ..and so on</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># That's EBP+12-nbytes.</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># option 1: 6 + 3 bytes</span>
<span id="L79" class="LineNr"> 79 </span><span class="CommentedCode">#? 2d/subtract 3/mod/direct 0/rm32/EAX . . . . . 8/imm32 # subtract from EAX</span>
<span id="L80" class="LineNr"> 80 </span><span class="CommentedCode">#? 8d/copy-address 0/mod/indirect 4/rm32/sib 5/base/EBP 0/index/EAX . 0/r32/EAX . . # copy EBP+EAX to EAX</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># option 2: 2 + 4 bytes</span>
<span id="L82" class="LineNr"> 82 </span> f7 3/subop/negate 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># negate EAX</span>
<span id="L83" class="LineNr"> 83 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 5/base/EBP 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBP+EAX+12 to EAX</span>
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># copy EAX to ed-&gt;target</span>
<span id="L85" class="LineNr"> 85 </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="L86" class="LineNr"> 86 </span> 89/copy 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *ECX</span>
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># initialize ed-&gt;value</span>
<span id="L88" class="LineNr"> 88 </span> c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 0/imm32 <span class="subxComment"># copy to *(ECX+4)</span>
<span id="L89" class="LineNr"> 89 </span><span class="Constant">$tailor-exit-descriptor:end</span>:
<span id="L90" class="LineNr"> 90 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L91" class="LineNr"> 91 </span> 59/pop-to-ECX
<span id="L92" class="LineNr"> 92 </span> 58/pop-to-EAX
<span id="L93" class="LineNr"> 93 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L94" class="LineNr"> 94 </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="L95" class="LineNr"> 95 </span> 5d/pop-to-EBP
<span id="L96" class="LineNr"> 96 </span> c3/return
<span id="L97" class="LineNr"> 97 </span>
<span id="L98" class="LineNr"> 98 </span><span class="subxFunction">stop</span>: <span class="subxComment"># ed : (address exit-descriptor), value : int</span>
<span id="L99" class="LineNr"> 99 </span> <span class="subxComment"># no prolog; one way or another, we're going to clobber registers</span>
<span id="L100" class="LineNr">100 </span> <span class="subxComment"># EAX = ed</span>
<span id="L101" class="LineNr">101 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+4) to EAX</span>
<span id="L102" class="LineNr">102 </span> <span class="subxComment"># if (ed-&gt;target == 0) really exit</span>
<span id="L103" class="LineNr">103 </span> 81 7/subop/compare 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *EAX</span>
<span id="L104" class="LineNr">104 </span> 75/jump-if-not-equal $stop:fake/disp8
<span id="L105" class="LineNr">105 </span> <span class="subxS1Comment"># . syscall(exit, value)</span>
<span id="L106" class="LineNr">106 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to EBX</span>
<span id="L107" class="LineNr">107 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L108" class="LineNr">108 </span> cd/syscall 0x80/imm8
<span id="L109" class="LineNr">109 </span><span class="Constant">$stop:fake</span>:
<span id="L110" class="LineNr">110 </span> <span class="subxComment"># otherwise:</span>
<span id="L111" class="LineNr">111 </span> <span class="subxComment"># ed-&gt;value = value+1</span>
<span id="L112" class="LineNr">112 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to ECX</span>
<span id="L113" class="LineNr">113 </span> 41/increment-ECX
<span id="L114" class="LineNr">114 </span> 89/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(EAX+4)</span>
<span id="L115" class="LineNr">115 </span> <span class="subxComment"># perform a non-local jump to ed-&gt;target</span>
<span id="L116" class="LineNr">116 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ESP</span>
<span id="L117" class="LineNr">117 </span><span class="Constant">$stop:end</span>:
<span id="L118" class="LineNr">118 </span> c3/return <span class="subxComment"># doesn't return to caller</span>
<span id="L119" class="LineNr">119 </span>
<span id="L120" class="LineNr">120 </span><span class="subxTest">test-stop-skips-returns-on-exit</span>:
<span id="L121" class="LineNr">121 </span> <span class="subxComment"># This looks like the standard prolog, but is here for different reasons.</span>
<span id="L122" class="LineNr">122 </span> <span class="subxComment"># A function calling 'stop' can't rely on EBP persisting past the call.</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment">#</span>
<span id="L124" class="LineNr">124 </span> <span class="subxComment"># Use EBP here as a stable base to refer to locals and arguments from in the</span>
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># presence of push/pop/call instructions.</span>
<span id="L126" class="LineNr">126 </span> <span class="subxComment"># *Don't* use EBP as a way to restore ESP.</span>
<span id="L127" class="LineNr">127 </span> 55/push-EBP
<span id="L128" class="LineNr">128 </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="L129" class="LineNr">129 </span> <span class="subxComment"># Make room for an exit descriptor on the stack. That's almost always the</span>
<span id="L130" class="LineNr">130 </span> <span class="subxComment"># right place for it, available only as long as it's legal to use. Once this</span>
<span id="L131" class="LineNr">131 </span> <span class="subxComment"># containing function returns we'll need a new exit descriptor.</span>
<span id="L132" class="LineNr">132 </span> <span class="subxComment"># var ed/EAX : (address exit-descriptor)</span>
<span id="L133" class="LineNr">133 </span> 81 5/subop/subtract 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L134" class="LineNr">134 </span> 89/copy 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EAX</span>
<span id="L135" class="LineNr">135 </span> <span class="subxComment"># Size the exit-descriptor precisely for the next call below, to _test-stop-1.</span>
<span id="L136" class="LineNr">136 </span> <span class="subxComment"># tailor-exit-descriptor(ed, 4)</span>
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L138" class="LineNr">138 </span> 68/push 4/imm32/nbytes-of-args-for-_test-stop-1
<span id="L40" class="LineNr"> 40 </span><span class="subxComment"># Configure an exit-descriptor for a call pushing 'nbytes' bytes of args to</span>
<span id="L41" class="LineNr"> 41 </span><span class="subxComment"># the stack.</span>
<span id="L42" class="LineNr"> 42 </span><span class="subxComment"># Ugly that we need to know the size of args, but so it goes.</span>
<span id="L43" class="LineNr"> 43 </span><span class="subxFunction">tailor-exit-descriptor</span>: <span class="subxComment"># ed : (address exit-descriptor), nbytes : int -&gt; &lt;void&gt;</span>
<span id="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L45" class="LineNr"> 45 </span> 55/push-EBP
<span id="L46" class="LineNr"> 46 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L47" class="LineNr"> 47 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L48" class="LineNr"> 48 </span> 50/push-EAX
<span id="L49" class="LineNr"> 49 </span> 51/push-ECX
<span id="L50" class="LineNr"> 50 </span> <span class="subxComment"># EAX = nbytes</span>
<span id="L51" class="LineNr"> 51 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L52" class="LineNr"> 52 </span> <span class="subxComment"># Let X be the value of ESP in the caller, before the call to tailor-exit-descriptor.</span>
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># The return address for a call in the caller's body will be at:</span>
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># X-8 if the caller takes 4 bytes of args for the exit-descriptor (add 4 bytes for the return address)</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># X-12 if the caller takes 8 bytes of args</span>
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># ..and so on</span>
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># That's the value we need to return: X-nbytes-4</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment">#</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># However, we also need to account for the perturbance to ESP caused by the</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxComment"># call to tailor-exit-descriptor. It pushes 8 bytes of args followed by 4</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># bytes for the return address and 4 bytes to push EBP above.</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># So EBP at this point is X-16.</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment">#</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># So the return address for the next call in the caller is:</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># EBP+8 if the caller takes 4 bytes of args</span>
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># EBP+4 if the caller takes 8 bytes of args</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># EBP if the caller takes 12 bytes of args</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># EBP-4 if the caller takes 16 bytes of args</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># ..and so on</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># That's EBP+12-nbytes.</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># option 1: 6 + 3 bytes</span>
<span id="L72" class="LineNr"> 72 </span><span class="CommentedCode">#? 2d/subtract 3/mod/direct 0/rm32/EAX . . . . . 8/imm32 # subtract from EAX</span>
<span id="L73" class="LineNr"> 73 </span><span class="CommentedCode">#? 8d/copy-address 0/mod/indirect 4/rm32/sib 5/base/EBP 0/index/EAX . 0/r32/EAX . . # copy EBP+EAX to EAX</span>
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># option 2: 2 + 4 bytes</span>
<span id="L75" class="LineNr"> 75 </span> f7 3/subop/negate 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># negate EAX</span>
<span id="L76" class="LineNr"> 76 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 5/base/EBP 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBP+EAX+12 to EAX</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># copy EAX to ed-&gt;target</span>
<span id="L78" class="LineNr"> 78 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
<span id="L79" class="LineNr"> 79 </span> 89/copy 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *ECX</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># initialize ed-&gt;value</span>
<span id="L81" class="LineNr"> 81 </span> c7 0/subop/copy 1/mod/*+disp8 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 0/imm32 <span class="subxComment"># copy to *(ECX+4)</span>
<span id="L82" class="LineNr"> 82 </span><span class="Constant">$tailor-exit-descriptor:end</span>:
<span id="L83" class="LineNr"> 83 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L84" class="LineNr"> 84 </span> 59/pop-to-ECX
<span id="L85" class="LineNr"> 85 </span> 58/pop-to-EAX
<span id="L86" class="LineNr"> 86 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L87" class="LineNr"> 87 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L88" class="LineNr"> 88 </span> 5d/pop-to-EBP
<span id="L89" class="LineNr"> 89 </span> c3/return
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="subxFunction">stop</span>: <span class="subxComment"># ed : (address exit-descriptor), value : int</span>
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># no prolog; one way or another, we're going to clobber registers</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># EAX = ed</span>
<span id="L94" class="LineNr"> 94 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+4) to EAX</span>
<span id="L95" class="LineNr"> 95 </span> <span class="subxComment"># if (ed-&gt;target == 0) really exit</span>
<span id="L96" class="LineNr"> 96 </span> 81 7/subop/compare 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm32 <span class="subxComment"># compare *EAX</span>
<span id="L97" class="LineNr"> 97 </span> 75/jump-if-not-equal $stop:fake/disp8
<span id="L98" class="LineNr"> 98 </span> <span class="subxS1Comment"># . syscall(exit, value)</span>
<span id="L99" class="LineNr"> 99 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to EBX</span>
<span id="L100" class="LineNr">100 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L101" class="LineNr">101 </span> cd/syscall 0x80/imm8
<span id="L102" class="LineNr">102 </span><span class="Constant">$stop:fake</span>:
<span id="L103" class="LineNr">103 </span> <span class="subxComment"># otherwise:</span>
<span id="L104" class="LineNr">104 </span> <span class="subxComment"># ed-&gt;value = value+1</span>
<span id="L105" class="LineNr">105 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/ESP 4/index/none <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESP+8) to ECX</span>
<span id="L106" class="LineNr">106 </span> 41/increment-ECX
<span id="L107" class="LineNr">107 </span> 89/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(EAX+4)</span>
<span id="L108" class="LineNr">108 </span> <span class="subxComment"># perform a non-local jump to ed-&gt;target</span>
<span id="L109" class="LineNr">109 </span> 8b/copy 0/mod/indirect 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *EAX to ESP</span>
<span id="L110" class="LineNr">110 </span><span class="Constant">$stop:end</span>:
<span id="L111" class="LineNr">111 </span> c3/return <span class="subxComment"># doesn't return to caller</span>
<span id="L112" class="LineNr">112 </span>
<span id="L113" class="LineNr">113 </span><span class="subxTest">test-stop-skips-returns-on-exit</span>:
<span id="L114" class="LineNr">114 </span> <span class="subxComment"># This looks like the standard prolog, but is here for different reasons.</span>
<span id="L115" class="LineNr">115 </span> <span class="subxComment"># A function calling 'stop' can't rely on EBP persisting past the call.</span>
<span id="L116" class="LineNr">116 </span> <span class="subxComment">#</span>
<span id="L117" class="LineNr">117 </span> <span class="subxComment"># Use EBP here as a stable base to refer to locals and arguments from in the</span>
<span id="L118" class="LineNr">118 </span> <span class="subxComment"># presence of push/pop/call instructions.</span>
<span id="L119" class="LineNr">119 </span> <span class="subxComment"># *Don't* use EBP as a way to restore ESP.</span>
<span id="L120" class="LineNr">120 </span> 55/push-EBP
<span id="L121" class="LineNr">121 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L122" class="LineNr">122 </span> <span class="subxComment"># Make room for an exit descriptor on the stack. That's almost always the</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># right place for it, available only as long as it's legal to use. Once this</span>
<span id="L124" class="LineNr">124 </span> <span class="subxComment"># containing function returns we'll need a new exit descriptor.</span>
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># var ed/EAX : (address exit-descriptor)</span>
<span id="L126" class="LineNr">126 </span> 81 5/subop/subtract 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># subtract from ESP</span>
<span id="L127" class="LineNr">127 </span> 89/copy 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EAX</span>
<span id="L128" class="LineNr">128 </span> <span class="subxComment"># Size the exit-descriptor precisely for the next call below, to _test-stop-1.</span>
<span id="L129" class="LineNr">129 </span> <span class="subxComment"># tailor-exit-descriptor(ed, 4)</span>
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L131" class="LineNr">131 </span> 68/push 4/imm32/nbytes-of-args-for-_test-stop-1
<span id="L132" class="LineNr">132 </span> 50/push-EAX
<span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . call</span>
<span id="L134" class="LineNr">134 </span> e8/call <a href='059stop.subx.html#L43'>tailor-exit-descriptor</a>/disp32
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L136" class="LineNr">136 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L137" class="LineNr">137 </span> <span class="subxS1Comment"># . _test-stop-1(ed)</span>
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L139" class="LineNr">139 </span> 50/push-EAX
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . call</span>
<span id="L141" class="LineNr">141 </span> e8/call <a href='059stop.subx.html#L50'>tailor-exit-descriptor</a>/disp32
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L143" class="LineNr">143 </span> 81 0/subop/add 3/mod/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="L144" class="LineNr">144 </span> <span class="subxS1Comment"># . _test-stop-1(ed)</span>
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L146" class="LineNr">146 </span> 50/push-EAX
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . call</span>
<span id="L148" class="LineNr">148 </span> e8/call <a href='059stop.subx.html#L169'>_test-stop-1</a>/disp32
<span id="L149" class="LineNr">149 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L150" class="LineNr">150 </span> <span class="subxComment"># restore args</span>
<span id="L151" class="LineNr">151 </span> 58/pop-to-EAX
<span id="L152" class="LineNr">152 </span> <span class="subxComment"># check that _test-stop-1 tried to call exit(1)</span>
<span id="L153" class="LineNr">153 </span> <span class="subxComment"># check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L155" class="LineNr">155 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L156" class="LineNr">156 </span> 68/push 2/imm32
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L158" class="LineNr">158 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . call</span>
<span id="L160" class="LineNr">160 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L161" class="LineNr">161 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L162" class="LineNr">162 </span> 81 0/subop/add 3/mod/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="L163" class="LineNr">163 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L164" class="LineNr">164 </span> <span class="subxComment"># don't restore ESP from EBP; manually reclaim locals</span>
<span id="L165" class="LineNr">165 </span> 81 0/subop/add 3/mod/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="L166" class="LineNr">166 </span> 5d/pop-to-EBP
<span id="L167" class="LineNr">167 </span> c3/return
<span id="L168" class="LineNr">168 </span>
<span id="L169" class="LineNr">169 </span><span class="subxMinorFunction">_test-stop-1</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L170" class="LineNr">170 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L171" class="LineNr">171 </span> 55/push-EBP
<span id="L172" class="LineNr">172 </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="L173" class="LineNr">173 </span> <span class="subxComment"># _test-stop-2(ed)</span>
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L175" class="LineNr">175 </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="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . call</span>
<span id="L177" class="LineNr">177 </span> e8/call <a href='059stop.subx.html#L196'>_test-stop-2</a>/disp32
<span id="L178" class="LineNr">178 </span> <span class="subxComment"># should never get past this point</span>
<span id="L179" class="LineNr">179 </span><span class="Constant">$_test-stop-1:dead-end</span>:
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L181" class="LineNr">181 </span> 81 0/subop/add 3/mod/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="L182" class="LineNr">182 </span> <span class="subxComment"># signal test failed: check-ints-equal(1, 0, msg)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L185" class="LineNr">185 </span> 68/push 0/imm32
<span id="L186" class="LineNr">186 </span> 68/push 1/imm32
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . call</span>
<span id="L188" class="LineNr">188 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L190" class="LineNr">190 </span> 81 0/subop/add 3/mod/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="L191" class="LineNr">191 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L192" class="LineNr">192 </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="L193" class="LineNr">193 </span> 5d/pop-to-EBP
<span id="L194" class="LineNr">194 </span> c3/return
<span id="L195" class="LineNr">195 </span>
<span id="L196" class="LineNr">196 </span><span class="subxMinorFunction">_test-stop-2</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L197" class="LineNr">197 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L198" class="LineNr">198 </span> 55/push-EBP
<span id="L199" class="LineNr">199 </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="L200" class="LineNr">200 </span> <span class="subxS1Comment"># . stop(ed, 1)</span>
<span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L202" class="LineNr">202 </span> 68/push 1/imm32
<span id="L203" class="LineNr">203 </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="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . call</span>
<span id="L205" class="LineNr">205 </span> e8/call <a href='059stop.subx.html#L98'>stop</a>/disp32
<span id="L206" class="LineNr">206 </span> <span class="subxComment"># should never get past this point</span>
<span id="L207" class="LineNr">207 </span><span class="Constant">$_test-stop-2:dead-end</span>:
<span id="L208" class="LineNr">208 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L209" class="LineNr">209 </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="L210" class="LineNr">210 </span> 5d/pop-to-EBP
<span id="L211" class="LineNr">211 </span> c3/return
<span id="L212" class="LineNr">212 </span>
<span id="L213" class="LineNr">213 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L141" class="LineNr">141 </span> e8/call <a href='059stop.subx.html#L162'>_test-stop-1</a>/disp32
<span id="L142" class="LineNr">142 </span> <span class="subxComment"># registers except ESP may be clobbered at this point</span>
<span id="L143" class="LineNr">143 </span> <span class="subxComment"># restore args</span>
<span id="L144" class="LineNr">144 </span> 58/pop-to-EAX
<span id="L145" class="LineNr">145 </span> <span class="subxComment"># check that _test-stop-1 tried to call exit(1)</span>
<span id="L146" class="LineNr">146 </span> <span class="subxComment"># check-ints-equal(ed-&gt;value, 2, msg) # i.e. stop was called with value 1</span>
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L148" class="LineNr">148 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L149" class="LineNr">149 </span> 68/push 2/imm32
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . push ed-&gt;value</span>
<span id="L151" class="LineNr">151 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . call</span>
<span id="L153" class="LineNr">153 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L155" class="LineNr">155 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L156" class="LineNr">156 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L157" class="LineNr">157 </span> <span class="subxComment"># don't restore ESP from EBP; manually reclaim locals</span>
<span id="L158" class="LineNr">158 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L159" class="LineNr">159 </span> 5d/pop-to-EBP
<span id="L160" class="LineNr">160 </span> c3/return
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="subxMinorFunction">_test-stop-1</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L164" class="LineNr">164 </span> 55/push-EBP
<span id="L165" class="LineNr">165 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L166" class="LineNr">166 </span> <span class="subxComment"># _test-stop-2(ed)</span>
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L168" class="LineNr">168 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . call</span>
<span id="L170" class="LineNr">170 </span> e8/call <a href='059stop.subx.html#L189'>_test-stop-2</a>/disp32
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># should never get past this point</span>
<span id="L172" class="LineNr">172 </span><span class="Constant">$_test-stop-1:dead-end</span>:
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L174" class="LineNr">174 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L175" class="LineNr">175 </span> <span class="subxComment"># signal test failed: check-ints-equal(1, 0, msg)</span>
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L177" class="LineNr">177 </span> 68/push <span class="Constant">&quot;F - test-stop-skips-returns-on-exit&quot;</span>/imm32
<span id="L178" class="LineNr">178 </span> 68/push 0/imm32
<span id="L179" class="LineNr">179 </span> 68/push 1/imm32
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . call</span>
<span id="L181" class="LineNr">181 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L183" class="LineNr">183 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L184" class="LineNr">184 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L185" class="LineNr">185 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L186" class="LineNr">186 </span> 5d/pop-to-EBP
<span id="L187" class="LineNr">187 </span> c3/return
<span id="L188" class="LineNr">188 </span>
<span id="L189" class="LineNr">189 </span><span class="subxMinorFunction">_test-stop-2</span>: <span class="subxComment"># ed : (address exit-descriptor)</span>
<span id="L190" class="LineNr">190 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L191" class="LineNr">191 </span> 55/push-EBP
<span id="L192" class="LineNr">192 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L193" class="LineNr">193 </span> <span class="subxS1Comment"># . stop(ed, 1)</span>
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L195" class="LineNr">195 </span> 68/push 1/imm32
<span id="L196" class="LineNr">196 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . call</span>
<span id="L198" class="LineNr">198 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># should never get past this point</span>
<span id="L200" class="LineNr">200 </span><span class="Constant">$_test-stop-2:dead-end</span>:
<span id="L201" class="LineNr">201 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L202" class="LineNr">202 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L203" class="LineNr">203 </span> 5d/pop-to-EBP
<span id="L204" class="LineNr">204 </span> c3/return
<span id="L205" class="LineNr">205 </span>
<span id="L206" class="LineNr">206 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/060read.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -226,10 +226,10 @@ if ('onhashchange' in window) {
<span id="L165" class="LineNr">165 </span><span class="Constant">$_buffer-4:loop</span>:
<span id="L166" class="LineNr">166 </span> <span class="subxComment"># if (in &gt;= inend) break</span>
<span id="L167" class="LineNr">167 </span> 39/compare 3/mod/direct 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ESI with ECX</span>
<span id="L168" class="LineNr">168 </span> 7d/jump-if-greater-or-equal $_buffer-4:end/disp8
<span id="L168" class="LineNr">168 </span> 73/jump-if-greater-or-equal-unsigned $_buffer-4:end/disp8
<span id="L169" class="LineNr">169 </span> <span class="subxComment"># if (out &gt;= outend) break # for now silently ignore filled up buffer</span>
<span id="L170" class="LineNr">170 </span> 39/compare 3/mod/direct 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare EDI with EDX</span>
<span id="L171" class="LineNr">171 </span> 7d/jump-if-greater-or-equal $_buffer-4:end/disp8
<span id="L171" class="LineNr">171 </span> 73/jump-if-greater-or-equal-unsigned $_buffer-4:end/disp8
<span id="L172" class="LineNr">172 </span> <span class="subxComment"># *out = *in</span>
<span id="L173" class="LineNr">173 </span> 8a/copy-byte 0/mod/indirect 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/BL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *ESI to BL</span>
<span id="L174" class="LineNr">174 </span> 88/copy-byte 0/mod/indirect 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/BL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at BL to *EDI</span>
@ -365,7 +365,7 @@ if ('onhashchange' in window) {
<span id="L304" class="LineNr">304 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L305" class="LineNr">305 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . call</span>
<span id="L307" class="LineNr">307 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L307" class="LineNr">307 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L308" class="LineNr">308 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L309" class="LineNr">309 </span> 81 0/subop/add 3/mod/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="L310" class="LineNr">310 </span> <span class="subxComment"># end</span>
@ -425,7 +425,7 @@ if ('onhashchange' in window) {
<span id="L364" class="LineNr">364 </span> 68/push <span class="Constant">&quot;CD&quot;</span>/imm32
<span id="L365" class="LineNr">365 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L366" class="LineNr">366 </span> <span class="subxS2Comment"># . . call</span>
<span id="L367" class="LineNr">367 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L367" class="LineNr">367 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-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> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L370" class="LineNr">370 </span> <span class="subxComment"># end</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/061read-byte.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,18 +14,17 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.CommentedCode { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -42,7 +41,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -94,274 +93,266 @@ if ('onhashchange' in window) {
<span id="L31" class="LineNr"> 31 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L32" class="LineNr"> 32 </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="L33" class="LineNr"> 33 </span>
<span id="L34" class="LineNr"> 34 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L35" class="LineNr"> 35 </span><span class="CommentedCode">#? e8/call test-read-byte-buffered-multiple/disp32</span>
<span id="L36" class="LineNr"> 36 </span><span class="CommentedCode">#? e8/call test-read-byte-buffered-refills-buffer/disp32</span>
<span id="L37" class="LineNr"> 37 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L38" class="LineNr"> 38 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L39" class="LineNr"> 39 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L40" class="LineNr"> 40 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L41" class="LineNr"> 41 </span>
<span id="L42" class="LineNr"> 42 </span><span class="subxComment"># return next byte value in EAX, with top 3 bytes cleared.</span>
<span id="L43" class="LineNr"> 43 </span><span class="subxComment"># On reaching end of file, return 0xffffffff (Eof).</span>
<span id="L44" class="LineNr"> 44 </span><span class="subxFunction">read-byte-buffered</span>: <span class="subxComment"># f : (address buffered-file) -&gt; byte-or-Eof/EAX</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L46" class="LineNr"> 46 </span> 55/push-EBP
<span id="L47" class="LineNr"> 47 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/r32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESP to EBP</span>
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L49" class="LineNr"> 49 </span> 51/push-ECX
<span id="L50" class="LineNr"> 50 </span> 56/push-ESI
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># ESI = f</span>
<span id="L52" class="LineNr"> 52 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/ESI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to ESI</span>
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># ECX = f-&gt;read</span>
<span id="L54" class="LineNr"> 54 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <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 *(ESI+8) to ECX</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L56" class="LineNr"> 56 </span> 3b/compare 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># compare ECX with *(ESI+4)</span>
<span id="L57" class="LineNr"> 57 </span> 7c/jump-if-lesser $read-byte-buffered:from-stream/disp8
<span id="L58" class="LineNr"> 58 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L60" class="LineNr"> 60 </span> 8d/copy-address 1/mod/*+disp8 6/rm32/ESI <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 ESI+4 to EAX</span>
<span id="L61" class="LineNr"> 61 </span> 50/push-EAX
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . call</span>
<span id="L63" class="LineNr"> 63 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L65" class="LineNr"> 65 </span> 81 0/subop/add 3/mod/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="L66" class="LineNr"> 66 </span> <span class="subxS1Comment"># . f-&gt;read must now be 0; update its cache at ECX</span>
<span id="L67" class="LineNr"> 67 </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="L68" class="LineNr"> 68 </span> <span class="subxS1Comment"># . EAX = read(f-&gt;fd, stream = f+4)</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L70" class="LineNr"> 70 </span> 50/push-EAX
<span id="L71" class="LineNr"> 71 </span> ff 6/subop/push 0/mod/indirect 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ESI</span>
<span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . call</span>
<span id="L73" class="LineNr"> 73 </span> e8/call <a href='060read.subx.html#L48'>read</a>/disp32
<span id="L74" class="LineNr"> 74 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L75" class="LineNr"> 75 </span> 81 0/subop/add 3/mod/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="L76" class="LineNr"> 76 </span> <span class="subxComment"># if (EAX == 0) return 0xffffffff</span>
<span id="L77" class="LineNr"> 77 </span> 3d/compare-EAX-and 0/imm32
<span id="L78" class="LineNr"> 78 </span> 75/jump-if-not-equal $read-byte-buffered:from-stream/disp8
<span id="L79" class="LineNr"> 79 </span> b8/copy-to-EAX 0xffffffff/imm32/Eof
<span id="L80" class="LineNr"> 80 </span> eb/jump $read-byte-buffered:end/disp8
<span id="L81" class="LineNr"> 81 </span><span class="Constant">$read-byte-buffered:from-stream</span>:
<span id="L82" class="LineNr"> 82 </span> <span class="subxComment"># read byte from stream</span>
<span id="L83" class="LineNr"> 83 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L84" class="LineNr"> 84 </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="L85" class="LineNr"> 85 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+16) to AL</span>
<span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L87" class="LineNr"> 87 </span> ff 0/subop/increment 1/mod/*+disp8 6/rm32/ESI <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"># increment *(ESI+8)</span>
<span id="L88" class="LineNr"> 88 </span><span class="Constant">$read-byte-buffered:end</span>:
<span id="L89" class="LineNr"> 89 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L90" class="LineNr"> 90 </span> 5e/pop-to-ESI
<span id="L91" class="LineNr"> 91 </span> 59/pop-to-ECX
<span id="L92" class="LineNr"> 92 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L93" class="LineNr"> 93 </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="L94" class="LineNr"> 94 </span> 5d/pop-to-EBP
<span id="L95" class="LineNr"> 95 </span> c3/return
<span id="L96" class="LineNr"> 96 </span>
<span id="L97" class="LineNr"> 97 </span><span class="subxH1Comment"># - tests</span>
<span id="L98" class="LineNr"> 98 </span>
<span id="L99" class="LineNr"> 99 </span><span class="subxTest">test-read-byte-buffered-single</span>:
<span id="L100" class="LineNr">100 </span> <span class="subxH1Comment"># - check that read-byte-buffered returns first byte of 'file'</span>
<span id="L101" class="LineNr">101 </span> <span class="subxComment"># setup</span>
<span id="L102" class="LineNr">102 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L103" class="LineNr">103 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L104" class="LineNr">104 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . call</span>
<span id="L106" class="LineNr">106 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L107" class="LineNr">107 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L108" class="LineNr">108 </span> 81 0/subop/add 3/mod/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="L109" class="LineNr">109 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L110" class="LineNr">110 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L111" class="LineNr">111 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L112" class="LineNr">112 </span> 05/add-to-EAX 4/imm32
<span id="L113" class="LineNr">113 </span> 50/push-EAX
<span id="L34" class="LineNr"> 34 </span><span class="subxComment"># return next byte value in EAX, with top 3 bytes cleared.</span>
<span id="L35" class="LineNr"> 35 </span><span class="subxComment"># On reaching end of file, return 0xffffffff (Eof).</span>
<span id="L36" class="LineNr"> 36 </span><span class="subxFunction">read-byte-buffered</span>: <span class="subxComment"># f : (address buffered-file) -&gt; byte-or-Eof/EAX</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L38" class="LineNr"> 38 </span> 55/push-EBP
<span id="L39" class="LineNr"> 39 </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="L40" class="LineNr"> 40 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L41" class="LineNr"> 41 </span> 51/push-ECX
<span id="L42" class="LineNr"> 42 </span> 56/push-ESI
<span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># ESI = f</span>
<span id="L44" class="LineNr"> 44 </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="L45" class="LineNr"> 45 </span> <span class="subxComment"># ECX = f-&gt;read</span>
<span id="L46" class="LineNr"> 46 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <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 *(ESI+8) to ECX</span>
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L48" class="LineNr"> 48 </span> 3b/compare 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># compare ECX with *(ESI+4)</span>
<span id="L49" class="LineNr"> 49 </span> 7c/jump-if-lesser $read-byte-buffered:from-stream/disp8
<span id="L50" class="LineNr"> 50 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L52" class="LineNr"> 52 </span> 8d/copy-address 1/mod/*+disp8 6/rm32/ESI <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 ESI+4 to EAX</span>
<span id="L53" class="LineNr"> 53 </span> 50/push-EAX
<span id="L54" class="LineNr"> 54 </span> <span class="subxS2Comment"># . . call</span>
<span id="L55" class="LineNr"> 55 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L56" class="LineNr"> 56 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L57" class="LineNr"> 57 </span> 81 0/subop/add 3/mod/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="L58" class="LineNr"> 58 </span> <span class="subxS1Comment"># . f-&gt;read must now be 0; update its cache at ECX</span>
<span id="L59" class="LineNr"> 59 </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="L60" class="LineNr"> 60 </span> <span class="subxS1Comment"># . EAX = read(f-&gt;fd, stream = f+4)</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L62" class="LineNr"> 62 </span> 50/push-EAX
<span id="L63" class="LineNr"> 63 </span> ff 6/subop/push 0/mod/indirect 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ESI</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . call</span>
<span id="L65" class="LineNr"> 65 </span> e8/call <a href='060read.subx.html#L48'>read</a>/disp32
<span id="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L67" class="LineNr"> 67 </span> 81 0/subop/add 3/mod/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="L68" class="LineNr"> 68 </span> <span class="subxComment"># if (EAX == 0) return 0xffffffff</span>
<span id="L69" class="LineNr"> 69 </span> 3d/compare-EAX-and 0/imm32
<span id="L70" class="LineNr"> 70 </span> 75/jump-if-not-equal $read-byte-buffered:from-stream/disp8
<span id="L71" class="LineNr"> 71 </span> b8/copy-to-EAX 0xffffffff/imm32/Eof
<span id="L72" class="LineNr"> 72 </span> eb/jump $read-byte-buffered:end/disp8
<span id="L73" class="LineNr"> 73 </span><span class="Constant">$read-byte-buffered:from-stream</span>:
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># read byte from stream</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L76" class="LineNr"> 76 </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="L77" class="LineNr"> 77 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+16) to AL</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L79" class="LineNr"> 79 </span> ff 0/subop/increment 1/mod/*+disp8 6/rm32/ESI <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"># increment *(ESI+8)</span>
<span id="L80" class="LineNr"> 80 </span><span class="Constant">$read-byte-buffered:end</span>:
<span id="L81" class="LineNr"> 81 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L82" class="LineNr"> 82 </span> 5e/pop-to-ESI
<span id="L83" class="LineNr"> 83 </span> 59/pop-to-ECX
<span id="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L85" class="LineNr"> 85 </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="L86" class="LineNr"> 86 </span> 5d/pop-to-EBP
<span id="L87" class="LineNr"> 87 </span> c3/return
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="subxH1Comment"># - tests</span>
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="subxTest">test-read-byte-buffered-single</span>:
<span id="L92" class="LineNr"> 92 </span> <span class="subxH1Comment"># - check that read-byte-buffered returns first byte of 'file'</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># setup</span>
<span id="L94" class="LineNr"> 94 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L95" class="LineNr"> 95 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L96" class="LineNr"> 96 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L97" class="LineNr"> 97 </span> <span class="subxS2Comment"># . . call</span>
<span id="L98" class="LineNr"> 98 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L99" class="LineNr"> 99 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L100" class="LineNr">100 </span> 81 0/subop/add 3/mod/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="L101" class="LineNr">101 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L102" class="LineNr">102 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L103" class="LineNr">103 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L104" class="LineNr">104 </span> 05/add-to-EAX 4/imm32
<span id="L105" class="LineNr">105 </span> 50/push-EAX
<span id="L106" class="LineNr">106 </span> <span class="subxS2Comment"># . . call</span>
<span id="L107" class="LineNr">107 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L108" class="LineNr">108 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L109" class="LineNr">109 </span> 81 0/subop/add 3/mod/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="L110" class="LineNr">110 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Ab&quot;)</span>
<span id="L111" class="LineNr">111 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L112" class="LineNr">112 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L113" class="LineNr">113 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L114" class="LineNr">114 </span> <span class="subxS2Comment"># . . call</span>
<span id="L115" class="LineNr">115 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L115" class="LineNr">115 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L116" class="LineNr">116 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L117" class="LineNr">117 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L118" class="LineNr">118 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Ab&quot;)</span>
<span id="L117" class="LineNr">117 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L118" class="LineNr">118 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L120" class="LineNr">120 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L121" class="LineNr">121 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . call</span>
<span id="L123" class="LineNr">123 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L125" class="LineNr">125 </span> 81 0/subop/add 3/mod/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="L126" class="LineNr">126 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr">128 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . call</span>
<span id="L130" class="LineNr">130 </span> e8/call <a href='061read-byte.subx.html#L44'>read-byte-buffered</a>/disp32
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L132" class="LineNr">132 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L133" class="LineNr">133 </span> <span class="subxComment"># check-ints-equal(EAX, 'A', msg)</span>
<span id="L134" class="LineNr">134 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L135" class="LineNr">135 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-single&quot;</span>/imm32
<span id="L136" class="LineNr">136 </span> 68/push 0x41/imm32
<span id="L137" class="LineNr">137 </span> 50/push-EAX
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . call</span>
<span id="L139" class="LineNr">139 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L141" class="LineNr">141 </span> 81 0/subop/add 3/mod/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="L142" class="LineNr">142 </span> <span class="subxS1Comment"># . end</span>
<span id="L143" class="LineNr">143 </span> c3/return
<span id="L144" class="LineNr">144 </span>
<span id="L145" class="LineNr">145 </span><span class="subxTest">test-read-byte-buffered-multiple</span>:
<span id="L146" class="LineNr">146 </span> <span class="subxH1Comment"># - call read-byte-buffered twice, check that second call returns second byte</span>
<span id="L147" class="LineNr">147 </span> <span class="subxComment"># setup</span>
<span id="L148" class="LineNr">148 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L149" class="LineNr">149 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L150" class="LineNr">150 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L151" class="LineNr">151 </span> <span class="subxS2Comment"># . . call</span>
<span id="L152" class="LineNr">152 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L154" class="LineNr">154 </span> 81 0/subop/add 3/mod/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="L155" class="LineNr">155 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L157" class="LineNr">157 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L158" class="LineNr">158 </span> 05/add-to-EAX 4/imm32
<span id="L159" class="LineNr">159 </span> 50/push-EAX
<span id="L120" class="LineNr">120 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L121" class="LineNr">121 </span> <span class="subxS2Comment"># . . call</span>
<span id="L122" class="LineNr">122 </span> e8/call <a href='061read-byte.subx.html#L36'>read-byte-buffered</a>/disp32
<span id="L123" class="LineNr">123 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L124" class="LineNr">124 </span> 81 0/subop/add 3/mod/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="L125" class="LineNr">125 </span> <span class="subxComment"># check-ints-equal(EAX, 'A', msg)</span>
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L127" class="LineNr">127 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-single&quot;</span>/imm32
<span id="L128" class="LineNr">128 </span> 68/push 0x41/imm32
<span id="L129" class="LineNr">129 </span> 50/push-EAX
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . call</span>
<span id="L131" class="LineNr">131 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L133" class="LineNr">133 </span> 81 0/subop/add 3/mod/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="L134" class="LineNr">134 </span> <span class="subxS1Comment"># . end</span>
<span id="L135" class="LineNr">135 </span> c3/return
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="subxTest">test-read-byte-buffered-multiple</span>:
<span id="L138" class="LineNr">138 </span> <span class="subxH1Comment"># - call read-byte-buffered twice, check that second call returns second byte</span>
<span id="L139" class="LineNr">139 </span> <span class="subxComment"># setup</span>
<span id="L140" class="LineNr">140 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L142" class="LineNr">142 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . call</span>
<span id="L144" class="LineNr">144 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L146" class="LineNr">146 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L147" class="LineNr">147 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L149" class="LineNr">149 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L150" class="LineNr">150 </span> 05/add-to-EAX 4/imm32
<span id="L151" class="LineNr">151 </span> 50/push-EAX
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . call</span>
<span id="L153" class="LineNr">153 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L155" class="LineNr">155 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L156" class="LineNr">156 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Ab&quot;)</span>
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L158" class="LineNr">158 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L159" class="LineNr">159 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L160" class="LineNr">160 </span> <span class="subxS2Comment"># . . call</span>
<span id="L161" class="LineNr">161 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L161" class="LineNr">161 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L163" class="LineNr">163 </span> 81 0/subop/add 3/mod/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="L164" class="LineNr">164 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Ab&quot;)</span>
<span id="L163" class="LineNr">163 </span> 81 0/subop/add 3/mod/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="L164" class="LineNr">164 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L166" class="LineNr">166 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L167" class="LineNr">167 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L168" class="LineNr">168 </span> <span class="subxS2Comment"># . . call</span>
<span id="L169" class="LineNr">169 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L171" class="LineNr">171 </span> 81 0/subop/add 3/mod/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="L172" class="LineNr">172 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L174" class="LineNr">174 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . call</span>
<span id="L176" class="LineNr">176 </span> e8/call <a href='061read-byte.subx.html#L44'>read-byte-buffered</a>/disp32
<span id="L177" class="LineNr">177 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L178" class="LineNr">178 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L179" class="LineNr">179 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L181" class="LineNr">181 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . call</span>
<span id="L183" class="LineNr">183 </span> e8/call <a href='061read-byte.subx.html#L44'>read-byte-buffered</a>/disp32
<span id="L184" class="LineNr">184 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L185" class="LineNr">185 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L186" class="LineNr">186 </span> <span class="subxComment"># check-ints-equal(EAX, 'b', msg)</span>
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L188" class="LineNr">188 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-multiple&quot;</span>/imm32
<span id="L189" class="LineNr">189 </span> 68/push 0x62/imm32
<span id="L190" class="LineNr">190 </span> 50/push-EAX
<span id="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . call</span>
<span id="L192" class="LineNr">192 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L194" class="LineNr">194 </span> 81 0/subop/add 3/mod/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="L195" class="LineNr">195 </span> <span class="subxS1Comment"># . end</span>
<span id="L196" class="LineNr">196 </span> c3/return
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="subxTest">test-read-byte-buffered-end-of-file</span>:
<span id="L199" class="LineNr">199 </span> <span class="subxH1Comment"># - call read-byte-buffered on an empty 'file', check that it returns Eof</span>
<span id="L200" class="LineNr">200 </span> <span class="subxComment"># setup</span>
<span id="L201" class="LineNr">201 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L203" class="LineNr">203 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . call</span>
<span id="L205" class="LineNr">205 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L206" class="LineNr">206 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L207" class="LineNr">207 </span> 81 0/subop/add 3/mod/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="L208" class="LineNr">208 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L209" class="LineNr">209 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L210" class="LineNr">210 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L211" class="LineNr">211 </span> 05/add-to-EAX 4/imm32
<span id="L212" class="LineNr">212 </span> 50/push-EAX
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . call</span>
<span id="L214" class="LineNr">214 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L216" class="LineNr">216 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L217" class="LineNr">217 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L218" class="LineNr">218 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L219" class="LineNr">219 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . call</span>
<span id="L221" class="LineNr">221 </span> e8/call <a href='061read-byte.subx.html#L44'>read-byte-buffered</a>/disp32
<span id="L222" class="LineNr">222 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L223" class="LineNr">223 </span> 81 0/subop/add 3/mod/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="L224" class="LineNr">224 </span> <span class="subxComment"># check-ints-equal(EAX, 0xffffffff, msg)</span>
<span id="L225" class="LineNr">225 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L226" class="LineNr">226 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-end-of-file&quot;</span>/imm32
<span id="L227" class="LineNr">227 </span> 68/push 0xffffffff/imm32/Eof
<span id="L228" class="LineNr">228 </span> 50/push-EAX
<span id="L229" class="LineNr">229 </span> <span class="subxS2Comment"># . . call</span>
<span id="L230" class="LineNr">230 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L231" class="LineNr">231 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L232" class="LineNr">232 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L233" class="LineNr">233 </span> <span class="subxS1Comment"># . end</span>
<span id="L234" class="LineNr">234 </span> c3/return
<span id="L235" class="LineNr">235 </span>
<span id="L236" class="LineNr">236 </span><span class="subxTest">test-read-byte-buffered-refills-buffer</span>:
<span id="L237" class="LineNr">237 </span> <span class="subxH1Comment"># - consume buffered-file's buffer, check that next read-byte-buffered still works</span>
<span id="L238" class="LineNr">238 </span> <span class="subxComment"># setup</span>
<span id="L239" class="LineNr">239 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L241" class="LineNr">241 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L242" class="LineNr">242 </span> <span class="subxS2Comment"># . . call</span>
<span id="L243" class="LineNr">243 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L244" class="LineNr">244 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L245" class="LineNr">245 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L246" class="LineNr">246 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L247" class="LineNr">247 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L248" class="LineNr">248 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L249" class="LineNr">249 </span> 05/add-to-EAX 4/imm32
<span id="L250" class="LineNr">250 </span> 50/push-EAX
<span id="L166" class="LineNr">166 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
<span id="L168" class="LineNr">168 </span> e8/call <a href='061read-byte.subx.html#L36'>read-byte-buffered</a>/disp32
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L170" class="LineNr">170 </span> 81 0/subop/add 3/mod/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="L171" class="LineNr">171 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L173" class="LineNr">173 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . call</span>
<span id="L175" class="LineNr">175 </span> e8/call <a href='061read-byte.subx.html#L36'>read-byte-buffered</a>/disp32
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L177" class="LineNr">177 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L178" class="LineNr">178 </span> <span class="subxComment"># check-ints-equal(EAX, 'b', msg)</span>
<span id="L179" class="LineNr">179 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L180" class="LineNr">180 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-multiple&quot;</span>/imm32
<span id="L181" class="LineNr">181 </span> 68/push 0x62/imm32
<span id="L182" class="LineNr">182 </span> 50/push-EAX
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . call</span>
<span id="L184" class="LineNr">184 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L186" class="LineNr">186 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L187" class="LineNr">187 </span> <span class="subxS1Comment"># . end</span>
<span id="L188" class="LineNr">188 </span> c3/return
<span id="L189" class="LineNr">189 </span>
<span id="L190" class="LineNr">190 </span><span class="subxTest">test-read-byte-buffered-end-of-file</span>:
<span id="L191" class="LineNr">191 </span> <span class="subxH1Comment"># - call read-byte-buffered on an empty 'file', check that it returns Eof</span>
<span id="L192" class="LineNr">192 </span> <span class="subxComment"># setup</span>
<span id="L193" class="LineNr">193 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L195" class="LineNr">195 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . call</span>
<span id="L197" class="LineNr">197 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L198" class="LineNr">198 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L199" class="LineNr">199 </span> 81 0/subop/add 3/mod/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="L200" class="LineNr">200 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L202" class="LineNr">202 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L203" class="LineNr">203 </span> 05/add-to-EAX 4/imm32
<span id="L204" class="LineNr">204 </span> 50/push-EAX
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . call</span>
<span id="L206" class="LineNr">206 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L207" class="LineNr">207 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L208" class="LineNr">208 </span> 81 0/subop/add 3/mod/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="L209" class="LineNr">209 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L212" class="LineNr">212 </span> <span class="subxS2Comment"># . . call</span>
<span id="L213" class="LineNr">213 </span> e8/call <a href='061read-byte.subx.html#L36'>read-byte-buffered</a>/disp32
<span id="L214" class="LineNr">214 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L215" class="LineNr">215 </span> 81 0/subop/add 3/mod/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="L216" class="LineNr">216 </span> <span class="subxComment"># check-ints-equal(EAX, 0xffffffff, msg)</span>
<span id="L217" class="LineNr">217 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L218" class="LineNr">218 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-end-of-file&quot;</span>/imm32
<span id="L219" class="LineNr">219 </span> 68/push 0xffffffff/imm32/Eof
<span id="L220" class="LineNr">220 </span> 50/push-EAX
<span id="L221" class="LineNr">221 </span> <span class="subxS2Comment"># . . call</span>
<span id="L222" class="LineNr">222 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L223" class="LineNr">223 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L224" class="LineNr">224 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L225" class="LineNr">225 </span> <span class="subxS1Comment"># . end</span>
<span id="L226" class="LineNr">226 </span> c3/return
<span id="L227" class="LineNr">227 </span>
<span id="L228" class="LineNr">228 </span><span class="subxTest">test-read-byte-buffered-refills-buffer</span>:
<span id="L229" class="LineNr">229 </span> <span class="subxH1Comment"># - consume buffered-file's buffer, check that next read-byte-buffered still works</span>
<span id="L230" class="LineNr">230 </span> <span class="subxComment"># setup</span>
<span id="L231" class="LineNr">231 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L233" class="LineNr">233 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L234" class="LineNr">234 </span> <span class="subxS2Comment"># . . call</span>
<span id="L235" class="LineNr">235 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L237" class="LineNr">237 </span> 81 0/subop/add 3/mod/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="L238" class="LineNr">238 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L239" class="LineNr">239 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L240" class="LineNr">240 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L241" class="LineNr">241 </span> 05/add-to-EAX 4/imm32
<span id="L242" class="LineNr">242 </span> 50/push-EAX
<span id="L243" class="LineNr">243 </span> <span class="subxS2Comment"># . . call</span>
<span id="L244" class="LineNr">244 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L245" class="LineNr">245 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L246" class="LineNr">246 </span> 81 0/subop/add 3/mod/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="L247" class="LineNr">247 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abcdefgh&quot;)</span>
<span id="L248" class="LineNr">248 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L249" class="LineNr">249 </span> 68/push <span class="Constant">&quot;Abcdefgh&quot;</span>/imm32
<span id="L250" class="LineNr">250 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L251" class="LineNr">251 </span> <span class="subxS2Comment"># . . call</span>
<span id="L252" class="LineNr">252 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L252" class="LineNr">252 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L253" class="LineNr">253 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L254" class="LineNr">254 </span> 81 0/subop/add 3/mod/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="L255" class="LineNr">255 </span> <span class="subxS1Comment"># . write(_test-stream, &quot;Abcdefgh&quot;)</span>
<span id="L256" class="LineNr">256 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L257" class="LineNr">257 </span> 68/push <span class="Constant">&quot;Abcdefgh&quot;</span>/imm32
<span id="L258" class="LineNr">258 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L259" class="LineNr">259 </span> <span class="subxS2Comment"># . . call</span>
<span id="L260" class="LineNr">260 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L261" class="LineNr">261 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L262" class="LineNr">262 </span> 81 0/subop/add 3/mod/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="L263" class="LineNr">263 </span> <span class="subxComment"># pretend buffer is full</span>
<span id="L264" class="LineNr">264 </span> <span class="subxS1Comment"># . _test-buffered-file-&gt;read = 6 # &gt;= _test-buffered-file-&gt;length</span>
<span id="L265" class="LineNr">265 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L266" class="LineNr">266 </span> c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 6/imm32 <span class="subxComment"># copy to *(EAX+8)</span>
<span id="L267" class="LineNr">267 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L268" class="LineNr">268 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L269" class="LineNr">269 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L270" class="LineNr">270 </span> <span class="subxS2Comment"># . . call</span>
<span id="L271" class="LineNr">271 </span> e8/call <a href='061read-byte.subx.html#L44'>read-byte-buffered</a>/disp32
<span id="L272" class="LineNr">272 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L273" class="LineNr">273 </span> 81 0/subop/add 3/mod/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="L274" class="LineNr">274 </span> <span class="subxComment"># check-ints-equal(EAX, 'A', msg)</span>
<span id="L275" class="LineNr">275 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L276" class="LineNr">276 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-refills-buffer&quot;</span>/imm32
<span id="L277" class="LineNr">277 </span> 68/push 0x41/imm32
<span id="L278" class="LineNr">278 </span> 50/push-EAX
<span id="L279" class="LineNr">279 </span> <span class="subxS2Comment"># . . call</span>
<span id="L280" class="LineNr">280 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L281" class="LineNr">281 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L282" class="LineNr">282 </span> 81 0/subop/add 3/mod/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="L283" class="LineNr">283 </span> <span class="subxS1Comment"># . end</span>
<span id="L284" class="LineNr">284 </span> c3/return
<span id="L285" class="LineNr">285 </span>
<span id="L286" class="LineNr">286 </span>== data
<span id="L287" class="LineNr">287 </span>
<span id="L288" class="LineNr">288 </span><span class="subxComment"># a test buffered file for _test-stream</span>
<span id="L289" class="LineNr">289 </span><span class="subxMinorFunction">_test-buffered-file</span>:
<span id="L290" class="LineNr">290 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L291" class="LineNr">291 </span> <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L292" class="LineNr">292 </span> <span class="subxComment"># current write index</span>
<span id="L293" class="LineNr">293 </span> 0/imm32
<span id="L294" class="LineNr">294 </span> <span class="subxComment"># current read index</span>
<span id="L295" class="LineNr">295 </span> 0/imm32
<span id="L296" class="LineNr">296 </span> <span class="subxComment"># length</span>
<span id="L297" class="LineNr">297 </span> 6/imm32
<span id="L298" class="LineNr">298 </span> <span class="subxComment"># data</span>
<span id="L299" class="LineNr">299 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L300" class="LineNr">300 </span>
<span id="L301" class="LineNr">301 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L254" class="LineNr">254 </span> 81 0/subop/add 3/mod/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="L255" class="LineNr">255 </span> <span class="subxComment"># pretend buffer is full</span>
<span id="L256" class="LineNr">256 </span> <span class="subxS1Comment"># . _test-buffered-file-&gt;read = 6 # &gt;= _test-buffered-file-&gt;length</span>
<span id="L257" class="LineNr">257 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L258" class="LineNr">258 </span> c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 6/imm32 <span class="subxComment"># copy to *(EAX+8)</span>
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># read-byte-buffered(_test-buffered-file)</span>
<span id="L260" class="LineNr">260 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L261" class="LineNr">261 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L262" class="LineNr">262 </span> <span class="subxS2Comment"># . . call</span>
<span id="L263" class="LineNr">263 </span> e8/call <a href='061read-byte.subx.html#L36'>read-byte-buffered</a>/disp32
<span id="L264" class="LineNr">264 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L265" class="LineNr">265 </span> 81 0/subop/add 3/mod/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="L266" class="LineNr">266 </span> <span class="subxComment"># check-ints-equal(EAX, 'A', msg)</span>
<span id="L267" class="LineNr">267 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L268" class="LineNr">268 </span> 68/push <span class="Constant">&quot;F - test-read-byte-buffered-refills-buffer&quot;</span>/imm32
<span id="L269" class="LineNr">269 </span> 68/push 0x41/imm32
<span id="L270" class="LineNr">270 </span> 50/push-EAX
<span id="L271" class="LineNr">271 </span> <span class="subxS2Comment"># . . call</span>
<span id="L272" class="LineNr">272 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L273" class="LineNr">273 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L274" class="LineNr">274 </span> 81 0/subop/add 3/mod/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="L275" class="LineNr">275 </span> <span class="subxS1Comment"># . end</span>
<span id="L276" class="LineNr">276 </span> c3/return
<span id="L277" class="LineNr">277 </span>
<span id="L278" class="LineNr">278 </span>== data
<span id="L279" class="LineNr">279 </span>
<span id="L280" class="LineNr">280 </span><span class="subxComment"># a test buffered file for _test-stream</span>
<span id="L281" class="LineNr">281 </span><span class="subxMinorFunction">_test-buffered-file</span>:
<span id="L282" class="LineNr">282 </span> <span class="subxComment"># file descriptor or (address stream)</span>
<span id="L283" class="LineNr">283 </span> <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L284" class="LineNr">284 </span> <span class="subxComment"># current write index</span>
<span id="L285" class="LineNr">285 </span> 0/imm32
<span id="L286" class="LineNr">286 </span> <span class="subxComment"># current read index</span>
<span id="L287" class="LineNr">287 </span> 0/imm32
<span id="L288" class="LineNr">288 </span> <span class="subxComment"># length</span>
<span id="L289" class="LineNr">289 </span> 6/imm32
<span id="L290" class="LineNr">290 </span> <span class="subxComment"># data</span>
<span id="L291" class="LineNr">291 </span> 00 00 00 00 00 00 <span class="subxComment"># 6 bytes</span>
<span id="L292" class="LineNr">292 </span>
<span id="L293" class="LineNr">293 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/062write-stream.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxMinorFunction { color: #875f5f; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -119,7 +119,7 @@ if ('onhashchange' in window) {
<span id="L58" class="LineNr"> 58 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 0/index/EAX <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+EAX+12 to EAX</span>
<span id="L59" class="LineNr"> 59 </span> 50/push-EAX
<span id="L60" class="LineNr"> 60 </span> <span class="subxS2Comment"># . . call</span>
<span id="L61" class="LineNr"> 61 </span> e8/call <a href='056trace.subx.html#L301'>_append-4</a>/disp32
<span id="L61" class="LineNr"> 61 </span> e8/call <a href='056trace.subx.html#L913'>_append-4</a>/disp32
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L63" class="LineNr"> 63 </span> 81 0/subop/add 3/mod/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="L64" class="LineNr"> 64 </span> <span class="subxComment"># f-&gt;write += EAX</span>
@ -233,7 +233,7 @@ if ('onhashchange' in window) {
<span id="L172" class="LineNr">172 </span> 68/push <span class="Constant">&quot;Ab&quot;</span>/imm32
<span id="L173" class="LineNr">173 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . call</span>
<span id="L175" class="LineNr">175 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L175" class="LineNr">175 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L177" class="LineNr">177 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L178" class="LineNr">178 </span> <span class="subxS1Comment"># . end</span>
@ -295,7 +295,7 @@ if ('onhashchange' in window) {
<span id="L234" class="LineNr">234 </span> 68/push <span class="Constant">&quot;CD&quot;</span>/imm32
<span id="L235" class="LineNr">235 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . call</span>
<span id="L237" class="LineNr">237 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L237" class="LineNr">237 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-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"># . end</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/063error.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -98,7 +98,7 @@ if ('onhashchange' in window) {
<span id="L39" class="LineNr">39 </span> 68/push 1/imm32
<span id="L40" class="LineNr">40 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L41" class="LineNr">41 </span> <span class="subxS2Comment"># . . call</span>
<span id="L42" class="LineNr">42 </span> e8/call <a href='059stop.subx.html#L98'>stop</a>/disp32
<span id="L42" class="LineNr">42 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L43" class="LineNr">43 </span> <span class="subxComment"># should never get past this point</span>
<span id="L44" class="LineNr">44 </span><span class="Constant">$error:dead-end</span>:
<span id="L45" class="LineNr">45 </span> <span class="subxS1Comment"># . epilog</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/064write-byte.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -40,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -176,7 +176,7 @@ if ('onhashchange' in window) {
<span id="L115" class="LineNr">115 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L116" class="LineNr">116 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L117" class="LineNr">117 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L118" class="LineNr">118 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L118" class="LineNr">118 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L119" class="LineNr">119 </span> 05/add-to-EAX 4/imm32
<span id="L120" class="LineNr">120 </span> 50/push-EAX
<span id="L121" class="LineNr">121 </span> <span class="subxS2Comment"># . . call</span>
@ -186,14 +186,14 @@ if ('onhashchange' in window) {
<span id="L125" class="LineNr">125 </span> <span class="subxComment"># write-byte-buffered(_test-buffered-file, 'A')</span>
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L127" class="LineNr">127 </span> 68/push 0x41/imm32
<span id="L128" class="LineNr">128 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L128" class="LineNr">128 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . call</span>
<span id="L130" class="LineNr">130 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L132" class="LineNr">132 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L133" class="LineNr">133 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L134" class="LineNr">134 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L135" class="LineNr">135 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L135" class="LineNr">135 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L136" class="LineNr">136 </span> <span class="subxS2Comment"># . . call</span>
<span id="L137" class="LineNr">137 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . discard args</span>
@ -204,7 +204,7 @@ if ('onhashchange' in window) {
<span id="L143" class="LineNr">143 </span> 68/push <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L144" class="LineNr">144 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . call</span>
<span id="L146" class="LineNr">146 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L146" class="LineNr">146 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L148" class="LineNr">148 </span> 81 0/subop/add 3/mod/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="L149" class="LineNr">149 </span> <span class="subxS1Comment"># . end</span>
@ -222,7 +222,7 @@ if ('onhashchange' in window) {
<span id="L161" class="LineNr">161 </span> 81 0/subop/add 3/mod/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="L162" class="LineNr">162 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L164" class="LineNr">164 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L164" class="LineNr">164 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L165" class="LineNr">165 </span> 05/add-to-EAX 4/imm32
<span id="L166" class="LineNr">166 </span> 50/push-EAX
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
@ -233,7 +233,7 @@ if ('onhashchange' in window) {
<span id="L172" class="LineNr">172 </span> <span class="subxS1Comment"># . write(_test-buffered-file+4, 'abcdef')</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L174" class="LineNr">174 </span> 68/push <span class="Constant">&quot;abcdef&quot;</span>/imm32
<span id="L175" class="LineNr">175 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L175" class="LineNr">175 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L176" class="LineNr">176 </span> 05/add-to-EAX 4/imm32
<span id="L177" class="LineNr">177 </span> 50/push-EAX
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . call</span>
@ -243,14 +243,14 @@ if ('onhashchange' in window) {
<span id="L182" class="LineNr">182 </span> <span class="subxComment"># write-byte-buffered(_test-buffered-file, 'g')</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> 68/push 0x67/imm32
<span id="L185" class="LineNr">185 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L185" class="LineNr">185 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . call</span>
<span id="L187" class="LineNr">187 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L189" class="LineNr">189 </span> 81 0/subop/add 3/mod/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="L190" class="LineNr">190 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L192" class="LineNr">192 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L192" class="LineNr">192 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . call</span>
<span id="L194" class="LineNr">194 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . discard args</span>
@ -261,7 +261,7 @@ if ('onhashchange' in window) {
<span id="L200" class="LineNr">200 </span> 68/push <span class="Constant">&quot;abcdefg&quot;</span>/imm32
<span id="L201" class="LineNr">201 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L203" class="LineNr">203 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L206" class="LineNr">206 </span> <span class="subxS1Comment"># . end</span>
@ -340,7 +340,7 @@ if ('onhashchange' in window) {
<span id="L279" class="LineNr">279 </span> 68/push <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L280" class="LineNr">280 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L281" class="LineNr">281 </span> <span class="subxS2Comment"># . . call</span>
<span id="L282" class="LineNr">282 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L282" class="LineNr">282 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L283" class="LineNr">283 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L284" class="LineNr">284 </span> 81 0/subop/add 3/mod/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="L285" class="LineNr">285 </span> <span class="subxS1Comment"># . end</span>

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/066write-buffered.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,15 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -40,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -66,217 +65,209 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">#? e8/call test-write-buffered/disp32</span>
<span id="L10" class="LineNr"> 10 </span><span class="CommentedCode">#? e8/call test-write-buffered-with-intermediate-flush/disp32</span>
<span id="L11" class="LineNr"> 11 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L12" class="LineNr"> 12 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L13" class="LineNr"> 13 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L14" class="LineNr"> 14 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="subxFunction">write-buffered</span>: <span class="subxComment"># f : (address buffered-file), msg : (address array byte) -&gt; &lt;void&gt;</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># pseudocode:</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># in = msg-&gt;data</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># inend = &amp;msg-&gt;data[msg-&gt;length]</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># while (in &lt; inend)</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># if f-&gt;write &gt;= f-&gt;length</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># flush(f)</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># clear-stream(f)</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># c = *in</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = c</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># ++f-&gt;write</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># ++in</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxFunction">write-buffered</span>: <span class="subxComment"># f : (address buffered-file), msg : (address array byte) -&gt; &lt;void&gt;</span>
<span id="L9" class="LineNr"> 9 </span> <span class="subxComment"># pseudocode:</span>
<span id="L10" class="LineNr"> 10 </span> <span class="subxComment"># in = msg-&gt;data</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxComment"># inend = &amp;msg-&gt;data[msg-&gt;length]</span>
<span id="L12" class="LineNr"> 12 </span> <span class="subxComment"># while (in &lt; inend)</span>
<span id="L13" class="LineNr"> 13 </span> <span class="subxComment"># if f-&gt;write &gt;= f-&gt;length</span>
<span id="L14" class="LineNr"> 14 </span> <span class="subxComment"># flush(f)</span>
<span id="L15" class="LineNr"> 15 </span> <span class="subxComment"># clear-stream(f)</span>
<span id="L16" class="LineNr"> 16 </span> <span class="subxComment"># c = *in</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = c</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># ++f-&gt;write</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># ++in</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment">#</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># registers:</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># in: ESI</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># inend: ECX</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># f: EDI</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># f-&gt;length: EDX</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># f-&gt;write: EBX (cached; need to keep in sync)</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># c: EAX</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment">#</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># registers:</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># in: ESI</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># inend: ECX</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># f: EDI</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># f-&gt;length: EDX</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># f-&gt;write: EBX (cached; need to keep in sync)</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># c: EAX</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment">#</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L38" class="LineNr"> 38 </span> 55/push-EBP
<span id="L39" class="LineNr"> 39 </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="L40" class="LineNr"> 40 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L41" class="LineNr"> 41 </span> 50/push-EAX
<span id="L42" class="LineNr"> 42 </span> 51/push-ECX
<span id="L43" class="LineNr"> 43 </span> 52/push-EDX
<span id="L44" class="LineNr"> 44 </span> 53/push-EBX
<span id="L45" class="LineNr"> 45 </span> 56/push-ESI
<span id="L46" class="LineNr"> 46 </span> 57/push-EDI
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment"># EAX = msg</span>
<span id="L48" class="LineNr"> 48 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L49" class="LineNr"> 49 </span> <span class="subxComment"># in/ESI = msg-&gt;data</span>
<span id="L50" class="LineNr"> 50 </span> 8d/copy-address 1/mod/*+disp8 0/rm32/EAX <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 EAX+4 to ESI</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># inend/ECX = &amp;msg-&gt;data[msg-&gt;length]</span>
<span id="L52" class="LineNr"> 52 </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="L53" class="LineNr"> 53 </span> 8d/copy-address 0/mod/indirect 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESI+ECX to ECX</span>
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># EDI = f</span>
<span id="L55" class="LineNr"> 55 </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="L56" class="LineNr"> 56 </span> <span class="subxComment"># EDX = f-&gt;length</span>
<span id="L57" class="LineNr"> 57 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+12) to EDX</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># EBX = f-&gt;write</span>
<span id="L59" class="LineNr"> 59 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <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 *(EDI+4) to EBX</span>
<span id="L60" class="LineNr"> 60 </span><span class="Constant">$write-buffered:loop</span>:
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># if (in &gt;= inend) break</span>
<span id="L62" class="LineNr"> 62 </span> 39/compare 3/mod/direct 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ESI with ECX</span>
<span id="L63" class="LineNr"> 63 </span> 7d/jump-if-greater-or-equal $write-buffered:loop-end/disp8
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># if (f-&gt;write &gt;= f-&gt;length) flush and clear f's stream</span>
<span id="L65" class="LineNr"> 65 </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="L66" class="LineNr"> 66 </span> 7c/jump-if-lesser $write-buffered:to-stream/disp8
<span id="L67" class="LineNr"> 67 </span> <span class="subxS1Comment"># . persist f-&gt;write</span>
<span id="L68" class="LineNr"> 68 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EBX to *(EDI+4)</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxS1Comment"># . flush(f)</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L71" class="LineNr"> 71 </span> 57/push-EDI
<span id="L29" class="LineNr"> 29 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L30" class="LineNr"> 30 </span> 55/push-EBP
<span id="L31" class="LineNr"> 31 </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="L32" class="LineNr"> 32 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L33" class="LineNr"> 33 </span> 50/push-EAX
<span id="L34" class="LineNr"> 34 </span> 51/push-ECX
<span id="L35" class="LineNr"> 35 </span> 52/push-EDX
<span id="L36" class="LineNr"> 36 </span> 53/push-EBX
<span id="L37" class="LineNr"> 37 </span> 56/push-ESI
<span id="L38" class="LineNr"> 38 </span> 57/push-EDI
<span id="L39" class="LineNr"> 39 </span> <span class="subxComment"># EAX = msg</span>
<span id="L40" class="LineNr"> 40 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxComment"># in/ESI = msg-&gt;data</span>
<span id="L42" class="LineNr"> 42 </span> 8d/copy-address 1/mod/*+disp8 0/rm32/EAX <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 EAX+4 to ESI</span>
<span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># inend/ECX = &amp;msg-&gt;data[msg-&gt;length]</span>
<span id="L44" class="LineNr"> 44 </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="L45" class="LineNr"> 45 </span> 8d/copy-address 0/mod/indirect 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy ESI+ECX to ECX</span>
<span id="L46" class="LineNr"> 46 </span> <span class="subxComment"># EDI = f</span>
<span id="L47" class="LineNr"> 47 </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="L48" class="LineNr"> 48 </span> <span class="subxComment"># EDX = f-&gt;length</span>
<span id="L49" class="LineNr"> 49 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+12) to EDX</span>
<span id="L50" class="LineNr"> 50 </span> <span class="subxComment"># EBX = f-&gt;write</span>
<span id="L51" class="LineNr"> 51 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <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 *(EDI+4) to EBX</span>
<span id="L52" class="LineNr"> 52 </span><span class="Constant">$write-buffered:loop</span>:
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># if (in &gt;= inend) break</span>
<span id="L54" class="LineNr"> 54 </span> 39/compare 3/mod/direct 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ESI with ECX</span>
<span id="L55" class="LineNr"> 55 </span> 73/jump-if-greater-or-equal-unsigned $write-buffered:loop-end/disp8
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># if (f-&gt;write &gt;= f-&gt;length) flush and clear f's stream</span>
<span id="L57" class="LineNr"> 57 </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="L58" class="LineNr"> 58 </span> 7c/jump-if-lesser $write-buffered:to-stream/disp8
<span id="L59" class="LineNr"> 59 </span> <span class="subxS1Comment"># . persist f-&gt;write</span>
<span id="L60" class="LineNr"> 60 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EBX to *(EDI+4)</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxS1Comment"># . flush(f)</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L63" class="LineNr"> 63 </span> 57/push-EDI
<span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . call</span>
<span id="L65" class="LineNr"> 65 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L67" class="LineNr"> 67 </span> 81 0/subop/add 3/mod/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="L68" class="LineNr"> 68 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L70" class="LineNr"> 70 </span> 8d/copy-address 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+4 to EAX</span>
<span id="L71" class="LineNr"> 71 </span> 50/push-EAX
<span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . call</span>
<span id="L73" class="LineNr"> 73 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L73" class="LineNr"> 73 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L74" class="LineNr"> 74 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L75" class="LineNr"> 75 </span> 81 0/subop/add 3/mod/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="L76" class="LineNr"> 76 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L78" class="LineNr"> 78 </span> 8d/copy-address 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+4 to EAX</span>
<span id="L79" class="LineNr"> 79 </span> 50/push-EAX
<span id="L80" class="LineNr"> 80 </span> <span class="subxS2Comment"># . . call</span>
<span id="L81" class="LineNr"> 81 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L82" class="LineNr"> 82 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L83" class="LineNr"> 83 </span> 81 0/subop/add 3/mod/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="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . f-&gt;write must now be 0; update its cache at EBX</span>
<span id="L85" class="LineNr"> 85 </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="L86" class="LineNr"> 86 </span><span class="Constant">$write-buffered:to-stream</span>:
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># write to stream</span>
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = *in</span>
<span id="L89" class="LineNr"> 89 </span> <span class="subxS1Comment"># . AL = *in</span>
<span id="L90" class="LineNr"> 90 </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="L91" class="LineNr"> 91 </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="L92" class="LineNr"> 92 </span> <span class="subxS1Comment"># . f-&gt;data[f-&gt;write] = AL</span>
<span id="L93" class="LineNr"> 93 </span> 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 3/index/EBX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy AL to *(EDI+EBX+16)</span>
<span id="L94" class="LineNr"> 94 </span> <span class="subxComment"># ++f-&gt;write</span>
<span id="L95" class="LineNr"> 95 </span> 43/increment-EBX
<span id="L96" class="LineNr"> 96 </span> <span class="subxComment"># ++in</span>
<span id="L97" class="LineNr"> 97 </span> 46/increment-ESI
<span id="L98" class="LineNr"> 98 </span> eb/jump $write-buffered:loop/disp8
<span id="L99" class="LineNr"> 99 </span><span class="Constant">$write-buffered:loop-end</span>:
<span id="L100" class="LineNr">100 </span> <span class="subxComment"># persist necessary variables from registers</span>
<span id="L101" class="LineNr">101 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EBX to *(EDI+4)</span>
<span id="L102" class="LineNr">102 </span><span class="Constant">$write-buffered:end</span>:
<span id="L103" class="LineNr">103 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L104" class="LineNr">104 </span> 5f/pop-to-EDI
<span id="L105" class="LineNr">105 </span> 5e/pop-to-ESI
<span id="L106" class="LineNr">106 </span> 5b/pop-to-EBX
<span id="L107" class="LineNr">107 </span> 5a/pop-to-EDX
<span id="L108" class="LineNr">108 </span> 59/pop-to-ECX
<span id="L109" class="LineNr">109 </span> 58/pop-to-EAX
<span id="L110" class="LineNr">110 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L111" class="LineNr">111 </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="L112" class="LineNr">112 </span> 5d/pop-to-EBP
<span id="L113" class="LineNr">113 </span> c3/return
<span id="L114" class="LineNr">114 </span>
<span id="L115" class="LineNr">115 </span><span class="subxTest">test-write-buffered</span>:
<span id="L116" class="LineNr">116 </span> <span class="subxH1Comment"># - check that write-buffered writes to the file</span>
<span id="L117" class="LineNr">117 </span> <span class="subxComment"># setup</span>
<span id="L118" class="LineNr">118 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L120" class="LineNr">120 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L121" class="LineNr">121 </span> <span class="subxS2Comment"># . . call</span>
<span id="L122" class="LineNr">122 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L123" class="LineNr">123 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L124" class="LineNr">124 </span> 81 0/subop/add 3/mod/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="L125" class="LineNr">125 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L127" class="LineNr">127 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L128" class="LineNr">128 </span> 05/add-to-EAX 4/imm32
<span id="L129" class="LineNr">129 </span> 50/push-EAX
<span id="L76" class="LineNr"> 76 </span> <span class="subxS1Comment"># . f-&gt;write must now be 0; update its cache at EBX</span>
<span id="L77" class="LineNr"> 77 </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="L78" class="LineNr"> 78 </span><span class="Constant">$write-buffered:to-stream</span>:
<span id="L79" class="LineNr"> 79 </span> <span class="subxComment"># write to stream</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = *in</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxS1Comment"># . AL = *in</span>
<span id="L82" class="LineNr"> 82 </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="L83" class="LineNr"> 83 </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="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . f-&gt;data[f-&gt;write] = AL</span>
<span id="L85" class="LineNr"> 85 </span> 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 3/index/EBX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy AL to *(EDI+EBX+16)</span>
<span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># ++f-&gt;write</span>
<span id="L87" class="LineNr"> 87 </span> 43/increment-EBX
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># ++in</span>
<span id="L89" class="LineNr"> 89 </span> 46/increment-ESI
<span id="L90" class="LineNr"> 90 </span> eb/jump $write-buffered:loop/disp8
<span id="L91" class="LineNr"> 91 </span><span class="Constant">$write-buffered:loop-end</span>:
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># persist necessary variables from registers</span>
<span id="L93" class="LineNr"> 93 </span> 89/copy 1/mod/*+disp8 7/rm32/EDI <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 EBX to *(EDI+4)</span>
<span id="L94" class="LineNr"> 94 </span><span class="Constant">$write-buffered:end</span>:
<span id="L95" class="LineNr"> 95 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L96" class="LineNr"> 96 </span> 5f/pop-to-EDI
<span id="L97" class="LineNr"> 97 </span> 5e/pop-to-ESI
<span id="L98" class="LineNr"> 98 </span> 5b/pop-to-EBX
<span id="L99" class="LineNr"> 99 </span> 5a/pop-to-EDX
<span id="L100" class="LineNr">100 </span> 59/pop-to-ECX
<span id="L101" class="LineNr">101 </span> 58/pop-to-EAX
<span id="L102" class="LineNr">102 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L103" class="LineNr">103 </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="L104" class="LineNr">104 </span> 5d/pop-to-EBP
<span id="L105" class="LineNr">105 </span> c3/return
<span id="L106" class="LineNr">106 </span>
<span id="L107" class="LineNr">107 </span><span class="subxTest">test-write-buffered</span>:
<span id="L108" class="LineNr">108 </span> <span class="subxH1Comment"># - check that write-buffered writes to the file</span>
<span id="L109" class="LineNr">109 </span> <span class="subxComment"># setup</span>
<span id="L110" class="LineNr">110 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L111" class="LineNr">111 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L112" class="LineNr">112 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . call</span>
<span id="L114" class="LineNr">114 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L115" class="LineNr">115 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L116" class="LineNr">116 </span> 81 0/subop/add 3/mod/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="L117" class="LineNr">117 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L119" class="LineNr">119 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L120" class="LineNr">120 </span> 05/add-to-EAX 4/imm32
<span id="L121" class="LineNr">121 </span> 50/push-EAX
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . call</span>
<span id="L123" class="LineNr">123 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L125" class="LineNr">125 </span> 81 0/subop/add 3/mod/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="L126" class="LineNr">126 </span> <span class="subxComment"># write-buffered(_test-buffered-file, &quot;Abc&quot;)</span>
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr">128 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L129" class="LineNr">129 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L130" class="LineNr">130 </span> <span class="subxS2Comment"># . . call</span>
<span id="L131" class="LineNr">131 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L131" class="LineNr">131 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L133" class="LineNr">133 </span> 81 0/subop/add 3/mod/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="L134" class="LineNr">134 </span> <span class="subxComment"># write-buffered(_test-buffered-file, &quot;Abc&quot;)</span>
<span id="L133" class="LineNr">133 </span> 81 0/subop/add 3/mod/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="L134" class="LineNr">134 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L136" class="LineNr">136 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L137" class="LineNr">137 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . call</span>
<span id="L139" class="LineNr">139 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L141" class="LineNr">141 </span> 81 0/subop/add 3/mod/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="L142" class="LineNr">142 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L144" class="LineNr">144 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . call</span>
<span id="L146" class="LineNr">146 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L148" class="LineNr">148 </span> 81 0/subop/add 3/mod/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="L149" class="LineNr">149 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;Abc&quot;, msg)</span>
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L151" class="LineNr">151 </span> 68/push <span class="Constant">&quot;F - test-write-buffered-single&quot;</span>/imm32
<span id="L152" class="LineNr">152 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L153" class="LineNr">153 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . call</span>
<span id="L155" class="LineNr">155 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L157" class="LineNr">157 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS1Comment"># . end</span>
<span id="L159" class="LineNr">159 </span> c3/return
<span id="L160" class="LineNr">160 </span>
<span id="L161" class="LineNr">161 </span><span class="subxTest">test-write-buffered-with-intermediate-flush</span>:
<span id="L162" class="LineNr">162 </span> <span class="subxH1Comment"># - check that write-buffered flushes in the middle if its buffer fills up</span>
<span id="L163" class="LineNr">163 </span> <span class="subxComment"># setup</span>
<span id="L164" class="LineNr">164 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L166" class="LineNr">166 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
<span id="L168" class="LineNr">168 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L170" class="LineNr">170 </span> 81 0/subop/add 3/mod/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="L171" class="LineNr">171 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L173" class="LineNr">173 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L174" class="LineNr">174 </span> 05/add-to-EAX 4/imm32
<span id="L175" class="LineNr">175 </span> 50/push-EAX
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . call</span>
<span id="L177" class="LineNr">177 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L179" class="LineNr">179 </span> 81 0/subop/add 3/mod/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="L180" class="LineNr">180 </span> <span class="subxComment"># _test-stream can hold 8 bytes, but _test-buffered-file can hold only 6.</span>
<span id="L181" class="LineNr">181 </span> <span class="subxComment"># Try to write 7 bytes.</span>
<span id="L182" class="LineNr">182 </span> <span class="subxS1Comment"># . write-buffered(_test-buffered-file, &quot;Abcdefg&quot;)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> 68/push <span class="Constant">&quot;Abcdefg&quot;</span>/imm32
<span id="L185" class="LineNr">185 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . call</span>
<span id="L187" class="LineNr">187 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L189" class="LineNr">189 </span> 81 0/subop/add 3/mod/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="L190" class="LineNr">190 </span> <span class="subxComment"># don't flush</span>
<span id="L191" class="LineNr">191 </span> <span class="subxComment"># 6 bytes should still have gotten to _test-stream</span>
<span id="L192" class="LineNr">192 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-stream-&gt;write, 6, msg)</span>
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L194" class="LineNr">194 </span> 68/push <span class="Constant">&quot;F - <a href='066write-buffered.subx.html#L161'>test-write-buffered-with-intermediate-flush</a>: flushed data&quot;</span>/imm32
<span id="L195" class="LineNr">195 </span> 68/push 6/imm32
<span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . push *_test-stream-&gt;write</span>
<span id="L197" class="LineNr">197 </span> b8/copy-to-EAX <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L198" class="LineNr">198 </span> ff 6/subop/push 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> <span class="Normal"> . </span> <span class="subxComment"># push *EAX</span>
<span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . call</span>
<span id="L200" class="LineNr">200 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L202" class="LineNr">202 </span> 81 0/subop/add 3/mod/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="L203" class="LineNr">203 </span> <span class="subxComment"># and 1 byte should still be in _test-buffered-file</span>
<span id="L204" class="LineNr">204 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-buffered-file-&gt;write, 1, msg)</span>
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L206" class="LineNr">206 </span> 68/push <span class="Constant">&quot;F - <a href='066write-buffered.subx.html#L161'>test-write-buffered-with-intermediate-flush</a>: unflushed bytes&quot;</span>/imm32
<span id="L207" class="LineNr">207 </span> 68/push 1/imm32
<span id="L208" class="LineNr">208 </span> <span class="subxS2Comment"># . . push *_test-buffered-file-&gt;write</span>
<span id="L209" class="LineNr">209 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L210" class="LineNr">210 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L211" class="LineNr">211 </span> <span class="subxS2Comment"># . . call</span>
<span id="L212" class="LineNr">212 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L214" class="LineNr">214 </span> 81 0/subop/add 3/mod/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="L215" class="LineNr">215 </span> <span class="subxS1Comment"># . end</span>
<span id="L216" class="LineNr">216 </span> c3/return
<span id="L217" class="LineNr">217 </span>
<span id="L218" class="LineNr">218 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L136" class="LineNr">136 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . call</span>
<span id="L138" class="LineNr">138 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L139" class="LineNr">139 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L140" class="LineNr">140 </span> 81 0/subop/add 3/mod/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="L141" class="LineNr">141 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;Abc&quot;, msg)</span>
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L143" class="LineNr">143 </span> 68/push <span class="Constant">&quot;F - test-write-buffered-single&quot;</span>/imm32
<span id="L144" class="LineNr">144 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32
<span id="L145" class="LineNr">145 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L146" class="LineNr">146 </span> <span class="subxS2Comment"># . . call</span>
<span id="L147" class="LineNr">147 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L149" class="LineNr">149 </span> 81 0/subop/add 3/mod/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="L150" class="LineNr">150 </span> <span class="subxS1Comment"># . end</span>
<span id="L151" class="LineNr">151 </span> c3/return
<span id="L152" class="LineNr">152 </span>
<span id="L153" class="LineNr">153 </span><span class="subxTest">test-write-buffered-with-intermediate-flush</span>:
<span id="L154" class="LineNr">154 </span> <span class="subxH1Comment"># - check that write-buffered flushes in the middle if its buffer fills up</span>
<span id="L155" class="LineNr">155 </span> <span class="subxComment"># setup</span>
<span id="L156" class="LineNr">156 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L158" class="LineNr">158 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . call</span>
<span id="L160" class="LineNr">160 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L161" class="LineNr">161 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L162" class="LineNr">162 </span> 81 0/subop/add 3/mod/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="L163" class="LineNr">163 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L165" class="LineNr">165 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L166" class="LineNr">166 </span> 05/add-to-EAX 4/imm32
<span id="L167" class="LineNr">167 </span> 50/push-EAX
<span id="L168" class="LineNr">168 </span> <span class="subxS2Comment"># . . call</span>
<span id="L169" class="LineNr">169 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L170" class="LineNr">170 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L171" class="LineNr">171 </span> 81 0/subop/add 3/mod/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="L172" class="LineNr">172 </span> <span class="subxComment"># _test-stream can hold 8 bytes, but _test-buffered-file can hold only 6.</span>
<span id="L173" class="LineNr">173 </span> <span class="subxComment"># Try to write 7 bytes.</span>
<span id="L174" class="LineNr">174 </span> <span class="subxS1Comment"># . write-buffered(_test-buffered-file, &quot;Abcdefg&quot;)</span>
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L176" class="LineNr">176 </span> 68/push <span class="Constant">&quot;Abcdefg&quot;</span>/imm32
<span id="L177" class="LineNr">177 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . call</span>
<span id="L179" class="LineNr">179 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L181" class="LineNr">181 </span> 81 0/subop/add 3/mod/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="L182" class="LineNr">182 </span> <span class="subxComment"># don't flush</span>
<span id="L183" class="LineNr">183 </span> <span class="subxComment"># 6 bytes should still have gotten to _test-stream</span>
<span id="L184" class="LineNr">184 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-stream-&gt;write, 6, msg)</span>
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L186" class="LineNr">186 </span> 68/push <span class="Constant">&quot;F - <a href='066write-buffered.subx.html#L153'>test-write-buffered-with-intermediate-flush</a>: flushed data&quot;</span>/imm32
<span id="L187" class="LineNr">187 </span> 68/push 6/imm32
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . push *_test-stream-&gt;write</span>
<span id="L189" class="LineNr">189 </span> b8/copy-to-EAX <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L190" class="LineNr">190 </span> ff 6/subop/push 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> <span class="Normal"> . </span> <span class="subxComment"># push *EAX</span>
<span id="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . call</span>
<span id="L192" class="LineNr">192 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L194" class="LineNr">194 </span> 81 0/subop/add 3/mod/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="L195" class="LineNr">195 </span> <span class="subxComment"># and 1 byte should still be in _test-buffered-file</span>
<span id="L196" class="LineNr">196 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-buffered-file-&gt;write, 1, msg)</span>
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L198" class="LineNr">198 </span> 68/push <span class="Constant">&quot;F - <a href='066write-buffered.subx.html#L153'>test-write-buffered-with-intermediate-flush</a>: unflushed bytes&quot;</span>/imm32
<span id="L199" class="LineNr">199 </span> 68/push 1/imm32
<span id="L200" class="LineNr">200 </span> <span class="subxS2Comment"># . . push *_test-buffered-file-&gt;write</span>
<span id="L201" class="LineNr">201 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L202" class="LineNr">202 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EAX+4)</span>
<span id="L203" class="LineNr">203 </span> <span class="subxS2Comment"># . . call</span>
<span id="L204" class="LineNr">204 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L206" class="LineNr">206 </span> 81 0/subop/add 3/mod/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="L207" class="LineNr">207 </span> <span class="subxS1Comment"># . end</span>
<span id="L208" class="LineNr">208 </span> c3/return
<span id="L209" class="LineNr">209 </span>
<span id="L210" class="LineNr">210 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/067print-int.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.Folded { color: #080808; background-color: #949494; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -41,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -67,366 +66,376 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">#? e8/call test-print-int32/disp32</span>
<span id="L10" class="LineNr"> 10 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L11" class="LineNr"> 11 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L12" class="LineNr"> 12 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L13" class="LineNr"> 13 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L14" class="LineNr"> 14 </span>
<span id="L15" class="LineNr"> 15 </span><span class="subxFunction">append-byte-hex</span>: <span class="subxComment"># f : (address stream), n : int -&gt; &lt;void&gt;</span>
<span id="L16" class="LineNr"> 16 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L17" class="LineNr"> 17 </span> 55/push-EBP
<span id="L18" class="LineNr"> 18 </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="L19" class="LineNr"> 19 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L20" class="LineNr"> 20 </span> 50/push-EAX
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># AL = convert upper nibble to hex</span>
<span id="L22" class="LineNr"> 22 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L23" class="LineNr"> 23 </span> c1/shift 5/subop/logic-right 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/imm8 <span class="subxComment"># shift EAX right by 4 bits, while padding zeroes</span>
<span id="L24" class="LineNr"> 24 </span> 25/and-EAX 0xf/imm32
<span id="L25" class="LineNr"> 25 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L26" class="LineNr"> 26 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L29" class="LineNr"> 29 </span> 50/push-EAX
<span id="L30" class="LineNr"> 30 </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="L31" class="LineNr"> 31 </span> <span class="subxS2Comment"># . . call</span>
<span id="L32" class="LineNr"> 32 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</a>/disp32
<span id="L33" class="LineNr"> 33 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L34" class="LineNr"> 34 </span> 81 0/subop/add 3/mod/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="L35" class="LineNr"> 35 </span> <span class="subxComment"># AL = convert lower nibble to hex</span>
<span id="L36" class="LineNr"> 36 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L37" class="LineNr"> 37 </span> 25/and-EAX 0xf/imm32
<span id="L38" class="LineNr"> 38 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L39" class="LineNr"> 39 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L40" class="LineNr"> 40 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L42" class="LineNr"> 42 </span> 50/push-EAX
<span id="L43" class="LineNr"> 43 </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="L44" class="LineNr"> 44 </span> <span class="subxS2Comment"># . . call</span>
<span id="L45" class="LineNr"> 45 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</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> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L48" class="LineNr"> 48 </span><span class="Constant">$append-byte-hex:end</span>:
<span id="L49" class="LineNr"> 49 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L50" class="LineNr"> 50 </span> 58/pop-to-EAX
<span id="L51" class="LineNr"> 51 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L52" class="LineNr"> 52 </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="L53" class="LineNr"> 53 </span> 5d/pop-to-EBP
<span id="L54" class="LineNr"> 54 </span> c3/return
<span id="L55" class="LineNr"> 55 </span>
<span id="L56" class="LineNr"> 56 </span><span class="subxTest">test-append-byte-hex</span>:
<span id="L57" class="LineNr"> 57 </span> <span class="subxH1Comment"># - check that append-byte-hex adds the hex textual representation</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># setup</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxFunction">append-byte-hex</span>: <span class="subxComment"># f : (address stream), n : int -&gt; &lt;void&gt;</span>
<span id="L9" class="LineNr"> 9 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L10" class="LineNr"> 10 </span> 55/push-EBP
<span id="L11" class="LineNr"> 11 </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="L12" class="LineNr"> 12 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L13" class="LineNr"> 13 </span> 50/push-EAX
<span id="L14" class="LineNr"> 14 </span> <span class="subxComment"># AL = convert upper nibble to hex</span>
<span id="L15" class="LineNr"> 15 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L16" class="LineNr"> 16 </span> c1/shift 5/subop/logic-right 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/imm8 <span class="subxComment"># shift EAX right by 4 bits, while padding zeroes</span>
<span id="L17" class="LineNr"> 17 </span> 25/and-EAX 0xf/imm32
<span id="L18" class="LineNr"> 18 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L19" class="LineNr"> 19 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L22" class="LineNr"> 22 </span> 50/push-EAX
<span id="L23" class="LineNr"> 23 </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="L24" class="LineNr"> 24 </span> <span class="subxS2Comment"># . . call</span>
<span id="L25" class="LineNr"> 25 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</a>/disp32
<span id="L26" class="LineNr"> 26 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L27" class="LineNr"> 27 </span> 81 0/subop/add 3/mod/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="L28" class="LineNr"> 28 </span> <span class="subxComment"># AL = convert lower nibble to hex</span>
<span id="L29" class="LineNr"> 29 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L30" class="LineNr"> 30 </span> 25/and-EAX 0xf/imm32
<span id="L31" class="LineNr"> 31 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L32" class="LineNr"> 32 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L35" class="LineNr"> 35 </span> 50/push-EAX
<span id="L36" class="LineNr"> 36 </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="L37" class="LineNr"> 37 </span> <span class="subxS2Comment"># . . call</span>
<span id="L38" class="LineNr"> 38 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</a>/disp32
<span id="L39" class="LineNr"> 39 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L40" class="LineNr"> 40 </span> 81 0/subop/add 3/mod/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="L41" class="LineNr"> 41 </span><span class="Constant">$append-byte-hex:end</span>:
<span id="L42" class="LineNr"> 42 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L43" class="LineNr"> 43 </span> 58/pop-to-EAX
<span id="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L45" class="LineNr"> 45 </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="L46" class="LineNr"> 46 </span> 5d/pop-to-EBP
<span id="L47" class="LineNr"> 47 </span> c3/return
<span id="L48" class="LineNr"> 48 </span>
<span id="L49" class="LineNr"> 49 </span><span class="subxTest">test-append-byte-hex</span>:
<span id="L50" class="LineNr"> 50 </span> <span class="subxH1Comment"># - check that append-byte-hex adds the hex textual representation</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># setup</span>
<span id="L52" class="LineNr"> 52 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L53" class="LineNr"> 53 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L54" class="LineNr"> 54 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . call</span>
<span id="L56" class="LineNr"> 56 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L57" class="LineNr"> 57 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L58" class="LineNr"> 58 </span> 81 0/subop/add 3/mod/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="L59" class="LineNr"> 59 </span> <span class="subxComment"># append-byte-hex(_test-stream, 0xa) # exercises digit, non-digit as well as leading zero</span>
<span id="L60" class="LineNr"> 60 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L61" class="LineNr"> 61 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . call</span>
<span id="L63" class="LineNr"> 63 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L65" class="LineNr"> 65 </span> 81 0/subop/add 3/mod/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="L66" class="LineNr"> 66 </span> <span class="subxComment"># append-byte-hex(_test-stream, 0xa) # exercises digit, non-digit as well as leading zero</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L68" class="LineNr"> 68 </span> 68/push 0xa/imm32
<span id="L69" class="LineNr"> 69 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L70" class="LineNr"> 70 </span> <span class="subxS2Comment"># . . call</span>
<span id="L71" class="LineNr"> 71 </span> e8/call <a href='067print-int.subx.html#L15'>append-byte-hex</a>/disp32
<span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L73" class="LineNr"> 73 </span> 81 0/subop/add 3/mod/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="L74" class="LineNr"> 74 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0a&quot;, msg)</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L76" class="LineNr"> 76 </span> 68/push <span class="Constant">&quot;F - test-append-byte-hex&quot;</span>/imm32
<span id="L77" class="LineNr"> 77 </span> 68/push <span class="Constant">&quot;0a&quot;</span>/imm32
<span id="L78" class="LineNr"> 78 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L79" class="LineNr"> 79 </span> <span class="subxS2Comment"># . . call</span>
<span id="L80" class="LineNr"> 80 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L81" class="LineNr"> 81 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L82" class="LineNr"> 82 </span> 81 0/subop/add 3/mod/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="L83" class="LineNr"> 83 </span> <span class="subxS1Comment"># . end</span>
<span id="L84" class="LineNr"> 84 </span> c3/return
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="subxComment"># print the hex representation for the lowest byte of a number</span>
<span id="L87" class="LineNr"> 87 </span><span class="subxFunction">print-byte-buffered</span>: <span class="subxComment"># f : (address buffered-file), n : int -&gt; &lt;void&gt;</span>
<span id="L88" class="LineNr"> 88 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L89" class="LineNr"> 89 </span> 55/push-EBP
<span id="L90" class="LineNr"> 90 </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="L91" class="LineNr"> 91 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L92" class="LineNr"> 92 </span> 50/push-EAX
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># AL = convert upper nibble to hex</span>
<span id="L94" class="LineNr"> 94 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L95" class="LineNr"> 95 </span> c1/shift 5/subop/logic-right 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/imm8 <span class="subxComment"># shift EAX right by 4 bits, while padding zeroes</span>
<span id="L96" class="LineNr"> 96 </span> 25/and-EAX 0xf/imm32
<span id="L97" class="LineNr"> 97 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L98" class="LineNr"> 98 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L99" class="LineNr"> 99 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L100" class="LineNr">100 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L101" class="LineNr">101 </span> 50/push-EAX
<span id="L102" class="LineNr">102 </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="L103" class="LineNr">103 </span> <span class="subxS2Comment"># . . call</span>
<span id="L104" class="LineNr">104 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L106" class="LineNr">106 </span> 81 0/subop/add 3/mod/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="L107" class="LineNr">107 </span> <span class="subxComment"># AL = convert lower nibble to hex</span>
<span id="L108" class="LineNr">108 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L109" class="LineNr">109 </span> 25/and-EAX 0xf/imm32
<span id="L110" class="LineNr">110 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L111" class="LineNr">111 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L112" class="LineNr">112 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L114" class="LineNr">114 </span> 50/push-EAX
<span id="L115" class="LineNr">115 </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="L116" class="LineNr">116 </span> <span class="subxS2Comment"># . . call</span>
<span id="L117" class="LineNr">117 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L119" class="LineNr">119 </span> 81 0/subop/add 3/mod/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="L120" class="LineNr">120 </span><span class="Constant">$print-byte-buffered:end</span>:
<span id="L121" class="LineNr">121 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L122" class="LineNr">122 </span> 58/pop-to-EAX
<span id="L123" class="LineNr">123 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L124" class="LineNr">124 </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="L125" class="LineNr">125 </span> 5d/pop-to-EBP
<span id="L126" class="LineNr">126 </span> c3/return
<span id="L127" class="LineNr">127 </span>
<span id="L128" class="LineNr">128 </span><span class="subxTest">test-print-byte-buffered</span>:
<span id="L129" class="LineNr">129 </span> <span class="subxH1Comment"># - check that print-byte-buffered prints the hex textual representation</span>
<span id="L130" class="LineNr">130 </span> <span class="subxComment"># setup</span>
<span id="L131" class="LineNr">131 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L61" class="LineNr"> 61 </span> 68/push 0xa/imm32
<span id="L62" class="LineNr"> 62 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L63" class="LineNr"> 63 </span> <span class="subxS2Comment"># . . call</span>
<span id="L64" class="LineNr"> 64 </span> e8/call <a href='067print-int.subx.html#L8'>append-byte-hex</a>/disp32
<span id="L65" class="LineNr"> 65 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L66" class="LineNr"> 66 </span> 81 0/subop/add 3/mod/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="L67" class="LineNr"> 67 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0a&quot;, msg)</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L69" class="LineNr"> 69 </span> 68/push <span class="Constant">&quot;F - test-append-byte-hex&quot;</span>/imm32
<span id="L70" class="LineNr"> 70 </span> 68/push <span class="Constant">&quot;0a&quot;</span>/imm32
<span id="L71" class="LineNr"> 71 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . call</span>
<span id="L73" class="LineNr"> 73 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L74" class="LineNr"> 74 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L75" class="LineNr"> 75 </span> 81 0/subop/add 3/mod/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="L76" class="LineNr"> 76 </span> <span class="subxS1Comment"># . end</span>
<span id="L77" class="LineNr"> 77 </span> c3/return
<span id="L78" class="LineNr"> 78 </span>
<span id="L79" class="LineNr"> 79 </span><span class="subxComment"># print the hex representation for the lowest byte of a number</span>
<span id="L80" class="LineNr"> 80 </span><span class="subxFunction">print-byte-buffered</span>: <span class="subxComment"># f : (address buffered-file), n : int -&gt; &lt;void&gt;</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L82" class="LineNr"> 82 </span> 55/push-EBP
<span id="L83" class="LineNr"> 83 </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="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L85" class="LineNr"> 85 </span> 50/push-EAX
<span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># AL = convert upper nibble to hex</span>
<span id="L87" class="LineNr"> 87 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L88" class="LineNr"> 88 </span> c1/shift 5/subop/logic-right 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/imm8 <span class="subxComment"># shift EAX right by 4 bits, while padding zeroes</span>
<span id="L89" class="LineNr"> 89 </span> 25/and-EAX 0xf/imm32
<span id="L90" class="LineNr"> 90 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L91" class="LineNr"> 91 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L93" class="LineNr"> 93 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L94" class="LineNr"> 94 </span> 50/push-EAX
<span id="L95" class="LineNr"> 95 </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="L96" class="LineNr"> 96 </span> <span class="subxS2Comment"># . . call</span>
<span id="L97" class="LineNr"> 97 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L98" class="LineNr"> 98 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L99" class="LineNr"> 99 </span> 81 0/subop/add 3/mod/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="L100" class="LineNr">100 </span> <span class="subxComment"># AL = convert lower nibble to hex</span>
<span id="L101" class="LineNr">101 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L102" class="LineNr">102 </span> 25/and-EAX 0xf/imm32
<span id="L103" class="LineNr">103 </span> <span class="subxS1Comment"># . AL = to-hex-char(AL)</span>
<span id="L104" class="LineNr">104 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L105" class="LineNr">105 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L106" class="LineNr">106 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L107" class="LineNr">107 </span> 50/push-EAX
<span id="L108" class="LineNr">108 </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="L109" class="LineNr">109 </span> <span class="subxS2Comment"># . . call</span>
<span id="L110" class="LineNr">110 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L111" class="LineNr">111 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L112" class="LineNr">112 </span> 81 0/subop/add 3/mod/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="L113" class="LineNr">113 </span><span class="Constant">$print-byte-buffered:end</span>:
<span id="L114" class="LineNr">114 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L115" class="LineNr">115 </span> 58/pop-to-EAX
<span id="L116" class="LineNr">116 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L117" class="LineNr">117 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L118" class="LineNr">118 </span> 5d/pop-to-EBP
<span id="L119" class="LineNr">119 </span> c3/return
<span id="L120" class="LineNr">120 </span>
<span id="L121" class="LineNr">121 </span><span class="subxTest">test-print-byte-buffered</span>:
<span id="L122" class="LineNr">122 </span> <span class="subxH1Comment"># - check that print-byte-buffered prints the hex textual representation</span>
<span id="L123" class="LineNr">123 </span> <span class="subxComment"># setup</span>
<span id="L124" class="LineNr">124 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L125" class="LineNr">125 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L126" class="LineNr">126 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . call</span>
<span id="L128" class="LineNr">128 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L130" class="LineNr">130 </span> 81 0/subop/add 3/mod/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="L131" class="LineNr">131 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L132" class="LineNr">132 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L133" class="LineNr">133 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L134" class="LineNr">134 </span> <span class="subxS2Comment"># . . call</span>
<span id="L135" class="LineNr">135 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L136" class="LineNr">136 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L137" class="LineNr">137 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L138" class="LineNr">138 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L139" class="LineNr">139 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L140" class="LineNr">140 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L141" class="LineNr">141 </span> 05/add-to-EAX 4/imm32
<span id="L142" class="LineNr">142 </span> 50/push-EAX
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . call</span>
<span id="L144" class="LineNr">144 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L146" class="LineNr">146 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L147" class="LineNr">147 </span> <span class="subxComment"># print-byte-buffered(_test-buffered-file, 0xa) # exercises digit, non-digit as well as leading zero</span>
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L149" class="LineNr">149 </span> 68/push 0xa/imm32
<span id="L150" class="LineNr">150 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L133" class="LineNr">133 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L134" class="LineNr">134 </span> 05/add-to-EAX 4/imm32
<span id="L135" class="LineNr">135 </span> 50/push-EAX
<span id="L136" class="LineNr">136 </span> <span class="subxS2Comment"># . . call</span>
<span id="L137" class="LineNr">137 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L139" class="LineNr">139 </span> 81 0/subop/add 3/mod/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="L140" class="LineNr">140 </span> <span class="subxComment"># print-byte-buffered(_test-buffered-file, 0xa) # exercises digit, non-digit as well as leading zero</span>
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L142" class="LineNr">142 </span> 68/push 0xa/imm32
<span id="L143" class="LineNr">143 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L144" class="LineNr">144 </span> <span class="subxS2Comment"># . . call</span>
<span id="L145" class="LineNr">145 </span> e8/call <a href='067print-int.subx.html#L80'>print-byte-buffered</a>/disp32
<span id="L146" class="LineNr">146 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L147" class="LineNr">147 </span> 81 0/subop/add 3/mod/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="L148" class="LineNr">148 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L149" class="LineNr">149 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L150" class="LineNr">150 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L151" class="LineNr">151 </span> <span class="subxS2Comment"># . . call</span>
<span id="L152" class="LineNr">152 </span> e8/call <a href='067print-int.subx.html#L87'>print-byte-buffered</a>/disp32
<span id="L152" class="LineNr">152 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L154" class="LineNr">154 </span> 81 0/subop/add 3/mod/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="L155" class="LineNr">155 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L154" class="LineNr">154 </span> 81 0/subop/add 3/mod/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="L155" class="LineNr">155 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0a&quot;, msg)</span>
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L157" class="LineNr">157 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . call</span>
<span id="L159" class="LineNr">159 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L160" class="LineNr">160 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L161" class="LineNr">161 </span> 81 0/subop/add 3/mod/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="L162" class="LineNr">162 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0a&quot;, msg)</span>
<span id="L163" class="LineNr">163 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L164" class="LineNr">164 </span> 68/push <span class="Constant">&quot;F - test-print-byte-buffered&quot;</span>/imm32
<span id="L165" class="LineNr">165 </span> 68/push <span class="Constant">&quot;0a&quot;</span>/imm32
<span id="L166" class="LineNr">166 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
<span id="L168" class="LineNr">168 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L170" class="LineNr">170 </span> 81 0/subop/add 3/mod/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="L171" class="LineNr">171 </span> <span class="subxS1Comment"># . end</span>
<span id="L172" class="LineNr">172 </span> c3/return
<span id="L173" class="LineNr">173 </span>
<span id="L174" class="LineNr">174 </span><span class="subxFunction">print-int32</span>: <span class="subxComment"># f : (address stream), n : int -&gt; &lt;void&gt;</span>
<span id="L175" class="LineNr">175 </span> <span class="subxComment"># pseudocode:</span>
<span id="L176" class="LineNr">176 </span> <span class="subxComment"># write(f, &quot;0x&quot;)</span>
<span id="L177" class="LineNr">177 </span> <span class="subxComment"># ECX = 28</span>
<span id="L178" class="LineNr">178 </span> <span class="subxComment"># while true</span>
<span id="L179" class="LineNr">179 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L180" class="LineNr">180 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L181" class="LineNr">181 </span> <span class="subxComment"># EAX = EAX &amp; 0xf</span>
<span id="L182" class="LineNr">182 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L184" class="LineNr">184 </span> <span class="subxComment">#</span>
<span id="L185" class="LineNr">185 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L186" class="LineNr">186 </span> 55/push-EBP
<span id="L187" class="LineNr">187 </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="L188" class="LineNr">188 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L189" class="LineNr">189 </span> 50/push-EAX
<span id="L190" class="LineNr">190 </span> 51/push-ECX
<span id="L191" class="LineNr">191 </span> <span class="subxComment"># ECX = 28</span>
<span id="L192" class="LineNr">192 </span> b9/copy-to-ECX 0x1c/imm32
<span id="L193" class="LineNr">193 </span><span class="Constant">$print-int32:print-hex-prefix</span>:
<span id="L194" class="LineNr">194 </span> <span class="subxComment"># write(f, &quot;0x&quot;)</span>
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L196" class="LineNr">196 </span> 68/push <span class="Constant">&quot;0x&quot;</span>/imm32
<span id="L197" class="LineNr">197 </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="L198" class="LineNr">198 </span> <span class="subxS2Comment"># . . call</span>
<span id="L199" class="LineNr">199 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L200" class="LineNr">200 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L201" class="LineNr">201 </span> 81 0/subop/add 3/mod/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="L202" class="LineNr">202 </span><span class="Constant">$print-int32:loop</span>:
<span id="L203" class="LineNr">203 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L204" class="LineNr">204 </span> 81 7/subop/compare 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> 0/imm32 <span class="subxComment"># compare ECX</span>
<span id="L205" class="LineNr">205 </span> 7c/jump-if-lesser $print-int32:end/disp8
<span id="L206" class="LineNr">206 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L207" class="LineNr">207 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L208" class="LineNr">208 </span> d3/&gt;&gt;ECX 5/subop/pad-zeroes 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># shift EAX right by ECX bits, padding zeroes</span>
<span id="L209" class="LineNr">209 </span> <span class="subxComment"># EAX = to-hex-char(AL)</span>
<span id="L210" class="LineNr">210 </span> 25/and-EAX 0xf/imm32
<span id="L211" class="LineNr">211 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L212" class="LineNr">212 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L214" class="LineNr">214 </span> 50/push-EAX
<span id="L215" class="LineNr">215 </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="L216" class="LineNr">216 </span> <span class="subxS2Comment"># . . call</span>
<span id="L217" class="LineNr">217 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</a>/disp32
<span id="L218" class="LineNr">218 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L219" class="LineNr">219 </span> 81 0/subop/add 3/mod/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="L220" class="LineNr">220 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L221" class="LineNr">221 </span> 81 5/subop/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># subtract from ECX</span>
<span id="L222" class="LineNr">222 </span> eb/jump $print-int32:loop/disp8
<span id="L223" class="LineNr">223 </span><span class="Constant">$print-int32:end</span>:
<span id="L224" class="LineNr">224 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L225" class="LineNr">225 </span> 59/pop-to-ECX
<span id="L226" class="LineNr">226 </span> 58/pop-to-EAX
<span id="L227" class="LineNr">227 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L228" class="LineNr">228 </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="L229" class="LineNr">229 </span> 5d/pop-to-EBP
<span id="L230" class="LineNr">230 </span> c3/return
<span id="L231" class="LineNr">231 </span>
<span id="L232" class="LineNr">232 </span><span class="subxTest">test-print-int32</span>:
<span id="L233" class="LineNr">233 </span> <span class="subxH1Comment"># - check that print-int32 prints the hex textual representation</span>
<span id="L234" class="LineNr">234 </span> <span class="subxComment"># setup</span>
<span id="L235" class="LineNr">235 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L157" class="LineNr">157 </span> 68/push <span class="Constant">&quot;F - test-print-byte-buffered&quot;</span>/imm32
<span id="L158" class="LineNr">158 </span> 68/push <span class="Constant">&quot;0a&quot;</span>/imm32
<span id="L159" class="LineNr">159 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L160" class="LineNr">160 </span> <span class="subxS2Comment"># . . call</span>
<span id="L161" class="LineNr">161 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L163" class="LineNr">163 </span> 81 0/subop/add 3/mod/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="L164" class="LineNr">164 </span> <span class="subxS1Comment"># . end</span>
<span id="L165" class="LineNr">165 </span> c3/return
<span id="L166" class="LineNr">166 </span>
<span id="L167" class="LineNr">167 </span><span class="subxFunction">print-int32</span>: <span class="subxComment"># f : (address stream), n : int -&gt; &lt;void&gt;</span>
<span id="L168" class="LineNr">168 </span> <span class="subxComment"># pseudocode:</span>
<span id="L169" class="LineNr">169 </span> <span class="subxComment"># write(f, &quot;0x&quot;)</span>
<span id="L170" class="LineNr">170 </span> <span class="subxComment"># ECX = 28</span>
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># while true</span>
<span id="L172" class="LineNr">172 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L173" class="LineNr">173 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L174" class="LineNr">174 </span> <span class="subxComment"># EAX = EAX &amp; 0xf</span>
<span id="L175" class="LineNr">175 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L176" class="LineNr">176 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L177" class="LineNr">177 </span> <span class="subxComment">#</span>
<span id="L178" class="LineNr">178 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L179" class="LineNr">179 </span> 55/push-EBP
<span id="L180" class="LineNr">180 </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="L181" class="LineNr">181 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L182" class="LineNr">182 </span> 50/push-EAX
<span id="L183" class="LineNr">183 </span> 51/push-ECX
<span id="L184" class="LineNr">184 </span> <span class="subxComment"># ECX = 28</span>
<span id="L185" class="LineNr">185 </span> b9/copy-to-ECX 0x1c/imm32
<span id="L186" class="LineNr">186 </span><span class="Constant">$print-int32:print-hex-prefix</span>:
<span id="L187" class="LineNr">187 </span> <span class="subxComment"># write(f, &quot;0x&quot;)</span>
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L189" class="LineNr">189 </span> 68/push <span class="Constant">&quot;0x&quot;</span>/imm32
<span id="L190" class="LineNr">190 </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="L191" class="LineNr">191 </span> <span class="subxS2Comment"># . . call</span>
<span id="L192" class="LineNr">192 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L194" class="LineNr">194 </span> 81 0/subop/add 3/mod/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="L195" class="LineNr">195 </span><span class="Constant">$print-int32:loop</span>:
<span id="L196" class="LineNr">196 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L197" class="LineNr">197 </span> 81 7/subop/compare 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> 0/imm32 <span class="subxComment"># compare ECX</span>
<span id="L198" class="LineNr">198 </span> 7c/jump-if-lesser $print-int32:end/disp8
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L200" class="LineNr">200 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L201" class="LineNr">201 </span> d3/&gt;&gt;ECX 5/subop/pad-zeroes 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># shift EAX right by ECX bits, padding zeroes</span>
<span id="L202" class="LineNr">202 </span> <span class="subxComment"># EAX = to-hex-char(AL)</span>
<span id="L203" class="LineNr">203 </span> 25/and-EAX 0xf/imm32
<span id="L204" class="LineNr">204 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L205" class="LineNr">205 </span> <span class="subxComment"># append-byte(f, AL)</span>
<span id="L206" class="LineNr">206 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L207" class="LineNr">207 </span> 50/push-EAX
<span id="L208" class="LineNr">208 </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="L209" class="LineNr">209 </span> <span class="subxS2Comment"># . . call</span>
<span id="L210" class="LineNr">210 </span> e8/call <a href='064write-byte.subx.html#L212'>append-byte</a>/disp32
<span id="L211" class="LineNr">211 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L212" class="LineNr">212 </span> 81 0/subop/add 3/mod/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="L213" class="LineNr">213 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L214" class="LineNr">214 </span> 81 5/subop/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># subtract from ECX</span>
<span id="L215" class="LineNr">215 </span> eb/jump $print-int32:loop/disp8
<span id="L216" class="LineNr">216 </span><span class="Constant">$print-int32:end</span>:
<span id="L217" class="LineNr">217 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L218" class="LineNr">218 </span> 59/pop-to-ECX
<span id="L219" class="LineNr">219 </span> 58/pop-to-EAX
<span id="L220" class="LineNr">220 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L221" class="LineNr">221 </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="L222" class="LineNr">222 </span> 5d/pop-to-EBP
<span id="L223" class="LineNr">223 </span> c3/return
<span id="L224" class="LineNr">224 </span>
<span id="L225" class="LineNr">225 </span><span class="subxTest">test-print-int32</span>:
<span id="L226" class="LineNr">226 </span> <span class="subxH1Comment"># - check that print-int32 prints the hex textual representation</span>
<span id="L227" class="LineNr">227 </span> <span class="subxComment"># setup</span>
<span id="L228" class="LineNr">228 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L229" class="LineNr">229 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L230" class="LineNr">230 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L231" class="LineNr">231 </span> <span class="subxS2Comment"># . . call</span>
<span id="L232" class="LineNr">232 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L233" class="LineNr">233 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L234" class="LineNr">234 </span> 81 0/subop/add 3/mod/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="L235" class="LineNr">235 </span> <span class="subxComment"># print-int32(_test-stream, 0x8899aa)</span>
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L237" class="LineNr">237 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L238" class="LineNr">238 </span> <span class="subxS2Comment"># . . call</span>
<span id="L239" class="LineNr">239 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L241" class="LineNr">241 </span> 81 0/subop/add 3/mod/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="L242" class="LineNr">242 </span> <span class="subxComment"># print-int32(_test-stream, 0x8899aa)</span>
<span id="L243" class="LineNr">243 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L244" class="LineNr">244 </span> 68/push 0x8899aa/imm32
<span id="L245" class="LineNr">245 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L246" class="LineNr">246 </span> <span class="subxS2Comment"># . . call</span>
<span id="L247" class="LineNr">247 </span> e8/call <a href='067print-int.subx.html#L174'>print-int32</a>/disp32
<span id="L248" class="LineNr">248 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L249" class="LineNr">249 </span> 81 0/subop/add 3/mod/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="L250" class="LineNr">250 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0x008899aa&quot;, msg)</span>
<span id="L251" class="LineNr">251 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L252" class="LineNr">252 </span> 68/push <span class="Constant">&quot;F - test-print-int32&quot;</span>/imm32
<span id="L253" class="LineNr">253 </span> 68/push <span class="Constant">&quot;0x008899aa&quot;</span>/imm32
<span id="L254" class="LineNr">254 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L255" class="LineNr">255 </span> <span class="subxS2Comment"># . . call</span>
<span id="L256" class="LineNr">256 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L257" class="LineNr">257 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L258" class="LineNr">258 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L259" class="LineNr">259 </span> <span class="subxS1Comment"># . end</span>
<span id="L260" class="LineNr">260 </span> c3/return
<span id="L261" class="LineNr">261 </span>
<span id="L262" class="LineNr">262 </span><span class="subxFunction">print-int32-buffered</span>: <span class="subxComment"># f : (address buffered-file), n : int -&gt; &lt;void&gt;</span>
<span id="L263" class="LineNr">263 </span> <span class="subxComment"># pseudocode:</span>
<span id="L264" class="LineNr">264 </span> <span class="subxComment"># write-buffered(f, &quot;0x&quot;)</span>
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># ECX = 28</span>
<span id="L266" class="LineNr">266 </span> <span class="subxComment"># while true</span>
<span id="L267" class="LineNr">267 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L268" class="LineNr">268 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L269" class="LineNr">269 </span> <span class="subxComment"># EAX = EAX &amp; 0xf</span>
<span id="L270" class="LineNr">270 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L271" class="LineNr">271 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L272" class="LineNr">272 </span> <span class="subxComment">#</span>
<span id="L273" class="LineNr">273 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L274" class="LineNr">274 </span> 55/push-EBP
<span id="L275" class="LineNr">275 </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="L276" class="LineNr">276 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L277" class="LineNr">277 </span> 50/push-EAX
<span id="L278" class="LineNr">278 </span> 51/push-ECX
<span id="L279" class="LineNr">279 </span> <span class="subxComment"># ECX = 28</span>
<span id="L280" class="LineNr">280 </span> b9/copy-to-ECX 0x1c/imm32
<span id="L281" class="LineNr">281 </span><span class="Constant">$print-int32-buffered:print-hex-prefix</span>:
<span id="L282" class="LineNr">282 </span> <span class="subxComment"># write-buffered(f, &quot;0x&quot;)</span>
<span id="L283" class="LineNr">283 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L284" class="LineNr">284 </span> 68/push <span class="Constant">&quot;0x&quot;</span>/imm32
<span id="L285" class="LineNr">285 </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="L286" class="LineNr">286 </span> <span class="subxS2Comment"># . . call</span>
<span id="L287" class="LineNr">287 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L288" class="LineNr">288 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L289" class="LineNr">289 </span> 81 0/subop/add 3/mod/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="L290" class="LineNr">290 </span><span class="Constant">$print-int32-buffered:loop</span>:
<span id="L291" class="LineNr">291 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L292" class="LineNr">292 </span> 81 7/subop/compare 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> 0/imm32 <span class="subxComment"># compare ECX</span>
<span id="L293" class="LineNr">293 </span> 7c/jump-if-lesser $print-int32-buffered:end/disp8
<span id="L294" class="LineNr">294 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L295" class="LineNr">295 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L296" class="LineNr">296 </span> d3/&gt;&gt;ECX 5/subop/pad-zeroes 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># shift EAX right by ECX bits, padding zeroes</span>
<span id="L297" class="LineNr">297 </span> <span class="subxComment"># EAX = to-hex-char(AL)</span>
<span id="L298" class="LineNr">298 </span> 25/and-EAX 0xf/imm32
<span id="L299" class="LineNr">299 </span> e8/call <a href='065hex.subx.html#L744'>to-hex-char</a>/disp32
<span id="L300" class="LineNr">300 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L301" class="LineNr">301 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L302" class="LineNr">302 </span> 50/push-EAX
<span id="L303" class="LineNr">303 </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="L304" class="LineNr">304 </span> <span class="subxS2Comment"># . . call</span>
<span id="L305" class="LineNr">305 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L307" class="LineNr">307 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L308" class="LineNr">308 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L309" class="LineNr">309 </span> 81 5/subop/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># subtract from ECX</span>
<span id="L310" class="LineNr">310 </span> eb/jump $print-int32-buffered:loop/disp8
<span id="L311" class="LineNr">311 </span><span class="Constant">$print-int32-buffered:end</span>:
<span id="L312" class="LineNr">312 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L313" class="LineNr">313 </span> 59/pop-to-ECX
<span id="L314" class="LineNr">314 </span> 58/pop-to-EAX
<span id="L315" class="LineNr">315 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L316" class="LineNr">316 </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="L317" class="LineNr">317 </span> 5d/pop-to-EBP
<span id="L318" class="LineNr">318 </span> c3/return
<span id="L319" class="LineNr">319 </span>
<span id="L320" class="LineNr">320 </span><span class="subxTest">test-print-int32-buffered</span>:
<span id="L321" class="LineNr">321 </span> <span class="subxH1Comment"># - check that print-int32-buffered prints the hex textual representation</span>
<span id="L322" class="LineNr">322 </span> <span class="subxComment"># setup</span>
<span id="L323" class="LineNr">323 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L324" class="LineNr">324 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L325" class="LineNr">325 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L326" class="LineNr">326 </span> <span class="subxS2Comment"># . . call</span>
<span id="L327" class="LineNr">327 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L328" class="LineNr">328 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L329" class="LineNr">329 </span> 81 0/subop/add 3/mod/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="L330" class="LineNr">330 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L331" class="LineNr">331 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L332" class="LineNr">332 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L333" class="LineNr">333 </span> 05/add-to-EAX 4/imm32
<span id="L334" class="LineNr">334 </span> 50/push-EAX
<span id="L335" class="LineNr">335 </span> <span class="subxS2Comment"># . . call</span>
<span id="L336" class="LineNr">336 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L339" class="LineNr">339 </span> <span class="subxComment"># print-int32-buffered(_test-buffered-file, 0x8899aa)</span>
<span id="L340" class="LineNr">340 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L341" class="LineNr">341 </span> 68/push 0x8899aa/imm32
<span id="L342" class="LineNr">342 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L343" class="LineNr">343 </span> <span class="subxS2Comment"># . . call</span>
<span id="L344" class="LineNr">344 </span> e8/call <a href='067print-int.subx.html#L262'>print-int32-buffered</a>/disp32
<span id="L345" class="LineNr">345 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L346" class="LineNr">346 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L347" class="LineNr">347 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L348" class="LineNr">348 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L349" class="LineNr">349 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L350" class="LineNr">350 </span> <span class="subxS2Comment"># . . call</span>
<span id="L351" class="LineNr">351 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L352" class="LineNr">352 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L353" class="LineNr">353 </span> 81 0/subop/add 3/mod/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="L354" class="Folded">354 </span><span class="Folded">+-- 18 lines: #? # dump line -----------------------------------------------------------------------------------------------------------------------------</span>
<span id="L372" class="LineNr">372 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0x008899aa&quot;, msg)</span>
<span id="L373" class="LineNr">373 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L374" class="LineNr">374 </span> 68/push <span class="Constant">&quot;F - test-print-int32-buffered&quot;</span>/imm32
<span id="L375" class="LineNr">375 </span> 68/push <span class="Constant">&quot;0x008899aa&quot;</span>/imm32
<span id="L376" class="LineNr">376 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L377" class="LineNr">377 </span> <span class="subxS2Comment"># . . call</span>
<span id="L378" class="LineNr">378 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L379" class="LineNr">379 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L380" class="LineNr">380 </span> 81 0/subop/add 3/mod/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="L381" class="LineNr">381 </span> <span class="subxS1Comment"># . end</span>
<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="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L237" class="LineNr">237 </span> 68/push 0x8899aa/imm32
<span id="L238" class="LineNr">238 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L239" class="LineNr">239 </span> <span class="subxS2Comment"># . . call</span>
<span id="L240" class="LineNr">240 </span> e8/call <a href='067print-int.subx.html#L167'>print-int32</a>/disp32
<span id="L241" class="LineNr">241 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L242" class="LineNr">242 </span> 81 0/subop/add 3/mod/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="L243" class="LineNr">243 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0x008899aa&quot;, msg)</span>
<span id="L244" class="LineNr">244 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L245" class="LineNr">245 </span> 68/push <span class="Constant">&quot;F - test-print-int32&quot;</span>/imm32
<span id="L246" class="LineNr">246 </span> 68/push <span class="Constant">&quot;0x008899aa&quot;</span>/imm32
<span id="L247" class="LineNr">247 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L248" class="LineNr">248 </span> <span class="subxS2Comment"># . . call</span>
<span id="L249" class="LineNr">249 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L250" class="LineNr">250 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L251" class="LineNr">251 </span> 81 0/subop/add 3/mod/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="L252" class="LineNr">252 </span> <span class="subxS1Comment"># . end</span>
<span id="L253" class="LineNr">253 </span> c3/return
<span id="L254" class="LineNr">254 </span>
<span id="L255" class="LineNr">255 </span><span class="subxComment"># TODO: append to string</span>
<span id="L256" class="LineNr">256 </span><span class="subxFunction">check-ints-equal2</span>: <span class="subxComment"># (a : int, b : int, msg : (address array byte))</span>
<span id="L257" class="LineNr">257 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L258" class="LineNr">258 </span> 55/push-EBP
<span id="L259" class="LineNr">259 </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="L260" class="LineNr">260 </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="L261" class="LineNr">261 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L262" class="LineNr">262 </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="L263" class="LineNr">263 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L264" class="LineNr">264 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L265" class="LineNr">265 </span> 81 0/subop/add 3/mod/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="L266" class="LineNr">266 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L267" class="LineNr">267 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L268" class="LineNr">268 </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="L269" class="LineNr">269 </span> 5d/pop-to-EBP
<span id="L270" class="LineNr">270 </span> c3/return
<span id="L271" class="LineNr">271 </span>
<span id="L272" class="LineNr">272 </span><span class="subxFunction">print-int32-buffered</span>: <span class="subxComment"># f : (address buffered-file), n : int -&gt; &lt;void&gt;</span>
<span id="L273" class="LineNr">273 </span> <span class="subxComment"># pseudocode:</span>
<span id="L274" class="LineNr">274 </span> <span class="subxComment"># write-buffered(f, &quot;0x&quot;)</span>
<span id="L275" class="LineNr">275 </span> <span class="subxComment"># ECX = 28</span>
<span id="L276" class="LineNr">276 </span> <span class="subxComment"># while true</span>
<span id="L277" class="LineNr">277 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L278" class="LineNr">278 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L279" class="LineNr">279 </span> <span class="subxComment"># EAX = EAX &amp; 0xf</span>
<span id="L280" class="LineNr">280 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L281" class="LineNr">281 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L282" class="LineNr">282 </span> <span class="subxComment">#</span>
<span id="L283" class="LineNr">283 </span> <span class="subxS1Comment"># . prolog</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="subxS1Comment"># . save registers</span>
<span id="L287" class="LineNr">287 </span> 50/push-EAX
<span id="L288" class="LineNr">288 </span> 51/push-ECX
<span id="L289" class="LineNr">289 </span> <span class="subxComment"># ECX = 28</span>
<span id="L290" class="LineNr">290 </span> b9/copy-to-ECX 0x1c/imm32
<span id="L291" class="LineNr">291 </span><span class="Constant">$print-int32-buffered:print-hex-prefix</span>:
<span id="L292" class="LineNr">292 </span> <span class="subxComment"># write-buffered(f, &quot;0x&quot;)</span>
<span id="L293" class="LineNr">293 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L294" class="LineNr">294 </span> 68/push <span class="Constant">&quot;0x&quot;</span>/imm32
<span id="L295" class="LineNr">295 </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="L296" class="LineNr">296 </span> <span class="subxS2Comment"># . . call</span>
<span id="L297" class="LineNr">297 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L298" class="LineNr">298 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L299" class="LineNr">299 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L300" class="LineNr">300 </span><span class="Constant">$print-int32-buffered:loop</span>:
<span id="L301" class="LineNr">301 </span> <span class="subxComment"># if (ECX &lt; 0) break</span>
<span id="L302" class="LineNr">302 </span> 81 7/subop/compare 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> 0/imm32 <span class="subxComment"># compare ECX</span>
<span id="L303" class="LineNr">303 </span> 7c/jump-if-lesser $print-int32-buffered:end/disp8
<span id="L304" class="LineNr">304 </span> <span class="subxComment"># EAX = n &gt;&gt; ECX</span>
<span id="L305" class="LineNr">305 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L306" class="LineNr">306 </span> d3/&gt;&gt;ECX 5/subop/pad-zeroes 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># shift EAX right by ECX bits, padding zeroes</span>
<span id="L307" class="LineNr">307 </span> <span class="subxComment"># EAX = to-hex-char(AL)</span>
<span id="L308" class="LineNr">308 </span> 25/and-EAX 0xf/imm32
<span id="L309" class="LineNr">309 </span> e8/call <a href='065hex.subx.html#L809'>to-hex-char</a>/disp32
<span id="L310" class="LineNr">310 </span> <span class="subxComment"># write-byte-buffered(f, AL)</span>
<span id="L311" class="LineNr">311 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L312" class="LineNr">312 </span> 50/push-EAX
<span id="L313" class="LineNr">313 </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="L314" class="LineNr">314 </span> <span class="subxS2Comment"># . . call</span>
<span id="L315" class="LineNr">315 </span> e8/call <a href='064write-byte.subx.html#L31'>write-byte-buffered</a>/disp32
<span id="L316" class="LineNr">316 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L317" class="LineNr">317 </span> 81 0/subop/add 3/mod/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="L318" class="LineNr">318 </span> <span class="subxComment"># ECX -= 4</span>
<span id="L319" class="LineNr">319 </span> 81 5/subop/subtract 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># subtract from ECX</span>
<span id="L320" class="LineNr">320 </span> eb/jump $print-int32-buffered:loop/disp8
<span id="L321" class="LineNr">321 </span><span class="Constant">$print-int32-buffered:end</span>:
<span id="L322" class="LineNr">322 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L323" class="LineNr">323 </span> 59/pop-to-ECX
<span id="L324" class="LineNr">324 </span> 58/pop-to-EAX
<span id="L325" class="LineNr">325 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L326" class="LineNr">326 </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="L327" class="LineNr">327 </span> 5d/pop-to-EBP
<span id="L328" class="LineNr">328 </span> c3/return
<span id="L329" class="LineNr">329 </span>
<span id="L330" class="LineNr">330 </span><span class="subxTest">test-print-int32-buffered</span>:
<span id="L331" class="LineNr">331 </span> <span class="subxH1Comment"># - check that print-int32-buffered prints the hex textual representation</span>
<span id="L332" class="LineNr">332 </span> <span class="subxComment"># setup</span>
<span id="L333" class="LineNr">333 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L334" class="LineNr">334 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L335" class="LineNr">335 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L336" class="LineNr">336 </span> <span class="subxS2Comment"># . . call</span>
<span id="L337" class="LineNr">337 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L338" class="LineNr">338 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L339" class="LineNr">339 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L340" class="LineNr">340 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L341" class="LineNr">341 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L342" class="LineNr">342 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L343" class="LineNr">343 </span> 05/add-to-EAX 4/imm32
<span id="L344" class="LineNr">344 </span> 50/push-EAX
<span id="L345" class="LineNr">345 </span> <span class="subxS2Comment"># . . call</span>
<span id="L346" class="LineNr">346 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L347" class="LineNr">347 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L348" class="LineNr">348 </span> 81 0/subop/add 3/mod/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="L349" class="LineNr">349 </span> <span class="subxComment"># print-int32-buffered(_test-buffered-file, 0x8899aa)</span>
<span id="L350" class="LineNr">350 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L351" class="LineNr">351 </span> 68/push 0x8899aa/imm32
<span id="L352" class="LineNr">352 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L353" class="LineNr">353 </span> <span class="subxS2Comment"># . . call</span>
<span id="L354" class="LineNr">354 </span> e8/call <a href='067print-int.subx.html#L272'>print-int32-buffered</a>/disp32
<span id="L355" class="LineNr">355 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L356" class="LineNr">356 </span> 81 0/subop/add 3/mod/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="L357" class="LineNr">357 </span> <span class="subxComment"># flush(_test-buffered-file)</span>
<span id="L358" class="LineNr">358 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L359" class="LineNr">359 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L360" class="LineNr">360 </span> <span class="subxS2Comment"># . . call</span>
<span id="L361" class="LineNr">361 </span> e8/call <a href='064write-byte.subx.html#L79'>flush</a>/disp32
<span id="L362" class="LineNr">362 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L363" class="LineNr">363 </span> 81 0/subop/add 3/mod/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="L364" class="Folded">364 </span><span class="Folded">+-- 18 lines: #? # dump line -----------------------------------------------------------------------------------------------------------------------------</span>
<span id="L382" class="LineNr">382 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0x008899aa&quot;, msg)</span>
<span id="L383" class="LineNr">383 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L384" class="LineNr">384 </span> 68/push <span class="Constant">&quot;F - test-print-int32-buffered&quot;</span>/imm32
<span id="L385" class="LineNr">385 </span> 68/push <span class="Constant">&quot;0x008899aa&quot;</span>/imm32
<span id="L386" class="LineNr">386 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L387" class="LineNr">387 </span> <span class="subxS2Comment"># . . call</span>
<span id="L388" class="LineNr">388 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L389" class="LineNr">389 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L390" class="LineNr">390 </span> 81 0/subop/add 3/mod/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="L391" class="LineNr">391 </span> <span class="subxS1Comment"># . end</span>
<span id="L392" class="LineNr">392 </span> c3/return
<span id="L393" class="LineNr">393 </span>
<span id="L394" class="LineNr">394 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/068error-byte.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,15 +14,15 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.SpecialChar { color: #d70000; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -39,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -93,7 +93,7 @@ if ('onhashchange' in window) {
<span id="L33" class="LineNr"> 33 </span> 68/push <span class="Constant">&quot;Error: &quot;</span>/imm32
<span id="L34" class="LineNr"> 34 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxS2Comment"># . . call</span>
<span id="L36" class="LineNr"> 36 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L36" class="LineNr"> 36 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L37" class="LineNr"> 37 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L38" class="LineNr"> 38 </span> 81 0/subop/add 3/mod/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="L39" class="LineNr"> 39 </span> <span class="subxComment"># write-buffered(out, msg)</span>
@ -101,7 +101,7 @@ if ('onhashchange' in window) {
<span id="L41" class="LineNr"> 41 </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="L42" class="LineNr"> 42 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L43" class="LineNr"> 43 </span> <span class="subxS2Comment"># . . call</span>
<span id="L44" class="LineNr"> 44 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L44" class="LineNr"> 44 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L45" class="LineNr"> 45 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L46" class="LineNr"> 46 </span> 81 0/subop/add 3/mod/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="L47" class="LineNr"> 47 </span> <span class="subxComment"># write-buffered(out, &quot;: &quot;)</span>
@ -109,7 +109,7 @@ if ('onhashchange' in window) {
<span id="L49" class="LineNr"> 49 </span> 68/push <span class="Constant">&quot;: &quot;</span>/imm32
<span id="L50" class="LineNr"> 50 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L51" class="LineNr"> 51 </span> <span class="subxS2Comment"># . . call</span>
<span id="L52" class="LineNr"> 52 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L52" class="LineNr"> 52 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L53" class="LineNr"> 53 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L54" class="LineNr"> 54 </span> 81 0/subop/add 3/mod/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="L55" class="LineNr"> 55 </span> <span class="subxComment"># print-byte-buffered(out, byte)</span>
@ -117,7 +117,7 @@ if ('onhashchange' in window) {
<span id="L57" class="LineNr"> 57 </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> 0x14/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+20)</span>
<span id="L58" class="LineNr"> 58 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L59" class="LineNr"> 59 </span> <span class="subxS2Comment"># . . call</span>
<span id="L60" class="LineNr"> 60 </span> e8/call <a href='067print-int.subx.html#L87'>print-byte-buffered</a>/disp32
<span id="L60" class="LineNr"> 60 </span> e8/call <a href='067print-int.subx.html#L80'>print-byte-buffered</a>/disp32
<span id="L61" class="LineNr"> 61 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L62" class="LineNr"> 62 </span> 81 0/subop/add 3/mod/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="L63" class="LineNr"> 63 </span> <span class="subxComment"># write-buffered(out, Newline)</span>
@ -125,7 +125,7 @@ if ('onhashchange' in window) {
<span id="L65" class="LineNr"> 65 </span> 68/push <span class="SpecialChar"><a href='051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L66" class="LineNr"> 66 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L67" class="LineNr"> 67 </span> <span class="subxS2Comment"># . . call</span>
<span id="L68" class="LineNr"> 68 </span> e8/call <a href='066write-buffered.subx.html#L16'>write-buffered</a>/disp32
<span id="L68" class="LineNr"> 68 </span> e8/call <a href='066write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L69" class="LineNr"> 69 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L70" class="LineNr"> 70 </span> 81 0/subop/add 3/mod/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="L71" class="LineNr"> 71 </span> <span class="subxS1Comment"># . flush(out)</span>
@ -140,7 +140,7 @@ if ('onhashchange' in window) {
<span id="L80" class="LineNr"> 80 </span> 68/push 1/imm32
<span id="L81" class="LineNr"> 81 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+8)</span>
<span id="L82" class="LineNr"> 82 </span> <span class="subxS2Comment"># . . call</span>
<span id="L83" class="LineNr"> 83 </span> e8/call <a href='059stop.subx.html#L98'>stop</a>/disp32
<span id="L83" class="LineNr"> 83 </span> e8/call <a href='059stop.subx.html#L91'>stop</a>/disp32
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># should never get past this point</span>
<span id="L85" class="LineNr"> 85 </span><span class="Constant">$error-byte:dead-end</span>:
<span id="L86" class="LineNr"> 86 </span> <span class="subxS1Comment"># . epilog</span>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/069allocate.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,14 +14,14 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/070new-stream.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -15,13 +15,13 @@ body { font-size:12pt; font-family: monospace; color: #000000; background-color:
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -38,7 +38,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/071read-line.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,16 +14,15 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>
@ -40,7 +39,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -64,228 +63,221 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L4" class="LineNr"> 4 </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="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L7" class="LineNr"> 7 </span><span class="CommentedCode">#? e8/call test-read-line-buffered/disp32</span>
<span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L10" class="LineNr"> 10 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L11" class="LineNr"> 11 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L12" class="LineNr"> 12 </span>
<span id="L13" class="LineNr"> 13 </span><span class="subxComment"># read bytes from 'f' until (and including) a newline and store them into 's'</span>
<span id="L14" class="LineNr"> 14 </span><span class="subxComment"># 's' fails to grow if and only if no data found</span>
<span id="L15" class="LineNr"> 15 </span><span class="subxComment"># just abort if 's' is too small</span>
<span id="L16" class="LineNr"> 16 </span><span class="subxFunction">read-line-buffered</span>: <span class="subxComment"># f : (address buffered-file), s : (address stream byte) -&gt; &lt;void&gt;</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># pseudocode:</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># while true</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># if (s-&gt;write &gt;= s-&gt;length) abort</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># if (f-&gt;write == 0) break</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># s-&gt;data[s-&gt;write] = AL</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># ++s-&gt;write</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># if (AL == '\n') break</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L28" class="LineNr"> 28 </span> 55/push-EBP
<span id="L29" class="LineNr"> 29 </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="L30" class="LineNr"> 30 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L31" class="LineNr"> 31 </span> 50/push-EAX
<span id="L32" class="LineNr"> 32 </span> 51/push-ECX
<span id="L33" class="LineNr"> 33 </span> 52/push-EDX
<span id="L34" class="LineNr"> 34 </span> 56/push-ESI
<span id="L35" class="LineNr"> 35 </span> 57/push-EDI
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># ESI = f</span>
<span id="L37" class="LineNr"> 37 </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="L38" class="LineNr"> 38 </span> <span class="subxComment"># ECX = f-&gt;read</span>
<span id="L39" class="LineNr"> 39 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <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 *(ESI+8) to ECX</span>
<span id="L40" class="LineNr"> 40 </span> <span class="subxComment"># EDI = s</span>
<span id="L41" class="LineNr"> 41 </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="L42" class="LineNr"> 42 </span> <span class="subxComment"># EDX = s-&gt;write</span>
<span id="L43" class="LineNr"> 43 </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="L44" class="LineNr"> 44 </span><span class="Constant">$read-line-buffered:loop</span>:
<span id="L45" class="LineNr"> 45 </span> <span class="subxComment"># if (s-&gt;write &gt;= s-&gt;length) abort</span>
<span id="L46" class="LineNr"> 46 </span> 3b/compare 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"># compare EDX with *(EDI+8)</span>
<span id="L47" class="LineNr"> 47 </span> 7d/jump-if-greater-or-equal $read-line-buffered:abort/disp8
<span id="L48" class="LineNr"> 48 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L49" class="LineNr"> 49 </span> 3b/compare 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># compare ECX with *(ESI+4)</span>
<span id="L50" class="LineNr"> 50 </span> 7c/jump-if-lesser $read-line-buffered:from-stream/disp8
<span id="L51" class="LineNr"> 51 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L52" class="LineNr"> 52 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L53" class="LineNr"> 53 </span> 8d/copy-address 1/mod/*+disp8 6/rm32/ESI <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 ESI+4 to EAX</span>
<span id="L54" class="LineNr"> 54 </span> 50/push-EAX
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . call</span>
<span id="L56" class="LineNr"> 56 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L57" class="LineNr"> 57 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L58" class="LineNr"> 58 </span> 81 0/subop/add 3/mod/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="L59" class="LineNr"> 59 </span> <span class="subxS1Comment"># . f-&gt;read must now be 0; update its cache at ECX</span>
<span id="L60" class="LineNr"> 60 </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="L61" class="LineNr"> 61 </span> <span class="subxS1Comment"># . EAX = read(f-&gt;fd, stream = f+4)</span>
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L63" class="LineNr"> 63 </span> 50/push-EAX
<span id="L64" class="LineNr"> 64 </span> ff 6/subop/push 0/mod/indirect 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ESI</span>
<span id="L65" class="LineNr"> 65 </span> <span class="subxS2Comment"># . . call</span>
<span id="L66" class="LineNr"> 66 </span> e8/call <a href='060read.subx.html#L48'>read</a>/disp32
<span id="L67" class="LineNr"> 67 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L68" class="LineNr"> 68 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># if (f-&gt;write == 0) break</span>
<span id="L70" class="LineNr"> 70 </span> <span class="subxComment"># since f-&gt;read was initially 0, EAX is the same as f-&gt;write</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxS1Comment"># . if (EAX == 0) return true</span>
<span id="L72" class="LineNr"> 72 </span> 3d/compare-EAX-and 0/imm32
<span id="L73" class="LineNr"> 73 </span> 74/jump-if-equal $read-line-buffered:end/disp8
<span id="L74" class="LineNr"> 74 </span><span class="Constant">$read-line-buffered:from-stream</span>:
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L76" class="LineNr"> 76 </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="L77" class="LineNr"> 77 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+16) to AL</span>
<span id="L78" class="LineNr"> 78 </span> <span class="subxComment"># s-&gt;data[s-&gt;write] = AL</span>
<span id="L79" class="LineNr"> 79 </span> 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 0/r32/AL 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy AL to *(EDI+EDX+12)</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L81" class="LineNr"> 81 </span> 41/increment-ECX
<span id="L82" class="LineNr"> 82 </span> <span class="subxComment"># ++s-&gt;write</span>
<span id="L83" class="LineNr"> 83 </span> 42/increment-EDX
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># if (AL == '\n') return</span>
<span id="L85" class="LineNr"> 85 </span> 3d/compare-EAX-and 0xa/imm32
<span id="L86" class="LineNr"> 86 </span> 75/jump-if-not-equal $read-line-buffered:loop/disp8
<span id="L87" class="LineNr"> 87 </span><span class="Constant">$read-line-buffered:end</span>:
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># save f-&gt;read</span>
<span id="L89" class="LineNr"> 89 </span> 89/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(ESI+8)</span>
<span id="L90" class="LineNr"> 90 </span> <span class="subxComment"># save s-&gt;write</span>
<span id="L91" class="LineNr"> 91 </span> 89/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 EDX to *EDI</span>
<span id="L92" class="LineNr"> 92 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L93" class="LineNr"> 93 </span> 5f/pop-to-EDI
<span id="L94" class="LineNr"> 94 </span> 5e/pop-to-ESI
<span id="L95" class="LineNr"> 95 </span> 5a/pop-to-EDX
<span id="L96" class="LineNr"> 96 </span> 59/pop-to-ECX
<span id="L97" class="LineNr"> 97 </span> 58/pop-to-EAX
<span id="L98" class="LineNr"> 98 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L99" class="LineNr"> 99 </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="L100" class="LineNr">100 </span> 5d/pop-to-EBP
<span id="L101" class="LineNr">101 </span> c3/return
<span id="L102" class="LineNr">102 </span>
<span id="L103" class="LineNr">103 </span><span class="Constant">$read-line-buffered:abort</span>:
<span id="L104" class="LineNr">104 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L106" class="LineNr">106 </span> 68/push <span class="Constant">&quot;read-line-buffered: line too long\n&quot;</span>/imm32
<span id="L107" class="LineNr">107 </span> 68/push 2/imm32/stderr
<span id="L108" class="LineNr">108 </span> <span class="subxS2Comment"># . . call</span>
<span id="L109" class="LineNr">109 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L110" class="LineNr">110 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L111" class="LineNr">111 </span> 81 0/subop/add 3/mod/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="L112" class="LineNr">112 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L113" class="LineNr">113 </span> bb/copy-to-EBX 1/imm32
<span id="L114" class="LineNr">114 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L115" class="LineNr">115 </span> cd/syscall 0x80/imm8
<span id="L116" class="LineNr">116 </span> <span class="subxComment"># never gets here</span>
<span id="L117" class="LineNr">117 </span>
<span id="L118" class="LineNr">118 </span><span class="subxTest">test-read-line-buffered</span>:
<span id="L119" class="LineNr">119 </span> <span class="subxH1Comment"># - check that read-line-buffered stops at a newline</span>
<span id="L120" class="LineNr">120 </span> <span class="subxComment"># setup</span>
<span id="L121" class="LineNr">121 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxComment"># read bytes from 'f' until (and including) a newline and store them into 's'</span>
<span id="L7" class="LineNr"> 7 </span><span class="subxComment"># 's' fails to grow if and only if no data found</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># just abort if 's' is too small</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxFunction">read-line-buffered</span>: <span class="subxComment"># f : (address buffered-file), s : (address stream byte) -&gt; &lt;void&gt;</span>
<span id="L10" class="LineNr"> 10 </span> <span class="subxComment"># pseudocode:</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxComment"># while true</span>
<span id="L12" class="LineNr"> 12 </span> <span class="subxComment"># if (s-&gt;write &gt;= s-&gt;length) abort</span>
<span id="L13" class="LineNr"> 13 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L14" class="LineNr"> 14 </span> <span class="subxComment"># if (f-&gt;write == 0) break</span>
<span id="L15" class="LineNr"> 15 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L16" class="LineNr"> 16 </span> <span class="subxComment"># s-&gt;data[s-&gt;write] = AL</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># ++s-&gt;write</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># if (AL == '\n') break</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L21" class="LineNr"> 21 </span> 55/push-EBP
<span id="L22" class="LineNr"> 22 </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="L23" class="LineNr"> 23 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L24" class="LineNr"> 24 </span> 50/push-EAX
<span id="L25" class="LineNr"> 25 </span> 51/push-ECX
<span id="L26" class="LineNr"> 26 </span> 52/push-EDX
<span id="L27" class="LineNr"> 27 </span> 56/push-ESI
<span id="L28" class="LineNr"> 28 </span> 57/push-EDI
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># ESI = f</span>
<span id="L30" class="LineNr"> 30 </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="L31" class="LineNr"> 31 </span> <span class="subxComment"># ECX = f-&gt;read</span>
<span id="L32" class="LineNr"> 32 </span> 8b/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ESI+8) to ECX</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># EDI = s</span>
<span id="L34" class="LineNr"> 34 </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="L35" class="LineNr"> 35 </span> <span class="subxComment"># EDX = s-&gt;write</span>
<span id="L36" class="LineNr"> 36 </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="L37" class="LineNr"> 37 </span><span class="Constant">$read-line-buffered:loop</span>:
<span id="L38" class="LineNr"> 38 </span> <span class="subxComment"># if (s-&gt;write &gt;= s-&gt;length) abort</span>
<span id="L39" class="LineNr"> 39 </span> 3b/compare 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"># compare EDX with *(EDI+8)</span>
<span id="L40" class="LineNr"> 40 </span> 7d/jump-if-greater-or-equal $read-line-buffered:abort/disp8
<span id="L41" class="LineNr"> 41 </span> <span class="subxComment"># if (f-&gt;read &gt;= f-&gt;write) populate stream from file</span>
<span id="L42" class="LineNr"> 42 </span> 3b/compare 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># compare ECX with *(ESI+4)</span>
<span id="L43" class="LineNr"> 43 </span> 7c/jump-if-lesser $read-line-buffered:from-stream/disp8
<span id="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L46" class="LineNr"> 46 </span> 8d/copy-address 1/mod/*+disp8 6/rm32/ESI <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 ESI+4 to EAX</span>
<span id="L47" class="LineNr"> 47 </span> 50/push-EAX
<span id="L48" class="LineNr"> 48 </span> <span class="subxS2Comment"># . . call</span>
<span id="L49" class="LineNr"> 49 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L50" class="LineNr"> 50 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L51" class="LineNr"> 51 </span> 81 0/subop/add 3/mod/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="L52" class="LineNr"> 52 </span> <span class="subxS1Comment"># . f-&gt;read must now be 0; update its cache at ECX</span>
<span id="L53" class="LineNr"> 53 </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="L54" class="LineNr"> 54 </span> <span class="subxS1Comment"># . EAX = read(f-&gt;fd, stream = f+4)</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L56" class="LineNr"> 56 </span> 50/push-EAX
<span id="L57" class="LineNr"> 57 </span> ff 6/subop/push 0/mod/indirect 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ESI</span>
<span id="L58" class="LineNr"> 58 </span> <span class="subxS2Comment"># . . call</span>
<span id="L59" class="LineNr"> 59 </span> e8/call <a href='060read.subx.html#L48'>read</a>/disp32
<span id="L60" class="LineNr"> 60 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L61" class="LineNr"> 61 </span> 81 0/subop/add 3/mod/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="L62" class="LineNr"> 62 </span> <span class="subxComment"># if (f-&gt;write == 0) break</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment"># since f-&gt;read was initially 0, EAX is the same as f-&gt;write</span>
<span id="L64" class="LineNr"> 64 </span> <span class="subxS1Comment"># . if (EAX == 0) return true</span>
<span id="L65" class="LineNr"> 65 </span> 3d/compare-EAX-and 0/imm32
<span id="L66" class="LineNr"> 66 </span> 74/jump-if-equal $read-line-buffered:end/disp8
<span id="L67" class="LineNr"> 67 </span><span class="Constant">$read-line-buffered:from-stream</span>:
<span id="L68" class="LineNr"> 68 </span> <span class="subxComment"># AL = f-&gt;data[f-&gt;read]</span>
<span id="L69" class="LineNr"> 69 </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="L70" class="LineNr"> 70 </span> 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy byte at *(ESI+ECX+16) to AL</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># s-&gt;data[s-&gt;write] = AL</span>
<span id="L72" class="LineNr"> 72 </span> 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 0/r32/AL 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy AL to *(EDI+EDX+12)</span>
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># ++f-&gt;read</span>
<span id="L74" class="LineNr"> 74 </span> 41/increment-ECX
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># ++s-&gt;write</span>
<span id="L76" class="LineNr"> 76 </span> 42/increment-EDX
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># if (AL == '\n') return</span>
<span id="L78" class="LineNr"> 78 </span> 3d/compare-EAX-and 0xa/imm32
<span id="L79" class="LineNr"> 79 </span> 75/jump-if-not-equal $read-line-buffered:loop/disp8
<span id="L80" class="LineNr"> 80 </span><span class="Constant">$read-line-buffered:end</span>:
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># save f-&gt;read</span>
<span id="L82" class="LineNr"> 82 </span> 89/copy 1/mod/*+disp8 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ECX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ECX to *(ESI+8)</span>
<span id="L83" class="LineNr"> 83 </span> <span class="subxComment"># save s-&gt;write</span>
<span id="L84" class="LineNr"> 84 </span> 89/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 EDX to *EDI</span>
<span id="L85" class="LineNr"> 85 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L86" class="LineNr"> 86 </span> 5f/pop-to-EDI
<span id="L87" class="LineNr"> 87 </span> 5e/pop-to-ESI
<span id="L88" class="LineNr"> 88 </span> 5a/pop-to-EDX
<span id="L89" class="LineNr"> 89 </span> 59/pop-to-ECX
<span id="L90" class="LineNr"> 90 </span> 58/pop-to-EAX
<span id="L91" class="LineNr"> 91 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L92" class="LineNr"> 92 </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="L93" class="LineNr"> 93 </span> 5d/pop-to-EBP
<span id="L94" class="LineNr"> 94 </span> c3/return
<span id="L95" class="LineNr"> 95 </span>
<span id="L96" class="LineNr"> 96 </span><span class="Constant">$read-line-buffered:abort</span>:
<span id="L97" class="LineNr"> 97 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L98" class="LineNr"> 98 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L99" class="LineNr"> 99 </span> 68/push <span class="Constant">&quot;read-line-buffered: line too long\n&quot;</span>/imm32
<span id="L100" class="LineNr">100 </span> 68/push 2/imm32/stderr
<span id="L101" class="LineNr">101 </span> <span class="subxS2Comment"># . . call</span>
<span id="L102" class="LineNr">102 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L103" class="LineNr">103 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L104" class="LineNr">104 </span> 81 0/subop/add 3/mod/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="L105" class="LineNr">105 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L106" class="LineNr">106 </span> bb/copy-to-EBX 1/imm32
<span id="L107" class="LineNr">107 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L108" class="LineNr">108 </span> cd/syscall 0x80/imm8
<span id="L109" class="LineNr">109 </span> <span class="subxComment"># never gets here</span>
<span id="L110" class="LineNr">110 </span>
<span id="L111" class="LineNr">111 </span><span class="subxTest">test-read-line-buffered</span>:
<span id="L112" class="LineNr">112 </span> <span class="subxH1Comment"># - check that read-line-buffered stops at a newline</span>
<span id="L113" class="LineNr">113 </span> <span class="subxComment"># setup</span>
<span id="L114" class="LineNr">114 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L115" class="LineNr">115 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L116" class="LineNr">116 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L117" class="LineNr">117 </span> <span class="subxS2Comment"># . . call</span>
<span id="L118" class="LineNr">118 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L120" class="LineNr">120 </span> 81 0/subop/add 3/mod/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="L121" class="LineNr">121 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L123" class="LineNr">123 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . call</span>
<span id="L125" class="LineNr">125 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L127" class="LineNr">127 </span> 81 0/subop/add 3/mod/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="L128" class="LineNr">128 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L130" class="LineNr">130 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L131" class="LineNr">131 </span> 05/add-to-EAX 4/imm32
<span id="L132" class="LineNr">132 </span> 50/push-EAX
<span id="L123" class="LineNr">123 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L124" class="LineNr">124 </span> 05/add-to-EAX 4/imm32
<span id="L125" class="LineNr">125 </span> 50/push-EAX
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . call</span>
<span id="L127" class="LineNr">127 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L128" class="LineNr">128 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L129" class="LineNr">129 </span> 81 0/subop/add 3/mod/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="L130" class="LineNr">130 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L132" class="LineNr">132 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . call</span>
<span id="L134" class="LineNr">134 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L136" class="LineNr">136 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L137" class="LineNr">137 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L137" class="LineNr">137 </span> <span class="subxComment"># write(_test-stream, &quot;ab\ncd&quot;)</span>
<span id="L138" class="LineNr">138 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L139" class="LineNr">139 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . call</span>
<span id="L141" class="LineNr">141 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L143" class="LineNr">143 </span> 81 0/subop/add 3/mod/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="L144" class="LineNr">144 </span> <span class="subxComment"># write(_test-stream, &quot;ab\ncd&quot;)</span>
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L146" class="LineNr">146 </span> 68/push <span class="Constant">&quot;ab\ncd&quot;</span>/imm32
<span id="L147" class="LineNr">147 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L148" class="LineNr">148 </span> <span class="subxS2Comment"># . . call</span>
<span id="L149" class="LineNr">149 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L151" class="LineNr">151 </span> 81 0/subop/add 3/mod/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="L152" class="LineNr">152 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L153" class="LineNr">153 </span> <span class="subxS1Comment"># . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream)</span>
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L155" class="LineNr">155 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L156" class="LineNr">156 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . call</span>
<span id="L158" class="LineNr">158 </span> e8/call <a href='071read-line.subx.html#L16'>read-line-buffered</a>/disp32
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L160" class="LineNr">160 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L161" class="LineNr">161 </span> <span class="subxComment"># check-next-stream-line-equal(_test-tmp-stream, &quot;ab&quot;, msg)</span>
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L163" class="LineNr">163 </span> 68/push <span class="Constant">&quot;F - test-read-line-buffered&quot;</span>/imm32
<span id="L164" class="LineNr">164 </span> 68/push <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L165" class="LineNr">165 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . call</span>
<span id="L167" class="LineNr">167 </span> e8/call <a href='058stream-equal.subx.html#L570'>check-next-stream-line-equal</a>/disp32
<span id="L168" class="LineNr">168 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L169" class="LineNr">169 </span> 81 0/subop/add 3/mod/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="L170" class="LineNr">170 </span> <span class="subxComment"># end</span>
<span id="L171" class="LineNr">171 </span> c3/return
<span id="L172" class="LineNr">172 </span>
<span id="L173" class="LineNr">173 </span><span class="subxTest">test-read-line-buffered-reads-final-line-until-Eof</span>:
<span id="L174" class="LineNr">174 </span> <span class="subxComment"># setup</span>
<span id="L175" class="LineNr">175 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L139" class="LineNr">139 </span> 68/push <span class="Constant">&quot;ab\ncd&quot;</span>/imm32
<span id="L140" class="LineNr">140 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L141" class="LineNr">141 </span> <span class="subxS2Comment"># . . call</span>
<span id="L142" class="LineNr">142 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L144" class="LineNr">144 </span> 81 0/subop/add 3/mod/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="L145" class="LineNr">145 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L146" class="LineNr">146 </span> <span class="subxS1Comment"># . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream)</span>
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L148" class="LineNr">148 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L149" class="LineNr">149 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . call</span>
<span id="L151" class="LineNr">151 </span> e8/call <a href='071read-line.subx.html#L9'>read-line-buffered</a>/disp32
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L153" class="LineNr">153 </span> 81 0/subop/add 3/mod/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="L154" class="LineNr">154 </span> <span class="subxComment"># check-next-stream-line-equal(_test-tmp-stream, &quot;ab&quot;, msg)</span>
<span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L156" class="LineNr">156 </span> 68/push <span class="Constant">&quot;F - test-read-line-buffered&quot;</span>/imm32
<span id="L157" class="LineNr">157 </span> 68/push <span class="Constant">&quot;ab&quot;</span>/imm32
<span id="L158" class="LineNr">158 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . call</span>
<span id="L160" class="LineNr">160 </span> e8/call <a href='058stream-equal.subx.html#L563'>check-next-stream-line-equal</a>/disp32
<span id="L161" class="LineNr">161 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L162" class="LineNr">162 </span> 81 0/subop/add 3/mod/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="L163" class="LineNr">163 </span> <span class="subxComment"># end</span>
<span id="L164" class="LineNr">164 </span> c3/return
<span id="L165" class="LineNr">165 </span>
<span id="L166" class="LineNr">166 </span><span class="subxTest">test-read-line-buffered-reads-final-line-until-Eof</span>:
<span id="L167" class="LineNr">167 </span> <span class="subxComment"># setup</span>
<span id="L168" class="LineNr">168 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L170" class="LineNr">170 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L171" class="LineNr">171 </span> <span class="subxS2Comment"># . . call</span>
<span id="L172" class="LineNr">172 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L174" class="LineNr">174 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L175" class="LineNr">175 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L177" class="LineNr">177 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L178" class="LineNr">178 </span> <span class="subxS2Comment"># . . call</span>
<span id="L179" class="LineNr">179 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L181" class="LineNr">181 </span> 81 0/subop/add 3/mod/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="L182" class="LineNr">182 </span> <span class="subxS1Comment"># . clear-stream(_test-buffered-file+4)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L184" class="LineNr">184 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L185" class="LineNr">185 </span> 05/add-to-EAX 4/imm32
<span id="L186" class="LineNr">186 </span> 50/push-EAX
<span id="L177" class="LineNr">177 </span> b8/copy-to-EAX <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L178" class="LineNr">178 </span> 05/add-to-EAX 4/imm32
<span id="L179" class="LineNr">179 </span> 50/push-EAX
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . call</span>
<span id="L181" class="LineNr">181 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L182" class="LineNr">182 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L183" class="LineNr">183 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L184" class="LineNr">184 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L186" class="LineNr">186 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . call</span>
<span id="L188" class="LineNr">188 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L190" class="LineNr">190 </span> 81 0/subop/add 3/mod/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="L191" class="LineNr">191 </span> <span class="subxS1Comment"># . clear-stream(_test-tmp-stream)</span>
<span id="L191" class="LineNr">191 </span> <span class="subxComment"># write(_test-stream, &quot;cd&quot;)</span>
<span id="L192" class="LineNr">192 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L193" class="LineNr">193 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . call</span>
<span id="L195" class="LineNr">195 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L197" class="LineNr">197 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L198" class="LineNr">198 </span> <span class="subxComment"># write(_test-stream, &quot;cd&quot;)</span>
<span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L200" class="LineNr">200 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L201" class="LineNr">201 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L206" class="LineNr">206 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L207" class="LineNr">207 </span> <span class="subxS1Comment"># . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream)</span>
<span id="L208" class="LineNr">208 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L209" class="LineNr">209 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L210" class="LineNr">210 </span> 68/push <a href='061read-byte.subx.html#L289'>_test-buffered-file</a>/imm32
<span id="L211" class="LineNr">211 </span> <span class="subxS2Comment"># . . call</span>
<span id="L212" class="LineNr">212 </span> e8/call <a href='071read-line.subx.html#L16'>read-line-buffered</a>/disp32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L214" class="LineNr">214 </span> 81 0/subop/add 3/mod/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="L215" class="LineNr">215 </span> <span class="subxComment"># check-stream-equal(_test-tmp-stream, &quot;cd&quot;, msg)</span>
<span id="L216" class="LineNr">216 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L217" class="LineNr">217 </span> 68/push <span class="Constant">&quot;F - test-read-line-buffered-reads-final-line-until-Eof&quot;</span>/imm32
<span id="L218" class="LineNr">218 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L219" class="LineNr">219 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L220" class="LineNr">220 </span> <span class="subxS2Comment"># . . call</span>
<span id="L221" class="LineNr">221 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L222" class="LineNr">222 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L223" class="LineNr">223 </span> 81 0/subop/add 3/mod/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="L224" class="LineNr">224 </span> <span class="subxComment"># end</span>
<span id="L225" class="LineNr">225 </span> c3/return
<span id="L226" class="LineNr">226 </span>
<span id="L227" class="LineNr">227 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L193" class="LineNr">193 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L194" class="LineNr">194 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . call</span>
<span id="L196" class="LineNr">196 </span> e8/call <a href='057write.subx.html#L24'>write</a>/disp32
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L198" class="LineNr">198 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L199" class="LineNr">199 </span> <span class="subxComment"># read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream</span>
<span id="L200" class="LineNr">200 </span> <span class="subxS1Comment"># . EAX = read-line-buffered(_test-buffered-file, _test-tmp-stream)</span>
<span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L202" class="LineNr">202 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L203" class="LineNr">203 </span> 68/push <a href='061read-byte.subx.html#L281'>_test-buffered-file</a>/imm32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . call</span>
<span id="L205" class="LineNr">205 </span> e8/call <a href='071read-line.subx.html#L9'>read-line-buffered</a>/disp32
<span id="L206" class="LineNr">206 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L207" class="LineNr">207 </span> 81 0/subop/add 3/mod/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="L208" class="LineNr">208 </span> <span class="subxComment"># check-stream-equal(_test-tmp-stream, &quot;cd&quot;, msg)</span>
<span id="L209" class="LineNr">209 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L210" class="LineNr">210 </span> 68/push <span class="Constant">&quot;F - test-read-line-buffered-reads-final-line-until-Eof&quot;</span>/imm32
<span id="L211" class="LineNr">211 </span> 68/push <span class="Constant">&quot;cd&quot;</span>/imm32
<span id="L212" class="LineNr">212 </span> 68/push <a href='060read.subx.html#L430'>_test-tmp-stream</a>/imm32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . call</span>
<span id="L214" class="LineNr">214 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L216" class="LineNr">216 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L217" class="LineNr">217 </span> <span class="subxComment"># end</span>
<span id="L218" class="LineNr">218 </span> c3/return
<span id="L219" class="LineNr">219 </span>
<span id="L220" class="LineNr">220 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/074print-int-decimal.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.Constant { color: #008787; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Folded { color: #080808; background-color: #949494; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxS2Comment { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxTest { color: #5f8700; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -41,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -67,289 +66,281 @@ if ('onhashchange' in window) {
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="CommentedCode">#? Entry: # run a single test, while debugging</span>
<span id="L9" class="LineNr"> 9 </span><span class="CommentedCode">#? e8/call test-print-int32-decimal-negative/disp32</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment">#?</span>
<span id="L11" class="LineNr"> 11 </span><span class="CommentedCode">#? # syscall(exit, Num-test-failures)</span>
<span id="L12" class="LineNr"> 12 </span><span class="CommentedCode">#? 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX</span>
<span id="L13" class="LineNr"> 13 </span><span class="CommentedCode">#? b8/copy-to-EAX 1/imm32/exit</span>
<span id="L14" class="LineNr"> 14 </span><span class="CommentedCode">#? cd/syscall 0x80/imm8</span>
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="subxFunction">print-int32-decimal</span>: <span class="subxComment"># out : (address stream), n : int32</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># works by generating characters from lowest to highest and pushing them</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># to the stack, before popping them one by one into the stream</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment">#</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># pseudocode:</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># push sentinel</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># EAX = abs(n)</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># while true</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># sign-extend EAX into EDX</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># EAX, EDX = EAX/10, EAX%10</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># EDX += '0'</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># push EDX</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># if n &lt; 0</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># push '-'</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># w = out-&gt;write</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># curr = &amp;out-&gt;data[out-&gt;write]</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># max = &amp;out-&gt;data[out-&gt;length]</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># while true</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># pop into EAX</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># if (EAX == sentinel) break</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxComment"># *curr = AL</span>
<span id="L39" class="LineNr"> 39 </span> <span class="subxComment"># ++curr</span>
<span id="L40" class="LineNr"> 40 </span> <span class="subxComment"># ++w</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L42" class="LineNr"> 42 </span> <span class="subxComment"># (based on K&amp;R itoa: <a href="https://en.wikibooks.org/wiki/C_Programming/stdlib.h/itoa)">https://en.wikibooks.org/wiki/C_Programming/stdlib.h/itoa)</a></span>
<span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># (this pseudocode contains registers because operations like division</span>
<span id="L44" class="LineNr"> 44 </span> <span class="subxComment"># require specific registers in x86)</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxComment">#</span>
<span id="L46" class="LineNr"> 46 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L47" class="LineNr"> 47 </span> 55/push-EBP
<span id="L48" class="LineNr"> 48 </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="L49" class="LineNr"> 49 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L50" class="LineNr"> 50 </span> 50/push-EAX
<span id="L51" class="LineNr"> 51 </span> 51/push-ECX
<span id="L52" class="LineNr"> 52 </span> 52/push-EDX
<span id="L53" class="LineNr"> 53 </span> 53/push-EBX
<span id="L54" class="LineNr"> 54 </span> 57/push-EDI
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># ten/ECX = 10</span>
<span id="L56" class="LineNr"> 56 </span> b9/copy-to-ECX 0xa/imm32
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># push sentinel</span>
<span id="L58" class="LineNr"> 58 </span> 68/push 0/imm32/sentinel
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># EAX = abs(n)</span>
<span id="L60" class="LineNr"> 60 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L61" class="LineNr"> 61 </span> 3d/compare-EAX-with 0/imm32
<span id="L62" class="LineNr"> 62 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:read-loop/disp8
<span id="L63" class="LineNr"> 63 </span><span class="Constant">$print-int32-decimal:negative</span>:
<span id="L64" class="LineNr"> 64 </span> f7 3/subop/negate 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># negate EAX</span>
<span id="L65" class="LineNr"> 65 </span><span class="Constant">$print-int32-decimal:read-loop</span>:
<span id="L66" class="LineNr"> 66 </span> <span class="subxComment"># EAX, EDX = EAX / 10, EAX % 10</span>
<span id="L67" class="LineNr"> 67 </span> 99/sign-extend-EAX-into-EDX
<span id="L68" class="LineNr"> 68 </span> f7 7/subop/idiv 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> <span class="Normal"> . </span> <span class="subxComment"># divide EDX:EAX by ECX, storing quotient in EAX and remainder in EDX</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># EDX += '0'</span>
<span id="L70" class="LineNr"> 70 </span> 81 0/subop/add 3/mod/direct 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x30/imm32 <span class="subxComment"># add to EDX</span>
<span id="L71" class="LineNr"> 71 </span> <span class="subxComment"># push EDX</span>
<span id="L72" class="LineNr"> 72 </span> 52/push-EDX
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L74" class="LineNr"> 74 </span> 3d/compare-EAX-and 0/imm32
<span id="L75" class="LineNr"> 75 </span> 7f/jump-if-greater $print-int32-decimal:read-loop/disp8
<span id="L76" class="LineNr"> 76 </span><span class="Constant">$print-int32-decimal:read-break</span>:
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># if (n &lt; 0) push('-')</span>
<span id="L78" class="LineNr"> 78 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 0/imm32 <span class="subxComment"># compare *(EBP+12)</span>
<span id="L79" class="LineNr"> 79 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:<a href='057write.subx.html#L24'>write</a>/disp8
<span id="L80" class="LineNr"> 80 </span><span class="Constant">$print-int32-decimal:push-negative</span>:
<span id="L81" class="LineNr"> 81 </span> 68/push 0x2d/imm32/-
<span id="L82" class="LineNr"> 82 </span><span class="Constant">$print-int32-decimal:<a href='057write.subx.html#L24'>write</a></span>:
<span id="L83" class="LineNr"> 83 </span> <span class="subxComment"># EDI = out</span>
<span id="L84" class="LineNr"> 84 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EDI</span>
<span id="L85" class="LineNr"> 85 </span> <span class="subxComment"># w/EDX = out-&gt;write</span>
<span id="L86" class="LineNr"> 86 </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="L87" class="LineNr"> 87 </span> <span class="subxComment"># curr/ECX = &amp;out-&gt;data[out-&gt;write]</span>
<span id="L88" class="LineNr"> 88 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 1/r32/ECX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBX+EDX+12 to ECX</span>
<span id="L89" class="LineNr"> 89 </span> <span class="subxComment"># max/EBX = &amp;out-&gt;data[out-&gt;length]</span>
<span id="L90" class="LineNr"> 90 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+8) to EBX</span>
<span id="L91" class="LineNr"> 91 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 3/index/EBX <span class="Normal"> . </span> 3/r32/EBX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+EBX+12 to EBX</span>
<span id="L92" class="LineNr"> 92 </span><span class="Constant">$print-int32-decimal:write-loop</span>:
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># pop into EAX</span>
<span id="L94" class="LineNr"> 94 </span> 58/pop-to-EAX
<span id="L95" class="LineNr"> 95 </span> <span class="subxComment"># if (EAX == sentinel) break</span>
<span id="L96" class="LineNr"> 96 </span> 3d/compare-EAX-and 0/imm32/sentinel
<span id="L97" class="LineNr"> 97 </span> 74/jump-if-equal $print-int32-decimal:write-break/disp8
<span id="L98" class="LineNr"> 98 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L99" class="LineNr"> 99 </span> 39/compare 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ECX with EBX</span>
<span id="L100" class="LineNr">100 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:abort/disp8
<span id="L101" class="LineNr">101 </span><span class="Constant">$print-int32-decimal:write-char</span>:
<span id="L102" class="LineNr">102 </span> <span class="subxComment"># *curr = AL</span>
<span id="L103" class="LineNr">103 </span> 88/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 AL to byte at *ECX</span>
<span id="L104" class="LineNr">104 </span> <span class="subxComment"># ++curr</span>
<span id="L105" class="LineNr">105 </span> 41/increment-ECX
<span id="L106" class="LineNr">106 </span> <span class="subxComment"># ++w</span>
<span id="L107" class="LineNr">107 </span> 42/increment-EDX
<span id="L108" class="LineNr">108 </span> eb/jump $print-int32-decimal:write-loop/disp8
<span id="L109" class="LineNr">109 </span><span class="Constant">$print-int32-decimal:write-break</span>:
<span id="L110" class="LineNr">110 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L111" class="LineNr">111 </span> 89/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 EDX to *EDI</span>
<span id="L112" class="LineNr">112 </span><span class="Constant">$print-int32-decimal:end</span>:
<span id="L113" class="LineNr">113 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L114" class="LineNr">114 </span> 5f/pop-to-EDI
<span id="L115" class="LineNr">115 </span> 5b/pop-to-EBX
<span id="L116" class="LineNr">116 </span> 5a/pop-to-EDX
<span id="L117" class="LineNr">117 </span> 59/pop-to-ECX
<span id="L118" class="LineNr">118 </span> 58/pop-to-EAX
<span id="L119" class="LineNr">119 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L120" class="LineNr">120 </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="L121" class="LineNr">121 </span> 5d/pop-to-EBP
<span id="L122" class="LineNr">122 </span> c3/return
<span id="L123" class="LineNr">123 </span>
<span id="L124" class="LineNr">124 </span><span class="Constant">$print-int32-decimal:abort</span>:
<span id="L125" class="LineNr">125 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L126" class="LineNr">126 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L127" class="LineNr">127 </span> 68/push <span class="Constant">&quot;print-int32-decimal: out of space\n&quot;</span>/imm32
<span id="L128" class="LineNr">128 </span> 68/push 2/imm32/stderr
<span id="L129" class="LineNr">129 </span> <span class="subxS2Comment"># . . call</span>
<span id="L130" class="LineNr">130 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L132" class="LineNr">132 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L133" class="LineNr">133 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L134" class="LineNr">134 </span> bb/copy-to-EBX 1/imm32
<span id="L135" class="LineNr">135 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L136" class="LineNr">136 </span> cd/syscall 0x80/imm8
<span id="L137" class="LineNr">137 </span> <span class="subxComment"># never gets here</span>
<span id="L138" class="LineNr">138 </span>
<span id="L139" class="LineNr">139 </span><span class="subxTest">test-print-int32-decimal</span>:
<span id="L140" class="LineNr">140 </span> <span class="subxH1Comment"># - check that a single-digit number converts correctly</span>
<span id="L141" class="LineNr">141 </span> <span class="subxComment"># setup</span>
<span id="L142" class="LineNr">142 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L143" class="LineNr">143 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L8" class="LineNr"> 8 </span><span class="subxFunction">print-int32-decimal</span>: <span class="subxComment"># out : (address stream), n : int32</span>
<span id="L9" class="LineNr"> 9 </span> <span class="subxComment"># works by generating characters from lowest to highest and pushing them</span>
<span id="L10" class="LineNr"> 10 </span> <span class="subxComment"># to the stack, before popping them one by one into the stream</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxComment">#</span>
<span id="L12" class="LineNr"> 12 </span> <span class="subxComment"># pseudocode:</span>
<span id="L13" class="LineNr"> 13 </span> <span class="subxComment"># push sentinel</span>
<span id="L14" class="LineNr"> 14 </span> <span class="subxComment"># EAX = abs(n)</span>
<span id="L15" class="LineNr"> 15 </span> <span class="subxComment"># while true</span>
<span id="L16" class="LineNr"> 16 </span> <span class="subxComment"># sign-extend EAX into EDX</span>
<span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># EAX, EDX = EAX/10, EAX%10</span>
<span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># EDX += '0'</span>
<span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># push EDX</span>
<span id="L20" class="LineNr"> 20 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># if n &lt; 0</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># push '-'</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># w = out-&gt;write</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># curr = &amp;out-&gt;data[out-&gt;write]</span>
<span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># max = &amp;out-&gt;data[out-&gt;length]</span>
<span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># while true</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># pop into EAX</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment"># if (EAX == sentinel) break</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># *curr = AL</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># ++curr</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># ++w</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># (based on K&amp;R itoa: <a href="https://en.wikibooks.org/wiki/C_Programming/stdlib.h/itoa)">https://en.wikibooks.org/wiki/C_Programming/stdlib.h/itoa)</a></span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># (this pseudocode contains registers because operations like division</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># require specific registers in x86)</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment">#</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L39" class="LineNr"> 39 </span> 55/push-EBP
<span id="L40" class="LineNr"> 40 </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="L41" class="LineNr"> 41 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L42" class="LineNr"> 42 </span> 50/push-EAX
<span id="L43" class="LineNr"> 43 </span> 51/push-ECX
<span id="L44" class="LineNr"> 44 </span> 52/push-EDX
<span id="L45" class="LineNr"> 45 </span> 53/push-EBX
<span id="L46" class="LineNr"> 46 </span> 57/push-EDI
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment"># ten/ECX = 10</span>
<span id="L48" class="LineNr"> 48 </span> b9/copy-to-ECX 0xa/imm32
<span id="L49" class="LineNr"> 49 </span> <span class="subxComment"># push sentinel</span>
<span id="L50" class="LineNr"> 50 </span> 68/push 0/imm32/sentinel
<span id="L51" class="LineNr"> 51 </span> <span class="subxComment"># EAX = abs(n)</span>
<span id="L52" class="LineNr"> 52 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EAX</span>
<span id="L53" class="LineNr"> 53 </span> 3d/compare-EAX-with 0/imm32
<span id="L54" class="LineNr"> 54 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:read-loop/disp8
<span id="L55" class="LineNr"> 55 </span><span class="Constant">$print-int32-decimal:negative</span>:
<span id="L56" class="LineNr"> 56 </span> f7 3/subop/negate 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># negate EAX</span>
<span id="L57" class="LineNr"> 57 </span><span class="Constant">$print-int32-decimal:read-loop</span>:
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># EAX, EDX = EAX / 10, EAX % 10</span>
<span id="L59" class="LineNr"> 59 </span> 99/sign-extend-EAX-into-EDX
<span id="L60" class="LineNr"> 60 </span> f7 7/subop/idiv 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> <span class="Normal"> . </span> <span class="subxComment"># divide EDX:EAX by ECX, storing quotient in EAX and remainder in EDX</span>
<span id="L61" class="LineNr"> 61 </span> <span class="subxComment"># EDX += '0'</span>
<span id="L62" class="LineNr"> 62 </span> 81 0/subop/add 3/mod/direct 2/rm32/EDX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0x30/imm32 <span class="subxComment"># add to EDX</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxComment"># push EDX</span>
<span id="L64" class="LineNr"> 64 </span> 52/push-EDX
<span id="L65" class="LineNr"> 65 </span> <span class="subxComment"># if (EAX == 0) break</span>
<span id="L66" class="LineNr"> 66 </span> 3d/compare-EAX-and 0/imm32
<span id="L67" class="LineNr"> 67 </span> 7f/jump-if-greater $print-int32-decimal:read-loop/disp8
<span id="L68" class="LineNr"> 68 </span><span class="Constant">$print-int32-decimal:read-break</span>:
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># if (n &lt; 0) push('-')</span>
<span id="L70" class="LineNr"> 70 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 0/imm32 <span class="subxComment"># compare *(EBP+12)</span>
<span id="L71" class="LineNr"> 71 </span> 7d/jump-if-greater-or-equal $print-int32-decimal:<a href='057write.subx.html#L24'>write</a>/disp8
<span id="L72" class="LineNr"> 72 </span><span class="Constant">$print-int32-decimal:push-negative</span>:
<span id="L73" class="LineNr"> 73 </span> 68/push 0x2d/imm32/-
<span id="L74" class="LineNr"> 74 </span><span class="Constant">$print-int32-decimal:<a href='057write.subx.html#L24'>write</a></span>:
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># EDI = out</span>
<span id="L76" class="LineNr"> 76 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EDI</span>
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># w/EDX = out-&gt;write</span>
<span id="L78" class="LineNr"> 78 </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="L79" class="LineNr"> 79 </span> <span class="subxComment"># curr/ECX = &amp;out-&gt;data[out-&gt;write]</span>
<span id="L80" class="LineNr"> 80 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 2/index/EDX <span class="Normal"> . </span> 1/r32/ECX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EBX+EDX+12 to ECX</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxComment"># max/EBX = &amp;out-&gt;data[out-&gt;length]</span>
<span id="L82" class="LineNr"> 82 </span> 8b/copy 1/mod/*+disp8 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EDI+8) to EBX</span>
<span id="L83" class="LineNr"> 83 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 3/index/EBX <span class="Normal"> . </span> 3/r32/EBX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EDI+EBX+12 to EBX</span>
<span id="L84" class="LineNr"> 84 </span><span class="Constant">$print-int32-decimal:write-loop</span>:
<span id="L85" class="LineNr"> 85 </span> <span class="subxComment"># pop into EAX</span>
<span id="L86" class="LineNr"> 86 </span> 58/pop-to-EAX
<span id="L87" class="LineNr"> 87 </span> <span class="subxComment"># if (EAX == sentinel) break</span>
<span id="L88" class="LineNr"> 88 </span> 3d/compare-EAX-and 0/imm32/sentinel
<span id="L89" class="LineNr"> 89 </span> 74/jump-if-equal $print-int32-decimal:write-break/disp8
<span id="L90" class="LineNr"> 90 </span> <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L91" class="LineNr"> 91 </span> 39/compare 3/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ECX with EBX</span>
<span id="L92" class="LineNr"> 92 </span> 73/jump-if-greater-or-equal-unsigned $print-int32-decimal:abort/disp8
<span id="L93" class="LineNr"> 93 </span><span class="Constant">$print-int32-decimal:write-char</span>:
<span id="L94" class="LineNr"> 94 </span> <span class="subxComment"># *curr = AL</span>
<span id="L95" class="LineNr"> 95 </span> 88/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 AL to byte at *ECX</span>
<span id="L96" class="LineNr"> 96 </span> <span class="subxComment"># ++curr</span>
<span id="L97" class="LineNr"> 97 </span> 41/increment-ECX
<span id="L98" class="LineNr"> 98 </span> <span class="subxComment"># ++w</span>
<span id="L99" class="LineNr"> 99 </span> 42/increment-EDX
<span id="L100" class="LineNr">100 </span> eb/jump $print-int32-decimal:write-loop/disp8
<span id="L101" class="LineNr">101 </span><span class="Constant">$print-int32-decimal:write-break</span>:
<span id="L102" class="LineNr">102 </span> <span class="subxComment"># out-&gt;write = w</span>
<span id="L103" class="LineNr">103 </span> 89/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 EDX to *EDI</span>
<span id="L104" class="LineNr">104 </span><span class="Constant">$print-int32-decimal:end</span>:
<span id="L105" class="LineNr">105 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L106" class="LineNr">106 </span> 5f/pop-to-EDI
<span id="L107" class="LineNr">107 </span> 5b/pop-to-EBX
<span id="L108" class="LineNr">108 </span> 5a/pop-to-EDX
<span id="L109" class="LineNr">109 </span> 59/pop-to-ECX
<span id="L110" class="LineNr">110 </span> 58/pop-to-EAX
<span id="L111" class="LineNr">111 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L112" class="LineNr">112 </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="L113" class="LineNr">113 </span> 5d/pop-to-EBP
<span id="L114" class="LineNr">114 </span> c3/return
<span id="L115" class="LineNr">115 </span>
<span id="L116" class="LineNr">116 </span><span class="Constant">$print-int32-decimal:abort</span>:
<span id="L117" class="LineNr">117 </span> <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L119" class="LineNr">119 </span> 68/push <span class="Constant">&quot;print-int32-decimal: out of space\n&quot;</span>/imm32
<span id="L120" class="LineNr">120 </span> 68/push 2/imm32/stderr
<span id="L121" class="LineNr">121 </span> <span class="subxS2Comment"># . . call</span>
<span id="L122" class="LineNr">122 </span> e8/call <a href='050_write.subx.html#L14'>_write</a>/disp32
<span id="L123" class="LineNr">123 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L124" class="LineNr">124 </span> 81 0/subop/add 3/mod/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="L125" class="LineNr">125 </span> <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L126" class="LineNr">126 </span> bb/copy-to-EBX 1/imm32
<span id="L127" class="LineNr">127 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L128" class="LineNr">128 </span> cd/syscall 0x80/imm8
<span id="L129" class="LineNr">129 </span> <span class="subxComment"># never gets here</span>
<span id="L130" class="LineNr">130 </span>
<span id="L131" class="LineNr">131 </span><span class="subxTest">test-print-int32-decimal</span>:
<span id="L132" class="LineNr">132 </span> <span class="subxH1Comment"># - check that a single-digit number converts correctly</span>
<span id="L133" class="LineNr">133 </span> <span class="subxComment"># setup</span>
<span id="L134" class="LineNr">134 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L136" class="LineNr">136 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . call</span>
<span id="L138" class="LineNr">138 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L139" class="LineNr">139 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L140" class="LineNr">140 </span> 81 0/subop/add 3/mod/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="L141" class="LineNr">141 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 9)</span>
<span id="L142" class="LineNr">142 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L143" class="LineNr">143 </span> 68/push 9/imm32
<span id="L144" class="LineNr">144 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L145" class="LineNr">145 </span> <span class="subxS2Comment"># . . call</span>
<span id="L146" class="LineNr">146 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L146" class="LineNr">146 </span> e8/call <a href='074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
<span id="L147" class="LineNr">147 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L148" class="LineNr">148 </span> 81 0/subop/add 3/mod/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="L149" class="LineNr">149 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 9)</span>
<span id="L148" class="LineNr">148 </span> 81 0/subop/add 3/mod/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="L149" class="LineNr">149 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;9&quot;, msg)</span>
<span id="L150" class="LineNr">150 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L151" class="LineNr">151 </span> 68/push 9/imm32
<span id="L152" class="LineNr">152 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L153" class="LineNr">153 </span> <span class="subxS2Comment"># . . call</span>
<span id="L154" class="LineNr">154 </span> e8/call <a href='074print-int-decimal.subx.html#L16'>print-int32-decimal</a>/disp32
<span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L156" class="LineNr">156 </span> 81 0/subop/add 3/mod/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="L157" class="LineNr">157 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;9&quot;, msg)</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L159" class="LineNr">159 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal&quot;</span>/imm32
<span id="L160" class="LineNr">160 </span> 68/push <span class="Constant">&quot;9&quot;</span>/imm32
<span id="L161" class="LineNr">161 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . call</span>
<span id="L163" class="LineNr">163 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L165" class="LineNr">165 </span> 81 0/subop/add 3/mod/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="L166" class="LineNr">166 </span> <span class="subxS1Comment"># . end</span>
<span id="L167" class="LineNr">167 </span> c3/return
<span id="L168" class="LineNr">168 </span>
<span id="L169" class="LineNr">169 </span><span class="subxTest">test-print-int32-decimal-zero</span>:
<span id="L170" class="LineNr">170 </span> <span class="subxH1Comment"># - check that 0 converts correctly</span>
<span id="L171" class="LineNr">171 </span> <span class="subxComment"># setup</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L173" class="LineNr">173 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L151" class="LineNr">151 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal&quot;</span>/imm32
<span id="L152" class="LineNr">152 </span> 68/push <span class="Constant">&quot;9&quot;</span>/imm32
<span id="L153" class="LineNr">153 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L154" class="LineNr">154 </span> <span class="subxS2Comment"># . . call</span>
<span id="L155" class="LineNr">155 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L156" class="LineNr">156 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L157" class="LineNr">157 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L158" class="LineNr">158 </span> <span class="subxS1Comment"># . end</span>
<span id="L159" class="LineNr">159 </span> c3/return
<span id="L160" class="LineNr">160 </span>
<span id="L161" class="LineNr">161 </span><span class="subxTest">test-print-int32-decimal-zero</span>:
<span id="L162" class="LineNr">162 </span> <span class="subxH1Comment"># - check that 0 converts correctly</span>
<span id="L163" class="LineNr">163 </span> <span class="subxComment"># setup</span>
<span id="L164" class="LineNr">164 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L165" class="LineNr">165 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L166" class="LineNr">166 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L167" class="LineNr">167 </span> <span class="subxS2Comment"># . . call</span>
<span id="L168" class="LineNr">168 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L169" class="LineNr">169 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L170" class="LineNr">170 </span> 81 0/subop/add 3/mod/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="L171" class="LineNr">171 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 0)</span>
<span id="L172" class="LineNr">172 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L173" class="LineNr">173 </span> 68/push 0/imm32
<span id="L174" class="LineNr">174 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L175" class="LineNr">175 </span> <span class="subxS2Comment"># . . call</span>
<span id="L176" class="LineNr">176 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L176" class="LineNr">176 </span> e8/call <a href='074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
<span id="L177" class="LineNr">177 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L178" class="LineNr">178 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L179" class="LineNr">179 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 0)</span>
<span id="L178" class="LineNr">178 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L179" class="LineNr">179 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0&quot;, msg)</span>
<span id="L180" class="LineNr">180 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L181" class="LineNr">181 </span> 68/push 0/imm32
<span id="L182" class="LineNr">182 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L183" class="LineNr">183 </span> <span class="subxS2Comment"># . . call</span>
<span id="L184" class="LineNr">184 </span> e8/call <a href='074print-int-decimal.subx.html#L16'>print-int32-decimal</a>/disp32
<span id="L185" class="LineNr">185 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L186" class="LineNr">186 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L187" class="LineNr">187 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;0&quot;, msg)</span>
<span id="L188" class="LineNr">188 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L189" class="LineNr">189 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-zero&quot;</span>/imm32
<span id="L190" class="LineNr">190 </span> 68/push <span class="Constant">&quot;0&quot;</span>/imm32
<span id="L191" class="LineNr">191 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L192" class="LineNr">192 </span> <span class="subxS2Comment"># . . call</span>
<span id="L193" class="LineNr">193 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L194" class="LineNr">194 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L195" class="LineNr">195 </span> 81 0/subop/add 3/mod/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="L196" class="LineNr">196 </span> <span class="subxS1Comment"># . end</span>
<span id="L197" class="LineNr">197 </span> c3/return
<span id="L198" class="LineNr">198 </span>
<span id="L199" class="LineNr">199 </span><span class="subxTest">test-print-int32-decimal-multiple-digits</span>:
<span id="L200" class="LineNr">200 </span> <span class="subxH1Comment"># - check that a multi-digit number converts correctly</span>
<span id="L201" class="LineNr">201 </span> <span class="subxComment"># setup</span>
<span id="L202" class="LineNr">202 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L203" class="LineNr">203 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L181" class="LineNr">181 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-zero&quot;</span>/imm32
<span id="L182" class="LineNr">182 </span> 68/push <span class="Constant">&quot;0&quot;</span>/imm32
<span id="L183" class="LineNr">183 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L184" class="LineNr">184 </span> <span class="subxS2Comment"># . . call</span>
<span id="L185" class="LineNr">185 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L186" class="LineNr">186 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L187" class="LineNr">187 </span> 81 0/subop/add 3/mod/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="L188" class="LineNr">188 </span> <span class="subxS1Comment"># . end</span>
<span id="L189" class="LineNr">189 </span> c3/return
<span id="L190" class="LineNr">190 </span>
<span id="L191" class="LineNr">191 </span><span class="subxTest">test-print-int32-decimal-multiple-digits</span>:
<span id="L192" class="LineNr">192 </span> <span class="subxH1Comment"># - check that a multi-digit number converts correctly</span>
<span id="L193" class="LineNr">193 </span> <span class="subxComment"># setup</span>
<span id="L194" class="LineNr">194 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L196" class="LineNr">196 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L197" class="LineNr">197 </span> <span class="subxS2Comment"># . . call</span>
<span id="L198" class="LineNr">198 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L200" class="LineNr">200 </span> 81 0/subop/add 3/mod/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="L201" class="LineNr">201 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 10)</span>
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L203" class="LineNr">203 </span> 68/push 0xa/imm32
<span id="L204" class="LineNr">204 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L205" class="LineNr">205 </span> <span class="subxS2Comment"># . . call</span>
<span id="L206" class="LineNr">206 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L206" class="LineNr">206 </span> e8/call <a href='074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
<span id="L207" class="LineNr">207 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L208" class="LineNr">208 </span> 81 0/subop/add 3/mod/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="L209" class="LineNr">209 </span> <span class="subxComment"># print-int32-decimal(_test-stream, 10)</span>
<span id="L208" class="LineNr">208 </span> 81 0/subop/add 3/mod/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="L209" class="LineNr">209 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;10&quot;, msg)</span>
<span id="L210" class="LineNr">210 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </span> 68/push 0xa/imm32
<span id="L212" class="LineNr">212 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L213" class="LineNr">213 </span> <span class="subxS2Comment"># . . call</span>
<span id="L214" class="LineNr">214 </span> e8/call <a href='074print-int-decimal.subx.html#L16'>print-int32-decimal</a>/disp32
<span id="L215" class="LineNr">215 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L216" class="LineNr">216 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L217" class="LineNr">217 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;10&quot;, msg)</span>
<span id="L218" class="LineNr">218 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L219" class="LineNr">219 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-multiple-digits&quot;</span>/imm32
<span id="L220" class="LineNr">220 </span> 68/push <span class="Constant">&quot;10&quot;</span>/imm32
<span id="L221" class="LineNr">221 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L222" class="LineNr">222 </span> <span class="subxS2Comment"># . . call</span>
<span id="L223" class="LineNr">223 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L224" class="LineNr">224 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L225" class="LineNr">225 </span> 81 0/subop/add 3/mod/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="L226" class="LineNr">226 </span> <span class="subxS1Comment"># . end</span>
<span id="L227" class="LineNr">227 </span> c3/return
<span id="L228" class="LineNr">228 </span>
<span id="L229" class="LineNr">229 </span><span class="subxTest">test-print-int32-decimal-negative</span>:
<span id="L230" class="LineNr">230 </span> <span class="subxH1Comment"># - check that a negative single-digit number converts correctly</span>
<span id="L231" class="LineNr">231 </span> <span class="subxComment"># setup</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L233" class="LineNr">233 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L211" class="LineNr">211 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-multiple-digits&quot;</span>/imm32
<span id="L212" class="LineNr">212 </span> 68/push <span class="Constant">&quot;10&quot;</span>/imm32
<span id="L213" class="LineNr">213 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L214" class="LineNr">214 </span> <span class="subxS2Comment"># . . call</span>
<span id="L215" class="LineNr">215 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L216" class="LineNr">216 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L217" class="LineNr">217 </span> 81 0/subop/add 3/mod/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="L218" class="LineNr">218 </span> <span class="subxS1Comment"># . end</span>
<span id="L219" class="LineNr">219 </span> c3/return
<span id="L220" class="LineNr">220 </span>
<span id="L221" class="LineNr">221 </span><span class="subxTest">test-print-int32-decimal-negative</span>:
<span id="L222" class="LineNr">222 </span> <span class="subxH1Comment"># - check that a negative single-digit number converts correctly</span>
<span id="L223" class="LineNr">223 </span> <span class="subxComment"># setup</span>
<span id="L224" class="LineNr">224 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L225" class="LineNr">225 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L226" class="LineNr">226 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L227" class="LineNr">227 </span> <span class="subxS2Comment"># . . call</span>
<span id="L228" class="LineNr">228 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</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> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L231" class="LineNr">231 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -9)</span>
<span id="L232" class="LineNr">232 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L233" class="LineNr">233 </span> 68/push -9/imm32
<span id="L234" class="LineNr">234 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L235" class="LineNr">235 </span> <span class="subxS2Comment"># . . call</span>
<span id="L236" class="LineNr">236 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L236" class="LineNr">236 </span> e8/call <a href='074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
<span id="L237" class="LineNr">237 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L238" class="LineNr">238 </span> 81 0/subop/add 3/mod/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="L239" class="LineNr">239 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -9)</span>
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L241" class="LineNr">241 </span> 68/push -9/imm32
<span id="L242" class="LineNr">242 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L243" class="LineNr">243 </span> <span class="subxS2Comment"># . . call</span>
<span id="L244" class="LineNr">244 </span> e8/call <a href='074print-int-decimal.subx.html#L16'>print-int32-decimal</a>/disp32
<span id="L245" class="LineNr">245 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L246" class="LineNr">246 </span> 81 0/subop/add 3/mod/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="L247" class="Folded">247 </span><span class="Folded">+-- 26 lines: #? # dump _test-stream ---------------------------------------------------------------------------------------------------------------------</span>
<span id="L273" class="LineNr">273 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;-9&quot;, msg)</span>
<span id="L274" class="LineNr">274 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L275" class="LineNr">275 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-negative&quot;</span>/imm32
<span id="L276" class="LineNr">276 </span> 68/push <span class="Constant">&quot;-9&quot;</span>/imm32
<span id="L277" class="LineNr">277 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L278" class="LineNr">278 </span> <span class="subxS2Comment"># . . call</span>
<span id="L279" class="LineNr">279 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-equal</a>/disp32
<span id="L280" class="LineNr">280 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L281" class="LineNr">281 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L282" class="LineNr">282 </span> <span class="subxS1Comment"># . end</span>
<span id="L283" class="LineNr">283 </span> c3/return
<span id="L284" class="LineNr">284 </span>
<span id="L285" class="LineNr">285 </span><span class="subxTest">test-print-int32-decimal-negative-multiple-digits</span>:
<span id="L286" class="LineNr">286 </span> <span class="subxH1Comment"># - check that a multi-digit number converts correctly</span>
<span id="L287" class="LineNr">287 </span> <span class="subxComment"># setup</span>
<span id="L288" class="LineNr">288 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L289" class="LineNr">289 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L238" class="LineNr">238 </span> 81 0/subop/add 3/mod/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="L239" class="Folded">239 </span><span class="Folded">+-- 26 lines: #? # dump _test-stream ---------------------------------------------------------------------------------------------------------------------</span>
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;-9&quot;, msg)</span>
<span id="L266" class="LineNr">266 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L267" class="LineNr">267 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-negative&quot;</span>/imm32
<span id="L268" class="LineNr">268 </span> 68/push <span class="Constant">&quot;-9&quot;</span>/imm32
<span id="L269" class="LineNr">269 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L270" class="LineNr">270 </span> <span class="subxS2Comment"># . . call</span>
<span id="L271" class="LineNr">271 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L272" class="LineNr">272 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L273" class="LineNr">273 </span> 81 0/subop/add 3/mod/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="L274" class="LineNr">274 </span> <span class="subxS1Comment"># . end</span>
<span id="L275" class="LineNr">275 </span> c3/return
<span id="L276" class="LineNr">276 </span>
<span id="L277" class="LineNr">277 </span><span class="subxTest">test-print-int32-decimal-negative-multiple-digits</span>:
<span id="L278" class="LineNr">278 </span> <span class="subxH1Comment"># - check that a multi-digit number converts correctly</span>
<span id="L279" class="LineNr">279 </span> <span class="subxComment"># setup</span>
<span id="L280" class="LineNr">280 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L281" class="LineNr">281 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L282" class="LineNr">282 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L283" class="LineNr">283 </span> <span class="subxS2Comment"># . . call</span>
<span id="L284" class="LineNr">284 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L285" class="LineNr">285 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L286" class="LineNr">286 </span> 81 0/subop/add 3/mod/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="L287" class="LineNr">287 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -10)</span>
<span id="L288" class="LineNr">288 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L289" class="LineNr">289 </span> 68/push -0xa/imm32
<span id="L290" class="LineNr">290 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L291" class="LineNr">291 </span> <span class="subxS2Comment"># . . call</span>
<span id="L292" class="LineNr">292 </span> e8/call <a href='055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L292" class="LineNr">292 </span> e8/call <a href='074print-int-decimal.subx.html#L8'>print-int32-decimal</a>/disp32
<span id="L293" class="LineNr">293 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L294" class="LineNr">294 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/imm32 <span class="subxComment"># add to ESP</span>
<span id="L295" class="LineNr">295 </span> <span class="subxComment"># print-int32-decimal(_test-stream, -10)</span>
<span id="L294" class="LineNr">294 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L295" class="LineNr">295 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;-10&quot;, msg)</span>
<span id="L296" class="LineNr">296 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L297" class="LineNr">297 </span> 68/push -0xa/imm32
<span id="L298" class="LineNr">298 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L299" class="LineNr">299 </span> <span class="subxS2Comment"># . . call</span>
<span id="L300" class="LineNr">300 </span> e8/call <a href='074print-int-decimal.subx.html#L16'>print-int32-decimal</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-stream-equal(_test-stream, &quot;-10&quot;, 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-print-int32-decimal-negative-multiple-digits&quot;</span>/imm32
<span id="L306" class="LineNr">306 </span> 68/push <span class="Constant">&quot;-10&quot;</span>/imm32
<span id="L307" class="LineNr">307 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L308" class="LineNr">308 </span> <span class="subxS2Comment"># . . call</span>
<span id="L309" class="LineNr">309 </span> e8/call <a href='058stream-equal.subx.html#L200'>check-stream-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"># . end</span>
<span id="L313" class="LineNr">313 </span> c3/return
<span id="L314" class="LineNr">314 </span>
<span id="L315" class="LineNr">315 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L297" class="LineNr">297 </span> 68/push <span class="Constant">&quot;F - test-print-int32-decimal-negative-multiple-digits&quot;</span>/imm32
<span id="L298" class="LineNr">298 </span> 68/push <span class="Constant">&quot;-10&quot;</span>/imm32
<span id="L299" class="LineNr">299 </span> 68/push <a href='057write.subx.html#L148'>_test-stream</a>/imm32
<span id="L300" class="LineNr">300 </span> <span class="subxS2Comment"># . . call</span>
<span id="L301" class="LineNr">301 </span> e8/call <a href='058stream-equal.subx.html#L193'>check-stream-equal</a>/disp32
<span id="L302" class="LineNr">302 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L303" class="LineNr">303 </span> 81 0/subop/add 3/mod/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="L304" class="LineNr">304 </span> <span class="subxS1Comment"># . end</span>
<span id="L305" class="LineNr">305 </span> c3/return
<span id="L306" class="LineNr">306 </span>
<span id="L307" class="LineNr">307 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -0,0 +1,694 @@
<!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 - subx/075array-equal.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; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</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/subx/075array-equal.subx'>https://github.com/akkartik/mu/blob/master/subx/075array-equal.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Comparing arrays of numbers.</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span>== code
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># instruction effective address register displacement immediate</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="SpecialChar">Entry</span>:
<span id="L9" class="LineNr"> 9 </span> <span class="subxComment"># initialize heap</span>
<span id="L10" class="LineNr"> 10 </span> <span class="subxS1Comment"># . Heap = new-segment(64KB)</span>
<span id="L11" class="LineNr"> 11 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L12" class="LineNr"> 12 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L13" class="LineNr"> 13 </span> 68/push 0x10000/imm32/64KB
<span id="L14" class="LineNr"> 14 </span> <span class="subxS2Comment"># . . call</span>
<span id="L15" class="LineNr"> 15 </span> e8/call <a href='053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L16" class="LineNr"> 16 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L17" class="LineNr"> 17 </span> 81 0/subop/add 3/mod/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="L18" class="LineNr"> 18 </span>
<span id="L19" class="LineNr"> 19 </span> e8/call run-tests/disp32 <span class="subxComment"># 'run-tests' is a function created automatically by SubX. It calls all functions that start with 'test-'.</span>
<span id="L20" class="LineNr"> 20 </span><span class="Constant">$array-equal-main:end</span>:
<span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># syscall(exit, Num-test-failures)</span>
<span id="L22" class="LineNr"> 22 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX <span class="SpecialChar"><a href='051test.subx.html#L90'>Num-test-failures</a></span>/disp32 <span class="subxComment"># copy *Num-test-failures to EBX</span>
<span id="L23" class="LineNr"> 23 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L24" class="LineNr"> 24 </span> cd/syscall 0x80/imm8
<span id="L25" class="LineNr"> 25 </span>
<span id="L26" class="LineNr"> 26 </span><span class="subxFunction">array-equal?</span>: <span class="subxComment"># a : (address array int), b : (address array int) -&gt; EAX : boolean</span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># pseudocode:</span>
<span id="L28" class="LineNr"> 28 </span> <span class="subxComment"># lena = a-&gt;length</span>
<span id="L29" class="LineNr"> 29 </span> <span class="subxComment"># if (lena != b-&gt;length) return false</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxComment"># i = 0</span>
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># curra = a-&gt;data</span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># currb = b-&gt;data</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># while i &lt; lena</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxComment"># i1 = *curra</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># i2 = *currb</span>
<span id="L36" class="LineNr"> 36 </span> <span class="subxComment"># if (c1 != c2) return false</span>
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment"># i+=4, curra+=4, currb+=4</span>
<span id="L38" class="LineNr"> 38 </span> <span class="subxComment"># return true</span>
<span id="L39" class="LineNr"> 39 </span> <span class="subxComment">#</span>
<span id="L40" class="LineNr"> 40 </span> <span class="subxComment"># registers:</span>
<span id="L41" class="LineNr"> 41 </span> <span class="subxComment"># i: ECX</span>
<span id="L42" class="LineNr"> 42 </span> <span class="subxComment"># lena: EDX</span>
<span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># curra: ESI</span>
<span id="L44" class="LineNr"> 44 </span> <span class="subxComment"># currb: EDI</span>
<span id="L45" class="LineNr"> 45 </span> <span class="subxComment"># i1: EAX</span>
<span id="L46" class="LineNr"> 46 </span> <span class="subxComment"># i2: EBX</span>
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment">#</span>
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L49" class="LineNr"> 49 </span> 55/push-EBP
<span id="L50" class="LineNr"> 50 </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="L51" class="LineNr"> 51 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L52" class="LineNr"> 52 </span> 51/push-ECX
<span id="L53" class="LineNr"> 53 </span> 52/push-EDX
<span id="L54" class="LineNr"> 54 </span> 53/push-EBX
<span id="L55" class="LineNr"> 55 </span> 56/push-ESI
<span id="L56" class="LineNr"> 56 </span> 57/push-EDI
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># ESI = a</span>
<span id="L58" class="LineNr"> 58 </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="L59" class="LineNr"> 59 </span> <span class="subxComment"># EDI = b</span>
<span id="L60" class="LineNr"> 60 </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="L61" class="LineNr"> 61 </span> <span class="subxComment"># lena/EDX = a-&gt;length</span>
<span id="L62" class="LineNr"> 62 </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="L63" class="LineNr"> 63 </span><span class="Constant">$array-equal?:lengths</span>:
<span id="L64" class="LineNr"> 64 </span> <span class="subxComment"># if (lena != b-&gt;length) return false</span>
<span id="L65" class="LineNr"> 65 </span> 39/compare 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"># compare *EDI and EDX</span>
<span id="L66" class="LineNr"> 66 </span> 75/jump-if-not-equal $array-equal?:false/disp8
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># curra/ESI = a-&gt;data</span>
<span id="L68" class="LineNr"> 68 </span> 81 0/subop/add 3/mod/direct 6/rm32/ESI <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 ESI</span>
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># currb/EDI = b-&gt;data</span>
<span id="L70" class="LineNr"> 70 </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="L71" class="LineNr"> 71 </span> <span class="subxComment"># i/ECX = i1/EAX = i2/EBX = 0</span>
<span id="L72" class="LineNr"> 72 </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="L73" class="LineNr"> 73 </span><span class="Constant">$array-equal?:loop</span>:
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># if (i &gt;= lena) return true</span>
<span id="L75" class="LineNr"> 75 </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="L76" class="LineNr"> 76 </span> 7d/jump-if-greater-or-equal $array-equal?:true/disp8
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># i1 = *curra</span>
<span id="L78" class="LineNr"> 78 </span> 8b/copy 0/mod/indirect 6/rm32/ESI <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 *ESI to EAX</span>
<span id="L79" class="LineNr"> 79 </span> <span class="subxComment"># i2 = *currb</span>
<span id="L80" class="LineNr"> 80 </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="L81" class="LineNr"> 81 </span> <span class="subxComment"># if (i1 != i2) return false</span>
<span id="L82" class="LineNr"> 82 </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="L83" class="LineNr"> 83 </span> 75/jump-if-not-equal $array-equal?:false/disp8
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># i += 4</span>
<span id="L85" class="LineNr"> 85 </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="L86" class="LineNr"> 86 </span> <span class="subxComment"># currs += 4</span>
<span id="L87" class="LineNr"> 87 </span> 81 0/subop/add 3/mod/direct 6/rm32/ESI <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 ESI</span>
<span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># currb += 4</span>
<span id="L89" class="LineNr"> 89 </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="L90" class="LineNr"> 90 </span> eb/jump $array-equal?:loop/disp8
<span id="L91" class="LineNr"> 91 </span><span class="Constant">$array-equal?:true</span>:
<span id="L92" class="LineNr"> 92 </span> b8/copy-to-EAX 1/imm32
<span id="L93" class="LineNr"> 93 </span> eb/jump $array-equal?:end/disp8
<span id="L94" class="LineNr"> 94 </span><span class="Constant">$array-equal?:false</span>:
<span id="L95" class="LineNr"> 95 </span> b8/copy-to-EAX 0/imm32
<span id="L96" class="LineNr"> 96 </span><span class="Constant">$array-equal?:end</span>:
<span id="L97" class="LineNr"> 97 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L98" class="LineNr"> 98 </span> 5f/pop-to-EDI
<span id="L99" class="LineNr"> 99 </span> 5e/pop-to-ESI
<span id="L100" class="LineNr">100 </span> 5b/pop-to-EBX
<span id="L101" class="LineNr">101 </span> 5a/pop-to-EDX
<span id="L102" class="LineNr">102 </span> 59/pop-to-ECX
<span id="L103" class="LineNr">103 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L104" class="LineNr">104 </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="L105" class="LineNr">105 </span> 5d/pop-to-EBP
<span id="L106" class="LineNr">106 </span> c3/return
<span id="L107" class="LineNr">107 </span>
<span id="L108" class="LineNr">108 </span><span class="subxTest">test-compare-empty-with-empty-array</span>:
<span id="L109" class="LineNr">109 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L110" class="LineNr">110 </span> 55/push-EBP
<span id="L111" class="LineNr">111 </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="L112" class="LineNr">112 </span> <span class="subxComment"># var ECX = []</span>
<span id="L113" class="LineNr">113 </span> 68/push 0/imm32/size
<span id="L114" class="LineNr">114 </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="L115" class="LineNr">115 </span> <span class="subxComment"># var EDX = []</span>
<span id="L116" class="LineNr">116 </span> 68/push 0/imm32/size
<span id="L117" class="LineNr">117 </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="L118" class="LineNr">118 </span> <span class="subxComment"># EAX = array-equal?(ECX, EDX)</span>
<span id="L119" class="LineNr">119 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L120" class="LineNr">120 </span> 52/push-EDX
<span id="L121" class="LineNr">121 </span> 51/push-ECX
<span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . call</span>
<span id="L123" class="LineNr">123 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L124" class="LineNr">124 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L125" class="LineNr">125 </span> 81 0/subop/add 3/mod/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="L126" class="LineNr">126 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L127" class="LineNr">127 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L128" class="LineNr">128 </span> 68/push <span class="Constant">&quot;F - test-compare-empty-with-empty-array&quot;</span>/imm32
<span id="L129" class="LineNr">129 </span> 68/push 1/imm32/true
<span id="L130" class="LineNr">130 </span> 50/push-EAX
<span id="L131" class="LineNr">131 </span> <span class="subxS2Comment"># . . call</span>
<span id="L132" class="LineNr">132 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L134" class="LineNr">134 </span> 81 0/subop/add 3/mod/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="L135" class="LineNr">135 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L136" class="LineNr">136 </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="L137" class="LineNr">137 </span> 5d/pop-to-EBP
<span id="L138" class="LineNr">138 </span> c3/return
<span id="L139" class="LineNr">139 </span>
<span id="L140" class="LineNr">140 </span><span class="subxTest">test-compare-empty-with-non-empty-array</span>: <span class="subxComment"># also checks length-mismatch code path</span>
<span id="L141" class="LineNr">141 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L142" class="LineNr">142 </span> 55/push-EBP
<span id="L143" class="LineNr">143 </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="L144" class="LineNr">144 </span> <span class="subxComment"># var ECX = [1]</span>
<span id="L145" class="LineNr">145 </span> 68/push 1/imm32
<span id="L146" class="LineNr">146 </span> 68/push 4/imm32/size
<span id="L147" class="LineNr">147 </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="L148" class="LineNr">148 </span> <span class="subxComment"># var EDX = []</span>
<span id="L149" class="LineNr">149 </span> 68/push 0/imm32/size
<span id="L150" class="LineNr">150 </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="L151" class="LineNr">151 </span> <span class="subxComment"># EAX = array-equal?(ECX, EDX)</span>
<span id="L152" class="LineNr">152 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L153" class="LineNr">153 </span> 52/push-EDX
<span id="L154" class="LineNr">154 </span> 51/push-ECX
<span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . call</span>
<span id="L156" class="LineNr">156 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L158" class="LineNr">158 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L159" class="LineNr">159 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L160" class="LineNr">160 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L161" class="LineNr">161 </span> 68/push <span class="Constant">&quot;F - test-compare-empty-with-non-empty-array&quot;</span>/imm32
<span id="L162" class="LineNr">162 </span> 68/push 0/imm32/false
<span id="L163" class="LineNr">163 </span> 50/push-EAX
<span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . call</span>
<span id="L165" class="LineNr">165 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L167" class="LineNr">167 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L168" class="LineNr">168 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L169" class="LineNr">169 </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="L170" class="LineNr">170 </span> 5d/pop-to-EBP
<span id="L171" class="LineNr">171 </span> c3/return
<span id="L172" class="LineNr">172 </span>
<span id="L173" class="LineNr">173 </span><span class="subxTest">test-compare-equal-arrays</span>:
<span id="L174" class="LineNr">174 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L175" class="LineNr">175 </span> 55/push-EBP
<span id="L176" class="LineNr">176 </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="L177" class="LineNr">177 </span> <span class="subxComment"># var ECX = [1, 2, 3]</span>
<span id="L178" class="LineNr">178 </span> 68/push 3/imm32
<span id="L179" class="LineNr">179 </span> 68/push 2/imm32
<span id="L180" class="LineNr">180 </span> 68/push 1/imm32
<span id="L181" class="LineNr">181 </span> 68/push 0xc/imm32/size
<span id="L182" class="LineNr">182 </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="L183" class="LineNr">183 </span> <span class="subxComment"># var EDX = [1, 2, 3]</span>
<span id="L184" class="LineNr">184 </span> 68/push 3/imm32
<span id="L185" class="LineNr">185 </span> 68/push 2/imm32
<span id="L186" class="LineNr">186 </span> 68/push 1/imm32
<span id="L187" class="LineNr">187 </span> 68/push 0xc/imm32/size
<span id="L188" class="LineNr">188 </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="L189" class="LineNr">189 </span> <span class="subxComment"># EAX = array-equal?(ECX, EDX)</span>
<span id="L190" class="LineNr">190 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L191" class="LineNr">191 </span> 52/push-EDX
<span id="L192" class="LineNr">192 </span> 51/push-ECX
<span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . call</span>
<span id="L194" class="LineNr">194 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L195" class="LineNr">195 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L196" class="LineNr">196 </span> 81 0/subop/add 3/mod/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="L197" class="LineNr">197 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L198" class="LineNr">198 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L199" class="LineNr">199 </span> 68/push <span class="Constant">&quot;F - test-compare-equal-arrays&quot;</span>/imm32
<span id="L200" class="LineNr">200 </span> 68/push 1/imm32/true
<span id="L201" class="LineNr">201 </span> 50/push-EAX
<span id="L202" class="LineNr">202 </span> <span class="subxS2Comment"># . . call</span>
<span id="L203" class="LineNr">203 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L204" class="LineNr">204 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L205" class="LineNr">205 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L206" class="LineNr">206 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L207" class="LineNr">207 </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="L208" class="LineNr">208 </span> 5d/pop-to-EBP
<span id="L209" class="LineNr">209 </span> c3/return
<span id="L210" class="LineNr">210 </span>
<span id="L211" class="LineNr">211 </span><span class="subxTest">test-compare-inequal-arrays-equal-lengths</span>:
<span id="L212" class="LineNr">212 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L213" class="LineNr">213 </span> 55/push-EBP
<span id="L214" class="LineNr">214 </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="L215" class="LineNr">215 </span> <span class="subxComment"># var ECX = [1, 4, 3]</span>
<span id="L216" class="LineNr">216 </span> 68/push 3/imm32
<span id="L217" class="LineNr">217 </span> 68/push 4/imm32
<span id="L218" class="LineNr">218 </span> 68/push 1/imm32
<span id="L219" class="LineNr">219 </span> 68/push 0xc/imm32/size
<span id="L220" class="LineNr">220 </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="L221" class="LineNr">221 </span> <span class="subxComment"># var EDX = [1, 2, 3]</span>
<span id="L222" class="LineNr">222 </span> 68/push 3/imm32
<span id="L223" class="LineNr">223 </span> 68/push 2/imm32
<span id="L224" class="LineNr">224 </span> 68/push 1/imm32
<span id="L225" class="LineNr">225 </span> 68/push 0xc/imm32/size
<span id="L226" class="LineNr">226 </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="L227" class="LineNr">227 </span> <span class="subxComment"># EAX = array-equal?(ECX, EDX)</span>
<span id="L228" class="LineNr">228 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L229" class="LineNr">229 </span> 52/push-EDX
<span id="L230" class="LineNr">230 </span> 51/push-ECX
<span id="L231" class="LineNr">231 </span> <span class="subxS2Comment"># . . call</span>
<span id="L232" class="LineNr">232 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L233" class="LineNr">233 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L234" class="LineNr">234 </span> 81 0/subop/add 3/mod/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="L235" class="LineNr">235 </span> <span class="subxComment"># check-ints-equal(EAX, 0, msg)</span>
<span id="L236" class="LineNr">236 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L237" class="LineNr">237 </span> 68/push <span class="Constant">&quot;F - test-compare-inequal-arrays-equal-lengths&quot;</span>/imm32
<span id="L238" class="LineNr">238 </span> 68/push 0/imm32/false
<span id="L239" class="LineNr">239 </span> 50/push-EAX
<span id="L240" class="LineNr">240 </span> <span class="subxS2Comment"># . . call</span>
<span id="L241" class="LineNr">241 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L242" class="LineNr">242 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L243" class="LineNr">243 </span> 81 0/subop/add 3/mod/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="L244" class="LineNr">244 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L245" class="LineNr">245 </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="L246" class="LineNr">246 </span> 5d/pop-to-EBP
<span id="L247" class="LineNr">247 </span> c3/return
<span id="L248" class="LineNr">248 </span>
<span id="L249" class="LineNr">249 </span><span class="subxFunction">parse-array-of-ints</span>: <span class="subxComment"># ad : (address allocation-descriptor), s : (address string) -&gt; result/EAX : (address array int)</span>
<span id="L250" class="LineNr">250 </span> <span class="subxComment"># pseudocode</span>
<span id="L251" class="LineNr">251 </span> <span class="subxComment"># end = s-&gt;data + s-&gt;length</span>
<span id="L252" class="LineNr">252 </span> <span class="subxComment"># curr = s-&gt;data</span>
<span id="L253" class="LineNr">253 </span> <span class="subxComment"># size = 0</span>
<span id="L254" class="LineNr">254 </span> <span class="subxComment"># while true</span>
<span id="L255" class="LineNr">255 </span> <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L256" class="LineNr">256 </span> <span class="subxComment"># curr = skip-chars-matching-in-slice(curr, end, ' ')</span>
<span id="L257" class="LineNr">257 </span> <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L258" class="LineNr">258 </span> <span class="subxComment"># curr = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L259" class="LineNr">259 </span> <span class="subxComment"># ++size</span>
<span id="L260" class="LineNr">260 </span> <span class="subxComment"># result = allocate(ad, (size+1)*4)</span>
<span id="L261" class="LineNr">261 </span> <span class="subxComment"># result-&gt;size = (size+1)*4</span>
<span id="L262" class="LineNr">262 </span> <span class="subxComment"># var slice = {s-&gt;data, 0}</span>
<span id="L263" class="LineNr">263 </span> <span class="subxComment"># out = result-&gt;data</span>
<span id="L264" class="LineNr">264 </span> <span class="subxComment"># while true</span>
<span id="L265" class="LineNr">265 </span> <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L266" class="LineNr">266 </span> <span class="subxComment"># slice-&gt;start = skip-chars-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L267" class="LineNr">267 </span> <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L268" class="LineNr">268 </span> <span class="subxComment"># slice-&gt;end = skip-chars-not-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L269" class="LineNr">269 </span> <span class="subxComment"># *out = parse-hex-int(slice)</span>
<span id="L270" class="LineNr">270 </span> <span class="subxComment"># out += 4</span>
<span id="L271" class="LineNr">271 </span> <span class="subxComment"># slice-&gt;start = slice-&gt;end</span>
<span id="L272" class="LineNr">272 </span> <span class="subxComment"># return result</span>
<span id="L273" class="LineNr">273 </span> <span class="subxComment">#</span>
<span id="L274" class="LineNr">274 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L275" class="LineNr">275 </span> 55/push-EBP
<span id="L276" class="LineNr">276 </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="L277" class="LineNr">277 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L278" class="LineNr">278 </span> 51/push-ECX
<span id="L279" class="LineNr">279 </span> 52/push-EDX
<span id="L280" class="LineNr">280 </span> 53/push-EBX
<span id="L281" class="LineNr">281 </span> 56/push-ESI
<span id="L282" class="LineNr">282 </span> 57/push-EDI
<span id="L283" class="LineNr">283 </span> <span class="subxComment"># ESI = s</span>
<span id="L284" class="LineNr">284 </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="L285" class="LineNr">285 </span> <span class="subxComment"># curr/ECX = s-&gt;data</span>
<span id="L286" class="LineNr">286 </span> 8d/copy-address 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="L287" class="LineNr">287 </span> <span class="subxComment"># end/EDX = s-&gt;data + s-&gt;length</span>
<span id="L288" class="LineNr">288 </span> <span class="subxS1Comment"># . EDX = s-&gt;length</span>
<span id="L289" class="LineNr">289 </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="L290" class="LineNr">290 </span> <span class="subxS1Comment"># . EDX += curr</span>
<span id="L291" class="LineNr">291 </span> 01/add 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"># add ECX to EDX</span>
<span id="L292" class="LineNr">292 </span> <span class="subxComment"># size/EBX = 0</span>
<span id="L293" class="LineNr">293 </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="L294" class="LineNr">294 </span><span class="Constant">$parse-array-of-ints:loop1</span>:
<span id="L295" class="LineNr">295 </span> <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L296" class="LineNr">296 </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="L297" class="LineNr">297 </span> 73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:break1/disp8
<span id="L298" class="LineNr">298 </span> <span class="subxComment"># curr = skip-chars-matching-in-slice(curr, end, ' ')</span>
<span id="L299" class="LineNr">299 </span> <span class="subxS1Comment"># . EAX = skip-chars-matching-in-slice(curr, end, ' ')</span>
<span id="L300" class="LineNr">300 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L301" class="LineNr">301 </span> 68/push 0x20/imm32/space
<span id="L302" class="LineNr">302 </span> 52/push-EDX
<span id="L303" class="LineNr">303 </span> 51/push-ECX
<span id="L304" class="LineNr">304 </span> <span class="subxS2Comment"># . . call</span>
<span id="L305" class="LineNr">305 </span> e8/call <a href='073next-token.subx.html#L677'>skip-chars-matching-in-slice</a>/disp32
<span id="L306" class="LineNr">306 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L307" class="LineNr">307 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L308" class="LineNr">308 </span> <span class="subxS1Comment"># . ECX = EAX</span>
<span id="L309" class="LineNr">309 </span> 89/copy 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"># copy EAX to ECX</span>
<span id="L310" class="LineNr">310 </span> <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L311" class="LineNr">311 </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="L312" class="LineNr">312 </span> 73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:break1/disp8
<span id="L313" class="LineNr">313 </span> <span class="subxComment"># curr = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L314" class="LineNr">314 </span> <span class="subxS1Comment"># . EAX = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L315" class="LineNr">315 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L316" class="LineNr">316 </span> 68/push 0x20/imm32/space
<span id="L317" class="LineNr">317 </span> 52/push-EDX
<span id="L318" class="LineNr">318 </span> 51/push-ECX
<span id="L319" class="LineNr">319 </span> <span class="subxS2Comment"># . . call</span>
<span id="L320" class="LineNr">320 </span> e8/call <a href='073next-token.subx.html#L773'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L321" class="LineNr">321 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L322" class="LineNr">322 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L323" class="LineNr">323 </span> <span class="subxS1Comment"># . ECX = EAX</span>
<span id="L324" class="LineNr">324 </span> 89/copy 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"># copy EAX to ECX</span>
<span id="L325" class="LineNr">325 </span> <span class="subxComment"># size += 4</span>
<span id="L326" class="LineNr">326 </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="L327" class="LineNr">327 </span> eb/jump $parse-array-of-ints:loop1/disp8
<span id="L328" class="LineNr">328 </span><span class="Constant">$parse-array-of-ints:break1</span>:
<span id="L329" class="LineNr">329 </span> <span class="subxComment"># result/EDI = allocate(ad, size+4)</span>
<span id="L330" class="LineNr">330 </span> <span class="subxS1Comment"># . EAX = allocate(ad, size+4)</span>
<span id="L331" class="LineNr">331 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L332" class="LineNr">332 </span> 89/copy 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"># copy EBX to EAX</span>
<span id="L333" class="LineNr">333 </span> 05/add-to-EAX 4/imm32
<span id="L334" class="LineNr">334 </span> 50/push-EAX
<span id="L335" class="LineNr">335 </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="L336" class="LineNr">336 </span> <span class="subxS2Comment"># . . call</span>
<span id="L337" class="LineNr">337 </span> e8/call <a href='069allocate.subx.html#L26'>allocate</a>/disp32
<span id="L338" class="LineNr">338 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L339" class="LineNr">339 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L340" class="LineNr">340 </span> <span class="subxS1Comment"># . EDI = EAX</span>
<span id="L341" class="LineNr">341 </span> 89/copy 3/mod/direct 7/rm32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to EDI</span>
<span id="L342" class="LineNr">342 </span> <span class="subxComment"># result-&gt;size = size</span>
<span id="L343" class="LineNr">343 </span> 89/copy 0/mod/indirect 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"># copy EBX to *EAX</span>
<span id="L344" class="LineNr">344 </span><span class="Constant">$parse-array-of-ints:pass2</span>:
<span id="L345" class="LineNr">345 </span> <span class="subxComment"># var slice/ECX = {s-&gt;data, 0}</span>
<span id="L346" class="LineNr">346 </span> <span class="subxS1Comment"># . push 0</span>
<span id="L347" class="LineNr">347 </span> 68/push 0/imm32/end
<span id="L348" class="LineNr">348 </span> <span class="subxS1Comment"># . push s-&gt;data</span>
<span id="L349" class="LineNr">349 </span> 8d/copy-address 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="L350" class="LineNr">350 </span> 51/push-ECX
<span id="L351" class="LineNr">351 </span> <span class="subxS1Comment"># . bookmark</span>
<span id="L352" class="LineNr">352 </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="L353" class="LineNr">353 </span> <span class="subxComment"># out/EBX = result-&gt;data</span>
<span id="L354" class="LineNr">354 </span> 8d/copy-address 1/mod/*+disp8 0/rm32/EAX <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 EAX+4 to EBX</span>
<span id="L355" class="LineNr">355 </span><span class="Constant">$parse-array-of-ints:loop2</span>:
<span id="L356" class="LineNr">356 </span> <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L357" class="LineNr">357 </span> 39/compare 0/mod/indirect 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="L358" class="LineNr">358 </span> 73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:end/disp8
<span id="L359" class="LineNr">359 </span> <span class="subxComment"># slice-&gt;start = skip-chars-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L360" class="LineNr">360 </span> <span class="subxS1Comment"># . EAX = skip-chars-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L361" class="LineNr">361 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L362" class="LineNr">362 </span> 68/push 0x20/imm32/space
<span id="L363" class="LineNr">363 </span> 52/push-EDX
<span id="L364" class="LineNr">364 </span> ff 6/subop/push 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ECX</span>
<span id="L365" class="LineNr">365 </span> <span class="subxS2Comment"># . . call</span>
<span id="L366" class="LineNr">366 </span> e8/call <a href='073next-token.subx.html#L677'>skip-chars-matching-in-slice</a>/disp32
<span id="L367" class="LineNr">367 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L368" class="LineNr">368 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L369" class="LineNr">369 </span> <span class="subxS1Comment"># . slice-&gt;start = EAX</span>
<span id="L370" class="LineNr">370 </span> 89/copy 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *ECX</span>
<span id="L371" class="LineNr">371 </span> <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L372" class="LineNr">372 </span> 39/compare 0/mod/indirect 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="L373" class="LineNr">373 </span> 73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:end/disp8
<span id="L374" class="LineNr">374 </span> <span class="subxComment"># slice-&gt;end = skip-chars-not-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L375" class="LineNr">375 </span> <span class="subxS1Comment"># . EAX = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L376" class="LineNr">376 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L377" class="LineNr">377 </span> 68/push 0x20/imm32/space
<span id="L378" class="LineNr">378 </span> 52/push-EDX
<span id="L379" class="LineNr">379 </span> 50/push-EAX
<span id="L380" class="LineNr">380 </span> <span class="subxS2Comment"># . . call</span>
<span id="L381" class="LineNr">381 </span> e8/call <a href='073next-token.subx.html#L773'>skip-chars-not-matching-in-slice</a>/disp32
<span id="L382" class="LineNr">382 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L383" class="LineNr">383 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
<span id="L384" class="LineNr">384 </span> <span class="subxS1Comment"># . slice-&gt;end = EAX</span>
<span id="L385" class="LineNr">385 </span> 89/copy 1/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *(ECX+4)</span>
<span id="L386" class="LineNr">386 </span> <span class="subxComment"># *out = parse-hex-int(slice)</span>
<span id="L387" class="LineNr">387 </span> <span class="subxS1Comment"># . EAX = parse-hex-int(slice)</span>
<span id="L388" class="LineNr">388 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L389" class="LineNr">389 </span> 51/push-ECX
<span id="L390" class="LineNr">390 </span> <span class="subxS2Comment"># . . call</span>
<span id="L391" class="LineNr">391 </span> e8/call <a href='065hex.subx.html#L354'>parse-hex-int</a>/disp32
<span id="L392" class="LineNr">392 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L393" class="LineNr">393 </span> 81 0/subop/add 3/mod/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="L394" class="LineNr">394 </span> <span class="subxComment"># *out = EAX</span>
<span id="L395" class="LineNr">395 </span> 89/copy 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"># copy EAX to *EBX</span>
<span id="L396" class="LineNr">396 </span> <span class="subxComment"># out += 4</span>
<span id="L397" class="LineNr">397 </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="L398" class="LineNr">398 </span> <span class="subxComment"># slice-&gt;start = slice-&gt;end</span>
<span id="L399" class="LineNr">399 </span> 8b/copy 1/mod/direct 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ECX+4) to EAX</span>
<span id="L400" class="LineNr">400 </span> 89/copy 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EAX to *ECX</span>
<span id="L401" class="LineNr">401 </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="L402" class="LineNr">402 </span> eb/jump $parse-array-of-ints:loop2/disp8
<span id="L403" class="LineNr">403 </span><span class="Constant">$parse-array-of-ints:end</span>:
<span id="L404" class="LineNr">404 </span> <span class="subxComment"># return EDI</span>
<span id="L405" class="LineNr">405 </span> 89/copy 3/mod/direct 0/rm32/EAX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/EDI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EDI to EAX</span>
<span id="L406" class="LineNr">406 </span> <span class="subxS1Comment"># . reclaim locals</span>
<span id="L407" class="LineNr">407 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L408" class="LineNr">408 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L409" class="LineNr">409 </span> 5f/pop-to-EDI
<span id="L410" class="LineNr">410 </span> 5e/pop-to-ESI
<span id="L411" class="LineNr">411 </span> 5b/pop-to-EBX
<span id="L412" class="LineNr">412 </span> 5a/pop-to-EDX
<span id="L413" class="LineNr">413 </span> 59/pop-to-ECX
<span id="L414" class="LineNr">414 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L415" class="LineNr">415 </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="L416" class="LineNr">416 </span> 5d/pop-to-EBP
<span id="L417" class="LineNr">417 </span> c3/return
<span id="L418" class="LineNr">418 </span>
<span id="L419" class="LineNr">419 </span><span class="subxTest">test-parse-array-of-ints</span>:
<span id="L420" class="LineNr">420 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L421" class="LineNr">421 </span> 55/push-EBP
<span id="L422" class="LineNr">422 </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="L423" class="LineNr">423 </span> <span class="subxComment"># var ECX = [1, 2, 3]</span>
<span id="L424" class="LineNr">424 </span> 68/push 3/imm32
<span id="L425" class="LineNr">425 </span> 68/push 2/imm32
<span id="L426" class="LineNr">426 </span> 68/push 1/imm32
<span id="L427" class="LineNr">427 </span> 68/push 0xc/imm32/size
<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 = parse-array-of-ints(Heap, &quot;1 2 3&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;1 2 3&quot;</span>/imm32
<span id="L432" class="LineNr">432 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L433" class="LineNr">433 </span> <span class="subxS2Comment"># . . call</span>
<span id="L434" class="LineNr">434 </span> e8/call <a href='075array-equal.subx.html#L249'>parse-array-of-ints</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"># EAX = array-equal?(ECX, EAX)</span>
<span id="L438" class="LineNr">438 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L439" class="LineNr">439 </span> 50/push-EAX
<span id="L440" class="LineNr">440 </span> 51/push-ECX
<span id="L441" class="LineNr">441 </span> <span class="subxS2Comment"># . . call</span>
<span id="L442" class="LineNr">442 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L443" class="LineNr">443 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L444" class="LineNr">444 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L445" class="LineNr">445 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L446" class="LineNr">446 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L447" class="LineNr">447 </span> 68/push <span class="Constant">&quot;F - test-parse-array-of-ints&quot;</span>/imm32
<span id="L448" class="LineNr">448 </span> 68/push 1/imm32/true
<span id="L449" class="LineNr">449 </span> 50/push-EAX
<span id="L450" class="LineNr">450 </span> <span class="subxS2Comment"># . . call</span>
<span id="L451" class="LineNr">451 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L452" class="LineNr">452 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L453" class="LineNr">453 </span> 81 0/subop/add 3/mod/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="L454" class="LineNr">454 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L455" class="LineNr">455 </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="L456" class="LineNr">456 </span> 5d/pop-to-EBP
<span id="L457" class="LineNr">457 </span> c3/return
<span id="L458" class="LineNr">458 </span>
<span id="L459" class="LineNr">459 </span><span class="subxTest">test-parse-array-of-ints-empty</span>:
<span id="L460" class="LineNr">460 </span> <span class="subxH1Comment"># - empty string = empty array</span>
<span id="L461" class="LineNr">461 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L462" class="LineNr">462 </span> 55/push-EBP
<span id="L463" class="LineNr">463 </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="L464" class="LineNr">464 </span> <span class="subxComment"># EAX = parse-array-of-ints(Heap, &quot;&quot;)</span>
<span id="L465" class="LineNr">465 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L466" class="LineNr">466 </span> 68/push <span class="Constant">&quot;&quot;</span>/imm32
<span id="L467" class="LineNr">467 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L468" class="LineNr">468 </span> <span class="subxS2Comment"># . . call</span>
<span id="L469" class="LineNr">469 </span> e8/call <a href='075array-equal.subx.html#L249'>parse-array-of-ints</a>/disp32
<span id="L470" class="LineNr">470 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L471" class="LineNr">471 </span> 81 0/subop/add 3/mod/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="L472" class="LineNr">472 </span> <span class="subxComment"># check-ints-equal(*EAX, 0, msg)</span>
<span id="L473" class="LineNr">473 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L474" class="LineNr">474 </span> 68/push <span class="Constant">&quot;F - test-parse-array-of-ints-empty&quot;</span>/imm32
<span id="L475" class="LineNr">475 </span> 68/push 0/imm32/size
<span id="L476" class="LineNr">476 </span> ff 6/subop/push 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> <span class="Normal"> . </span> <span class="subxComment"># push *EAX</span>
<span id="L477" class="LineNr">477 </span> <span class="subxS2Comment"># . . call</span>
<span id="L478" class="LineNr">478 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L479" class="LineNr">479 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L480" class="LineNr">480 </span> 81 0/subop/add 3/mod/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="L481" class="LineNr">481 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L482" class="LineNr">482 </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="L483" class="LineNr">483 </span> 5d/pop-to-EBP
<span id="L484" class="LineNr">484 </span> c3/return
<span id="L485" class="LineNr">485 </span>
<span id="L486" class="LineNr">486 </span><span class="subxTest">test-parse-array-of-ints-just-whitespace</span>:
<span id="L487" class="LineNr">487 </span> <span class="subxH1Comment"># - just whitespace = empty array</span>
<span id="L488" class="LineNr">488 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L489" class="LineNr">489 </span> 55/push-EBP
<span id="L490" class="LineNr">490 </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="L491" class="LineNr">491 </span> <span class="subxComment"># EAX = parse-array-of-ints(Heap, &quot; &quot;)</span>
<span id="L492" class="LineNr">492 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L493" class="LineNr">493 </span> 68/push <span class="Constant">&quot; &quot;</span>/imm32
<span id="L494" class="LineNr">494 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L495" class="LineNr">495 </span> <span class="subxS2Comment"># . . call</span>
<span id="L496" class="LineNr">496 </span> e8/call <a href='075array-equal.subx.html#L249'>parse-array-of-ints</a>/disp32
<span id="L497" class="LineNr">497 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L498" class="LineNr">498 </span> 81 0/subop/add 3/mod/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="L499" class="LineNr">499 </span> <span class="subxComment"># check-ints-equal(*EAX, 0, msg)</span>
<span id="L500" class="LineNr">500 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L501" class="LineNr">501 </span> 68/push <span class="Constant">&quot;F - test-parse-array-of-ints-empty&quot;</span>/imm32
<span id="L502" class="LineNr">502 </span> 68/push 0/imm32/size
<span id="L503" class="LineNr">503 </span> ff 6/subop/push 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> <span class="Normal"> . </span> <span class="subxComment"># push *EAX</span>
<span id="L504" class="LineNr">504 </span> <span class="subxS2Comment"># . . call</span>
<span id="L505" class="LineNr">505 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L506" class="LineNr">506 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L507" class="LineNr">507 </span> 81 0/subop/add 3/mod/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="L508" class="LineNr">508 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L509" class="LineNr">509 </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="L510" class="LineNr">510 </span> 5d/pop-to-EBP
<span id="L511" class="LineNr">511 </span> c3/return
<span id="L512" class="LineNr">512 </span>
<span id="L513" class="LineNr">513 </span><span class="subxTest">test-parse-array-of-ints-extra-whitespace</span>:
<span id="L514" class="LineNr">514 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L515" class="LineNr">515 </span> 55/push-EBP
<span id="L516" class="LineNr">516 </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="L517" class="LineNr">517 </span> <span class="subxComment"># var ECX = [1, 2, 3]</span>
<span id="L518" class="LineNr">518 </span> 68/push 3/imm32
<span id="L519" class="LineNr">519 </span> 68/push 2/imm32
<span id="L520" class="LineNr">520 </span> 68/push 1/imm32
<span id="L521" class="LineNr">521 </span> 68/push 0xc/imm32/size
<span id="L522" class="LineNr">522 </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="L523" class="LineNr">523 </span> <span class="subxComment"># EAX = parse-array-of-ints(Heap, &quot; 1 2 3 &quot;)</span>
<span id="L524" class="LineNr">524 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L525" class="LineNr">525 </span> 68/push <span class="Constant">&quot; 1 2 3 &quot;</span>/imm32
<span id="L526" class="LineNr">526 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L527" class="LineNr">527 </span> <span class="subxS2Comment"># . . call</span>
<span id="L528" class="LineNr">528 </span> e8/call <a href='075array-equal.subx.html#L249'>parse-array-of-ints</a>/disp32
<span id="L529" class="LineNr">529 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L530" class="LineNr">530 </span> 81 0/subop/add 3/mod/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="L531" class="LineNr">531 </span> <span class="subxComment"># EAX = array-equal?(ECX, EAX)</span>
<span id="L532" class="LineNr">532 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L533" class="LineNr">533 </span> 50/push-EAX
<span id="L534" class="LineNr">534 </span> 51/push-ECX
<span id="L535" class="LineNr">535 </span> <span class="subxS2Comment"># . . call</span>
<span id="L536" class="LineNr">536 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L537" class="LineNr">537 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L538" class="LineNr">538 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L539" class="LineNr">539 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L540" class="LineNr">540 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L541" class="LineNr">541 </span> 68/push <span class="Constant">&quot;F - test-parse-array-of-ints-extra-whitespace&quot;</span>/imm32
<span id="L542" class="LineNr">542 </span> 68/push 1/imm32/true
<span id="L543" class="LineNr">543 </span> 50/push-EAX
<span id="L544" class="LineNr">544 </span> <span class="subxS2Comment"># . . call</span>
<span id="L545" class="LineNr">545 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L546" class="LineNr">546 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L547" class="LineNr">547 </span> 81 0/subop/add 3/mod/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="L548" class="LineNr">548 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L549" class="LineNr">549 </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="L550" class="LineNr">550 </span> 5d/pop-to-EBP
<span id="L551" class="LineNr">551 </span> c3/return
<span id="L552" class="LineNr">552 </span>
<span id="L553" class="LineNr">553 </span><span class="subxComment"># helper for later tests</span>
<span id="L554" class="LineNr">554 </span><span class="subxComment"># compare an array with a string representation of an array literal</span>
<span id="L555" class="LineNr">555 </span><span class="subxFunction">check-array-equal</span>: <span class="subxComment"># a : (address array int), expected : (address string), msg : (address string)</span>
<span id="L556" class="LineNr">556 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L557" class="LineNr">557 </span> 55/push-EBP
<span id="L558" class="LineNr">558 </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="L559" class="LineNr">559 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L560" class="LineNr">560 </span> 50/push-EAX
<span id="L561" class="LineNr">561 </span> <span class="subxComment"># var b/ECX = parse-array-of-ints(Heap, expected)</span>
<span id="L562" class="LineNr">562 </span> <span class="subxS1Comment"># . EAX = parse-array-of-ints(Heap, expected)</span>
<span id="L563" class="LineNr">563 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L564" class="LineNr">564 </span> ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(EBP+12)</span>
<span id="L565" class="LineNr">565 </span> 68/push <span class="SpecialChar"><a href='075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L566" class="LineNr">566 </span> <span class="subxS2Comment"># . . call</span>
<span id="L567" class="LineNr">567 </span> e8/call <a href='075array-equal.subx.html#L249'>parse-array-of-ints</a>/disp32
<span id="L568" class="LineNr">568 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L569" class="LineNr">569 </span> 81 0/subop/add 3/mod/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="L570" class="LineNr">570 </span> <span class="subxS1Comment"># . b = EAX</span>
<span id="L571" class="LineNr">571 </span> 89/copy 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"># copy EAX to ECX</span>
<span id="L572" class="LineNr">572 </span> <span class="subxComment"># EAX = array-equal?(a, b)</span>
<span id="L573" class="LineNr">573 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L574" class="LineNr">574 </span> 51/push-ECX
<span id="L575" class="LineNr">575 </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="L576" class="LineNr">576 </span> <span class="subxS2Comment"># . . call</span>
<span id="L577" class="LineNr">577 </span> e8/call <a href='075array-equal.subx.html#L26'>array-equal?</a>/disp32
<span id="L578" class="LineNr">578 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L579" class="LineNr">579 </span> 81 0/subop/add 3/mod/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="L580" class="LineNr">580 </span> <span class="subxComment"># check-ints-equal(EAX, 1, msg)</span>
<span id="L581" class="LineNr">581 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L582" class="LineNr">582 </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="L583" class="LineNr">583 </span> 68/push 1/imm32
<span id="L584" class="LineNr">584 </span> 50/push-EAX
<span id="L585" class="LineNr">585 </span> <span class="subxS2Comment"># . . call</span>
<span id="L586" class="LineNr">586 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L587" class="LineNr">587 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L588" class="LineNr">588 </span> 81 0/subop/add 3/mod/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="L589" class="LineNr">589 </span><span class="Constant">$check-array-equal:end</span>:
<span id="L590" class="LineNr">590 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L591" class="LineNr">591 </span> 58/pop-to-EAX
<span id="L592" class="LineNr">592 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L593" class="LineNr">593 </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="L594" class="LineNr">594 </span> 5d/pop-to-EBP
<span id="L595" class="LineNr">595 </span> c3/return
<span id="L596" class="LineNr">596 </span>
<span id="L597" class="LineNr">597 </span><span class="subxTest">test-check-array-equal</span>:
<span id="L598" class="LineNr">598 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L599" class="LineNr">599 </span> 55/push-EBP
<span id="L600" class="LineNr">600 </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="L601" class="LineNr">601 </span> <span class="subxComment"># var ECX = [1, 2, 3]</span>
<span id="L602" class="LineNr">602 </span> 68/push 3/imm32
<span id="L603" class="LineNr">603 </span> 68/push 2/imm32
<span id="L604" class="LineNr">604 </span> 68/push 1/imm32
<span id="L605" class="LineNr">605 </span> 68/push 0xc/imm32/size
<span id="L606" class="LineNr">606 </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="L607" class="LineNr">607 </span> <span class="subxComment"># check-array-equal(ECX, &quot;1 2 3&quot;, &quot;msg&quot;)</span>
<span id="L608" class="LineNr">608 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L609" class="LineNr">609 </span> 68/push <span class="Constant">&quot;F - test-check-array-equal&quot;</span>/imm32
<span id="L610" class="LineNr">610 </span> 68/push <span class="Constant">&quot;1 2 3&quot;</span>/imm32
<span id="L611" class="LineNr">611 </span> 51/push-ECX
<span id="L612" class="LineNr">612 </span> <span class="subxS2Comment"># . . call</span>
<span id="L613" class="LineNr">613 </span> e8/call <a href='075array-equal.subx.html#L555'>check-array-equal</a>/disp32
<span id="L614" class="LineNr">614 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L615" class="LineNr">615 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L616" class="LineNr">616 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L617" class="LineNr">617 </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="L618" class="LineNr">618 </span> 5d/pop-to-EBP
<span id="L619" class="LineNr">619 </span> c3/return
<span id="L620" class="LineNr">620 </span>
<span id="L621" class="LineNr">621 </span>== data
<span id="L622" class="LineNr">622 </span>
<span id="L623" class="LineNr">623 </span><span class="SpecialChar">Heap</span>:
<span id="L624" class="LineNr">624 </span> <span class="subxComment"># curr</span>
<span id="L625" class="LineNr">625 </span> 0/imm32
<span id="L626" class="LineNr">626 </span> <span class="subxComment"># limit</span>
<span id="L627" class="LineNr">627 </span> 0/imm32
<span id="L628" class="LineNr">628 </span>
<span id="L629" class="LineNr">629 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->

View File

@ -0,0 +1,147 @@
<!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 - subx/076zero-out.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; }
.subxS2Comment { color: #8a8a8a; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
-->
</style>
<script type='text/javascript'>
<!--
/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
var lineNum;
lineNum = window.location.hash;
lineNum = lineNum.substr(1); /* strip off '#' */
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
var lineElem = document.getElementById(lineNum);
/* Always jump to new location even if the line was hidden inside a fold, or
* we corrected the raw number to a line ID.
*/
if (lineElem) {
lineElem.scrollIntoView(true);
}
return true;
}
if ('onhashchange' in window) {
window.onhashchange = JumpToLine;
}
-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/subx/076zero-out.subx'>https://github.com/akkartik/mu/blob/master/subx/076zero-out.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Fill a region of memory with zeroes.</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span>== code
<span id="L4" class="LineNr"> 4 </span><span class="subxComment"># instruction effective address register displacement immediate</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op subop mod rm32 base index scale r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="subxFunction">zero-out</span>: <span class="subxComment"># start : address, len : int</span>
<span id="L9" class="LineNr"> 9 </span> <span class="subxComment"># pseudocode:</span>
<span id="L10" class="LineNr">10 </span> <span class="subxComment"># curr/ESI = start</span>
<span id="L11" class="LineNr">11 </span> <span class="subxComment"># i/ECX = 0</span>
<span id="L12" class="LineNr">12 </span> <span class="subxComment"># while true</span>
<span id="L13" class="LineNr">13 </span> <span class="subxComment"># if (i &gt;= len) break</span>
<span id="L14" class="LineNr">14 </span> <span class="subxComment"># *curr = 0</span>
<span id="L15" class="LineNr">15 </span> <span class="subxComment"># ++curr</span>
<span id="L16" class="LineNr">16 </span> <span class="subxComment"># ++i</span>
<span id="L17" class="LineNr">17 </span> <span class="subxComment">#</span>
<span id="L18" class="LineNr">18 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L19" class="LineNr">19 </span> 55/push-EBP
<span id="L20" class="LineNr">20 </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="L21" class="LineNr">21 </span> <span class="subxS1Comment"># . save registers</span>
<span id="L22" class="LineNr">22 </span> 50/push-EAX
<span id="L23" class="LineNr">23 </span> 51/push-ECX
<span id="L24" class="LineNr">24 </span> 52/push-EDX
<span id="L25" class="LineNr">25 </span> 56/push-ESI
<span id="L26" class="LineNr">26 </span> <span class="subxComment"># curr/ESI = start</span>
<span id="L27" class="LineNr">27 </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="L28" class="LineNr">28 </span> <span class="subxComment"># i/ECX = 0</span>
<span id="L29" class="LineNr">29 </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="L30" class="LineNr">30 </span> <span class="subxComment"># EDX = len</span>
<span id="L31" class="LineNr">31 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/EDX 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+12) to EDX</span>
<span id="L32" class="LineNr">32 </span><span class="Constant">$zero-out:loop</span>:
<span id="L33" class="LineNr">33 </span> <span class="subxComment"># if (i &gt;= len) break</span>
<span id="L34" class="LineNr">34 </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="L35" class="LineNr">35 </span> 7d/jump-if-greater-or-equal $zero-out:end/disp8
<span id="L36" class="LineNr">36 </span> <span class="subxComment"># *curr = 0</span>
<span id="L37" class="LineNr">37 </span> c6 0/subop/copy 0/mod/direct 6/rm32/ESI <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/imm8 <span class="subxComment"># copy byte to *ESI</span>
<span id="L38" class="LineNr">38 </span> <span class="subxComment"># ++curr</span>
<span id="L39" class="LineNr">39 </span> 46/increment-ESI
<span id="L40" class="LineNr">40 </span> <span class="subxComment"># ++i</span>
<span id="L41" class="LineNr">41 </span> 41/increment-ECX
<span id="L42" class="LineNr">42 </span> eb/jump $zero-out:loop/disp8
<span id="L43" class="LineNr">43 </span><span class="Constant">$zero-out:end</span>:
<span id="L44" class="LineNr">44 </span> <span class="subxS1Comment"># . restore registers</span>
<span id="L45" class="LineNr">45 </span> 5e/pop-to-ESI
<span id="L46" class="LineNr">46 </span> 5a/pop-to-EDX
<span id="L47" class="LineNr">47 </span> 59/pop-to-ECX
<span id="L48" class="LineNr">48 </span> 58/pop-to-EAX
<span id="L49" class="LineNr">49 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L50" class="LineNr">50 </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="L51" class="LineNr">51 </span> 5d/pop-to-EBP
<span id="L52" class="LineNr">52 </span> c3/return
<span id="L53" class="LineNr">53 </span>
<span id="L54" class="LineNr">54 </span><span class="subxTest">test-zero-out</span>:
<span id="L55" class="LineNr">55 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L56" class="LineNr">56 </span> 55/push-EBP
<span id="L57" class="LineNr">57 </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="L58" class="LineNr">58 </span> <span class="subxComment"># region/ECX = 34, 35, 36, 37</span>
<span id="L59" class="LineNr">59 </span> 68/push 0x37363534/imm32
<span id="L60" class="LineNr">60 </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="L61" class="LineNr">61 </span> <span class="subxComment"># zero-out(ECX, 3)</span>
<span id="L62" class="LineNr">62 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L63" class="LineNr">63 </span> 68/push 3/imm32/len
<span id="L64" class="LineNr">64 </span> 51/push-ECX
<span id="L65" class="LineNr">65 </span> <span class="subxS2Comment"># . . call</span>
<span id="L66" class="LineNr">66 </span> e8/call <a href='076zero-out.subx.html#L8'>zero-out</a>/disp32
<span id="L67" class="LineNr">67 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L68" class="LineNr">68 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L69" class="LineNr">69 </span> <span class="subxComment"># first 3 bytes cleared, fourth left alone</span>
<span id="L70" class="LineNr">70 </span> <span class="subxS1Comment"># . check-ints-equal(*ECX, 0x37000000, msg)</span>
<span id="L71" class="LineNr">71 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L72" class="LineNr">72 </span> 68/push <span class="Constant">&quot;F - test-zero-out&quot;</span>/imm32
<span id="L73" class="LineNr">73 </span> 68/push 0x37000000/imm32
<span id="L74" class="LineNr">74 </span> ff 6/subop/push 0/mod/indirect 1/rm32/ECX <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *ECX</span>
<span id="L75" class="LineNr">75 </span> <span class="subxS2Comment"># . . call</span>
<span id="L76" class="LineNr">76 </span> e8/call <a href='051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L77" class="LineNr">77 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L78" class="LineNr">78 </span> 81 0/subop/add 3/mod/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="L79" class="LineNr">79 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L80" class="LineNr">80 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L81" class="LineNr">81 </span> 5d/pop-to-EBP
<span id="L82" class="LineNr">82 </span> c3/return
<span id="L83" class="LineNr">83 </span>
<span id="L84" class="LineNr">84 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/apps/factorial.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,16 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxTest { color: #5f8700; }
.CommentedCode { color: #8a8a8a; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -41,7 +40,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/
@ -81,97 +80,102 @@ if ('onhashchange' in window) {
<span id="L19" class="LineNr"> 19 </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="L20" class="LineNr"> 20 </span>
<span id="L21" class="LineNr"> 21 </span><span class="SpecialChar">Entry</span>: <span class="subxComment"># run tests if necessary, compute `factorial(5)` if not</span>
<span id="L22" class="LineNr"> 22 </span>
<span id="L23" class="LineNr"> 23 </span><span class="CommentedCode">#? # for debugging: run a single test; don't bother setting status code</span>
<span id="L24" class="LineNr"> 24 </span><span class="CommentedCode">#? e8/call test-get-num-reads-single-digit/disp32</span>
<span id="L25" class="LineNr"> 25 </span><span class="CommentedCode">#? eb/jump $main:end/disp8</span>
<span id="L26" class="LineNr"> 26 </span>
<span id="L27" class="LineNr"> 27 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L28" class="LineNr"> 28 </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="L29" class="LineNr"> 29 </span> <span class="subxH1Comment"># - if argc &gt; 1 and argv[1] == &quot;test&quot;, then return run_tests()</span>
<span id="L30" class="LineNr"> 30 </span> <span class="subxS1Comment"># . argc &gt; 1</span>
<span id="L31" class="LineNr"> 31 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/disp8 1/imm32 <span class="subxComment"># compare *EBP</span>
<span id="L32" class="LineNr"> 32 </span> 7e/jump-if-lesser-or-equal $run-main/disp8
<span id="L33" class="LineNr"> 33 </span> <span class="subxS1Comment"># . argv[1] == &quot;test&quot;</span>
<span id="L34" class="LineNr"> 34 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L35" class="LineNr"> 35 </span> 68/push <span class="Constant">&quot;test&quot;</span>/imm32
<span id="L36" class="LineNr"> 36 </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="L37" class="LineNr"> 37 </span> <span class="subxS2Comment"># . . call</span>
<span id="L38" class="LineNr"> 38 </span> e8/call <a href='../052kernel-string-equal.subx.html#L31'>kernel-string-equal?</a>/disp32
<span id="L39" class="LineNr"> 39 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L40" class="LineNr"> 40 </span> 81 0/subop/add 3/mod/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="L41" class="LineNr"> 41 </span> <span class="subxS1Comment"># . check result</span>
<span id="L42" class="LineNr"> 42 </span> 3d/compare-EAX-and 1/imm32
<span id="L43" class="LineNr"> 43 </span> 75/jump-if-not-equal $run-main/disp8
<span id="L44" class="LineNr"> 44 </span> <span class="subxS1Comment"># . run-tests()</span>
<span id="L45" class="LineNr"> 45 </span> e8/call run-tests/disp32
<span id="L46" class="LineNr"> 46 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='../051test.subx.html#L90'>Num-test-failures</a></span>/disp32 <span class="subxComment"># copy *Num-test-failures to EAX</span>
<span id="L47" class="LineNr"> 47 </span> eb/jump $main:end/disp8 <span class="subxComment"># where EAX will get copied to EBX</span>
<span id="L48" class="LineNr"> 48 </span><span class="Constant">$run-main</span>:
<span id="L49" class="LineNr"> 49 </span> <span class="subxH1Comment"># - otherwise return factorial(5)</span>
<span id="L50" class="LineNr"> 50 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L51" class="LineNr"> 51 </span> 68/push 5/imm32
<span id="L52" class="LineNr"> 52 </span> <span class="subxS2Comment"># . . call</span>
<span id="L53" class="LineNr"> 53 </span> e8/call <a href='factorial.subx.html#L62'>factorial</a>/disp32
<span id="L54" class="LineNr"> 54 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L55" class="LineNr"> 55 </span> 81 0/subop/add 3/mod/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="L56" class="LineNr"> 56 </span><span class="Constant">$main:end</span>:
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># syscall(exit, EAX)</span>
<span id="L58" class="LineNr"> 58 </span> 89/copy 3/mod/direct 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"># copy EAX to EBX</span>
<span id="L59" class="LineNr"> 59 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L60" class="LineNr"> 60 </span> cd/syscall 0x80/imm8
<span id="L61" class="LineNr"> 61 </span>
<span id="L62" class="LineNr"> 62 </span><span class="subxFunction">factorial</span>: <span class="subxComment"># n : int -&gt; int/EAX</span>
<span id="L63" class="LineNr"> 63 </span> <span class="subxS1Comment"># . prolog</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> 53/push-EBX
<span id="L67" class="LineNr"> 67 </span> <span class="subxComment"># EAX = 1 (base case)</span>
<span id="L68" class="LineNr"> 68 </span> b8/copy-to-EAX 1/imm32
<span id="L69" class="LineNr"> 69 </span> <span class="subxComment"># if (n &lt;= 1) return</span>
<span id="L70" class="LineNr"> 70 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 1/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L71" class="LineNr"> 71 </span> 7e/jump-if-&lt;= $factorial:end/disp8
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># EBX = n-1</span>
<span id="L73" class="LineNr"> 73 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EBX</span>
<span id="L74" class="LineNr"> 74 </span> 81 5/subop/subtract 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> 1/imm32 <span class="subxComment"># subtract from EBX</span>
<span id="L75" class="LineNr"> 75 </span> <span class="subxComment"># EAX = factorial(n-1)</span>
<span id="L76" class="LineNr"> 76 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L77" class="LineNr"> 77 </span> 53/push-EBX
<span id="L78" class="LineNr"> 78 </span> <span class="subxS2Comment"># . . call</span>
<span id="L79" class="LineNr"> 79 </span> e8/call <a href='factorial.subx.html#L62'>factorial</a>/disp32
<span id="L80" class="LineNr"> 80 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L81" class="LineNr"> 81 </span> 81 0/subop/add 3/mod/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="L82" class="LineNr"> 82 </span> <span class="subxComment"># return n * factorial(n-1)</span>
<span id="L83" class="LineNr"> 83 </span> f7 4/subop/multiply 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># multiply *(EBP+8) into EAX</span>
<span id="L84" class="LineNr"> 84 </span> <span class="subxComment"># TODO: check for overflow</span>
<span id="L85" class="LineNr"> 85 </span><span class="Constant">$factorial:end</span>:
<span id="L86" class="LineNr"> 86 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L87" class="LineNr"> 87 </span> 5b/pop-to-EBX
<span id="L88" class="LineNr"> 88 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 5/r32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy EBP to ESP</span>
<span id="L89" class="LineNr"> 89 </span> 5d/pop-to-EBP
<span id="L90" class="LineNr"> 90 </span> c3/return
<span id="L91" class="LineNr"> 91 </span>
<span id="L92" class="LineNr"> 92 </span><span class="subxTest">test-factorial</span>:
<span id="L93" class="LineNr"> 93 </span> <span class="subxComment"># factorial(5)</span>
<span id="L94" class="LineNr"> 94 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L95" class="LineNr"> 95 </span> 68/push 5/imm32
<span id="L96" class="LineNr"> 96 </span> <span class="subxS2Comment"># . . call</span>
<span id="L97" class="LineNr"> 97 </span> e8/call <a href='factorial.subx.html#L62'>factorial</a>/disp32
<span id="L98" class="LineNr"> 98 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L99" class="LineNr"> 99 </span> 81 0/subop/add 3/mod/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="L100" class="LineNr">100 </span> <span class="subxComment"># check-ints-equal(EAX, 120, msg)</span>
<span id="L101" class="LineNr">101 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L102" class="LineNr">102 </span> 68/push <span class="Constant">&quot;F - test-factorial&quot;</span>/imm32
<span id="L103" class="LineNr">103 </span> 68/push 0x78/imm32/expected-120
<span id="L104" class="LineNr">104 </span> 50/push-EAX
<span id="L105" class="LineNr">105 </span> <span class="subxS2Comment"># . . call</span>
<span id="L106" class="LineNr">106 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L107" class="LineNr">107 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L108" class="LineNr">108 </span> 81 0/subop/add 3/mod/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="L109" class="LineNr">109 </span> <span class="subxComment"># end</span>
<span id="L110" class="LineNr">110 </span> c3/return
<span id="L111" class="LineNr">111 </span>
<span id="L112" class="LineNr">112 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
<span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># initialize heap</span>
<span id="L23" class="LineNr"> 23 </span> <span class="subxS1Comment"># . Heap = new-segment(64KB)</span>
<span id="L24" class="LineNr"> 24 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L25" class="LineNr"> 25 </span> 68/push <span class="SpecialChar"><a href='../075array-equal.subx.html#L623'>Heap</a></span>/imm32
<span id="L26" class="LineNr"> 26 </span> 68/push 0x10000/imm32/64KB
<span id="L27" class="LineNr"> 27 </span> <span class="subxS2Comment"># . . call</span>
<span id="L28" class="LineNr"> 28 </span> e8/call <a href='../053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L29" class="LineNr"> 29 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L30" class="LineNr"> 30 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
<span id="L31" class="LineNr"> 31 </span>
<span id="L32" class="LineNr"> 32 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L33" class="LineNr"> 33 </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="L34" class="LineNr"> 34 </span> <span class="subxH1Comment"># - if argc &gt; 1 and argv[1] == &quot;test&quot;, then return run_tests()</span>
<span id="L35" class="LineNr"> 35 </span> <span class="subxS1Comment"># . argc &gt; 1</span>
<span id="L36" class="LineNr"> 36 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/disp8 1/imm32 <span class="subxComment"># compare *EBP</span>
<span id="L37" class="LineNr"> 37 </span> 7e/jump-if-lesser-or-equal $run-main/disp8
<span id="L38" class="LineNr"> 38 </span> <span class="subxS1Comment"># . argv[1] == &quot;test&quot;</span>
<span id="L39" class="LineNr"> 39 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L40" class="LineNr"> 40 </span> 68/push <span class="Constant">&quot;test&quot;</span>/imm32
<span id="L41" class="LineNr"> 41 </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="L42" class="LineNr"> 42 </span> <span class="subxS2Comment"># . . call</span>
<span id="L43" class="LineNr"> 43 </span> e8/call <a href='../052kernel-string-equal.subx.html#L31'>kernel-string-equal?</a>/disp32
<span id="L44" class="LineNr"> 44 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L45" class="LineNr"> 45 </span> 81 0/subop/add 3/mod/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="L46" class="LineNr"> 46 </span> <span class="subxS1Comment"># . check result</span>
<span id="L47" class="LineNr"> 47 </span> 3d/compare-EAX-and 1/imm32
<span id="L48" class="LineNr"> 48 </span> 75/jump-if-not-equal $run-main/disp8
<span id="L49" class="LineNr"> 49 </span> <span class="subxS1Comment"># . run-tests()</span>
<span id="L50" class="LineNr"> 50 </span> e8/call run-tests/disp32
<span id="L51" class="LineNr"> 51 </span> 8b/copy 0/mod/indirect 5/rm32/.disp32 <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/EAX <span class="SpecialChar"><a href='../051test.subx.html#L90'>Num-test-failures</a></span>/disp32 <span class="subxComment"># copy *Num-test-failures to EAX</span>
<span id="L52" class="LineNr"> 52 </span> eb/jump $main:end/disp8 <span class="subxComment"># where EAX will get copied to EBX</span>
<span id="L53" class="LineNr"> 53 </span><span class="Constant">$run-main</span>:
<span id="L54" class="LineNr"> 54 </span> <span class="subxH1Comment"># - otherwise return factorial(5)</span>
<span id="L55" class="LineNr"> 55 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L56" class="LineNr"> 56 </span> 68/push 5/imm32
<span id="L57" class="LineNr"> 57 </span> <span class="subxS2Comment"># . . call</span>
<span id="L58" class="LineNr"> 58 </span> e8/call <a href='factorial.subx.html#L67'>factorial</a>/disp32
<span id="L59" class="LineNr"> 59 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L60" class="LineNr"> 60 </span> 81 0/subop/add 3/mod/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="L61" class="LineNr"> 61 </span><span class="Constant">$main:end</span>:
<span id="L62" class="LineNr"> 62 </span> <span class="subxComment"># syscall(exit, EAX)</span>
<span id="L63" class="LineNr"> 63 </span> 89/copy 3/mod/direct 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"># copy EAX to EBX</span>
<span id="L64" class="LineNr"> 64 </span> b8/copy-to-EAX 1/imm32/exit
<span id="L65" class="LineNr"> 65 </span> cd/syscall 0x80/imm8
<span id="L66" class="LineNr"> 66 </span>
<span id="L67" class="LineNr"> 67 </span><span class="subxFunction">factorial</span>: <span class="subxComment"># n : int -&gt; int/EAX</span>
<span id="L68" class="LineNr"> 68 </span> <span class="subxS1Comment"># . prolog</span>
<span id="L69" class="LineNr"> 69 </span> 55/push-EBP
<span id="L70" class="LineNr"> 70 </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="L71" class="LineNr"> 71 </span> 53/push-EBX
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># EAX = 1 (base case)</span>
<span id="L73" class="LineNr"> 73 </span> b8/copy-to-EAX 1/imm32
<span id="L74" class="LineNr"> 74 </span> <span class="subxComment"># if (n &lt;= 1) return</span>
<span id="L75" class="LineNr"> 75 </span> 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 1/imm32 <span class="subxComment"># compare *(EBP+8)</span>
<span id="L76" class="LineNr"> 76 </span> 7e/jump-if-&lt;= $factorial:end/disp8
<span id="L77" class="LineNr"> 77 </span> <span class="subxComment"># EBX = n-1</span>
<span id="L78" class="LineNr"> 78 </span> 8b/copy 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/EBX 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(EBP+8) to EBX</span>
<span id="L79" class="LineNr"> 79 </span> 81 5/subop/subtract 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> 1/imm32 <span class="subxComment"># subtract from EBX</span>
<span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># EAX = factorial(n-1)</span>
<span id="L81" class="LineNr"> 81 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L82" class="LineNr"> 82 </span> 53/push-EBX
<span id="L83" class="LineNr"> 83 </span> <span class="subxS2Comment"># . . call</span>
<span id="L84" class="LineNr"> 84 </span> e8/call <a href='factorial.subx.html#L67'>factorial</a>/disp32
<span id="L85" class="LineNr"> 85 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L86" class="LineNr"> 86 </span> 81 0/subop/add 3/mod/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="L87" class="LineNr"> 87 </span> <span class="subxComment"># return n * factorial(n-1)</span>
<span id="L88" class="LineNr"> 88 </span> f7 4/subop/multiply 1/mod/*+disp8 5/rm32/EBP <span class="Normal"> . </span> <span class="Normal"> . </span> 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># multiply *(EBP+8) into EAX</span>
<span id="L89" class="LineNr"> 89 </span> <span class="subxComment"># TODO: check for overflow</span>
<span id="L90" class="LineNr"> 90 </span><span class="Constant">$factorial:end</span>:
<span id="L91" class="LineNr"> 91 </span> <span class="subxS1Comment"># . epilog</span>
<span id="L92" class="LineNr"> 92 </span> 5b/pop-to-EBX
<span id="L93" class="LineNr"> 93 </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="L94" class="LineNr"> 94 </span> 5d/pop-to-EBP
<span id="L95" class="LineNr"> 95 </span> c3/return
<span id="L96" class="LineNr"> 96 </span>
<span id="L97" class="LineNr"> 97 </span><span class="subxTest">test-factorial</span>:
<span id="L98" class="LineNr"> 98 </span> <span class="subxComment"># factorial(5)</span>
<span id="L99" class="LineNr"> 99 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L100" class="LineNr">100 </span> 68/push 5/imm32
<span id="L101" class="LineNr">101 </span> <span class="subxS2Comment"># . . call</span>
<span id="L102" class="LineNr">102 </span> e8/call <a href='factorial.subx.html#L67'>factorial</a>/disp32
<span id="L103" class="LineNr">103 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L104" class="LineNr">104 </span> 81 0/subop/add 3/mod/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="L105" class="LineNr">105 </span> <span class="subxComment"># check-ints-equal(EAX, 120, msg)</span>
<span id="L106" class="LineNr">106 </span> <span class="subxS2Comment"># . . push args</span>
<span id="L107" class="LineNr">107 </span> 68/push <span class="Constant">&quot;F - test-factorial&quot;</span>/imm32
<span id="L108" class="LineNr">108 </span> 68/push 0x78/imm32/expected-120
<span id="L109" class="LineNr">109 </span> 50/push-EAX
<span id="L110" class="LineNr">110 </span> <span class="subxS2Comment"># . . call</span>
<span id="L111" class="LineNr">111 </span> e8/call <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L112" class="LineNr">112 </span> <span class="subxS2Comment"># . . discard args</span>
<span id="L113" class="LineNr">113 </span> 81 0/subop/add 3/mod/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="L114" class="LineNr">114 </span> <span class="subxComment"># end</span>
<span id="L115" class="LineNr">115 </span> c3/return
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>

View File

@ -3,8 +3,8 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - subx/apps/handle.subx</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<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">
@ -14,17 +14,17 @@ pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxTest { color: #5f8700; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.CommentedCode { color: #8a8a8a; }
.subxTest { color: #5f8700; }
.subxComment { color: #005faf; }
.subxS1Comment { color: #0000af; }
.LineNr { }
.subxH1Comment { color: #005faf; text-decoration: underline; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Constant { color: #008787; }
.subxS2Comment { color: #8a8a8a; }
-->
</style>
@ -41,7 +41,7 @@ function JumpToLine()
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(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.
*/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff