https://github.com/akkartik/mu/blob/master/subx/074print-int-decimal.subx
1
2
3 == code
4
5
6
7
8
9
10
11
12
13
14
15 print-int32-decimal:
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 55/push-EBP
44 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . .
45
46 50/push-EAX
47 51/push-ECX
48 52/push-EDX
49 53/push-EBX
50 57/push-EDI
51
52 89/copy 3/mod/direct 3/rm32/EBX . . . 4/r32/ESP . .
53
54 b9/copy-to-ECX 0xa/imm32
55
56 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 0xc/disp8 .
57 3d/compare-EAX-with 0/imm32
58 7d/jump-if-greater-or-equal $print-int32-decimal:read-loop/disp8
59 $print-int32-decimal:negative:
60 f7 3/subop/negate 3/mod/direct 0/rm32/EAX . . . . . .
61 $print-int32-decimal:read-loop:
62
63 3d/compare-EAX-and 0/imm32
64 74/jump-if-equal $print-int32-decimal:read-break/disp8
65
66 99/sign-extend-EAX-into-EDX
67
68 f7 7/subop/divide-by 3/mod/direct 1/rm32/ECX . . . . . .
69
70 52/push-EDX
71 eb/jump $print-int32-decimal:read-loop/disp8
72 $print-int32-decimal:read-break:
73
74 81 7/subop/compare 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 0/imm32
75 7d/jump-if-greater-or-equal $print-int32-decimal:write/disp8
76 $print-int32-decimal:push-negative:
77 68/push -3/imm32/dash-minus-zero
78
79 $print-int32-decimal:write:
80
81 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 .
82
83 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 8/disp8 .
84 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 1/index/ECX . 1/r32/ECX 0xc/disp8 .
85
86 8b/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . .
87
88 8d/copy-address 1/mod/*+disp8 4/rm32/sib 7/base/EDI 0/index/EAX . 7/r32/EDI 0xc/disp8 .
89 $print-int32-decimal:write-loop:
90
91 39/compare 3/mod/direct 4/rm32/ESP . . . 3/r32/EBX . .
92 74/jump-if-equal $print-int32-decimal:write-break/disp8
93
94 39/compare 3/mod/direct 7/rm32/EDI . . . 1/r32/ECX . .
95 7d/jump-if-greater-or-equal $print-int32-decimal:abort/disp8
96
97 5a/pop-into-EDX
98
99 81 0/subop/add 3/mod/direct 2/rm32/EDX . . . . . 0x30/imm32/zero
100 $print-int32-decimal:write-char:
101
102 88/copy-byte 0/mod/indirect 7/rm32/EDI . . . 2/r32/DL . .
103
104 47/increment-EDI
105
106 40/increment-EAX
107 eb/jump $print-int32-decimal:write-loop/disp8
108 $print-int32-decimal:write-break:
109
110 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 .
111 89/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . .
112 $print-int32-decimal:end:
113
114 5f/pop-to-EDI
115 5b/pop-to-EBX
116 5a/pop-to-EDX
117 59/pop-to-ECX
118 58/pop-to-EAX
119
120 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . .
121 5d/pop-to-EBP
122 c3/return
123
124 $print-int32-decimal:abort:
125
126
127 68/push "print-int32-decimal: out of space"/imm32
128 68/push 2/imm32/stderr
129
130 e8/call _write/disp32
131
132 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
133
134 bb/copy-to-EBX 1/imm32
135 b8/copy-to-EAX 1/imm32/exit
136 cd/syscall 0x80/imm8
137
138
139 test-print-int32-decimal:
140
141
142
143
144 68/push _test-stream/imm32
145
146 e8/call clear-stream/disp32
147
148 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
149
150
151 68/push 9/imm32
152 68/push _test-stream/imm32
153
154 e8/call print-int32-decimal/disp32
155
156 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
157
158
159 68/push "F - test-print-int32-decimal"/imm32
160 68/push "9"/imm32
161 68/push _test-stream/imm32
162
163 e8/call check-stream-equal/disp32
164
165 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
166
167 c3/return
168
169 test-print-int32-decimal-multiple-digits:
170
171
172
173
174 68/push _test-stream/imm32
175
176 e8/call clear-stream/disp32
177
178 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
179
180
181 68/push 0xa/imm32
182 68/push _test-stream/imm32
183
184 e8/call print-int32-decimal/disp32
185
186 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
187
188
189 68/push "F - test-print-int32-decimal-multiple-digits"/imm32
190 68/push "10"/imm32
191 68/push _test-stream/imm32
192
193 e8/call check-stream-equal/disp32
194
195 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32
196
197 c3/return
198
199 test-print-int32-decimal-negative:
200
201
202
203
204 68/push _test-stream/imm32
205
206 e8/call clear-stream/disp32
207
208 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32
209
210
211 68/push -9/imm32
212 68/push _test-stream/imm32
213
214 e8/call print-int32-decimal/disp32
215
216 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32
217 +-- 26 lines: #? # dump _test-stream ---------------------------------------------------------------------------------------------------------------------
243
244
245 68/push "F - test-print-int32-decimal-negative"/imm32
246 68/push "-9"/imm32
247 68/push _test-stream/imm32
248