Subversion Repositories Kolibri OS

Rev

Rev 31 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 31 Rev 109
Line 1... Line 1...
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2005, Tomasz Grysztar.
2
; Copyright (c) 1999-2006, Tomasz Grysztar.
3
; All rights reserved.
3
; All rights reserved.
Line 4... Line 4...
4
 
4
 
5
parser:
5
parser:
6
	mov	eax,[memory_end]
6
        mov     eax,[memory_end]
Line 11... Line 11...
11
	mov	[current_locals_prefix],eax
11
        mov     [current_locals_prefix],eax
12
	mov	[anonymous_reverse],eax
12
        mov     [anonymous_reverse],eax
13
	mov	[anonymous_forward],eax
13
        mov     [anonymous_forward],eax
14
	mov	[hash_tree],eax
14
        mov     [hash_tree],eax
15
	push	[memory_end]
15
        mov     [blocks_stack],eax
16
	mov	esi,[memory_start]
16
        mov     esi,[memory_start]
17
	mov	edi,[source_start]
17
        mov     edi,[source_start]
18
      parser_loop:
18
      parser_loop:
19
	mov	[current_line],esi
19
        mov     [current_line],esi
20
	lea	eax,[edi+100h]
20
        lea     eax,[edi+100h]
21
	cmp	eax,[memory_end]
21
        cmp     eax,[labels_list]
22
	jae	out_of_memory
22
        jae     out_of_memory
23
	cmp	byte [esi+16],0
23
        cmp     byte [esi+16],0
24
	je	empty_line
24
        je      empty_line
25
	mov	al,0Fh
25
        mov     al,0Fh
26
	stos	byte [edi]
26
        stos    byte [edi]
27
	mov	eax,esi
27
        mov     eax,esi
28
	stos	dword [edi]
28
        stos    dword [edi]
29
	add	esi,16
29
        add     esi,16
30
	call	parse_line
30
      parse_line:
31
      parse_next_line:
-
 
32
	cmp	esi,[source_start]
-
 
33
	jb	parser_loop
-
 
34
	xor	al,al
-
 
35
	stos	byte [edi]
-
 
36
	mov	eax,[error_line]
-
 
37
	mov	[current_line],eax
-
 
38
	cmp	[anonymous_forward],0
-
 
39
	jne	invalid_value
-
 
40
	add	edi,0Fh
-
 
41
	and	edi,not 0Fh
-
 
42
	mov	[code_start],edi
-
 
43
	pop	[memory_end]
-
 
44
	ret
-
 
45
      empty_line:
-
 
46
	add	esi,17
-
 
47
	jmp	parse_next_line
-
 
48
 
-
 
49
parse_line:
-
 
50
	mov	[parenthesis_stack],0
31
        cmp     byte [esi],1Ah
51
      instruction_start:
-
 
52
	cmp	byte [esi],1Ah
-
 
53
	jne	empty_instruction
32
        jne     empty_instruction
54
	push	edi
33
        push    edi
55
	add	esi,2
34
        add     esi,2
56
	movzx	ecx,byte [esi-1]
35
        movzx   ecx,byte [esi-1]
57
	cmp	byte [esi+ecx],':'
36
        cmp     byte [esi+ecx],':'
58
	je	simple_label
37
        je      simple_label
59
	cmp	byte [esi+ecx],'='
38
        cmp     byte [esi+ecx],'='
60
	je	constant_label
39
        je      constant_label
61
	cmp	byte [esi+ecx],1Ah
40
        call    get_instruction
-
 
41
        jnc     main_instruction_identified
-
 
42
        cmp     byte [esi+ecx],1Ah
62
	jne	get_main_instruction
43
        jne     no_data_label
63
	push	esi ecx
44
        push    esi ecx
64
	lea	esi,[esi+ecx+2]
45
        lea     esi,[esi+ecx+2]
65
	movzx	ecx,byte [esi-1]
46
        movzx   ecx,byte [esi-1]
66
	mov	edi,data_directives
47
        call    get_data_directive
67
	call	get_symbol
48
        jnc     data_label
68
	jnc	data_label
-
 
69
	pop	ecx esi
49
        pop     ecx esi
70
      get_main_instruction:
50
      no_data_label:
71
	call	get_instruction
51
        call    get_data_directive
72
	jnc	parse_instruction
-
 
73
	mov	edi,data_directives
-
 
74
	call	get_symbol
52
        jnc     main_instruction_identified
75
	jnc	data_instruction
-
 
76
	mov	edi,symbols
53
        pop     edi
77
	call	get_symbol
-
 
78
	pop	edi
-
 
79
	jc	unknown_instruction
54
        sub     esi,2
80
	stos	word [edi]
-
 
81
	jmp	parse_arguments
-
 
82
      data_instruction:
-
 
83
	movzx	ebx,ah
-
 
84
	mov	bx,[data_handlers+ebx*2]
-
 
85
	jmp	parse_instruction
-
 
86
      unknown_instruction:
-
 
87
	sub	esi,2
-
 
88
	jmp	parse_arguments
55
        xor     bx,bx
-
 
56
        call    parse_line_contents
-
 
57
        jmp     parse_next_line
89
      constant_label:
58
      simple_label:
-
 
59
        pop     edi
-
 
60
        call    identify_label
-
 
61
        mov     byte [edi],2
-
 
62
        inc     edi
-
 
63
        stos    dword [edi]
-
 
64
        inc     esi
-
 
65
        xor     al,al
-
 
66
        stos    byte [edi]
-
 
67
        jmp     parse_line
-
 
68
      constant_label:
90
	pop	edi
69
        pop     edi
91
	call	get_label_id
70
        call    get_label_id
92
	mov	byte [edi],3
71
        mov     byte [edi],3
93
	inc	edi
72
        inc     edi
94
	stos	dword [edi]
73
        stos    dword [edi]
95
	xor	al,al
74
        xor     al,al
96
	stos	byte [edi]
75
        stos    byte [edi]
97
	inc	esi
76
        inc     esi
98
	jmp	parse_arguments
77
        xor     bx,bx
-
 
78
        call    parse_line_contents
-
 
79
        jmp     parse_next_line
99
      data_label:
80
      data_label:
100
	pop	ecx ebx
81
        pop     ecx edx
101
	pop	edi
82
        pop     edi
102
	push	eax esi
83
        push    eax ebx esi
103
	mov	esi,ebx
84
        mov     esi,edx
104
	movzx	ecx,byte [esi-1]
85
        movzx   ecx,byte [esi-1]
105
	call	identify_label
86
        call    identify_label
106
	mov	byte [edi],2
87
        mov     byte [edi],2
107
	inc	edi
88
        inc     edi
108
	stos	dword [edi]
89
        stos    dword [edi]
109
	pop	esi eax
90
        pop     esi ebx eax
110
	stos	byte [edi]
91
        stos    byte [edi]
111
	push	edi
92
        push    edi
112
	jmp	data_instruction
93
      main_instruction_identified:
113
      simple_label:
94
        pop     edi
114
	pop	edi
-
 
115
	call	identify_label
95
        mov     dl,al
-
 
96
        mov     al,1
-
 
97
        stos    byte [edi]
-
 
98
        mov     ax,bx
-
 
99
        stos    word [edi]
-
 
100
        mov     al,dl
116
	mov	byte [edi],2
101
        stos    byte [edi]
117
	inc	edi
102
        cmp     bx,if_directive-assembler
-
 
