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