https://github.com/akkartik/mu/blob/main/109stream-equal.subx
  1 # some primitives for checking stream contents
  2 
  3 == code
  4 #   instruction                     effective address                                                   register    displacement    immediate
  5 # . op          subop               mod             rm32          base        index         scale       r32
  6 # . 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
  7 
  8 # compare all the data in a stream (ignoring the read pointer)
  9 stream-data-equal?:  # f: (addr stream byte), s: (addr array byte) -> result/eax: boolean
 10     # . prologue
 11     55/push-ebp
 12     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
 13     # . save registers
 14     51/push-ecx
 15     52/push-edx
 16     56/push-esi
 17     57/push-edi
 18     # esi = f
 19     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   8/disp8         .                 # copy *(ebp+8) to esi
 20     # eax = f->write
 21     8b/copy                         0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 # copy *esi to eax
 22     # var maxf/edx: (addr byte) = &f->data[f->write]
 23     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  0/index/eax   .           2/r32/edx   0xc/disp8       .                 # copy esi+eax+12 to edx
 24     # var currf/esi: (addr byte) = f->data
 25     81          0/subop/add         3/mod/direct    6/rm32/esi    .           .             .           .           .               0xc/imm32         # add to esi
 26     # edi = s
 27     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   0xc/disp8       .                 # copy *(ebp+12) to edi
 28 $stream-data-equal?:compare-sizes:
 29     # if (f->write != s->size) return false
 30     39/compare                      0/mod/indirect  7/rm32/edi    .           .             .           0/r32/eax   .               .                 # compare *edi and eax
 31     75/jump-if-!=  $stream-data-equal?:false/disp8
 32     # var currs/edi: (addr byte) = s->data
 33     81          0/subop/add         3/mod/direct    7/rm32/edi    .           .             .           .           .               4/imm32           # add to edi
 34     # var eax: byte = 0
 35     31/xor                          3/mod/direct    0/rm32/eax    .          pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module ranger.container.environment</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body bgcolor="#f0f0f8">

