From 3350c34a74844e21ea69077e01efff3bae64bdcd Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Tue, 23 Mar 2021 17:31:08 -0700 Subject: . --- html/linux/135next-word-or-string.subx.html | 479 ++++++++++++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 html/linux/135next-word-or-string.subx.html (limited to 'html/linux/135next-word-or-string.subx.html') diff --git a/html/linux/135next-word-or-string.subx.html b/html/linux/135next-word-or-string.subx.html new file mode 100644 index 00000000..a4a349f5 --- /dev/null +++ b/html/linux/135next-word-or-string.subx.html @@ -0,0 +1,479 @@ + + + + +Mu - linux/135next-word-or-string.subx + + + + + + + + + + +https://github.com/akkartik/mu/blob/main/linux/135next-word-or-string.subx +
+  1 == code
+  2 #   instruction                     effective address                                                   register    displacement    immediate
+  3 # . op          subop               mod             rm32          base        index         scale       r32
+  4 # . 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
+  5 
+  6 # (re)compute the bounds of the next word or string literal in the line
+  7 # return empty string on reaching end of file
+  8 next-word-or-string:  # line: (addr stream byte), out: (addr slice)
+  9     # . prologue
+ 10     55/push-ebp
+ 11     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+ 12     # . save registers
+ 13     50/push-eax
+ 14     51/push-ecx
+ 15     56/push-esi
+ 16     57/push-edi
+ 17     # esi = line
+ 18     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   8/disp8         .                 # copy *(ebp+8) to esi
+ 19     # edi = out
+ 20     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   0xc/disp8       .                 # copy *(ebp+12) to edi
+ 21     # skip-chars-matching(line, ' ')
+ 22     # . . push args
+ 23     68/push  0x20/imm32/space
+ 24     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
+ 25     # . . call
+ 26     e8/call  skip-chars-matching/disp32
+ 27     # . . discard args
+ 28     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+ 29 $next-word-or-string:check0:
+ 30     # if (line->read >= line->write) clear out and return
+ 31     # . eax = line->read
+ 32     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           0/r32/eax   4/disp8         .                 # copy *(esi+4) to eax
+ 33     # . if (eax < line->write) goto next check
+ 34     3b/compare                      0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 # compare eax with *esi
+ 35     7c/jump-if-<  $next-word-or-string:check-for-comment/disp8
+ 36     # . return out
+ 37     c7          0/subop/copy        0/mod/direct    7/rm32/edi    .           .             .           .           .               0/imm32           # copy to *edi
+ 38     c7          0/subop/copy        1/mod/*+disp8   7/rm32/edi    .           .             .           .           4/disp8         0/imm32           # copy to *(edi+4)
+ 39     eb/jump  $next-word-or-string:end/disp8
+ 40 $next-word-or-string:check-for-comment:
+ 41     # out->start = &line->data[line->read]
+ 42     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 # copy *(esi+4) to ecx
+ 43     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 # copy esi+ecx+12 to eax
+ 44     89/copy                         0/mod/indirect  7/rm32/edi    .           .             .           0/r32/eax   .               .                 # copy eax to *edi
+ 45     # if (line->data[line->read] != '#') goto next check
+ 46     # . eax = line->data[line->read]
+ 47     31/xor                          3/mod/direct    0/rm32/eax    .           .             .           0/r32/eax   .               .                 # clear eax
+ 48     8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/AL    0xc/disp8       .                 # copy byte at *(esi+ecx+12) to AL
+ 49     # . compare
+ 50     3d/compare-eax-and  0x23/imm32/pound
+ 51     75/jump-if-!=  $next-word-or-string:check-for-string-literal/disp8
+ 52 $next-word-or-string:comment:
+ 53     # out->end = &line->data[line->write]
+ 54     8b/copy                         0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 # copy *esi to eax
+ 55     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  0/index/eax   .           0/r32/eax   0xc/disp8       .                 # copy esi+eax+12 to eax
+ 56     89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 # copy eax to *(edi+4)
+ 57     # line->read = line->write  # skip rest of line
+ 58     8b/copy                         0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 # copy *esi to eax
+ 59     89/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           0/r32/eax   4/disp8         .                 # copy eax to *(esi+4)
+ 60     # return
+ 61     eb/jump  $next-word-or-string:end/disp8
+ 62 $next-word-or-string:check-for-string-literal:
+ 63     # if (line->data[line->read] != '"') goto next check
+ 64     # . eax = line->data[line->read]
+ 65     31/xor                          3/mod/direct    0/rm32/eax    .           .             .           0/r32/eax   .               .                 # clear eax
+ 66     8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/AL    0xc/disp8       .                 # copy byte at *(esi+ecx+12) to AL
+ 67     # . compare
+ 68     3d/compare-eax-and  0x22/imm32/dquote
+ 69     75/jump-if-!=  $next-word-or-string:regular-word/disp8
+ 70 $next-word-or-string:string-literal:
+ 71     # skip-string(line)
+ 72     # . . push args
+ 73     56/push-esi
+ 74     # . . call
+ 75     e8/call  skip-string/disp32
+ 76     # . . discard args
+ 77     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+ 78     # fall through
+ 79 $next-word-or-string:regular-word:
+ 80     # skip-chars-not-matching-whitespace(line)  # including trailing newline
+ 81     # . . push args
+ 82     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
+ 83     # . . call
+ 84     e8/call  skip-chars-not-matching-whitespace/disp32
+ 85     # . . discard args
+ 86     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+ 87     # out->end = &line->data[line->read]
+ 88     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 # copy *(esi+4) to ecx
+ 89     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 # copy esi+ecx+12 to eax
+ 90     89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 # copy eax to *(edi+4)
+ 91 $next-word-or-string:end:
+ 92     # . restore registers
+ 93     5f/pop-to-edi
+ 94     5e/pop-to-esi
+ 95     59/pop-to-ecx
+ 96     58/pop-to-eax
+ 97     # . epilogue
+ 98     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+ 99     5d/pop-to-ebp
+100     c3/return
+101 
+102 test-next-word-or-string:
+103     # . prologue
+104     55/push-ebp
+105     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+106     # setup
+107     # . clear-stream(_test-input-stream)
+108     # . . push args
+109     68/push  _test-input-stream/imm32
+110     # . . call
+111     e8/call  clear-stream/disp32
+112     # . . discard args
+113     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+114     # var slice/ecx: slice
+115     68/push  0/imm32/end
+116     68/push  0/imm32/start
+117     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
+118     # write(_test-input-stream, "  ab")
+119     # . . push args
+120     68/push  "  ab"/imm32
+121     68/push  _test-input-stream/imm32
+122     # . . call
+123     e8/call  write/disp32
+124     # . . discard args
+125     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+126     # next-word-or-string(_test-input-stream, slice)
+127     # . . push args
+128     51/push-ecx
+129     68/push  _test-input-stream/imm32
+130     # . . call
+131     e8/call  next-word-or-string/disp32
+132     # . . discard args
+133     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+134     # check-ints-equal(_test-input-stream->read, 4, msg)
+135     # . . push args
+136     68/push  "F - test-next-word-or-string/updates-stream-read-correctly"/imm32
+137     68/push  4/imm32
+138     b8/copy-to-eax  _test-input-stream/imm32
+139     ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
+140     # . . call
+141     e8/call  check-ints-equal/disp32
+142     # . . discard args
+143     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+144     # check-ints-equal(slice->start - _test-input-stream->data, 2, msg)
+145     # . check-ints-equal(slice->start - _test-input-stream, 14, msg)
+146     # . . push args
+147     68/push  "F - test-next-word-or-string: start"/imm32
+148     68/push  0xe/imm32
+149     # . . push slice->start - _test-input-stream
+150     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # copy *ecx to eax
+151     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+152     50/push-eax
+153     # . . call
+154     e8/call  check-ints-equal/disp32
+155     # . . discard args
+156     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+157     # check-ints-equal(slice->end - _test-input-stream->data, 4, msg)
+158     # . check-ints-equal(slice->end - _test-input-stream, 16, msg)
+159     # . . push args
+160     68/push  "F - test-next-word-or-string: end"/imm32
+161     68/push  0x10/imm32
+162     # . . push slice->end - _test-input-stream
+163     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 # copy *(ecx+4) to eax
+164     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+165     50/push-eax
+166     # . . call
+167     e8/call  check-ints-equal/disp32
+168     # . . discard args
+169     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+170     # . epilogue
+171     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+172     5d/pop-to-ebp
+173     c3/return
+174 
+175 test-next-word-or-string-returns-whole-comment:
+176     # . prologue
+177     55/push-ebp
+178     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+179     # setup
+180     # . clear-stream(_test-input-stream)
+181     # . . push args
+182     68/push  _test-input-stream/imm32
+183     # . . call
+184     e8/call  clear-stream/disp32
+185     # . . discard args
+186     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+187     # var slice/ecx: slice
+188     68/push  0/imm32/end
+189     68/push  0/imm32/start
+190     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
+191     # write(_test-input-stream, "  # a")
+192     # . . push args
+193     68/push  "  # a"/imm32
+194     68/push  _test-input-stream/imm32
+195     # . . call
+196     e8/call  write/disp32
+197     # . . discard args
+198     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+199     # next-word-or-string(_test-input-stream, slice)
+200     # . . push args
+201     51/push-ecx
+202     68/push  _test-input-stream/imm32
+203     # . . call
+204     e8/call  next-word-or-string/disp32
+205     # . . discard args
+206     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+207     # check-ints-equal(_test-input-stream->read, 5, msg)
+208     # . . push args
+209     68/push  "F - test-next-word-or-string-returns-whole-comment/updates-stream-read-correctly"/imm32
+210     68/push  5/imm32
+211     b8/copy-to-eax  _test-input-stream/imm32
+212     ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
+213     # . . call
+214     e8/call  check-ints-equal/disp32
+215     # . . discard args
+216     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+217     # check-ints-equal(slice->start - _test-input-stream->data, 2, msg)
+218     # . check-ints-equal(slice->start - _test-input-stream, 14, msg)
+219     # . . push args
+220     68/push  "F - test-next-word-or-string-returns-whole-comment: start"/imm32
+221     68/push  0xe/imm32
+222     # . . push slice->start - _test-input-stream
+223     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # copy *ecx to eax
+224     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+225     50/push-eax
+226     # . . call
+227     e8/call  check-ints-equal/disp32
+228     # . . discard args
+229     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+230     # check-ints-equal(slice->end - _test-input-stream->data, 5, msg)
+231     # . check-ints-equal(slice->end - _test-input-stream, 17, msg)
+232     # . . push args
+233     68/push  "F - test-next-word-or-string-returns-whole-comment: end"/imm32
+234     68/push  0x11/imm32
+235     # . . push slice->end - _test-input-stream
+236     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 # copy *(ecx+4) to eax
+237     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+238     50/push-eax
+239     # . . call
+240     e8/call  check-ints-equal/disp32
+241     # . . discard args
+242     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+243     # . epilogue
+244     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+245     5d/pop-to-ebp
+246     c3/return
+247 
+248 test-next-word-or-string-returns-empty-slice-on-eof:
+249     # . prologue
+250     55/push-ebp
+251     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+252     # setup
+253     # . clear-stream(_test-input-stream)
+254     # . . push args
+255     68/push  _test-input-stream/imm32
+256     # . . call
+257     e8/call  clear-stream/disp32
+258     # . . discard args
+259     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+260     # var slice/ecx: slice
+261     68/push  0/imm32/end
+262     68/push  0/imm32/start
+263     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
+264     # write nothing to _test-input-stream
+265     # next-word-or-string(_test-input-stream, slice)
+266     # . . push args
+267     51/push-ecx
+268     68/push  _test-input-stream/imm32
+269     # . . call
+270     e8/call  next-word-or-string/disp32
+271     # . . discard args
+272     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+273     # check-ints-equal(slice->end - slice->start, 0, msg)
+274     # . . push args
+275     68/push  "F - test-next-word-or-string-returns-empty-string-on-eof"/imm32
+276     68/push  0/imm32
+277     # . . push slice->end - slice->start
+278     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 # copy *(ecx+4) to eax
+279     2b/subtract                     0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # subtract *ecx from eax
+280     50/push-eax
+281     # . . call
+282     e8/call  check-ints-equal/disp32
+283     # . . discard args
+284     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+285     # . epilogue
+286     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+287     5d/pop-to-ebp
+288     c3/return
+289 
+290 test-next-word-or-string-returns-string-literal:
+291     # . prologue
+292     55/push-ebp
+293     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+294     # setup
+295     # . clear-stream(_test-input-stream)
+296     # . . push args
+297     68/push  _test-input-stream/imm32
+298     # . . call
+299     e8/call  clear-stream/disp32
+300     # . . discard args
+301     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+302     # var slice/ecx: slice
+303     68/push  0/imm32/end
+304     68/push  0/imm32/start
+305     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
+306     # write(_test-input-stream, " \"a b\"/imm32 ")
+307     # . . push args
+308     68/push  " \"a b\"/imm32 "/imm32
+309     68/push  _test-input-stream/imm32
+310     # . . call
+311     e8/call  write/disp32
+312     # . . discard args
+313     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+314     # next-word-or-string(_test-input-stream, slice)
+315     # . . push args
+316     51/push-ecx
+317     68/push  _test-input-stream/imm32
+318     # . . call
+319     e8/call  next-word-or-string/disp32
+320     # . . discard args
+321     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+322     # check-ints-equal(slice->start - _test-input-stream->data, 1, msg)
+323     # . check-ints-equal(slice->start - _test-input-stream, 13, msg)
+324     # . . push args
+325     68/push  "F - test-next-word-or-string-returns-string-literal: start"/imm32
+326     68/push  0xd/imm32
+327     # . . push slice->start - _test-input-stream
+328     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # copy *ecx to eax
+329     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+330     50/push-eax
+331     # . . call
+332     e8/call  check-ints-equal/disp32
+333     # . . discard args
+334     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+335     # check-ints-equal(slice->end - _test-input-stream->data, 12, msg)
+336     # . check-ints-equal(slice->end - _test-input-stream, 24, msg)
+337     # . . push args
+338     68/push  "F - test-next-word-or-string-returns-string-literal: end"/imm32
+339     68/push  0x18/imm32
+340     # . . push slice->end - _test-input-stream
+341     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 # copy *(ecx+4) to eax
+342     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+343     50/push-eax
+344     # . . call
+345     e8/call  check-ints-equal/disp32
+346     # . . discard args
+347     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+348     # . epilogue
+349     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+350     5d/pop-to-ebp
+351     c3/return
+352 
+353 test-next-word-or-string-returns-string-with-escapes:
+354     # . prologue
+355     55/push-ebp
+356     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
+357     # setup
+358     # . clear-stream(_test-input-stream)
+359     # . . push args
+360     68/push  _test-input-stream/imm32
+361     # . . call
+362     e8/call  clear-stream/disp32
+363     # . . discard args
+364     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
+365     # var slice/ecx: slice
+366     68/push  0/imm32/end
+367     68/push  0/imm32/start
+368     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
+369     # write(_test-input-stream, " \"a\\\"b\"/x")
+370     # . . push args
+371     68/push  " \"a\\\"b\"/x"/imm32
+372     68/push  _test-input-stream/imm32
+373     # . . call
+374     e8/call  write/disp32
+375     # . . discard args
+376     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+377     # next-word-or-string(_test-input-stream, slice)
+378     # . . push args
+379     51/push-ecx
+380     68/push  _test-input-stream/imm32
+381     # . . call
+382     e8/call  next-word-or-string/disp32
+383     # . . discard args
+384     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
+385     # check-ints-equal(slice->start - _test-input-stream->data, 1, msg)
+386     # . check-ints-equal(slice->start - _test-input-stream, 13, msg)
+387     # . . push args
+388     68/push  "F - test-next-word-or-string-returns-string-with-escapes: start"/imm32
+389     68/push  0xd/imm32
+390     # . . push slice->start - _test-input-stream
+391     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # copy *ecx to eax
+392     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+393     50/push-eax
+394     # . . call
+395     e8/call  check-ints-equal/disp32
+396     # . . discard args
+397     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+398     # check-ints-equal(slice->end - _test-input-stream->data, 9, msg)
+399     # . check-ints-equal(slice->end - _test-input-stream, 21, msg)
+400     # . . push args
+401     68/push  "F - test-next-word-or-string-returns-string-with-escapes: end"/imm32
+402     68/push  0x15/imm32
+403     # . . push slice->end - _test-input-stream
+404     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 # copy *(ecx+4) to eax
+405     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-input-stream/imm32 # subtract from eax
+406     50/push-eax
+407     # . . call
+408     e8/call  check-ints-equal/disp32
+409     # . . discard args
+410     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
+411     # . epilogue
+412     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
+413     5d/pop-to-ebp
+414     c3/return
+415 
+416 # . . vim:nowrap:textwidth=0
+
+ + + -- cgit 1.4.1-2-gfad0