103
        je      parse_block
-
 
104
        cmp     bx,repeat_directive-assembler
-
 
105
        je      parse_block
-
 
106
        cmp     bx,while_directive-assembler
-
 
107
        je      parse_block
-
 
108
        cmp     bx,end_directive-assembler
-
 
109
        je      parse_end_directive
-
 
110
        cmp     bx,else_directive-assembler
-
 
111
        je      parse_else
-
 
112
      common_parse:
-
 
113
        call    parse_line_contents
-
 
114
        jmp     parse_next_line
-
 
115
      empty_instruction:
-
 
116
        lods    byte [esi]
-
 
117
        or      al,al
-
 
118
        jz      parse_next_line
-
 
119
        cmp     al,':'
-
 
120
        je      invalid_name
-
 
121
        cmp     al,3Bh
-
 
122
        je      skip_preprocessed_symbol
-
 
123
        dec     esi
-
 
124
        call    parse_argument
-
 
125
        jmp     parse_next_line
-
 
126
      skip_preprocessed_symbol:
-
 
127
        lods    byte [esi]
-
 
128
        movzx   eax,al
-
 
129
        add     esi,eax
-
 
130
      skip_next:
118
	stos	dword [edi]
131
        lods    byte [esi]
-
 
132
        or      al,al
-
 
133
        jz      parse_next_line
-
 
134
        cmp     al,1Ah
-
 
135
        je      skip_preprocessed_symbol
-
 
136
        cmp     al,3Bh
-
 
137
        je      skip_preprocessed_symbol
-
 
138
        cmp     al,22h
-
 
139
        je      skip_preprocessed_string
-
 
140
        jmp     skip_next
-
 
141
      skip_preprocessed_string:
-
 
142
        lods    dword [esi]
119
	inc	esi
143
        add     esi,eax
-
 
144
        jmp     skip_next
-
 
145
      empty_line:
120
	xor	al,al
146
        add     esi,17
-
 
147
      parse_next_line:
-
 
148
        cmp     esi,[source_start]
-
 
149
        jb      parser_loop
-
 
150
      source_parsed:
-
 
151
        cmp     [blocks_stack],0
-
 
152
        je      blocks_stack_ok
-
 
153
        pop     eax
-
 
154
        pop     [current_line]
-
 
155
        jmp     missing_end_directive
-
 
156
      blocks_stack_ok:
-
 
157
        xor     al,al
121
	stos	byte [edi]
158
        stos    byte [edi]
122
	jmp	instruction_start
159
        mov     eax,[error_line]
123
      identify_label:
-
 
124
	cmp	byte [esi],'.'
160
        mov     [current_line],eax
125
	je	local_label_name
-
 
126
	call	get_label_id
-
 
127
	cmp	eax,10h
-
 
128
	jb	label_identified
-
 
129
	or	ebx,ebx
-
 
130
	jz	anonymous_label_name
-
 
131
	dec	ebx
-
 
132
	mov	[current_locals_prefix],ebx
-
 
133
      label_identified:
161
        cmp     [anonymous_forward],0
134
	ret
162
        jne     invalid_value
135
      anonymous_label_name:
-
 
136
	cmp	byte [esi-1],'@'
163
        add     edi,0Fh
137
	je	anonymous_label_name_ok
164
        and     edi,not 0Fh
138
	mov	eax,0Fh
-
 
139
      anonymous_label_name_ok:
-
 
140
	ret
165
        mov     [code_start],edi
141
      local_label_name:
-
 
142
	call	get_label_id
166
        ret
143
	ret
-
 
144
      parse_label_directive:
167
      parse_block:
-
 
168
        mov     eax,esp
-
 
169
        sub     eax,100h
-
 
170
        jc      stack_overflow
-
 
171
        cmp     eax,[stack_limit]
-
 
172
        jb      stack_overflow
-
 
173
        push    [current_line]
-
 
174
        mov     ax,bx
-
 
175
        shl     eax,16
-
 
176
        push    eax
-
 
177
        inc     [blocks_stack]
-
 
178
        cmp     bx,if_directive-assembler
-
 
179
        je      parse_if
-
 
180
        cmp     bx,while_directive-assembler
-
 
181
        je      parse_while
-
 
182
        call    parse_line_contents
-
 
183
        jmp     parse_next_line
-
 
184
      parse_end_directive:
145
	cmp	byte [esi],1Ah
185
        cmp     byte [esi],1Ah
146
	jne	argument_parsed
186
        jne     common_parse
147
	inc	esi
187
        push    edi
-
 
188
        inc     esi
148
	movzx	ecx,byte [esi]
189
        movzx   ecx,byte [esi]
149
	inc	esi
190
        inc     esi
150
	mov	al,2
191
        call    get_instruction
-
 
192
        pop     edi
-
 
193
        jnc     parse_end_block
-
 
194
        sub     esi,2
-
 
195
        jmp     common_parse
-
 
196
      parse_end_block:
-
 
197
        mov     dl,al
-
 
198
        mov     al,1
151
	stos	byte [edi]
199
        stos    byte [edi]
152
	call	identify_label
200
        mov     ax,bx
153
	stos	dword [edi]
201
        stos    word [edi]
154
	xor	al,al
202
        mov     al,dl
155
	stos	byte [edi]
203
        stos    byte [edi]
156
	jmp	argument_parsed
204
        lods    byte [esi]
-
 
205
        or      al,al
-
 
206
        jnz     extra_characters_on_line
-
 
207
        cmp     bx,if_directive-assembler
-
 
208
        je      close_parsing_block
-
 
209
        cmp     bx,repeat_directive-assembler
-
 
210
        je      close_parsing_block
-
 
211
        cmp     bx,while_directive-assembler
-
 
212
        je      close_parsing_block
-
 
213
        jmp     parse_next_line
157
      parse_load_directive:
214
      close_parsing_block:
158
	cmp	byte [esi],1Ah
215
        cmp     [blocks_stack],0
-
 
216
        je      unexpected_instruction
-
 
217
        cmp     bx,[esp+2]
159
	jne	argument_parsed
218
        jne     unexpected_instruction
-
 
219
        dec     [blocks_stack]
-
 
220
        pop     eax edx
160
	inc	esi
221
        cmp     bx,if_directive-assembler
-
 
222
        jne     parse_next_line
-
 
223
        test    al,1100b
161
	movzx	ecx,byte [esi]
224
        jz      parse_next_line
-
 
225
        test    al,10000b
-
 
226
        jnz     parse_next_line
-
 
227
        sub     edi,8
162
	inc	esi
228
        jmp     parse_next_line
-
 
229
      parse_if:
163
	mov	al,2
230
        push    edi
-
 
231
        call    parse_line_contents
-
 
232
        xor     al,al
164
	stos	byte [edi]
233
        stos    byte [edi]
165
	call	get_label_id
234
        xchg    esi,[esp]
-
 
235
        mov     edi,esi
-
 
236
        call    preevaluate_logical_expression
-
 
237
        pop     esi
-
 
238
        cmp     al,'0'
-
 
239
        je      parse_false_condition_block
-
 
240
        cmp     al,'1'
-
 
241
        je      parse_true_condition_block
-
 
242
        or      byte [esp],10000b
-
 
243
        jmp     parse_next_line
-
 
244
      parse_while:
166
	stos	dword [edi]
245
        push    edi
167
	xor	al,al
246
        call    parse_line_contents
-
 
247
        xor     al,al