<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.<a href="ranger.container.html"><font color="#ffffff">container</font></a>.environment</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/work/ranger/ranger/container/environment.py">/home/hut/work/ranger/ranger/container/environment.py</a></font></td></tr></table>
    <p></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
    
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>(<a href="builtins.html#object">builtins.object</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.container.environment.html#Environment">Environment</a>
</font></dt></dl>
</dd>
</dl>
 <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Environment">class <strong>Environment</strong></a>(<a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>A&nbsp;collection&nbsp;of&nbsp;data&nbsp;which&nbsp;is&nbsp;relevant&nbsp;for&nbsp;more&nbsp;than<br>
one&nbsp;class.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="ranger.container.environment.html#Environment">Environment</a></dd>
<dd><a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a></dd>
<dd><a href="builtins.html#object">builtins.object</a></dd>
</dl>
<hr>
Methods defined here:<br>
<dl><dt><a name="Environment-__init__"><strong>__init__</strong></a>(self, path)</dt></dl>

<dl><dt><a name="Environment-assign_correct_cursor_positions"><strong>assign_correct_cursor_positions</strong></a>(self)</dt><dd><tt>Assign&nbsp;correct&nbsp;cursor&nbsp;positions&nbsp;for&nbsp;subdirectories</tt></dd></dl>

<dl><dt><a name="Environment-at_level"><strong>at_level</strong></a>(self, level)</dt><dd><tt>Returns&nbsp;the&nbsp;FileSystemObject&nbsp;at&nbsp;the&nbsp;given&nbsp;level.<br>
level&nbsp;1&nbsp;=&gt;&nbsp;preview<br>
level&nbsp;0&nbsp;=&gt;&nbsp;current&nbsp;file/directory<br>
level&nbsp;&lt;0&nbsp;=&gt;&nbsp;parent&nbsp;directories</tt></dd></dl>

<dl><dt><a name="Environment-enter_dir"><strong>enter_dir</strong></a>(self, path, history<font color="#909090">=True</font>)</dt><dd><tt>Enter&nbsp;given&nbsp;path</tt></dd></dl>

<dl><dt><a name="Environment-garbage_collect"><strong>garbage_collect</strong></a>(self)</dt><dd><tt>Delete&nbsp;unused&nbsp;directory&nbsp;objects</tt></dd></dl>

<dl><dt><a name="Environment-get_directory"><strong>get_directory</strong></a>(self, path)</dt><dd><tt>Get&nbsp;the&nbsp;directory&nbsp;object&nbsp;at&nbsp;the&nbsp;given&nbsp;path</tt></dd></dl>

<dl><dt><a name="Environment-get_selection"><strong>get_selection</strong></a>(self)</dt></dl>

<dl><dt><a name="Environment-history_go"><strong>history_go</strong></a>(self, relative)</dt><dd><tt>Move&nbsp;relative&nbsp;in&nbsp;history</tt></dd></dl>

<dl><dt><a name="Environment-key_append"><strong>key_append</strong></a>(self, key)</dt><dd><tt>Append&nbsp;a&nbsp;key&nbsp;to&nbsp;the&nbsp;keybuffer</tt></dd></dl>

<dl><dt><a name="Environment-key_clear"><strong>key_clear</strong></a>(self)</dt><dd><tt>Clear&nbsp;the&nbsp;keybuffer</tt></dd></dl>

<hr>
Data and other attributes defined here:<br>
<dl><dt><strong>cf</strong> = None</dl>

<dl><dt><strong>copy</strong> = None</dl>

<dl><dt><strong>cut</strong> = None</dl>

<dl><dt><strong>directories</strong> = None</dl>

<dl><dt><strong>history</strong> = None</dl>

<dl><dt><strong>keybuffer</strong> = None</dl>

<dl><dt><strong>last_search</strong> = None</dl>

<dl><dt><strong>path</strong> = None</dl>

<dl><dt><strong>pathway</strong> = None</dl>

<dl><dt><strong>pwd</strong> = None</dl>

<dl><dt><strong>termsize</strong> = None</dl>

<hr>
Data descriptors inherited from <a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>:<br>
<dl><dt><strong>settings</strong> = &lt;ranger.ext.openstruct.OpenStruct object at 0x154e450&gt;</dl>

</td></tr></table></td></tr></table>
</body></html>
ass="Normal"> . . # copy ebp to esp 330 5d/pop-to-ebp 331 c3/return 332 333 test-next-stream-line-equal-stops-at-newline: 334 # . prologue 335 55/push-ebp 336 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 337 # clear-stream(_test-stream) 338 # . . push args 339 68/push _test-stream/imm32 340 # . . call 341 e8/call clear-stream/disp32 342 # . . discard args 343 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 344 # write(_test-stream, "Abc\ndef") 345 # . . push args 346 68/push "Abc\ndef"/imm32 347 68/push _test-stream/imm32 348 # . . call 349 e8/call write/disp32 350 # . . discard args 351 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 352 # eax = next-stream-line-equal?(_test-stream, "Abc") 353 # . . push args 354 68/push "Abc"/imm32 355 68/push _test-stream/imm32 356 # . . call 357 e8/call next-stream-line-equal?/disp32 358 # . . discard args 359 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 360 # check-ints-equal(eax, 1, msg) 361 # . . push args 362 68/push "F - test-next-stream-line-equal-stops-at-newline"/imm32 363 68/push 1/imm32 364 50/push-eax 365 # . . call 366 e8/call check-ints-equal/disp32 367 # . . discard args 368 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 369 # . epilogue 370 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 371 5d/pop-to-ebp 372 c3/return 373 374 test-next-stream-line-equal-stops-at-newline-2: 375 # . prologue 376 55/push-ebp 377 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 378 # clear-stream(_test-stream) 379 # . . push args 380 68/push _test-stream/imm32 381 # . . call 382 e8/call clear-stream/disp32 383 # . . discard args 384 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 385 # write(_test-stream, "Abc\ndef") 386 # . . push args 387 68/push "Abc\ndef"/imm32 388 68/push _test-stream/imm32 389 # . . call 390 e8/call write/disp32 391 # . . discard args 392 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 393 # eax = next-stream-line-equal?(_test-stream, "def") 394 # . . push args 395 68/push "def"/imm32 396 68/push _test-stream/imm32 397 # . . call 398 e8/call next-stream-line-equal?/disp32 399 # . . discard args 400 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 401 # check-ints-equal(eax, 0, msg) 402 # . . push args 403 68/push "F - test-next-stream-line-equal-stops-at-newline-2"/imm32 404 68/push 0/imm32 405 50/push-eax 406 # . . call 407 e8/call check-ints-equal/disp32 408 # . . discard args 409 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 410 # . epilogue 411 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 412 5d/pop-to-ebp 413 c3/return 414 415 test-next-stream-line-equal-skips-newline: 416 # . prologue 417 55/push-ebp 418 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 419 # clear-stream(_test-stream) 420 # . . push args 421 68/push _test-stream/imm32 422 # . . call 423 e8/call clear-stream/disp32 424 # . . discard args 425 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 426 # write(_test-stream, "Abc\ndef\n") 427 # . . push args 428 68/push "Abc\ndef\n"/imm32 429 68/push _test-stream/imm32 430 # . . call 431 e8/call write/disp32 432 # . . discard args 433 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 434 # next-stream-line-equal?(_test-stream, "Abc") 435 # . . push args 436 68/push "Abc"/imm32 437 68/push _test-stream/imm32 438 # . . call 439 e8/call next-stream-line-equal?/disp32 440 # . . discard args 441 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 442 # eax = next-stream-line-equal?(_test-stream, "def") 443 # . . push args 444 68/push "def"/imm32 445 68/push _test-stream/imm32 446 # . . call 447 e8/call next-stream-line-equal?/disp32 448 # . . discard args 449 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 450 # check-ints-equal(eax, 1, msg) 451 # . . push args 452 68/push "F - test-next-stream-line-equal-skips-newline"/imm32 453 68/push 1/imm32 454 50/push-eax 455 # . . call 456 e8/call check-ints-equal/disp32 457 # . . discard args 458 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 459 # . epilogue 460 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 461 5d/pop-to-ebp 462 c3/return 463 464 test-next-stream-line-equal-handles-final-line: 465 # . prologue 466 55/push-ebp 467 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 468 # clear-stream(_test-stream) 469 # . . push args 470 68/push _test-stream/imm32 471 # . . call 472 e8/call clear-stream/disp32 473 # . . discard args 474 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 475 # write(_test-stream, "Abc\ndef") 476 # . . push args 477 68/push "Abc\ndef"/imm32 478 68/push _test-stream/imm32 479 # . . call 480 e8/call write/disp32 481 # . . discard args 482 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 483 # next-stream-line-equal?(_test-stream, "Abc") 484 # . . push args 485 68/push "Abc"/imm32 486 68/push _test-stream/imm32 487 # . . call 488 e8/call next-stream-line-equal?/disp32 489 # . . discard args 490 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 491 # eax = next-stream-line-equal?(_test-stream, "def") 492 # . . push args 493 68/push "def"/imm32 494 68/push _test-stream/imm32 495 # . . call 496 e8/call next-stream-line-equal?/disp32 497 # . . discard args 498 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 499 # check-ints-equal(eax, 1, msg) 500 # . . push args 501 68/push "F - test-next-stream-line-equal-skips-newline"/imm32 502 68/push 1/imm32 503 50/push-eax 504 # . . call 505 e8/call check-ints-equal/disp32 506 # . . discard args 507 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 508 # . epilogue 509 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 510 5d/pop-to-ebp 511 c3/return 512 513 test-next-stream-line-equal-always-fails-after-Eof: 514 # . prologue 515 55/push-ebp 516 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 517 # clear-stream(_test-stream) 518 # . . push args 519 68/push _test-stream/imm32 520 # . . call 521 e8/call clear-stream/disp32 522 # . . discard args 523 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 524 # write nothing 525 # eax = next-stream-line-equal?(_test-stream, "") 526 # . . push args 527 68/push ""/imm32 528 68/push _test-stream/imm32 529 # . . call 530 e8/call next-stream-line-equal?/disp32 531 # . . discard args 532 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 533 # check-ints-equal(eax, 0, msg) 534 # . . push args 535 68/push "F - test-next-stream-line-equal-always-fails-after-Eof"/imm32 536 68/push 1/imm32 537 50/push-eax 538 # . . call 539 e8/call check-ints-equal/disp32 540 # . . discard args 541 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 542 # eax = next-stream-line-equal?(_test-stream, "") 543 # . . push args 544 68/push ""/imm32 545 68/push _test-stream/imm32 546 # . . call 547 e8/call next-stream-line-equal?/disp32 548 # . . discard args 549 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 550 # check-ints-equal(eax, 0, msg) 551 # . . push args 552 68/push "F - test-next-stream-line-equal-always-fails-after-Eof/2"/imm32 553 68/push 1/imm32 554 50/push-eax 555 # . . call 556 e8/call check-ints-equal/disp32 557 # . . discard args 558 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 559 # . epilogue 560 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 561 5d/pop-to-ebp 562 c3/return 563 564 # helper for later tests 565 check-next-stream-line-equal: # f: (addr stream byte), s: (addr array byte), msg: (addr array byte) 566 # . prologue 567 55/push-ebp 568 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 569 # . save registers 570 50/push-eax 571 # eax = next-stream-line-equal?(f, s) 572 # . . push args 573 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) 574 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 575 # . . call 576 e8/call next-stream-line-equal?/disp32 577 # . . discard args 578 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 579 # check-ints-equal(eax, 1, msg) 580 # . . push args 581 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 . # push *(ebp+16) 582 68/push 1/imm32 583 50/push-eax 584 # . . call 585 e8/call check-ints-equal/disp32 586 # . . discard args 587 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 588 # . restore registers 589 58/pop-to-eax 590 # . epilogue 591 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 592 5d/pop-to-ebp 593 c3/return 594 595 # . . vim:nowrap:textwidth=0