1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 == code
44
45
46
47
48
49 e8/call run-tests/disp32
50
51 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32
52 b8/copy-to-EAX 1/imm32
53 cd/syscall 0x80/imm8
54
55 read:
56
57 55/push-EBP
58 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
59
60 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 0x08000000/imm32
61 7d/jump-if-greater-or-equal $read:fake/disp8
62
63 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 0xc/disp8 .
64 ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . . 8/disp8 .
65
66 e8/call _read/disp32
67
68 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
69
70 eb/jump $read:end/disp8
71 $read:fake:
72
73
74 56/push-ESI
75 57/push-EDI
76
77 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 8/disp8 .
78
79 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 7/r32/EDI 0xc/disp8 .
80
81
82
83 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
84 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
85 50/push-EAX
86
87 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 .
88 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
89 50/push-EAX
90
91 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 0/r32/EAX 8/disp8 .
92 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
93 50/push-EAX
94
95 8b/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . .
96 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 0/index/EAX . 0/r32/EAX 0xc/disp8 .
97 50/push-EAX
98
99 e8/call _append-4/disp32
100
101 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32
102
103 01/add 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . .
104
105 01/add 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 .
106
107 5f/pop-to-EDI
108 5e/pop-to-ESI
109 $read:end:
110
111 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
112 5d/pop-to-EBP
113 c3/return
114
115
116
117
118
119
120
121 _read:
122
123 55/push-EBP
124 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
125
126 51/push-ECX
127 52/push-EDX
128 53/push-EBX
129 56/push-ESI
130
131 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 6/r32/ESI 0xc/disp8 .
132
133 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
134
135 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 2/r32/EDX 8/disp8 .
136
137
138 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none . 3/r32/EBX 8/disp8 .
139
140 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 1/r32/ECX 0xc/disp8 .
141
142 29/subtract 3/mod/direct 2/rm32/EDX . . . 0/r32/EAX . .
143
144 b8/copy-to-EAX 3/imm32/read
145 cd/syscall 0x80/imm8
146
147 01/add 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . .
148
149 5e/pop-to-ESI
150 5b/pop-to-EBX
151 5a/pop-to-EDX
152 59/pop-to-ECX
153
154 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
155 5d/pop-to-EBP
156 c3/return
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 test-read-single:
182
183
184 68/push _test-stream/imm32
185
186 e8/call clear-stream/disp32
187
188 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
189
190
191 68/push _test-stream-buffer/imm32
192
193 e8/call clear-stream/disp32
194
195 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
196
197
198 68/push "Ab"/imm32
199 68/push _test-stream/imm32
200
201 e8/call write/disp32
202
203 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
204
205
206 68/push _test-stream-buffer/imm32
207 68/push _test-stream/imm32
208
209 e8/call read/disp32
210
211 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
212
213
214 68/push "F - test-read-single: return EAX"/imm32
215 68/push 2/imm32
216 50/push-EAX
217
218 e8/call check-ints-equal/disp32
219
220 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
221
222
223 68/push "F - test-read-single"/imm32
224 68/push 0x006241/imm32/Ab
225
226 b8/copy-to-EAX _test-stream-buffer/imm32
227 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 .
228
229 e8/call check-ints-equal/disp32
230
231 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
232
233 c3/return
234
235 test-read-is-stateful:
236
237
238
239 68/push _test-stream/imm32
240
241 e8/call clear-stream/disp32
242
243 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
244
245
246 68/push _test-stream-buffer/imm32
247
248 e8/call clear-stream/disp32
249
250 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
251
252
253 68/push "C"/imm32
254 68/push _test-stream/imm32
255
256 e8/call write/disp32
257
258 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
259
260
261 68/push _test-stream-buffer/imm32
262 68/push _test-stream/imm32
263
264 e8/call read/disp32
265
266 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
267
268
269 68/push "D"/imm32
270 68/push _test-stream/imm32
271
272 e8/call write/disp32
273
274 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
275
276
277 68/push _test-stream-buffer/imm32
278 68/push _test-stream/imm32
279
280 e8/call read/disp32
281
282 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
283
284
285 68/push "F - test-read-is-stateful"/imm32
286 68/push 0x00004443/imm32/C-D
287
288 b8/copy-to-EAX _test-stream-buffer/imm32
289 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 .
290
291 e8/call check-ints-equal/disp32
292
293 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
294
295 c3/return
296
297 test-read-returns-0-on-end-of-file:
298
299
300
301 68/push _test-stream/imm32
302
303 e8/call clear-stream/disp32
304
305 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
306
307
308 68/push _test-stream-buffer/imm32
309
310 e8/call clear-stream/disp32
311
312 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
313
314
315 68/push "Ab"/imm32
316 68/push _test-stream/imm32
317
318 e8/call write/disp32
319
320 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
321
322
323
324 68/push _test-stream-buffer/imm32
325 68/push _test-stream/imm32
326
327 e8/call read/disp32
328
329 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
330
331
332
333 68/push _test-stream-buffer/imm32
334 68/push _test-stream/imm32
335
336 e8/call read/disp32
337
338 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
339
340
341 68/push "F - test-read-returns-0-on-end-of-file"/imm32
342 68/push 0/imm32
343 50/push-EAX
344
345 e8/call check-ints-equal/disp32
346
347 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
348
349 c3/return
350
351 == data
352
353 _test-stream-buffer:
354
355 00 00 00 00
356
357 00 00 00 00
358
359 08 00 00 00
360
361 00 00 00 00 00 00 00 00
362
363