168
	stos	byte [edi]
248
        stos    byte [edi]
169
	jmp	argument_parsed
249
        xchg    esi,[esp]
-
 
250
        mov     edi,esi
-
 
251
        call    preevaluate_logical_expression
-
 
252
        pop     esi
-
 
253
        cmp     al,'0'
-
 
254
        je      parse_false_condition_block
-
 
255
        cmp     al,'1'
-
 
256
        jne     parse_next_line
-
 
257
        stos    byte [edi]
-
 
258
        jmp     parse_next_line
-
 
259
      parse_false_condition_block:
-
 
260
        or      byte [esp],1
-
 
261
        sub     edi,4
-
 
262
        jmp     skip_parsing
170
      parse_prefix_instruction:
263
      parse_true_condition_block:
171
	cmp	byte [esi],1Ah
264
        or      byte [esp],100b
172
	jne	parse_arguments
265
        sub     edi,4
-
 
266
        jmp     parse_next_line
-
 
267
      parse_else:
173
	push	edi
268
        cmp     [blocks_stack],0
-
 
269
        je      unexpected_instruction
-
 
270
        cmp     word [esp+2],if_directive-assembler
-
 
271
        jne     unexpected_instruction
-
 
272
        lods    byte [esi]
-
 
273
        or      al,al
-
 
274
        jz      parse_pure_else
-
 
275
        cmp     al,1Ah
-
 
276
        jne     extra_characters_on_line
-
 
277
        push    edi
174
	inc	esi
278
        movzx   ecx,byte [esi]
175
	movzx	ecx,byte [esi]
-
 
176
	inc	esi
279
        inc     esi
177
	jmp	get_main_instruction
280
        call    get_instruction
178
      parse_instruction:
281
        jc      extra_characters_on_line
179
	pop	edi
282
        pop     edi
180
	mov	dl,al
283
        cmp     bx,if_directive-assembler
-
 
284
        jne     extra_characters_on_line
-
 
285
        test    byte [esp],100b
-
 
286
        jnz     skip_true_condition_else
-
 
287
        mov     dl,al
181
	mov	al,1
288
        mov     al,1
182
	stos	byte [edi]
289
        stos    byte [edi]
183
	mov	ax,bx
290
        mov     ax,bx
184
	stos	word [edi]
291
        stos    word [edi]
185
	mov	al,dl
292
        mov     al,dl
186
	stos	byte [edi]
293
        stos    byte [edi]
187
	cmp	bx,prefix_instruction-assembler
294
        jmp     parse_if
-
 
295
      skip_true_condition_else:
-
 
296
        sub     edi,4
-
 
297
        or      byte [esp],1
-
 
298
        jmp     skip_parsing_contents
-
 
299
      parse_pure_else:
-
 
300
        bts     dword [esp],1
-
 
301
        jc      unexpected_instruction
-
 
302
        test    byte [esp],100b
-
 
303
        jz      parse_next_line
-
 
304
        sub     edi,4
-
 
305
        or      byte [esp],1
-
 
306
        jmp     skip_parsing
-
 
307
      skip_parsing:
-
 
308
        cmp     esi,[source_start]
-
 
309
        jae     source_parsed
-
 
310
        mov     [current_line],esi
-
 
311
        add     esi,16
-
 
312
      skip_parsing_line:
-
 
313
        cmp     byte [esi],1Ah
-
 
314
        jne     skip_parsing_contents
-
 
315
        inc     esi
-
 
316
        movzx   ecx,byte [esi]
-
 
317
        inc     esi
-
 
318
        cmp     byte [esi+ecx],':'
-
 
319
        je      skip_parsing_label
-
 
320
        push    edi
-
 
321
        call    get_instruction
-
 
322
        pop     edi
-
 
323
        jnc     skip_parsing_instruction
-
 
324
        add     esi,ecx
-
 
325
        jmp     skip_parsing_contents
-
 
326
      skip_parsing_label:
-
 
327
        lea     esi,[esi+ecx+1]
-
 
328
        jmp     skip_parsing_line
-
 
329
      skip_parsing_instruction:
-
 
330
        cmp     bx,if_directive-assembler
-
 
331
        je      skip_parsing_block
-
 
332
        cmp     bx,repeat_directive-assembler
-
 
333
        je      skip_parsing_block
-
 
334
        cmp     bx,while_directive-assembler
-
 
335
        je      skip_parsing_block
-
 
336
        cmp     bx,end_directive-assembler
-
 
337
        je      skip_parsing_end_directive
-
 
338
        cmp     bx,else_directive-assembler
-
 
339
        je      skip_parsing_else
-
 
340
      skip_parsing_contents:
-
 
341
        lods    byte [esi]
-
 
342
        or      al,al
-
 
343
        jz      skip_parsing
-
 
344
        cmp     al,1Ah
-
 
345
        je      skip_parsing_symbol
-
 
346
        cmp     al,3Bh
-
 
347
        je      skip_parsing_symbol
-
 
348
        cmp     al,22h
-
 
349
        je      skip_parsing_string
-
 
350
        jmp     skip_parsing_contents
-
 
351
      skip_parsing_symbol:
-
 
352
        lods    byte [esi]
-
 
353
        movzx   eax,al
-
 
354
        add     esi,eax
-
 
355
        jmp     skip_parsing_contents
-
 
356
      skip_parsing_string:
-
 
357
        lods    dword [esi]
-
 
358
        add     esi,eax
-
 
359
        jmp     skip_parsing_contents
-
 
360
      skip_parsing_block:
-
 
361
        mov     eax,esp
-
 
362
        sub     eax,100h
-
 
363
        jc      stack_overflow
-
 
364
        cmp     eax,[stack_limit]
-
 
365
        jb      stack_overflow
-
 
366
        push    [current_line]
-
 
367
        mov     ax,bx
-
 
368
        shl     eax,16
-
 
369
        push    eax
-
 
370
        inc     [blocks_stack]
-
 
371
        jmp     skip_parsing_contents
-
 
372
      skip_parsing_end_directive:
-
 
373
        cmp     byte [esi],1Ah
-
 
374
        jne     skip_parsing_contents
-
 
375
        push    edi
-
 
376
        inc     esi
-
 
377
        movzx   ecx,byte [esi]
-
 
378
        inc     esi
-
 
379
        call    get_instruction
-
 
380
        pop     edi
-
 
381
        jnc     skip_parsing_end_block
-
 
382
        add     esi,ecx
-
 
383
        jmp     skip_parsing_contents
-
 
384
      skip_parsing_end_block:
-
 
385
        lods    byte [esi]
-
 
386
        or      al,al
-
 
387
        jnz     extra_characters_on_line
-
 
388
        cmp     bx,if_directive-assembler
-
 
389
        je      close_skip_parsing_block
-
 
390
        cmp     bx,repeat_directive-assembler
-
 
391
        je      close_skip_parsing_block
-
 
392
        cmp     bx,while_directive-assembler
-
 
393
        je      close_skip_parsing_block
-
 
394
        jmp     skip_parsing
-
 
395
      close_skip_parsing_block:
-
 
396
        cmp     [blocks_stack],0
-
 
397
        je      unexpected_instruction
-
 
398
        cmp     bx,[esp+2]
-
 
399
        jne     unexpected_instruction
-
 
400
        dec     [blocks_stack]
-
 
401
        pop     eax edx
-
 
402
        test    al,1
-
 
403
        jz      skip_parsing
-
 
