https://github.com/akkartik/mu/blob/main/127next-word.subx
  1 
  2 
  3 == code
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 next-word:  
 12     
 13     55/push-ebp
 14     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
 15     
 16     50/push-eax
 17     51/push-ecx
 18     56/push-esi
 19     57/push-edi
 20     
 21     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   8/disp8         .                 
 22     
 23     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   0xc/disp8       .                 
 24     
 25     
 26     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 
 27     
 28     e8/call  skip-chars-matching-whitespace/disp32
 29     
 30     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
 31 $next-word:check0:
 32     
 33     
 34     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           0/r32/eax   4/disp8         .                 
 35     
 36     3b/compare                      0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 
 37     7c/jump-if-<  $next-word:check-for-comment/disp8
 38     
 39     c7          0/subop/copy        0/mod/direct    7/rm32/edi    .           .             .           .           .               0/imm32           
 40     c7          0/subop/copy        1/mod/*+disp8   7/rm32/edi    .           .             .           .           4/disp8         0/imm32           
 41     e9/jump  $next-word:end/disp32
 42 $next-word:check-for-comment:
 43     
 44     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 
 45     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 
 46     89/copy                         0/mod/indirect  7/rm32/edi    .           .             .           0/r32/eax   .               .                 
 47     
 48     
 49     31/xor                          3/mod/direct    0/rm32/eax    .           .             .           0/r32/eax   .               .                 
 50     8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/AL    0xc/disp8       .                 
 51     
 52     3d/compare-eax-and  0x23/imm32/pound
 53     0f 85/jump-if-!=  $next-word:regular-word/disp32
 54 $next-word:comment:
 55     
 56     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 
 57     89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 
 58     
 59     8b/copy                         0/mod/indirect  6/rm32/esi    .           .             .           1/r32/ecx   .               .                 
 60 $next-word:comment-loop:
 61     
 62     39/compare                      1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 
 63     0f 8d/jump-if->=  $next-word:comment-break/disp32
 64     
 65     ff          0/subop/increment   1/mod/*+disp8   6/rm32/esi    .           .             .           .           4/disp8         .                 
 66     
 67     ff          0/subop/increment   1/mod/*+disp8   7/rm32/edi    .           .             .           .           4/disp8         .                 
 68     
 69     8b/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 
 70     8a/copy-byte                    0/mod/indirect  0/rm32/eax    .           .             .           0/r32/AL    .               .                 
 71     25/and-eax-with  0xff/imm32
 72     3d/compare-eax-and  0xa/imm32/newline
 73     0f 84/jump-if-=  $next-word:comment-break/disp32
 74     
 75     e9/jump  $next-word:comment-loop/disp32
 76 $next-word:comment-break:
 77     
 78     e9/jump  $next-word:end/disp32
 79 $next-word:regular-word:
 80     
 81     
 82     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 
 83     
 84     e8/call  skip-chars-not-matching-whitespace/disp32
 85     
 86     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
 87     
 88     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 
 89     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 
 90     89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 
 91 $next-word:end:
 92     
 93     5f/pop-to-edi
 94     5e/pop-to-esi
 95     59/pop-to-ecx
 96     58/pop-to-eax
 97     
 98     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
 99     5d/pop-to-ebp
100     c3/return
101 
102 test-next-word:
103     
104     55/push-ebp
105     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
106     
107     
108     
109     68/push  _test-stream/imm32
110     
111     e8/call  clear-stream/disp32
112     
113     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
114     
115     68/push  0/imm32/end
116     68/push  0/imm32/start
117     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 
118     
119     
120     68/push  "  ab"/imm32
121     68/push  _test-stream/imm32
122     
123     e8/call  write/disp32
124     
125     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
126     
127     
128     51/push-ecx
129     68/push  _test-stream/imm32
130     
131     e8/call  next-word/disp32
132     
133     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
134     
135     
136     
137     68/push  "F - test-next-word: start"/imm32
138     68/push  0xe/imm32
139     
140     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 
141     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-stream/imm32 
142     50/push-eax
143     
144     e8/call  check-ints-equal/disp32
145     
146     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
147     
148     
149     
150     68/push  "F - test-next-word: end"/imm32
151     68/push  0x10/imm32
152     
153     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 
154     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-stream/imm32 
155     50/push-eax
156     
157     e8/call  check-ints-equal/disp32
158     
159     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
160     
161     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
162     5d/pop-to-ebp
163     c3/return
164 
165 test-next-word-returns-whole-comment:
166     
167     55/push-ebp
168     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
169     
170     
171     
172     68/push  _test-stream/imm32
173     
174     e8/call  clear-stream/disp32
175     
176     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
177     
178     68/push  0/imm32/end
179     68/push  0/imm32/start
180     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 
181     
182     
183     68/push  "  # a"/imm32
184     68/push  _test-stream/imm32
185     
186     e8/call  write/disp32
187     
188     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
189     
190     
191     51/push-ecx
192     68/push  _test-stream/imm32
193     
194     e8/call  next-word/disp32
195     
196     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
197     
198     
199     
200     68/push  "F - test-next-word-returns-whole-comment: start"/imm32
201     68/push  0xe/imm32
202     
203     8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 
204     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-stream/imm32 
205     50/push-eax
206     
207     e8/call  check-ints-equal/disp32
208     
209     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
210     
211     
212     
213     68/push  "F - test-next-word-returns-whole-comment: end"/imm32
214     68/push  0x11/imm32
215     
216     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 
217     81          5/subop/subtract    3/mod/direct    0/rm32/eax    .           .             .           .           .               _test-stream/imm32 
218     50/push-eax
219     
220     e8/call  check-ints-equal/disp32
221     
222     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
223     
224     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
225     5d/pop-to-ebp
226     c3/return
227 
228 test-next-word-returns-empty-string-on-eof:
229     
230     55/push-ebp
231     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
232     
233     
234     
235     68/push  _test-stream/imm32
236     
237     e8/call  clear-stream/disp32
238     
239     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
240     
241     68/push  0/imm32/end
242     68/push  0/imm32/start
243     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 
244     
245     
246     
247     51/push-ecx
248     68/push  _test-stream/imm32
249     
250     e8/call  next-word/disp32
251     
252     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
253     
254     
255     68/push  "F - test-next-word-returns-empty-string-on-eof"/imm32
256     68/push  0/imm32
257     
258     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 
259     2b/subtract                     0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 
260     50/push-eax
261     
262     e8/call  check-ints-equal/disp32
263     
264     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
265     
266     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
267     5d/pop-to-ebp
268     c3/return
269 
270 test-next-word-returns-empty-string-on-newline:
271     
272     55/push-ebp
273     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
274     
275     
276     
277     68/push  _test-stream/imm32
278     
279     e8/call  clear-stream/disp32
280     
281     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
282     
283     68/push  0/imm32/end
284     68/push  0/imm32/start
285     89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 
286     
287     
288     68/push  "  \n"/imm32
289     68/push  _test-stream/imm32
290     
291     e8/call  write/disp32
292     
293     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
294     
295     
296     51/push-ecx
297     68/push  _test-stream/imm32
298     
299     e8/call  next-word/disp32
300     
301     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           
302     
303     
304     68/push  "F - test-next-word-returns-empty-string-on-newline"/imm32
305     68/push  0/imm32
306     
307     8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           0/r32/eax   4/disp8         .                 
308     2b/subtract                     0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 
309     50/push-eax
310     
311     e8/call  check-ints-equal/disp32
312     
313     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         
314     
315     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
316     5d/pop-to-ebp
317     c3/return
318 
319 
320 
321 next-raw-word:  
322     
323     55/push-ebp
324     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 
325     
326     50/push-eax
327     51/push-ecx
328     56/push-esi
329     57/push-edi
330     
331     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   8/disp8         .                 
332     
333     8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   0xc/disp8       .                 
334     
335     
336     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 
337     
338     e8/call  skip-chars-matching-whitespace/disp32
339     
340     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
341 $next-raw-word:check0:
342     
343     
344     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           0/r32/eax   4/disp8         .                 
345     
346     3b/compare                      0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 
347     7c/jump-if-<  $next-raw-word:word-exists/disp8
348     
349     c7          0/subop/copy        0/mod/direct    7/rm32/edi    .           .             .           .           .               0/imm32           
350     c7          0/subop/copy        1/mod/*+disp8   7/rm32/edi    .           .             .           .           4/disp8         0/imm32           
351     eb/jump  $next-raw-word:end/disp8
352 $next-raw-word:word-exists:
353     
354     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 
355     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 
356     89/copy                         0/mod/indirect  7/rm32/edi    .           .             .           0/r32/eax   .               .                 
357     
358     
359     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 
360     
361     e8/call  skip-chars-not-matching-whitespace/disp32
362     
363     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           
364     
365     8b/copy                         1/mod/*+disp8   6/rm32/esi    .           .             .           1/r32/ecx   4/disp8         .                 
366     8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 
367     89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 
368 $next-raw-word:end:
369     
370     5f/pop-to-edi
371     5e/pop-to-esi
372     59/pop-to-ecx
373     58/pop-to-eax
374     
375     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 
376     5d/pop-to-ebp
377     c3/return