/programs/develop/fasm/trunk/assemble.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
assembler: |
12,7 → 12,7 |
mov [actual_fixups_size],eax |
assembler_loop: |
mov eax,[labels_list] |
mov [display_buffer],eax |
mov [tagged_blocks],eax |
mov eax,[additional_memory] |
mov [free_additional_memory],eax |
mov eax,[additional_memory_end] |
22,11 → 22,7 |
xor eax,eax |
mov dword [adjustment],eax |
mov dword [adjustment+4],eax |
mov dword [org_origin],edi |
mov dword [org_origin+4],eax |
mov [org_start],edi |
mov [org_registers],eax |
mov [org_symbol],eax |
mov [addressing_space],eax |
mov [error_line],eax |
mov [counter],eax |
mov [format_flags],eax |
35,11 → 31,9 |
mov [file_extension],eax |
mov [next_pass_needed],al |
mov [output_format],al |
mov [org_origin_sign],al |
mov [adjustment_sign],al |
mov [labels_type],al |
mov [virtual_data],al |
mov [code_type],16 |
call init_addressing_space |
pass_loop: |
call assemble_line |
jnc pass_loop |
46,7 → 40,7 |
mov eax,[additional_memory_end] |
cmp eax,[structures_buffer] |
je pass_done |
sub eax,20h |
sub eax,18h |
mov eax,[eax+4] |
mov [current_line],eax |
jmp missing_end_directive |
141,8 → 135,36 |
assemble_ok: |
ret |
create_addressing_space: |
mov ebx,[addressing_space] |
test ebx,ebx |
jz init_addressing_space |
test byte [ebx+0Ah],1 |
jnz illegal_instruction |
mov eax,edi |
sub eax,[ebx+18h] |
mov [ebx+1Ch],eax |
init_addressing_space: |
mov ebx,[tagged_blocks] |
mov dword [ebx-4],10h |
mov dword [ebx-8],20h |
sub ebx,8+20h |
cmp ebx,edi |
jbe out_of_memory |
mov [tagged_blocks],ebx |
mov [addressing_space],ebx |
xor eax,eax |
mov [ebx],edi |
mov [ebx+4],eax |
mov [ebx+8],eax |
mov [ebx+10h],eax |
mov [ebx+14h],eax |
mov [ebx+18h],edi |
mov [ebx+1Ch],eax |
ret |
assemble_line: |
mov eax,[display_buffer] |
mov eax,[tagged_blocks] |
sub eax,100h |
cmp edi,eax |
ja out_of_memory |
153,6 → 175,8 |
cmp al,3 |
jb define_label |
je define_constant |
cmp al,4 |
je label_addressing_space |
cmp al,0Fh |
je new_line |
cmp al,13h |
164,7 → 188,7 |
code_type_setting: |
lods byte [esi] |
mov [code_type],al |
jmp line_assembled |
jmp instruction_assembled |
new_line: |
lods dword [esi] |
mov [current_line],eax |
173,30 → 197,19 |
je continue_line |
cmp [next_pass_needed],0 |
jne continue_line |
mov ebx,[display_buffer] |
mov ebx,[tagged_blocks] |
mov dword [ebx-4],1 |
mov dword [ebx-8],1Ch |
sub ebx,8+1Ch |
mov dword [ebx-8],14h |
sub ebx,8+14h |
cmp ebx,edi |
jbe out_of_memory |
mov [display_buffer],ebx |
mov [tagged_blocks],ebx |
mov [ebx],eax |
mov [ebx+4],edi |
mov eax,dword [org_origin] |
mov edx,dword [org_origin+4] |
mov ecx,[org_registers] |
mov eax,[addressing_space] |
mov [ebx+8],eax |
mov [ebx+8+4],edx |
mov [ebx+10h],ecx |
mov edx,[org_symbol] |
; mov al,[virtual_data] |
; mov ah,[org_origin_sign] |
; shl eax,16 |
; mov al,[labels_type] |
; mov ah,[code_type] |
mov eax,dword [labels_type] |
mov [ebx+14h],edx |
mov [ebx+18h],eax |
mov al,[code_type] |
mov [ebx+10h],al |
continue_line: |
cmp byte [esi],0Fh |
je line_assembled |
215,15 → 228,16 |
mov eax,edi |
xor edx,edx |
xor cl,cl |
sub eax,dword [org_origin] |
sbb edx,dword [org_origin+4] |
sbb cl,[org_origin_sign] |
mov ebp,[addressing_space] |
sub eax,[ds:ebp] |
sbb edx,[ds:ebp+4] |
sbb cl,[ds:ebp+8] |
jp label_value_ok |
call recoverable_overflow |
label_value_ok: |
mov [address_sign],cl |
cmp [virtual_data],0 |
jne make_virtual_label |
test byte [ds:ebp+0Ah],1 |
jnz make_virtual_label |
or byte [ebx+9],1 |
xchg eax,[ebx] |
xchg edx,[ebx+4] |
251,10 → 265,11 |
setne al |
or ah,al |
finish_label: |
mov ch,[labels_type] |
mov ebp,[addressing_space] |
mov ch,[ds:ebp+9] |
mov cl,[label_size] |
mov ebp,[org_registers] |
mov edx,[org_symbol] |
mov edx,[ds:ebp+14h] |
mov ebp,[ds:ebp+10h] |
finish_label_symbol: |
mov al,[address_sign] |
xor al,[ebx+9] |
289,6 → 304,8 |
jz new_label |
cmp cx,[ebx+16] |
je symbol_already_defined |
btr dword [ebx+8],10 |
jc requalified_label |
inc cx |
sub cx,[ebx+16] |
setnz al |
299,6 → 316,7 |
mov cx,[current_pass] |
cmp cx,[ebx+18] |
jne label_made |
requalified_label: |
or [next_pass_needed],-1 |
label_made: |
ret |
320,7 → 338,7 |
mov cx,[current_pass] |
cmp cx,[eax+16] |
je get_constant_value |
and dl,not 1 |
or dl,4 |
mov [eax+8],dl |
get_constant_value: |
push eax |
331,10 → 349,11 |
pop ebx |
mov ch,bl |
pop ebx |
pop dword [ebx+8] |
cmp ebx,0Fh |
jb invalid_use_of_symbol |
je reserved_word_used_as_symbol |
pop ecx |
test cl,4 |
jnz constant_referencing_mode_ok |
and byte [ebx+8],not 4 |
constant_referencing_mode_ok: |
xor cl,cl |
mov ch,[value_type] |
cmp ch,3 |
385,8 → 404,11 |
test byte [ebx+8],2 |
jz symbol_already_defined |
or byte [ebx+8],4 |
and byte [ebx+9],not 4 |
jmp instruction_assembled |
redeclare_constant: |
btr dword [ebx+8],10 |
jc requalified_constant |
inc cx |
sub cx,[ebx+16] |
setnz al |
399,11 → 421,37 |
mov cx,[current_pass] |
cmp cx,[ebx+18] |
jne instruction_assembled |
requalified_constant: |
or [next_pass_needed],-1 |
jmp instruction_assembled |
new_constant: |
or byte [ebx+8],1+2 |
jmp instruction_assembled |
label_addressing_space: |
lods dword [esi] |
cmp eax,0Fh |
jb invalid_use_of_symbol |
je reserved_word_used_as_symbol |
mov cx,[current_pass] |
test byte [eax+8],1 |
jz make_addressing_space_label |
cmp cx,[eax+16] |
je symbol_already_defined |
test byte [eax+9],4 |
jnz make_addressing_space_label |
or [next_pass_needed],-1 |
make_addressing_space_label: |
mov dx,[eax+8] |
and dx,not (2 or 100h) |
or dx,1 or 4 or 400h |
mov [eax+8],dx |
mov [eax+16],cx |
mov edx,[current_line] |
mov [eax+28],edx |
mov ebx,[addressing_space] |
mov [eax],ebx |
or byte [ebx+0Ah],2 |
jmp continue_line |
assemble_instruction: |
; mov [operand_size],0 |
; mov [size_override],0 |
446,22 → 494,31 |
mov cl,[value_type] |
test cl,1 |
jnz invalid_use_of_symbol |
mov [labels_type],cl |
mov dword [org_origin],edi |
xor ecx,ecx |
mov dword [org_origin+4],ecx |
mov [org_origin_sign],cl |
mov [org_registers],ecx |
push eax |
mov ebx,[addressing_space] |
mov eax,edi |
sub eax,[ebx+18h] |
mov [ebx+1Ch],eax |
test byte [ebx+0Ah],1 |
jnz in_virtual |
call init_addressing_space |
jmp org_space_ok |
in_virtual: |
call close_virtual_addressing_space |
call init_addressing_space |
or byte [ebx+0Ah],1 |
org_space_ok: |
pop eax |
mov [ebx+9],cl |
mov cl,[value_sign] |
sub dword [org_origin],eax |
sbb dword [org_origin+4],edx |
sbb [org_origin_sign],cl |
sub [ebx],eax |
sbb [ebx+4],edx |
sbb byte [ebx+8],cl |
jp org_value_ok |
call recoverable_overflow |
org_value_ok: |
mov [org_start],edi |
mov edx,[symbol_identifier] |
mov [org_symbol],edx |
mov [ebx+14h],edx |
cmp [output_format],1 |
ja instruction_assembled |
cmp edi,[code_start] |
502,9 → 559,8 |
lods byte [esi] |
cmp al,'(' |
jne invalid_argument |
push dword [ebx+8] |
push ebx ecx |
and byte [ebx+8],not 1 |
or byte [ebx+8],4 |
cmp byte [esi],'.' |
je invalid_value |
call get_address_value |
516,14 → 572,10 |
xchg bl,bh |
mov bp,bx |
pop ecx ebx |
pop dword [ebx+8] |
and byte [ebx+8],not 4 |
mov ch,[value_type] |
or ch,ch |
jz make_free_label |
cmp ch,4 |
je make_free_label |
cmp ch,2 |
jne invalid_use_of_symbol |
test ch,1 |
jnz invalid_use_of_symbol |
make_free_label: |
and byte [ebx+9],not 1 |
cmp eax,[ebx] |
558,39 → 610,17 |
mov [operand_size],al |
and dword [value],0 |
and dword [value+4],0 |
lods word [esi] |
cmp ax,82h+'(' shl 8 |
lods byte [esi] |
cmp al,82h |
jne invalid_argument |
load_from_code: |
cmp byte [esi],'.' |
je invalid_value |
or [size_override],-1 |
call get_address_value |
call calculate_relative_offset |
call get_data_point |
jc value_loaded |
push esi edi |
cmp [next_pass_needed],0 |
jne load_address_type_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
load_address_type_ok: |
cmp edx,-1 |
jne bad_load_address |
neg eax |
mov esi,edi |
sub esi,eax |
jc bad_load_address |
cmp esi,[org_start] |
jb bad_load_address |
mov esi,ebx |
mov edi,value |
movzx ecx,[operand_size] |
cmp ecx,eax |
ja bad_load_address |
rep movs byte [edi],[esi] |
jmp value_loaded |
bad_load_address: |
call recoverable_overflow |
pop edi esi |
value_loaded: |
pop edi esi |
mov [value_sign],0 |
mov eax,dword [value] |
mov edx,dword [value+4] |
597,6 → 627,85 |
pop ebx |
xor cx,cx |
jmp make_constant |
get_data_point: |
mov ebx,[addressing_space] |
mov ecx,edi |
sub ecx,[ebx+18h] |
mov [ebx+1Ch],ecx |
lods byte [esi] |
cmp al,'(' |
jne invalid_argument |
cmp byte [esi],11h |
jne get_data_address |
cmp word [esi+1+4],'):' |
jne get_data_address |
inc esi |
lods dword [esi] |
add esi,2 |
cmp byte [esi],'(' |
jne invalid_argument |
inc esi |
cmp eax,0Fh |
jbe reserved_word_used_as_symbol |
mov edx,undefined_symbol |
test byte [eax+8],1 |
jz addressing_space_unavailable |
mov edx,symbol_out_of_scope |
mov cx,[eax+16] |
cmp cx,[current_pass] |
jne addressing_space_unavailable |
test byte [eax+9],4 |
jz invalid_use_of_symbol |
mov ebx,eax |
mov ax,[current_pass] |
mov [ebx+18],ax |
or byte [ebx+8],8 |
cmp [symbols_file],0 |
je get_addressing_space |
cmp [next_pass_needed],0 |
jne get_addressing_space |
call store_label_reference |
get_addressing_space: |
mov ebx,[ebx] |
get_data_address: |
push ebx |
cmp byte [esi],'.' |
je invalid_value |
or [size_override],-1 |
call get_address_value |
pop ebp |
call calculate_relative_offset |
cmp [next_pass_needed],0 |
jne data_address_type_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
data_address_type_ok: |
mov ebx,edi |
xor ecx,ecx |
add ebx,eax |
adc edx,ecx |
mov eax,ebx |
sub eax,[ds:ebp+18h] |
sbb edx,ecx |
jnz bad_data_address |
mov cl,[operand_size] |
add eax,ecx |
cmp eax,[ds:ebp+1Ch] |
ja bad_data_address |
clc |
ret |
addressing_space_unavailable: |
cmp [error_line],0 |
jne get_data_address |
push [current_line] |
pop [error_line] |
mov [error],edx |
mov [error_info],eax |
jmp get_data_address |
bad_data_address: |
call recoverable_overflow |
stc |
ret |
store_directive: |
cmp byte [esi],11h |
je sized_store |
616,44 → 725,23 |
jne invalid_use_of_symbol |
mov dword [value],eax |
mov dword [value+4],edx |
lods word [esi] |
cmp ax,80h+'(' shl 8 |
lods byte [esi] |
cmp al,80h |
jne invalid_argument |
cmp byte [esi],'.' |
je invalid_value |
or [size_override],-1 |
call get_address_value |
call calculate_relative_offset |
call get_data_point |
jc instruction_assembled |
push esi edi |
cmp [next_pass_needed],0 |
jne store_address_type_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
store_address_type_ok: |
cmp edx,-1 |
jne bad_store_address |
neg eax |
sub edi,eax |
jc bad_store_address |
cmp edi,[org_start] |
jb bad_store_address |
mov esi,value |
movzx ecx,[operand_size] |
cmp ecx,eax |
ja bad_store_address |
mov edi,ebx |
rep movs byte [edi],[esi] |
mov eax,edi |
pop edi esi |
cmp edi,[undefined_data_end] |
jne instruction_assembled |
cmp ebx,[undefined_data_end] |
jae instruction_assembled |
cmp eax,[undefined_data_start] |
jbe instruction_assembled |
mov [undefined_data_start],eax |
jmp instruction_assembled |
bad_store_address: |
pop edi esi |
call recoverable_overflow |
jmp instruction_assembled |
display_directive: |
lods byte [esi] |
665,12 → 753,12 |
lods dword [esi] |
mov ecx,eax |
push edi |
mov edi,[display_buffer] |
mov edi,[tagged_blocks] |
sub edi,8 |
sub edi,eax |
cmp edi,[esp] |
jbe out_of_memory |
mov [display_buffer],edi |
mov [tagged_blocks],edi |
rep movs byte [edi],[esi] |
stos dword [edi] |
xor eax,eax |
681,9 → 769,9 |
display_byte: |
call get_byte_value |
push edi |
mov edi,[display_buffer] |
mov edi,[tagged_blocks] |
sub edi,8+1 |
mov [display_buffer],edi |
mov [tagged_blocks],edi |
stos byte [edi] |
mov eax,1 |
stos dword [edi] |
691,7 → 779,7 |
stos dword [edi] |
pop edi |
display_next: |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
ja out_of_memory |
lods byte [esi] |
cmp al,',' |
699,7 → 787,7 |
dec esi |
jmp instruction_assembled |
show_display_buffer: |
mov eax,[display_buffer] |
mov eax,[tagged_blocks] |
or eax,eax |
jz display_done |
mov esi,[labels_list] |
711,12 → 799,12 |
mov ecx,[esi] |
sub esi,ecx |
test eax,eax |
jnz skip_internal_message |
jnz skip_block |
push esi |
call display_block |
pop esi |
skip_internal_message: |
cmp esi,[display_buffer] |
skip_block: |
cmp esi,[tagged_blocks] |
jne display_messages |
display_done: |
ret |
779,28 → 867,41 |
jmp set_virtual |
virtual_at_current: |
dec esi |
mov al,[labels_type] |
mov ebp,[addressing_space] |
mov al,[ds:ebp+9] |
mov [value_type],al |
mov ebp,[org_symbol] |
mov eax,edi |
xor edx,edx |
xor cl,cl |
sub eax,dword [org_origin] |
sbb edx,dword [org_origin+4] |
sbb cl,[org_origin_sign] |
sub eax,[ds:ebp] |
sbb edx,[ds:ebp+4] |
sbb cl,[ds:ebp+8] |
mov [address_sign],cl |
mov bx,word [org_registers] |
mov cx,word [org_registers+2] |
mov bx,[ds:ebp+10h] |
mov cx,[ds:ebp+10h+2] |
xchg bh,bl |
xchg ch,cl |
mov ebp,[ds:ebp+14h] |
set_virtual: |
push [org_registers] |
mov byte [org_registers],bh |
mov byte [org_registers+1],bl |
mov byte [org_registers+2],ch |
mov byte [org_registers+3],cl |
xchg bl,bh |
xchg cl,ch |
shl ecx,16 |
mov cx,bx |
push ecx eax |
call allocate_structure_data |
mov word [ebx],virtual_directive-instruction_handler |
mov ecx,[addressing_space] |
mov [ebx+12],ecx |
mov [ebx+8],edi |
mov ecx,[current_line] |
mov [ebx+4],ecx |
mov ebx,[addressing_space] |
mov eax,edi |
sub eax,[ebx+18h] |
mov [ebx+1Ch],eax |
call init_addressing_space |
or byte [ebx+0Ah],1 |
pop eax |
mov cl,[address_sign] |
not eax |
not edx |
811,37 → 912,19 |
add eax,edi |
adc edx,0 |
adc cl,0 |
xchg dword [org_origin],eax |
xchg dword [org_origin+4],edx |
xchg [org_origin_sign],cl |
mov [ebx+10h],eax |
mov [ebx+14h],edx |
pop eax |
mov [ebx+18h],eax |
mov al,[virtual_data] |
and al,0Fh |
shl cl,4 |
or al,cl |
mov [ebx+2],al |
mov al,[labels_type] |
mov [ebx+3],al |
mov eax,edi |
xchg eax,[org_start] |
mov [ebx+0Ch],eax |
xchg ebp,[org_symbol] |
mov [ebx+1Ch],ebp |
mov [ebx+8],edi |
mov eax,[current_line] |
mov [ebx+4],eax |
or [virtual_data],-1 |
mov [ebx],eax |
mov [ebx+4],edx |
mov [ebx+8],cl |
pop dword [ebx+10h] |
mov [ebx+14h],ebp |
mov al,[value_type] |
test al,1 |
jnz invalid_use_of_symbol |
mov [labels_type],al |
mov [ebx+9],al |
jmp instruction_assembled |
allocate_structure_data: |
mov ebx,[structures_buffer] |
sub ebx,20h |
sub ebx,18h |
cmp ebx,[free_additional_memory] |
jb out_of_memory |
mov [structures_buffer],ebx |
853,7 → 936,7 |
je no_such_structure |
cmp ax,[ebx] |
je structure_data_found |
add ebx,20h |
add ebx,18h |
jmp scan_structures |
structure_data_found: |
ret |
863,27 → 946,11 |
end_virtual: |
call find_structure_data |
jc unexpected_instruction |
mov al,[ebx+2] |
mov ah,al |
shr ah,4 |
and al,1 |
neg al |
and ah,1 |
neg ah |
mov [virtual_data],al |
mov [org_origin_sign],ah |
mov al,[ebx+3] |
mov [labels_type],al |
mov eax,[ebx+10h] |
mov dword [org_origin],eax |
mov eax,[ebx+14h] |
mov dword [org_origin+4],eax |
mov eax,[ebx+18h] |
mov [org_registers],eax |
mov eax,[ebx+0Ch] |
mov [org_start],eax |
mov eax,[ebx+1Ch] |
mov [org_symbol],eax |
push ebx |
call close_virtual_addressing_space |
pop ebx |
mov eax,[ebx+12] |
mov [addressing_space],eax |
mov edi,[ebx+8] |
remove_structure_data: |
push esi edi |
891,13 → 958,55 |
sub ecx,[structures_buffer] |
shr ecx,2 |
lea esi,[ebx-4] |
lea edi,[esi+20h] |
lea edi,[esi+18h] |
std |
rep movs dword [edi],[esi] |
cld |
add [structures_buffer],20h |
add [structures_buffer],18h |
pop edi esi |
ret |
close_virtual_addressing_space: |
mov ebx,[addressing_space] |
mov eax,edi |
sub eax,[ebx+18h] |
mov [ebx+1Ch],eax |
test byte [ebx+0Ah],2 |
jz addressing_space_closed |
push esi edi ecx edx |
mov ecx,eax |
mov eax,[tagged_blocks] |
mov dword [eax-4],11h |
mov dword [eax-8],ecx |
sub eax,8 |
sub eax,ecx |
mov [tagged_blocks],eax |
lea edi,[eax+ecx-1] |
xchg eax,[ebx+18h] |
lea esi,[eax+ecx-1] |
mov eax,edi |
sub eax,esi |
std |
shr ecx,1 |
jnc virtual_byte_ok |
movs byte [edi],[esi] |
virtual_byte_ok: |
dec esi |
dec edi |
shr ecx,1 |
jnc virtual_word_ok |
movs word [edi],[esi] |
virtual_word_ok: |
sub esi,2 |
sub edi,2 |
rep movs dword [edi],[esi] |
cld |
xor edx,edx |
add [ebx],eax |
adc dword [ebx+4],edx |
adc byte [ebx+8],dl |
pop edx ecx edi esi |
addressing_space_closed: |
ret |
repeat_directive: |
cmp [prefixed_instruction],0 |
jne unexpected_instruction |
1193,7 → 1302,7 |
je break_while |
cmp ax,if_directive-instruction_handler |
je break_if |
add ebx,20h |
add ebx,18h |
jmp find_breakable_structure |
break_if: |
push [current_line] |
1235,14 → 1344,15 |
lods dword [esi] |
mov ecx,eax |
lea eax,[edi+ecx] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
ja out_of_memory |
rep movs byte [edi],[esi] |
inc esi |
ret |
undefined_data: |
cmp [virtual_data],0 |
je mark_undefined_data |
mov ebp,[addressing_space] |
test byte [ds:ebp+0Ah],1 |
jz mark_undefined_data |
ret |
mark_undefined_data: |
cmp eax,[undefined_data_end] |
1252,7 → 1362,7 |
mov [undefined_data_end],edi |
ret |
define_data: |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
cmp byte [esi],'(' |
jne simple_data_value |
1273,7 → 1383,7 |
duplicate_data: |
push eax esi |
duplicated_values: |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
call near dword [esp+8] |
lods byte [esi] |
1287,7 → 1397,7 |
mov esi,ebx |
jmp duplicate_data |
duplicate_single_data_value: |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
push eax esi |
call near dword [esp+8] |
1311,7 → 1421,7 |
call skip_symbol |
jmp data_defined |
simple_data_value: |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
call near dword [esp] |
data_defined: |
1354,7 → 1464,7 |
mov ecx,eax |
jecxz word_string_ok |
lea eax,[edi+ecx*2] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
ja out_of_memory |
xor ah,ah |
copy_word_string: |
1624,7 → 1734,7 |
mov edx,edi |
add edi,ecx |
jc out_of_memory |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
ja out_of_memory |
call read |
jc error_reading_file |
1704,7 → 1814,7 |
mov edx,ecx |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1739,7 → 1849,7 |
jc out_of_memory |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1769,7 → 1879,7 |
jc out_of_memory |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1796,7 → 1906,7 |
jc out_of_memory |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1820,7 → 1930,7 |
jc out_of_memory |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1843,7 → 1953,7 |
jc out_of_memory |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
1866,14 → 1976,15 |
cmp eax,1 |
je instruction_assembled |
mov ecx,edi |
sub ecx,dword [org_origin] |
cmp [org_registers],0 |
mov ebp,[addressing_space] |
sub ecx,[ds:ebp] |
cmp dword [ds:ebp+10h],0 |
jne section_not_aligned_enough |
cmp [labels_type],0 |
cmp byte [ds:ebp+9],0 |
je make_alignment |
cmp [output_format],3 |
je pe_alignment |
mov ebx,[org_symbol] |
mov ebx,[ds:ebp+14h] |
cmp byte [ebx],0 |
jne section_not_aligned_enough |
cmp eax,[ebx+10h] |
1892,7 → 2003,7 |
mov edx,ecx |
add edx,edi |
jc out_of_memory |
cmp edx,[display_buffer] |
cmp edx,[tagged_blocks] |
ja out_of_memory |
push edi |
cmp [next_pass_needed],0 |
/programs/develop/fasm/trunk/avx.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
avx_single_source_pd_instruction: |
/programs/develop/fasm/trunk/errors.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
out_of_memory: |
/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 |
/programs/develop/fasm/trunk/exprpars.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
convert_expression: |
/programs/develop/fasm/trunk/formats.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
formatter: |
129,7 → 129,7 |
je labels_table_ok |
mov ecx,[memory_end] |
sub ecx,[labels_list] |
mov edi,[display_buffer] |
mov edi,[tagged_blocks] |
sub edi,8 |
mov [edi],ecx |
or dword [edi+4],-1 |
136,7 → 136,7 |
sub edi,ecx |
cmp edi,[current_offset] |
jbe out_of_memory |
mov [display_buffer],edi |
mov [tagged_blocks],edi |
mov esi,[memory_end] |
copy_labels: |
sub esi,32 |
200,8 → 200,9 |
format_directive: |
cmp edi,[code_start] |
jne unexpected_instruction |
cmp [virtual_data],0 |
jne unexpected_instruction |
mov ebp,[addressing_space] |
test byte [ds:ebp+0Ah],1 |
jnz unexpected_instruction |
cmp [output_format],0 |
jne unexpected_instruction |
lods byte [esi] |
280,8 → 281,6 |
je pe_heap |
jmp illegal_instruction |
segment_directive: |
cmp [virtual_data],0 |
jne illegal_instruction |
mov al,[output_format] |
cmp al,2 |
je mz_segment |
289,8 → 288,6 |
je elf_segment |
jmp illegal_instruction |
section_directive: |
cmp [virtual_data],0 |
jne illegal_instruction |
mov al,[output_format] |
cmp al,3 |
je pe_section |
410,6 → 407,7 |
xor eax,eax |
xor edx,edx |
xor ebp,ebp |
mov [address_sign],0 |
mov ch,2 |
test [format_flags],8 |
jz make_free_label |
418,8 → 416,9 |
mark_relocation: |
cmp [value_type],0 |
je relocation_ok |
cmp [virtual_data],0 |
jne relocation_ok |
mov ebp,[addressing_space] |
test byte [ds:ebp+0Ah],1 |
jnz relocation_ok |
cmp [output_format],2 |
je mark_mz_relocation |
cmp [output_format],3 |
493,13 → 492,11 |
mov edx,edi |
xor eax,eax |
rep stos byte [edi] |
mov dword [org_origin],edi |
mov dword [org_origin+4],eax |
mov [org_origin_sign],al |
mov [org_registers],eax |
mov [org_start],edi |
mov eax,edx |
call undefined_data |
push ebx |
call create_addressing_space |
pop ebx |
mov eax,edi |
sub eax,[code_start] |
shr eax,4 |
515,9 → 512,10 |
mov [code_type],al |
mov eax,edx |
mov ch,1 |
mov [label_size],0 |
mov [address_sign],0 |
xor edx,edx |
xor ebp,ebp |
mov [label_size],0 |
mov [address_symbol],edx |
jmp make_free_label |
mz_entry: |
724,7 → 722,7 |
and ecx,not 11b |
add ecx,(40h-1Ch) shr 2 |
lea eax,[edi+ecx*4] |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
rep stos dword [edi] |
762,7 → 760,7 |
inc ecx |
shl ecx,1 |
lea eax,[edi+ecx*4] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
rep stos dword [edi] |
826,7 → 824,7 |
mov [esi+16h],ax |
mov word [esi+14h],100h |
mov byte [esi+18h],40h |
mov eax,[display_buffer] |
mov eax,[tagged_blocks] |
sub eax,ecx |
cmp edi,eax |
jae out_of_memory |
1053,7 → 1051,7 |
shl ebx,cl |
sub ebx,ebp |
mov ecx,ebx |
mov eax,[display_buffer] |
mov eax,[tagged_blocks] |
sub eax,ecx |
cmp edi,eax |
jae out_of_memory |
1117,12 → 1115,14 |
jc pe_labels_type_ok |
xor bh,bh |
pe_labels_type_ok: |
mov [labels_type],bh |
mov dword [org_origin],eax |
mov dword [org_origin+4],ecx |
mov [org_origin_sign],bl |
and [org_registers],0 |
mov [org_start],edi |
push eax ebx |
call init_addressing_space |
mov ebp,ebx |
pop ebx eax |
mov [ds:ebp],eax |
mov [ds:ebp+4],ecx |
mov [ds:ebp+8],bx |
mov [ds:ebp+18h],edi |
bt [format_flags],8 |
jnc dll_flag_ok |
or byte [edx+16h+1],20h |
1142,6 → 1142,10 |
jmp format_defined |
pe_section: |
call close_pe_section |
push eax ebx |
call create_addressing_space |
mov ebp,ebx |
pop ebx eax |
bts [format_flags],5 |
lea ecx,[ebx+28h] |
add edx,[edx+54h] |
1179,15 → 1183,14 |
mov edx,[code_start] |
mov eax,edi |
xor ecx,ecx |
mov [org_origin_sign],0 |
sub eax,[ebx+0Ch] |
sbb ecx,0 |
sbb [org_origin_sign],0 |
mov [labels_type],2 |
sbb byte [ds:ebp+8],0 |
mov byte [ds:ebp+9],2 |
mov [code_type],32 |
test [format_flags],8 |
jz pe_section_code_type_ok |
mov [labels_type],4 |
mov byte [ds:ebp+9],4 |
mov [code_type],64 |
pe_section_code_type_ok: |
test [format_flags],4 |
1194,23 → 1197,22 |
jnz peplus_section_org |
sub eax,[edx+34h] |
sbb ecx,0 |
sbb [org_origin_sign],0 |
sbb byte [ds:ebp+8],0 |
bt [resolver_flags],0 |
jc pe_section_org_ok |
mov [labels_type],0 |
mov byte [ds:ebp+9],0 |
jmp pe_section_org_ok |
peplus_section_org: |
sub eax,[edx+30h] |
sbb ecx,[edx+34h] |
sbb [org_origin_sign],0 |
sbb byte [ds:ebp+8],0 |
bt [resolver_flags],0 |
jc pe_section_org_ok |
mov [labels_type],0 |
mov byte [ds:ebp+9],0 |
pe_section_org_ok: |
mov dword [org_origin],eax |
mov dword [org_origin+4],ecx |
and [org_registers],0 |
mov [org_start],edi |
mov [ds:ebp],eax |
mov [ds:ebp+4],ecx |
mov [ds:ebp+18h],edi |
get_section_flags: |
lods byte [esi] |
cmp al,1Ah |
1541,7 → 1543,7 |
cmp edx,[ecx+74h] |
ja value_out_of_range |
jb instruction_assembled |
cmp eax,[edx+70h] |
cmp eax,[ecx+70h] |
ja value_out_of_range |
jmp instruction_assembled |
mark_pe_relocation: |
1664,7 → 1666,7 |
and [resource_size],0 |
reserve_space_for_resource: |
add edi,[resource_size] |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
ja out_of_memory |
jmp resource_done |
resource_from_file: |
1750,7 → 1752,7 |
mov [esi],eax |
mov [resource_data],edi |
lea eax,[edi+16] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
stos dword [edi] |
1812,7 → 1814,7 |
mov eax,[resource_data] |
inc word [eax+12] |
lea eax,[edi+8] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,ebx |
stos dword [edi] |
1849,7 → 1851,7 |
mov eax,[resource_data] |
inc word [eax+14] |
lea eax,[edi+8] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,ebx |
stos dword [edi] |
1870,7 → 1872,7 |
bts edx,31 |
mov [esi+4],edx |
lea eax,[edi+16] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
stos dword [edi] |
1949,7 → 1951,7 |
mov eax,[esp] |
inc word [eax+12] |
lea eax,[edi+8] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,ebx |
stos dword [edi] |
1992,7 → 1994,7 |
mov eax,[esp] |
inc word [eax+14] |
lea eax,[edi+8] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,ebx |
stos dword [edi] |
2031,7 → 2033,7 |
bts edx,31 |
mov [esi+4],edx |
lea eax,[edi+16] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
stos dword [edi] |
2081,7 → 2083,7 |
mov eax,[esp] |
inc word [eax+14] |
lea eax,[edi+8] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,ebx |
stos dword [edi] |
2122,7 → 2124,7 |
stos word [edi] |
copy_string_data: |
lea eax,[edi+2] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov ax,[edx] |
or ax,ax |
2160,7 → 2162,7 |
sub esi,[resource_data] |
xchg esi,[ebx+4] |
lea eax,[edi+16] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
mov eax,esi |
stos dword [edi] |
2190,7 → 2192,7 |
mov edx,edi |
mov ecx,[esi+4] |
add edi,ecx |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
ja out_of_memory |
call read |
mov eax,edi |
2319,28 → 2321,16 |
mov [current_section],ebx |
xor eax,eax |
mov [number_of_sections],eax |
call setup_coff_section_org |
mov edx,ebx |
call init_addressing_space |
mov [ebx+14h],edx |
mov byte [ebx+9],2 |
mov [code_type],32 |
test [format_flags],8 |
jz format_defined |
mov byte [ebx+9],4 |
mov [code_type],64 |
jmp format_defined |
setup_coff_section_org: |
xor eax,eax |
mov dword [org_origin],edi |
mov dword [org_origin+4],eax |
mov [org_origin_sign],al |
mov [org_registers],eax |
mov [org_start],edi |
mov [org_symbol],ebx |
test [format_flags],8 |
jnz coff_64bit_labels |
mov [labels_type],2 |
ret |
coff_64bit_labels: |
mov [labels_type],4 |
ret |
coff_section: |
call close_coff_section |
mov ebx,[free_additional_memory] |
2355,7 → 2345,15 |
mov [ebx+8],edi |
mov [ebx+10h],eax |
mov [ebx+14h],eax |
call setup_coff_section_org |
mov edx,ebx |
call create_addressing_space |
xchg edx,ebx |
mov [edx+14h],ebx |
mov byte [edx+9],2 |
test [format_flags],8 |
jz coff_labels_type_ok |
mov byte [edx+9],4 |
coff_labels_type_ok: |
lods word [esi] |
cmp ax,'(' |
jne invalid_argument |
2442,8 → 2440,10 |
test [format_flags],8 |
jnz coff_64bit_relocation |
mov al,6 |
cmp [value_type],2 |
je coff_relocation |
cmp [value_type],5 |
jne coff_relocation |
jne invalid_use_of_symbol |
inc al |
jmp coff_relocation |
coff_64bit_relocation: |
2451,8 → 2451,10 |
cmp [value_type],4 |
je coff_relocation |
mov al,2 |
cmp [value_type],2 |
je coff_relocation |
cmp [value_type],5 |
jne coff_relocation |
jne invalid_use_of_symbol |
inc al |
jmp coff_relocation |
coff_relocation_relative: |
2465,16 → 2467,17 |
sub eax,ebx |
add eax,4 |
relative_ok: |
mov ebx,[addressing_space] |
push eax |
mov al,20 |
test [format_flags],8 |
jnz relative_coff_64bit_relocation |
cmp [labels_type],2 |
cmp byte [ebx+9],2 |
jne invalid_use_of_symbol |
jmp coff_relocation |
relative_coff_64bit_relocation: |
mov al,4 |
cmp [labels_type],4 |
cmp byte [ebx+9],4 |
jne invalid_use_of_symbol |
coff_relocation: |
mov ebx,[free_additional_memory] |
2686,7 → 2689,7 |
jmp find_relocations |
add_relocation: |
lea eax,[ebx+0Ah] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
ja out_of_memory |
mov eax,[esi+4] |
mov [ebx],eax |
2905,7 → 2908,7 |
mov edx,edi |
mov ecx,34h shr 2 |
lea eax,[edi+ecx*4] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
rep stos dword [edi] |
2940,9 → 2943,14 |
mov [ebx+14h],eax |
mov al,4 |
mov [ebx+10h],eax |
call setup_coff_section_org |
mov edx,ebx |
call init_addressing_space |
xchg edx,ebx |
mov [edx+14h],ebx |
mov byte [edx+9],2 |
test [format_flags],8 |
jz format_defined |
mov byte [edx+9],4 |
mov byte [ebx+10h],8 |
jmp format_defined |
format_elf64: |
2949,7 → 2957,7 |
mov edx,edi |
mov ecx,40h shr 2 |
lea eax,[edi+ecx*4] |
cmp eax,[display_buffer] |
cmp eax,[tagged_blocks] |
jae out_of_memory |
xor eax,eax |
rep stos dword [edi] |
2984,7 → 2992,15 |
mov [ebx+10h],eax |
mov al,10b |
mov [ebx+14h],eax |
call setup_coff_section_org |
mov edx,ebx |
call create_addressing_space |
xchg edx,ebx |
mov [edx+14h],ebx |
mov byte [edx+9],2 |
test [format_flags],8 |
jz elf_labels_type_ok |
mov byte [edx+9],4 |
elf_labels_type_ok: |
lods word [esi] |
cmp ax,'(' |
jne invalid_argument |
3038,11 → 3054,13 |
mov byte [ebx+10h],8 |
jmp instruction_assembled |
mark_elf_relocation: |
push ebx |
mov ebx,[addressing_space] |
cmp [value_type],3 |
je elf_relocation_relative |
cmp [value_type],7 |
je elf_relocation_relative |
push ebx eax |
push eax |
cmp [value_type],5 |
je elf_gotoff_relocation |
ja invalid_use_of_symbol |
3059,9 → 3077,8 |
mov al,9 ; R_386_GOTOFF |
jmp coff_relocation |
elf_relocation_relative: |
cmp [labels_type],0 |
cmp byte [ebx+9],0 |
je invalid_use_of_symbol |
push ebx |
mov ebx,[current_section] |
mov ebx,[ebx+8] |
sub ebx,edi |
3690,11 → 3707,13 |
add eax,edi |
adc ebp,0 |
adc cl,0 |
mov dword [org_origin],eax |
mov dword [org_origin+4],edx |
mov [org_origin_sign],cl |
and [org_registers],0 |
mov [org_start],edi |
elf_exe_addressing_setup: |
push eax |
call init_addressing_space |
pop eax |
mov [ebx],eax |
mov [ebx+4],edx |
mov [ebx+8],cl |
mov [symbols_stream],edi |
jmp format_defined |
format_elf64_exe: |
3768,13 → 3787,7 |
add eax,edi |
adc edx,0 |
adc cl,0 |
mov dword [org_origin],eax |
mov dword [org_origin+4],edx |
mov [org_origin_sign],cl |
and [org_registers],0 |
mov [org_start],edi |
mov [symbols_stream],edi |
jmp format_defined |
jmp elf_exe_addressing_setup |
elf_entry: |
lods byte [esi] |
cmp al,'(' |
3804,6 → 3817,8 |
jnz elf64_segment |
call close_elf_segment |
push eax |
call create_addressing_space |
mov ebp,ebx |
mov ebx,[number_of_sections] |
shl ebx,5 |
add ebx,[code_start] |
3883,11 → 3898,10 |
add eax,edi |
adc edx,0 |
adc cl,0 |
mov dword [org_origin],eax |
mov dword [org_origin+4],edx |
mov [org_origin_sign],cl |
and [org_registers],0 |
mov [org_start],edi |
elf_segment_addressing_setup: |
mov [ds:ebp],eax |
mov [ds:ebp+4],edx |
mov [ds:ebp+8],cl |
inc [number_of_sections] |
jmp instruction_assembled |
close_elf_segment: |
3935,6 → 3949,8 |
elf64_segment: |
call close_elf64_segment |
push eax edx |
call create_addressing_space |
mov ebp,ebx |
mov ebx,[number_of_sections] |
imul ebx,38h |
add ebx,[code_start] |
4015,13 → 4031,7 |
add eax,edi |
adc edx,0 |
adc cl,0 |
mov dword [org_origin],eax |
mov dword [org_origin+4],edx |
mov [org_origin_sign],cl |
and [org_registers],0 |
mov [org_start],edi |
inc [number_of_sections] |
jmp instruction_assembled |
jmp elf_segment_addressing_setup |
close_elf64_segment: |
cmp [number_of_sections],0 |
jne finish_elf64_segment |
/programs/develop/fasm/trunk/messages.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
_out_of_memory db 'out of memory',0 |
/programs/develop/fasm/trunk/parser.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
parser: |
64,6 → 64,8 |
simple_label: |
pop edi |
call identify_label |
cmp byte [esi+1],':' |
je block_label |
mov byte [edi],2 |
inc edi |
stos dword [edi] |
71,6 → 73,12 |
xor al,al |
stos byte [edi] |
jmp parse_line |
block_label: |
mov byte [edi],4 |
inc edi |
stos dword [edi] |
add esi,2 |
jmp parse_line |
constant_label: |
pop edi |
call get_label_id |
127,8 → 135,6 |
cmp al,':' |
je invalid_name |
dec esi |
cmp al,3Bh |
je skip_rest_of_line |
mov [parenthesis_stack],0 |
call parse_argument |
jmp parse_next_line |
530,6 → 536,8 |
je unallowed_character |
cmp al,'`' |
je unallowed_character |
cmp al,3Bh |
je foreign_argument |
dec esi |
cmp al,1Ah |
jne expression_argument |
550,6 → 558,10 |
pop edi |
movs byte [edi],[esi] |
jmp argument_parsed |
foreign_argument: |
dec esi |
call skip_foreign_line |
jmp contents_parsed |
symbol_argument: |
pop edi |
stos word [edi] |
560,7 → 572,7 |
je ptr_argument |
stos byte [edi] |
cmp al,80h |
je forced_expression |
je forced_multipart_expression |
cmp al,8Ch |
je forced_expression |
cmp al,81h |
725,7 → 737,7 |
jmp argument_parsed |
parse_from_operator: |
cmp byte [esi],22h |
jne forced_expression |
jne forced_multipart_expression |
jmp argument_parsed |
parse_quoted_extrn: |
inc esi |
771,14 → 783,10 |
mov eax,[esi+1] |
lea ebx,[esi+5+eax] |
push ebx ecx esi edi |
mov al,'(' |
stos byte [edi] |
call convert_expression |
mov al,')' |
stos byte [edi] |
call parse_expression |
pop eax edx ecx ebx |
cmp esi,ebx |
jne expression_parsed |
jne expression_argument_parsed |
mov edi,eax |
mov esi,edx |
string_argument: |
799,7 → 807,14 |
rep movs dword [edi],[esi] |
xor al,al |
stos byte [edi] |
jmp expression_parsed |
jmp expression_argument_parsed |
parse_expression: |
mov al,'(' |
stos byte [edi] |
call convert_expression |
mov al,')' |
stos byte [edi] |
ret |
not_string: |
cmp byte [esi],'(' |
jne expression |
838,24 → 853,27 |
mov al,0F1h |
jmp expression_comparator |
expression: |
mov al,'(' |
stos byte [edi] |
call convert_expression |
mov al,')' |
stos byte [edi] |
jmp expression_parsed |
call parse_expression |
jmp expression_argument_parsed |
forced_expression: |
xor al,al |
xchg al,[formatter_symbols_allowed] |
push eax |
mov al,'(' |
stos byte [edi] |
call convert_expression |
mov al,')' |
stos byte [edi] |
call parse_expression |
forced_expression_parsed: |
pop eax |
mov [formatter_symbols_allowed],al |
jmp argument_parsed |
forced_multipart_expression: |
xor al,al |
xchg al,[formatter_symbols_allowed] |
push eax |
call parse_expression |
cmp byte [esi],':' |
jne forced_expression_parsed |
movs byte [edi],[esi] |
call parse_expression |
jmp forced_expression_parsed |
address_argument: |
call parse_address |
lods byte [esi] |
925,7 → 943,7 |
dec [parenthesis_stack] |
add esp,8 |
jmp argument_parsed |
expression_parsed: |
expression_argument_parsed: |
cmp [parenthesis_stack],0 |
je parse_argument |
cmp byte [esi],')' |
/programs/develop/fasm/trunk/preproce.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
preprocessor: |
38,7 → 38,7 |
mov [labels_list],eax |
xor eax,eax |
mov [source_start],eax |
mov [display_buffer],eax |
mov [tagged_blocks],eax |
mov [hash_tree],eax |
mov [error],eax |
mov [macro_status],al |
195,13 → 195,13 |
lods byte [esi] |
stos byte [edi] |
cmp al,0Ah |
je missing_end_quote |
je no_end_quote |
cmp al,0Dh |
je missing_end_quote |
je no_end_quote |
or al,al |
jz missing_end_quote |
jz no_end_quote |
cmp al,1Ah |
je missing_end_quote |
je no_end_quote |
cmp al,ah |
jne copy_string |
lods byte [esi] |
243,6 → 243,9 |
stos byte [edi] |
inc byte [ecx] |
jmp group_backslashes |
no_end_quote: |
mov byte [ebx-5],0 |
jmp missing_end_quote |
backslashed_symbol: |
cmp al,1Ah |
je unexpected_end_of_file |
554,6 → 557,9 |
call get_preprocessor_symbol |
jnc symbolic_constant_in_label |
lea esi,[esi+ecx+1] |
cmp byte [esi],':' |
jne preprocess_instruction |
inc esi |
jmp preprocess_instruction |
symbolic_constant_in_label: |
mov ebx,[edx+8] |
571,6 → 577,9 |
cmp byte [ebx],':' |
jne label_broken |
inc ebx |
cmp byte [ebx],':' |
jne check_for_broken_label |
inc ebx |
jmp check_for_broken_label |
label_broken: |
push line_preprocessed |
1685,6 → 1694,7 |
or [default_argument_value],-1 |
call skip_macro_argument_value |
inc esi |
jmp irp_parameters_start |
irps_name_ok: |
cmp al,',' |
jne invalid_macro_arguments |
/programs/develop/fasm/trunk/symbdump.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
dump_symbols: |
8,7 → 8,7 |
call setup_dump_header |
mov esi,[input_file] |
call copy_asciiz |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
mov eax,edi |
sub eax,ebx |
15,7 → 15,7 |
mov [ebx-40h+0Ch],eax |
mov esi,[output_file] |
call copy_asciiz |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
mov edx,[symbols_stream] |
mov ebp,[free_additional_memory] |
53,7 → 53,7 |
rep movs byte [edi],[esi] |
mov byte [edi],0 |
inc edi |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
jmp prepare_strings_table |
prepare_section_string: |
76,7 → 76,7 |
add esi,[resource_data] |
copy_elf_section_name: |
lods byte [esi] |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
stos byte [edi] |
test al,al |
87,11 → 87,11 |
stos dword [edi] |
mov ax,'t' |
stos word [edi] |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
jmp prepare_strings_table |
strings_table_ready: |
mov edx,[display_buffer] |
mov edx,[tagged_blocks] |
mov ebp,[memory_end] |
sub ebp,[labels_list] |
add ebp,edx |
117,7 → 117,7 |
mov [edx+24],eax |
movzx ecx,byte [esi-1] |
lea eax,[edi+ecx+1] |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jae out_of_memory |
rep movsb |
xor al,al |
129,6 → 129,13 |
sub eax,[memory_start] |
mov [edx+28],eax |
label_dump_line_ok: |
test byte [edx+9],4 |
jz convert_base_symbol_for_label |
xor eax,eax |
mov [edx],eax |
mov [edx+4],eax |
jmp base_symbol_for_label_ok |
convert_base_symbol_for_label: |
mov eax,[edx+20] |
test eax,eax |
jz base_symbol_for_label_ok |
172,7 → 179,7 |
mov esi,[labels_list] |
mov ebp,edi |
make_lines_dump: |
cmp esi,[display_buffer] |
cmp esi,[tagged_blocks] |
je lines_dump_ok |
mov eax,[esi-4] |
mov ecx,[esi-8] |
185,11 → 192,13 |
add dword [ebx-40h+3Ch],8 |
jmp make_lines_dump |
process_line_dump: |
push ebx |
mov ebx,[esi+8] |
mov eax,[esi+4] |
sub eax,[code_start] |
add eax,[headers_size] |
cmp byte [esi+1Ah],0 |
je store_offset |
test byte [ebx+0Ah],1 |
jz store_offset |
xor eax,eax |
store_offset: |
stos dword [edi] |
199,15 → 208,15 |
mov eax,[esi+4] |
xor edx,edx |
xor cl,cl |
sub eax,[esi+8] |
sbb edx,[esi+8+4] |
sbb cl,[esi+1Bh] |
sub eax,[ebx] |
sbb edx,[ebx+4] |
sbb cl,[ebx+8] |
stos dword [edi] |
mov eax,edx |
stos dword [edi] |
mov eax,[esi+10h] |
mov eax,[ebx+10h] |
stos dword [edi] |
mov eax,[esi+14h] |
mov eax,[ebx+14h] |
test eax,eax |
jz base_symbol_for_line_ok |
cmp eax,[symbols_stream] |
216,11 → 225,17 |
xor eax,eax |
base_symbol_for_line_ok: |
stos dword [edi] |
mov eax,[esi+18h] |
and eax,01FFFFh |
stos dword [edi] |
mov [edi-1],cl |
cmp edi,[display_buffer] |
mov al,[ebx+9] |
stos byte [edi] |
mov al,[esi+10h] |
stos byte [edi] |
mov al,[ebx+0Ah] |
and al,1 |
stos byte [edi] |
mov al,cl |
stos byte [edi] |
pop ebx |
cmp edi,[tagged_blocks] |
jae out_of_memory |
mov eax,edi |
sub eax,1Ch |
264,7 → 279,7 |
add ecx,40h |
call write |
jc write_failed |
mov edx,[display_buffer] |
mov edx,[tagged_blocks] |
mov ecx,[memory_end] |
sub ecx,[labels_list] |
call write |
287,7 → 302,7 |
mov esi,[labels_list] |
mov edi,[memory_start] |
make_references_dump: |
cmp esi,[display_buffer] |
cmp esi,[tagged_blocks] |
je references_dump_ok |
mov eax,[esi-4] |
mov ecx,[esi-8] |
306,7 → 321,7 |
stosd |
mov eax,edx |
stosd |
cmp edi,[display_buffer] |
cmp edi,[tagged_blocks] |
jb make_references_dump |
jmp out_of_memory |
references_dump_ok: |
/programs/develop/fasm/trunk/tables.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
include_variable db 'INCLUDE',0 |
563,6 → 563,10 |
db 'xor',30h |
dw basic_instruction-instruction_handler |
instructions_4: |
db 'adcx',66h |
dw adx_instruction-instruction_handler |
db 'adox',0F3h |
dw adx_instruction-instruction_handler |
db 'andn',0F2h |
dw andn_instruction-instruction_handler |
db 'arpl',0 |
581,6 → 585,8 |
dw call_instruction-instruction_handler |
db 'cdqe',98h |
dw simple_instruction_64bit-instruction_handler |
db 'clac',0CAh |
dw simple_vmx_instruction-instruction_handler |
db 'clgi',0DDh |
dw simple_vmx_instruction-instruction_handler |
db 'clts',6 |
783,6 → 789,8 |
dw pm_store_word_instruction-instruction_handler |
db 'smsw',14h |
dw pm_store_word_instruction-instruction_handler |
db 'stac',0CBh |
dw simple_vmx_instruction-instruction_handler |
db 'stgi',0DCh |
dw simple_vmx_instruction-instruction_handler |
db 'stos',0AAh |
1551,6 → 1559,8 |
dw simple_extended_instruction_64bit-instruction_handler |
db 'rdrand',110b |
dw rdrand_instruction-instruction_handler |
db 'rdseed',111b |
dw rdrand_instruction-instruction_handler |
db 'rdtscp',1 |
dw rdtscp_instruction-instruction_handler |
db 'repeat',0 |
/programs/develop/fasm/trunk/variable.inc |
---|
1,6 → 1,6 |
; flat assembler core variables |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
; Variables which have to be set up by interface: |
50,10 → 50,7 |
label_hash dd ? |
label_leaf dd ? |
hash_tree dd ? |
org_origin dq ? |
org_registers dd ? |
org_symbol dd ? |
org_start dd ? |
addressing_space dd ? |
undefined_data_start dd ? |
undefined_data_end dd ? |
counter dd ? |
61,7 → 58,7 |
error_info dd ? |
error_line dd ? |
error dd ? |
display_buffer dd ? |
tagged_blocks dd ? |
structures_buffer dd ? |
number_start dd ? |
current_offset dd ? |
131,10 → 128,7 |
logical_value_wrapping db ? |
next_pass_needed db ? |
output_format db ? |
labels_type db ? |
code_type db ? |
virtual_data db ? |
org_origin_sign db ? |
adjustment_sign db ? |
macro_status db ? |
141,7 → 135,9 |
default_argument_value db ? |
prefixed_instruction db ? |
formatter_symbols_allowed db ? |
free_address_range db ? |
characters rb 100h |
converted rb 100h |
message rb 200h |
/programs/develop/fasm/trunk/version.inc |
---|
1,6 → 1,6 |
; flat assembler version 1.70 |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; flat assembler version 1.71 |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
; |
; This programs is free for commercial and non-commercial use as long as |
33,7 → 33,7 |
; cannot simply be copied and put under another distribution licence |
; (including the GNU Public Licence). |
VERSION_STRING equ "1.70.03" |
VERSION_STRING equ "1.71.13" |
VERSION_MAJOR = 1 |
VERSION_MINOR = 70 |
VERSION_MINOR = 71 |
/programs/develop/fasm/trunk/x86_64.inc |
---|
1,6 → 1,6 |
; flat assembler core |
; Copyright (c) 1999-2012, Tomasz Grysztar. |
; Copyright (c) 1999-2013, Tomasz Grysztar. |
; All rights reserved. |
simple_instruction_except64: |
2989,6 → 2989,7 |
jmp instruction_assembled |
calculate_jump_offset: |
add edi,2 |
mov ebp,[addressing_space] |
call calculate_relative_offset |
sub edi,2 |
ret |
5982,6 → 5983,27 |
mov al,[operand_size] |
call operand_autodetect |
jmp instruction_ready |
adx_instruction: |
mov [base_code],0Fh |
mov [extended_code],38h |
mov [supplemental_code],0F6h |
mov [operand_prefix],al |
call get_reg_mem |
jc adx_reg_reg |
mov al,[operand_size] |
cmp al,4 |
je instruction_ready |
cmp al,8 |
jne invalid_operand_size |
call operand_64bit |
jmp instruction_ready |
adx_reg_reg: |
cmp ah,4 |
je nomem_instruction_ready |
cmp ah,8 |
jne invalid_operand_size |
call operand_64bit |
jmp nomem_instruction_ready |
simple_vmx_instruction: |
mov ah,al |
6251,6 → 6273,7 |
xbegin_16bit: |
call get_address_word_value |
add edi,4 |
mov ebp,[addressing_space] |
call calculate_relative_offset |
sub edi,4 |
shl eax,16 |
6264,6 → 6287,7 |
call get_address_qword_value |
xbegin_address_ok: |
add edi,5 |
mov ebp,[addressing_space] |
call calculate_relative_offset |
sub edi,5 |
mov edx,eax |
6383,6 → 6407,7 |
get_address: |
mov [segment_register],0 |
mov [address_size],0 |
mov [free_address_range],0 |
mov al,[code_type] |
shr al,3 |
mov [value_size],al |
6422,6 → 6447,7 |
mov edx,[address_symbol] |
mov [symbol_identifier],edx |
mov edx,[address_high] |
mov ebp,[addressing_space] |
call calculate_relative_offset |
mov [address_high],edx |
cdq |