404
        cmp     bx,if_directive-assembler
-
 
405
        jne     parse_next_line
-
 
406
        test    al,10000b
-
 
407
        jz      parse_next_line
-
 
408
        mov     al,0Fh
-
 
409
        stos    byte [edi]
-
 
410
        mov     eax,[current_line]
-
 
411
        stos    dword [edi]
-
 
412
        mov     eax,1 + (end_directive-assembler) shl 8
-
 
413
        stos    dword [edi]
-
 
414
        mov     eax,1 + (if_directive-assembler) shl 8
-
 
415
        stos    dword [edi]
-
 
416
        jmp     parse_next_line
-
 
417
      skip_parsing_else:
-
 
418
        cmp     [blocks_stack],0
-
 
419
        je      unexpected_instruction
-
 
420
        cmp     word [esp+2],if_directive-assembler
-
 
421
        jne     unexpected_instruction
-
 
422
        lods    byte [esi]
-
 
423
        or      al,al
-
 
424
        jz      skip_parsing_pure_else
-
 
425
        cmp     al,1Ah
-
 
426
        jne     extra_characters_on_line
-
 
427
        push    edi
-
 
428
        movzx   ecx,byte [esi]
-
 
429
        inc     esi
-
 
430
        call    get_instruction
-
 
431
        jc      extra_characters_on_line
-
 
432
        pop     edi
-
 
433
        cmp     bx,if_directive-assembler
-
 
434
        jne     extra_characters_on_line
-
 
435
        mov     al,[esp]
-
 
436
        test    al,1
-
 
437
        jz      skip_parsing_contents
-
 
438
        test    al,100b
-
 
439
        jnz     skip_parsing_contents
-
 
440
        test    al,10000b
-
 
441
        jnz     parse_else_if
-
 
442
        xor     al,al
-
 
443
        mov     [esp],al
-
 
444
        mov     al,0Fh
-
 
445
        stos    byte [edi]
-
 
446
        mov     eax,[current_line]
-
 
447
        stos    dword [edi]
-
 
448
      parse_else_if:
-
 
449
        mov     eax,1 + (if_directive-assembler) shl 8
-
 
450
        stos    dword [edi]
-
 
451
        jmp     parse_if
-
 
452
      skip_parsing_pure_else:
-
 
453
        bts     dword [esp],1
-
 
454
        jc      unexpected_instruction
-
 
455
        mov     al,[esp]
-
 
456
        test    al,1
-
 
457
        jz      skip_parsing
-
 
458
        test    al,100b
-
 
459
        jnz     skip_parsing
-
 
460
        and     al,not 1
-
 
461
        or      al,1000b
-
 
462
        mov     [esp],al
-
 
463
        jmp     parse_next_line
-
 
464
 
-
 
465
parse_line_contents:
-
 
466
        mov     [parenthesis_stack],0
-
 
467
      parse_instruction_arguments:
-
 
468
        cmp     bx,prefix_instruction-assembler
188
	je	parse_prefix_instruction
469
        je      allow_embedded_instruction
189
	cmp	bx,end_directive-assembler
470
        cmp     bx,times_directive-assembler
-
 
471
        je      parse_times_directive
-
 
472
        cmp     bx,end_directive-assembler
190
	je	parse_prefix_instruction
473
        je      allow_embedded_instruction
191
	cmp	bx,label_directive-assembler
474
        cmp     bx,label_directive-assembler
192
	je	parse_label_directive
475
        je      parse_label_directive
193
	cmp	bx,segment_directive-assembler
476
        cmp     bx,segment_directive-assembler
194
	je	parse_label_directive
477
        je      parse_label_directive
195
	cmp	bx,load_directive-assembler
478
        cmp     bx,load_directive-assembler
196
	je	parse_load_directive
479
        je      parse_load_directive
197
	cmp	bx,extrn_directive-assembler
480
        cmp     bx,extrn_directive-assembler
198
	je	parse_extrn_directive
481
        je      parse_extrn_directive
199
	cmp	bx,public_directive-assembler
482
        cmp     bx,public_directive-assembler
200
	je	parse_public_directive
483
        je      parse_public_directive
201
      parse_arguments:
484
      parse_argument:
202
	lods	byte [esi]
485
        lea     eax,[edi+100h]
-
 
486
        cmp     eax,[labels_list]
-
 
487
        jae     out_of_memory
-
 
488
        lods    byte [esi]
203
	cmp	al,':'
489
        cmp     al,':'
204
	je	instruction_separator
490
        je      instruction_separator
205
	cmp	al,','
491
        cmp     al,','
206
	je	separator
492
        je      separator
207
	cmp	al,'='
493
        cmp     al,'='
Line 218... Line 504...
218
	je	less
504
        je      less
219
	cmp	al,')'
505
        cmp     al,')'
220
	je	close_parenthesis
506
        je      close_parenthesis
221
	or	al,al
507
        or      al,al
222
	jz	line_parsed
508
        jz      contents_parsed
223
	cmp	al,'['
509
        cmp     al,'['
224
	je	address_argument
510
        je      address_argument
225
	cmp	al,']'
511
        cmp     al,']'
226
	je	separator
512
        je      separator
227
	cmp	al,'{'
513
        cmp     al,'{'
228
	je	unallowed_character
514
        je      unallowed_character
Line 242... Line 528...
242
	jnz	operator_argument
528
        jnz     operator_argument
243
	inc	esi
529
        inc     esi
244
	movzx	ecx,byte [esi]
530
        movzx   ecx,byte [esi]
245
	inc	esi
531
        inc     esi
246
	mov	edi,symbols
532
        call    get_symbol
247
	call	get_symbol
-
 
248
	jnc	symbol_argument
-
 
249
	mov	edi,formatter_symbols
-
 
250
	call	get_symbol
-
 
251
	jnc	symbol_argument
533
        jnc     symbol_argument
252
	cmp	ecx,1
534
        cmp     ecx,1
253
	jne	check_argument
535
        jne     check_argument
254
	cmp	byte [esi],'?'
536
        cmp     byte [esi],'?'
255
	jne	check_argument
537
        jne     check_argument
Line 273... Line 555...
273
	je	parse_from_operator
555
        je      parse_from_operator
274
	cmp	al,89h
556
        cmp     al,89h
275
	je	parse_label_operator
557
        je      parse_label_operator
276
	jmp	argument_parsed
558
        jmp     argument_parsed
277
      parse_public_directive:
559
      allow_embedded_instruction:
-
 
560
        cmp     byte [esi],1Ah
-
 
561
        jne     parse_argument
-
 
562
        push    edi
-
 
563
        inc     esi
-
 
564
        movzx   ecx,byte [esi]
-
 
565
        inc     esi
-
 
566
        call    get_instruction
-
 
567
        jnc     embedded_instruction
-
 
568
        call    get_data_directive
-
 
569
        jnc     embedded_instruction
-
 
570
        pop     edi
-
 
571
        sub     esi,2
-
 
572
        jmp     parse_argument
-
 
573
      embedded_instruction:
-
 
574
        pop     edi
-
 
575
        mov     dl,al
-
 
576
        mov     al,1
-
 
577
        stos    byte [edi]
-
 
578
        mov     ax,bx
-
 
579
        stos    word [edi]
-
 
580
        mov     al,dl
-
 
581
        stos    byte [edi]
-
 
582
        jmp     parse_instruction_arguments
-
 
583
      parse_times_directive:
-
 
584
        mov     al,'('
