Rev 4865 | Rev 4882 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4865 | Rev 4875 | ||
---|---|---|---|
1 | macro test_err |
1 | macro test_err |
2 | { local ..not_error |
2 | { local ..not_error |
3 | cmp [error_n], 0 |
3 | cmp [error_n], 0 |
4 | je ..not_error |
4 | je ..not_error |
5 | ret |
5 | ret |
6 | ..not_error: |
6 | ..not_error: |
7 | } |
7 | } |
8 | 8 | ||
9 | macro set_err err |
9 | macro set_err err |
10 | { |
10 | { |
11 | mov [error_n], err |
11 | mov [error_n], err |
12 | ret |
12 | ret |
13 | } |
13 | } |
14 | - | ||
15 | proc convert_to_str uses ebx ecx edx esi edi, _num, _str |
- | |
16 | mov eax, [_num] |
- | |
17 | mov esi, [_str] |
- | |
18 | mov edi, 0 |
- | |
19 | mov ecx, eax |
- | |
20 | and ecx, 1 shl 31 |
- | |
21 | cmp ecx, 0 |
- | |
22 | je @f |
- | |
23 | mov [esi], byte "-" |
- | |
24 | inc esi |
- | |
25 | inc edi |
- | |
26 | not eax |
- | |
27 | inc eax |
- | |
28 | @@: |
- | |
29 | mov ebx, 10 |
- | |
30 | xor ecx, ecx |
- | |
31 | @@: |
- | |
32 | xor edx, edx |
- | |
33 | div ebx |
- | |
34 | push edx |
- | |
35 | inc ecx |
- | |
36 | inc edi |
- | |
37 | cmp eax, 0 |
- | |
38 | jne @b |
- | |
39 | @@: |
- | |
40 | pop eax |
- | |
41 | add al, "0" |
- | |
42 | mov [esi], al |
- | |
43 | inc esi |
- | |
44 | loop @b |
- | |
45 | mov [esi], byte 0 |
- | |
46 | mov eax, edi |
- | |
47 | ret |
- | |
48 | endp |
- | |
49 | 14 | ||
50 | ; --------------------------- |
15 | ; --------------------------- |
51 | 16 | ||
52 | proc parse |
17 | proc parse |
53 | mov [exp_pos], 0 |
18 | mov [exp_pos], 0 |
- | 19 | stdcall skip_spaces |
|
- | 20 | ||
- | 21 | mov ebx, exp |
|
- | 22 | add ebx, [exp_pos] |
|
- | 23 | cmp [ebx], byte 0 |
|
- | 24 | je .null_exp |
|
- | 25 | ||
- | 26 | mov [exp_lvl], 0 |
|
54 | mov [error_n], 0 |
27 | mov [error_n], 0 |
55 | stdcall parse_lvl0 |
28 | stdcall parse_lvl0 |
56 | ret |
29 | ret |
- | 30 | ||
- | 31 | .null_exp: |
|
- | 32 | mov eax, 0 |
|
- | 33 | ret |
|
57 | endp |
34 | endp |
58 | 35 | ||
59 | ; --------------------------- |
36 | ; --------------------------- |
60 | 37 | ||
61 | proc parse_lvl0 uses ebx ecx |
38 | proc parse_lvl0 uses ebx ecx |
62 | test_err |
39 | test_err |
63 | stdcall parse_lvl1 |
40 | stdcall parse_lvl1 |
64 | test_err |
41 | test_err |
65 | @@: |
42 | @@: |
66 | mov ebx, exp |
43 | mov ebx, exp |
67 | add ebx, [exp_pos] |
44 | add ebx, [exp_pos] |
68 | cmp [ebx], byte 0 |
45 | cmp [ebx], byte 0 |
69 | je .end |
46 | je .end |
70 | cmp [ebx], byte ")" |
47 | cmp [ebx], byte ")" |
71 | je .end |
48 | je .brk_end |
72 | inc [exp_pos] |
49 | inc [exp_pos] |
73 | cmp [ebx], byte "+" |
50 | cmp [ebx], byte "+" |
74 | jne .not_add |
51 | jne .not_add |
75 | mov ecx, eax |
52 | mov ecx, eax |
76 | stdcall parse_lvl1 |
53 | stdcall parse_lvl1 |
77 | test_err |
54 | test_err |
78 | add eax, ecx |
55 | add eax, ecx |
79 | jmp @b |
56 | jmp @b |
80 | .not_add: |
57 | .not_add: |
81 | cmp [ebx], byte "-" |
58 | cmp [ebx], byte "-" |
82 | jne @b |
59 | jne .unexp_char |
83 | mov ecx, eax |
60 | mov ecx, eax |
84 | stdcall parse_lvl1 |
61 | stdcall parse_lvl1 |
85 | test_err |
62 | test_err |
86 | sub ecx, eax |
63 | sub ecx, eax |
87 | mov eax, ecx |
64 | mov eax, ecx |
88 | jmp @b |
65 | jmp @b |
- | 66 | .brk_end: |
|
- | 67 | cmp [exp_lvl], 0 |
|
- | 68 | jne @f |
|
- | 69 | set_err 3 |
|
- | 70 | @@: |
|
- | 71 | dec [exp_lvl] |
|
89 | .end: |
72 | .end: |
90 | ret |
73 | ret |
- | 74 | .unexp_char: |
|
- | 75 | set_err 4 |
|
91 | endp |
76 | endp |
92 | 77 | ||
93 | ; --------------------------- |
78 | ; --------------------------- |
94 | 79 | ||
95 | proc parse_lvl1 uses ebx ecx edx |
80 | proc parse_lvl1 uses ebx ecx edx |
96 | test_err |
81 | test_err |
97 | stdcall parse_lvl2 |
82 | stdcall parse_lvl2 |
98 | test_err |
83 | test_err |
99 | @@: |
84 | @@: |
100 | mov ebx, exp |
85 | mov ebx, exp |
101 | add ebx, [exp_pos] |
86 | add ebx, [exp_pos] |
102 | cmp [ebx], byte 0 |
87 | cmp [ebx], byte 0 |
103 | je .end |
88 | je .end |
104 | inc [exp_pos] |
- | |
105 | cmp [ebx], byte "*" |
89 | cmp [ebx], byte "*" |
106 | jne .not_mul |
90 | jne .not_mul |
- | 91 | inc [exp_pos] |
|
107 | mov ecx, eax |
92 | mov ecx, eax |
108 | stdcall parse_lvl2 |
93 | stdcall parse_lvl2 |
109 | test_err |
94 | test_err |
110 | imul ecx, eax |
95 | imul ecx, eax |
111 | mov eax, ecx |
96 | mov eax, ecx |
112 | jmp @b |
97 | jmp @b |
113 | .not_mul: |
98 | .not_mul: |
114 | cmp [ebx], byte "/" |
99 | cmp [ebx], byte "/" |
115 | je .div_or_mod |
100 | je .div_or_mod |
116 | cmp [ebx], byte "%" |
101 | cmp [ebx], byte "%" |
117 | je .div_or_mod |
102 | je .div_or_mod |
118 | jmp .end |
103 | jmp .end |
119 | .div_or_mod: |
104 | .div_or_mod: |
- | 105 | inc [exp_pos] |
|
120 | mov ecx, eax |
106 | mov ecx, eax |
121 | stdcall parse_lvl2 |
107 | stdcall parse_lvl2 |
122 | test_err |
108 | test_err |
123 | cmp eax, 0 |
109 | cmp eax, 0 |
124 | jne .not_null |
110 | jne .not_null |
125 | set_err 1 |
111 | set_err 1 |
126 | .not_null: |
112 | .not_null: |
127 | xchg ecx, eax |
113 | xchg ecx, eax |
128 | cdq |
114 | cdq |
129 | div ecx |
115 | div ecx |
130 | cmp [ebx], byte "%" |
116 | cmp [ebx], byte "%" |
131 | je .mod |
117 | je .mod |
132 | jmp @b |
118 | jmp @b |
133 | .mod: |
119 | .mod: |
134 | mov eax, edx |
120 | mov eax, edx |
135 | jmp @b |
121 | jmp @b |
136 | .end: |
122 | .end: |
137 | dec [exp_pos] |
- | |
138 | ret |
123 | ret |
139 | endp |
124 | endp |
140 | 125 | ||
141 | ; --------------------------- |
126 | ; --------------------------- |
- | 127 | ||
- | 128 | proc parse_lvl2 uses ebx ecx edx |
|
- | 129 | test_err |
|
- | 130 | stdcall parse_lvl3 |
|
- | 131 | test_err |
|
- | 132 | @@: |
|
- | 133 | mov ebx, exp |
|
- | 134 | add ebx, [exp_pos] |
|
- | 135 | cmp [ebx], byte 0 |
|
- | 136 | je .end |
|
- | 137 | cmp [ebx], byte "^" |
|
- | 138 | jne .end |
|
- | 139 | inc [exp_pos] |
|
- | 140 | mov ecx, eax |
|
- | 141 | stdcall parse_lvl2 |
|
- | 142 | test_err |
|
- | 143 | stdcall c_power |
|
- | 144 | jmp @b |
|
- | 145 | .end: |
|
- | 146 | ret |
|
- | 147 | endp |
|
- | 148 | ||
- | 149 | ; --------------------------- |
|
142 | 150 | ||
143 | proc parse_lvl2 uses ebx |
151 | proc parse_lvl3 uses ebx |
144 | test_err |
152 | test_err |
145 | stdcall skip_spaces |
153 | stdcall skip_spaces |
146 | mov ebx, exp |
154 | mov ebx, exp |
147 | add ebx, [exp_pos] |
155 | add ebx, [exp_pos] |
148 | cmp [ebx], byte 48 |
156 | cmp [ebx], byte 48 |
149 | jl @f |
157 | jl @f |
150 | cmp [ebx], byte 57 |
158 | cmp [ebx], byte 57 |
151 | jg @f |
159 | jg @f |
152 | stdcall parse_lvl3 |
160 | stdcall parse_lvl4 |
153 | jmp .end |
161 | jmp .end |
154 | @@: |
162 | @@: |
155 | inc [exp_pos] |
163 | inc [exp_pos] |
156 | cmp [ebx], byte "(" |
164 | cmp [ebx], byte "(" |
157 | jne @f |
165 | jne @f |
- | 166 | inc [exp_lvl] |
|
158 | stdcall parse_lvl0 |
167 | stdcall parse_lvl0 |
159 | test_err |
168 | test_err |
- | 169 | mov ebx, exp |
|
- | 170 | add ebx, [exp_pos] |
|
- | 171 | cmp [ebx], byte ")" |
|
- | 172 | je .brk_ok |
|
- | 173 | set_err 2 |
|
- | 174 | .brk_ok: |
|
160 | inc [exp_pos] |
175 | inc [exp_pos] |
161 | jmp .end |
176 | jmp .end |
162 | @@: |
177 | @@: |
163 | cmp [ebx], byte "+" |
178 | cmp [ebx], byte "+" |
164 | jne @f |
179 | jne @f |
165 | stdcall parse_lvl2 |
180 | stdcall parse_lvl3 |
166 | test_err |
181 | test_err |
167 | jmp .end |
182 | jmp .end |
168 | @@: |
183 | @@: |
169 | cmp [ebx], byte "-" |
184 | cmp [ebx], byte "-" |
170 | jne .end |
185 | jne .unexp_char |
171 | stdcall parse_lvl2 |
186 | stdcall parse_lvl3 |
172 | test_err |
187 | test_err |
173 | neg eax |
188 | neg eax |
174 | .end: |
189 | .end: |
175 | stdcall skip_spaces |
190 | stdcall skip_spaces |
176 | ret |
191 | ret |
- | 192 | .unexp_char: |
|
- | 193 | set_err 4 |
|
- | 194 | endp |
|
- | 195 | ||
- | 196 | ; --------------------------- |
|
- | 197 | ||
- | 198 | proc parse_lvl4 uses ebx ecx |
|
- | 199 | stdcall parse_lvl5 |
|
- | 200 | @@: |
|
- | 201 | mov ebx, exp |
|
- | 202 | add ebx, [exp_pos] |
|
- | 203 | cmp [ebx], byte 0 |
|
- | 204 | je .end |
|
- | 205 | cmp [ebx], byte "^" |
|
- | 206 | jne .end |
|
- | 207 | inc [exp_pos] |
|
- | 208 | mov ecx, eax |
|
- | 209 | mov ebx, exp |
|
- | 210 | add ebx, [exp_pos] |
|
- | 211 | cmp [ebx], byte 48 |
|
- | 212 | jl .unexp_char |
|
- | 213 | cmp [ebx], byte 57 |
|
- | 214 | jg .unexp_char |
|
- | 215 | stdcall parse_lvl4 |
|
- | 216 | stdcall c_power |
|
- | 217 | jmp @b |
|
- | 218 | .end: |
|
- | 219 | ret |
|
- | 220 | .unexp_char: |
|
- | 221 | set_err 4 |
|
177 | endp |
222 | endp |
178 | 223 | ||
179 | ; --------------------------- |
224 | ; --------------------------- |
180 | 225 | ||
181 | proc parse_lvl3 uses ebx ecx |
226 | proc parse_lvl5 uses ebx ecx |
182 | sub eax, eax |
227 | sub eax, eax |
183 | sub ecx, ecx |
228 | sub ecx, ecx |
184 | mov ebx, exp |
229 | mov ebx, exp |
185 | add ebx, [exp_pos] |
230 | add ebx, [exp_pos] |
186 | @@: |
231 | @@: |
187 | cmp [ebx], byte 0 |
232 | cmp [ebx], byte 0 |
188 | je @f |
233 | je @f |
189 | cmp [ebx], byte 48 |
234 | cmp [ebx], byte 48 |
190 | jl @f |
235 | jl @f |
191 | cmp [ebx], byte 57 |
236 | cmp [ebx], byte 57 |
192 | jg @f |
237 | jg @f |
193 | imul eax, 10 |
238 | imul eax, 10 |
194 | mov cl, [ebx] |
239 | mov cl, [ebx] |
195 | add eax, ecx |
240 | add eax, ecx |
196 | sub eax, 48 |
241 | sub eax, 48 |
197 | inc ebx |
242 | inc ebx |
198 | inc [exp_pos] |
243 | inc [exp_pos] |
199 | jmp @b |
244 | jmp @b |
200 | @@: |
245 | @@: |
201 | ret |
246 | ret |
202 | endp |
247 | endp |
203 | 248 | ||
204 | ; --------------------------- |
249 | ; --------------------------- |
205 | 250 | ||
206 | proc skip_spaces uses ebx |
251 | proc skip_spaces uses ebx |
207 | mov ebx, exp |
252 | mov ebx, exp |
208 | add ebx, [exp_pos] |
253 | add ebx, [exp_pos] |
209 | @@: |
254 | @@: |
210 | cmp [ebx], byte " " |
255 | cmp [ebx], byte " " |
211 | jne @f |
256 | jne @f |
212 | inc ebx |
257 | inc ebx |
213 | inc [exp_pos] |
258 | inc [exp_pos] |
214 | jmp @b |
259 | jmp @b |
215 | @@: |
260 | @@: |
216 | ret |
261 | ret |
- | 262 | endp |
|
- | 263 | ||
- | 264 | ; --------------------------- |
|
- | 265 | ||
- | 266 | proc c_power uses ebx |
|
- | 267 | mov ebx, eax |
|
- | 268 | mov eax, 1 |
|
- | 269 | @@: |
|
- | 270 | cmp ebx, 0 |
|
- | 271 | je @f |
|
- | 272 | imul eax, ecx |
|
- | 273 | dec ebx |
|
- | 274 | jmp @b |
|
- | 275 | @@: |
|
- | 276 | ret |
|
- | 277 | endp |
|
- | 278 | ||
- | 279 | ; --------------------------- |
|
- | 280 | ||
- | 281 | proc convert_to_str uses ebx ecx edx esi edi, _num, _str |
|
- | 282 | mov eax, [_num] |
|
- | 283 | mov esi, [_str] |
|
- | 284 | mov edi, 0 |
|
- | 285 | mov ecx, eax |
|
- | 286 | and ecx, 1 shl 31 |
|
- | 287 | cmp ecx, 0 |
|
- | 288 | je @f |
|
- | 289 | mov [esi], byte "-" |
|
- | 290 | inc esi |
|
- | 291 | inc edi |
|
- | 292 | not eax |
|
- | 293 | inc eax |
|
- | 294 | @@: |
|
- | 295 | mov ebx, 10 |
|
- | 296 | xor ecx, ecx |
|
- | 297 | @@: |
|
- | 298 | xor edx, edx |
|
- | 299 | div ebx |
|
- | 300 | push edx |
|
- | 301 | inc ecx |
|
- | 302 | inc edi |
|
- | 303 | cmp eax, 0 |
|
- | 304 | jne @b |
|
- | 305 | @@: |
|
- | 306 | pop eax |
|
- | 307 | add al, "0" |
|
- | 308 | mov [esi], al |
|
- | 309 | inc esi |
|
- | 310 | loop @b |
|
- | 311 | mov [esi], byte 0 |
|
- | 312 | mov eax, edi |
|
- | 313 | ret |
|
217 | endp |
314 | endp |
218 | 315 |