Rev 3011 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3011 | Rev 4039 | ||
---|---|---|---|
Line -... | Line 1... | ||
- | 1 | ; flat assembler core |
|
1 | ; flat assembler core |
2 | ; Copyright (c) 1999-2013, Tomasz Grysztar. |
2 | ; Copyright (c) 1999-2012, Tomasz Grysztar. |
3 | ; All rights reserved. |
3 | ; All rights reserved. |
4 | |
Line 4... | Line 5... | ||
4 | 5 | calculate_expression: |
|
5 | calculate_expression: |
6 | mov [current_offset],edi |
6 | mov [current_offset],edi |
7 | mov [value_undefined],0 |
Line 167... | Line 168... | ||
167 | mov eax,[ebx+4] |
168 | stos dword [edi] |
168 | stos dword [edi] |
169 | mov [edi-8+13],cl |
169 | mov [edi-8+13],cl |
170 | got_label: |
170 | got_label: |
171 | test byte [ebx+9],4 |
171 | cmp [symbols_file],0 |
172 | jnz invalid_use_of_symbol |
- | 173 | cmp [symbols_file],0 |
|
- | 174 | je label_reference_ok |
|
172 | je label_reference_ok |
175 | cmp [next_pass_needed],0 |
173 | cmp [next_pass_needed],0 |
176 | jne label_reference_ok |
174 | jne label_reference_ok |
177 | call store_label_reference |
175 | call store_label_reference |
178 | label_reference_ok: |
176 | label_reference_ok: |
179 | mov al,[ebx+11] |
Line 212... | Line 215... | ||
212 | mov eax,[current_offset] |
215 | make_current_offset_label: |
213 | make_current_offset_label: |
216 | xor edx,edx |
214 | xor edx,edx |
217 | xor ch,ch |
215 | xor ch,ch |
218 | mov ebp,[addressing_space] |
216 | sub eax,dword [org_origin] |
219 | sub eax,[ds:ebp] |
- | 220 | sbb edx,[ds:ebp+4] |
|
217 | sbb edx,dword [org_origin+4] |
221 | sbb ch,[ds:ebp+8] |
218 | sbb ch,[org_origin_sign] |
222 | jp current_offset_label_ok |
219 | jp current_offset_label_ok |
223 | call recoverable_overflow |
220 | call recoverable_overflow |
224 | current_offset_label_ok: |
221 | current_offset_label_ok: |
225 | stos dword [edi] |
222 | stos dword [edi] |
226 | mov eax,edx |
223 | mov eax,edx |
227 | stos dword [edi] |
224 | stos dword [edi] |
228 | mov eax,[ds:ebp+10h] |
225 | mov eax,[org_registers] |
229 | stos dword [edi] |
226 | stos dword [edi] |
230 | mov cl,[ds:ebp+9] |
227 | mov cl,[labels_type] |
231 | mov [edi-12+12],cx |
228 | mov [edi-12+12],cx |
232 | mov eax,[ds:ebp+14h] |
229 | mov eax,[org_symbol] |
233 | mov [edi-12+16],eax |
230 | mov [edi-12+16],eax |
234 | add edi,8 |
231 | add edi,8 |
235 | jmp calculation_loop |
232 | jmp calculation_loop |
236 | org_origin_label: |
233 | org_origin_label: |
237 | mov eax,[addressing_space] |
234 | mov eax,[org_start] |
238 | mov eax,[eax+18h] |
- | 239 | jmp make_current_offset_label |
|
235 | jmp make_current_offset_label |
240 | counter_label: |
236 | counter_label: |
241 | mov eax,[counter] |
237 | mov eax,[counter] |
242 | make_dword_label_value: |
238 | make_dword_label_value: |
243 | stos dword [edi] |
239 | stos dword [edi] |
244 | xor eax,eax |
240 | xor eax,eax |
245 | stos dword [edi] |
Line 284... | Line 289... | ||
284 | mov [error],edx |
289 | mov [error_info],ebx |
285 | mov [error_info],ebx |
290 | jmp calculation_loop |
286 | jmp calculation_loop |
291 | calculate_add: |
287 | calculate_add: |
292 | xor ah,ah |
288 | mov ecx,[ebx+16] |
293 | mov ah,[ebx+12] |
- | 294 | mov al,[edi+12] |
|
289 | cmp byte [edi+12],0 |
295 | or al,al |
290 | je add_values |
296 | jz add_values |
- | 297 | or ah,ah |
|
291 | mov ecx,[edi+16] |
298 | jz add_relocatable |
- | 299 | add ah,al |
|
- | 300 | jnz invalid_add |
|
- | 301 | mov ecx,[edi+16] |
|
- | 302 | cmp ecx,[ebx+16] |
|
292 | cmp byte [ebx+12],0 |
303 | je add_values |
293 | je add_values |
304 | invalid_add: |
294 | call recoverable_misuse |
305 | call recoverable_misuse |
- | 306 | jmp add_values |
|
295 | add_values: |
307 | add_relocatable: |
296 | mov al,[edi+12] |
308 | mov ah,al |
- | 309 | mov ecx,[edi+16] |
|
297 | or [ebx+12],al |
310 | mov [ebx+16],ecx |
298 | mov [ebx+16],ecx |
311 | add_values: |
299 | mov eax,[edi] |
312 | mov [ebx+12],ah |
- | 313 | mov eax,[edi] |
|
- | 314 | add [ebx],eax |
|
300 | add [ebx],eax |
315 | mov eax,[edi+4] |
301 | mov eax,[edi+4] |
316 | adc [ebx+4],eax |
302 | adc [ebx+4],eax |
317 | mov al,[edi+13] |
303 | mov al,[edi+13] |
318 | adc [ebx+13],al |
304 | adc [ebx+13],al |
319 | jp add_sign_ok |
Line 308... | Line 323... | ||
308 | or dx,dx |
323 | jz calculation_loop |
309 | jz calculation_loop |
324 | push esi |
310 | push esi |
325 | mov esi,ebx |
311 | mov esi,ebx |
326 | mov cl,[edi+10] |
312 | lea ebx,[edi+10] |
327 | mov al,[edi+8] |
313 | mov cl,[edi+8] |
328 | call add_register |
314 | call add_register |
329 | mov cl,[edi+11] |
315 | lea ebx,[edi+11] |
330 | mov al,[edi+9] |
316 | mov cl,[edi+9] |
331 | call add_register |
317 | call add_register |
332 | pop esi |
318 | pop esi |
333 | jmp calculation_loop |
319 | jmp calculation_loop |
334 | add_register: |
320 | add_register: |
335 | or al,al |
321 | or cl,cl |
336 | jz add_register_done |
322 | jz add_register_done |
337 | add_register_start: |
323 | add_register_start: |
338 | cmp [esi+8],al |
324 | cmp [esi+8],cl |
339 | jne add_in_second_slot |
325 | jne add_in_second_slot |
340 | add [esi+10],cl |
326 | mov al,[ebx] |
341 | jo value_out_of_range |
327 | add [esi+10],al |
- | |
328 | jo value_out_of_range |
342 | jnz add_register_done |
329 | jnz add_register_done |
343 | mov byte [esi+8],0 |
330 | mov byte [esi+8],0 |
344 | ret |
331 | ret |
345 | add_in_second_slot: |
332 | add_in_second_slot: |
346 | cmp [esi+9],al |
333 | cmp [esi+9],cl |
347 | jne create_in_first_slot |
334 | jne create_in_first_slot |
348 | add [esi+11],cl |
335 | mov al,[ebx] |
349 | jo value_out_of_range |
336 | add [esi+11],al |
- | |
337 | jo value_out_of_range |
350 | jnz add_register_done |
338 | jnz add_register_done |
351 | mov byte [esi+9],0 |
339 | mov byte [esi+9],0 |
352 | ret |
340 | ret |
353 | create_in_first_slot: |
341 | create_in_first_slot: |
354 | cmp byte [esi+8],0 |
342 | cmp byte [esi+8],0 |
355 | jne create_in_second_slot |
343 | jne create_in_second_slot |
356 | mov [esi+8],al |
344 | mov [esi+8],cl |
357 | mov [esi+10],cl |
345 | mov al,[ebx] |
358 | ret |
346 | mov [esi+10],al |
- | |
347 | ret |
359 | create_in_second_slot: |
348 | create_in_second_slot: |
360 | cmp byte [esi+9],0 |
349 | cmp byte [esi+9],0 |
361 | jne invalid_expression |
350 | jne invalid_expression |
362 | mov [esi+9],al |
351 | mov [esi+9],cl |
363 | mov [esi+11],cl |
352 | mov al,[ebx] |
364 | add_register_done: |
353 | mov [esi+11],al |
- | |
354 | add_register_done: |
365 | ret |
355 | ret |
366 | out_of_range: |
356 | out_of_range: |
367 | jmp calculation_loop |
357 | jmp calculation_loop |
368 | calculate_sub: |
358 | calculate_sub: |
369 | xor ah,ah |
359 | xor ah,ah |
370 | mov ah,[ebx+12] |
360 | mov ah,[ebx+12] |
371 | mov al,[edi+12] |
361 | mov al,[edi+12] |
372 | or al,al |
362 | or al,al |
373 | jz sub_values |
363 | jz sub_values |
374 | or ah,ah |
364 | cmp al,ah |
375 | jz negate_relocatable |
- | 376 | cmp al,ah |
|
- | 377 | jne invalid_sub |
|
365 | jne invalid_sub |
378 | xor ah,ah |
366 | xor ah,ah |
379 | mov ecx,[edi+16] |
367 | mov ecx,[edi+16] |
380 | cmp ecx,[ebx+16] |
368 | cmp ecx,[ebx+16] |
381 | je sub_values |
369 | je sub_values |
382 | invalid_sub: |
370 | invalid_sub: |
383 | call recoverable_misuse |
371 | call recoverable_misuse |
384 | jmp sub_values |
372 | sub_values: |
385 | negate_relocatable: |
- | 386 | neg al |
|
- | 387 | mov ah,al |
|
- | 388 | mov ecx,[edi+16] |
|
- | 389 | mov [ebx+16],ecx |
|
- | 390 | sub_values: |
|
- | 391 | mov [ebx+12],ah |
|
373 | mov [ebx+12],ah |
392 | mov eax,[edi] |
374 | mov eax,[edi] |
393 | sub [ebx],eax |
375 | sub [ebx],eax |
394 | mov eax,[edi+4] |
376 | mov eax,[edi+4] |
395 | sbb [ebx+4],eax |
377 | sbb [ebx+4],eax |
396 | mov al,[edi+13] |
Line 385... | Line 404... | ||
385 | or dx,dx |
404 | jz calculation_loop |
386 | jz calculation_loop |
405 | push esi |
387 | push esi |
406 | mov esi,ebx |
388 | mov esi,ebx |
407 | mov cl,[edi+10] |
389 | lea ebx,[edi+10] |
408 | mov al,[edi+8] |
390 | mov cl,[edi+8] |
409 | call sub_register |
391 | call sub_register |
410 | mov cl,[edi+11] |
392 | lea ebx,[edi+11] |
411 | mov al,[edi+9] |
393 | mov cl,[edi+9] |
412 | call sub_register |
394 | call sub_register |
413 | pop esi |
395 | pop esi |
414 | jmp calculation_loop |
396 | jmp calculation_loop |
415 | sub_register: |
397 | sub_register: |
416 | or al,al |
398 | or cl,cl |
417 | jz add_register_done |
399 | jz add_register_done |
418 | neg cl |
400 | neg byte [ebx] |
419 | jo value_out_of_range |
401 | jo value_out_of_range |
420 | jmp add_register_start |
402 | jmp add_register_start |
421 | calculate_mul: |
403 | calculate_mul: |
422 | or dx,dx |
404 | or dx,dx |
423 | jz mul_start |
405 | jz mul_start |
424 | cmp word [ebx+8],0 |
406 | cmp word [ebx+8],0 |
425 | jne mul_start |
Line 418... | Line 437... | ||
418 | mov esi,ebx |
437 | xor bl,bl |
419 | xor bl,bl |
438 | cmp byte [esi+13],0 |
420 | cmp byte [esi+13],0 |
439 | je mul_first_sign_ok |
421 | je mul_first_sign_ok |
440 | xor bl,-1 |
422 | mov eax,[esi] |
441 | mov eax,[esi] |
- | 442 | mov edx,[esi+4] |
|
423 | mov edx,[esi+4] |
443 | not eax |
424 | not eax |
444 | not edx |
425 | not edx |
445 | add eax,1 |
426 | add eax,1 |
446 | adc edx,0 |
427 | adc edx,0 |
447 | mov [esi],eax |
428 | mov [esi],eax |
448 | mov [esi+4],edx |
429 | mov [esi+4],edx |
449 | or eax,edx |
430 | or eax,edx |
450 | jz mul_overflow |
431 | jz mul_overflow |
451 | mul_first_sign_ok: |
432 | xor bl,-1 |
452 | cmp byte [edi+13],0 |
433 | mul_first_sign_ok: |
- | |
434 | cmp byte [edi+13],0 |
453 | je mul_second_sign_ok |
435 | je mul_second_sign_ok |
454 | xor bl,-1 |
436 | mov eax,[edi] |
455 | cmp byte [esi+8],0 |
- | 456 | je mul_first_register_sign_ok |
|
- | 457 | neg byte [esi+10] |
|
- | 458 | jo invalid_expression |
|
- | 459 | mul_first_register_sign_ok: |
|
- | 460 | cmp byte [esi+9],0 |
|
- | 461 | je mul_second_register_sign_ok |
|
- | 462 | neg byte [esi+11] |
|
- | 463 | jo invalid_expression |
|
- | 464 | mul_second_register_sign_ok: |
|
- | 465 | mov eax,[edi] |
|
- | 466 | mov edx,[edi+4] |
|
437 | mov edx,[edi+4] |
467 | not eax |
438 | not eax |
468 | not edx |
439 | not edx |
469 | add eax,1 |
440 | add eax,1 |
470 | adc edx,0 |
441 | adc edx,0 |
471 | mov [edi],eax |
442 | mov [edi],eax |
472 | mov [edi+4],edx |
443 | mov [edi+4],edx |
473 | or eax,edx |
444 | or eax,edx |
474 | jz mul_overflow |
445 | jz mul_overflow |
475 | mul_second_sign_ok: |
446 | xor bl,-1 |
476 | cmp dword [esi+4],0 |
447 | mul_second_sign_ok: |
- | |
448 | cmp dword [esi+4],0 |
477 | jz mul_numbers |
449 | jz mul_numbers |
478 | cmp dword [edi+4],0 |
450 | cmp dword [edi+4],0 |
479 | jz mul_numbers |
451 | jz mul_numbers |
480 | jnz mul_overflow |
452 | jnz mul_overflow |
481 | mul_numbers: |
Line 873... | Line 902... | ||
873 | not word [edi+4] |
902 | not dword [edi] |
874 | not dword [edi] |
903 | jmp finish_not |
875 | jmp finish_not |
904 | calculate_neg: |
876 | calculate_neg: |
905 | cmp byte [edi+8],0 |
877 | cmp word [edi+8],0 |
906 | je neg_first_register_ok |
878 | jne invalid_expression |
907 | neg byte [edi+10] |
- | 908 | jo invalid_expression |
|
- | 909 | neg_first_register_ok: |
|
879 | cmp byte [edi+12],0 |
910 | cmp byte [edi+9],0 |
- | 911 | je neg_second_register_ok |
|
880 | je neg_ok |
912 | neg byte [edi+11] |
881 | call recoverable_misuse |
913 | jo invalid_expression |
882 | neg_ok: |
914 | neg_second_register_ok: |
- | 915 | neg byte [edi+12] |
|
883 | xor eax,eax |
916 | xor eax,eax |
- | 917 | xor edx,edx |
|
884 | xor edx,edx |
918 | xor cl,cl |
885 | xor cl,cl |
919 | xchg eax,[edi] |
886 | xchg eax,[edi] |
920 | xchg edx,[edi+4] |
887 | xchg edx,[edi+4] |
921 | xchg cl,[edi+13] |
888 | xchg cl,[edi+13] |
922 | sub [edi],eax |
Line 1103... | Line 1137... | ||
1103 | div_ok: |
1137 | mov [esi+13],bl |
1104 | mov [esi+13],bl |
1138 | ret |
1105 | ret |
1139 | store_label_reference: |
1106 | store_label_reference: |
1140 | mov eax,[tagged_blocks] |
1107 | mov eax,[display_buffer] |
1141 | mov dword [eax-4],2 |
1108 | mov dword [eax-4],2 |
1142 | mov dword [eax-8],4 |
1109 | mov dword [eax-8],4 |
1143 | sub eax,8+4 |
1110 | sub eax,8+4 |
1144 | cmp eax,edi |
1111 | cmp eax,edi |
1145 | jbe out_of_memory |
1112 | jbe out_of_memory |
1146 | mov [tagged_blocks],eax |
1113 | mov [display_buffer],eax |
1147 | mov [eax],ebx |
1114 | mov [eax],ebx |
1148 | ret |
1115 | ret |
1149 | convert_fp: |
1116 | convert_fp: |
1150 | inc esi |
1117 | inc esi |
1151 | and word [edi+8],0 |
1118 | and word [edi+8],0 |
1152 | and word [edi+12],0 |
1119 | and word [edi+12],0 |
1153 | mov al,[value_size] |
Line 1518... | Line 1552... | ||
1518 | jmp truncated_value |
1552 | get_address_word_value: |
1519 | get_address_word_value: |
1553 | mov [address_size],2 |
1520 | mov [address_size],2 |
1554 | mov [value_size],2 |
1521 | mov [value_size],2 |
1555 | mov [free_address_range],0 |
1522 | jmp calculate_address |
1556 | jmp calculate_address |
- | 1557 | get_address_dword_value: |
|
1523 | get_address_dword_value: |
1558 | mov [address_size],4 |
1524 | mov [address_size],4 |
1559 | mov [value_size],4 |
1525 | mov [value_size],4 |
1560 | mov [free_address_range],0 |
1526 | jmp calculate_address |
1561 | jmp calculate_address |
- | 1562 | get_address_qword_value: |
|
1527 | get_address_qword_value: |
1563 | mov [address_size],8 |
1528 | mov [address_size],8 |
1564 | mov [value_size],8 |
1529 | mov [value_size],8 |
1565 | mov [free_address_range],0 |
1530 | jmp calculate_address |
1566 | jmp calculate_address |
- | 1567 | get_address_value: |
|
1531 | get_address_value: |
1568 | mov [address_size],0 |
1532 | mov [address_size],0 |
1569 | mov [value_size],8 |
1533 | mov [value_size],8 |
1570 | or [free_address_range],-1 |
1534 | calculate_address: |
1571 | calculate_address: |
- | 1572 | cmp byte [esi],'.' |
|
1535 | cmp byte [esi],'.' |
1573 | je invalid_address |
1536 | je invalid_address |
1574 | call calculate_expression |
1537 | call calculate_expression |
1575 | mov eax,[edi+16] |
1538 | mov eax,[edi+16] |
1576 | mov [address_symbol],eax |
1539 | mov [address_symbol],eax |
1577 | mov al,[edi+13] |
1540 | mov al,[edi+13] |
1578 | mov [address_sign],al |
1541 | mov [address_sign],al |
1579 | mov al,[edi+12] |
1542 | mov al,[edi+12] |
1580 | mov [value_type],al |
1543 | mov [value_type],al |
1581 | cmp al,0 |
1544 | cmp al,6 |
1582 | je address_size_ok |
- | 1583 | jg get_address_symbol_size |
|
- | 1584 | neg al |
|
- | 1585 | get_address_symbol_size: |
|
- | 1586 | cmp al,6 |
|
- | 1587 | je special_address_type_32bit |
|
1545 | je special_address_type_32bit |
1588 | cmp al,5 |
1546 | cmp al,5 |
1589 | je special_address_type_32bit |
1547 | je special_address_type_32bit |
1590 | ja invalid_address_type |
1548 | ja invalid_use_of_symbol |
1591 | test al,1 |
1549 | test al,1 |
1592 | jnz invalid_address_type |
1550 | jnz invalid_use_of_symbol |
1593 | shl al,5 |
1551 | or al,al |
1594 | jmp address_symbol_ok |
1552 | jz address_size_ok |
- | |
1553 | shl al,5 |
- | |
1554 | jmp address_symbol_ok |
1595 | invalid_address_type: |
1555 | special_address_type_32bit: |
1596 | call recoverable_misuse |
- | 1597 | special_address_type_32bit: |
|
- | 1598 | mov al,40h |
|
1556 | mov al,40h |
1599 | address_symbol_ok: |
1557 | address_symbol_ok: |
1600 | mov ah,[address_size] |
1558 | mov ah,[address_size] |
1601 | or [address_size],al |
1559 | or [address_size],al |
1602 | shr al,4 |
1560 | shr al,4 |
1603 | or ah,ah |
Line 1619... | Line 1662... | ||
1619 | cmp al,8 |
1662 | je sib_allowed |
1620 | je sib_allowed |
1663 | cmp al,0Fh |
1621 | cmp al,0Fh |
1664 | je check_ip_relative_address |
1622 | je check_ip_relative_address |
1665 | cmp cl,1 |
1623 | or cl,cl |
1666 | ja invalid_address |
1624 | jz check_word_value |
- | |
1625 | cmp cl,1 |
- | |
1626 | je check_word_value |
1667 | cmp [free_address_range],0 |
- | 1668 | jne check_qword_value |
|
- | 1669 | jmp check_word_value |
|
1627 | jmp invalid_address |
1670 | address_sizes_do_not_match: |
1628 | address_sizes_do_not_match: |
1671 | cmp al,0Fh |
1629 | cmp al,0Fh |
1672 | jne invalid_address |
1630 | jne invalid_address |
1673 | mov al,bh |
1631 | mov al,bh |
1674 | and al,0Fh |
1632 | and al,0Fh |
1675 | cmp al,ah |
1633 | cmp al,ah |
1676 | jne invalid_address |
1634 | jne invalid_address |
1677 | check_ip_relative_address: |
1635 | check_ip_relative_address: |
1678 | or bl,bl |
1636 | or bl,bl |
1679 | jnz invalid_address |
1637 | jnz invalid_address |
1680 | cmp bh,0F8h |
1638 | cmp bh,0F4h |
1681 | je check_rip_relative_address |
1639 | je check_dword_value |
- | |
1640 | cmp bh,0F8h |
- | |
1641 | jne invalid_address |
1682 | cmp bh,0F4h |
- | 1683 | jne invalid_address |
|
- | 1684 | cmp [free_address_range],0 |
|
1642 | mov eax,[edi] |
1685 | jne check_qword_value |
- | 1686 | jmp check_dword_value |
|
- | 1687 | check_rip_relative_address: |
|
- | 1688 | mov eax,[edi] |
|
- | 1689 | cdq |
|
1643 | cdq |
1690 | cmp edx,[edi+4] |
1644 | cmp edx,[edi+4] |
1691 | jne range_exceeded |
1645 | jne range_exceeded |
1692 | cmp dl,[edi+13] |
1646 | cmp dl,[edi+13] |
1693 | jne range_exceeded |
1647 | jne range_exceeded |
1694 | ret |
Line 1692... | Line 1739... | ||
1692 | special_index_scale: |
1739 | mov bh,bl |
1693 | mov bh,bl |
1740 | dec cl |
1694 | dec cl |
1741 | check_immediate_address: |
1695 | check_immediate_address: |
1742 | cmp [free_address_range],0 |
1696 | mov al,[address_size] |
1743 | jne check_qword_value |
- | 1744 | mov al,[address_size] |
|
- | 1745 | and al,0Fh |
|
1697 | and al,0Fh |
1746 | cmp al,2 |
1698 | cmp al,2 |
1747 | je check_word_value |
1699 | je check_word_value |
1748 | cmp al,4 |
1700 | cmp al,4 |
1749 | je check_dword_value |
1701 | je check_dword_value |
1750 | cmp al,8 |
Line 1776... | Line 1825... | ||
1776 | cmp [value_undefined],0 |
1825 | jne relative_offset_ok |
1777 | jne relative_offset_ok |
1826 | test bh,bh |
1778 | test bh,bh |
1827 | setne ch |
1779 | setne ch |
1828 | cmp bx,[ds:ebp+10h] |
1780 | cmp bx,word [org_registers] |
1829 | je origin_registers_ok |
1781 | je origin_registers_ok |
1830 | xchg bh,bl |
1782 | xchg bh,bl |
1831 | xchg ch,cl |
1783 | xchg ch,cl |
1832 | cmp bx,[ds:ebp+10h] |
1784 | cmp bx,word [org_registers] |
1833 | jne invalid_value |
1785 | jne invalid_value |
1834 | origin_registers_ok: |
1786 | origin_registers_ok: |
1835 | cmp cx,[ds:ebp+10h+2] |
1787 | cmp cx,word [org_registers+2] |
1836 | jne invalid_value |
1788 | jne invalid_value |
1837 | mov bl,[address_sign] |
1789 | mov bl,[address_sign] |
1838 | add eax,[ds:ebp] |
1790 | add eax,dword [org_origin] |
1839 | adc edx,[ds:ebp+4] |
1791 | adc edx,dword [org_origin+4] |
1840 | adc bl,[ds:ebp+8] |
1792 | adc bl,[org_origin_sign] |
1841 | sub eax,edi |
1793 | sub eax,edi |
1842 | sbb edx,0 |
1794 | sbb edx,0 |
1843 | sbb bl,0 |
1795 | sbb bl,0 |
1844 | mov [value_sign],bl |
1796 | mov [value_sign],bl |
1845 | mov bl,[value_type] |
1797 | mov bl,[value_type] |
1846 | mov ecx,[address_symbol] |
1798 | mov ecx,[address_symbol] |
1847 | mov [symbol_identifier],ecx |
Line 1800... | Line 1849... | ||
1800 | test bl,1 |
1849 | jnz relative_offset_unallowed |
1801 | jnz relative_offset_unallowed |
1850 | cmp bl,6 |
1802 | cmp bl,6 |
1851 | je plt_relative_offset |
1803 | je plt_relative_offset |
1852 | mov bh,[ds:ebp+9] |
1804 | mov bh,[labels_type] |
1853 | cmp bl,bh |
1805 | cmp bl,bh |
1854 | je set_relative_offset_type |
1806 | je set_relative_offset_type |
1855 | cmp bx,0402h |
1807 | cmp bx,0402h |
1856 | je set_relative_offset_type |
1808 | je set_relative_offset_type |
1857 | relative_offset_unallowed: |
1809 | relative_offset_unallowed: |
1858 | call recoverable_misuse |
1810 | call recoverable_misuse |
1859 | set_relative_offset_type: |
1811 | set_relative_offset_type: |
1860 | cmp [value_type],0 |
1812 | cmp [value_type],0 |
1861 | je relative_offset_ok |
1813 | je relative_offset_ok |
1862 | mov [value_type],0 |
1814 | mov [value_type],0 |
1863 | cmp ecx,[ds:ebp+14h] |
1815 | cmp ecx,[org_symbol] |
1864 | je relative_offset_ok |
1816 | je relative_offset_ok |
1865 | mov [value_type],3 |
1817 | mov [value_type],3 |
1866 | relative_offset_ok: |
1818 | relative_offset_ok: |
1867 | ret |
1819 | ret |
1868 | plt_relative_offset: |
1820 | plt_relative_offset: |
1869 | mov [value_type],7 |
1821 | mov [value_type],7 |
1870 | cmp byte [ds:ebp+9],2 |
1822 | cmp [labels_type],2 |
1871 | je relative_offset_ok |
1823 | je relative_offset_ok |
1872 | cmp byte [ds:ebp+9],4 |
1824 | cmp [labels_type],4 |
1873 | jne recoverable_misuse |
1825 | jne recoverable_misuse |
1874 | ret |
1826 | ret |
1875 | |
1827 | 1876 | calculate_logical_expression: |
|
Line 1828... | Line 1877... | ||
1828 | calculate_logical_expression: |
1877 | xor al,al |
1829 | xor al,al |
1878 | calculate_embedded_logical_expression: |
Line 1904... | Line 1953... | ||
1904 | cmp al,'0' |
1953 | je given_false |
1905 | je given_false |
1954 | cmp al,'1' |
1906 | cmp al,'1' |
1955 | je given_true |
1907 | je given_true |
1956 | cmp al,'(' |
1908 | call get_value_for_comparison |
1957 | jne invalid_value |
- | 1958 | call get_value_for_comparison |
|
- | 1959 | mov bh,[value_sign] |
|
1909 | mov bh,[value_sign] |
1960 | push eax edx [symbol_identifier] ebx ecx |
1910 | push eax edx [symbol_identifier] ebx ecx |
1961 | mov al,[esi] |
1911 | mov al,[esi] |
1962 | or al,al |
1912 | or al,al |
1963 | jz logical_number |
1913 | jz logical_number |
1964 | cmp al,0Fh |
Line 1920... | Line 1971... | ||
1920 | cmp al,'|' |
1971 | je logical_number |
1921 | je logical_number |
1972 | inc esi |
1922 | inc esi |
1973 | mov [compare_type],al |
1923 | mov [compare_type],al |
1974 | cmp byte [esi],'(' |
1924 | call get_value_for_comparison |
1975 | jne invalid_value |
- | 1976 | call get_value_for_comparison |
|
- | 1977 | cmp bl,[esp+4] |
|
1925 | cmp bl,[esp+4] |
1978 | jne values_not_relative |
1926 | jne values_not_relative |
1979 | or bl,bl |
1927 | or bl,bl |
1980 | jz check_values_registers |
1928 | jz check_values_registers |
1981 | mov ebx,[symbol_identifier] |
1929 | mov ebx,[symbol_identifier] |
1982 | cmp ebx,[esp+8] |
Line 2171... | Line 2224... | ||
2171 | cmp al,2 |
2224 | je skip_label |
2172 | je skip_label |
2225 | cmp al,3 |
2173 | cmp al,3 |
2226 | je skip_label |
2174 | je skip_label |
2227 | cmp al,4 |
2175 | cmp al,20h |
2228 | je skip_special_label |
- | 2229 | cmp al,20h |
|
- | 2230 | jb skip_assembler_symbol |
|
2176 | jb skip_assembler_symbol |
2231 | cmp al,'(' |
2177 | cmp al,'(' |
2232 | je skip_expression |
2178 | je skip_expression |
2233 | cmp al,'[' |
2179 | cmp al,'[' |
2234 | je skip_address |
2180 | je skip_address |
2235 | skip_done: |
Line 2187... | Line 2242... | ||
2187 | add esi,2 |
2242 | skip_assembler_symbol: |
2188 | skip_assembler_symbol: |
2243 | inc esi |
2189 | inc esi |
2244 | jmp skip_done |
2190 | jmp skip_done |
2245 | skip_special_label: |
2191 | skip_address: |
2246 | add esi,4 |
- | 2247 | jmp skip_done |
|
- | 2248 | skip_address: |
|
- | 2249 | mov al,[esi] |
|
2192 | mov al,[esi] |
2250 | and al,11110000b |
2193 | and al,11110000b |
2251 | cmp al,60h |
2194 | cmp al,60h |
2252 | jb skip_expression |
2195 | jb skip_expression |
2253 | cmp al,70h |
2196 | cmp al,70h |
2254 | ja skip_expression |