-
 
585
        stos    byte [edi]
-
 
586
        call    convert_expression
-
 
587
        mov     al,')'
-
 
588
        stos    byte [edi]
-
 
589
        cmp     byte [esi],':'
-
 
590
        jne     allow_embedded_instruction
-
 
591
        movs    byte [edi],[esi]
-
 
592
        jmp     allow_embedded_instruction
-
 
593
      parse_label_directive:
-
 
594
        cmp     byte [esi],1Ah
-
 
595
        jne     argument_parsed
-
 
596
        push    esi
-
 
597
        inc     esi
-
 
598
        movzx   ecx,byte [esi]
-
 
599
        inc     esi
-
 
600
        call    identify_label
-
 
601
        pop     ebx
-
 
602
        cmp     eax,0Fh
-
 
603
        je      non_label_identified
-
 
604
        mov     byte [edi],2
-
 
605
        inc     edi
-
 
606
        stos    dword [edi]
-
 
607
        xor     al,al
-
 
608
        stos    byte [edi]
-
 
609
        jmp     argument_parsed
-
 
610
      non_label_identified:
-
 
611
        mov     esi,ebx
-
 
612
        jmp     argument_parsed
-
 
613
      parse_load_directive:
-
 
614
        cmp     byte [esi],1Ah
-
 
615
        jne     argument_parsed
-
 
616
        push    esi
-
 
617
        inc     esi
-
 
618
        movzx   ecx,byte [esi]
-
 
619
        inc     esi
-
 
620
        call    get_label_id
-
 
621
        pop     ebx
-
 
622
        cmp     eax,0Fh
-
 
623
        je      non_label_identified
-
 
624
        mov     byte [edi],2
-
 
625
        inc     edi
-
 
626
        stos    dword [edi]
-
 
627
        xor     al,al
-
 
628
        stos    byte [edi]
-
 
629
        jmp     argument_parsed
-
 
630
      parse_public_directive:
278
	cmp	byte [esi],1Ah
631
        cmp     byte [esi],1Ah
279
	jne	parse_arguments
632
        jne     parse_argument
280
	inc	esi
633
        inc     esi
281
	push	esi
634
        push    esi
282
	movzx	ecx,byte [esi]
635
        movzx   ecx,byte [esi]
283
	inc	esi
636
        inc     esi
284
	mov	al,2
637
        mov     al,2
285
	stos	byte [edi]
638
        stos    byte [edi]
Line 310... Line 663...
310
      parse_extrn_directive:
663
      parse_extrn_directive:
311
	cmp	byte [esi],22h
664
        cmp     byte [esi],22h
312
	je	parse_quoted_extrn
665
        je      parse_quoted_extrn
313
	cmp	byte [esi],1Ah
666
        cmp     byte [esi],1Ah
314
	jne	parse_arguments
667
        jne     parse_argument
315
	push	esi
668
        push    esi
316
	movzx	ecx,byte [esi+1]
669
        movzx   ecx,byte [esi+1]
317
	add	esi,2
670
        add     esi,2
318
	mov	ax,'('
671
        mov     ax,'('
319
	stos	word [edi]
672
        stos    word [edi]
320
	mov	eax,ecx
673
        mov     eax,ecx
Line 371... Line 724...
371
	pop	ecx esi
724
        pop     ecx esi
372
	or	al,al
725
        or      al,al
373
	jnz	not_instruction
726
        jnz     not_instruction
374
	call	get_instruction
727
        call    get_instruction
375
	jnc	parse_instruction
728
        jnc     embedded_instruction
376
	mov	edi,data_directives
729
        call    get_data_directive
377
	call	get_symbol
730
        jnc     embedded_instruction
378
	jnc	data_instruction
-
 
379
      not_instruction:
731
      not_instruction:
380
	pop	edi
732
        pop     edi
381
	sub	esi,2
733
        sub     esi,2
382
      expression_argument:
734
      expression_argument:
383
	cmp	byte [esi],22h
735
        cmp     byte [esi],22h
384
	jne	not_string
736
        jne     not_string
Line 426... Line 778...
426
	inc	esi
778
        inc     esi
427
	mov	al,'{'
779
        mov     al,'{'
428
	stos	byte [edi]
780
        stos    byte [edi]
429
	inc	[parenthesis_stack]
781
        inc     [parenthesis_stack]
430
	jmp	parse_arguments
782
        jmp     parse_argument
431
      expression:
783
      expression:
432
	mov	al,'('
784
        mov     al,'('
433
	stos	byte [edi]
785
        stos    byte [edi]
434
	call	convert_expression
786
        call    convert_expression
435
	mov	al,')'
787
        mov     al,')'
436
	stos	byte [edi]
788
        stos    byte [edi]
Line 445... Line 797...
445
      address_argument:
797
      address_argument:
446
	call	parse_address
798
        call    parse_address
447
	lods	byte [esi]
799
        lods    byte [esi]
448
	cmp	al,']'
800
        cmp     al,']'
449
	jne	invalid_address
801
        je      address_parsed
-
 
802
        dec     esi
450
      address_parsed:
803
        mov     al,')'
-
 
804
        stos    byte [edi]
-
 
805
        jmp     argument_parsed
-
 
806
      address_parsed:
451
	mov	al,']'
807
        mov     al,']'
452
	stos	byte [edi]
808
        stos    byte [edi]
453
	jmp	argument_parsed
809
        jmp     argument_parsed
454
      parse_address:
810
      parse_address:
455
	mov	al,'['
811
        mov     al,'['
Line 464... Line 820...
464
	jne	convert_address
820
        jne     convert_address
465
	add	esi,2
821
        add     esi,2
466
	mov	ecx,2
822
        mov     ecx,2
467
	push	ebx edi
823
        push    ebx edi
468
	mov	edi,symbols
824
        call    get_symbol
469
	call	get_symbol
-
 
470
	pop	edi esi
825
        pop     edi esi
471
	jc	invalid_address
826
        jc      unknown_segment_prefix
472
	cmp	al,10h
827
        cmp     al,10h
473
	jne	invalid_address
828
        jne     unknown_segment_prefix
474
	mov	al,ah
829
        mov     al,ah
475
	and	ah,11110000b
830
        and     ah,11110000b
476
	cmp	ah,60h
831
        cmp     ah,60h
477
	jne	invalid_address
832
        jne     unknown_segment_prefix
478
	stos	byte [edi]
833
        stos    byte [edi]
479
      convert_address:
834
        jmp     convert_address
-
 
835
      unknown_segment_prefix:
-
 
836
        sub     esi,5
-
 
837
      convert_address:
480
	cmp	byte [esi],1Ah
838
        push    edi
481
	jne	convert_expression
-
 
482
	push	esi
-
 
483
	lods	word [esi]
-
 
484
	movzx	ecx,ah
-
 
485
	push	edi
-
 
486
	mov	edi,address_sizes
839
        mov     edi,address_sizes
487
	call	get_symbol
840
        call    get_operator
488
	pop	edi
841
        pop     edi
489
	jc	no_size_prefix
842
        or      al,al
490
	mov	al,ah
843
        jz      convert_expression
491
	add	al,70h
844
        add     al,70h
492
	stos	byte [edi]
845
        stos    byte [edi]
493
	add	esp,4
846
        jmp     convert_expression
494
	jmp	convert_expression
-
 
495
      no_size_prefix:
-
 
496
	pop	esi
-
 
497
	jmp	convert_expression
