Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4038 → Rev 4039

/programs/develop/fasm/trunk/exprcalc.inc
1,6 → 1,7
 
 
; flat assembler core
; Copyright (c) 1999-2012, Tomasz Grysztar.
; Copyright (c) 1999-2013, Tomasz Grysztar.
; All rights reserved.
 
calculate_expression:
169,6 → 170,8
stos dword [edi]
mov [edi-8+13],cl
got_label:
test byte [ebx+9],4
jnz invalid_use_of_symbol
cmp [symbols_file],0
je label_reference_ok
cmp [next_pass_needed],0
214,9 → 217,10
make_current_offset_label:
xor edx,edx
xor ch,ch
sub eax,dword [org_origin]
sbb edx,dword [org_origin+4]
sbb ch,[org_origin_sign]
mov ebp,[addressing_space]
sub eax,[ds:ebp]
sbb edx,[ds:ebp+4]
sbb ch,[ds:ebp+8]
jp current_offset_label_ok
call recoverable_overflow
current_offset_label_ok:
223,16 → 227,17
stos dword [edi]
mov eax,edx
stos dword [edi]
mov eax,[org_registers]
mov eax,[ds:ebp+10h]
stos dword [edi]
mov cl,[labels_type]
mov cl,[ds:ebp+9]
mov [edi-12+12],cx
mov eax,[org_symbol]
mov eax,[ds:ebp+14h]
mov [edi-12+16],eax
add edi,8
jmp calculation_loop
org_origin_label:
mov eax,[org_start]
mov eax,[addressing_space]
mov eax,[eax+18h]
jmp make_current_offset_label
counter_label:
mov eax,[counter]
286,17 → 291,27
mov [error_info],ebx
jmp calculation_loop
calculate_add:
mov ecx,[ebx+16]
cmp byte [edi+12],0
je add_values
xor ah,ah
mov ah,[ebx+12]
mov al,[edi+12]
or al,al
jz add_values
or ah,ah
jz add_relocatable
add ah,al
jnz invalid_add
mov ecx,[edi+16]
cmp byte [ebx+12],0
cmp ecx,[ebx+16]
je add_values
invalid_add:
call recoverable_misuse
jmp add_values
add_relocatable:
mov ah,al
mov ecx,[edi+16]
mov [ebx+16],ecx
add_values:
mov al,[edi+12]
or [ebx+12],al
mov [ebx+16],ecx
mov [ebx+12],ah
mov eax,[edi]
add [ebx],eax
mov eax,[edi+4]
310,31 → 325,29
jz calculation_loop
push esi
mov esi,ebx
lea ebx,[edi+10]
mov cl,[edi+8]
mov cl,[edi+10]
mov al,[edi+8]
call add_register
lea ebx,[edi+11]
mov cl,[edi+9]
mov cl,[edi+11]
mov al,[edi+9]
call add_register
pop esi
jmp calculation_loop
add_register:
or cl,cl
or al,al
jz add_register_done
add_register_start:
cmp [esi+8],cl
cmp [esi+8],al
jne add_in_second_slot
mov al,[ebx]
add [esi+10],al
add [esi+10],cl
jo value_out_of_range
jnz add_register_done
mov byte [esi+8],0
ret
add_in_second_slot:
cmp [esi+9],cl
cmp [esi+9],al
jne create_in_first_slot
mov al,[ebx]
add [esi+11],al
add [esi+11],cl
jo value_out_of_range
jnz add_register_done
mov byte [esi+9],0
342,16 → 355,14
create_in_first_slot:
cmp byte [esi+8],0
jne create_in_second_slot
mov [esi+8],cl
mov al,[ebx]
mov [esi+10],al
mov [esi+8],al
mov [esi+10],cl
ret
create_in_second_slot:
cmp byte [esi+9],0
jne invalid_expression
mov [esi+9],cl
mov al,[ebx]
mov [esi+11],al
mov [esi+9],al
mov [esi+11],cl
add_register_done:
ret
out_of_range:
362,6 → 373,8
mov al,[edi+12]
or al,al
jz sub_values
or ah,ah
jz negate_relocatable
cmp al,ah
jne invalid_sub
xor ah,ah
370,6 → 383,12
je sub_values
invalid_sub:
call recoverable_misuse
jmp sub_values
negate_relocatable:
neg al
mov ah,al
mov ecx,[edi+16]
mov [ebx+16],ecx
sub_values:
mov [ebx+12],ah
mov eax,[edi]
387,18 → 406,18
jz calculation_loop
push esi
mov esi,ebx
lea ebx,[edi+10]
mov cl,[edi+8]
mov cl,[edi+10]
mov al,[edi+8]
call sub_register
lea ebx,[edi+11]
mov cl,[edi+9]
mov cl,[edi+11]
mov al,[edi+9]
call sub_register
pop esi
jmp calculation_loop
sub_register:
or cl,cl
or al,al
jz add_register_done
neg byte [ebx]
neg cl
jo value_out_of_range
jmp add_register_start
calculate_mul:
420,6 → 439,7
xor bl,bl
cmp byte [esi+13],0
je mul_first_sign_ok
xor bl,-1
mov eax,[esi]
mov edx,[esi+4]
not eax
430,10 → 450,20
mov [esi+4],edx
or eax,edx
jz mul_overflow
xor bl,-1
mul_first_sign_ok:
cmp byte [edi+13],0
je mul_second_sign_ok
xor bl,-1
cmp byte [esi+8],0
je mul_first_register_sign_ok
neg byte [esi+10]
jo invalid_expression
mul_first_register_sign_ok:
cmp byte [esi+9],0
je mul_second_register_sign_ok
neg byte [esi+11]
jo invalid_expression
mul_second_register_sign_ok:
mov eax,[edi]
mov edx,[edi+4]
not eax
444,7 → 474,6
mov [edi+4],edx
or eax,edx
jz mul_overflow
xor bl,-1
mul_second_sign_ok:
cmp dword [esi+4],0
jz mul_numbers
875,12 → 904,17
not dword [edi]
jmp finish_not
calculate_neg:
cmp word [edi+8],0
jne invalid_expression
cmp byte [edi+12],0
je neg_ok
call recoverable_misuse
neg_ok:
cmp byte [edi+8],0
je neg_first_register_ok
neg byte [edi+10]
jo invalid_expression
neg_first_register_ok:
cmp byte [edi+9],0
je neg_second_register_ok
neg byte [edi+11]
jo invalid_expression
neg_second_register_ok:
neg byte [edi+12]
xor eax,eax
xor edx,edx
xor cl,cl
1105,13 → 1139,13
mov [esi+13],bl
ret
store_label_reference:
mov eax,[display_buffer]
mov eax,[tagged_blocks]
mov dword [eax-4],2
mov dword [eax-8],4
sub eax,8+4
cmp eax,edi
jbe out_of_memory
mov [display_buffer],eax
mov [tagged_blocks],eax
mov [eax],ebx
ret
convert_fp:
1520,18 → 1554,22
get_address_word_value:
mov [address_size],2
mov [value_size],2
mov [free_address_range],0
jmp calculate_address
get_address_dword_value:
mov [address_size],4
mov [value_size],4
mov [free_address_range],0
jmp calculate_address
get_address_qword_value:
mov [address_size],8
mov [value_size],8
mov [free_address_range],0
jmp calculate_address
get_address_value:
mov [address_size],0
mov [value_size],8
or [free_address_range],-1
calculate_address:
cmp byte [esi],'.'
je invalid_address
1542,17 → 1580,22
mov [address_sign],al
mov al,[edi+12]
mov [value_type],al
cmp al,0
je address_size_ok
jg get_address_symbol_size
neg al
get_address_symbol_size:
cmp al,6
je special_address_type_32bit
cmp al,5
je special_address_type_32bit
ja invalid_use_of_symbol
ja invalid_address_type
test al,1
jnz invalid_use_of_symbol
or al,al
jz address_size_ok
jnz invalid_address_type
shl al,5
jmp address_symbol_ok
invalid_address_type:
call recoverable_misuse
special_address_type_32bit:
mov al,40h
address_symbol_ok:
1621,11 → 1664,11
je sib_allowed
cmp al,0Fh
je check_ip_relative_address
or cl,cl
jz check_word_value
cmp cl,1
je check_word_value
jmp invalid_address
ja invalid_address
cmp [free_address_range],0
jne check_qword_value
jmp check_word_value
address_sizes_do_not_match:
cmp al,0Fh
jne invalid_address
1636,10 → 1679,14
check_ip_relative_address:
or bl,bl
jnz invalid_address
cmp bh,0F8h
je check_rip_relative_address
cmp bh,0F4h
je check_dword_value
cmp bh,0F8h
jne invalid_address
cmp [free_address_range],0
jne check_qword_value
jmp check_dword_value
check_rip_relative_address:
mov eax,[edi]
cdq
cmp edx,[edi+4]
1694,6 → 1741,8
mov bh,bl
dec cl
check_immediate_address:
cmp [free_address_range],0
jne check_qword_value
mov al,[address_size]
and al,0Fh
cmp al,2
1778,19 → 1827,19
jne relative_offset_ok
test bh,bh
setne ch
cmp bx,word [org_registers]
cmp bx,[ds:ebp+10h]
je origin_registers_ok
xchg bh,bl
xchg ch,cl
cmp bx,word [org_registers]
cmp bx,[ds:ebp+10h]
jne invalid_value
origin_registers_ok:
cmp cx,word [org_registers+2]
cmp cx,[ds:ebp+10h+2]
jne invalid_value
mov bl,[address_sign]
add eax,dword [org_origin]
adc edx,dword [org_origin+4]
adc bl,[org_origin_sign]
add eax,[ds:ebp]
adc edx,[ds:ebp+4]
adc bl,[ds:ebp+8]
sub eax,edi
sbb edx,0
sbb bl,0
1802,7 → 1851,7
jnz relative_offset_unallowed
cmp bl,6
je plt_relative_offset
mov bh,[labels_type]
mov bh,[ds:ebp+9]
cmp bl,bh
je set_relative_offset_type
cmp bx,0402h
1813,7 → 1862,7
cmp [value_type],0
je relative_offset_ok
mov [value_type],0
cmp ecx,[org_symbol]
cmp ecx,[ds:ebp+14h]
je relative_offset_ok
mov [value_type],3
relative_offset_ok:
1820,9 → 1869,9
ret
plt_relative_offset:
mov [value_type],7
cmp [labels_type],2
cmp byte [ds:ebp+9],2
je relative_offset_ok
cmp [labels_type],4
cmp byte [ds:ebp+9],4
jne recoverable_misuse
ret
 
1906,6 → 1955,8
je given_false
cmp al,'1'
je given_true
cmp al,'('
jne invalid_value
call get_value_for_comparison
mov bh,[value_sign]
push eax edx [symbol_identifier] ebx ecx
1922,6 → 1973,8
je logical_number
inc esi
mov [compare_type],al
cmp byte [esi],'('
jne invalid_value
call get_value_for_comparison
cmp bl,[esp+4]
jne values_not_relative
2173,6 → 2226,8
je skip_label
cmp al,3
je skip_label
cmp al,4
je skip_special_label
cmp al,20h
jb skip_assembler_symbol
cmp al,'('
2189,6 → 2244,9
skip_assembler_symbol:
inc esi
jmp skip_done
skip_special_label:
add esi,4
jmp skip_done
skip_address:
mov al,[esi]
and al,11110000b