https://github.com/akkartik/mu/blob/main/105string-equal.subx
1
2
3 == code
4
5
6
7
8 string-equal?:
9
10
11
12
13
14 55/push-ebp
15 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
16
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 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . .
26 $string-equal?:sizes:
27
28 39/compare 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . .
29 b8/copy-to-eax 0/imm32/false
30 75/jump-if-!= $string-equal?:end/disp8
31 $string-equal?:contents:
32
33
34 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 .
35 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 .
36
37 e8/call string-starts-with?/disp32
38
39 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
40 $string-equal?:end:
41
42 5f/pop-to-edi
43 5e/pop-to-esi
44 59/pop-to-ecx
45
46 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
47 5d/pop-to-ebp
48 c3/return
49
50 string-starts-with?:
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 55/push-ebp
72 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
73
74 51/push-ecx
75 52/push-edx
76 56/push-esi
77 57/push-edi
78
79 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 .
80
81 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 .
82
83 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . .
84 $string-starts-with?:sizes:
85
86 39/compare 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . .
87 7c/jump-if-< $string-starts-with?:false/disp8
88
89 81 0/subop/add 3/mod/direct 6/rm32/esi . . . . . 4/imm32
90
91 81 0/subop/add 3/mod/direct 7/rm32/edi . . . . . 4/imm32
92
93 01/add 3/mod/direct 1/rm32/ecx . . . 7/r32/edi . .
94
95 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . .
96
97 31/xor 3/mod/direct 2/rm32/edx . . . 2/r32/edx . .
98 $string-starts-with?:loop:
99
100 39/compare 3/mod/direct 7/rm32/edi . . . 1/r32/ecx . .
101 73/jump-if-addr>= $string-starts-with?:true/disp8
102
103 8a/copy-byte 0/mod/indirect 6/rm32/esi . . . 0/r32/AL . .
104
105 8a/copy-byte 0/mod/indirect 7/rm32/edi . . . 2/r32/DL . .
106
107 39/compare 3/mod/direct 0/rm32/eax . . . 2/r32/edx . .
108 75/jump-if-!= $string-starts-with?:false/disp8
109
110 46/increment-esi
111
112 47/increment-edi
113 eb/jump $string-starts-with?:loop/disp8
114 $string-starts-with?:true:
115 b8/copy-to-eax 1/imm32
116 eb/jump $string-starts-with?:end/disp8
117 $string-starts-with?:false:
118 b8/copy-to-eax 0/imm32
119 $string-starts-with?:end:
120
121 5f/pop-to-edi
122 5e/pop-to-esi
123 5a/pop-to-edx
124 59/pop-to-ecx
125
126 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
127 5d/pop-to-ebp
128 c3/return
129
130
131
132 test-compare-empty-with-empty-string:
133
134
135 68/push ""/imm32
136 68/push ""/imm32
137
138 e8/call string-equal?/disp32
139
140 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
141
142
143 68/push "F - test-compare-empty-with-empty-string"/imm32
144 68/push 1/imm32/true
145 50/push-eax
146
147 e8/call check-ints-equal/disp32
148
149 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
150 c3/return
151
152 test-compare-empty-with-non-empty-string:
153
154
155 68/push "Abc"/imm32
156 68/push ""/imm32
157
158 e8/call string-equal?/disp32
159
160 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
161
162
163 68/push "F - test-compare-empty-with-non-empty-string"/imm32
164 68/push 0/imm32/false
165 50/push-eax
166
167 e8/call check-ints-equal/disp32
168
169 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
170 c3/return
171
172 test-compare-equal-strings:
173
174
175 68/push "Abc"/imm32
176 68/push "Abc"/imm32
177
178 e8/call string-equal?/disp32
179
180 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
181
182
183 68/push "F - test-compare-equal-strings"/imm32
184 68/push 1/imm32/true
185 50/push-eax
186
187 e8/call check-ints-equal/disp32
188
189 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
190 c3/return
191
192 test-compare-inequal-strings-equal-sizes:
193
194
195 68/push "Adc"/imm32
196 68/push "Abc"/imm32
197
198 e8/call string-equal?/disp32
199
200 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
201
202
203 68/push "F - test-compare-inequal-strings-equal-sizes"/imm32
204 68/push 0/imm32/false
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 c3/return
211
212
213 check-strings-equal:
214
215 55/push-ebp
216 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . .
217
218 50/push-eax
219
220
221 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 .
222 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 .
223
224 e8/call string-equal?/disp32
225
226 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
227
228
229 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 .
230 68/push 1/imm32
231 50/push-eax
232
233 e8/call check-ints-equal/disp32
234
235 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32
236 $check-strings-equal:end:
237
238 58/pop-to-eax
239
240 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . .
241 5d/pop-to-ebp
242 c3/return
243
244
245 test-check-strings-equal:
246
247
248 68/push "Abc"/imm32
249 68/push "Abc"/imm32
250
251 e8/call check-strings-equal/disp32
252
253 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32
254 c3/return
255
256