-
 
498
      forced_parenthesis:
847
      forced_parenthesis:
499
	cmp	byte [esi],'('
848
        cmp     byte [esi],'('
500
	jne	argument_parsed
849
        jne     argument_parsed
501
	inc	esi
850
        inc     esi
502
	mov	al,'{'
851
        mov     al,'{'
Line 510... Line 859...
510
	stos	byte [edi]
859
        stos    byte [edi]
511
	jmp	argument_parsed
860
        jmp     argument_parsed
512
      instruction_separator:
861
      instruction_separator:
513
	stos	byte [edi]
862
        stos    byte [edi]
514
	jmp	instruction_start
863
        jmp     allow_embedded_instruction
515
      greater:
864
      greater:
516
	cmp	byte [esi],'='
865
        cmp     byte [esi],'='
517
	jne	separator
866
        jne     separator
518
	inc	esi
867
        inc     esi
519
	mov	al,0F2h
868
        mov     al,0F2h
520
	jmp	separator
869
        jmp     separator
Line 533... Line 882...
533
	mov	al,0F1h
882
        mov     al,0F1h
534
	jmp	separator
883
        jmp     separator
535
      argument_parsed:
884
      argument_parsed:
536
	cmp	[parenthesis_stack],0
885
        cmp     [parenthesis_stack],0
537
	je	parse_arguments
886
        je      parse_argument
538
	dec	[parenthesis_stack]
887
        dec     [parenthesis_stack]
539
	add	esp,8
888
        add     esp,8
540
	jmp	argument_parsed
889
        jmp     argument_parsed
541
      expression_parsed:
890
      expression_parsed:
542
	cmp	[parenthesis_stack],0
891
        cmp     [parenthesis_stack],0
543
	je	parse_arguments
892
        je      parse_argument
544
	cmp	byte [esi],')'
893
        cmp     byte [esi],')'
545
	jne	argument_parsed
894
        jne     argument_parsed
546
	dec	[parenthesis_stack]
895
        dec     [parenthesis_stack]
547
	pop	edi esi
896
        pop     edi esi
548
	jmp	expression
897
        jmp     expression
549
      empty_instruction:
898
      contents_parsed:
550
	lods	byte [esi]
-
 
551
	or	al,al
-
 
552
	jz	line_parsed
-
 
553
	cmp	al,':'
-
 
554
	je	invalid_name
-
 
555
	cmp	al,3Bh
-
 
556
	je	skip_preprocessed_symbol
-
 
557
	dec	esi
-
 
558
	jmp	parse_arguments
-
 
559
      skip_preprocessed_symbol:
-
 
560
	lods	byte [esi]
-
 
561
	movzx	eax,al
-
 
562
	add	esi,eax
-
 
563
      skip_next:
-
 
564
	lods	byte [esi]
-
 
565
	or	al,al
-
 
566
	jz	line_parsed
-
 
567
	cmp	al,1Ah
-
 
568
	je	skip_preprocessed_symbol
-
 
569
	cmp	al,3Bh
-
 
570
	je	skip_preprocessed_symbol
-
 
571
	cmp	al,22h
-
 
572
	je	skip_preprocessed_string
-
 
573
	jmp	skip_next
-
 
574
      skip_preprocessed_string:
-
 
575
	lods	dword [esi]
-
 
576
	add	esi,eax
-
 
577
	jmp	skip_next
-
 
578
      line_parsed:
-
 
579
	cmp	[parenthesis_stack],0
899
        cmp     [parenthesis_stack],0
580
	jne	invalid_expression
900
        jne     invalid_expression
581
	ret
901
        ret
582
 
902
 
Line -... Line 903...
-
 
903
identify_label:
-
 
904
        cmp     byte [esi],'.'
-
 
905
        je      local_label_name
-
 
906
        call    get_label_id
-
 
907
        cmp     eax,10h
-
 
908
        jb      label_identified
-
 
909
        or      ebx,ebx
-
 
910
        jz      anonymous_label_name
-
 
911
        dec     ebx
-
 
912
        mov     [current_locals_prefix],ebx
-
 
913
      label_identified:
-
 
914
        ret
-
 
915
      anonymous_label_name:
-
 
916
        cmp     byte [esi-1],'@'
-
 
917
        je      anonymous_label_name_ok
-
 
918
        mov     eax,0Fh
-
 
919
      anonymous_label_name_ok:
-
 
920
        ret
-
 
921
      local_label_name:
-
 
922
        call    get_label_id
-
 
923
        ret
-
 
924
 
583
get_operator:
925
get_operator:
584
	cmp	byte [esi],1Ah
926
        cmp     byte [esi],1Ah
585
	jne	get_simple_operator
927
        jne     get_simple_operator
586
	mov	edx,esi
928
        mov     edx,esi
587
	push	ebp
929
        push    ebp
Line 638... Line 980...
638
	inc	esi
980
        inc     esi
639
	mov	al,[edi+2]
981
        mov     al,[edi+2]
640
	ret
982
        ret
641
 
983
 
Line 642... Line -...
642
 
-
 
643
get_symbol:
984
get_symbol:
644
	mov	edx,esi
985
        push    esi
645
	mov	ebp,ecx
986
        mov     ebp,ecx
646
	push	edi
-
 
647
	call	lower_case
987
        call    lower_case
648
	pop	edi
988
        mov     ecx,ebp
-
 
989
        cmp     cl,11
-
 
990
        ja      no_symbol
-
 
991
        sub     cl,2
-
 
992
        jc      no_symbol
-
 
993
        movzx   ebx,word [symbols+ecx*4]
-
 
994
        add     ebx,symbols
-
 
995
        movzx   edx,word [symbols+ecx*4+2]
649
      scan_symbols:
996
      scan_symbols:
650
	mov	esi,converted
-
 
651
	movzx	eax,byte [edi]
997
        or      edx,edx
652
	or	al,al
-
 
653
	jz	no_symbol
998
        jz      no_symbol
-
 
999
        mov     eax,edx
-
 
1000
        shr     eax,1
-
 
1001
        lea     edi,[ebp+2]
-
 
1002
        imul    eax,edi
-
 
1003
        lea     edi,[ebx+eax]
-
 
1004
        mov     esi,converted
654
	mov	ecx,ebp
1005
        mov     ecx,ebp
655
	inc	edi
-
 
656
	mov	ebx,edi
-
 
657
	add	ebx,eax
-
 
658
	mov	ah,[esi]
-
 
659
	cmp	ah,[edi]
-
 
660
	jb	no_symbol
-
 
661
	ja	next_symbol
-
 
662
	cmp	cl,al
-
 
663
	jne	next_symbol
-
 
664
	repe	cmps byte [esi],[edi]
1006
        repe    cmps byte [esi],[edi]
665
	jb	no_symbol
1007
        ja      symbols_up
666
	je	symbol_ok
1008
        jb      symbols_down
667
      next_symbol:
1009
        pop     esi
668
	mov	edi,ebx
1010
        add     esi,ebp
-
 
1011
        mov     ax,[edi]
669
	add	edi,2
1012
        clc
670
	jmp	scan_symbols
1013
        ret
671
      no_symbol:
1014
      no_symbol:
672
	mov	esi,edx
1015
        pop     esi
673
	mov	ecx,ebp
1016
        mov     ecx,ebp
674
	stc
1017
        stc
675
	ret
1018
        ret
-
 
1019
      symbols_down:
-
 
1020
        shr     edx,1
-
 
1021
        jmp     scan_symbols
676
      symbol_ok:
1022
      symbols_up:
677
	lea	esi,[edx+ebp]
1023
        lea     ebx,[edi+ecx+2]
-
 
1024
        shr     edx,1
678
	mov	ax,[ebx]
1025
        adc     edx,-1
-
 
1026
        jmp     scan_symbols
679
	clc
1027
 
680
	ret
1028
get_data_directive:
-
 
1029
        push    esi
-
 
1030
        mov     ebp,ecx
-
 
1031
        call    lower_case
-
 
1032
        mov     ecx,ebp
-
 
1033
        cmp     cl,4
-
 
1034
        ja      no_instruction
-
 
1035
        sub     cl,2
-
 
1036
        jc      no_instruction
-
 
1037
        movzx   ebx,word [data_directives+ecx*4]
-
 
1038
        add     ebx,data_directives
-
 
1039
        movzx   edx,word [data_directives+ecx*4+2]
-
 
1040
        jmp     scan_instructions
Line 681... Line 1041...
681
 
1041
 
682
get_instruction:
1042
get_instruction:
683
	mov	edx,esi
1043
        push    esi
684
	mov	ebp,ecx
1044
        mov     ebp,ecx
685
	call	lower_case
1045
        call    lower_case
686
	mov	ecx,ebp
1046
        mov     ecx,ebp
687
	cmp	cl,11
1047
        cmp     cl,11
688
	ja	no_instruction
1048
        ja      no_instruction
689
	sub	cl,2
1049
        sub     cl,2
690
	jc	no_instruction
1050
        jc      no_instruction
691
	movzx	edi,word [instructions+ecx*2]
1051
        movzx   ebx,word [instructions+ecx*4]
-
 
1052
        add     ebx,instructions
692
	add	edi,instructions
1053
        movzx   edx,word [instructions+ecx*4+2]
693
      scan_instructions:
1054
      scan_instructions:
694
	mov	esi,converted
-
 
695
	mov	al,[edi]
-
 
696
	or	al,al
1055
        or      edx,edx
-
 
1056
        jz      no_instruction
-
 
1057
        mov     eax,edx
-
 
1058
        shr     eax,1
-
 
1059
        lea     edi,[ebp+3]
-
 
1060
        imul    eax,edi
-
 
1061
        lea     edi,[ebx+eax]
697
	jz	no_instruction
1062
        mov     esi,converted
698
	mov	ecx,ebp
-
 
699
	mov	ebx,edi
-
 
700
	add	ebx,ecx
1063
        mov     ecx,ebp
701
	repe	cmps byte [esi],[edi]
1064
        repe    cmps byte [esi],[edi]
702
	jb	no_instruction
1065
        ja      instructions_up
703
	je	instruction_ok
1066
        jb      instructions_down
704
      next_instruction:
1067
        pop     esi
-
 
1068
        add     esi,ebp
-
 
1069
        mov     al,[edi]
705
	mov	edi,ebx
1070
        mov     bx,[edi+1]
706
	add	edi,3
1071
        clc
707
	jmp	scan_instructions
1072
        ret
708
      no_instruction:
1073
      no_instruction:
709
	mov	esi,edx
1074
        pop     esi
710
	mov	ecx,ebp
1075
        mov     ecx,ebp
711
	stc
1076
        stc
712
	ret
1077
        ret
713
      lower_case:
1078
      instructions_down:
714
	mov	edi,converted
1079
        shr     edx,1
715
	mov	ebx,characters
1080
        jmp     scan_instructions
716
      convert_case:
-
 
717
	lods	byte [esi]
1081
      instructions_up:
718
	xlat	byte [ebx]
1082
        lea     ebx,[edi+ecx+3]
719
	stos	byte [edi]
-
 
720
	loop	convert_case
1083
        shr     edx,1
721
      case_ok:
-
 
722
	ret
1084
        adc     edx,-1
723
      instruction_ok:
-
 
724
	lea	esi,[edx+ebp]
-
 
725
	mov	al,[ebx]
-
 
726
	mov	bx,[ebx+1]
-
 
727
	clc
-
 
Line 728... Line 1085...
728
	ret
1085
        jmp     scan_instructions
729
 
1086
 
730
get_label_id:
1087
get_label_id:
731
	cmp	ecx,100h
1088
        cmp     ecx,100h
Line 738... Line 1095...
738
	je	standard_label
1095
        je      standard_label
739
	cmp	[current_locals_prefix],0
1096
        cmp     [current_locals_prefix],0
740
	je	standard_label
1097
        je      standard_label
741
	push	edi
1098
        push    edi
742
	mov	edi,[memory_end]
1099
        mov     edi,[additional_memory_end]
743
	sub	edi,2
1100
        sub     edi,2
744
	sub	edi,ecx
1101
        sub     edi,ecx
745
	push	ecx esi
1102
        push    ecx esi
746
	mov	esi,[current_locals_prefix]
1103
        mov     esi,[current_locals_prefix]
747
	lods	byte [esi]
1104
        lods    byte [esi]
748
	movzx	ecx,al
1105
        movzx   ecx,al
749
	sub	edi,ecx
1106
        sub     edi,ecx
750
	cmp	edi,[esp+8]
1107
        cmp     edi,[free_additional_memory]
751
	jb	out_of_memory
1108
        jb      out_of_memory
752
	mov	[memory_end],edi
1109
        mov     word [edi],0
753
	mov	word [edi],0
-
 
754
	add	edi,2
1110
        add     edi,2
755
	mov	ebx,edi
1111
        mov     ebx,edi
756
	rep	movs byte [edi],[esi]
1112
        rep     movs byte [edi],[esi]
757
	pop	esi ecx
1113
        pop     esi ecx
758
	add	al,cl
1114
        add     al,cl
759
	jc	name_too_long
1115
        jc      name_too_long
760
	rep	movs byte [edi],[esi]
1116
        rep     movs byte [edi],[esi]
761
	pop	edi
1117
        pop     edi
762
	push	esi
1118
        push    ebx esi
763
	movzx	ecx,al
1119
        movzx   ecx,al
764
	mov	byte [ebx-1],al
1120
        mov     byte [ebx-1],al
765
	mov	esi,ebx
1121
        mov     esi,ebx
766
	call	get_label_id
1122
        call    get_label_id
767
	pop	esi
1123
        pop     esi ebx
768
	ret
1124
        cmp     ebx,[eax+24]
-
 
1125
        jne     composed_label_id_ok
-
 
1126
        lea     edx,[ebx-2]
-
 
1127
        mov     [additional_memory_end],edx
-
 
1128
      composed_label_id_ok:
-
 
1129
        ret
769
      anonymous_label:
1130
      anonymous_label:
770
	cmp	ecx,2
1131
        cmp     ecx,2
771
	jne	standard_label
1132
        jne     standard_label
772
	mov	al,[esi+1]
1133
        mov     al,[esi+1]
773
	mov	ebx,characters
1134
        mov     ebx,characters
Line 785... Line 1146...
785
	or	eax,eax
1146
        or      eax,eax
786
	jnz	anonymous_ok
1147
        jnz     anonymous_ok
787
	mov	eax,[current_line]
1148
        mov     eax,[current_line]
788
	mov	[error_line],eax
1149
        mov     [error_line],eax
789
	mov	eax,[labels_list]
1150
        call    allocate_label
790
	sub	eax,24
-
 
791
	mov	[labels_list],eax
-
 
792
	mov	[anonymous_forward],eax
1151
        mov     [anonymous_forward],eax
793
      anonymous_ok:
1152
      anonymous_ok:
794
	xor	ebx,ebx
1153
        xor     ebx,ebx
795
	ret
1154
        ret
796
      anonymous_back:
1155
      anonymous_back:
797
	add	esi,2
1156
        add     esi,2
Line 803... Line 1162...
803
	add	esi,2
1162
        add     esi,2
804
	mov	eax,[anonymous_forward]
1163
        mov     eax,[anonymous_forward]
805
	or	eax,eax
1164
        or      eax,eax
806
	jnz	new_anonymous_ok
1165
        jnz     new_anonymous_ok
807
	mov	eax,[labels_list]
1166
        call    allocate_label
808
	sub	eax,24
-
 
809
	mov	[labels_list],eax
-
 
810
      new_anonymous_ok:
1167
      new_anonymous_ok:
811
	mov	[anonymous_reverse],eax
1168
        mov     [anonymous_reverse],eax
812
	mov	[anonymous_forward],0
1169
        mov     [anonymous_forward],0
813
	jmp	anonymous_ok
1170
        jmp     anonymous_ok
814
      standard_label:
1171
      standard_label:
815
	cmp	byte [esi],'%'
1172
        cmp     byte [esi],'%'
Line 889... Line 1246...
889
      compare_labels:
1246
      compare_labels:
890
	mov	esi,ebx
1247
        mov     esi,ebx
891
	mov	ecx,edx
1248
        mov     ecx,edx
892
	mov	edi,[eax+4]
1249
        mov     edi,[eax+4]
893
	repe	cmps byte [esi],[edi]
1250
        mov     edi,[edi+24]
-
 
1251
        repe    cmps byte [esi],[edi]
894
	je	label_found
1252
        je      label_found
895
	mov	eax,[eax]
1253
        mov     eax,[eax]
896
	or	eax,eax
1254
        or      eax,eax
897
	jnz	compare_labels
1255
        jnz     compare_labels
898
	jmp	add_label
1256
        jmp     add_label
899
      label_found:
1257
      label_found:
900
	add	esp,4
1258
        add     esp,4
901
	pop	edi
1259
        pop     edi
902
	mov	ebx,[eax+4]
1260
        mov     eax,[eax+4]
903
	mov	eax,[eax+8]
-
 
904
	ret
1261
        ret
905
      extend_tree:
1262
      extend_tree:
906
	mov	edx,[free_additional_memory]
1263
        mov     edx,[free_additional_memory]
907
	lea	eax,[edx+8]
1264
        lea     eax,[edx+8]
908
	cmp	eax,[additional_memory_end]
1265
        cmp     eax,[additional_memory_end]
909
	ja	out_of_memory
1266
        ja      out_of_memory
Line 936... Line 1293...
936
	je	reserved_word
1293
        je      reserved_word
937
      check_for_reserved_word:
1294
      check_for_reserved_word:
938
	call	get_instruction
1295
        call    get_instruction
939
	jnc	reserved_word
1296
        jnc     reserved_word
940
	mov	edi,data_directives
1297
        call    get_data_directive
941
	call	get_symbol
1298
        jnc     reserved_word
942
	jnc	reserved_word
-
 
943
	mov	edi,symbols
-
 
944
	call	get_symbol
-
 
945
	jnc	reserved_word
-
 
946
	mov	edi,formatter_symbols
1299
        call    get_symbol
947
	call	get_symbol
-
 
948
	jnc	reserved_word
1300
        jnc     reserved_word
949
	sub	esi,2
1301
        sub     esi,2
950
	mov	edi,operators
1302
        mov     edi,operators
951
	call	get_operator
1303
        call    get_operator
952
	or	al,al
1304
        or      al,al
Line 963... Line 1315...
963
	movzx	ecx,byte [esi]
1315
        movzx   ecx,byte [esi]
964
	inc	esi
1316
        inc     esi
965
      label_name_ok:
1317
      label_name_ok:
966
	mov	edx,[free_additional_memory]
1318
        mov     edx,[free_additional_memory]
967
	lea	eax,[edx+12]
1319
        lea     eax,[edx+8]
968
	cmp	eax,[additional_memory_end]
1320
        cmp     eax,[additional_memory_end]
969
	ja	out_of_memory
1321
        ja      out_of_memory
970
	mov	[free_additional_memory],eax
1322
        mov     [free_additional_memory],eax
971
	mov	[edx+4],esi
1323
        mov     ebx,esi
972
	mov	ebx,esi
-
 
973
	add	esi,ecx
1324
        add     esi,ecx
974
	mov	eax,[label_leaf]
1325
        mov     eax,[label_leaf]
975
	mov	edi,[eax]
1326
        mov     edi,[eax]
976
	mov	[edx],edi
1327
        mov     [edx],edi
977
	mov	[eax],edx
1328
        mov     [eax],edx
978
	mov	eax,[labels_list]
1329
        call    allocate_label
979
	sub	eax,24
1330
        mov     [edx+4],eax
980
	mov	[labels_list],eax
-
 
981
	mov	[edx+8],eax
1331
        mov     [eax+24],ebx
982
	pop	edi
1332
        pop     edi
983
	ret
1333
        ret
984
      reserved_word:
1334
      reserved_word:
985
	mov	eax,0Fh
1335
        mov     eax,0Fh
986
	pop	edi
1336
        pop     edi
987
	ret
1337
        ret
988
 
1338
      allocate_label:
-
 
1339
        mov     eax,[labels_list]
-
 
1340
        mov     ecx,LABEL_STRUCTURE_SIZE shr 2
-
 
1341
      initialize_label:
-
 
1342
        sub     eax,4
-
 
1343
        mov     dword [eax],0
-
 
1344
        loop    initialize_label
-
 
1345
        mov     [labels_list],eax
-
 
1346
        ret
-
 
1347
 
Line 989... Line -...
989
operators:
-
 
990
 db 1,'+',80h
-
 
991
 db 1,'-',81h
-
 
992
 db 1,'*',90h
-
 
993
 db 1,'/',91h
-
 
994
 db 3,'mod',0A0h
-
 
995
 db 3,'and',0B0h
-
 
996
 db 2,'or',0B1h
-
 
997
 db 3,'xor',0B2h
-
 
998
 db 3,'shl',0C0h
-
 
999
 db 3,'shr',0C1h
-
 
1000
 db 0
-
 
1001
 
-
 
1002
single_operand_operators:
1348
LABEL_STRUCTURE_SIZE = 32
1003
 db 1,'+',0
-
 
1004
 db 1,'-',0D1h
-
 
1005
 db 3,'not',0D0h
-
 
1006
 db 3,'rva',0E0h
-
 
1007
 db 0
-
 
1008
 
-
 
1009
directive_operators:
-
 
1010
 db 2,'as',86h
-
 
1011
 db 2,'at',80h
-
 
1012
 db 7,'defined',88h
-
 
1013
 db 3,'dup',81h
-
 
1014
 db 2,'eq',0F0h
-
 
1015
 db 6,'eqtype',0F7h
-
 
1016
 db 4,'from',82h
-
 
1017
 db 2,'in',0F6h
-
 
1018
 db 2,'on',84h
-
 
1019
 db 3,'ptr',85h
-
 
1020
 db 4,'used',89h
-
 
1021
 db 0
-