+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-assembler:
- xor eax,eax
- mov [stub_size],eax
- mov [current_pass],ax
- mov [resolver_flags],eax
- mov [number_of_sections],eax
- mov [actual_fixups_size],eax
- assembler_loop:
- mov eax,[labels_list]
- mov [tagged_blocks],eax
- mov eax,[additional_memory]
- mov [free_additional_memory],eax
- mov eax,[additional_memory_end]
- mov [structures_buffer],eax
- mov esi,[source_start]
- mov edi,[code_start]
- xor eax,eax
- mov dword [adjustment],eax
- mov dword [adjustment+4],eax
- mov [addressing_space],eax
- mov [error_line],eax
- mov [counter],eax
- mov [format_flags],eax
- mov [number_of_relocations],eax
- mov [undefined_data_end],eax
- mov [file_extension],eax
- mov [next_pass_needed],al
- mov [output_format],al
- mov [adjustment_sign],al
- mov [evex_mode],al
- mov [code_type],16
- call init_addressing_space
- pass_loop:
- call assemble_line
- jnc pass_loop
- mov eax,[additional_memory_end]
- cmp eax,[structures_buffer]
- je pass_done
- sub eax,18h
- mov eax,[eax+4]
- mov [current_line],eax
- jmp missing_end_directive
- pass_done:
- call close_pass
- mov eax,[labels_list]
- check_symbols:
- cmp eax,[memory_end]
- jae symbols_checked
- test byte [eax+8],8
- jz symbol_defined_ok
- mov cx,[current_pass]
- cmp cx,[eax+18]
- jne symbol_defined_ok
- test byte [eax+8],1
- jz symbol_defined_ok
- sub cx,[eax+16]
- cmp cx,1
- jne symbol_defined_ok
- and byte [eax+8],not 1
- or [next_pass_needed],-1
- symbol_defined_ok:
- test byte [eax+8],10h
- jz use_prediction_ok
- mov cx,[current_pass]
- and byte [eax+8],not 10h
- test byte [eax+8],20h
- jnz check_use_prediction
- cmp cx,[eax+18]
- jne use_prediction_ok
- test byte [eax+8],8
- jz use_prediction_ok
- jmp use_misprediction
- check_use_prediction:
- test byte [eax+8],8
- jz use_misprediction
- cmp cx,[eax+18]
- je use_prediction_ok
- use_misprediction:
- or [next_pass_needed],-1
- use_prediction_ok:
- test byte [eax+8],40h
- jz check_next_symbol
- and byte [eax+8],not 40h
- test byte [eax+8],4
- jnz define_misprediction
- mov cx,[current_pass]
- test byte [eax+8],80h
- jnz check_define_prediction
- cmp cx,[eax+16]
- jne check_next_symbol
- test byte [eax+8],1
- jz check_next_symbol
- jmp define_misprediction
- check_define_prediction:
- test byte [eax+8],1
- jz define_misprediction
- cmp cx,[eax+16]
- je check_next_symbol
- define_misprediction:
- or [next_pass_needed],-1
- check_next_symbol:
- add eax,LABEL_STRUCTURE_SIZE
- jmp check_symbols
- symbols_checked:
- cmp [next_pass_needed],0
- jne next_pass
- mov eax,[error_line]
- or eax,eax
- jz assemble_ok
- mov [current_line],eax
- cmp [error],undefined_symbol
- jne error_confirmed
- mov eax,[error_info]
- or eax,eax
- jz error_confirmed
- test byte [eax+8],1
- jnz next_pass
- error_confirmed:
- call error_handler
- error_handler:
- mov eax,[error]
- sub eax,error_handler
- add [esp],eax
- ret
- next_pass:
- inc [current_pass]
- mov ax,[current_pass]
- cmp ax,[passes_limit]
- je code_cannot_be_generated
- jmp assembler_loop
- 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],24h
- sub ebx,8+24h
- 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
- mov [ebx+20h],eax
- ret
-
-assemble_line:
- mov eax,[tagged_blocks]
- sub eax,100h
- cmp edi,eax
- ja out_of_memory
- lods byte [esi]
- cmp al,1
- je assemble_instruction
- jb source_end
- 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
- je code_type_setting
- cmp al,10h
- jne illegal_instruction
- lods byte [esi]
- jmp segment_prefix
- code_type_setting:
- lods byte [esi]
- mov [code_type],al
- jmp instruction_assembled
- new_line:
- lods dword [esi]
- mov [current_line],eax
- and [prefix_flags],0
- cmp [symbols_file],0
- je continue_line
- cmp [next_pass_needed],0
- jne continue_line
- mov ebx,[tagged_blocks]
- mov dword [ebx-4],1
- mov dword [ebx-8],14h
- sub ebx,8+14h
- cmp ebx,edi
- jbe out_of_memory
- mov [tagged_blocks],ebx
- mov [ebx],eax
- mov [ebx+4],edi
- mov eax,[addressing_space]
- mov [ebx+8],eax
- mov al,[code_type]
- mov [ebx+10h],al
- continue_line:
- cmp byte [esi],0Fh
- je line_assembled
- jmp assemble_line
- define_label:
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- mov ebx,eax
- lods byte [esi]
- mov [label_size],al
- call make_label
- jmp continue_line
- make_label:
- mov eax,edi
- xor edx,edx
- xor cl,cl
- 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
- test byte [ds:ebp+0Ah],1
- jnz make_virtual_label
- or byte [ebx+9],1
- xchg eax,[ebx]
- xchg edx,[ebx+4]
- mov ch,[ebx+9]
- shr ch,1
- and ch,1
- neg ch
- sub eax,[ebx]
- sbb edx,[ebx+4]
- sbb ch,cl
- mov dword [adjustment],eax
- mov dword [adjustment+4],edx
- mov [adjustment_sign],ch
- or al,ch
- or eax,edx
- setnz ah
- jmp finish_label
- make_virtual_label:
- and byte [ebx+9],not 1
- cmp eax,[ebx]
- mov [ebx],eax
- setne ah
- cmp edx,[ebx+4]
- mov [ebx+4],edx
- setne al
- or ah,al
- finish_label:
- mov ebp,[addressing_space]
- mov ch,[ds:ebp+9]
- mov cl,[label_size]
- mov edx,[ds:ebp+14h]
- mov ebp,[ds:ebp+10h]
- finish_label_symbol:
- mov al,[address_sign]
- xor al,[ebx+9]
- and al,10b
- or ah,al
- xor [ebx+9],al
- cmp cl,[ebx+10]
- mov [ebx+10],cl
- setne al
- or ah,al
- cmp ch,[ebx+11]
- mov [ebx+11],ch
- setne al
- or ah,al
- cmp ebp,[ebx+12]
- mov [ebx+12],ebp
- setne al
- or ah,al
- or ch,ch
- jz label_symbol_ok
- cmp edx,[ebx+20]
- mov [ebx+20],edx
- setne al
- or ah,al
- label_symbol_ok:
- mov cx,[current_pass]
- xchg [ebx+16],cx
- mov edx,[current_line]
- mov [ebx+28],edx
- and byte [ebx+8],not 2
- test byte [ebx+8],1
- 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
- or ah,al
- jz label_made
- test byte [ebx+8],8
- jz label_made
- mov cx,[current_pass]
- cmp cx,[ebx+18]
- jne label_made
- requalified_label:
- or [next_pass_needed],-1
- label_made:
- ret
- new_label:
- or byte [ebx+8],1
- ret
- define_constant:
- lods dword [esi]
- inc esi
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- push eax
- or [operand_flags],1
- call get_value
- pop ebx
- xor cl,cl
- mov ch,[value_type]
- cmp ch,3
- je invalid_use_of_symbol
- make_constant:
- and byte [ebx+9],not 1
- cmp eax,[ebx]
- mov [ebx],eax
- setne ah
- cmp edx,[ebx+4]
- mov [ebx+4],edx
- setne al
- or ah,al
- mov al,[value_sign]
- xor al,[ebx+9]
- and al,10b
- or ah,al
- xor [ebx+9],al
- cmp cl,[ebx+10]
- mov [ebx+10],cl
- setne al
- or ah,al
- cmp ch,[ebx+11]
- mov [ebx+11],ch
- setne al
- or ah,al
- xor edx,edx
- cmp edx,[ebx+12]
- mov [ebx+12],edx
- setne al
- or ah,al
- or ch,ch
- jz constant_symbol_ok
- mov edx,[symbol_identifier]
- cmp edx,[ebx+20]
- mov [ebx+20],edx
- setne al
- or ah,al
- constant_symbol_ok:
- mov cx,[current_pass]
- xchg [ebx+16],cx
- mov edx,[current_line]
- mov [ebx+28],edx
- test byte [ebx+8],1
- jz new_constant
- cmp cx,[ebx+16]
- jne redeclare_constant
- 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
- or ah,al
- jz instruction_assembled
- test byte [ebx+8],4
- jnz instruction_assembled
- test byte [ebx+8],8
- jz instruction_assembled
- 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 [operand_flags],0
-; mov [operand_prefix],0
-; mov [rex_prefix],0
- and dword [operand_size],0
-; mov [opcode_prefix],0
-; mov [vex_required],0
-; mov [vex_register],0
-; mov [immediate_size],0
- and dword [opcode_prefix],0
- call instruction_handler
- instruction_handler:
- movzx ebx,word [esi]
- mov al,[esi+2]
- add esi,3
- add [esp],ebx
- ret
- instruction_assembled:
- test [prefix_flags],not 1
- jnz illegal_instruction
- mov al,[esi]
- cmp al,0Fh
- je line_assembled
- or al,al
- jnz extra_characters_on_line
- line_assembled:
- clc
- ret
- source_end:
- dec esi
- stc
- ret
-
-org_directive:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_qword_value
- mov cl,[value_type]
- test cl,1
- jnz invalid_use_of_symbol
- 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 [ebx],eax
- sbb [ebx+4],edx
- sbb byte [ebx+8],cl
- jp org_value_ok
- call recoverable_overflow
- org_value_ok:
- mov edx,[symbol_identifier]
- mov [ebx+14h],edx
- cmp [output_format],1
- ja instruction_assembled
- cmp edi,[code_start]
- jne instruction_assembled
- cmp eax,100h
- jne instruction_assembled
- bts [format_flags],0
- jmp instruction_assembled
-label_directive:
- lods byte [esi]
- cmp al,2
- jne invalid_argument
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- mov ebx,eax
- mov [label_size],0
- lods byte [esi]
- cmp al,':'
- je get_label_size
- dec esi
- cmp al,11h
- jne label_size_ok
- get_label_size:
- lods word [esi]
- cmp al,11h
- jne invalid_argument
- mov [label_size],ah
- label_size_ok:
- cmp byte [esi],80h
- je get_free_label_value
- call make_label
- jmp instruction_assembled
- get_free_label_value:
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- push ebx ecx
- or byte [ebx+8],4
- cmp byte [esi],'.'
- je invalid_value
- call get_address_value
- or bh,bh
- setnz ch
- xchg ch,cl
- mov bp,cx
- shl ebp,16
- xchg bl,bh
- mov bp,bx
- pop ecx ebx
- and byte [ebx+8],not 4
- mov ch,[value_type]
- test ch,1
- jnz invalid_use_of_symbol
- make_free_label:
- and byte [ebx+9],not 1
- cmp eax,[ebx]
- mov [ebx],eax
- setne ah
- cmp edx,[ebx+4]
- mov [ebx+4],edx
- setne al
- or ah,al
- mov edx,[address_symbol]
- mov cl,[label_size]
- call finish_label_symbol
- jmp instruction_assembled
-load_directive:
- lods byte [esi]
- cmp al,2
- jne invalid_argument
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- push eax
- mov al,1
- cmp byte [esi],11h
- jne load_size_ok
- lods byte [esi]
- lods byte [esi]
- load_size_ok:
- cmp al,8
- ja invalid_value
- mov [operand_size],al
- and dword [value],0
- and dword [value+4],0
- lods byte [esi]
- cmp al,82h
- jne invalid_argument
- call get_data_point
- jc value_loaded
- push esi edi
- mov esi,ebx
- mov edi,value
- rep movs byte [edi],[esi]
- pop edi esi
- value_loaded:
- mov [value_sign],0
- mov eax,dword [value]
- mov edx,dword [value+4]
- pop ebx
- xor cx,cx
- jmp make_constant
- get_data_point:
- lods byte [esi]
- cmp al,':'
- je get_data_offset
- cmp al,'('
- jne invalid_argument
- mov ebx,[addressing_space]
- mov ecx,edi
- sub ecx,[ebx+18h]
- mov [ebx+1Ch],ecx
- 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
- call store_label_reference
- get_addressing_space:
- mov ebx,[ebx]
- get_data_address:
- push ebx
- cmp byte [esi],'.'
- je invalid_value
- or [operand_flags],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
- get_data_offset:
- cmp [output_format],2
- jae invalid_operand
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_dword_value
- cmp [value_type],0
- je data_offset_ok
- call recoverable_invalid_address
- data_offset_ok:
- add eax,[code_start]
- jc bad_data_address
- mov ebx,eax
- movzx ecx,[operand_size]
- add eax,ecx
- jc bad_data_address
- mov edx,[addressing_space]
- test byte [edx+0Ah],1
- jnz data_offset_from_virtual
- cmp eax,edi
- ja bad_data_address
- clc
- ret
- data_offset_from_virtual:
- cmp eax,[undefined_data_end]
- ja bad_data_address
- clc
- ret
-
-store_directive:
- cmp byte [esi],11h
- je sized_store
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- call get_byte_value
- xor edx,edx
- movzx eax,al
- mov [operand_size],1
- jmp store_value_ok
- sized_store:
- or [operand_flags],1
- call get_value
- store_value_ok:
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov dword [value],eax
- mov dword [value+4],edx
- lods byte [esi]
- cmp al,80h
- jne invalid_argument
- call get_data_point
- jc instruction_assembled
- push esi edi
- mov esi,value
- mov edi,ebx
- rep movs byte [edi],[esi]
- mov eax,edi
- pop edi esi
- cmp ebx,[undefined_data_end]
- jae instruction_assembled
- cmp eax,[undefined_data_start]
- jbe instruction_assembled
- mov [undefined_data_start],eax
- jmp instruction_assembled
-
-display_directive:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],0
- jne display_byte
- inc esi
- lods dword [esi]
- mov ecx,eax
- push edi
- mov edi,[tagged_blocks]
- sub edi,8
- sub edi,eax
- cmp edi,[esp]
- jbe out_of_memory
- mov [tagged_blocks],edi
- rep movs byte [edi],[esi]
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- pop edi
- inc esi
- jmp display_next
- display_byte:
- call get_byte_value
- push edi
- mov edi,[tagged_blocks]
- sub edi,8+1
- mov [tagged_blocks],edi
- stos byte [edi]
- mov eax,1
- stos dword [edi]
- dec eax
- stos dword [edi]
- pop edi
- display_next:
- cmp edi,[tagged_blocks]
- ja out_of_memory
- lods byte [esi]
- cmp al,','
- je display_directive
- dec esi
- jmp instruction_assembled
-show_display_buffer:
- mov eax,[tagged_blocks]
- or eax,eax
- jz display_done
- mov esi,[labels_list]
- cmp esi,eax
- je display_done
- display_messages:
- sub esi,8
- mov eax,[esi+4]
- mov ecx,[esi]
- sub esi,ecx
- cmp eax,10h
- je write_addressing_space
- test eax,eax
- jnz skip_block
- push esi
- call display_block
- pop esi
- skip_block:
- cmp esi,[tagged_blocks]
- jne display_messages
- display_done:
- ret
- write_addressing_space:
- mov ecx,[esi+20h]
- jecxz skip_block
- push esi
- mov edi,[free_additional_memory]
- mov esi,[output_file]
- test esi,esi
- jz addressing_space_written
- xor ebx,ebx
- copy_output_path:
- lodsb
- cmp edi,[structures_buffer]
- jae out_of_memory
- stosb
- test al,al
- jz output_path_copied
- cmp al,'/'
- je new_path_segment
- cmp al,'\'
- je new_path_segment
- cmp al,'.'
- jne copy_output_path
- mov ebx,edi
- jmp copy_output_path
- new_path_segment:
- xor ebx,ebx
- jmp copy_output_path
- output_path_copied:
- test ebx,ebx
- jnz append_extension
- mov byte [edi-1],'.'
- mov ebx,edi
- append_extension:
- mov edi,ebx
- add ebx,ecx
- inc ebx
- cmp ebx,[structures_buffer]
- jae out_of_memory
- mov esi,[esp]
- mov esi,[esi+18h]
- sub esi,ecx
- rep movs byte [edi],[esi]
- xor al,al
- stos byte [edi]
- mov edx,[free_additional_memory]
- call create
- jc write_failed
- mov esi,[esp]
- mov edx,[esi+18h]
- mov ecx,[esi+1Ch]
- call write
- jc write_failed
- call close
- addressing_space_written:
- pop esi
- jmp skip_block
-
-times_directive:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- cmp eax,0
- je zero_times
- cmp byte [esi],':'
- jne times_argument_ok
- inc esi
- times_argument_ok:
- push [counter]
- push [counter_limit]
- mov [counter_limit],eax
- mov [counter],1
- times_loop:
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- push esi
- or [prefix_flags],1
- call continue_line
- mov eax,[counter_limit]
- cmp [counter],eax
- je times_done
- inc [counter]
- pop esi
- jmp times_loop
- times_done:
- pop eax
- pop [counter_limit]
- pop [counter]
- jmp instruction_assembled
- zero_times:
- call skip_symbol
- jnc zero_times
- jmp instruction_assembled
-
-virtual_directive:
- lods byte [esi]
- cmp al,'('
- je continue_virtual_area
- cmp al,80h
- jne virtual_at_current
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_address_value
- mov ebp,[address_symbol]
- or bh,bh
- setnz ch
- jmp set_virtual
- virtual_at_current:
- dec esi
- virtual_fallback:
- mov ebp,[addressing_space]
- mov al,[ds:ebp+9]
- mov [value_type],al
- mov eax,edi
- xor edx,edx
- xor cl,cl
- sub eax,[ds:ebp]
- sbb edx,[ds:ebp+4]
- sbb cl,[ds:ebp+8]
- mov [address_sign],cl
- mov bx,[ds:ebp+10h]
- mov cx,[ds:ebp+10h+2]
- xchg bh,bl
- xchg ch,cl
- mov ebp,[ds:ebp+14h]
- set_virtual:
- xchg bl,bh
- xchg cl,ch
- shl ecx,16
- mov cx,bx
- push ecx eax
- mov ebx,[addressing_space]
- test byte [ebx+0Ah],1
- jnz non_virtual_end_ok
- mov eax,edi
- xchg eax,[undefined_data_end]
- cmp eax,edi
- je non_virtual_end_ok
- mov [undefined_data_start],edi
- non_virtual_end_ok:
- call allocate_virtual_structure_data
- call init_addressing_space
- or byte [ebx+0Ah],1
- cmp byte [esi],86h
- jne addressing_space_extension_ok
- cmp word [esi+1],'('
- jne invalid_argument
- mov ecx,[esi+3]
- add esi,3+4
- add [ebx+18h],ecx
- mov [ebx+20h],ecx
- or byte [ebx+0Ah],2
- push ebx
- mov ebx,characters
- get_extension:
- lods byte [esi]
- stos byte [edi]
- xlat byte [ebx]
- test al,al
- jz invalid_argument
- loop get_extension
- inc esi
- pop ebx
- addressing_space_extension_ok:
- pop eax
- mov cl,[address_sign]
- not eax
- not edx
- not cl
- add eax,1
- adc edx,0
- adc cl,0
- add eax,edi
- adc edx,0
- adc cl,0
- 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 [ebx+9],al
- jmp instruction_assembled
- allocate_structure_data:
- mov ebx,[structures_buffer]
- sub ebx,18h
- cmp ebx,[free_additional_memory]
- jb out_of_memory
- mov [structures_buffer],ebx
- ret
- find_structure_data:
- mov ebx,[structures_buffer]
- scan_structures:
- cmp ebx,[additional_memory_end]
- je no_such_structure
- cmp ax,[ebx]
- je structure_data_found
- add ebx,18h
- jmp scan_structures
- structure_data_found:
- ret
- no_such_structure:
- stc
- ret
- allocate_virtual_structure_data:
- 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
- ret
- continue_virtual_area:
- cmp byte [esi],11h
- jne invalid_argument
- cmp byte [esi+1+4],')'
- jne invalid_argument
- inc esi
- lods dword [esi]
- inc esi
- cmp eax,0Fh
- jbe reserved_word_used_as_symbol
- mov edx,undefined_symbol
- test byte [eax+8],1
- jz virtual_area_unavailable
- mov edx,symbol_out_of_scope
- mov cx,[eax+16]
- cmp cx,[current_pass]
- jne virtual_area_unavailable
- mov edx,invalid_use_of_symbol
- test byte [eax+9],4
- jz virtual_area_unavailable
- mov ebx,eax
- mov ax,[current_pass]
- mov [ebx+18],ax
- or byte [ebx+8],8
- call store_label_reference
- mov ebx,[ebx]
- test byte [ebx+0Ah],4
- jz virtual_area_unavailable
- and byte [ebx+0Ah],not 4
- mov edx,ebx
- call allocate_virtual_structure_data
- mov [addressing_space],edx
- push esi
- mov esi,[edx+18h]
- mov ecx,[edx+1Ch]
- mov eax,[edx+20h]
- sub esi,eax
- add ecx,eax
- lea eax,[edi+ecx]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,esi
- sub eax,edi
- sub [edx+18h],eax
- sub [edx],eax
- sbb dword [edx+4],0
- sbb byte [edx+8],0
- mov al,cl
- shr ecx,2
- rep movs dword [edi],[esi]
- mov cl,al
- and cl,11b
- rep movs byte [edi],[esi]
- pop esi
- jmp instruction_assembled
- virtual_area_unavailable:
- cmp [error_line],0
- jne virtual_fallback
- push [current_line]
- pop [error_line]
- mov [error],edx
- mov [error_info],eax
- jmp virtual_fallback
- end_virtual:
- call find_structure_data
- jc unexpected_instruction
- 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
- mov ecx,ebx
- sub ecx,[structures_buffer]
- shr ecx,2
- lea esi,[ebx-4]
- lea edi,[esi+18h]
- std
- rep movs dword [edi],[esi]
- cld
- 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
- add eax,[ebx+20h]
- test byte [ebx+0Ah],2
- jz addressing_space_closed
- or byte [ebx+0Ah],4
- 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]
- add eax,[ebx+20h]
- xchg eax,[ebx+18h]
- sub eax,[ebx+20h]
- 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:
- test [prefix_flags],1
- jnz unexpected_instruction
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- cmp eax,0
- je zero_repeat
- call allocate_structure_data
- mov word [ebx],repeat_directive-instruction_handler
- xchg eax,[counter_limit]
- mov [ebx+10h],eax
- mov eax,1
- xchg eax,[counter]
- mov [ebx+14h],eax
- mov [ebx+8],esi
- mov eax,[current_line]
- mov [ebx+4],eax
- jmp instruction_assembled
- end_repeat:
- test [prefix_flags],1
- jnz unexpected_instruction
- call find_structure_data
- jc unexpected_instruction
- mov eax,[counter_limit]
- inc [counter]
- cmp [counter],eax
- jbe continue_repeating
- stop_repeat:
- mov eax,[ebx+10h]
- mov [counter_limit],eax
- mov eax,[ebx+14h]
- mov [counter],eax
- call remove_structure_data
- jmp instruction_assembled
- continue_repeating:
- mov esi,[ebx+8]
- jmp instruction_assembled
- zero_repeat:
- mov al,[esi]
- or al,al
- jz missing_end_directive
- cmp al,0Fh
- jne extra_characters_on_line
- call find_end_repeat
- jmp instruction_assembled
- find_end_repeat:
- call find_structure_end
- cmp ax,repeat_directive-instruction_handler
- jne unexpected_instruction
- ret
-while_directive:
- test [prefix_flags],1
- jnz unexpected_instruction
- call allocate_structure_data
- mov word [ebx],while_directive-instruction_handler
- mov eax,1
- xchg eax,[counter]
- mov [ebx+10h],eax
- mov [ebx+8],esi
- mov eax,[current_line]
- mov [ebx+4],eax
- do_while:
- push ebx
- call calculate_logical_expression
- or al,al
- jnz while_true
- mov al,[esi]
- or al,al
- jz missing_end_directive
- cmp al,0Fh
- jne extra_characters_on_line
- stop_while:
- call find_end_while
- pop ebx
- mov eax,[ebx+10h]
- mov [counter],eax
- call remove_structure_data
- jmp instruction_assembled
- while_true:
- pop ebx
- jmp instruction_assembled
- end_while:
- test [prefix_flags],1
- jnz unexpected_instruction
- call find_structure_data
- jc unexpected_instruction
- mov eax,[ebx+4]
- mov [current_line],eax
- inc [counter]
- jz too_many_repeats
- mov esi,[ebx+8]
- jmp do_while
- find_end_while:
- call find_structure_end
- cmp ax,while_directive-instruction_handler
- jne unexpected_instruction
- ret
-if_directive:
- test [prefix_flags],1
- jnz unexpected_instruction
- call calculate_logical_expression
- mov dl,al
- mov al,[esi]
- or al,al
- jz missing_end_directive
- cmp al,0Fh
- jne extra_characters_on_line
- or dl,dl
- jnz if_true
- call find_else
- jc instruction_assembled
- mov al,[esi]
- cmp al,1
- jne else_true
- cmp word [esi+1],if_directive-instruction_handler
- jne else_true
- add esi,4
- jmp if_directive
- if_true:
- xor al,al
- make_if_structure:
- call allocate_structure_data
- mov word [ebx],if_directive-instruction_handler
- mov byte [ebx+2],al
- mov eax,[current_line]
- mov [ebx+4],eax
- jmp instruction_assembled
- else_true:
- or al,al
- jz missing_end_directive
- cmp al,0Fh
- jne extra_characters_on_line
- or al,-1
- jmp make_if_structure
- else_directive:
- test [prefix_flags],1
- jnz unexpected_instruction
- mov ax,if_directive-instruction_handler
- call find_structure_data
- jc unexpected_instruction
- cmp byte [ebx+2],0
- jne unexpected_instruction
- found_else:
- mov al,[esi]
- cmp al,1
- jne skip_else
- cmp word [esi+1],if_directive-instruction_handler
- jne skip_else
- add esi,4
- call find_else
- jnc found_else
- call remove_structure_data
- jmp instruction_assembled
- skip_else:
- or al,al
- jz missing_end_directive
- cmp al,0Fh
- jne extra_characters_on_line
- call find_end_if
- call remove_structure_data
- jmp instruction_assembled
- end_if:
- test [prefix_flags],1
- jnz unexpected_instruction
- call find_structure_data
- jc unexpected_instruction
- call remove_structure_data
- jmp instruction_assembled
- find_else:
- call find_structure_end
- cmp ax,else_directive-instruction_handler
- je else_found
- cmp ax,if_directive-instruction_handler
- jne unexpected_instruction
- stc
- ret
- else_found:
- clc
- ret
- find_end_if:
- call find_structure_end
- cmp ax,if_directive-instruction_handler
- jne unexpected_instruction
- ret
- find_structure_end:
- push [error_line]
- mov eax,[current_line]
- mov [error_line],eax
- find_end_directive:
- call skip_symbol
- jnc find_end_directive
- lods byte [esi]
- cmp al,0Fh
- jne no_end_directive
- lods dword [esi]
- mov [current_line],eax
- skip_labels:
- cmp byte [esi],2
- jne labels_ok
- add esi,6
- jmp skip_labels
- labels_ok:
- cmp byte [esi],1
- jne find_end_directive
- mov ax,[esi+1]
- cmp ax,prefix_instruction-instruction_handler
- je find_end_directive
- add esi,4
- cmp ax,repeat_directive-instruction_handler
- je skip_repeat
- cmp ax,while_directive-instruction_handler
- je skip_while
- cmp ax,if_directive-instruction_handler
- je skip_if
- cmp ax,else_directive-instruction_handler
- je structure_end
- cmp ax,end_directive-instruction_handler
- jne find_end_directive
- cmp byte [esi],1
- jne find_end_directive
- mov ax,[esi+1]
- add esi,4
- cmp ax,repeat_directive-instruction_handler
- je structure_end
- cmp ax,while_directive-instruction_handler
- je structure_end
- cmp ax,if_directive-instruction_handler
- jne find_end_directive
- structure_end:
- pop [error_line]
- ret
- no_end_directive:
- mov eax,[error_line]
- mov [current_line],eax
- jmp missing_end_directive
- skip_repeat:
- call find_end_repeat
- jmp find_end_directive
- skip_while:
- call find_end_while
- jmp find_end_directive
- skip_if:
- call skip_if_block
- jmp find_end_directive
- skip_if_block:
- call find_else
- jc if_block_skipped
- cmp byte [esi],1
- jne skip_after_else
- cmp word [esi+1],if_directive-instruction_handler
- jne skip_after_else
- add esi,4
- jmp skip_if_block
- skip_after_else:
- call find_end_if
- if_block_skipped:
- ret
-end_directive:
- lods byte [esi]
- cmp al,1
- jne invalid_argument
- lods word [esi]
- inc esi
- cmp ax,virtual_directive-instruction_handler
- je end_virtual
- cmp ax,repeat_directive-instruction_handler
- je end_repeat
- cmp ax,while_directive-instruction_handler
- je end_while
- cmp ax,if_directive-instruction_handler
- je end_if
- cmp ax,data_directive-instruction_handler
- je end_data
- jmp invalid_argument
-break_directive:
- mov ebx,[structures_buffer]
- mov al,[esi]
- or al,al
- jz find_breakable_structure
- cmp al,0Fh
- jne extra_characters_on_line
- find_breakable_structure:
- cmp ebx,[additional_memory_end]
- je unexpected_instruction
- mov ax,[ebx]
- cmp ax,repeat_directive-instruction_handler
- je break_repeat
- cmp ax,while_directive-instruction_handler
- je break_while
- cmp ax,if_directive-instruction_handler
- je break_if
- add ebx,18h
- jmp find_breakable_structure
- break_if:
- push [current_line]
- mov eax,[ebx+4]
- mov [current_line],eax
- call remove_structure_data
- call skip_if_block
- pop [current_line]
- mov ebx,[structures_buffer]
- jmp find_breakable_structure
- break_repeat:
- push ebx
- call find_end_repeat
- pop ebx
- jmp stop_repeat
- break_while:
- push ebx
- jmp stop_while
-
-define_data:
- cmp edi,[tagged_blocks]
- jae out_of_memory
- cmp byte [esi],'('
- jne simple_data_value
- mov ebx,esi
- inc esi
- call skip_expression
- xchg esi,ebx
- cmp byte [ebx],81h
- jne simple_data_value
- inc esi
- call get_count_value
- inc esi
- or eax,eax
- jz duplicate_zero_times
- cmp byte [esi],91h
- jne duplicate_single_data_value
- inc esi
- duplicate_data:
- push eax esi
- duplicated_values:
- cmp edi,[tagged_blocks]
- jae out_of_memory
- clc
- call near dword [esp+8]
- lods byte [esi]
- cmp al,','
- je duplicated_values
- cmp al,92h
- jne invalid_argument
- pop ebx eax
- dec eax
- jz data_defined
- mov esi,ebx
- jmp duplicate_data
- duplicate_single_data_value:
- cmp edi,[tagged_blocks]
- jae out_of_memory
- push eax esi
- clc
- call near dword [esp+8]
- pop ebx eax
- dec eax
- jz data_defined
- mov esi,ebx
- jmp duplicate_single_data_value
- duplicate_zero_times:
- cmp byte [esi],91h
- jne skip_single_data_value
- inc esi
- skip_data_value:
- call skip_symbol
- jc invalid_argument
- cmp byte [esi],92h
- jne skip_data_value
- inc esi
- jmp data_defined
- skip_single_data_value:
- call skip_symbol
- jmp data_defined
- simple_data_value:
- cmp edi,[tagged_blocks]
- jae out_of_memory
- clc
- call near dword [esp]
- data_defined:
- lods byte [esi]
- cmp al,','
- je define_data
- dec esi
- stc
- ret
-data_bytes:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_byte
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- mov byte [edi],0
- inc edi
- jmp undefined_data
- get_byte:
- cmp byte [esi],0
- je get_string
- call get_byte_value
- stos byte [edi]
- ret
- get_string:
- inc esi
- lods dword [esi]
- mov ecx,eax
- lea eax,[edi+ecx]
- cmp eax,[tagged_blocks]
- ja out_of_memory
- rep movs byte [edi],[esi]
- inc esi
- ret
- 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]
- je undefined_data_ok
- mov [undefined_data_start],eax
- undefined_data_ok:
- mov [undefined_data_end],edi
- ret
-data_unicode:
- or [base_code],-1
- jmp define_words
-data_words:
- mov [base_code],0
- define_words:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_word
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- and word [edi],0
- scas word [edi]
- jmp undefined_data
- ret
- get_word:
- cmp [base_code],0
- je word_data_value
- cmp byte [esi],0
- je word_string
- word_data_value:
- call get_word_value
- call mark_relocation
- stos word [edi]
- ret
- word_string:
- inc esi
- lods dword [esi]
- mov ecx,eax
- jecxz word_string_ok
- lea eax,[edi+ecx*2]
- cmp eax,[tagged_blocks]
- ja out_of_memory
- xor ah,ah
- copy_word_string:
- lods byte [esi]
- stos word [edi]
- loop copy_word_string
- word_string_ok:
- inc esi
- ret
-data_dwords:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_dword
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- and dword [edi],0
- scas dword [edi]
- jmp undefined_data
- get_dword:
- push esi
- call get_dword_value
- pop ebx
- cmp byte [esi],':'
- je complex_dword
- call mark_relocation
- stos dword [edi]
- ret
- complex_dword:
- mov esi,ebx
- cmp byte [esi],'.'
- je invalid_value
- call get_word_value
- push eax
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[value_type]
- push eax
- cmp byte [esi],'.'
- je invalid_value
- call get_word_value
- call mark_relocation
- stos word [edi]
- pop eax
- mov [value_type],al
- pop eax
- call mark_relocation
- stos word [edi]
- ret
-data_pwords:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_pword
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- and dword [edi],0
- scas dword [edi]
- and word [edi],0
- scas word [edi]
- jmp undefined_data
- get_pword:
- push esi
- call get_pword_value
- pop ebx
- cmp byte [esi],':'
- je complex_pword
- call mark_relocation
- stos dword [edi]
- mov ax,dx
- stos word [edi]
- ret
- complex_pword:
- mov esi,ebx
- cmp byte [esi],'.'
- je invalid_value
- call get_word_value
- push eax
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[value_type]
- push eax
- cmp byte [esi],'.'
- je invalid_value
- call get_dword_value
- call mark_relocation
- stos dword [edi]
- pop eax
- mov [value_type],al
- pop eax
- call mark_relocation
- stos word [edi]
- ret
-data_qwords:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_qword
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- and dword [edi],0
- scas dword [edi]
- and dword [edi],0
- scas dword [edi]
- jmp undefined_data
- get_qword:
- call get_qword_value
- call mark_relocation
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- ret
-data_twords:
- call define_data
- jc instruction_assembled
- lods byte [esi]
- cmp al,'('
- je get_tword
- cmp al,'?'
- jne invalid_argument
- mov eax,edi
- and dword [edi],0
- scas dword [edi]
- and dword [edi],0
- scas dword [edi]
- and word [edi],0
- scas word [edi]
- jmp undefined_data
- get_tword:
- cmp byte [esi],'.'
- jne complex_tword
- inc esi
- cmp word [esi+8],8000h
- je fp_zero_tword
- mov eax,[esi]
- stos dword [edi]
- mov eax,[esi+4]
- stos dword [edi]
- mov ax,[esi+8]
- add ax,3FFFh
- jo value_out_of_range
- cmp ax,7FFFh
- jge value_out_of_range
- cmp ax,0
- jg tword_exp_ok
- mov cx,ax
- neg cx
- inc cx
- cmp cx,64
- jae value_out_of_range
- cmp cx,32
- ja large_shift
- mov eax,[esi]
- mov edx,[esi+4]
- mov ebx,edx
- shr edx,cl
- shrd eax,ebx,cl
- jmp tword_mantissa_shift_done
- large_shift:
- sub cx,32
- xor edx,edx
- mov eax,[esi+4]
- shr eax,cl
- tword_mantissa_shift_done:
- jnc store_shifted_mantissa
- add eax,1
- adc edx,0
- store_shifted_mantissa:
- mov [edi-8],eax
- mov [edi-4],edx
- xor ax,ax
- test edx,1 shl 31
- jz tword_exp_ok
- inc ax
- tword_exp_ok:
- mov bl,[esi+11]
- shl bx,15
- or ax,bx
- stos word [edi]
- add esi,13
- ret
- fp_zero_tword:
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov al,[esi+11]
- shl ax,15
- stos word [edi]
- add esi,13
- ret
- complex_tword:
- call get_word_value
- push eax
- cmp byte [esi],':'
- jne invalid_operand
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[value_type]
- push eax
- cmp byte [esi],'.'
- je invalid_value
- call get_qword_value
- call mark_relocation
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- pop eax
- mov [value_type],al
- pop eax
- call mark_relocation
- stos word [edi]
- ret
-data_file:
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- add esi,4
- call open_binary_file
- mov eax,[esi-4]
- lea esi,[esi+eax+1]
- mov al,2
- xor edx,edx
- call lseek
- push eax
- xor edx,edx
- cmp byte [esi],':'
- jne position_ok
- inc esi
- cmp byte [esi],'('
- jne invalid_argument
- inc esi
- cmp byte [esi],'.'
- je invalid_value
- push ebx
- call get_count_value
- pop ebx
- mov edx,eax
- sub [esp],edx
- jc value_out_of_range
- position_ok:
- cmp byte [esi],','
- jne size_ok
- inc esi
- cmp byte [esi],'('
- jne invalid_argument
- inc esi
- cmp byte [esi],'.'
- je invalid_value
- push ebx edx
- call get_count_value
- pop edx ebx
- cmp eax,[esp]
- ja value_out_of_range
- mov [esp],eax
- size_ok:
- xor al,al
- call lseek
- pop ecx
- mov edx,edi
- add edi,ecx
- jc out_of_memory
- cmp edi,[tagged_blocks]
- ja out_of_memory
- call read
- jc error_reading_file
- call close
- lods byte [esi]
- cmp al,','
- je data_file
- dec esi
- jmp instruction_assembled
- open_binary_file:
- push esi
- push edi
- mov eax,[current_line]
- find_current_source_path:
- mov esi,[eax]
- test byte [eax+7],80h
- jz get_current_path
- mov eax,[eax+8]
- jmp find_current_source_path
- get_current_path:
- lodsb
- stosb
- or al,al
- jnz get_current_path
- cut_current_path:
- cmp edi,[esp]
- je current_path_ok
- cmp byte [edi-1],'\'
- je current_path_ok
- cmp byte [edi-1],'/'
- je current_path_ok
- dec edi
- jmp cut_current_path
- current_path_ok:
- mov esi,[esp+4]
- call expand_path
- pop edx
- mov esi,edx
- call open
- jnc file_opened
- mov edx,[include_paths]
- search_in_include_paths:
- push edx esi
- mov edi,esi
- mov esi,[esp+4]
- call get_include_directory
- mov [esp+4],esi
- mov esi,[esp+8]
- call expand_path
- pop edx
- mov esi,edx
- call open
- pop edx
- jnc file_opened
- cmp byte [edx],0
- jne search_in_include_paths
- mov edi,esi
- mov esi,[esp]
- push edi
- call expand_path
- pop edx
- mov esi,edx
- call open
- jc file_not_found
- file_opened:
- mov edi,esi
- pop esi
- ret
-reserve_bytes:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- mov edx,ecx
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_bytes
- add edi,ecx
- jmp reserved_data
- zero_bytes:
- xor eax,eax
- shr ecx,1
- jnc bytes_stosb_ok
- stos byte [edi]
- bytes_stosb_ok:
- shr ecx,1
- jnc bytes_stosw_ok
- stos word [edi]
- bytes_stosw_ok:
- rep stos dword [edi]
- reserved_data:
- pop eax
- call undefined_data
- jmp instruction_assembled
-reserve_words:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- mov edx,ecx
- shl edx,1
- jc out_of_memory
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_words
- lea edi,[edi+ecx*2]
- jmp reserved_data
- zero_words:
- xor eax,eax
- shr ecx,1
- jnc words_stosw_ok
- stos word [edi]
- words_stosw_ok:
- rep stos dword [edi]
- jmp reserved_data
-reserve_dwords:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- mov edx,ecx
- shl edx,1
- jc out_of_memory
- shl edx,1
- jc out_of_memory
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_dwords
- lea edi,[edi+ecx*4]
- jmp reserved_data
- zero_dwords:
- xor eax,eax
- rep stos dword [edi]
- jmp reserved_data
-reserve_pwords:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- shl ecx,1
- jc out_of_memory
- add ecx,eax
- mov edx,ecx
- shl edx,1
- jc out_of_memory
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_words
- lea edi,[edi+ecx*2]
- jmp reserved_data
-reserve_qwords:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- shl ecx,1
- jc out_of_memory
- mov edx,ecx
- shl edx,1
- jc out_of_memory
- shl edx,1
- jc out_of_memory
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_dwords
- lea edi,[edi+ecx*4]
- jmp reserved_data
-reserve_twords:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov ecx,eax
- shl ecx,2
- jc out_of_memory
- add ecx,eax
- mov edx,ecx
- shl edx,1
- jc out_of_memory
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je zero_words
- lea edi,[edi+ecx*2]
- jmp reserved_data
-align_directive:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov edx,eax
- dec edx
- test eax,edx
- jnz invalid_align_value
- or eax,eax
- jz invalid_align_value
- cmp eax,1
- je instruction_assembled
- mov ecx,edi
- mov ebp,[addressing_space]
- sub ecx,[ds:ebp]
- cmp dword [ds:ebp+10h],0
- jne section_not_aligned_enough
- cmp byte [ds:ebp+9],0
- je make_alignment
- cmp [output_format],3
- je pe_alignment
- cmp [output_format],5
- jne object_alignment
- test [format_flags],1
- jnz pe_alignment
- object_alignment:
- mov ebx,[ds:ebp+14h]
- cmp byte [ebx],0
- jne section_not_aligned_enough
- cmp eax,[ebx+10h]
- jbe make_alignment
- jmp section_not_aligned_enough
- pe_alignment:
- cmp eax,1000h
- ja section_not_aligned_enough
- make_alignment:
- dec eax
- and ecx,eax
- jz instruction_assembled
- neg ecx
- add ecx,eax
- inc ecx
- mov edx,ecx
- add edx,edi
- jc out_of_memory
- cmp edx,[tagged_blocks]
- ja out_of_memory
- push edi
- cmp [next_pass_needed],0
- je nops
- add edi,ecx
- jmp reserved_data
- invalid_align_value:
- cmp [error_line],0
- jne instruction_assembled
- mov eax,[current_line]
- mov [error_line],eax
- mov [error],invalid_value
- jmp instruction_assembled
- nops:
- mov eax,90909090h
- shr ecx,1
- jnc nops_stosb_ok
- stos byte [edi]
- nops_stosb_ok:
- shr ecx,1
- jnc nops_stosw_ok
- stos word [edi]
- nops_stosw_ok:
- rep stos dword [edi]
- jmp reserved_data
-err_directive:
- mov al,[esi]
- cmp al,0Fh
- je invoked_error
- or al,al
- jz invoked_error
- jmp extra_characters_on_line
-assert_directive:
- call calculate_logical_expression
- or al,al
- jnz instruction_assembled
- cmp [error_line],0
- jne instruction_assembled
- mov eax,[current_line]
- mov [error_line],eax
- mov [error],assertion_failed
- jmp instruction_assembled
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-avx_single_source_pd_instruction_er_evex:
- or [vex_required],8
-avx_single_source_pd_instruction_er:
- or [operand_flags],2+4+8
- jmp avx_pd_instruction
-avx_single_source_pd_instruction_sae_evex:
- or [vex_required],8
- or [operand_flags],2+4
- jmp avx_pd_instruction
-avx_pd_instruction_imm8:
- mov [immediate_size],1
- jmp avx_pd_instruction
-avx_pd_instruction_er:
- or [operand_flags],8
-avx_pd_instruction_sae:
- or [operand_flags],4
-avx_pd_instruction:
- mov [opcode_prefix],66h
- or [rex_prefix],80h
- mov cx,0800h
- jmp avx_instruction_with_broadcast
-avx_pd_instruction_38_evex:
- or [vex_required],8
- mov [supplemental_code],al
- mov al,38h
- jmp avx_pd_instruction
-avx_cvtps2dq_instruction:
- mov [opcode_prefix],66h
- jmp avx_single_source_ps_instruction_er
-avx_cvtudq2ps_instruction:
- mov [opcode_prefix],0F2h
-avx_single_source_ps_instruction_er_evex:
- or [vex_required],8
-avx_single_source_ps_instruction_er:
- or [operand_flags],2+4+8
- jmp avx_ps_instruction
-avx_single_source_ps_instruction_noevex:
- or [operand_flags],2
- or [vex_required],2
- jmp avx_ps_instruction
-avx_ps_instruction_imm8:
- mov [immediate_size],1
- jmp avx_ps_instruction
-avx_ps_instruction_er:
- or [operand_flags],8
-avx_ps_instruction_sae:
- or [operand_flags],4
-avx_ps_instruction:
- mov cx,0400h
- jmp avx_instruction_with_broadcast
-avx_ps_instruction_66_38_evex:
- or [vex_required],8
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,38h
- jmp avx_ps_instruction
-avx_sd_instruction_er:
- or [operand_flags],8
-avx_sd_instruction_sae:
- or [operand_flags],4
-avx_sd_instruction:
- mov [opcode_prefix],0F2h
- or [rex_prefix],80h
- mov cl,8
- jmp avx_instruction
-avx_ss_instruction_er:
- or [operand_flags],8
-avx_ss_instruction_sae:
- or [operand_flags],4
-avx_ss_instruction:
- mov [opcode_prefix],0F3h
- mov cl,4
- jmp avx_instruction
-avx_ss_instruction_noevex:
- or [vex_required],2
- jmp avx_ss_instruction
-avx_single_source_q_instruction_38_evex:
- or [operand_flags],2
-avx_q_instruction_38_evex:
- or [vex_required],8
-avx_q_instruction_38:
- mov [supplemental_code],al
- mov al,38h
- jmp avx_q_instruction
-avx_q_instruction_38_w1_evex:
- or [vex_required],8
-avx_q_instruction_38_w1:
- or [rex_prefix],8
- jmp avx_q_instruction_38
-avx_q_instruction_3a_imm8_w1:
- or [rex_prefix],8
- jmp avx_q_instruction_3a_imm8
-avx_q_instruction_3a_imm8_evex:
- or [vex_required],8
-avx_q_instruction_3a_imm8:
- mov [immediate_size],1
- mov [supplemental_code],al
- mov al,3Ah
- jmp avx_q_instruction
-avx_q_instruction_evex:
- or [vex_required],8
-avx_q_instruction:
- or [rex_prefix],80h
- mov ch,8
- jmp avx_pi_instruction
-avx_single_source_d_instruction_38_evex_w1:
- or [rex_prefix],8
-avx_single_source_d_instruction_38_evex:
- or [vex_required],8
-avx_single_source_d_instruction_38:
- or [operand_flags],2
- jmp avx_d_instruction_38
-avx_d_instruction_38_evex:
- or [vex_required],8
-avx_d_instruction_38:
- mov [supplemental_code],al
- mov al,38h
- jmp avx_d_instruction
-avx_d_instruction_3a_imm8_evex:
- mov [immediate_size],1
- or [vex_required],8
- mov [supplemental_code],al
- mov al,3Ah
- jmp avx_d_instruction
-avx_single_source_d_instruction_imm8:
- or [operand_flags],2
- mov [immediate_size],1
- jmp avx_d_instruction
-avx_d_instruction_evex:
- or [vex_required],8
-avx_d_instruction:
- mov ch,4
- jmp avx_pi_instruction
-avx_bw_instruction_3a_imm8_w1_evex:
- or [rex_prefix],8
-avx_bw_instruction_3a_imm8_evex:
- mov [immediate_size],1
- or [vex_required],8
- mov [supplemental_code],al
- mov al,3Ah
- jmp avx_bw_instruction
-avx_single_source_bw_instruction_38:
- or [operand_flags],2
-avx_bw_instruction_38:
- mov [supplemental_code],al
- mov al,38h
-avx_bw_instruction:
- xor ch,ch
- avx_pi_instruction:
- mov [opcode_prefix],66h
- xor cl,cl
- jmp avx_instruction_with_broadcast
-avx_bw_instruction_38_w1_evex:
- or [rex_prefix],8
-avx_bw_instruction_38_evex:
- or [vex_required],8
- jmp avx_bw_instruction_38
-avx_pd_instruction_noevex:
- xor cl,cl
- or [vex_required],2
- mov [opcode_prefix],66h
- jmp avx_instruction
-avx_ps_instruction_noevex:
- or [vex_required],2
- mov [opcode_prefix],0F2h
- xor cl,cl
- jmp avx_instruction
-avx_instruction:
- xor ch,ch
- avx_instruction_with_broadcast:
- mov [mmx_size],cl
- mov [broadcast_size],ch
- mov [base_code],0Fh
- mov [extended_code],al
- avx_xop_common:
- or [vex_required],1
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- avx_reg:
- lods byte [esi]
- call convert_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- avx_vex_reg:
- test [operand_flags],2
- jnz avx_vex_reg_ok
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- avx_vex_reg_ok:
- mov al,[mmx_size]
- or al,al
- jz avx_regs_size_ok
- mov ah,[operand_size]
- or ah,ah
- jz avx_regs_size_ok
- cmp al,ah
- je avx_regs_size_ok
- ja invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- avx_regs_size_ok:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- avx_regs_rm:
- call take_avx_rm
- jc avx_regs_reg
- mov al,[immediate_size]
- cmp al,1
- je mmx_imm8
- jb instruction_ready
- cmp al,-4
- je sse_cmp_mem_ok
- cmp byte [esi],','
- jne invalid_operand
- inc esi
- call take_avx_register
- shl al,4
- jc invalid_operand
- or byte [value],al
- test al,80h
- jz avx_regs_mem_reg_store
- cmp [code_type],64
- jne invalid_operand
- avx_regs_mem_reg_store:
- call take_imm4_if_needed
- call store_instruction_with_imm8
- jmp instruction_assembled
- avx_regs_reg:
- mov bl,al
- call take_avx512_rounding
- mov al,[immediate_size]
- cmp al,1
- je mmx_nomem_imm8
- jb nomem_instruction_ready
- cmp al,-4
- je sse_cmp_nomem_ok
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov al,bl
- shl al,4
- jc invalid_operand
- or byte [value],al
- test al,80h
- jz avx_regs_reg_
- cmp [code_type],64
- jne invalid_operand
- avx_regs_reg_:
- call take_avx_rm
- jc avx_regs_reg_reg
- cmp [immediate_size],-2
- jg invalid_operand
- or [rex_prefix],8
- call take_imm4_if_needed
- call store_instruction_with_imm8
- jmp instruction_assembled
- avx_regs_reg_reg:
- shl al,4
- jc invalid_operand
- and byte [value],1111b
- or byte [value],al
- call take_imm4_if_needed
- call store_nomem_instruction
- mov al,byte [value]
- stos byte [edi]
- jmp instruction_assembled
- take_avx_rm:
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je take_avx_mem
- cmp al,10h
- jne invalid_operand
- mov [operand_size],cl
- lods byte [esi]
- call convert_avx_register
- or cl,cl
- jnz avx_reg_ok
- or cl,[mmx_size]
- jz avx_reg_ok
- cmp ah,cl
- je avx_reg_ok
- jb invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- avx_reg_ok:
- stc
- ret
- take_avx_mem:
- push ecx
- call get_address
- cmp byte [esi],'{'
- jne avx_mem_ok
- inc esi
- lods byte [esi]
- cmp al,1Fh
- jne invalid_operand
- mov al,[esi]
- shr al,4
- cmp al,1
- jne invalid_operand
- mov al,[mmx_size]
- or al,al
- jnz avx_mem_broadcast_check
- mov eax,[esp]
- or al,al
- jnz avx_mem_broadcast_check
- mov al,[broadcast_size]
- mov [mmx_size],al
- mov ah,cl
- lods byte [esi]
- and al,1111b
- mov cl,al
- mov al,[broadcast_size]
- shl al,cl
- mov [esp],al
- mov cl,ah
- jmp avx_mem_broadcast_ok
- avx_mem_broadcast_check:
- bsf eax,eax
- xchg al,[broadcast_size]
- mov [mmx_size],al
- bsf eax,eax
- jz invalid_operand
- mov ah,[broadcast_size]
- sub ah,al
- lods byte [esi]
- and al,1111b
- cmp al,ah
- jne invalid_operand_size
- avx_mem_broadcast_ok:
- or [vex_required],40h
- lods byte [esi]
- cmp al,'}'
- jne invalid_operand
- avx_mem_ok:
- pop eax
- or al,al
- jz avx_mem_size_deciding
- xchg al,[operand_size]
- cmp [mmx_size],0
- jne avx_mem_size_enforced
- or al,al
- jz avx_mem_size_ok
- cmp al,[operand_size]
- jne operand_sizes_do_not_match
- avx_mem_size_ok:
- clc
- ret
- avx_mem_size_deciding:
- mov al,[operand_size]
- cmp [mmx_size],0
- jne avx_mem_size_enforced
- cmp al,16
- je avx_mem_size_ok
- cmp al,32
- je avx_mem_size_ok
- cmp al,64
- je avx_mem_size_ok
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- avx_mem_size_enforced:
- or al,al
- jz avx_mem_size_ok
- cmp al,[mmx_size]
- je avx_mem_size_ok
- jmp invalid_operand_size
- take_imm4_if_needed:
- cmp [immediate_size],-3
- jne imm4_ok
- push ebx ecx edx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- test al,11110000b
- jnz value_out_of_range
- or byte [value],al
- pop edx ecx ebx
- imm4_ok:
- ret
- take_avx512_mask:
- cmp byte [esi],'{'
- jne avx512_masking_ok
- test [operand_flags],10h
- jnz invalid_operand
- inc esi
- lods byte [esi]
- cmp al,14h
- jne invalid_operand
- lods byte [esi]
- mov ah,al
- shr ah,4
- cmp ah,5
- jne invalid_operand
- and al,111b
- or al,al
- jz invalid_operand
- mov [mask_register],al
- or [vex_required],20h
- lods byte [esi]
- cmp al,'}'
- jne invalid_operand
- cmp byte [esi],'{'
- jne avx512_masking_ok
- test [operand_flags],20h
- jnz invalid_operand
- inc esi
- lods byte [esi]
- cmp al,1Fh
- jne invalid_operand
- lods byte [esi]
- or al,al
- jnz invalid_operand
- or [mask_register],80h
- lods byte [esi]
- cmp al,'}'
- jne invalid_operand
- avx512_masking_ok:
- retn
- take_avx512_rounding:
- test [operand_flags],4+8
- jz avx512_rounding_done
- test [operand_flags],8
- jz avx512_rounding_allowed
- cmp [mmx_size],0
- jne avx512_rounding_allowed
- cmp [operand_size],64
- jne avx512_rounding_done
- avx512_rounding_allowed:
- cmp byte [esi],','
- jne avx512_rounding_done
- cmp byte [esi+1],'{'
- jne avx512_rounding_done
- add esi,2
- mov [rounding_mode],0
- or [vex_required],40h
- test [operand_flags],8
- jz take_sae
- or [vex_required],80h
- lods byte [esi]
- cmp al,1Fh
- jne invalid_operand
- lods byte [esi]
- mov ah,al
- shr ah,4
- cmp ah,2
- jne invalid_operand
- and al,11b
- mov [rounding_mode],al
- lods byte [esi]
- cmp al,'-'
- jne invalid_operand
- take_sae:
- lods byte [esi]
- cmp al,1Fh
- jne invalid_operand
- lods byte [esi]
- cmp al,30h
- jne invalid_operand
- lods byte [esi]
- cmp al,'}'
- jne invalid_operand
- avx512_rounding_done:
- retn
-
-avx_movdqu_instruction:
- mov ah,0F3h
- jmp avx_movdq_instruction
-avx_movdqa_instruction:
- mov ah,66h
- avx_movdq_instruction:
- mov [opcode_prefix],ah
- or [vex_required],2
- jmp avx_movps_instruction
-avx512_movdqu16_instruction:
- or [rex_prefix],8
-avx512_movdqu8_instruction:
- mov ah,0F2h
- jmp avx_movdq_instruction_evex
-avx512_movdqu64_instruction:
- or [rex_prefix],8
-avx512_movdqu32_instruction:
- mov ah,0F3h
- jmp avx_movdq_instruction_evex
-avx512_movdqa64_instruction:
- or [rex_prefix],8
-avx512_movdqa32_instruction:
- mov ah,66h
- avx_movdq_instruction_evex:
- mov [opcode_prefix],ah
- or [vex_required],8
- jmp avx_movps_instruction
-avx_movpd_instruction:
- mov [opcode_prefix],66h
- or [rex_prefix],80h
-avx_movps_instruction:
- or [operand_flags],2
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- xor al,al
- mov [mmx_size],al
- mov [broadcast_size],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_reg
- inc [extended_code]
- test [extended_code],1
- jnz avx_mem
- add [extended_code],-1+10h
- avx_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- or [operand_flags],20h
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [postbyte_register],al
- jmp instruction_ready
-avx_movntpd_instruction:
- or [rex_prefix],80h
-avx_movntdq_instruction:
- mov [opcode_prefix],66h
-avx_movntps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- or [operand_flags],10h
- mov [mmx_size],0
- lods byte [esi]
- call get_size_operator
- jmp avx_mem
-avx_compress_q_instruction:
- or [rex_prefix],8
-avx_compress_d_instruction:
- or [vex_required],8
- mov [mmx_size],0
- call setup_66_0f_38
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne avx_mem
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [postbyte_register],al
- jmp nomem_instruction_ready
-avx_lddqu_instruction:
- mov ah,0F2h
- or [vex_required],2
- avx_load_instruction:
- mov [opcode_prefix],ah
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],0
- or [vex_required],1
- call take_avx_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp instruction_ready
-avx_movntdqa_instruction:
- mov [supplemental_code],al
- mov al,38h
- mov ah,66h
- jmp avx_load_instruction
-avx_movq_instruction:
- or [rex_prefix],8
- mov [mmx_size],8
- jmp avx_mov_instruction
-avx_movd_instruction:
- mov [mmx_size],4
- avx_mov_instruction:
- or [vex_required],1
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],7Eh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_movd_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[mmx_size]
- not al
- and [operand_size],al
- jnz invalid_operand_size
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- cmp [mmx_size],8
- jne instruction_ready
- and [rex_prefix],not 8
- or [rex_prefix],80h
- mov [extended_code],0D6h
- jmp instruction_ready
- avx_movd_reg:
- lods byte [esi]
- cmp al,0C0h
- jae avx_movd_xmmreg
- call convert_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov [operand_size],0
- mov bl,al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- avx_movd_reg_ready:
- test [rex_prefix],8
- jz nomem_instruction_ready
- cmp [code_type],64
- jne illegal_instruction
- jmp nomem_instruction_ready
- avx_movd_xmmreg:
- sub [extended_code],10h
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_movd_xmmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[mmx_size]
- cmp al,8
- jne avx_movd_xmmreg_mem_ready
- call avx_movq_xmmreg_xmmreg_opcode
- avx_movd_xmmreg_mem_ready:
- not al
- test [operand_size],al
- jnz invalid_operand_size
- jmp instruction_ready
- avx_movd_xmmreg_reg:
- lods byte [esi]
- cmp al,0C0h
- jae avx_movq_xmmreg_xmmreg
- call convert_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov bl,al
- jmp avx_movd_reg_ready
- avx_movq_xmmreg_xmmreg:
- cmp [mmx_size],8
- jne invalid_operand
- call avx_movq_xmmreg_xmmreg_opcode
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov bl,al
- jmp nomem_instruction_ready
- avx_movq_xmmreg_xmmreg_opcode:
- and [rex_prefix],not 8
- or [rex_prefix],80h
- add [extended_code],10h
- mov [opcode_prefix],0F3h
- ret
-avx_movddup_instruction:
- or [vex_required],1
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],al
- or [rex_prefix],80h
- xor al,al
- mov [mmx_size],al
- mov [broadcast_size],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- mov [postbyte_register],al
- cmp ah,16
- ja avx_movddup_size_ok
- mov [mmx_size],8
- avx_movddup_size_ok:
- call take_avx512_mask
- jmp avx_vex_reg_ok
-avx_movlpd_instruction:
- mov [opcode_prefix],66h
- or [rex_prefix],80h
-avx_movlps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],8
- mov [broadcast_size],0
- or [vex_required],1
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne avx_movlps_mem
- lods byte [esi]
- call convert_avx_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- cmp [operand_size],16
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_rm
- jc invalid_operand
- jmp instruction_ready
- avx_movlps_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- avx_movlps_mem_:
- mov al,[operand_size]
- or al,al
- jz avx_movlps_mem_size_ok
- cmp al,[mmx_size]
- jne invalid_operand_size
- mov [operand_size],0
- avx_movlps_mem_size_ok:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- cmp ah,16
- jne invalid_operand
- mov [postbyte_register],al
- inc [extended_code]
- jmp instruction_ready
-avx_movhlps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- call take_avx_register
- cmp ah,16
- jne invalid_operand
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov bl,al
- jmp nomem_instruction_ready
-avx_movsd_instruction:
- mov al,0F2h
- mov cl,8
- or [rex_prefix],80h
- jmp avx_movs_instruction
-avx_movss_instruction:
- mov al,0F3h
- mov cl,4
- avx_movs_instruction:
- mov [opcode_prefix],al
- mov [mmx_size],cl
- or [vex_required],1
- mov [base_code],0Fh
- mov [extended_code],10h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne avx_movs_mem
- lods byte [esi]
- call convert_avx_register
- cmp ah,16
- jne invalid_operand
- mov [postbyte_register],al
- call take_avx512_mask
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne avx_movs_reg_mem
- mov [operand_size],cl
- lods byte [esi]
- call convert_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov bl,al
- cmp bl,8
- jb nomem_instruction_ready
- inc [extended_code]
- xchg bl,[postbyte_register]
- jmp nomem_instruction_ready
- avx_movs_reg_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz avx_movs_reg_mem_ok
- cmp al,[mmx_size]
- jne invalid_operand_size
- avx_movs_reg_mem_ok:
- jmp instruction_ready
- avx_movs_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- or [operand_flags],20h
- call take_avx512_mask
- jmp avx_movlps_mem_
-
-avx_comiss_instruction:
- or [operand_flags],2+4+10h
- mov cl,4
- jmp avx_instruction
-avx_comisd_instruction:
- or [operand_flags],2+4+10h
- mov [opcode_prefix],66h
- or [rex_prefix],80h
- mov cl,8
- jmp avx_instruction
-avx_movshdup_instruction:
- or [operand_flags],2
- mov [opcode_prefix],0F3h
- xor cl,cl
- jmp avx_instruction
-avx_cvtqq2pd_instruction:
- mov [opcode_prefix],0F3h
- or [vex_required],8
- or [operand_flags],2+4+8
- or [rex_prefix],8
- mov cx,0800h
- jmp avx_instruction_with_broadcast
-avx_pshuf_w_instruction:
- mov [opcode_prefix],al
- or [operand_flags],2
- mov [immediate_size],1
- mov al,70h
- xor cl,cl
- jmp avx_instruction
-avx_single_source_128bit_instruction_38_noevex:
- or [operand_flags],2
-avx_128bit_instruction_38_noevex:
- mov cl,16
- jmp avx_instruction_38_noevex
-avx_single_source_instruction_38_noevex:
- or [operand_flags],2
- jmp avx_pi_instruction_38_noevex
-avx_pi_instruction_38_noevex:
- xor cl,cl
- avx_instruction_38_noevex:
- or [vex_required],2
- avx_instruction_38:
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,38h
- jmp avx_instruction
-avx_ss_instruction_3a_imm8_noevex:
- mov cl,4
- jmp avx_instruction_3a_imm8_noevex
-avx_sd_instruction_3a_imm8_noevex:
- mov cl,8
- jmp avx_instruction_3a_imm8_noevex
-avx_single_source_128bit_instruction_3a_imm8_noevex:
- or [operand_flags],2
-avx_128bit_instruction_3a_imm8_noevex:
- mov cl,16
- jmp avx_instruction_3a_imm8_noevex
-avx_triple_source_instruction_3a_noevex:
- xor cl,cl
- mov [immediate_size],-1
- mov byte [value],0
- jmp avx_instruction_3a_noevex
-avx_single_source_instruction_3a_imm8_noevex:
- or [operand_flags],2
-avx_pi_instruction_3a_imm8_noevex:
- xor cl,cl
- avx_instruction_3a_imm8_noevex:
- mov [immediate_size],1
- avx_instruction_3a_noevex:
- or [vex_required],2
- avx_instruction_3a:
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,3Ah
- jmp avx_instruction
-avx_pi_instruction_3a_imm8:
- xor cl,cl
- mov [immediate_size],1
- jmp avx_instruction_3a
-avx_pclmulqdq_instruction:
- mov byte [value],al
- mov [immediate_size],-4
- xor cl,cl
- mov al,44h
- or [operand_flags],10h
- jmp avx_instruction_3a
-avx_instruction_38_nomask:
- or [operand_flags],10h
- xor cl,cl
- jmp avx_instruction_38
-
-avx512_single_source_pd_instruction_sae_imm8:
- or [operand_flags],2
-avx512_pd_instruction_sae_imm8:
- or [rex_prefix],8
- mov cx,0800h
- jmp avx512_instruction_sae_imm8
-avx512_single_source_ps_instruction_sae_imm8:
- or [operand_flags],2
-avx512_ps_instruction_sae_imm8:
- mov cx,0400h
- jmp avx512_instruction_sae_imm8
-avx512_sd_instruction_sae_imm8:
- or [rex_prefix],8
- mov cx,0008h
- jmp avx512_instruction_sae_imm8
-avx512_ss_instruction_sae_imm8:
- mov cx,0004h
- avx512_instruction_sae_imm8:
- or [operand_flags],4
- avx512_instruction_imm8:
- or [vex_required],8
- mov [opcode_prefix],66h
- mov [immediate_size],1
- mov [supplemental_code],al
- mov al,3Ah
- jmp avx_instruction_with_broadcast
-avx512_pd_instruction_er:
- or [operand_flags],4+8
- jmp avx512_pd_instruction
-avx512_single_source_pd_instruction_sae:
- or [operand_flags],4
-avx512_single_source_pd_instruction:
- or [operand_flags],2
-avx512_pd_instruction:
- or [rex_prefix],8
- mov cx,0800h
- jmp avx512_instruction
-avx512_ps_instruction_er:
- or [operand_flags],4+8
- jmp avx512_ps_instruction
-avx512_single_source_ps_instruction_sae:
- or [operand_flags],4
-avx512_single_source_ps_instruction:
- or [operand_flags],2
-avx512_ps_instruction:
- mov cx,0400h
- jmp avx512_instruction
-avx512_sd_instruction_er:
- or [operand_flags],8
-avx512_sd_instruction_sae:
- or [operand_flags],4
-avx512_sd_instruction:
- or [rex_prefix],8
- mov cx,0008h
- jmp avx512_instruction
-avx512_ss_instruction_er:
- or [operand_flags],8
-avx512_ss_instruction_sae:
- or [operand_flags],4
-avx512_ss_instruction:
- mov cx,0004h
- avx512_instruction:
- or [vex_required],8
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,38h
- jmp avx_instruction_with_broadcast
-avx512_exp2pd_instruction:
- or [rex_prefix],8
- or [operand_flags],2+4
- mov cx,0840h
- jmp avx512_instruction
-avx512_exp2ps_instruction:
- or [operand_flags],2+4
- mov cx,0440h
- jmp avx512_instruction
-
-fma_instruction_pd:
- or [rex_prefix],8
- mov cx,0800h
- jmp fma_instruction
-fma_instruction_ps:
- mov cx,0400h
- jmp fma_instruction
-fma_instruction_sd:
- or [rex_prefix],8
- mov cx,0008h
- jmp fma_instruction
-fma_instruction_ss:
- mov cx,0004h
- fma_instruction:
- or [operand_flags],4+8
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,38h
- jmp avx_instruction_with_broadcast
-
-fma4_instruction_p:
- xor cl,cl
- jmp fma4_instruction
-fma4_instruction_sd:
- mov cl,8
- jmp fma4_instruction
-fma4_instruction_ss:
- mov cl,4
- fma4_instruction:
- mov [immediate_size],-2
- mov byte [value],0
- jmp avx_instruction_3a_noevex
-
-avx_cmp_pd_instruction:
- mov [opcode_prefix],66h
- or [rex_prefix],80h
- mov cx,0800h
- jmp avx_cmp_instruction
-avx_cmp_ps_instruction:
- mov cx,0400h
- jmp avx_cmp_instruction
-avx_cmp_sd_instruction:
- mov [opcode_prefix],0F2h
- or [rex_prefix],80h
- mov cx,0008h
- jmp avx_cmp_instruction
-avx_cmp_ss_instruction:
- mov [opcode_prefix],0F3h
- mov cx,0004h
- avx_cmp_instruction:
- mov byte [value],al
- mov [immediate_size],-4
- or [operand_flags],4+20h
- mov al,0C2h
- jmp avx_cmp_common
-avx_cmpeqq_instruction:
- or [rex_prefix],80h
- mov ch,8
- mov [supplemental_code],al
- mov al,38h
- jmp avx_cmp_pi_instruction
-avx_cmpeqd_instruction:
- mov ch,4
- jmp avx_cmp_pi_instruction
-avx_cmpeqb_instruction:
- xor ch,ch
- jmp avx_cmp_pi_instruction
-avx512_cmp_uq_instruction:
- or [rex_prefix],8
- mov ch,8
- mov ah,1Eh
- jmp avx_cmp_pi_instruction_evex
-avx512_cmp_ud_instruction:
- mov ch,4
- mov ah,1Eh
- jmp avx_cmp_pi_instruction_evex
-avx512_cmp_q_instruction:
- or [rex_prefix],8
- mov ch,8
- mov ah,1Fh
- jmp avx_cmp_pi_instruction_evex
-avx512_cmp_d_instruction:
- mov ch,4
- mov ah,1Fh
- jmp avx_cmp_pi_instruction_evex
-avx512_cmp_uw_instruction:
- or [rex_prefix],8
-avx512_cmp_ub_instruction:
- xor ch,ch
- mov ah,3Eh
- jmp avx_cmp_pi_instruction_evex
-avx512_cmp_w_instruction:
- or [rex_prefix],8
-avx512_cmp_b_instruction:
- xor ch,ch
- mov ah,3Fh
- avx_cmp_pi_instruction_evex:
- mov byte [value],al
- mov [immediate_size],-4
- mov [supplemental_code],ah
- mov al,3Ah
- or [vex_required],8
- avx_cmp_pi_instruction:
- xor cl,cl
- or [operand_flags],20h
- mov [opcode_prefix],66h
- avx_cmp_common:
- mov [mmx_size],cl
- mov [broadcast_size],ch
- mov [extended_code],al
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,14h
- je avx_maskreg
- cmp al,10h
- jne invalid_operand
- or [vex_required],2
- jmp avx_reg
- avx_maskreg:
- cmp [operand_size],0
- jne invalid_operand_size
- or [vex_required],8
- lods byte [esi]
- call convert_mask_register
- mov [postbyte_register],al
- call take_avx512_mask
- jmp avx_vex_reg
-avx512_fpclasspd_instruction:
- or [rex_prefix],8
- mov cx,0800h
- jmp avx_fpclass_instruction
-avx512_fpclassps_instruction:
- mov cx,0400h
- jmp avx_fpclass_instruction
-avx512_fpclasssd_instruction:
- or [rex_prefix],8
- mov cx,0008h
- jmp avx_fpclass_instruction
-avx512_fpclassss_instruction:
- mov cx,0004h
- avx_fpclass_instruction:
- mov [broadcast_size],ch
- mov [mmx_size],cl
- or [operand_flags],2
- call setup_66_0f_3a
- mov [immediate_size],1
- lods byte [esi]
- cmp al,14h
- je avx_maskreg
- jmp invalid_operand
-avx512_ptestnmd_instruction:
- mov ch,4
- jmp avx512_ptestnm_instruction
-avx512_ptestnmq_instruction:
- or [rex_prefix],8
- mov ch,8
- jmp avx512_ptestnm_instruction
-avx512_ptestnmw_instruction:
- or [rex_prefix],8
-avx512_ptestnmb_instruction:
- xor ch,ch
- avx512_ptestnm_instruction:
- mov ah,0F3h
- jmp avx512_ptest_instruction
-avx512_ptestmd_instruction:
- mov ch,4
- jmp avx512_ptestm_instruction
-avx512_ptestmq_instruction:
- or [rex_prefix],8
- mov ch,8
- jmp avx512_ptestm_instruction
-avx512_ptestmw_instruction:
- or [rex_prefix],8
-avx512_ptestmb_instruction:
- xor ch,ch
- avx512_ptestm_instruction:
- mov ah,66h
- avx512_ptest_instruction:
- xor cl,cl
- mov [opcode_prefix],ah
- mov [supplemental_code],al
- mov al,38h
- or [vex_required],8
- jmp avx_cmp_common
-
-mask_shift_instruction_q:
- or [rex_prefix],8
-mask_shift_instruction_d:
- or [operand_flags],2
- or [immediate_size],1
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,3Ah
- jmp mask_instruction
-mask_instruction_single_source_b:
- mov [opcode_prefix],66h
- jmp mask_instruction_single_source_w
-mask_instruction_single_source_d:
- mov [opcode_prefix],66h
-mask_instruction_single_source_q:
- or [rex_prefix],8
-mask_instruction_single_source_w:
- or [operand_flags],2
- jmp mask_instruction
-mask_instruction_b:
- mov [opcode_prefix],66h
- jmp mask_instruction_w
-mask_instruction_d:
- mov [opcode_prefix],66h
-mask_instruction_q:
- or [rex_prefix],8
-mask_instruction_w:
- mov [operand_size],32
-mask_instruction:
- or [vex_required],1
- mov [base_code],0Fh
- mov [extended_code],al
- call take_mask_register
- mov [postbyte_register],al
- test [operand_flags],2
- jnz mask_instruction_nds_ok
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_mask_register
- mov [vex_register],al
- mask_instruction_nds_ok:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_mask_register
- mov bl,al
- cmp [immediate_size],0
- jne mmx_nomem_imm8
- jmp nomem_instruction_ready
-take_mask_register:
- lods byte [esi]
- cmp al,14h
- jne invalid_operand
- lods byte [esi]
-convert_mask_register:
- mov ah,al
- shr ah,4
- cmp ah,5
- jne invalid_operand
- and al,1111b
- ret
-kmov_instruction:
- mov [mmx_size],al
- or [vex_required],1
- mov [base_code],0Fh
- mov [extended_code],90h
- lods byte [esi]
- cmp al,14h
- je kmov_maskreg
- cmp al,10h
- je kmov_reg
- call get_size_operator
- inc [extended_code]
- cmp al,'['
- jne invalid_argument
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_mask_register
- mov [postbyte_register],al
- kmov_with_mem:
- mov ah,[mmx_size]
- mov al,[operand_size]
- or al,al
- jz kmov_mem_size_ok
- cmp al,ah
- jne invalid_operand_size
- kmov_mem_size_ok:
- call setup_kmov_prefix
- jmp instruction_ready
- setup_kmov_prefix:
- cmp ah,4
- jb kmov_w_ok
- or [rex_prefix],8
- kmov_w_ok:
- test ah,1 or 4
- jz kmov_prefix_ok
- mov [opcode_prefix],66h
- kmov_prefix_ok:
- ret
- kmov_maskreg:
- lods byte [esi]
- call convert_mask_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,14h
- je kmov_maskreg_maskreg
- cmp al,10h
- je kmov_maskreg_reg
- call get_size_operator
- cmp al,'['
- jne invalid_argument
- call get_address
- jmp kmov_with_mem
- kmov_maskreg_maskreg:
- lods byte [esi]
- call convert_mask_register
- mov bl,al
- mov ah,[mmx_size]
- call setup_kmov_prefix
- jmp nomem_instruction_ready
- kmov_maskreg_reg:
- add [extended_code],2
- lods byte [esi]
- call convert_register
- kmov_with_reg:
- mov bl,al
- mov al,[mmx_size]
- mov ah,4
- cmp al,ah
- jbe kmov_reg_size_check
- mov ah,al
- kmov_reg_size_check:
- cmp ah,[operand_size]
- jne invalid_operand_size
- cmp al,8
- je kmov_f2_w1
- cmp al,2
- ja kmov_f2
- je nomem_instruction_ready
- mov [opcode_prefix],66h
- jmp nomem_instruction_ready
- kmov_f2_w1:
- or [rex_prefix],8
- cmp [code_type],64
- jne illegal_instruction
- kmov_f2:
- mov [opcode_prefix],0F2h
- jmp nomem_instruction_ready
- kmov_reg:
- add [extended_code],3
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_mask_register
- jmp kmov_with_reg
-avx512_pmov_m2_instruction_w1:
- or [rex_prefix],8
-avx512_pmov_m2_instruction:
- or [vex_required],8
- call setup_f3_0f_38
- call take_avx_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_mask_register
- mov bl,al
- jmp nomem_instruction_ready
-avx512_pmov_2m_instruction_w1:
- or [rex_prefix],8
-avx512_pmov_2m_instruction:
- or [vex_required],8
- call setup_f3_0f_38
- call take_mask_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov bl,al
- jmp nomem_instruction_ready
- setup_f3_0f_38:
- mov [extended_code],38h
- mov [supplemental_code],al
- mov [base_code],0Fh
- mov [opcode_prefix],0F3h
- ret
-
-vzeroall_instruction:
- mov [operand_size],32
-vzeroupper_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- and [displacement_compression],0
- call store_vex_instruction_code
- jmp instruction_assembled
-vstmxcsr_instruction:
- or [vex_required],2
- jmp stmxcsr_instruction
-
-avx_perm2f128_instruction:
- or [vex_required],2
- xor ch,ch
- avx_instruction_imm8_without_128bit:
- mov [immediate_size],1
- mov ah,3Ah
- jmp avx_instruction_without_128bit
-avx512_shuf_q_instruction:
- or [rex_prefix],8
- or [vex_required],8
- mov ch,8
- jmp avx_instruction_imm8_without_128bit
-avx512_shuf_d_instruction:
- or [vex_required],8
- mov ch,4
- jmp avx_instruction_imm8_without_128bit
-avx_permd_instruction:
- mov ah,38h
- mov ch,4
- avx_instruction_without_128bit:
- xor cl,cl
- call setup_avx_66_supplemental
- call take_avx_register
- cmp ah,32
- jb invalid_operand_size
- mov [postbyte_register],al
- call take_avx512_mask
- jmp avx_vex_reg
- setup_avx_66_supplemental:
- mov [opcode_prefix],66h
- mov [broadcast_size],ch
- mov [mmx_size],cl
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [supplemental_code],al
- or [vex_required],1
- ret
-avx_permq_instruction:
- or [rex_prefix],8
- mov ch,8
- jmp avx_permil_instruction
-avx_permilpd_instruction:
- or [rex_prefix],80h
- mov ch,8
- jmp avx_permil_instruction
-avx_permilps_instruction:
- mov ch,4
- avx_permil_instruction:
- or [operand_flags],2
- xor cl,cl
- mov ah,3Ah
- call setup_avx_66_supplemental
- call take_avx_register
- cmp [supplemental_code],4
- jae avx_permil_size_ok
- cmp ah,32
- jb invalid_operand_size
- avx_permil_size_ok:
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_rm
- jnc mmx_imm8
- mov bl,al
- cmp byte [esi],','
- jne invalid_operand
- mov al,[esi+1]
- cmp al,11h
- jne avx_permil_rm_or_imm8
- mov al,[esi+3]
- avx_permil_rm_or_imm8:
- cmp al,'('
- je mmx_nomem_imm8
- mov [vex_register],bl
- inc esi
- mov [extended_code],38h
- mov al,[supplemental_code]
- cmp al,4
- jb avx_permq_rm
- add [supplemental_code],8
- jmp avx_regs_rm
- avx_permq_rm:
- or [vex_required],8
- shl al,5
- neg al
- add al,36h
- mov [supplemental_code],al
- jmp avx_regs_rm
-vpermil_2pd_instruction:
- mov [immediate_size],-2
- mov byte [value],al
- mov al,49h
- jmp vpermil2_instruction_setup
-vpermil_2ps_instruction:
- mov [immediate_size],-2
- mov byte [value],al
- mov al,48h
- jmp vpermil2_instruction_setup
-vpermil2_instruction:
- mov [immediate_size],-3
- mov byte [value],0
- vpermil2_instruction_setup:
- or [vex_required],2
- mov [base_code],0Fh
- mov [supplemental_code],al
- mov al,3Ah
- xor cl,cl
- jmp avx_instruction
-
-avx_shift_q_instruction_evex:
- or [vex_required],8
-avx_shift_q_instruction:
- or [rex_prefix],80h
- mov cl,8
- jmp avx_shift_instruction
-avx_shift_d_instruction:
- mov cl,4
- jmp avx_shift_instruction
-avx_shift_bw_instruction:
- xor cl,cl
- avx_shift_instruction:
- mov [broadcast_size],cl
- mov [mmx_size],0
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- call take_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je avx_shift_reg_mem
- mov [operand_size],cl
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- push esi
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_shift_reg_reg_reg
- pop esi
- cmp al,'['
- je avx_shift_reg_reg_mem
- xchg cl,[operand_size]
- test cl,not 1
- jnz invalid_operand_size
- dec esi
- call convert_avx_shift_opcode
- mov bl,al
- jmp mmx_nomem_imm8
- convert_avx_shift_opcode:
- mov al,[extended_code]
- mov ah,al
- and ah,1111b
- add ah,70h
- mov [extended_code],ah
- shr al,4
- sub al,0Ch
- shl al,1
- xchg al,[postbyte_register]
- xchg al,[vex_register]
- ret
- avx_shift_reg_reg_reg:
- pop eax
- lods byte [esi]
- call convert_xmm_register
- xchg cl,[operand_size]
- mov bl,al
- jmp nomem_instruction_ready
- avx_shift_reg_reg_mem:
- mov [mmx_size],16
- push ecx
- lods byte [esi]
- call get_size_operator
- call get_address
- pop eax
- xchg al,[operand_size]
- test al,al
- jz instruction_ready
- cmp al,16
- jne invalid_operand_size
- jmp instruction_ready
- avx_shift_reg_mem:
- or [vex_required],8
- call take_avx_mem
- call convert_avx_shift_opcode
- jmp mmx_imm8
-avx_shift_dq_instruction:
- mov [postbyte_register],al
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],73h
- or [vex_required],1
- mov [mmx_size],0
- call take_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je avx_shift_dq_reg_mem
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- jmp mmx_nomem_imm8
- avx_shift_dq_reg_mem:
- or [vex_required],8
- call get_address
- jmp mmx_imm8
-avx512_rotate_q_instruction:
- mov cl,8
- or [rex_prefix],cl
- jmp avx512_rotate_instruction
-avx512_rotate_d_instruction:
- mov cl,4
- avx512_rotate_instruction:
- mov [broadcast_size],cl
- mov [postbyte_register],al
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],72h
- or [vex_required],8
- mov [mmx_size],0
- mov [immediate_size],1
- call take_avx_register
- mov [vex_register],al
- call take_avx512_mask
- jmp avx_vex_reg_ok
-
-avx_pmovsxbq_instruction:
- mov cl,2
- jmp avx_pmovsx_instruction
-avx_pmovsxbd_instruction:
- mov cl,4
- jmp avx_pmovsx_instruction
-avx_pmovsxbw_instruction:
- mov cl,8
- avx_pmovsx_instruction:
- mov [mmx_size],cl
- or [vex_required],1
- call setup_66_0f_38
- call take_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor al,al
- xchg al,[operand_size]
- bsf ecx,eax
- sub cl,4
- shl [mmx_size],cl
- push eax
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_pmovsx_reg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- pop eax
- xchg al,[operand_size]
- or al,al
- jz instruction_ready
- cmp al,[mmx_size]
- jne invalid_operand_size
- jmp instruction_ready
- avx_pmovsx_reg_reg:
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- cmp ah,[mmx_size]
- je avx_pmovsx_xmmreg_reg_size_ok
- jb invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- avx_pmovsx_xmmreg_reg_size_ok:
- pop eax
- mov [operand_size],al
- jmp nomem_instruction_ready
-avx512_pmovqb_instruction:
- mov cl,2
- jmp avx512_pmov_instruction
-avx512_pmovdb_instruction:
- mov cl,4
- jmp avx512_pmov_instruction
-avx512_pmovwb_instruction:
- mov cl,8
- avx512_pmov_instruction:
- mov [mmx_size],cl
- or [vex_required],8
- mov [extended_code],38h
- mov [supplemental_code],al
- mov [base_code],0Fh
- mov [opcode_prefix],0F3h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx512_pmov_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- or [operand_flags],20h
- call avx512_pmov_common
- or al,al
- jz instruction_ready
- cmp al,[mmx_size]
- jne invalid_operand_size
- jmp instruction_ready
- avx512_pmov_common:
- call take_avx512_mask
- xor al,al
- xchg al,[operand_size]
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [postbyte_register],al
- mov al,ah
- mov ah,cl
- bsf ecx,eax
- sub cl,4
- shl [mmx_size],cl
- mov cl,ah
- pop eax
- ret
- avx512_pmov_reg:
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- call avx512_pmov_common
- cmp al,[mmx_size]
- je nomem_instruction_ready
- jb invalid_operand_size
- cmp al,16
- jne invalid_operand_size
- jmp nomem_instruction_ready
-
-avx_broadcast_128_instruction_noevex:
- or [vex_required],2
- mov cl,10h
- jmp avx_broadcast_instruction
-avx512_broadcast_32x2_instruction:
- mov cl,08h
- jmp avx_broadcast_instruction_evex
-avx512_broadcast_32x4_instruction:
- mov cl,10h
- jmp avx_broadcast_instruction_evex
-avx512_broadcast_32x8_instruction:
- mov cl,20h
- jmp avx_broadcast_instruction_evex
-avx512_broadcast_64x2_instruction:
- mov cl,10h
- jmp avx_broadcast_instruction_w1_evex
-avx512_broadcast_64x4_instruction:
- mov cl,20h
- avx_broadcast_instruction_w1_evex:
- or [rex_prefix],8
- avx_broadcast_instruction_evex:
- or [vex_required],8
- jmp avx_broadcast_instruction
-avx_broadcastss_instruction:
- mov cl,4
- jmp avx_broadcast_instruction
-avx_broadcastsd_instruction:
- or [rex_prefix],80h
- mov cl,8
- jmp avx_broadcast_instruction
-avx_pbroadcastb_instruction:
- mov cl,1
- jmp avx_broadcast_pi_instruction
-avx_pbroadcastw_instruction:
- mov cl,2
- jmp avx_broadcast_pi_instruction
-avx_pbroadcastd_instruction:
- mov cl,4
- jmp avx_broadcast_pi_instruction
-avx_pbroadcastq_instruction:
- mov cl,8
- or [rex_prefix],80h
- avx_broadcast_pi_instruction:
- or [operand_flags],40h
- avx_broadcast_instruction:
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,38h
- mov [mmx_size],cl
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- call take_avx_register
- cmp ah,[mmx_size]
- je invalid_operand_size
- test [operand_flags],40h
- jnz avx_broadcast_destination_size_ok
- cmp [mmx_size],4
- je avx_broadcast_destination_size_ok
- cmp [supplemental_code],59h
- je avx_broadcast_destination_size_ok
- cmp ah,16
- je invalid_operand_size
- avx_broadcast_destination_size_ok:
- xor ah,ah
- xchg ah,[operand_size]
- push eax
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_broadcast_reg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- pop eax
- xchg ah,[operand_size]
- mov [postbyte_register],al
- mov al,[broadcast_size]
- mov al,[mmx_size]
- cmp al,ah
- je instruction_ready
- or al,al
- jz instruction_ready
- or ah,ah
- jz instruction_ready
- jmp invalid_operand_size
- avx_broadcast_reg_reg:
- lods byte [esi]
- test [operand_flags],40h
- jz avx_broadcast_reg_avx_reg
- cmp al,60h
- jb avx_broadcast_reg_general_reg
- cmp al,80h
- jb avx_broadcast_reg_avx_reg
- cmp al,0C0h
- jb avx_broadcast_reg_general_reg
- avx_broadcast_reg_avx_reg:
- call convert_avx_register
- mov bl,al
- mov al,[mmx_size]
- or al,al
- jz avx_broadcast_reg_avx_reg_size_ok
- cmp ah,16
- jne invalid_operand_size
- cmp al,ah
- jae invalid_operand
- avx_broadcast_reg_avx_reg_size_ok:
- pop eax
- xchg ah,[operand_size]
- mov [postbyte_register],al
- test [vex_required],2
- jnz invalid_operand
- jmp nomem_instruction_ready
- avx_broadcast_reg_general_reg:
- call convert_register
- mov bl,al
- mov al,[mmx_size]
- or al,al
- jz avx_broadcast_reg_general_reg_size_ok
- cmp al,ah
- je avx_broadcast_reg_general_reg_size_ok
- ja invalid_operand_size
- cmp ah,4
- jne invalid_operand_size
- avx_broadcast_reg_general_reg_size_ok:
- cmp al,4
- jb avx_broadcast_reg_general_reg_ready
- cmp al,8
- mov al,3
- jne avx_broadcast_reg_general_reg_ready
- or [rex_prefix],8
- avx_broadcast_reg_general_reg_ready:
- add al,7Ah-1
- mov [supplemental_code],al
- or [vex_required],8
- pop eax
- xchg ah,[operand_size]
- mov [postbyte_register],al
- jmp nomem_instruction_ready
-
-avx512_extract_64x4_instruction:
- or [rex_prefix],8
-avx512_extract_32x8_instruction:
- or [vex_required],8
- mov cl,32
- jmp avx_extractf_instruction
-avx512_extract_64x2_instruction:
- or [rex_prefix],8
-avx512_extract_32x4_instruction:
- or [vex_required],8
- mov cl,16
- jmp avx_extractf_instruction
-avx_extractf128_instruction:
- or [vex_required],2
- mov cl,16
- avx_extractf_instruction:
- mov [mmx_size],cl
- call setup_66_0f_3a
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_extractf_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- xor al,al
- xchg al,[operand_size]
- or al,al
- jz avx_extractf_mem_size_ok
- cmp al,[mmx_size]
- jne invalid_operand_size
- avx_extractf_mem_size_ok:
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- cmp ah,[mmx_size]
- jbe invalid_operand_size
- mov [postbyte_register],al
- jmp mmx_imm8
- avx_extractf_reg:
- lods byte [esi]
- call convert_avx_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- push eax
- call take_avx512_mask
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- cmp ah,[mmx_size]
- jbe invalid_operand_size
- mov [postbyte_register],al
- pop ebx
- jmp mmx_nomem_imm8
-avx512_insert_64x4_instruction:
- or [rex_prefix],8
-avx512_insert_32x8_instruction:
- or [vex_required],8
- mov cl,32
- jmp avx_insertf_instruction
-avx512_insert_64x2_instruction:
- or [rex_prefix],8
-avx512_insert_32x4_instruction:
- or [vex_required],8
- mov cl,16
- jmp avx_insertf_instruction
-avx_insertf128_instruction:
- or [vex_required],2
- mov cl,16
- avx_insertf_instruction:
- mov [mmx_size],cl
- mov [broadcast_size],0
- call setup_66_0f_3a
- call take_avx_register
- cmp ah,[mmx_size]
- jbe invalid_operand
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- mov al,[mmx_size]
- xchg al,[operand_size]
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_insertf_reg_reg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- pop eax
- mov [operand_size],al
- jmp mmx_imm8
- avx_insertf_reg_reg_reg:
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- pop eax
- mov [operand_size],al
- jmp mmx_nomem_imm8
-avx_extract_b_instruction:
- mov cl,1
- jmp avx_extract_instruction
-avx_extract_w_instruction:
- mov cl,2
- jmp avx_extract_instruction
-avx_extract_q_instruction:
- or [rex_prefix],8
- mov cl,8
- jmp avx_extract_instruction
-avx_extract_d_instruction:
- mov cl,4
- avx_extract_instruction:
- mov [mmx_size],cl
- call setup_66_0f_3a
- or [vex_required],1
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je avx_extractps_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[mmx_size]
- not al
- and [operand_size],al
- jnz invalid_operand_size
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- jmp mmx_imm8
- avx_extractps_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,[mmx_size]
- cmp ah,al
- jb invalid_operand_size
- cmp ah,4
- je avx_extractps_reg_size_ok
- cmp ah,8
- jne invalid_operand_size
- cmp [code_type],64
- jne invalid_operand
- cmp al,4
- jae avx_extractps_reg_size_ok
- or [rex_prefix],8
- avx_extractps_reg_size_ok:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- cmp [supplemental_code],15h
- jne mmx_nomem_imm8
- mov [extended_code],0C5h
- xchg bl,[postbyte_register]
- jmp mmx_nomem_imm8
-avx_insertps_instruction:
- mov [immediate_size],1
- or [operand_flags],10h
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- mov al,3Ah
- mov cl,4
- jmp avx_instruction
-avx_pinsrb_instruction:
- mov cl,1
- jmp avx_pinsr_instruction_3a
-avx_pinsrw_instruction:
- mov cl,2
- jmp avx_pinsr_instruction
-avx_pinsrd_instruction:
- mov cl,4
- jmp avx_pinsr_instruction_3a
-avx_pinsrq_instruction:
- cmp [code_type],64
- jne illegal_instruction
- mov cl,8
- or [rex_prefix],8
- avx_pinsr_instruction_3a:
- mov [supplemental_code],al
- mov al,3Ah
- avx_pinsr_instruction:
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],cl
- or [vex_required],1
- call take_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- jmp pinsr_xmmreg
-
-avx_cvtudq2pd_instruction:
- or [vex_required],8
-avx_cvtdq2pd_instruction:
- mov [opcode_prefix],0F3h
- mov cl,4
- jmp avx_cvt_d_instruction
-avx_cvtps2qq_instruction:
- or [operand_flags],8
-avx_cvttps2qq_instruction:
- or [operand_flags],4
- or [vex_required],8
- mov [opcode_prefix],66h
- mov cl,4
- jmp avx_cvt_d_instruction
-avx_cvtps2pd_instruction:
- or [operand_flags],4
- mov cl,4
- avx_cvt_d_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- mov [broadcast_size],cl
- call take_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor ecx,ecx
- xchg cl,[operand_size]
- mov al,cl
- shr al,1
- mov [mmx_size],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je avx_cvt_d_reg_mem
- cmp al,10h
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call convert_avx_register
- cmp ah,[mmx_size]
- je avx_cvt_d_reg_reg_size_ok
- jb invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- avx_cvt_d_reg_reg_size_ok:
- mov bl,al
- mov [operand_size],cl
- call take_avx512_rounding
- jmp nomem_instruction_ready
- avx_cvt_d_reg_mem:
- call take_avx_mem
- jmp instruction_ready
-avx_cvtpd2dq_instruction:
- or [operand_flags],4+8
- mov [opcode_prefix],0F2h
- jmp avx_cvt_q_instruction
-avx_cvtuqq2ps_instruction:
- mov [opcode_prefix],0F2h
-avx_cvtpd2udq_instruction:
- or [operand_flags],8
-avx_cvttpd2udq_instruction:
- or [operand_flags],4
- or [vex_required],8
- jmp avx_cvt_q_instruction
-avx_cvtpd2ps_instruction:
- or [operand_flags],8
-avx_cvttpd2dq_instruction:
- or [operand_flags],4
- mov [opcode_prefix],66h
- avx_cvt_q_instruction:
- mov [broadcast_size],8
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- or [rex_prefix],80h
- call take_avx_register
- mov [postbyte_register],al
- push eax
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor al,al
- mov [operand_size],al
- mov [mmx_size],al
- call take_avx_rm
- jnc avx_cvt_q_reg_mem
- mov bl,al
- pop eax
- call avx_cvt_q_check_size
- call take_avx512_rounding
- jmp nomem_instruction_ready
- avx_cvt_q_reg_mem:
- pop eax
- call avx_cvt_q_check_size
- jmp instruction_ready
- avx_cvt_q_check_size:
- mov al,[operand_size]
- or al,al
- jz avx_cvt_q_size_not_specified
- cmp al,64
- ja invalid_operand_size
- shr al,1
- cmp al,ah
- je avx_cvt_q_size_ok
- ja invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- avx_cvt_q_size_ok:
- ret
- avx_cvt_q_size_not_specified:
- cmp ah,64 shr 1
- jne recoverable_unknown_size
- mov [operand_size],64
- ret
-avx_cvttps2udq_instruction:
- or [vex_required],8
- or [operand_flags],2+4
- mov cx,0400h
- jmp avx_instruction_with_broadcast
-avx_cvttps2dq_instruction:
- mov [opcode_prefix],0F3h
- or [operand_flags],2+4
- mov cx,0400h
- jmp avx_instruction_with_broadcast
-avx_cvtph2ps_instruction:
- mov [opcode_prefix],66h
- mov [supplemental_code],al
- or [operand_flags],4
- mov al,38h
- xor cl,cl
- jmp avx_cvt_d_instruction
-avx_cvtps2ph_instruction:
- call setup_66_0f_3a
- or [vex_required],1
- or [operand_flags],4
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je vcvtps2ph_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- shl [operand_size],1
- call take_avx_register
- mov [postbyte_register],al
- shr ah,1
- mov [mmx_size],ah
- jmp mmx_imm8
- vcvtps2ph_reg:
- lods byte [esi]
- call convert_avx_register
- mov bl,al
- call take_avx512_mask
- xor cl,cl
- xchg cl,[operand_size]
- shl cl,1
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [postbyte_register],al
- or cl,cl
- jz vcvtps2ph_reg_size_ok
- cmp cl,ah
- je vcvtps2ph_reg_size_ok
- jb invalid_operand_size
- cmp ah,16
- jne invalid_operand_size
- vcvtps2ph_reg_size_ok:
- call take_avx512_rounding
- jmp mmx_nomem_imm8
-
-avx_cvtsd2usi_instruction:
- or [operand_flags],8
-avx_cvttsd2usi_instruction:
- or [vex_required],8
- jmp avx_cvttsd2si_instruction
-avx_cvtsd2si_instruction:
- or [operand_flags],8
-avx_cvttsd2si_instruction:
- mov ah,0F2h
- mov cl,8
- jmp avx_cvt_2si_instruction
-avx_cvtss2usi_instruction:
- or [operand_flags],8
-avx_cvttss2usi_instruction:
- or [vex_required],8
- jmp avx_cvttss2si_instruction
-avx_cvtss2si_instruction:
- or [operand_flags],8
-avx_cvttss2si_instruction:
- mov ah,0F3h
- mov cl,4
- avx_cvt_2si_instruction:
- or [operand_flags],2+4
- mov [mmx_size],cl
- mov [broadcast_size],0
- mov [opcode_prefix],ah
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- mov [operand_size],0
- cmp ah,4
- je avx_cvt_2si_reg
- cmp ah,8
- jne invalid_operand_size
- call operand_64bit
- avx_cvt_2si_reg:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_rm
- jnc instruction_ready
- mov bl,al
- call take_avx512_rounding
- jmp nomem_instruction_ready
-avx_cvtusi2sd_instruction:
- or [vex_required],8
-avx_cvtsi2sd_instruction:
- mov ah,0F2h
- mov cl,8
- jmp avx_cvtsi_instruction
-avx_cvtusi2ss_instruction:
- or [vex_required],8
-avx_cvtsi2ss_instruction:
- mov ah,0F3h
- mov cl,4
- avx_cvtsi_instruction:
- or [operand_flags],2+4+8
- mov [mmx_size],cl
- mov [opcode_prefix],ah
- mov [base_code],0Fh
- mov [extended_code],al
- or [vex_required],1
- call take_avx_register
- cmp ah,16
- jne invalid_operand_size
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je avx_cvtsi_reg_reg_mem
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov bl,al
- cmp ah,4
- je avx_cvtsi_reg_reg_reg32
- cmp ah,8
- jne invalid_operand_size
- call operand_64bit
- avx_cvtsi_rounding:
- call take_avx512_rounding
- jmp nomem_instruction_ready
- avx_cvtsi_reg_reg_reg32:
- cmp [mmx_size],8
- jne avx_cvtsi_rounding
- jmp nomem_instruction_ready
- avx_cvtsi_reg_reg_mem:
- call get_address
- mov al,[operand_size]
- mov [mmx_size],al
- or al,al
- jz single_mem_nosize
- cmp al,4
- je instruction_ready
- cmp al,8
- jne invalid_operand_size
- call operand_64bit
- jmp instruction_ready
-
-avx_maskmov_w1_instruction:
- or [rex_prefix],8
-avx_maskmov_instruction:
- call setup_66_0f_38
- mov [mmx_size],0
- or [vex_required],2
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne avx_maskmov_mem
- lods byte [esi]
- call convert_avx_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp instruction_ready
- avx_maskmov_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [postbyte_register],al
- add [supplemental_code],2
- jmp instruction_ready
-avx_movmskpd_instruction:
- mov [opcode_prefix],66h
-avx_movmskps_instruction:
- mov [base_code],0Fh
- mov [extended_code],50h
- or [vex_required],2
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- cmp ah,4
- je avx_movmskps_reg_ok
- cmp ah,8
- jne invalid_operand_size
- cmp [code_type],64
- jne invalid_operand
- avx_movmskps_reg_ok:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov bl,al
- jmp nomem_instruction_ready
-avx_maskmovdqu_instruction:
- or [vex_required],2
- jmp maskmovdqu_instruction
-avx_pmovmskb_instruction:
- or [vex_required],2
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- cmp ah,4
- je avx_pmovmskb_reg_size_ok
- cmp [code_type],64
- jne invalid_operand_size
- cmp ah,8
- jnz invalid_operand_size
- avx_pmovmskb_reg_size_ok:
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov bl,al
- jmp nomem_instruction_ready
-
-gather_pd_instruction:
- or [rex_prefix],8
-gather_ps_instruction:
- call setup_66_0f_38
- or [vex_required],4
- or [operand_flags],20h
- call take_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor cl,cl
- xchg cl,[operand_size]
- push ecx
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_argument
- call get_address
- pop eax
- xchg al,[operand_size]
- gather_mem_size_check:
- mov ah,4
- test [rex_prefix],8
- jz gather_elements_size_ok
- add ah,ah
- gather_elements_size_ok:
- mov [mmx_size],ah
- test al,al
- jz gather_mem_size_ok
- cmp al,ah
- jne invalid_operand_size
- gather_mem_size_ok:
- cmp byte [esi],','
- je gather_reg_mem_reg
- test [vex_required],20h
- jz invalid_operand
- mov ah,[operand_size]
- mov al,80h
- jmp gather_arguments_ok
- gather_reg_mem_reg:
- or [vex_required],2
- inc esi
- call take_avx_register
- gather_arguments_ok:
- mov [vex_register],al
- cmp al,[postbyte_register]
- je disallowed_combination_of_registers
- mov al,bl
- and al,11111b
- cmp al,[postbyte_register]
- je disallowed_combination_of_registers
- cmp al,[vex_register]
- je disallowed_combination_of_registers
- mov al,bl
- shr al,5
- cmp al,0Ch shr 1
- je gather_vr128
- mov ah,32
- cmp al,6 shr 1
- jne gather_regular
- add ah,ah
- gather_regular:
- mov al,[rex_prefix]
- shr al,3
- xor al,[supplemental_code]
- test al,1
- jz gather_uniform
- test [supplemental_code],1
- jz gather_double
- mov al,ah
- xchg al,[operand_size]
- add al,al
- cmp al,ah
- jne invalid_operand_size
- jmp instruction_ready
- gather_double:
- add ah,ah
- gather_uniform:
- cmp ah,[operand_size]
- jne invalid_operand_size
- jmp instruction_ready
- gather_vr128:
- cmp ah,16
- je instruction_ready
- cmp ah,32
- jne invalid_operand_size
- test [supplemental_code],1
- jnz invalid_operand_size
- test [rex_prefix],8
- jz invalid_operand_size
- jmp instruction_ready
-scatter_pd_instruction:
- or [rex_prefix],8
-scatter_ps_instruction:
- call setup_66_0f_38
- or [vex_required],4+8
- or [operand_flags],20h
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_argument
- call get_address
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor al,al
- xchg al,[operand_size]
- push eax
- call take_avx_register
- mov [postbyte_register],al
- pop eax
- jmp gather_mem_size_check
-gatherpf_qpd_instruction:
- mov ah,0C7h
- jmp gatherpf_pd_instruction
-gatherpf_dpd_instruction:
- mov ah,0C6h
- gatherpf_pd_instruction:
- or [rex_prefix],8
- mov cl,8
- jmp gatherpf_instruction
-gatherpf_qps_instruction:
- mov ah,0C7h
- jmp gatherpf_ps_instruction
-gatherpf_dps_instruction:
- mov ah,0C6h
- gatherpf_ps_instruction:
- mov cl,4
- gatherpf_instruction:
- mov [mmx_size],cl
- mov [postbyte_register],al
- mov al,ah
- call setup_66_0f_38
- or [vex_required],4+8
- or [operand_flags],20h
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_argument
- call get_address
- call take_avx512_mask
- mov ah,[mmx_size]
- mov al,[operand_size]
- or al,al
- jz gatherpf_mem_size_ok
- cmp al,ah
- jne invalid_operand_size
- gatherpf_mem_size_ok:
- mov [operand_size],64
- mov al,6 shr 1
- cmp ah,4
- je gatherpf_check_vsib
- cmp [supplemental_code],0C6h
- jne gatherpf_check_vsib
- mov al,0Eh shr 1
- gatherpf_check_vsib:
- mov ah,bl
- shr ah,5
- cmp al,ah
- jne invalid_operand
- jmp instruction_ready
-
-bmi_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],0F3h
- mov [postbyte_register],al
- bmi_reg:
- or [vex_required],2
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je bmi_reg_reg
- cmp al,'['
- jne invalid_argument
- call get_address
- call operand_32or64
- jmp instruction_ready
- bmi_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- call operand_32or64
- jmp nomem_instruction_ready
- operand_32or64:
- mov al,[operand_size]
- cmp al,4
- je operand_32or64_ok
- cmp al,8
- jne invalid_operand_size
- cmp [code_type],64
- jne invalid_operand
- or [rex_prefix],8
- operand_32or64_ok:
- ret
-pdep_instruction:
- mov [opcode_prefix],0F2h
- jmp andn_instruction
-pext_instruction:
- mov [opcode_prefix],0F3h
-andn_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- or [vex_required],2
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- jmp bmi_reg
-sarx_instruction:
- mov [opcode_prefix],0F3h
- jmp bzhi_instruction
-shrx_instruction:
- mov [opcode_prefix],0F2h
- jmp bzhi_instruction
-shlx_instruction:
- mov [opcode_prefix],66h
-bzhi_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- or [vex_required],2
- call get_reg_mem
- jc bzhi_reg_reg
- call get_vex_source_register
- jc invalid_operand
- call operand_32or64
- jmp instruction_ready
- bzhi_reg_reg:
- call get_vex_source_register
- jc invalid_operand
- call operand_32or64
- jmp nomem_instruction_ready
- get_vex_source_register:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne no_vex_source_register
- lods byte [esi]
- call convert_register
- mov [vex_register],al
- clc
- ret
- no_vex_source_register:
- stc
- ret
-bextr_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- or [vex_required],2
- call get_reg_mem
- jc bextr_reg_reg
- call get_vex_source_register
- jc bextr_reg_mem_imm32
- call operand_32or64
- jmp instruction_ready
- bextr_reg_reg:
- call get_vex_source_register
- jc bextr_reg_reg_imm32
- call operand_32or64
- jmp nomem_instruction_ready
- setup_bextr_imm_opcode:
- mov [xop_opcode_map],0Ah
- mov [base_code],10h
- call operand_32or64
- ret
- bextr_reg_mem_imm32:
- call get_imm32
- call setup_bextr_imm_opcode
- jmp store_instruction_with_imm32
- bextr_reg_reg_imm32:
- call get_imm32
- call setup_bextr_imm_opcode
- store_nomem_instruction_with_imm32:
- call store_nomem_instruction
- mov eax,dword [value]
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- get_imm32:
- cmp al,'('
- jne invalid_operand
- push edx ebx ecx
- call get_dword_value
- mov dword [value],eax
- pop ecx ebx edx
- ret
-rorx_instruction:
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],3Ah
- mov [supplemental_code],al
- or [vex_required],2
- call get_reg_mem
- jc rorx_reg_reg
- call operand_32or64
- jmp mmx_imm8
- rorx_reg_reg:
- call operand_32or64
- jmp mmx_nomem_imm8
-
-tbm_instruction:
- mov [xop_opcode_map],9
- mov ah,al
- shr ah,4
- and al,111b
- mov [base_code],ah
- mov [postbyte_register],al
- jmp bmi_reg
-
-llwpcb_instruction:
- or [vex_required],2
- mov [xop_opcode_map],9
- mov [base_code],12h
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov bl,al
- call operand_32or64
- jmp nomem_instruction_ready
-lwpins_instruction:
- or [vex_required],2
- mov [xop_opcode_map],0Ah
- mov [base_code],12h
- mov [vex_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je lwpins_reg_reg
- cmp al,'['
- jne invalid_argument
- push ecx
- call get_address
- pop eax
- xchg al,[operand_size]
- test al,al
- jz lwpins_reg_mem_size_ok
- cmp al,4
- jne invalid_operand_size
- lwpins_reg_mem_size_ok:
- call prepare_lwpins
- jmp store_instruction_with_imm32
- lwpins_reg_reg:
- lods byte [esi]
- call convert_register
- cmp ah,4
- jne invalid_operand_size
- mov [operand_size],cl
- mov bl,al
- call prepare_lwpins
- jmp store_nomem_instruction_with_imm32
- prepare_lwpins:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_imm32
- call operand_32or64
- mov al,[vex_register]
- xchg al,[postbyte_register]
- mov [vex_register],al
- ret
-
-xop_single_source_sd_instruction:
- or [operand_flags],2
- mov [mmx_size],8
- jmp xop_instruction_9
-xop_single_source_ss_instruction:
- or [operand_flags],2
- mov [mmx_size],4
- jmp xop_instruction_9
-xop_single_source_instruction:
- or [operand_flags],2
- mov [mmx_size],0
- xop_instruction_9:
- mov [base_code],al
- mov [xop_opcode_map],9
- jmp avx_xop_common
-xop_single_source_128bit_instruction:
- or [operand_flags],2
- mov [mmx_size],16
- jmp xop_instruction_9
-xop_triple_source_128bit_instruction:
- mov [immediate_size],-1
- mov byte [value],0
- mov [mmx_size],16
- jmp xop_instruction_8
-xop_128bit_instruction:
- mov [immediate_size],-2
- mov byte [value],0
- mov [mmx_size],16
- xop_instruction_8:
- mov [base_code],al
- mov [xop_opcode_map],8
- jmp avx_xop_common
-xop_pcom_b_instruction:
- mov ah,0CCh
- jmp xop_pcom_instruction
-xop_pcom_d_instruction:
- mov ah,0CEh
- jmp xop_pcom_instruction
-xop_pcom_q_instruction:
- mov ah,0CFh
- jmp xop_pcom_instruction
-xop_pcom_w_instruction:
- mov ah,0CDh
- jmp xop_pcom_instruction
-xop_pcom_ub_instruction:
- mov ah,0ECh
- jmp xop_pcom_instruction
-xop_pcom_ud_instruction:
- mov ah,0EEh
- jmp xop_pcom_instruction
-xop_pcom_uq_instruction:
- mov ah,0EFh
- jmp xop_pcom_instruction
-xop_pcom_uw_instruction:
- mov ah,0EDh
- xop_pcom_instruction:
- mov byte [value],al
- mov [immediate_size],-4
- mov [mmx_size],16
- mov [base_code],ah
- mov [xop_opcode_map],8
- jmp avx_xop_common
-vpcmov_instruction:
- or [vex_required],2
- mov [immediate_size],-2
- mov byte [value],0
- mov [mmx_size],0
- mov [base_code],al
- mov [xop_opcode_map],8
- jmp avx_xop_common
-xop_shift_instruction:
- mov [base_code],al
- or [vex_required],2
- mov [xop_opcode_map],9
- call take_avx_register
- cmp ah,16
- jne invalid_operand
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je xop_shift_reg_mem
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [vex_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- push esi
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- pop esi
- xchg cl,[operand_size]
- cmp al,'['
- je xop_shift_reg_reg_mem
- cmp al,10h
- jne xop_shift_reg_reg_imm
- call take_avx_register
- mov bl,al
- xchg bl,[vex_register]
- jmp nomem_instruction_ready
- xop_shift_reg_reg_mem:
- or [rex_prefix],8
- lods byte [esi]
- call get_size_operator
- call get_address
- jmp instruction_ready
- xop_shift_reg_reg_imm:
- xor bl,bl
- xchg bl,[vex_register]
- cmp [base_code],94h
- jae invalid_operand
- add [base_code],30h
- mov [xop_opcode_map],8
- dec esi
- jmp mmx_nomem_imm8
- xop_shift_reg_mem:
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- push esi
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- call get_size_operator
- pop esi
- xchg cl,[operand_size]
- cmp al,10h
- jne xop_shift_reg_mem_imm
- call take_avx_register
- mov [vex_register],al
- jmp instruction_ready
- xop_shift_reg_mem_imm:
- cmp [base_code],94h
- jae invalid_operand
- add [base_code],30h
- mov [xop_opcode_map],8
- dec esi
- jmp mmx_imm8
-
-avx512_4vnniw_instruction:
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- mov [mmx_size],16
- mov [broadcast_size],0
- or [vex_required],8
- call take_avx_register
- mov [postbyte_register],al
- call take_avx512_mask
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_register
- mov [vex_register],al
- cmp byte [esi],'+'
- jne reg4_ok
- inc esi
- cmp dword [esi],29030128h
- jne invalid_operand
- lods dword [esi]
- reg4_ok:
- cmp [operand_size],64
- jne invalid_operand_size
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_avx_rm
- jc invalid_operand
- mov [operand_size],64
- jmp instruction_ready
-
-set_evex_mode:
- mov [evex_mode],al
- jmp instruction_assembled
-
-take_avx_register:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
-convert_avx_register:
- mov ah,al
- and al,1Fh
- and ah,0E0h
- sub ah,60h
- jb invalid_operand
- jz avx512_register_size
- sub ah,60h
- jb invalid_operand
- jnz avx_register_size_ok
- mov ah,16
- jmp avx_register_size_ok
- avx512_register_size:
- mov ah,64
- avx_register_size_ok:
- cmp al,8
- jb match_register_size
- cmp [code_type],64
- jne invalid_operand
- jmp match_register_size
-store_vex_instruction_code:
- test [rex_prefix],10h
- jnz invalid_operand
- test [vex_required],0F8h
- jnz store_evex_instruction_code
- test [vex_register],10000b
- jnz store_evex_instruction_code
- cmp [operand_size],64
- je store_evex_instruction_code
- mov al,[base_code]
- cmp al,0Fh
- jne store_xop_instruction_code
- test [vex_required],2
- jnz prepare_vex
- cmp [evex_mode],0
- je prepare_vex
- cmp [displacement_compression],1
- jne prepare_vex
- cmp edx,80h
- jb prepare_vex
- cmp edx,-80h
- jae prepare_vex
- mov al,bl
- or al,bh
- shr al,4
- cmp al,2
- je prepare_vex
- call compress_displacement
- cmp [displacement_compression],2
- ja prepare_evex
- jb prepare_vex
- dec [displacement_compression]
- mov edx,[uncompressed_displacement]
- prepare_vex:
- mov ah,[extended_code]
- cmp ah,38h
- je store_vex_0f38_instruction_code
- cmp ah,3Ah
- je store_vex_0f3a_instruction_code
- test [rex_prefix],1011b
- jnz store_vex_0f_instruction_code
- mov [edi+2],ah
- mov byte [edi],0C5h
- mov al,[vex_register]
- not al
- shl al,3
- mov ah,[rex_prefix]
- shl ah,5
- and ah,80h
- xor al,ah
- call get_vex_lpp_bits
- mov [edi+1],al
- call check_vex
- add edi,3
- ret
- get_vex_lpp_bits:
- cmp [operand_size],32
- jne get_vex_pp_bits
- or al,100b
- get_vex_pp_bits:
- mov ah,[opcode_prefix]
- cmp ah,66h
- je vex_66
- cmp ah,0F3h
- je vex_f3
- cmp ah,0F2h
- je vex_f2
- test ah,ah
- jnz disallowed_combination_of_registers
- ret
- vex_f2:
- or al,11b
- ret
- vex_f3:
- or al,10b
- ret
- vex_66:
- or al,1
- ret
- store_vex_0f38_instruction_code:
- mov al,11100010b
- mov ah,[supplemental_code]
- jmp make_c4_vex
- store_vex_0f3a_instruction_code:
- mov al,11100011b
- mov ah,[supplemental_code]
- jmp make_c4_vex
- store_vex_0f_instruction_code:
- mov al,11100001b
- make_c4_vex:
- mov [edi+3],ah
- mov byte [edi],0C4h
- mov ah,[rex_prefix]
- shl ah,5
- xor al,ah
- mov [edi+1],al
- call check_vex
- mov al,[vex_register]
- xor al,1111b
- shl al,3
- mov ah,[rex_prefix]
- shl ah,4
- and ah,80h
- or al,ah
- call get_vex_lpp_bits
- mov [edi+2],al
- add edi,4
- ret
- check_vex:
- cmp [code_type],64
- je vex_ok
- not al
- test al,11000000b
- jnz invalid_operand
- test [rex_prefix],40h
- jnz invalid_operand
- vex_ok:
- ret
-store_xop_instruction_code:
- mov [edi+3],al
- mov byte [edi],8Fh
- mov al,[xop_opcode_map]
- mov ah,[rex_prefix]
- test ah,40h
- jz xop_ok
- cmp [code_type],64
- jne invalid_operand
- xop_ok:
- not ah
- shl ah,5
- xor al,ah
- mov [edi+1],al
- mov al,[vex_register]
- xor al,1111b
- shl al,3
- mov ah,[rex_prefix]
- shl ah,4
- and ah,80h
- or al,ah
- call get_vex_lpp_bits
- mov [edi+2],al
- add edi,4
- ret
-store_evex_instruction_code:
- test [vex_required],2
- jnz invalid_operand
- cmp [base_code],0Fh
- jne invalid_operand
- cmp [displacement_compression],1
- jne prepare_evex
- call compress_displacement
- prepare_evex:
- mov ah,[extended_code]
- cmp ah,38h
- je store_evex_0f38_instruction_code
- cmp ah,3Ah
- je store_evex_0f3a_instruction_code
- mov al,11110001b
- make_evex:
- mov [edi+4],ah
- mov byte [edi],62h
- mov ah,[rex_prefix]
- shl ah,5
- xor al,ah
- mov ah,[vex_required]
- and ah,10h
- xor al,ah
- mov [edi+1],al
- call check_vex
- mov al,[vex_register]
- not al
- and al,1111b
- shl al,3
- mov ah,[rex_prefix]
- shl ah,4
- or ah,[rex_prefix]
- and ah,80h
- or al,ah
- or al,100b
- call get_vex_pp_bits
- mov [edi+2],al
- mov al,[vex_register]
- not al
- shr al,1
- and al,1000b
- test [vex_required],80h
- jne evex_rounding
- mov ah,[operand_size]
- cmp ah,16
- jbe evex_l_ok
- or al,ah
- jmp evex_l_ok
- evex_rounding:
- mov ah,[rounding_mode]
- shl ah,5
- or al,ah
- evex_l_ok:
- test [vex_required],20h
- jz evex_zaaa_ok
- or al,[mask_register]
- evex_zaaa_ok:
- test [vex_required],40h
- jz evex_b_ok
- or al,10h
- evex_b_ok:
- mov [edi+3],al
- add edi,5
- ret
- store_evex_0f38_instruction_code:
- mov al,11110010b
- mov ah,[supplemental_code]
- jmp make_evex
- store_evex_0f3a_instruction_code:
- mov al,11110011b
- mov ah,[supplemental_code]
- jmp make_evex
-compress_displacement:
- mov ebp,ecx
- mov [uncompressed_displacement],edx
- or edx,edx
- jz displacement_compressed
- xor ecx,ecx
- mov cl,[mmx_size]
- test cl,cl
- jnz calculate_displacement_scale
- mov cl,[operand_size]
- calculate_displacement_scale:
- bsf ecx,ecx
- jz displacement_compression_ok
- xor eax,eax
- shrd eax,edx,cl
- jnz displacement_not_compressed
- sar edx,cl
- cmp edx,80h
- jb displacement_compressed
- cmp edx,-80h
- jnb displacement_compressed
- shl edx,cl
- displacement_not_compressed:
- inc [displacement_compression]
- jmp displacement_compression_ok
- displacement_compressed:
- add [displacement_compression],2
- displacement_compression_ok:
- mov ecx,ebp
- ret
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-out_of_memory:
- push _out_of_memory
- jmp fatal_error
-stack_overflow:
- push _stack_overflow
- jmp fatal_error
-main_file_not_found:
- push _main_file_not_found
- jmp fatal_error
-write_failed:
- push _write_failed
- jmp fatal_error
-
-code_cannot_be_generated:
- push _code_cannot_be_generated
- jmp general_error
-format_limitations_exceeded:
- push _format_limitations_exceeded
- jmp general_error
-invalid_definition:
- push _invalid_definition
- general_error:
- cmp [symbols_file],0
- je fatal_error
- call dump_preprocessed_source
- jmp fatal_error
-
-file_not_found:
- push _file_not_found
- jmp error_with_source
-error_reading_file:
- push _error_reading_file
- jmp error_with_source
-invalid_file_format:
- push _invalid_file_format
- jmp error_with_source
-invalid_macro_arguments:
- push _invalid_macro_arguments
- jmp error_with_source
-incomplete_macro:
- push _incomplete_macro
- jmp error_with_source
-unexpected_characters:
- push _unexpected_characters
- jmp error_with_source
-invalid_argument:
- push _invalid_argument
- jmp error_with_source
-illegal_instruction:
- push _illegal_instruction
- jmp error_with_source
-invalid_operand:
- push _invalid_operand
- jmp error_with_source
-invalid_operand_size:
- push _invalid_operand_size
- jmp error_with_source
-operand_size_not_specified:
- push _operand_size_not_specified
- jmp error_with_source
-operand_sizes_do_not_match:
- push _operand_sizes_do_not_match
- jmp error_with_source
-invalid_address_size:
- push _invalid_address_size
- jmp error_with_source
-address_sizes_do_not_agree:
- push _address_sizes_do_not_agree
- jmp error_with_source
-disallowed_combination_of_registers:
- push _disallowed_combination_of_registers
- jmp error_with_source
-long_immediate_not_encodable:
- push _long_immediate_not_encodable
- jmp error_with_source
-relative_jump_out_of_range:
- push _relative_jump_out_of_range
- jmp error_with_source
-invalid_expression:
- push _invalid_expression
- jmp error_with_source
-invalid_address:
- push _invalid_address
- jmp error_with_source
-invalid_value:
- push _invalid_value
- jmp error_with_source
-value_out_of_range:
- push _value_out_of_range
- jmp error_with_source
-undefined_symbol:
- mov edi,message
- mov esi,_undefined_symbol
- call copy_asciiz
- push message
- cmp [error_info],0
- je error_with_source
- mov esi,[error_info]
- mov esi,[esi+24]
- or esi,esi
- jz error_with_source
- mov byte [edi-1],20h
- call write_quoted_symbol_name
- jmp error_with_source
- copy_asciiz:
- lods byte [esi]
- stos byte [edi]
- test al,al
- jnz copy_asciiz
- ret
- write_quoted_symbol_name:
- mov al,27h
- stosb
- movzx ecx,byte [esi-1]
- rep movs byte [edi],[esi]
- mov ax,27h
- stosw
- ret
-symbol_out_of_scope:
- mov edi,message
- mov esi,_symbol_out_of_scope_1
- call copy_asciiz
- cmp [error_info],0
- je finish_symbol_out_of_scope_message
- mov esi,[error_info]
- mov esi,[esi+24]
- or esi,esi
- jz finish_symbol_out_of_scope_message
- mov byte [edi-1],20h
- call write_quoted_symbol_name
- finish_symbol_out_of_scope_message:
- mov byte [edi-1],20h
- mov esi,_symbol_out_of_scope_2
- call copy_asciiz
- push message
- jmp error_with_source
-invalid_use_of_symbol:
- push _invalid_use_of_symbol
- jmp error_with_source
-name_too_long:
- push _name_too_long
- jmp error_with_source
-invalid_name:
- push _invalid_name
- jmp error_with_source
-reserved_word_used_as_symbol:
- push _reserved_word_used_as_symbol
- jmp error_with_source
-symbol_already_defined:
- push _symbol_already_defined
- jmp error_with_source
-missing_end_quote:
- push _missing_end_quote
- jmp error_with_source
-missing_end_directive:
- push _missing_end_directive
- jmp error_with_source
-unexpected_instruction:
- push _unexpected_instruction
- jmp error_with_source
-extra_characters_on_line:
- push _extra_characters_on_line
- jmp error_with_source
-section_not_aligned_enough:
- push _section_not_aligned_enough
- jmp error_with_source
-setting_already_specified:
- push _setting_already_specified
- jmp error_with_source
-data_already_defined:
- push _data_already_defined
- jmp error_with_source
-too_many_repeats:
- push _too_many_repeats
- jmp error_with_source
-assertion_failed:
- push _assertion_failed
- jmp error_with_source
-invoked_error:
- push _invoked_error
- error_with_source:
- cmp [symbols_file],0
- je assembler_error
- call dump_preprocessed_source
- call restore_preprocessed_source
- jmp assembler_error
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-calculate_expression:
- mov [current_offset],edi
- mov [value_undefined],0
- cmp byte [esi],0
- je get_string_value
- cmp byte [esi],'.'
- je convert_fp
- calculation_loop:
- mov eax,[tagged_blocks]
- sub eax,0Ch
- cmp eax,edi
- jbe out_of_memory
- lods byte [esi]
- cmp al,1
- je get_byte_number
- cmp al,2
- je get_word_number
- cmp al,4
- je get_dword_number
- cmp al,8
- je get_qword_number
- cmp al,0Fh
- je value_out_of_range
- cmp al,10h
- je get_register
- cmp al,11h
- je get_label
- cmp al,')'
- je expression_calculated
- cmp al,']'
- je expression_calculated
- cmp al,'!'
- je invalid_expression
- sub edi,14h
- mov ebx,edi
- sub ebx,14h
- cmp al,0F0h
- je calculate_rva
- cmp al,0F1h
- je calculate_plt
- cmp al,0D0h
- je calculate_not
- cmp al,0E0h
- je calculate_bsf
- cmp al,0E1h
- je calculate_bsr
- cmp al,083h
- je calculate_neg
- mov dx,[ebx+8]
- or dx,[edi+8]
- cmp al,80h
- je calculate_add
- cmp al,81h
- je calculate_sub
- mov ah,[ebx+12]
- or ah,[edi+12]
- jz absolute_values_calculation
- call recoverable_misuse
- absolute_values_calculation:
- cmp al,90h
- je calculate_mul
- cmp al,91h
- je calculate_div
- or dx,dx
- jnz invalid_expression
- cmp al,0A0h
- je calculate_mod
- cmp al,0B0h
- je calculate_and
- cmp al,0B1h
- je calculate_or
- cmp al,0B2h
- je calculate_xor
- cmp al,0C0h
- je calculate_shl
- cmp al,0C1h
- je calculate_shr
- jmp invalid_expression
- expression_calculated:
- sub edi,14h
- cmp [value_undefined],0
- je expression_value_ok
- xor eax,eax
- mov [edi],eax
- mov [edi+4],eax
- mov [edi+12],eax
- expression_value_ok:
- ret
- get_byte_number:
- xor eax,eax
- lods byte [esi]
- stos dword [edi]
- xor al,al
- stos dword [edi]
- got_number:
- and word [edi-8+8],0
- and word [edi-8+12],0
- and dword [edi-8+16],0
- add edi,0Ch
- jmp calculation_loop
- get_word_number:
- xor eax,eax
- lods word [esi]
- stos dword [edi]
- xor ax,ax
- stos dword [edi]
- jmp got_number
- get_dword_number:
- movs dword [edi],[esi]
- xor eax,eax
- stos dword [edi]
- jmp got_number
- get_qword_number:
- movs dword [edi],[esi]
- movs dword [edi],[esi]
- jmp got_number
- get_register:
- mov byte [edi+9],0
- and word [edi+12],0
- lods byte [esi]
- mov [edi+8],al
- mov byte [edi+10],1
- xor eax,eax
- mov [edi+16],eax
- stos dword [edi]
- stos dword [edi]
- add edi,0Ch
- jmp calculation_loop
- get_label:
- xor eax,eax
- mov [edi+8],eax
- mov [edi+12],eax
- mov [edi+20],eax
- lods dword [esi]
- cmp eax,0Fh
- jb predefined_label
- je reserved_word_used_as_symbol
- mov ebx,eax
- mov ax,[current_pass]
- mov [ebx+18],ax
- mov cl,[ebx+9]
- shr cl,1
- and cl,1
- neg cl
- or byte [ebx+8],8
- test byte [ebx+8],1
- jz label_undefined
- cmp ax,[ebx+16]
- je unadjusted_label
- test byte [ebx+8],4
- jnz label_out_of_scope
- test byte [ebx+9],1
- jz unadjusted_label
- mov eax,[ebx]
- sub eax,dword [adjustment]
- stos dword [edi]
- mov eax,[ebx+4]
- sbb eax,dword [adjustment+4]
- stos dword [edi]
- sbb cl,[adjustment_sign]
- mov [edi-8+13],cl
- mov eax,dword [adjustment]
- or al,[adjustment_sign]
- or eax,dword [adjustment+4]
- jz got_label
- or [next_pass_needed],-1
- jmp got_label
- unadjusted_label:
- mov eax,[ebx]
- stos dword [edi]
- mov eax,[ebx+4]
- stos dword [edi]
- mov [edi-8+13],cl
- got_label:
- test byte [ebx+9],4
- jnz invalid_use_of_symbol
- call store_label_reference
- mov al,[ebx+11]
- mov [edi-8+12],al
- mov eax,[ebx+12]
- mov [edi-8+8],eax
- cmp al,ah
- jne labeled_registers_ok
- shr eax,16
- add al,ah
- jo labeled_registers_ok
- xor ah,ah
- mov [edi-8+10],ax
- mov [edi-8+9],ah
- labeled_registers_ok:
- mov eax,[ebx+20]
- mov [edi-8+16],eax
- add edi,0Ch
- mov al,[ebx+10]
- or al,al
- jz calculation_loop
- test [operand_flags],1
- jnz calculation_loop
- check_size:
- xchg [operand_size],al
- or al,al
- jz calculation_loop
- cmp al,[operand_size]
- jne operand_sizes_do_not_match
- jmp calculation_loop
- actual_file_offset_label:
- mov eax,[undefined_data_end]
- mov ebp,[addressing_space]
- test byte [ds:ebp+0Ah],1
- jnz use_undefined_data_offset
- cmp eax,[current_offset]
- jne use_current_offset
- use_undefined_data_offset:
- mov eax,[undefined_data_start]
- jmp make_file_offset_label
- current_file_offset_label:
- mov ebp,[addressing_space]
- test byte [ds:ebp+0Ah],1
- jz use_current_offset
- mov eax,[undefined_data_end]
- jmp make_file_offset_label
- use_current_offset:
- mov eax,[current_offset]
- make_file_offset_label:
- cmp [output_format],2
- jae invalid_use_of_symbol
- sub eax,[code_start]
- jmp make_dword_label_value
- current_offset_label:
- mov eax,[current_offset]
- make_current_offset_label:
- xor edx,edx
- xor ch,ch
- 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:
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- mov eax,[ds:ebp+10h]
- stos dword [edi]
- mov cl,[ds:ebp+9]
- mov [edi-12+12],cx
- mov eax,[ds:ebp+14h]
- mov [edi-12+16],eax
- add edi,8
- jmp calculation_loop
- org_origin_label:
- mov eax,[addressing_space]
- mov eax,[eax+18h]
- jmp make_current_offset_label
- counter_label:
- mov eax,[counter]
- make_dword_label_value:
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- add edi,0Ch
- jmp calculation_loop
- timestamp_label:
- call make_timestamp
- make_qword_label_value:
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- add edi,0Ch
- jmp calculation_loop
- predefined_label:
- or eax,eax
- jz current_offset_label
- cmp eax,1
- je counter_label
- cmp eax,2
- je timestamp_label
- cmp eax,3
- je org_origin_label
- cmp eax,4
- je current_file_offset_label
- cmp eax,5
- je actual_file_offset_label
- mov edx,invalid_value
- jmp error_undefined
- label_out_of_scope:
- mov edx,symbol_out_of_scope
- jmp error_undefined
- label_undefined:
- mov edx,undefined_symbol
- error_undefined:
- cmp [current_pass],1
- ja undefined_value
- force_next_pass:
- or [next_pass_needed],-1
- undefined_value:
- or [value_undefined],-1
- and word [edi+12],0
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- add edi,0Ch
- cmp [error_line],0
- jne calculation_loop
- mov eax,[current_line]
- mov [error_line],eax
- mov [error],edx
- mov [error_info],ebx
- jmp calculation_loop
- calculate_add:
- 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 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 [ebx+12],ah
- mov eax,[edi]
- add [ebx],eax
- mov eax,[edi+4]
- adc [ebx+4],eax
- mov al,[edi+13]
- adc [ebx+13],al
- jp add_sign_ok
- call recoverable_overflow
- add_sign_ok:
- or dx,dx
- jz calculation_loop
- push esi
- mov esi,ebx
- mov cl,[edi+10]
- mov al,[edi+8]
- call add_register
- mov cl,[edi+11]
- mov al,[edi+9]
- call add_register
- pop esi
- jmp calculation_loop
- add_register:
- or al,al
- jz add_register_done
- add_register_start:
- cmp [esi+8],al
- jne add_in_second_slot
- 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],al
- jne create_in_first_slot
- add [esi+11],cl
- jo value_out_of_range
- jnz add_register_done
- mov byte [esi+9],0
- ret
- create_in_first_slot:
- cmp byte [esi+8],0
- jne create_in_second_slot
- mov [esi+8],al
- mov [esi+10],cl
- ret
- create_in_second_slot:
- cmp byte [esi+9],0
- jne invalid_expression
- mov [esi+9],al
- mov [esi+11],cl
- add_register_done:
- ret
- out_of_range:
- jmp calculation_loop
- calculate_sub:
- xor ah,ah
- mov ah,[ebx+12]
- 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
- mov ecx,[edi+16]
- cmp ecx,[ebx+16]
- 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]
- sub [ebx],eax
- mov eax,[edi+4]
- sbb [ebx+4],eax
- mov al,[edi+13]
- sbb [ebx+13],al
- jp sub_sign_ok
- cmp [error_line],0
- jne sub_sign_ok
- call recoverable_overflow
- sub_sign_ok:
- or dx,dx
- jz calculation_loop
- push esi
- mov esi,ebx
- mov cl,[edi+10]
- mov al,[edi+8]
- call sub_register
- mov cl,[edi+11]
- mov al,[edi+9]
- call sub_register
- pop esi
- jmp calculation_loop
- sub_register:
- or al,al
- jz add_register_done
- neg cl
- jo value_out_of_range
- jmp add_register_start
- calculate_mul:
- or dx,dx
- jz mul_start
- cmp word [ebx+8],0
- jne mul_start
- xor ecx,ecx
- swap_values:
- mov eax,[ebx+ecx]
- xchg eax,[edi+ecx]
- mov [ebx+ecx],eax
- add ecx,4
- cmp ecx,16
- jb swap_values
- mul_start:
- push esi edx
- mov esi,ebx
- 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
- not edx
- add eax,1
- adc edx,0
- mov [esi],eax
- mov [esi+4],edx
- or eax,edx
- jz mul_overflow
- 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
- not edx
- add eax,1
- adc edx,0
- mov [edi],eax
- mov [edi+4],edx
- or eax,edx
- jz mul_overflow
- mul_second_sign_ok:
- cmp dword [esi+4],0
- jz mul_numbers
- cmp dword [edi+4],0
- jz mul_numbers
- jnz mul_overflow
- mul_numbers:
- mov eax,[esi+4]
- mul dword [edi]
- or edx,edx
- jnz mul_overflow
- mov ecx,eax
- mov eax,[esi]
- mul dword [edi+4]
- or edx,edx
- jnz mul_overflow
- add ecx,eax
- jc mul_overflow
- mov eax,[esi]
- mul dword [edi]
- add edx,ecx
- jc mul_overflow
- mov [esi],eax
- mov [esi+4],edx
- or bl,bl
- jz mul_ok
- not eax
- not edx
- add eax,1
- adc edx,0
- mov [esi],eax
- mov [esi+4],edx
- or eax,edx
- jnz mul_ok
- not bl
- mul_ok:
- mov [esi+13],bl
- pop edx
- or dx,dx
- jz mul_calculated
- cmp word [edi+8],0
- jne invalid_value
- cmp byte [esi+8],0
- je mul_first_register_ok
- call get_byte_scale
- imul byte [esi+10]
- mov dl,ah
- cbw
- cmp ah,dl
- jne value_out_of_range
- mov [esi+10],al
- or al,al
- jnz mul_first_register_ok
- mov [esi+8],al
- mul_first_register_ok:
- cmp byte [esi+9],0
- je mul_calculated
- call get_byte_scale
- imul byte [esi+11]
- mov dl,ah
- cbw
- cmp ah,dl
- jne value_out_of_range
- mov [esi+11],al
- or al,al
- jnz mul_calculated
- mov [esi+9],al
- mul_calculated:
- pop esi
- jmp calculation_loop
- mul_overflow:
- pop edx esi
- call recoverable_overflow
- jmp calculation_loop
- get_byte_scale:
- mov al,[edi]
- cbw
- cwde
- cdq
- cmp edx,[edi+4]
- jne value_out_of_range
- cmp eax,[edi]
- jne value_out_of_range
- ret
- calculate_div:
- push esi edx
- mov esi,ebx
- call div_64
- pop edx
- or dx,dx
- jz div_calculated
- cmp byte [esi+8],0
- je div_first_register_ok
- call get_byte_scale
- or al,al
- jz value_out_of_range
- mov al,[esi+10]
- cbw
- idiv byte [edi]
- or ah,ah
- jnz invalid_use_of_symbol
- mov [esi+10],al
- div_first_register_ok:
- cmp byte [esi+9],0
- je div_calculated
- call get_byte_scale
- or al,al
- jz value_out_of_range
- mov al,[esi+11]
- cbw
- idiv byte [edi]
- or ah,ah
- jnz invalid_use_of_symbol
- mov [esi+11],al
- div_calculated:
- pop esi
- jmp calculation_loop
- calculate_mod:
- push esi
- mov esi,ebx
- call div_64
- mov [esi],eax
- mov [esi+4],edx
- mov [esi+13],bh
- pop esi
- jmp calculation_loop
- calculate_and:
- mov eax,[edi]
- mov edx,[edi+4]
- mov cl,[edi+13]
- and [ebx],eax
- and [ebx+4],edx
- and [ebx+13],cl
- jmp calculation_loop
- calculate_or:
- mov eax,[edi]
- mov edx,[edi+4]
- mov cl,[edi+13]
- or [ebx],eax
- or [ebx+4],edx
- or [ebx+13],cl
- jmp calculation_loop
- calculate_xor:
- mov eax,[edi]
- mov edx,[edi+4]
- mov cl,[edi+13]
- xor [ebx],eax
- xor [ebx+4],edx
- xor [ebx+13],cl
- jmp calculation_loop
- shr_negative:
- mov byte [edi+13],0
- not dword [edi]
- not dword [edi+4]
- add dword [edi],1
- adc dword [edi+4],0
- jc shl_over
- calculate_shl:
- cmp byte [edi+13],0
- jne shl_negative
- mov edx,[ebx+4]
- mov eax,[ebx]
- cmp dword [edi+4],0
- jne shl_over
- movsx ecx,byte [ebx+13]
- xchg ecx,[edi]
- cmp ecx,64
- je shl_max
- ja shl_over
- cmp ecx,32
- jae shl_high
- shld [edi],edx,cl
- shld edx,eax,cl
- shl eax,cl
- mov [ebx],eax
- mov [ebx+4],edx
- jmp shl_done
- shl_over:
- cmp byte [ebx+13],0
- jne shl_overflow
- shl_max:
- movsx ecx,byte [ebx+13]
- cmp eax,ecx
- jne shl_overflow
- cmp edx,ecx
- jne shl_overflow
- xor eax,eax
- mov [ebx],eax
- mov [ebx+4],eax
- jmp calculation_loop
- shl_high:
- sub cl,32
- shld [edi],edx,cl
- shld edx,eax,cl
- shl eax,cl
- mov [ebx+4],eax
- and dword [ebx],0
- cmp edx,[edi]
- jne shl_overflow
- shl_done:
- movsx eax,byte [ebx+13]
- cmp eax,[edi]
- je calculation_loop
- shl_overflow:
- call recoverable_overflow
- jmp calculation_loop
- shl_negative:
- mov byte [edi+13],0
- not dword [edi]
- not dword [edi+4]
- add dword [edi],1
- adc dword [edi+4],0
- jnc calculate_shr
- dec dword [edi+4]
- calculate_shr:
- cmp byte [edi+13],0
- jne shr_negative
- mov edx,[ebx+4]
- mov eax,[ebx]
- cmp dword [edi+4],0
- jne shr_over
- mov ecx,[edi]
- cmp ecx,64
- jae shr_over
- push esi
- movsx esi,byte [ebx+13]
- cmp ecx,32
- jae shr_high
- shrd eax,edx,cl
- shrd edx,esi,cl
- mov [ebx],eax
- mov [ebx+4],edx
- pop esi
- jmp calculation_loop
- shr_high:
- sub cl,32
- shrd edx,esi,cl
- mov [ebx],edx
- mov [ebx+4],esi
- pop esi
- jmp calculation_loop
- shr_over:
- movsx eax,byte [ebx+13]
- mov dword [ebx],eax
- mov dword [ebx+4],eax
- jmp calculation_loop
- calculate_not:
- cmp word [edi+8],0
- jne invalid_expression
- cmp byte [edi+12],0
- je not_ok
- call recoverable_misuse
- not_ok:
- not dword [edi]
- not dword [edi+4]
- not byte [edi+13]
- add edi,14h
- jmp calculation_loop
- calculate_bsf:
- cmp word [edi+8],0
- jne invalid_expression
- cmp byte [edi+12],0
- je bsf_ok
- call recoverable_misuse
- bsf_ok:
- xor ecx,ecx
- bsf eax,[edi]
- jnz finish_bs
- mov ecx,32
- bsf eax,[edi+4]
- jnz finish_bs
- cmp byte [edi+13],0
- jne finish_bs
- bs_overflow:
- call recoverable_overflow
- add edi,14h
- jmp calculation_loop
- calculate_bsr:
- cmp word [edi+8],0
- jne invalid_expression
- cmp byte [edi+12],0
- je bsr_ok
- call recoverable_misuse
- bsr_ok:
- cmp byte [edi+13],0
- jne bs_overflow
- mov ecx,32
- bsr eax,[edi+4]
- jnz finish_bs
- xor ecx,ecx
- bsr eax,[edi]
- jz bs_overflow
- finish_bs:
- add eax,ecx
- xor edx,edx
- mov [edi],eax
- mov [edi+4],edx
- mov [edi+13],dl
- add edi,14h
- jmp calculation_loop
- calculate_neg:
- 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
- xchg eax,[edi]
- xchg edx,[edi+4]
- xchg cl,[edi+13]
- sub [edi],eax
- sbb [edi+4],edx
- sbb [edi+13],cl
- jp neg_sign_ok
- call recoverable_overflow
- neg_sign_ok:
- add edi,14h
- jmp calculation_loop
- calculate_rva:
- cmp word [edi+8],0
- jne invalid_expression
- mov al,[output_format]
- cmp al,5
- je calculate_gotoff
- cmp al,4
- je calculate_coff_rva
- cmp al,3
- jne invalid_expression
- test [format_flags],8
- jnz pe64_rva
- mov al,2
- bt [resolver_flags],0
- jc rva_type_ok
- xor al,al
- rva_type_ok:
- cmp byte [edi+12],al
- je rva_ok
- call recoverable_misuse
- rva_ok:
- mov byte [edi+12],0
- mov eax,[code_start]
- mov eax,[eax+34h]
- xor edx,edx
- finish_rva:
- sub [edi],eax
- sbb [edi+4],edx
- sbb byte [edi+13],0
- jp rva_finished
- call recoverable_overflow
- rva_finished:
- add edi,14h
- jmp calculation_loop
- pe64_rva:
- mov al,4
- bt [resolver_flags],0
- jc pe64_rva_type_ok
- xor al,al
- pe64_rva_type_ok:
- cmp byte [edi+12],al
- je pe64_rva_ok
- call recoverable_misuse
- pe64_rva_ok:
- mov byte [edi+12],0
- mov eax,[code_start]
- mov edx,[eax+34h]
- mov eax,[eax+30h]
- jmp finish_rva
- calculate_gotoff:
- test [format_flags],1
- jnz calculate_elf_dyn_rva
- test [format_flags],8
- jnz invalid_expression
- calculate_coff_rva:
- mov dl,5
- cmp byte [edi+12],2
- je change_value_type
- incorrect_change_of_value_type:
- call recoverable_misuse
- change_value_type:
- mov byte [edi+12],dl
- add edi,14h
- jmp calculation_loop
- calculate_elf_dyn_rva:
- xor dl,dl
- test byte [edi+12],1
- jnz incorrect_change_of_value_type
- jmp change_value_type
- calculate_plt:
- cmp word [edi+8],0
- jne invalid_expression
- cmp [output_format],5
- jne invalid_expression
- test [format_flags],1
- jnz invalid_expression
- mov dl,6
- mov dh,2
- test [format_flags],8
- jz check_value_for_plt
- mov dh,4
- check_value_for_plt:
- mov eax,[edi]
- or eax,[edi+4]
- jnz incorrect_change_of_value_type
- cmp byte [edi+12],dh
- jne incorrect_change_of_value_type
- mov eax,[edi+16]
- cmp byte [eax],80h
- jne incorrect_change_of_value_type
- jmp change_value_type
- div_64:
- xor ebx,ebx
- cmp dword [edi],0
- jne divider_ok
- cmp dword [edi+4],0
- jne divider_ok
- cmp [next_pass_needed],0
- je value_out_of_range
- jmp div_done
- divider_ok:
- cmp byte [esi+13],0
- je div_first_sign_ok
- mov eax,[esi]
- mov edx,[esi+4]
- not eax
- not edx
- add eax,1
- adc edx,0
- mov [esi],eax
- mov [esi+4],edx
- or eax,edx
- jz value_out_of_range
- xor bx,-1
- div_first_sign_ok:
- cmp byte [edi+13],0
- je div_second_sign_ok
- mov eax,[edi]
- mov edx,[edi+4]
- not eax
- not edx
- add eax,1
- adc edx,0
- mov [edi],eax
- mov [edi+4],edx
- or eax,edx
- jz value_out_of_range
- xor bl,-1
- div_second_sign_ok:
- cmp dword [edi+4],0
- jne div_high
- mov ecx,[edi]
- mov eax,[esi+4]
- xor edx,edx
- div ecx
- mov [esi+4],eax
- mov eax,[esi]
- div ecx
- mov [esi],eax
- mov eax,edx
- xor edx,edx
- jmp div_done
- div_high:
- push ebx
- mov eax,[esi+4]
- xor edx,edx
- div dword [edi+4]
- mov ebx,[esi]
- mov [esi],eax
- and dword [esi+4],0
- mov ecx,edx
- mul dword [edi]
- div_high_loop:
- cmp ecx,edx
- ja div_high_done
- jb div_high_large_correction
- cmp ebx,eax
- jae div_high_done
- div_high_correction:
- dec dword [esi]
- sub eax,[edi]
- sbb edx,[edi+4]
- jnc div_high_loop
- div_high_done:
- sub ebx,eax
- sbb ecx,edx
- mov edx,ecx
- mov eax,ebx
- pop ebx
- jmp div_done
- div_high_large_correction:
- push eax edx
- mov eax,edx
- sub eax,ecx
- xor edx,edx
- div dword [edi+4]
- shr eax,1
- jz div_high_small_correction
- sub [esi],eax
- push eax
- mul dword [edi+4]
- sub dword [esp+4],eax
- pop eax
- mul dword [edi]
- sub dword [esp+4],eax
- sbb dword [esp],edx
- pop edx eax
- jmp div_high_loop
- div_high_small_correction:
- pop edx eax
- jmp div_high_correction
- div_done:
- or bh,bh
- jz remainder_ok
- not eax
- not edx
- add eax,1
- adc edx,0
- mov ecx,eax
- or ecx,edx
- jnz remainder_ok
- not bh
- remainder_ok:
- or bl,bl
- jz div_ok
- not dword [esi]
- not dword [esi+4]
- add dword [esi],1
- adc dword [esi+4],0
- mov ecx,[esi]
- or ecx,[esi+4]
- jnz div_ok
- not bl
- div_ok:
- mov [esi+13],bl
- ret
- store_label_reference:
- cmp [symbols_file],0
- je label_reference_ok
- cmp [next_pass_needed],0
- jne label_reference_ok
- 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 [tagged_blocks],eax
- mov [eax],ebx
- label_reference_ok:
- ret
- convert_fp:
- inc esi
- and word [edi+8],0
- and word [edi+12],0
- mov al,[value_size]
- cmp al,2
- je convert_fp_word
- cmp al,4
- je convert_fp_dword
- test al,not 8
- jz convert_fp_qword
- call recoverable_misuse
- convert_fp_qword:
- xor eax,eax
- xor edx,edx
- cmp word [esi+8],8000h
- je fp_qword_store
- mov bx,[esi+8]
- mov eax,[esi]
- mov edx,[esi+4]
- add eax,eax
- adc edx,edx
- mov ecx,edx
- shr edx,12
- shrd eax,ecx,12
- jnc fp_qword_ok
- add eax,1
- adc edx,0
- bt edx,20
- jnc fp_qword_ok
- and edx,1 shl 20 - 1
- inc bx
- shr edx,1
- rcr eax,1
- fp_qword_ok:
- add bx,3FFh
- cmp bx,7FFh
- jge value_out_of_range
- cmp bx,0
- jg fp_qword_exp_ok
- or edx,1 shl 20
- mov cx,bx
- neg cx
- inc cx
- cmp cx,52+1
- ja value_out_of_range
- cmp cx,32
- jb fp_qword_small_shift
- sub cx,32
- mov eax,edx
- xor edx,edx
- shr eax,cl
- jmp fp_qword_shift_done
- fp_qword_small_shift:
- mov ebx,edx
- shr edx,cl
- shrd eax,ebx,cl
- fp_qword_shift_done:
- mov bx,0
- jnc fp_qword_exp_ok
- add eax,1
- adc edx,0
- test edx,1 shl 20
- jz fp_qword_exp_ok
- and edx,1 shl 20 - 1
- inc bx
- fp_qword_exp_ok:
- shl ebx,20
- or edx,ebx
- jnz fp_qword_store
- or eax,eax
- jz value_out_of_range
- fp_qword_store:
- mov bl,[esi+11]
- shl ebx,31
- or edx,ebx
- mov [edi],eax
- mov [edi+4],edx
- add esi,13
- ret
- convert_fp_word:
- xor eax,eax
- cmp word [esi+8],8000h
- je fp_word_store
- mov bx,[esi+8]
- mov ax,[esi+6]
- shl ax,1
- shr ax,6
- jnc fp_word_ok
- inc ax
- bt ax,10
- jnc fp_word_ok
- and ax,1 shl 10 - 1
- inc bx
- shr ax,1
- fp_word_ok:
- add bx,0Fh
- cmp bx,01Fh
- jge value_out_of_range
- cmp bx,0
- jg fp_word_exp_ok
- or ax,1 shl 10
- mov cx,bx
- neg cx
- inc cx
- cmp cx,10+1
- ja value_out_of_range
- xor bx,bx
- shr ax,cl
- jnc fp_word_exp_ok
- inc ax
- test ax,1 shl 10
- jz fp_word_exp_ok
- and ax,1 shl 10 - 1
- inc bx
- fp_word_exp_ok:
- shl bx,10
- or ax,bx
- jz value_out_of_range
- fp_word_store:
- mov bl,[esi+11]
- shl bx,15
- or ax,bx
- mov [edi],eax
- xor eax,eax
- mov [edi+4],eax
- add esi,13
- ret
- convert_fp_dword:
- xor eax,eax
- cmp word [esi+8],8000h
- je fp_dword_store
- mov bx,[esi+8]
- mov eax,[esi+4]
- shl eax,1
- shr eax,9
- jnc fp_dword_ok
- inc eax
- bt eax,23
- jnc fp_dword_ok
- and eax,1 shl 23 - 1
- inc bx
- shr eax,1
- fp_dword_ok:
- add bx,7Fh
- cmp bx,0FFh
- jge value_out_of_range
- cmp bx,0
- jg fp_dword_exp_ok
- or eax,1 shl 23
- mov cx,bx
- neg cx
- inc cx
- cmp cx,23+1
- ja value_out_of_range
- xor bx,bx
- shr eax,cl
- jnc fp_dword_exp_ok
- inc eax
- test eax,1 shl 23
- jz fp_dword_exp_ok
- and eax,1 shl 23 - 1
- inc bx
- fp_dword_exp_ok:
- shl ebx,23
- or eax,ebx
- jz value_out_of_range
- fp_dword_store:
- mov bl,[esi+11]
- shl ebx,31
- or eax,ebx
- mov [edi],eax
- xor eax,eax
- mov [edi+4],eax
- add esi,13
- ret
- get_string_value:
- inc esi
- lods dword [esi]
- mov ecx,eax
- cmp ecx,8
- ja value_out_of_range
- mov edx,edi
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov edi,edx
- rep movs byte [edi],[esi]
- mov edi,edx
- inc esi
- and word [edi+8],0
- and word [edi+12],0
- ret
-
-get_byte_value:
- mov [value_size],1
- or [operand_flags],1
- call calculate_value
- or al,al
- jz check_byte_value
- call recoverable_misuse
- check_byte_value:
- mov eax,[edi]
- mov edx,[edi+4]
- cmp byte [edi+13],0
- je byte_positive
- cmp edx,-1
- jne range_exceeded
- cmp eax,-100h
- jb range_exceeded
- ret
- byte_positive:
- test edx,edx
- jnz range_exceeded
- cmp eax,100h
- jae range_exceeded
- return_byte_value:
- ret
- range_exceeded:
- xor eax,eax
- xor edx,edx
- recoverable_overflow:
- cmp [error_line],0
- jne ignore_overflow
- push [current_line]
- pop [error_line]
- mov [error],value_out_of_range
- or [value_undefined],-1
- ignore_overflow:
- ret
- recoverable_misuse:
- cmp [error_line],0
- jne ignore_misuse
- push [current_line]
- pop [error_line]
- mov [error],invalid_use_of_symbol
- ignore_misuse:
- ret
-get_word_value:
- mov [value_size],2
- or [operand_flags],1
- call calculate_value
- cmp al,2
- jb check_word_value
- call recoverable_misuse
- check_word_value:
- mov eax,[edi]
- mov edx,[edi+4]
- cmp byte [edi+13],0
- je word_positive
- cmp edx,-1
- jne range_exceeded
- cmp eax,-10000h
- jb range_exceeded
- ret
- word_positive:
- test edx,edx
- jnz range_exceeded
- cmp eax,10000h
- jae range_exceeded
- ret
-get_dword_value:
- mov [value_size],4
- or [operand_flags],1
- call calculate_value
- cmp al,4
- jne check_dword_value
- mov [value_type],2
- mov eax,[edi]
- cdq
- cmp edx,[edi+4]
- jne range_exceeded
- mov ecx,edx
- sar ecx,31
- cmp cl,[value_sign]
- jne range_exceeded
- ret
- check_dword_value:
- mov eax,[edi]
- mov edx,[edi+4]
- cmp byte [edi+13],0
- je dword_positive
- cmp edx,-1
- jne range_exceeded
- ret
- dword_positive:
- test edx,edx
- jne range_exceeded
- ret
-get_pword_value:
- mov [value_size],6
- or [operand_flags],1
- call calculate_value
- cmp al,4
- jne check_pword_value
- call recoverable_misuse
- check_pword_value:
- mov eax,[edi]
- mov edx,[edi+4]
- cmp byte [edi+13],0
- je pword_positive
- cmp edx,-10000h
- jb range_exceeded
- ret
- pword_positive:
- cmp edx,10000h
- jae range_exceeded
- ret
-get_qword_value:
- mov [value_size],8
- or [operand_flags],1
- call calculate_value
- check_qword_value:
- mov eax,[edi]
- mov edx,[edi+4]
- ret
-get_count_value:
- mov [value_size],8
- or [operand_flags],1
- call calculate_expression
- cmp word [edi+8],0
- jne invalid_value
- mov [value_sign],0
- mov al,[edi+12]
- or al,al
- jz check_count_value
- call recoverable_misuse
- check_count_value:
- cmp byte [edi+13],0
- jne invalid_count_value
- mov eax,[edi]
- mov edx,[edi+4]
- or edx,edx
- jnz invalid_count_value
- ret
- invalid_count_value:
- cmp [error_line],0
- jne zero_count
- mov eax,[current_line]
- mov [error_line],eax
- mov [error],invalid_value
- zero_count:
- xor eax,eax
- ret
-get_value:
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- jne invalid_value
- mov al,[operand_size]
- cmp al,1
- je value_byte
- cmp al,2
- je value_word
- cmp al,4
- je value_dword
- cmp al,6
- je value_pword
- cmp al,8
- je value_qword
- or al,al
- jnz invalid_value
- mov [value_size],al
- call calculate_value
- mov eax,[edi]
- mov edx,[edi+4]
- ret
- calculate_value:
- call calculate_expression
- cmp word [edi+8],0
- jne invalid_value
- mov eax,[edi+16]
- mov [symbol_identifier],eax
- mov al,[edi+13]
- mov [value_sign],al
- mov al,[edi+12]
- mov [value_type],al
- ret
- value_qword:
- call get_qword_value
- truncated_value:
- mov [value_sign],0
- ret
- value_pword:
- call get_pword_value
- movzx edx,dx
- jmp truncated_value
- value_dword:
- call get_dword_value
- xor edx,edx
- jmp truncated_value
- value_word:
- call get_word_value
- xor edx,edx
- movzx eax,ax
- jmp truncated_value
- value_byte:
- call get_byte_value
- xor edx,edx
- movzx eax,al
- jmp truncated_value
-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
- call calculate_expression
- mov eax,[edi+16]
- mov [address_symbol],eax
- mov al,[edi+13]
- 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_address_type
- test al,1
- 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:
- mov ah,[address_size]
- or [address_size],al
- shr al,4
- or ah,ah
- jz address_size_ok
- cmp al,ah
- je address_size_ok
- cmp ax,0408h
- je address_sizes_mixed
- cmp ax,0804h
- jne address_sizes_do_not_agree
- address_sizes_mixed:
- cmp [value_type],4
- jne address_sizes_mixed_type_ok
- mov [value_type],2
- address_sizes_mixed_type_ok:
- mov eax,[edi]
- cdq
- cmp edx,[edi+4]
- je address_size_ok
- cmp [error_line],0
- jne address_size_ok
- call recoverable_overflow
- address_size_ok:
- xor ebx,ebx
- xor ecx,ecx
- mov cl,[value_type]
- shl ecx,16
- mov ch,[address_size]
- cmp word [edi+8],0
- je check_immediate_address
- mov al,[edi+8]
- mov dl,[edi+10]
- call get_address_register
- mov al,[edi+9]
- mov dl,[edi+11]
- call get_address_register
- mov ax,bx
- shr ah,4
- shr al,4
- or bh,bh
- jz check_address_registers
- or bl,bl
- jz check_address_registers
- cmp al,ah
- jne check_vsib
- check_address_registers:
- or al,ah
- cmp al,0Ch
- jae check_vsib
- cmp al,6
- je check_vsib
- cmp al,7
- je check_vsib
- mov ah,[address_size]
- and ah,0Fh
- jz address_registers_sizes_ok
- cmp al,ah
- jne invalid_address
- address_registers_sizes_ok:
- cmp al,4
- je sib_allowed
- cmp al,8
- je sib_allowed
- cmp al,9
- je check_ip_relative_address
- cmp cl,1
- 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
- mov al,bh
- and al,0Fh
- cmp al,ah
- jne invalid_address
- check_ip_relative_address:
- or bl,bl
- jnz invalid_address
- cmp bh,98h
- je check_rip_relative_address
- cmp bh,94h
- jne invalid_address
- cmp [free_address_range],0
- je check_dword_value
- mov eax,[edi]
- mov edx,[edi+4]
- ret
- check_rip_relative_address:
- mov eax,[edi]
- cdq
- cmp edx,[edi+4]
- jne range_exceeded
- cmp dl,[edi+13]
- jne range_exceeded
- ret
- get_address_register:
- or al,al
- jz address_register_ok
- cmp dl,1
- jne scaled_register
- or bh,bh
- jnz scaled_register
- mov bh,al
- address_register_ok:
- ret
- scaled_register:
- or bl,bl
- jnz invalid_address
- mov bl,al
- mov cl,dl
- jmp address_register_ok
- sib_allowed:
- or bh,bh
- jnz check_index_with_base
- cmp cl,3
- je special_index_scale
- cmp cl,5
- je special_index_scale
- cmp cl,9
- je special_index_scale
- cmp cl,2
- jne check_index_scale
- cmp bl,45h
- jne special_index_scale
- cmp [code_type],64
- je special_index_scale
- cmp [segment_register],4
- jne special_index_scale
- cmp [value_type],0
- jne check_index_scale
- mov al,[edi]
- cbw
- cwde
- cmp eax,[edi]
- jne check_index_scale
- cdq
- cmp edx,[edi+4]
- jne check_immediate_address
- special_index_scale:
- 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
- je check_word_value
- cmp al,4
- je check_dword_value
- cmp al,8
- je check_qword_value
- or al,al
- jnz invalid_value
- cmp [code_type],64
- jne check_dword_value
- jmp check_qword_value
- check_index_with_base:
- cmp cl,1
- jne check_index_scale
- cmp bl,44h
- je swap_base_with_index
- cmp bl,84h
- je swap_base_with_index
- cmp [code_type],64
- je check_for_rbp_base
- cmp bl,45h
- jne check_for_ebp_base
- cmp [segment_register],3
- je swap_base_with_index
- jmp check_immediate_address
- check_for_ebp_base:
- cmp bh,45h
- jne check_immediate_address
- cmp [segment_register],4
- jne check_immediate_address
- swap_base_with_index:
- xchg bl,bh
- jmp check_immediate_address
- check_for_rbp_base:
- cmp bh,45h
- je swap_base_with_index
- cmp bh,85h
- je swap_base_with_index
- jmp check_immediate_address
- check_index_scale:
- test cl,not 1111b
- jnz invalid_address
- mov al,cl
- dec al
- and al,cl
- jz check_immediate_address
- jmp invalid_address
- check_vsib:
- xor ah,ah
- check_vsib_base:
- test bh,bh
- jz check_vsib_index
- mov al,bh
- shr al,4
- cmp al,4
- je check_vsib_base_size
- cmp [code_type],64
- jne swap_vsib_registers
- cmp al,8
- jne swap_vsib_registers
- check_vsib_base_size:
- mov ah,[address_size]
- and ah,0Fh
- jz check_vsib_index
- cmp al,ah
- jne invalid_address
- check_vsib_index:
- mov al,bl
- and al,0E0h
- cmp al,0C0h
- jae check_index_scale
- cmp al,60h
- je check_index_scale
- jmp invalid_address
- swap_vsib_registers:
- xor ah,-1
- jz invalid_address
- cmp cl,1
- ja invalid_address
- xchg bl,bh
- mov cl,1
- jmp check_vsib_base
-
-calculate_relative_offset:
- cmp [value_undefined],0
- jne relative_offset_ok
- test bh,bh
- setne ch
- cmp bx,[ds:ebp+10h]
- je origin_registers_ok
- xchg bh,bl
- xchg ch,cl
- cmp bx,[ds:ebp+10h]
- jne invalid_value
- origin_registers_ok:
- cmp cx,[ds:ebp+10h+2]
- jne invalid_value
- mov bl,[address_sign]
- add eax,[ds:ebp]
- adc edx,[ds:ebp+4]
- adc bl,[ds:ebp+8]
- sub eax,edi
- sbb edx,0
- sbb bl,0
- mov [value_sign],bl
- mov bl,[value_type]
- mov ecx,[address_symbol]
- mov [symbol_identifier],ecx
- test bl,1
- jnz relative_offset_unallowed
- cmp bl,6
- je plt_relative_offset
- mov bh,[ds:ebp+9]
- cmp bl,bh
- je set_relative_offset_type
- cmp bx,0402h
- je set_relative_offset_type
- relative_offset_unallowed:
- call recoverable_misuse
- set_relative_offset_type:
- cmp [value_type],0
- je relative_offset_ok
- mov [value_type],0
- cmp ecx,[ds:ebp+14h]
- je relative_offset_ok
- mov [value_type],3
- relative_offset_ok:
- ret
- plt_relative_offset:
- mov [value_type],7
- cmp byte [ds:ebp+9],2
- je relative_offset_ok
- cmp byte [ds:ebp+9],4
- jne recoverable_misuse
- ret
-
-calculate_logical_expression:
- xor al,al
- calculate_embedded_logical_expression:
- mov [logical_value_wrapping],al
- call get_logical_value
- logical_loop:
- cmp byte [esi],'|'
- je logical_or
- cmp byte [esi],'&'
- je logical_and
- ret
- logical_or:
- inc esi
- or al,al
- jnz logical_value_already_determined
- push eax
- call get_logical_value
- pop ebx
- or al,bl
- jmp logical_loop
- logical_and:
- inc esi
- or al,al
- jz logical_value_already_determined
- push eax
- call get_logical_value
- pop ebx
- and al,bl
- jmp logical_loop
- logical_value_already_determined:
- push eax
- call skip_logical_value
- jc invalid_expression
- pop eax
- jmp logical_loop
- get_value_for_comparison:
- mov [value_size],8
- or [operand_flags],1
- lods byte [esi]
- call calculate_expression
- cmp byte [edi+8],0
- jne first_register_size_ok
- mov byte [edi+10],0
- first_register_size_ok:
- cmp byte [edi+9],0
- jne second_register_size_ok
- mov byte [edi+11],0
- second_register_size_ok:
- mov eax,[edi+16]
- mov [symbol_identifier],eax
- mov al,[edi+13]
- mov [value_sign],al
- mov bl,[edi+12]
- mov eax,[edi]
- mov edx,[edi+4]
- mov ecx,[edi+8]
- ret
- get_logical_value:
- xor al,al
- check_for_negation:
- cmp byte [esi],'~'
- jne negation_ok
- inc esi
- xor al,-1
- jmp check_for_negation
- negation_ok:
- push eax
- mov al,[esi]
- cmp al,91h
- je logical_expression
- cmp al,0FFh
- je invalid_expression
- cmp al,88h
- je check_for_defined
- cmp al,8Ah
- je check_for_earlier_defined
- cmp al,89h
- je check_for_used
- cmp al,'0'
- 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
- push [symbol_identifier]
- push ebx ecx
- mov al,[esi]
- or al,al
- jz logical_number
- cmp al,0Fh
- je logical_number
- cmp al,92h
- je logical_number
- cmp al,'&'
- je logical_number
- cmp al,'|'
- 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
- or bl,bl
- jz check_values_registers
- mov ebx,[symbol_identifier]
- cmp ebx,[esp+8]
- jne values_not_relative
- check_values_registers:
- cmp ecx,[esp]
- je values_relative
- ror ecx,16
- xchg ch,cl
- ror ecx,16
- xchg ch,cl
- cmp ecx,[esp]
- je values_relative
- values_not_relative:
- cmp [compare_type],0F8h
- jne invalid_comparison
- add esp,12+8
- jmp return_false
- invalid_comparison:
- call recoverable_misuse
- values_relative:
- pop ebx
- shl ebx,16
- mov bx,[esp]
- add esp,8
- pop ecx ebp
- cmp [compare_type],'='
- je check_equal
- cmp [compare_type],0F1h
- je check_not_equal
- cmp [compare_type],0F8h
- je return_true
- test ebx,0FFFF0000h
- jz check_less_or_greater
- call recoverable_misuse
- check_less_or_greater:
- cmp [compare_type],'>'
- je check_greater
- cmp [compare_type],'<'
- je check_less
- cmp [compare_type],0F2h
- je check_not_less
- cmp [compare_type],0F3h
- je check_not_greater
- jmp invalid_expression
- check_equal:
- cmp bh,[value_sign]
- jne return_false
- cmp eax,ebp
- jne return_false
- cmp edx,ecx
- jne return_false
- jmp return_true
- check_greater:
- cmp bh,[value_sign]
- jg return_true
- jl return_false
- cmp edx,ecx
- jb return_true
- ja return_false
- cmp eax,ebp
- jb return_true
- jae return_false
- check_less:
- cmp bh,[value_sign]
- jg return_false
- jl return_true
- cmp edx,ecx
- jb return_false
- ja return_true
- cmp eax,ebp
- jbe return_false
- ja return_true
- check_not_less:
- cmp bh,[value_sign]
- jg return_true
- jl return_false
- cmp edx,ecx
- jb return_true
- ja return_false
- cmp eax,ebp
- jbe return_true
- ja return_false
- check_not_greater:
- cmp bh,[value_sign]
- jg return_false
- jl return_true
- cmp edx,ecx
- jb return_false
- ja return_true
- cmp eax,ebp
- jb return_false
- jae return_true
- check_not_equal:
- cmp bh,[value_sign]
- jne return_true
- cmp eax,ebp
- jne return_true
- cmp edx,ecx
- jne return_true
- jmp return_false
- logical_number:
- pop ecx ebx eax edx eax
- or bl,bl
- jnz invalid_logical_number
- or cx,cx
- jz logical_number_ok
- invalid_logical_number:
- call recoverable_misuse
- logical_number_ok:
- test bh,bh
- jnz return_true
- or eax,edx
- jnz return_true
- jmp return_false
- check_for_earlier_defined:
- or bh,-1
- jmp check_if_expression_defined
- check_for_defined:
- xor bh,bh
- check_if_expression_defined:
- or bl,-1
- lods word [esi]
- cmp ah,'('
- jne invalid_expression
- check_expression:
- lods byte [esi]
- or al,al
- jz defined_string
- cmp al,'.'
- je defined_fp_value
- cmp al,')'
- je expression_checked
- cmp al,'!'
- je invalid_expression
- cmp al,0Fh
- je check_expression
- cmp al,10h
- je defined_register
- cmp al,11h
- je check_if_symbol_defined
- cmp al,80h
- jae check_expression
- movzx eax,al
- add esi,eax
- jmp check_expression
- defined_register:
- inc esi
- jmp check_expression
- defined_fp_value:
- add esi,12+1
- jmp expression_checked
- defined_string:
- lods dword [esi]
- add esi,eax
- inc esi
- jmp expression_checked
- check_if_symbol_defined:
- lods dword [esi]
- cmp eax,-1
- je invalid_expression
- cmp eax,0Fh
- jb check_expression
- je reserved_word_used_as_symbol
- test bh,bh
- jnz no_prediction
- test byte [eax+8],4
- jnz no_prediction
- test byte [eax+8],1
- jz symbol_predicted_undefined
- mov cx,[current_pass]
- sub cx,[eax+16]
- jz check_expression
- cmp cx,1
- ja symbol_predicted_undefined
- or byte [eax+8],40h+80h
- jmp check_expression
- no_prediction:
- test byte [eax+8],1
- jz symbol_undefined
- mov cx,[current_pass]
- sub cx,[eax+16]
- jz check_expression
- jmp symbol_undefined
- symbol_predicted_undefined:
- or byte [eax+8],40h
- and byte [eax+8],not 80h
- symbol_undefined:
- xor bl,bl
- jmp check_expression
- expression_checked:
- mov al,bl
- jmp logical_value_ok
- check_for_used:
- lods word [esi]
- cmp ah,2
- jne invalid_expression
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- test byte [eax+8],8
- jz not_used
- mov cx,[current_pass]
- sub cx,[eax+18]
- jz return_true
- cmp cx,1
- ja not_used
- or byte [eax+8],10h+20h
- jmp return_true
- not_used:
- or byte [eax+8],10h
- and byte [eax+8],not 20h
- jmp return_false
- given_false:
- inc esi
- return_false:
- xor al,al
- jmp logical_value_ok
- given_true:
- inc esi
- return_true:
- or al,-1
- jmp logical_value_ok
- logical_expression:
- lods byte [esi]
- mov dl,[logical_value_wrapping]
- push edx
- call calculate_embedded_logical_expression
- pop edx
- mov [logical_value_wrapping],dl
- push eax
- lods byte [esi]
- cmp al,92h
- jne invalid_expression
- pop eax
- logical_value_ok:
- pop ebx
- xor al,bl
- ret
-
-skip_symbol:
- lods byte [esi]
- or al,al
- jz nothing_to_skip
- cmp al,0Fh
- je nothing_to_skip
- cmp al,1
- je skip_instruction
- cmp al,2
- 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,'('
- je skip_expression
- cmp al,'['
- je skip_address
- skip_done:
- clc
- ret
- skip_label:
- add esi,2
- skip_instruction:
- add esi,2
- 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
- cmp al,60h
- jb skip_expression
- cmp al,70h
- ja skip_expression
- inc esi
- jmp skip_address
- skip_expression:
- lods byte [esi]
- or al,al
- jz skip_string
- cmp al,'.'
- je skip_fp_value
- cmp al,')'
- je skip_done
- cmp al,']'
- je skip_done
- cmp al,'!'
- je skip_expression
- cmp al,0Fh
- je skip_expression
- cmp al,10h
- je skip_register
- cmp al,11h
- je skip_label_value
- cmp al,80h
- jae skip_expression
- movzx eax,al
- add esi,eax
- jmp skip_expression
- skip_label_value:
- add esi,3
- skip_register:
- inc esi
- jmp skip_expression
- skip_fp_value:
- add esi,12
- jmp skip_done
- skip_string:
- lods dword [esi]
- add esi,eax
- inc esi
- jmp skip_done
- nothing_to_skip:
- dec esi
- stc
- ret
-
-expand_path:
- lods byte [esi]
- cmp al,'%'
- je environment_variable
- stos byte [edi]
- or al,al
- jnz expand_path
- cmp edi,[memory_end]
- ja out_of_memory
- ret
- environment_variable:
- mov ebx,esi
- find_variable_end:
- lods byte [esi]
- or al,al
- jz not_environment_variable
- cmp al,'%'
- jne find_variable_end
- mov byte [esi-1],0
- push esi
- mov esi,ebx
- call get_environment_variable
- pop esi
- mov byte [esi-1],'%'
- jmp expand_path
- not_environment_variable:
- mov al,'%'
- stos byte [edi]
- mov esi,ebx
- jmp expand_path
-get_include_directory:
- lods byte [esi]
- cmp al,';'
- je include_directory_ok
- stos byte [edi]
- or al,al
- jnz get_include_directory
- dec esi
- dec edi
- include_directory_ok:
- cmp byte [edi-1],'/'
- je path_separator_ok
- cmp byte [edi-1],'\'
- je path_separator_ok
- mov al,'/'
- stos byte [edi]
- path_separator_ok:
- ret
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-convert_expression:
- push ebp
- call get_fp_value
- jnc fp_expression
- mov [current_offset],esp
- expression_loop:
- push edi
- mov edi,single_operand_operators
- call get_operator
- pop edi
- or al,al
- jz expression_element
- cmp al,82h
- je expression_loop
- push eax
- jmp expression_loop
- expression_element:
- mov al,[esi]
- cmp al,1Ah
- je expression_number
- cmp al,22h
- je expression_number
- cmp al,'('
- je expression_number
- mov al,'!'
- stos byte [edi]
- jmp expression_operator
- expression_number:
- call convert_number
- expression_operator:
- push edi
- mov edi,operators
- call get_operator
- pop edi
- or al,al
- jz expression_end
- operators_loop:
- cmp esp,[current_offset]
- je push_operator
- mov bl,al
- and bl,0F0h
- mov bh,byte [esp]
- and bh,0F0h
- cmp bl,bh
- ja push_operator
- pop ebx
- mov byte [edi],bl
- inc edi
- jmp operators_loop
- push_operator:
- push eax
- jmp expression_loop
- expression_end:
- cmp esp,[current_offset]
- je expression_converted
- pop eax
- stos byte [edi]
- jmp expression_end
- expression_converted:
- pop ebp
- ret
- fp_expression:
- mov al,'.'
- stos byte [edi]
- mov eax,[fp_value]
- stos dword [edi]
- mov eax,[fp_value+4]
- stos dword [edi]
- mov eax,[fp_value+8]
- stos dword [edi]
- pop ebp
- ret
-
-convert_number:
- lea eax,[edi+20h]
- mov edx,[memory_end]
- cmp [source_start],0
- je check_memory_for_number
- mov edx,[labels_list]
- check_memory_for_number:
- cmp eax,edx
- jae out_of_memory
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- cmp byte [esi],'('
- je expression_value
- inc edi
- call get_number
- jc symbol_value
- or ebp,ebp
- jz valid_number
- mov byte [edi-1],0Fh
- ret
- valid_number:
- cmp dword [edi+4],0
- jne qword_number
- cmp word [edi+2],0
- jne dword_number
- cmp byte [edi+1],0
- jne word_number
- byte_number:
- mov byte [edi-1],1
- inc edi
- ret
- qword_number:
- mov byte [edi-1],8
- add edi,8
- ret
- dword_number:
- mov byte [edi-1],4
- scas dword [edi]
- ret
- word_number:
- mov byte [edi-1],2
- scas word [edi]
- ret
- expression_value:
- inc esi
- push [current_offset]
- call convert_expression
- pop [current_offset]
- lods byte [esi]
- cmp al,')'
- je subexpression_closed
- dec esi
- mov al,'!'
- stosb
- subexpression_closed:
- ret
- symbol_value:
- mov eax,[source_start]
- test eax,eax
- jz preprocessor_value
- cmp eax,-1
- je invalid_value
- push edi esi
- lods word [esi]
- cmp al,1Ah
- jne no_address_register
- movzx ecx,ah
- call get_symbol
- jc no_address_register
- cmp al,10h
- jne no_address_register
- mov al,ah
- shr ah,4
- cmp ah,4
- je register_value
- and ah,not 1
- cmp ah,8
- je register_value
- cmp ah,0Ch
- jae register_value
- cmp ah,6
- je register_value
- cmp al,23h
- je register_value
- cmp al,25h
- je register_value
- cmp al,26h
- je register_value
- cmp al,27h
- je register_value
- no_address_register:
- pop esi
- mov edi,directive_operators
- call get_operator
- pop edi
- or al,al
- jnz broken_value
- lods byte [esi]
- cmp al,1Ah
- jne invalid_value
- lods byte [esi]
- movzx ecx,al
- call get_label_id
- store_label_value:
- mov byte [edi-1],11h
- stos dword [edi]
- ret
- broken_value:
- mov eax,0Fh
- jmp store_label_value
- register_value:
- pop edx edi
- mov byte [edi-1],10h
- stos byte [edi]
- ret
- preprocessor_value:
- dec edi
- lods byte [esi]
- cmp al,1Ah
- jne invalid_value
- lods byte [esi]
- mov cl,al
- mov ch,10b
- call get_preprocessor_symbol
- jc invalid_value
- test edx,edx
- jz special_preprocessor_value
- push esi
- mov esi,[edx+8]
- push [current_offset]
- call convert_expression
- pop [current_offset]
- pop esi
- ret
- special_preprocessor_value:
- cmp eax,preprocessed_line_value
- jne invalid_value
- call get_current_line_from_file
- mov al,4
- stos byte [edi]
- mov eax,[ebx+4]
- stos dword [edi]
- ret
-
-get_number:
- xor ebp,ebp
- lods byte [esi]
- cmp al,22h
- je get_text_number
- cmp al,1Ah
- jne not_number
- lods byte [esi]
- movzx ecx,al
- mov [number_start],esi
- mov al,[esi]
- cmp al,'$'
- je number_begin
- sub al,30h
- cmp al,9
- ja invalid_number
- number_begin:
- mov ebx,esi
- add esi,ecx
- push esi
- dec esi
- mov dword [edi],0
- mov dword [edi+4],0
- cmp byte [ebx],'$'
- je pascal_hex_number
- cmp word [ebx],'0x'
- je get_hex_number
- mov al,[esi]
- dec esi
- cmp al,'h'
- je get_hex_number
- cmp al,'b'
- je get_bin_number
- cmp al,'d'
- je get_dec_number
- cmp al,'o'
- je get_oct_number
- cmp al,'q'
- je get_oct_number
- cmp al,'H'
- je get_hex_number
- cmp al,'B'
- je get_bin_number
- cmp al,'D'
- je get_dec_number
- cmp al,'O'
- je get_oct_number
- cmp al,'Q'
- je get_oct_number
- inc esi
- get_dec_number:
- mov ebx,esi
- mov esi,[number_start]
- get_dec_digit:
- cmp esi,ebx
- ja number_ok
- cmp byte [esi],27h
- je next_dec_digit
- cmp byte [esi],'_'
- je next_dec_digit
- xor edx,edx
- mov eax,[edi]
- shld edx,eax,2
- shl eax,2
- add eax,[edi]
- adc edx,0
- add eax,eax
- adc edx,edx
- mov [edi],eax
- mov eax,[edi+4]
- add eax,eax
- jc dec_out_of_range
- add eax,eax
- jc dec_out_of_range
- add eax,[edi+4]
- jc dec_out_of_range
- add eax,eax
- jc dec_out_of_range
- add eax,edx
- jc dec_out_of_range
- mov [edi+4],eax
- movzx eax,byte [esi]
- sub al,30h
- jc bad_number
- cmp al,9
- ja bad_number
- add [edi],eax
- adc dword [edi+4],0
- jc dec_out_of_range
- next_dec_digit:
- inc esi
- jmp get_dec_digit
- dec_out_of_range:
- cmp esi,ebx
- ja dec_out_of_range_finished
- lods byte [esi]
- cmp al,27h
- je bad_number
- cmp al,'_'
- je bad_number
- sub al,30h
- jc bad_number
- cmp al,9
- ja bad_number
- jmp dec_out_of_range
- dec_out_of_range_finished:
- or ebp,-1
- jmp number_ok
- bad_number:
- pop eax
- invalid_number:
- mov esi,[number_start]
- dec esi
- not_number:
- dec esi
- stc
- ret
- get_bin_number:
- xor bl,bl
- get_bin_digit:
- cmp esi,[number_start]
- jb number_ok
- movzx eax,byte [esi]
- cmp al,27h
- je bin_digit_skip
- cmp al,'_'
- je bin_digit_skip
- sub al,30h
- cmp al,1
- ja bad_number
- xor edx,edx
- mov cl,bl
- dec esi
- cmp bl,64
- je bin_out_of_range
- inc bl
- cmp cl,32
- jae bin_digit_high
- shl eax,cl
- or dword [edi],eax
- jmp get_bin_digit
- bin_digit_high:
- sub cl,32
- shl eax,cl
- or dword [edi+4],eax
- jmp get_bin_digit
- bin_out_of_range:
- or al,al
- jz get_bin_digit
- or ebp,-1
- jmp get_bin_digit
- bin_digit_skip:
- dec esi
- jmp get_bin_digit
- pascal_hex_number:
- cmp cl,1
- je bad_number
- get_hex_number:
- xor bl,bl
- get_hex_digit:
- cmp esi,[number_start]
- jb number_ok
- movzx eax,byte [esi]
- cmp al,27h
- je hex_digit_skip
- cmp al,'_'
- je hex_digit_skip
- cmp al,'x'
- je hex_number_ok
- cmp al,'$'
- je pascal_hex_ok
- sub al,30h
- cmp al,9
- jbe hex_digit_ok
- sub al,7
- cmp al,15
- jbe hex_letter_digit_ok
- sub al,20h
- cmp al,15
- ja bad_number
- hex_letter_digit_ok:
- cmp al,10
- jb bad_number
- hex_digit_ok:
- xor edx,edx
- mov cl,bl
- dec esi
- cmp bl,64
- je hex_out_of_range
- add bl,4
- cmp cl,32
- jae hex_digit_high
- shl eax,cl
- or dword [edi],eax
- jmp get_hex_digit
- hex_digit_high:
- sub cl,32
- shl eax,cl
- or dword [edi+4],eax
- jmp get_hex_digit
- hex_out_of_range:
- or al,al
- jz get_hex_digit
- or ebp,-1
- jmp get_hex_digit
- hex_digit_skip:
- dec esi
- jmp get_hex_digit
- get_oct_number:
- xor bl,bl
- get_oct_digit:
- cmp esi,[number_start]
- jb number_ok
- movzx eax,byte [esi]
- cmp al,27h
- je oct_digit_skip
- cmp al,'_'
- je oct_digit_skip
- sub al,30h
- cmp al,7
- ja bad_number
- oct_digit_ok:
- xor edx,edx
- mov cl,bl
- dec esi
- cmp bl,63
- ja oct_out_of_range
- jne oct_range_ok
- cmp al,1
- ja oct_out_of_range
- oct_range_ok:
- add bl,3
- cmp cl,30
- je oct_digit_wrap
- ja oct_digit_high
- shl eax,cl
- or dword [edi],eax
- jmp get_oct_digit
- oct_digit_wrap:
- shl eax,cl
- adc dword [edi+4],0
- or dword [edi],eax
- jmp get_oct_digit
- oct_digit_high:
- sub cl,32
- shl eax,cl
- or dword [edi+4],eax
- jmp get_oct_digit
- oct_digit_skip:
- dec esi
- jmp get_oct_digit
- oct_out_of_range:
- or al,al
- jz get_oct_digit
- or ebp,-1
- jmp get_oct_digit
- hex_number_ok:
- dec esi
- pascal_hex_ok:
- cmp esi,[number_start]
- jne bad_number
- number_ok:
- pop esi
- number_done:
- clc
- ret
- get_text_number:
- lods dword [esi]
- mov edx,eax
- xor bl,bl
- mov dword [edi],0
- mov dword [edi+4],0
- get_text_character:
- sub edx,1
- jc number_done
- movzx eax,byte [esi]
- inc esi
- mov cl,bl
- cmp bl,64
- je text_out_of_range
- add bl,8
- cmp cl,32
- jae text_character_high
- shl eax,cl
- or dword [edi],eax
- jmp get_text_character
- text_character_high:
- sub cl,32
- shl eax,cl
- or dword [edi+4],eax
- jmp get_text_character
- text_out_of_range:
- or ebp,-1
- jmp get_text_character
-
-get_fp_value:
- push edi esi
- fp_value_start:
- lods byte [esi]
- cmp al,'-'
- je fp_value_start
- cmp al,'+'
- je fp_value_start
- cmp al,1Ah
- jne not_fp_value
- lods byte [esi]
- movzx ecx,al
- cmp cl,1
- jbe not_fp_value
- lea edx,[esi+1]
- xor ah,ah
- check_fp_value:
- lods byte [esi]
- cmp al,'.'
- je fp_character_dot
- cmp al,'E'
- je fp_character_exp
- cmp al,'e'
- je fp_character_exp
- cmp al,'F'
- je fp_last_character
- cmp al,'f'
- je fp_last_character
- digit_expected:
- cmp al,'0'
- jb not_fp_value
- cmp al,'9'
- ja not_fp_value
- jmp fp_character_ok
- fp_character_dot:
- cmp esi,edx
- je not_fp_value
- or ah,ah
- jnz not_fp_value
- or ah,1
- lods byte [esi]
- loop digit_expected
- not_fp_value:
- pop esi edi
- stc
- ret
- fp_last_character:
- cmp cl,1
- jne not_fp_value
- or ah,4
- jmp fp_character_ok
- fp_character_exp:
- cmp esi,edx
- je not_fp_value
- cmp ah,1
- ja not_fp_value
- or ah,2
- cmp ecx,1
- jne fp_character_ok
- cmp byte [esi],'+'
- je fp_exp_sign
- cmp byte [esi],'-'
- jne fp_character_ok
- fp_exp_sign:
- inc esi
- cmp byte [esi],1Ah
- jne not_fp_value
- inc esi
- lods byte [esi]
- movzx ecx,al
- inc ecx
- fp_character_ok:
- dec ecx
- jnz check_fp_value
- or ah,ah
- jz not_fp_value
- pop esi
- mov [fp_sign],0
- fp_get_sign:
- lods byte [esi]
- cmp al,1Ah
- je fp_get
- cmp al,'+'
- je fp_get_sign
- xor [fp_sign],1
- jmp fp_get_sign
- fp_get:
- lods byte [esi]
- movzx ecx,al
- xor edx,edx
- mov edi,fp_value
- mov [edi],edx
- mov [edi+4],edx
- mov [edi+12],edx
- call fp_optimize
- mov [fp_format],0
- mov al,[esi]
- fp_before_dot:
- lods byte [esi]
- cmp al,'.'
- je fp_dot
- cmp al,'E'
- je fp_exponent
- cmp al,'e'
- je fp_exponent
- cmp al,'F'
- je fp_done
- cmp al,'f'
- je fp_done
- sub al,30h
- mov edi,fp_value+16
- xor edx,edx
- mov dword [edi+12],edx
- mov dword [edi],edx
- mov dword [edi+4],edx
- mov [edi+7],al
- mov dl,7
- mov dword [edi+8],edx
- call fp_optimize
- mov edi,fp_value
- push ecx
- mov ecx,10
- call fp_mul
- pop ecx
- mov ebx,fp_value+16
- call fp_add
- loop fp_before_dot
- fp_dot:
- mov edi,fp_value+16
- xor edx,edx
- mov [edi],edx
- mov [edi+4],edx
- mov byte [edi+7],80h
- mov [edi+8],edx
- mov dword [edi+12],edx
- dec ecx
- jz fp_done
- fp_after_dot:
- lods byte [esi]
- cmp al,'E'
- je fp_exponent
- cmp al,'e'
- je fp_exponent
- cmp al,'F'
- je fp_done
- cmp al,'f'
- je fp_done
- inc [fp_format]
- cmp [fp_format],80h
- jne fp_counter_ok
- mov [fp_format],7Fh
- fp_counter_ok:
- dec esi
- mov edi,fp_value+16
- push ecx
- mov ecx,10
- call fp_div
- push dword [edi]
- push dword [edi+4]
- push dword [edi+8]
- push dword [edi+12]
- lods byte [esi]
- sub al,30h
- movzx ecx,al
- call fp_mul
- mov ebx,edi
- mov edi,fp_value
- call fp_add
- mov edi,fp_value+16
- pop dword [edi+12]
- pop dword [edi+8]
- pop dword [edi+4]
- pop dword [edi]
- pop ecx
- dec ecx
- jnz fp_after_dot
- jmp fp_done
- fp_exponent:
- or [fp_format],80h
- xor edx,edx
- xor ebp,ebp
- dec ecx
- jnz get_exponent
- cmp byte [esi],'+'
- je fp_exponent_sign
- cmp byte [esi],'-'
- jne fp_done
- not ebp
- fp_exponent_sign:
- add esi,2
- lods byte [esi]
- movzx ecx,al
- get_exponent:
- movzx eax,byte [esi]
- inc esi
- sub al,30h
- cmp al,10
- jae exponent_ok
- imul edx,10
- cmp edx,8000h
- jae value_out_of_range
- add edx,eax
- loop get_exponent
- exponent_ok:
- mov edi,fp_value
- or edx,edx
- jz fp_done
- mov ecx,edx
- or ebp,ebp
- jnz fp_negative_power
- fp_power:
- push ecx
- mov ecx,10
- call fp_mul
- pop ecx
- loop fp_power
- jmp fp_done
- fp_negative_power:
- push ecx
- mov ecx,10
- call fp_div
- pop ecx
- loop fp_negative_power
- fp_done:
- mov edi,fp_value
- mov al,[fp_format]
- mov [edi+10],al
- mov al,[fp_sign]
- mov [edi+11],al
- test byte [edi+15],80h
- jz fp_ok
- add dword [edi],1
- adc dword [edi+4],0
- jnc fp_ok
- mov eax,[edi+4]
- shrd [edi],eax,1
- shr eax,1
- or eax,80000000h
- mov [edi+4],eax
- inc word [edi+8]
- fp_ok:
- pop edi
- clc
- ret
- fp_mul:
- or ecx,ecx
- jz fp_zero
- mov eax,[edi+12]
- mul ecx
- mov [edi+12],eax
- mov ebx,edx
- mov eax,[edi]
- mul ecx
- add eax,ebx
- adc edx,0
- mov [edi],eax
- mov ebx,edx
- mov eax,[edi+4]
- mul ecx
- add eax,ebx
- adc edx,0
- mov [edi+4],eax
- .loop:
- or edx,edx
- jz .done
- mov eax,[edi]
- shrd [edi+12],eax,1
- mov eax,[edi+4]
- shrd [edi],eax,1
- shrd eax,edx,1
- mov [edi+4],eax
- shr edx,1
- inc dword [edi+8]
- cmp dword [edi+8],8000h
- jge value_out_of_range
- jmp .loop
- .done:
- ret
- fp_div:
- mov eax,[edi+4]
- xor edx,edx
- div ecx
- mov [edi+4],eax
- mov eax,[edi]
- div ecx
- mov [edi],eax
- mov eax,[edi+12]
- div ecx
- mov [edi+12],eax
- mov ebx,eax
- or ebx,[edi]
- or ebx,[edi+4]
- jz fp_zero
- .loop:
- test byte [edi+7],80h
- jnz .exp_ok
- mov eax,[edi]
- shld [edi+4],eax,1
- mov eax,[edi+12]
- shld [edi],eax,1
- add eax,eax
- mov [edi+12],eax
- dec dword [edi+8]
- add edx,edx
- jmp .loop
- .exp_ok:
- mov eax,edx
- xor edx,edx
- div ecx
- add [edi+12],eax
- adc dword [edi],0
- adc dword [edi+4],0
- jnc .done
- mov eax,[edi+4]
- mov ebx,[edi]
- shrd [edi],eax,1
- shrd [edi+12],ebx,1
- shr eax,1
- or eax,80000000h
- mov [edi+4],eax
- inc dword [edi+8]
- .done:
- ret
- fp_add:
- cmp dword [ebx+8],8000h
- je .done
- cmp dword [edi+8],8000h
- je .copy
- mov eax,[ebx+8]
- cmp eax,[edi+8]
- jge .exp_ok
- mov eax,[edi+8]
- .exp_ok:
- call .change_exp
- xchg ebx,edi
- call .change_exp
- xchg ebx,edi
- mov edx,[ebx+12]
- mov eax,[ebx]
- mov ebx,[ebx+4]
- add [edi+12],edx
- adc [edi],eax
- adc [edi+4],ebx
- jnc .done
- mov eax,[edi]
- shrd [edi+12],eax,1
- mov eax,[edi+4]
- shrd [edi],eax,1
- shr eax,1
- or eax,80000000h
- mov [edi+4],eax
- inc dword [edi+8]
- .done:
- ret
- .copy:
- mov eax,[ebx]
- mov [edi],eax
- mov eax,[ebx+4]
- mov [edi+4],eax
- mov eax,[ebx+8]
- mov [edi+8],eax
- mov eax,[ebx+12]
- mov [edi+12],eax
- ret
- .change_exp:
- push ecx
- mov ecx,eax
- sub ecx,[ebx+8]
- mov edx,[ebx+4]
- jecxz .exp_done
- .exp_loop:
- mov ebp,[ebx]
- shrd [ebx+12],ebp,1
- shrd [ebx],edx,1
- shr edx,1
- inc dword [ebx+8]
- loop .exp_loop
- .exp_done:
- mov [ebx+4],edx
- pop ecx
- ret
- fp_optimize:
- mov eax,[edi]
- mov ebp,[edi+4]
- or ebp,[edi]
- or ebp,[edi+12]
- jz fp_zero
- .loop:
- test byte [edi+7],80h
- jnz .done
- shld [edi+4],eax,1
- mov ebp,[edi+12]
- shld eax,ebp,1
- mov [edi],eax
- shl dword [edi+12],1
- dec dword [edi+8]
- jmp .loop
- .done:
- ret
- fp_zero:
- mov dword [edi+8],8000h
- ret
-
-preevaluate_logical_expression:
- xor al,al
- preevaluate_embedded_logical_expression:
- mov [logical_value_wrapping],al
- push edi
- call preevaluate_logical_value
- preevaluation_loop:
- cmp al,0FFh
- je invalid_logical_expression
- mov dl,[esi]
- inc esi
- cmp dl,'|'
- je preevaluate_or
- cmp dl,'&'
- je preevaluate_and
- cmp dl,92h
- je preevaluation_done
- or dl,dl
- jnz invalid_logical_expression
- preevaluation_done:
- pop edx
- dec esi
- ret
- preevaluate_or:
- cmp al,'1'
- je quick_true
- cmp al,'0'
- je leave_only_following
- push edi
- mov al,dl
- stos byte [edi]
- call preevaluate_logical_value
- pop ebx
- cmp al,'0'
- je leave_only_preceding
- cmp al,'1'
- jne preevaluation_loop
- stos byte [edi]
- xor al,al
- jmp preevaluation_loop
- preevaluate_and:
- cmp al,'0'
- je quick_false
- cmp al,'1'
- je leave_only_following
- push edi
- mov al,dl
- stos byte [edi]
- call preevaluate_logical_value
- pop ebx
- cmp al,'1'
- je leave_only_preceding
- cmp al,'0'
- jne preevaluation_loop
- stos byte [edi]
- xor al,al
- jmp preevaluation_loop
- leave_only_following:
- mov edi,[esp]
- call preevaluate_logical_value
- jmp preevaluation_loop
- leave_only_preceding:
- mov edi,ebx
- xor al,al
- jmp preevaluation_loop
- quick_true:
- call skip_logical_value
- jc invalid_logical_expression
- mov edi,[esp]
- mov al,'1'
- jmp preevaluation_loop
- quick_false:
- call skip_logical_value
- jc invalid_logical_expression
- mov edi,[esp]
- mov al,'0'
- jmp preevaluation_loop
- invalid_logical_expression:
- pop edi
- mov esi,edi
- mov al,0FFh
- stos byte [edi]
- ret
- skip_logical_value:
- cmp byte [esi],'~'
- jne negation_skipped
- inc esi
- jmp skip_logical_value
- negation_skipped:
- mov al,[esi]
- cmp al,91h
- jne skip_simple_logical_value
- inc esi
- xchg al,[logical_value_wrapping]
- push eax
- skip_logical_expression:
- call skip_logical_value
- lods byte [esi]
- or al,al
- jz wrongly_structured_logical_expression
- cmp al,0Fh
- je wrongly_structured_logical_expression
- cmp al,'|'
- je skip_logical_expression
- cmp al,'&'
- je skip_logical_expression
- cmp al,92h
- jne wrongly_structured_logical_expression
- pop eax
- mov [logical_value_wrapping],al
- logical_value_skipped:
- clc
- ret
- wrongly_structured_logical_expression:
- pop eax
- stc
- ret
- skip_simple_logical_value:
- mov [logical_value_parentheses],0
- find_simple_logical_value_end:
- mov al,[esi]
- or al,al
- jz logical_value_skipped
- cmp al,0Fh
- je logical_value_skipped
- cmp al,'|'
- je logical_value_skipped
- cmp al,'&'
- je logical_value_skipped
- cmp al,91h
- je skip_logical_value_internal_parenthesis
- cmp al,92h
- jne skip_logical_value_symbol
- sub [logical_value_parentheses],1
- jnc skip_logical_value_symbol
- cmp [logical_value_wrapping],91h
- jne skip_logical_value_symbol
- jmp logical_value_skipped
- skip_logical_value_internal_parenthesis:
- inc [logical_value_parentheses]
- skip_logical_value_symbol:
- call skip_symbol
- jmp find_simple_logical_value_end
- preevaluate_logical_value:
- mov ebp,edi
- preevaluate_negation:
- cmp byte [esi],'~'
- jne preevaluate_negation_ok
- movs byte [edi],[esi]
- jmp preevaluate_negation
- preevaluate_negation_ok:
- mov ebx,esi
- cmp byte [esi],91h
- jne preevaluate_simple_logical_value
- lods byte [esi]
- stos byte [edi]
- push ebp
- mov dl,[logical_value_wrapping]
- push edx
- call preevaluate_embedded_logical_expression
- pop edx
- mov [logical_value_wrapping],dl
- pop ebp
- cmp al,0FFh
- je invalid_logical_value
- cmp byte [esi],92h
- jne invalid_logical_value
- or al,al
- jnz preevaluated_expression_value
- movs byte [edi],[esi]
- ret
- preevaluated_expression_value:
- inc esi
- lea edx,[edi-1]
- sub edx,ebp
- test edx,1
- jz expression_negation_ok
- xor al,1
- expression_negation_ok:
- mov edi,ebp
- ret
- invalid_logical_value:
- mov edi,ebp
- mov al,0FFh
- ret
- preevaluate_simple_logical_value:
- xor edx,edx
- mov [logical_value_parentheses],edx
- find_logical_value_boundaries:
- mov al,[esi]
- or al,al
- jz logical_value_boundaries_found
- cmp al,91h
- je logical_value_internal_parentheses
- cmp al,92h
- je logical_value_boundaries_parenthesis_close
- cmp al,'|'
- je logical_value_boundaries_found
- cmp al,'&'
- je logical_value_boundaries_found
- or edx,edx
- jnz next_symbol_in_logical_value
- cmp al,0F0h
- je preevaluable_logical_operator
- cmp al,0F7h
- je preevaluable_logical_operator
- cmp al,0F6h
- jne next_symbol_in_logical_value
- preevaluable_logical_operator:
- mov edx,esi
- next_symbol_in_logical_value:
- call skip_symbol
- jmp find_logical_value_boundaries
- logical_value_internal_parentheses:
- inc [logical_value_parentheses]
- jmp next_symbol_in_logical_value
- logical_value_boundaries_parenthesis_close:
- sub [logical_value_parentheses],1
- jnc next_symbol_in_logical_value
- cmp [logical_value_wrapping],91h
- jne next_symbol_in_logical_value
- logical_value_boundaries_found:
- or edx,edx
- jz non_preevaluable_logical_value
- mov al,[edx]
- cmp al,0F0h
- je compare_symbols
- cmp al,0F7h
- je compare_symbol_types
- cmp al,0F6h
- je scan_symbols_list
- non_preevaluable_logical_value:
- mov ecx,esi
- mov esi,ebx
- sub ecx,esi
- jz invalid_logical_value
- cmp esi,edi
- je leave_logical_value_intact
- rep movs byte [edi],[esi]
- xor al,al
- ret
- leave_logical_value_intact:
- add edi,ecx
- add esi,ecx
- xor al,al
- ret
- compare_symbols:
- lea ecx,[esi-1]
- sub ecx,edx
- mov eax,edx
- sub eax,ebx
- cmp ecx,eax
- jne preevaluated_false
- push esi edi
- mov esi,ebx
- lea edi,[edx+1]
- repe cmps byte [esi],[edi]
- pop edi esi
- je preevaluated_true
- preevaluated_false:
- mov eax,edi
- sub eax,ebp
- test eax,1
- jnz store_true
- store_false:
- mov edi,ebp
- mov al,'0'
- ret
- preevaluated_true:
- mov eax,edi
- sub eax,ebp
- test eax,1
- jnz store_false
- store_true:
- mov edi,ebp
- mov al,'1'
- ret
- compare_symbol_types:
- push esi
- lea esi,[edx+1]
- type_comparison:
- cmp esi,[esp]
- je types_compared
- mov al,[esi]
- cmp al,[ebx]
- jne different_type
- cmp al,'('
- jne equal_type
- mov al,[esi+1]
- mov ah,[ebx+1]
- cmp al,ah
- je equal_type
- or al,al
- jz different_type
- or ah,ah
- jz different_type
- cmp al,'.'
- je different_type
- cmp ah,'.'
- je different_type
- equal_type:
- call skip_symbol
- xchg esi,ebx
- call skip_symbol
- xchg esi,ebx
- jmp type_comparison
- types_compared:
- pop esi
- cmp byte [ebx],0F7h
- jne preevaluated_false
- jmp preevaluated_true
- different_type:
- pop esi
- jmp preevaluated_false
- scan_symbols_list:
- push edi esi
- lea esi,[edx+1]
- sub edx,ebx
- lods byte [esi]
- cmp al,'<'
- jne invalid_symbols_list
- get_next_from_list:
- mov edi,esi
- get_from_list:
- cmp byte [esi],','
- je compare_in_list
- cmp byte [esi],'>'
- je compare_in_list
- cmp esi,[esp]
- jae invalid_symbols_list
- call skip_symbol
- jmp get_from_list
- compare_in_list:
- mov ecx,esi
- sub ecx,edi
- cmp ecx,edx
- jne not_equal_length_in_list
- mov esi,ebx
- repe cmps byte [esi],[edi]
- mov esi,edi
- jne not_equal_in_list
- skip_rest_of_list:
- cmp byte [esi],'>'
- je check_list_end
- cmp esi,[esp]
- jae invalid_symbols_list
- call skip_symbol
- jmp skip_rest_of_list
- check_list_end:
- inc esi
- cmp esi,[esp]
- jne invalid_symbols_list
- pop esi edi
- jmp preevaluated_true
- not_equal_in_list:
- add esi,ecx
- not_equal_length_in_list:
- lods byte [esi]
- cmp al,','
- je get_next_from_list
- cmp esi,[esp]
- jne invalid_symbols_list
- pop esi edi
- jmp preevaluated_false
- invalid_symbols_list:
- pop esi edi
- jmp invalid_logical_value
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-formatter:
- mov [current_offset],edi
- cmp [output_file],0
- jne output_path_ok
- mov esi,[input_file]
- mov edi,[free_additional_memory]
- duplicate_output_path:
- lods byte [esi]
- cmp edi,[structures_buffer]
- jae out_of_memory
- stos byte [edi]
- or al,al
- jnz duplicate_output_path
- dec edi
- mov eax,edi
- find_extension:
- dec eax
- cmp eax,[free_additional_memory]
- jb extension_found
- cmp byte [eax],'\'
- je extension_found
- cmp byte [eax],'/'
- je extension_found
- cmp byte [eax],'.'
- jne find_extension
- mov edi,eax
- extension_found:
- lea eax,[edi+9]
- cmp eax,[structures_buffer]
- jae out_of_memory
- cmp [file_extension],0
- jne extension_specified
- mov al,[output_format]
- cmp al,2
- je exe_extension
- jb bin_extension
- cmp al,4
- je obj_extension
- cmp al,5
- je o_extension
- cmp al,3
- jne no_extension
- cmp [subsystem],1
- je sys_extension
- cmp [subsystem],10
- jae efi_extension
- bt [format_flags],8
- jnc exe_extension
- mov eax,'.dll'
- jmp make_extension
- sys_extension:
- mov eax,'.sys'
- jmp make_extension
- efi_extension:
- mov eax,'.efi'
- jmp make_extension
- bin_extension:
- mov eax,'.bin'
- bt [format_flags],0
- jnc make_extension
- mov eax,'.com'
- jmp make_extension
- obj_extension:
- mov eax,'.obj'
- jmp make_extension
- o_extension:
- mov eax,'.o'
- bt [format_flags],0
- jnc make_extension
- no_extension:
- xor eax,eax
- jmp make_extension
- exe_extension:
- mov eax,'.exe'
- make_extension:
- xchg eax,[edi]
- scas dword [edi]
- mov byte [edi],0
- scas byte [edi]
- mov esi,edi
- stos dword [edi]
- sub edi,9
- xor eax,eax
- mov ebx,characters
- adapt_case:
- mov al,[esi]
- or al,al
- jz adapt_next
- xlat byte [ebx]
- cmp al,[esi]
- je adapt_ok
- sub byte [edi],20h
- adapt_ok:
- inc esi
- adapt_next:
- inc edi
- cmp byte [edi],0
- jne adapt_case
- jmp extension_ok
- extension_specified:
- mov al,'.'
- stos byte [edi]
- mov esi,[file_extension]
- copy_extension:
- lods byte [esi]
- stos byte [edi]
- test al,al
- jnz copy_extension
- dec edi
- extension_ok:
- mov esi,edi
- lea ecx,[esi+1]
- sub ecx,[free_additional_memory]
- mov edi,[structures_buffer]
- dec edi
- std
- rep movs byte [edi],[esi]
- cld
- inc edi
- mov [structures_buffer],edi
- mov [output_file],edi
- output_path_ok:
- cmp [symbols_file],0
- je labels_table_ok
- mov ecx,[memory_end]
- sub ecx,[labels_list]
- mov edi,[tagged_blocks]
- sub edi,8
- mov [edi],ecx
- or dword [edi+4],-1
- sub edi,ecx
- cmp edi,[current_offset]
- jbe out_of_memory
- mov [tagged_blocks],edi
- mov esi,[memory_end]
- copy_labels:
- sub esi,32
- cmp esi,[labels_list]
- jb labels_table_ok
- mov ecx,32 shr 2
- rep movs dword [edi],[esi]
- sub esi,32
- jmp copy_labels
- labels_table_ok:
- mov edi,[current_offset]
- cmp [output_format],4
- je coff_formatter
- cmp [output_format],5
- jne common_formatter
- bt [format_flags],0
- jnc elf_formatter
- common_formatter:
- mov eax,edi
- sub eax,[code_start]
- mov [real_code_size],eax
- cmp edi,[undefined_data_end]
- jne calculate_code_size
- mov edi,[undefined_data_start]
- calculate_code_size:
- mov [current_offset],edi
- sub edi,[code_start]
- mov [code_size],edi
- and [written_size],0
- mov edx,[output_file]
- call create
- jc write_failed
- cmp [output_format],3
- jne stub_written
- mov edx,[code_start]
- mov ecx,[stub_size]
- sub edx,ecx
- add [written_size],ecx
- call write
- stub_written:
- cmp [output_format],2
- jne write_output
- call write_mz_header
- write_output:
- call write_code
- output_written:
- call close
- cmp [symbols_file],0
- jne dump_symbols
- ret
- write_code:
- mov eax,[written_size]
- mov [headers_size],eax
- mov edx,[code_start]
- mov ecx,[code_size]
- add [written_size],ecx
- lea eax,[edx+ecx]
- call write
- jc write_failed
- ret
-format_directive:
- cmp edi,[code_start]
- 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]
- cmp al,1Ch
- je format_prefix
- cmp al,18h
- jne invalid_argument
- lods byte [esi]
- select_format:
- mov dl,al
- shr al,4
- mov [output_format],al
- and edx,0Fh
- or [format_flags],edx
- cmp al,2
- je format_mz
- cmp al,3
- je format_pe
- cmp al,4
- je format_coff
- cmp al,5
- je format_elf
- format_defined:
- cmp byte [esi],86h
- jne instruction_assembled
- cmp word [esi+1],'('
- jne invalid_argument
- mov eax,[esi+3]
- add esi,3+4
- mov [file_extension],esi
- lea esi,[esi+eax+1]
- jmp instruction_assembled
- format_prefix:
- lods byte [esi]
- mov ah,al
- lods byte [esi]
- cmp al,18h
- jne invalid_argument
- lods byte [esi]
- mov edx,eax
- shr dl,4
- shr dh,4
- cmp dl,dh
- jne invalid_argument
- or al,ah
- jmp select_format
-entry_directive:
- bts [format_flags],10h
- jc setting_already_specified
- mov al,[output_format]
- cmp al,2
- je mz_entry
- cmp al,3
- je pe_entry
- cmp al,5
- jne illegal_instruction
- bt [format_flags],0
- jc elf_entry
- jmp illegal_instruction
-stack_directive:
- bts [format_flags],11h
- jc setting_already_specified
- mov al,[output_format]
- cmp al,2
- je mz_stack
- cmp al,3
- je pe_stack
- jmp illegal_instruction
-heap_directive:
- bts [format_flags],12h
- jc setting_already_specified
- mov al,[output_format]
- cmp al,2
- je mz_heap
- cmp al,3
- je pe_heap
- jmp illegal_instruction
-segment_directive:
- mov al,[output_format]
- cmp al,2
- je mz_segment
- cmp al,5
- je elf_segment
- jmp illegal_instruction
-section_directive:
- mov al,[output_format]
- cmp al,3
- je pe_section
- cmp al,4
- je coff_section
- cmp al,5
- je elf_section
- jmp illegal_instruction
-public_directive:
- mov al,[output_format]
- cmp al,4
- je public_allowed
- cmp al,5
- jne illegal_instruction
- bt [format_flags],0
- jc illegal_instruction
- public_allowed:
- mov [base_code],0C0h
- lods byte [esi]
- cmp al,2
- je public_label
- cmp al,1Dh
- jne invalid_argument
- lods byte [esi]
- and al,7
- add [base_code],al
- lods byte [esi]
- cmp al,2
- jne invalid_argument
- public_label:
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- mov dx,[current_pass]
- mov [eax+18],dx
- or byte [eax+8],8
- mov ebx,eax
- call store_label_reference
- mov eax,ebx
- mov ebx,[free_additional_memory]
- lea edx,[ebx+10h]
- cmp edx,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],edx
- mov [ebx+8],eax
- mov eax,[current_line]
- mov [ebx+0Ch],eax
- lods byte [esi]
- cmp al,86h
- jne invalid_argument
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- mov [ebx+4],esi
- lods dword [esi]
- lea esi,[esi+eax+1]
- mov al,[base_code]
- mov [ebx],al
- jmp instruction_assembled
-extrn_directive:
- mov al,[output_format]
- cmp al,4
- je extrn_allowed
- cmp al,5
- jne illegal_instruction
- bt [format_flags],0
- jc illegal_instruction
- extrn_allowed:
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- mov ebx,esi
- lods dword [esi]
- lea esi,[esi+eax+1]
- mov edx,[free_additional_memory]
- lea eax,[edx+0Ch]
- cmp eax,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],eax
- mov byte [edx],80h
- mov [edx+4],ebx
- lods byte [esi]
- cmp al,86h
- jne invalid_argument
- lods byte [esi]
- cmp al,2
- jne invalid_argument
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- mov ebx,eax
- xor ah,ah
- lods byte [esi]
- cmp al,':'
- je get_extrn_size
- dec esi
- cmp al,11h
- jne extrn_size_ok
- get_extrn_size:
- lods word [esi]
- cmp al,11h
- jne invalid_argument
- extrn_size_ok:
- mov [address_symbol],edx
- mov [label_size],ah
- movzx ecx,ah
- mov [edx+8],ecx
- xor eax,eax
- xor edx,edx
- xor ebp,ebp
- mov [address_sign],0
- mov ch,2
- test [format_flags],8
- jz make_free_label
- mov ch,4
- jmp make_free_label
-mark_relocation:
- cmp [value_type],0
- je 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
- je mark_pe_relocation
- cmp [output_format],4
- je mark_coff_relocation
- cmp [output_format],5
- je mark_elf_relocation
- relocation_ok:
- ret
-close_pass:
- mov al,[output_format]
- cmp al,3
- je close_pe
- cmp al,4
- je close_coff
- cmp al,5
- je close_elf
- ret
-
-format_mz:
- mov edx,[additional_memory]
- push edi
- mov edi,edx
- mov ecx,1Ch shr 2
- xor eax,eax
- rep stos dword [edi]
- mov [free_additional_memory],edi
- pop edi
- mov word [edx+0Ch],0FFFFh
- mov word [edx+10h],1000h
- mov [code_type],16
- jmp format_defined
-mark_mz_relocation:
- push eax ebx
- inc word [number_of_relocations]
- jz format_limitations_exceeded
- mov ebx,[free_additional_memory]
- mov eax,edi
- sub eax,[code_start]
- mov [ebx],ax
- shr eax,16
- shl ax,12
- mov [ebx+2],ax
- cmp word [ebx],0FFFFh
- jne mz_relocation_ok
- inc word [ebx+2]
- sub word [ebx],10h
- mz_relocation_ok:
- add ebx,4
- cmp ebx,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],ebx
- pop ebx eax
- ret
-mz_segment:
- lods byte [esi]
- cmp al,2
- jne invalid_argument
- lods dword [esi]
- cmp eax,0Fh
- jb invalid_use_of_symbol
- je reserved_word_used_as_symbol
- inc esi
- mov ebx,eax
- mov eax,edi
- sub eax,[code_start]
- mov ecx,0Fh
- add eax,0Fh
- and eax,1111b
- sub ecx,eax
- mov edx,edi
- xor eax,eax
- rep stos byte [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
- cmp eax,10000h
- jae value_out_of_range
- mov edx,eax
- mov al,16
- cmp byte [esi],13h
- jne segment_type_ok
- inc esi
- lods byte [esi]
- segment_type_ok:
- mov [code_type],al
- mov eax,edx
- mov ch,1
- mov [address_sign],0
- xor edx,edx
- xor ebp,ebp
- mov [label_size],0
- mov [address_symbol],edx
- jmp make_free_label
-mz_entry:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- call get_word_value
- cmp [value_type],1
- je initial_cs_ok
- call recoverable_invalid_address
- initial_cs_ok:
- mov edx,[additional_memory]
- mov [edx+16h],ax
- lods byte [esi]
- cmp al,':'
- jne invalid_argument
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- ja invalid_address
- call get_word_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,[additional_memory]
- mov [edx+14h],ax
- jmp instruction_assembled
- recoverable_invalid_address:
- cmp [error_line],0
- jne ignore_invalid_address
- push [current_line]
- pop [error_line]
- mov [error],invalid_address
- ignore_invalid_address:
- ret
-mz_stack:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- call get_word_value
- cmp byte [esi],':'
- je stack_pointer
- cmp ax,10h
- jb invalid_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,[additional_memory]
- mov [edx+10h],ax
- jmp instruction_assembled
- stack_pointer:
- cmp [value_type],1
- je initial_ss_ok
- call recoverable_invalid_address
- initial_ss_ok:
- mov edx,[additional_memory]
- mov [edx+0Eh],ax
- lods byte [esi]
- cmp al,':'
- jne invalid_argument
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- call get_word_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,[additional_memory]
- mov [edx+10h],ax
- bts [format_flags],4
- jmp instruction_assembled
-mz_heap:
- cmp [output_format],2
- jne illegal_instruction
- lods byte [esi]
- call get_size_operator
- cmp ah,1
- je invalid_value
- cmp ah,2
- ja invalid_value
- cmp al,'('
- jne invalid_argument
- call get_word_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,[additional_memory]
- mov [edx+0Ch],ax
- jmp instruction_assembled
-write_mz_header:
- mov edx,[additional_memory]
- bt [format_flags],4
- jc mz_stack_ok
- mov eax,[real_code_size]
- dec eax
- shr eax,4
- inc eax
- mov [edx+0Eh],ax
- shl eax,4
- movzx ecx,word [edx+10h]
- add eax,ecx
- mov [real_code_size],eax
- mz_stack_ok:
- mov edi,[free_additional_memory]
- mov eax,[number_of_relocations]
- shl eax,2
- add eax,1Ch
- sub edi,eax
- xchg edi,[free_additional_memory]
- mov ecx,0Fh
- add eax,0Fh
- and eax,1111b
- sub ecx,eax
- xor al,al
- rep stos byte [edi]
- sub edi,[free_additional_memory]
- mov ecx,edi
- shr edi,4
- mov word [edx],'MZ' ; signature
- mov [edx+8],di ; header size in paragraphs
- mov eax,[number_of_relocations]
- mov [edx+6],ax ; number of relocation entries
- mov eax,[code_size]
- add eax,ecx
- mov esi,eax
- shr esi,9
- and eax,1FFh
- inc si
- or ax,ax
- jnz mz_size_ok
- dec si
- mz_size_ok:
- mov [edx+2],ax ; number of bytes in last page
- mov [edx+4],si ; number of pages
- mov eax,[real_code_size]
- dec eax
- shr eax,4
- inc eax
- mov esi,[code_size]
- dec esi
- shr esi,4
- inc esi
- sub eax,esi
- mov [edx+0Ah],ax ; minimum memory in addition to code
- add [edx+0Ch],ax ; maximum memory in addition to code
- salc
- mov ah,al
- or [edx+0Ch],ax
- mov word [edx+18h],1Ch ; offset of relocation table
- add [written_size],ecx
- call write
- jc write_failed
- ret
-
-make_stub:
- mov [stub_file],edx
- or edx,edx
- jnz stub_from_file
- push esi
- mov edx,edi
- xor eax,eax
- mov ecx,20h
- rep stos dword [edi]
- mov eax,40h+default_stub_end-default_stub
- mov cx,100h+default_stub_end-default_stub
- mov word [edx],'MZ'
- mov byte [edx+4],1
- mov word [edx+2],ax
- mov byte [edx+8],4
- mov byte [edx+0Ah],10h
- mov word [edx+0Ch],0FFFFh
- mov word [edx+10h],cx
- mov word [edx+3Ch],ax
- mov byte [edx+18h],40h
- lea edi,[edx+40h]
- mov esi,default_stub
- mov ecx,default_stub_end-default_stub
- rep movs byte [edi],[esi]
- pop esi
- jmp stub_ok
- default_stub:
- use16
- push cs
- pop ds
- mov dx,stub_message-default_stub
- mov ah,9
- int 21h
- mov ax,4C01h
- int 21h
- stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h
- rq 1
- default_stub_end:
- use32
- stub_from_file:
- push esi
- mov esi,edx
- call open_binary_file
- mov edx,edi
- mov ecx,1Ch
- mov esi,edx
- call read
- jc binary_stub
- cmp word [esi],'MZ'
- jne binary_stub
- add edi,1Ch
- movzx ecx,word [esi+6]
- add ecx,11b
- and ecx,not 11b
- add ecx,(40h-1Ch) shr 2
- lea eax,[edi+ecx*4]
- cmp edi,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- rep stos dword [edi]
- mov edx,40h
- xchg dx,[esi+18h]
- xor al,al
- call lseek
- movzx ecx,word [esi+6]
- shl ecx,2
- lea edx,[esi+40h]
- call read
- mov edx,edi
- sub edx,esi
- shr edx,4
- xchg dx,[esi+8]
- shl edx,4
- xor al,al
- call lseek
- movzx ecx,word [esi+4]
- dec ecx
- js out_of_memory
- shl ecx,9
- movzx edx,word [esi+2]
- test edx,edx
- jnz stub_header_size_ok
- mov dx,200h
- stub_header_size_ok:
- add ecx,edx
- mov edx,edi
- sub ecx,eax
- je read_stub_code
- jb stub_code_ok
- push ecx
- dec ecx
- shr ecx,3
- inc ecx
- shl ecx,1
- lea eax,[edi+ecx*4]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- rep stos dword [edi]
- pop ecx
- read_stub_code:
- call read
- stub_code_ok:
- call close
- mov edx,edi
- sub edx,esi
- mov ax,dx
- and ax,1FFh
- mov [esi+2],ax
- dec edx
- shr edx,9
- inc edx
- mov [esi+4],dx
- mov eax,edi
- sub eax,esi
- mov [esi+3Ch],eax
- pop esi
- stub_ok:
- ret
- binary_stub:
- mov esi,edi
- mov ecx,40h shr 2
- xor eax,eax
- rep stos dword [edi]
- mov al,2
- xor edx,edx
- call lseek
- push eax
- xor al,al
- xor edx,edx
- call lseek
- mov ecx,[esp]
- add ecx,40h+111b
- and ecx,not 111b
- mov ax,cx
- and ax,1FFh
- mov [esi+2],ax
- lea eax,[ecx+1FFh]
- shr eax,9
- mov [esi+4],ax
- mov [esi+3Ch],ecx
- sub ecx,40h
- mov eax,10000h
- sub eax,ecx
- jbe binary_heap_ok
- shr eax,4
- mov [esi+0Ah],ax
- binary_heap_ok:
- mov word [esi],'MZ'
- mov byte [esi+8],4
- mov ax,0FFFFh
- mov [esi+0Ch],ax
- dec ax
- mov [esi+10h],ax
- sub ax,0Eh
- mov [esi+0Eh],ax
- mov [esi+16h],ax
- mov word [esi+14h],100h
- mov byte [esi+18h],40h
- mov eax,[tagged_blocks]
- sub eax,ecx
- cmp edi,eax
- jae out_of_memory
- mov edx,edi
- shr ecx,2
- xor eax,eax
- rep stos dword [edi]
- pop ecx
- call read
- call close
- pop esi
- ret
-
-format_pe:
- xor edx,edx
- mov [machine],14Ch
- mov [subsystem],3
- mov [subsystem_version],3 + 10 shl 16
- mov [image_base],400000h
- and [image_base_high],0
- test [format_flags],8
- jz pe_settings
- mov [machine],8664h
- mov [subsystem_version],5 + 0 shl 16
- pe_settings:
- cmp byte [esi],84h
- je get_stub_name
- cmp byte [esi],80h
- je get_pe_base
- cmp byte [esi],1Bh
- jne pe_settings_ok
- lods byte [esi]
- lods byte [esi]
- test al,80h+40h
- jz subsystem_setting
- cmp al,80h
- je dll_flag
- cmp al,81h
- je wdm_flag
- cmp al,82h
- je large_flag
- cmp al,83h
- je nx_flag
- jmp pe_settings
- dll_flag:
- bts [format_flags],8
- jc setting_already_specified
- jmp pe_settings
- wdm_flag:
- bts [format_flags],9
- jc setting_already_specified
- jmp pe_settings
- large_flag:
- bts [format_flags],11
- jc setting_already_specified
- test [format_flags],8
- jnz invalid_argument
- jmp pe_settings
- nx_flag:
- bts [format_flags],12
- jc setting_already_specified
- jmp pe_settings
- subsystem_setting:
- bts [format_flags],7
- jc setting_already_specified
- and ax,3Fh
- mov [subsystem],ax
- cmp ax,10
- jb subsystem_type_ok
- or [format_flags],4
- subsystem_type_ok:
- cmp byte [esi],'('
- jne pe_settings
- inc esi
- cmp byte [esi],'.'
- jne invalid_value
- inc esi
- push edx
- cmp byte [esi+11],0
- jne invalid_value
- cmp byte [esi+10],2
- ja invalid_value
- mov dx,[esi+8]
- cmp dx,8000h
- je zero_version
- mov eax,[esi+4]
- cmp dx,7
- jg invalid_value
- mov cx,7
- sub cx,dx
- mov eax,[esi+4]
- shr eax,cl
- mov ebx,eax
- shr ebx,24
- cmp bl,100
- jae invalid_value
- and eax,0FFFFFFh
- mov ecx,100
- mul ecx
- shrd eax,edx,24
- jnc version_value_ok
- inc eax
- version_value_ok:
- shl eax,16
- mov ax,bx
- jmp subsystem_version_ok
- zero_version:
- xor eax,eax
- subsystem_version_ok:
- pop edx
- add esi,13
- mov [subsystem_version],eax
- jmp pe_settings
- get_pe_base:
- bts [format_flags],10
- jc setting_already_specified
- lods word [esi]
- cmp ah,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- push edx edi
- add edi,[stub_size]
- test [format_flags],4
- jnz get_peplus_base
- call get_dword_value
- mov [image_base],eax
- jmp pe_base_ok
- get_peplus_base:
- call get_qword_value
- mov [image_base],eax
- mov [image_base_high],edx
- pe_base_ok:
- pop edi edx
- cmp [value_type],0
- jne invalid_use_of_symbol
- cmp byte [esi],84h
- jne pe_settings_ok
- get_stub_name:
- lods byte [esi]
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- lods dword [esi]
- mov edx,esi
- add esi,eax
- inc esi
- pe_settings_ok:
- mov ebp,[stub_size]
- or ebp,ebp
- jz make_pe_stub
- cmp edx,[stub_file]
- je pe_stub_ok
- sub edi,[stub_size]
- mov [code_start],edi
- make_pe_stub:
- call make_stub
- mov eax,edi
- sub eax,[code_start]
- mov [stub_size],eax
- mov [code_start],edi
- mov ebp,eax
- pe_stub_ok:
- mov edx,edi
- mov ecx,18h+0E0h
- test [format_flags],4
- jz zero_pe_header
- add ecx,10h
- zero_pe_header:
- add ebp,ecx
- shr ecx,2
- xor eax,eax
- rep stos dword [edi]
- mov word [edx],'PE' ; signature
- mov ax,[machine]
- mov word [edx+4],ax
- mov byte [edx+38h+1],10h ; section alignment
- mov byte [edx+3Ch+1],2 ; file alignment
- mov byte [edx+40h],1 ; OS version
- mov eax,[subsystem_version]
- mov [edx+48h],eax
- mov ax,[subsystem]
- mov [edx+5Ch],ax
- cmp ax,1
- jne pe_alignment_ok
- mov eax,20h
- mov dword [edx+38h],eax
- mov dword [edx+3Ch],eax
- pe_alignment_ok:
- mov word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8
- test [format_flags],4
- jnz init_peplus_specific
- mov byte [edx+14h],0E0h ; size of optional header
- mov dword [edx+16h],10B010Fh; flags and magic value
- mov eax,[image_base]
- mov [edx+34h],eax
- mov byte [edx+60h+1],10h ; stack reserve
- mov byte [edx+64h+1],10h ; stack commit
- mov byte [edx+68h+2],1 ; heap reserve
- mov byte [edx+74h],16 ; number of directories
- jmp pe_header_ok
- init_peplus_specific:
- mov byte [edx+14h],0F0h ; size of optional header
- mov dword [edx+16h],20B002Fh; flags and magic value
- mov eax,[image_base]
- mov [edx+30h],eax
- mov eax,[image_base_high]
- mov [edx+34h],eax
- mov byte [edx+60h+1],10h ; stack reserve
- mov byte [edx+68h+1],10h ; stack commit
- mov byte [edx+70h+2],1 ; heap reserve
- mov byte [edx+84h],16 ; number of directories
- pe_header_ok:
- bsf ecx,[edx+3Ch]
- imul ebx,[number_of_sections],28h
- or ebx,ebx
- jnz reserve_space_for_section_headers
- mov ebx,28h
- reserve_space_for_section_headers:
- add ebx,ebp
- dec ebx
- shr ebx,cl
- inc ebx
- shl ebx,cl
- sub ebx,ebp
- mov ecx,ebx
- mov eax,[tagged_blocks]
- sub eax,ecx
- cmp edi,eax
- jae out_of_memory
- shr ecx,2
- xor eax,eax
- rep stos dword [edi]
- mov eax,edi
- sub eax,[code_start]
- add eax,[stub_size]
- mov [edx+54h],eax ; size of headers
- mov ecx,[edx+38h]
- dec ecx
- add eax,ecx
- not ecx
- and eax,ecx
- bt [format_flags],8
- jc pe_entry_init_ok
- mov [edx+28h],eax ; entry point rva
- pe_entry_init_ok:
- and [number_of_sections],0
- movzx ebx,word [edx+14h]
- lea ebx,[edx+18h+ebx]
- mov [current_section],ebx
- mov dword [ebx],'.fla'
- mov dword [ebx+4],'t'
- mov [ebx+14h],edi
- mov [ebx+0Ch],eax
- mov dword [ebx+24h],0E0000060h
- xor ecx,ecx
- xor bl,bl
- not eax
- not ecx
- not bl
- add eax,1
- adc ecx,0
- adc bl,0
- add eax,edi
- adc ecx,0
- adc bl,0
- test [format_flags],4
- jnz peplus_org
- sub eax,[edx+34h]
- sbb ecx,0
- sbb bl,0
- jmp pe_org_ok
- peplus_org:
- sub eax,[edx+30h]
- sbb ecx,[edx+34h]
- sbb bl,0
- pe_org_ok:
- test [format_flags],8
- jnz pe64_code
- mov bh,2
- mov [code_type],32
- jmp pe_code_type_ok
- pe64_code:
- mov bh,4
- mov [code_type],64
- pe_code_type_ok:
- bt [resolver_flags],0
- jc pe_labels_type_ok
- xor bh,bh
- pe_labels_type_ok:
- 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
- dll_flag_ok:
- bt [format_flags],9
- jnc wdm_flag_ok
- or byte [edx+5Eh+1],20h
- wdm_flag_ok:
- bt [format_flags],11
- jnc large_flag_ok
- or byte [edx+16h],20h
- large_flag_ok:
- bt [format_flags],12
- jnc nx_ok
- or byte [edx+5Eh+1],1
- nx_ok:
- 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]
- sub edx,[stub_size]
- cmp ecx,edx
- jbe new_section
- lea ebx,[edx-28h]
- or [next_pass_needed],-1
- push edi
- mov edi,ebx
- mov ecx,28h shr 4
- xor eax,eax
- rep stos dword [edi]
- pop edi
- new_section:
- mov [ebx+0Ch],eax
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- lea edx,[esi+4]
- mov ecx,[esi]
- lea esi,[esi+4+ecx+1]
- cmp ecx,8
- ja name_too_long
- xor eax,eax
- mov [ebx],eax
- mov [ebx+4],eax
- push esi edi
- mov edi,ebx
- mov esi,edx
- rep movs byte [edi],[esi]
- pop edi esi
- and dword [ebx+24h],0
- mov [ebx+14h],edi
- mov edx,[code_start]
- mov eax,edi
- xor ecx,ecx
- sub eax,[ebx+0Ch]
- sbb ecx,0
- 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 byte [ds:ebp+9],4
- mov [code_type],64
- pe_section_code_type_ok:
- test [format_flags],4
- jnz peplus_section_org
- sub eax,[edx+34h]
- sbb ecx,0
- sbb byte [ds:ebp+8],0
- bt [resolver_flags],0
- jc pe_section_org_ok
- mov byte [ds:ebp+9],0
- jmp pe_section_org_ok
- peplus_section_org:
- sub eax,[edx+30h]
- sbb ecx,[edx+34h]
- sbb byte [ds:ebp+8],0
- bt [resolver_flags],0
- jc pe_section_org_ok
- mov byte [ds:ebp+9],0
- pe_section_org_ok:
- mov [ds:ebp],eax
- mov [ds:ebp+4],ecx
- mov [ds:ebp+18h],edi
- get_section_flags:
- lods byte [esi]
- cmp al,1Ah
- je set_directory
- cmp al,19h
- je section_flag
- dec esi
- jmp instruction_assembled
- set_directory:
- movzx eax,byte [esi]
- inc esi
- mov ecx,ebx
- test [format_flags],4
- jnz peplus_directory
- xchg ecx,[edx+78h+eax*8]
- mov dword [edx+78h+eax*8+4],-1
- jmp pe_directory_set
- peplus_directory:
- xchg ecx,[edx+88h+eax*8]
- mov dword [edx+88h+eax*8+4],-1
- pe_directory_set:
- or ecx,ecx
- jnz data_already_defined
- push ebx edx
- call generate_pe_data
- pop edx ebx
- jmp get_section_flags
- section_flag:
- lods byte [esi]
- cmp al,9
- je invalid_argument
- cmp al,11
- je invalid_argument
- mov cl,al
- mov eax,1
- shl eax,cl
- test dword [ebx+24h],eax
- jnz setting_already_specified
- or dword [ebx+24h],eax
- jmp get_section_flags
- close_pe_section:
- mov ebx,[current_section]
- mov edx,[code_start]
- mov eax,edi
- sub eax,[ebx+14h]
- jnz finish_section
- bt [format_flags],5
- jc finish_section
- mov eax,[ebx+0Ch]
- ret
- finish_section:
- mov [ebx+8],eax
- cmp edi,[undefined_data_end]
- jne align_section
- cmp dword [edx+38h],1000h
- jb align_section
- mov edi,[undefined_data_start]
- align_section:
- and [undefined_data_end],0
- mov ebp,edi
- sub ebp,[ebx+14h]
- mov ecx,[edx+3Ch]
- dec ecx
- lea eax,[ebp+ecx]
- not ecx
- and eax,ecx
- mov [ebx+10h],eax
- sub eax,ebp
- mov ecx,eax
- xor al,al
- rep stos byte [edi]
- mov eax,[code_start]
- sub eax,[stub_size]
- sub [ebx+14h],eax
- mov ecx,[ebx+10h]
- test byte [ebx+24h],20h
- jz pe_code_sum_ok
- add [edx+1Ch],ecx
- cmp dword [edx+2Ch],0
- jne pe_code_sum_ok
- mov eax,[ebx+0Ch]
- mov [edx+2Ch],eax
- pe_code_sum_ok:
- test byte [ebx+24h],40h
- jz pe_data_sum_ok
- add [edx+20h],ecx
- test [format_flags],4
- jnz pe_data_sum_ok
- cmp dword [edx+30h],0
- jne pe_data_sum_ok
- mov eax,[ebx+0Ch]
- mov [edx+30h],eax
- pe_data_sum_ok:
- mov eax,[ebx+8]
- or eax,eax
- jz udata_ok
- cmp dword [ebx+10h],0
- jne udata_ok
- or byte [ebx+24h],80h
- add [edx+24h],ecx
- udata_ok:
- mov ecx,[edx+38h]
- dec ecx
- add eax,ecx
- not ecx
- and eax,ecx
- add eax,[ebx+0Ch]
- add ebx,28h
- mov [current_section],ebx
- inc word [number_of_sections]
- jz format_limitations_exceeded
- ret
-data_directive:
- cmp [output_format],3
- jne illegal_instruction
- lods byte [esi]
- cmp al,1Ah
- je predefined_data_type
- cmp al,'('
- jne invalid_argument
- call get_byte_value
- cmp al,16
- jb data_type_ok
- jmp invalid_value
- predefined_data_type:
- movzx eax,byte [esi]
- inc esi
- data_type_ok:
- mov ebx,[current_section]
- mov ecx,edi
- sub ecx,[ebx+14h]
- add ecx,[ebx+0Ch]
- mov edx,[code_start]
- test [format_flags],4
- jnz peplus_data
- xchg ecx,[edx+78h+eax*8]
- jmp init_pe_data
- peplus_data:
- xchg ecx,[edx+88h+eax*8]
- init_pe_data:
- or ecx,ecx
- jnz data_already_defined
- call allocate_structure_data
- mov word [ebx],data_directive-instruction_handler
- mov [ebx+2],al
- mov edx,[current_line]
- mov [ebx+4],edx
- call generate_pe_data
- jmp instruction_assembled
- end_data:
- cmp [output_format],3
- jne illegal_instruction
- call find_structure_data
- jc unexpected_instruction
- movzx eax,byte [ebx+2]
- mov edx,[current_section]
- mov ecx,edi
- sub ecx,[edx+14h]
- add ecx,[edx+0Ch]
- mov edx,[code_start]
- test [format_flags],4
- jnz end_peplus_data
- sub ecx,[edx+78h+eax*8]
- mov [edx+78h+eax*8+4],ecx
- jmp remove_structure_data
- end_peplus_data:
- sub ecx,[edx+88h+eax*8]
- mov [edx+88h+eax*8+4],ecx
- jmp remove_structure_data
-pe_entry:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- test [format_flags],8
- jnz pe64_entry
- call get_dword_value
- mov bl,2
- bt [resolver_flags],0
- jc check_pe_entry_label_type
- xor bl,bl
- check_pe_entry_label_type:
- cmp [value_type],bl
- je pe_entry_ok
- call recoverable_invalid_address
- pe_entry_ok:
- cdq
- test [format_flags],4
- jnz pe64_entry_type_ok
- mov edx,[code_start]
- sub eax,[edx+34h]
- mov [edx+28h],eax
- jmp instruction_assembled
- pe64_entry:
- call get_qword_value
- mov bl,4
- bt [resolver_flags],0
- jc check_pe64_entry_label_type
- xor bl,bl
- check_pe64_entry_label_type:
- cmp [value_type],bl
- je pe64_entry_type_ok
- call recoverable_invalid_address
- pe64_entry_type_ok:
- mov ecx,[code_start]
- sub eax,[ecx+30h]
- sbb edx,[ecx+34h]
- jz pe64_entry_range_ok
- call recoverable_overflow
- pe64_entry_range_ok:
- mov [ecx+28h],eax
- jmp instruction_assembled
-pe_stack:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- test [format_flags],4
- jnz peplus_stack
- call get_count_value
- mov edx,[code_start]
- mov [edx+60h],eax
- cmp byte [esi],','
- jne default_stack_commit
- lods byte [esi]
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov edx,[code_start]
- mov [edx+64h],eax
- cmp eax,[edx+60h]
- ja value_out_of_range
- jmp instruction_assembled
- default_stack_commit:
- mov dword [edx+64h],1000h
- mov eax,[edx+60h]
- cmp eax,1000h
- ja instruction_assembled
- mov dword [edx+64h],eax
- jmp instruction_assembled
- peplus_stack:
- call get_qword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov ecx,[code_start]
- mov [ecx+60h],eax
- mov [ecx+64h],edx
- cmp byte [esi],','
- jne default_peplus_stack_commit
- lods byte [esi]
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_qword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov ecx,[code_start]
- mov [ecx+68h],eax
- mov [ecx+6Ch],edx
- cmp edx,[ecx+64h]
- ja value_out_of_range
- jb instruction_assembled
- cmp eax,[ecx+60h]
- ja value_out_of_range
- jmp instruction_assembled
- default_peplus_stack_commit:
- mov dword [ecx+68h],1000h
- cmp dword [ecx+64h],0
- jne instruction_assembled
- mov eax,[ecx+60h]
- cmp eax,1000h
- ja instruction_assembled
- mov dword [ecx+68h],eax
- jmp instruction_assembled
-pe_heap:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- test [format_flags],4
- jnz peplus_heap
- call get_count_value
- mov edx,[code_start]
- mov [edx+68h],eax
- cmp byte [esi],','
- jne instruction_assembled
- lods byte [esi]
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_count_value
- mov edx,[code_start]
- mov [edx+6Ch],eax
- cmp eax,[edx+68h]
- ja value_out_of_range
- jmp instruction_assembled
- peplus_heap:
- call get_qword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov ecx,[code_start]
- mov [ecx+70h],eax
- mov [ecx+74h],edx
- cmp byte [esi],','
- jne instruction_assembled
- lods byte [esi]
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- call get_qword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov ecx,[code_start]
- mov [ecx+78h],eax
- mov [ecx+7Ch],edx
- cmp edx,[ecx+74h]
- ja value_out_of_range
- jb instruction_assembled
- cmp eax,[ecx+70h]
- ja value_out_of_range
- jmp instruction_assembled
-mark_pe_relocation:
- push eax ebx
- test [format_flags],4
- jz check_standard_pe_relocation_type
- cmp [value_type],4
- je pe_relocation_type_ok
- check_standard_pe_relocation_type:
- cmp [value_type],2
- je pe_relocation_type_ok
- call recoverable_misuse
- pe_relocation_type_ok:
- mov ebx,[current_section]
- mov eax,edi
- sub eax,[ebx+14h]
- add eax,[ebx+0Ch]
- mov ebx,[free_additional_memory]
- inc [number_of_relocations]
- add ebx,5
- cmp ebx,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],ebx
- mov [ebx-5],eax
- cmp [value_type],2
- je fixup_32bit
- mov byte [ebx-1],0Ah
- jmp fixup_ok
- fixup_32bit:
- mov byte [ebx-1],3
- fixup_ok:
- pop ebx eax
- ret
-generate_pe_data:
- cmp al,2
- je make_pe_resource
- cmp al,5
- je make_pe_fixups
- ret
-make_pe_fixups:
- mov edx,[code_start]
- and byte [edx+16h],not 1
- or byte [edx+5Eh],40h
- bts [resolver_flags],0
- jc fixups_ready
- or [next_pass_needed],-1
- fixups_ready:
- and [last_fixup_base],0
- call make_fixups
- xchg eax,[actual_fixups_size]
- sub eax,[actual_fixups_size]
- ja reserve_forward_fixups
- xor eax,eax
- reserve_forward_fixups:
- mov [reserved_fixups],edi
- add edi,eax
- mov [reserved_fixups_size],eax
- ret
- make_fixups:
- push esi
- xor ecx,ecx
- xchg ecx,[number_of_relocations]
- mov esi,[free_additional_memory]
- lea eax,[ecx*5]
- sub esi,eax
- mov [free_additional_memory],esi
- mov edx,[last_fixup_base]
- mov ebx,[last_fixup_header]
- mov ebp,edi
- jecxz fixups_done
- make_fixup:
- cmp [esi],edx
- jb store_fixup
- mov eax,edi
- sub eax,ebp
- test eax,11b
- jz fixups_block
- xor ax,ax
- stos word [edi]
- add dword [ebx],2
- fixups_block:
- mov eax,edx
- add edx,1000h
- cmp [esi],edx
- jae fixups_block
- stos dword [edi]
- mov ebx,edi
- mov eax,8
- stos dword [edi]
- store_fixup:
- add dword [ebx],2
- mov ah,[esi+1]
- and ah,0Fh
- mov al,[esi+4]
- shl al,4
- or ah,al
- mov al,[esi]
- stos word [edi]
- add esi,5
- loop make_fixup
- fixups_done:
- mov [last_fixup_base],edx
- mov [last_fixup_header],ebx
- pop esi
- mov eax,edi
- sub eax,ebp
- ret
-make_pe_resource:
- cmp byte [esi],82h
- jne resource_done
- inc esi
- lods word [esi]
- cmp ax,'('
- jne invalid_argument
- lods dword [esi]
- mov edx,esi
- lea esi,[esi+eax+1]
- cmp [next_pass_needed],0
- je resource_from_file
- cmp [current_pass],0
- jne reserve_space_for_resource
- and [resource_size],0
- reserve_space_for_resource:
- add edi,[resource_size]
- cmp edi,[tagged_blocks]
- ja out_of_memory
- jmp resource_done
- resource_from_file:
- push esi
- mov esi,edx
- call open_binary_file
- push ebx
- mov esi,[free_additional_memory]
- lea eax,[esi+20h]
- cmp eax,[structures_buffer]
- ja out_of_memory
- mov edx,esi
- mov ecx,20h
- call read
- jc invalid_file_format
- xor eax,eax
- cmp [esi],eax
- jne invalid_file_format
- mov ax,0FFFFh
- cmp [esi+8],eax
- jne invalid_file_format
- cmp [esi+12],eax
- jne invalid_file_format
- mov eax,20h
- cmp [esi+4],eax
- jne invalid_file_format
- read_resource_headers:
- test eax,11b
- jz resource_file_alignment_ok
- mov edx,4
- and eax,11b
- sub edx,eax
- mov al,1
- call lseek
- jc resource_headers_ok
- resource_file_alignment_ok:
- mov [esi],eax
- lea edx,[esi+12]
- mov ecx,8
- call read
- jc resource_headers_ok
- mov ecx,[esi+16]
- add [esi],ecx
- lea edx,[esi+20]
- sub ecx,8
- mov [esi+16],ecx
- lea eax,[edx+ecx]
- cmp eax,[structures_buffer]
- ja out_of_memory
- call read
- jc invalid_file_format
- mov edx,[esi]
- add edx,[esi+12]
- mov eax,[esi+16]
- lea ecx,[esi+20]
- lea esi,[ecx+eax]
- add ecx,2
- cmp word [ecx-2],0FFFFh
- je resource_header_type_ok
- check_resource_header_type:
- cmp ecx,esi
- jae invalid_file_format
- cmp word [ecx],0
- je resource_header_type_ok
- add ecx,2
- jmp check_resource_header_type
- resource_header_type_ok:
- add ecx,2
- cmp word [ecx],0FFFFh
- je resource_header_name_ok
- check_resource_header_name:
- cmp ecx,esi
- jae invalid_file_format
- cmp word [ecx],0
- je resource_header_name_ok
- add ecx,2
- jmp check_resource_header_name
- resource_header_name_ok:
- xor al,al
- call lseek
- jnc read_resource_headers
- resource_headers_ok:
- cmp esi,[free_additional_memory]
- je invalid_file_format
- xor eax,eax
- mov [esi],eax
- mov [resource_data],edi
- lea eax,[edi+16]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- stos dword [edi]
- call make_timestamp
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- xor ebx,ebx
- make_type_name_directory:
- mov esi,[free_additional_memory]
- xor edx,edx
- find_type_name:
- cmp dword [esi],0
- je type_name_ok
- add esi,20
- cmp word [esi],0FFFFh
- je check_next_type_name
- or ebx,ebx
- jz check_this_type_name
- xor ecx,ecx
- compare_with_previous_type_name:
- mov ax,[esi+ecx]
- cmp ax,[ebx+ecx]
- ja check_this_type_name
- jb check_next_type_name
- add ecx,2
- mov ax,[esi+ecx]
- or ax,[ebx+ecx]
- jnz compare_with_previous_type_name
- jmp check_next_type_name
- check_this_type_name:
- or edx,edx
- jz type_name_found
- xor ecx,ecx
- compare_with_current_type_name:
- mov ax,[esi+ecx]
- cmp ax,[edx+ecx]
- ja check_next_type_name
- jb type_name_found
- add ecx,2
- mov ax,[esi+ecx]
- or ax,[edx+ecx]
- jnz compare_with_current_type_name
- jmp same_type_name
- type_name_found:
- mov edx,esi
- same_type_name:
- mov [esi-16],edi
- check_next_type_name:
- mov eax,[esi-4]
- add esi,eax
- jmp find_type_name
- type_name_ok:
- or edx,edx
- jz type_name_directory_done
- mov ebx,edx
- make_type_name_entry:
- mov eax,[resource_data]
- inc word [eax+12]
- lea eax,[edi+8]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,ebx
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- jmp make_type_name_directory
- type_name_directory_done:
- mov ebx,-1
- make_type_id_directory:
- mov esi,[free_additional_memory]
- mov edx,10000h
- find_type_id:
- cmp dword [esi],0
- je type_id_ok
- add esi,20
- cmp word [esi],0FFFFh
- jne check_next_type_id
- movzx eax,word [esi+2]
- cmp eax,ebx
- jle check_next_type_id
- cmp eax,edx
- jg check_next_type_id
- mov edx,eax
- mov [esi-16],edi
- check_next_type_id:
- mov eax,[esi-4]
- add esi,eax
- jmp find_type_id
- type_id_ok:
- cmp edx,10000h
- je type_id_directory_done
- mov ebx,edx
- make_type_id_entry:
- mov eax,[resource_data]
- inc word [eax+14]
- lea eax,[edi+8]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,ebx
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- jmp make_type_id_directory
- type_id_directory_done:
- mov esi,[resource_data]
- add esi,10h
- mov ecx,[esi-4]
- or cx,cx
- jz resource_directories_ok
- make_resource_directories:
- push ecx
- push edi
- mov edx,edi
- sub edx,[resource_data]
- bts edx,31
- mov [esi+4],edx
- lea eax,[edi+16]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- stos dword [edi]
- call make_timestamp
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov ebp,esi
- xor ebx,ebx
- make_resource_name_directory:
- mov esi,[free_additional_memory]
- xor edx,edx
- find_resource_name:
- cmp dword [esi],0
- je resource_name_ok
- push esi
- cmp [esi+4],ebp
- jne check_next_resource_name
- add esi,20
- call skip_resource_name
- cmp word [esi],0FFFFh
- je check_next_resource_name
- or ebx,ebx
- jz check_this_resource_name
- xor ecx,ecx
- compare_with_previous_resource_name:
- mov ax,[esi+ecx]
- cmp ax,[ebx+ecx]
- ja check_this_resource_name
- jb check_next_resource_name
- add ecx,2
- mov ax,[esi+ecx]
- or ax,[ebx+ecx]
- jnz compare_with_previous_resource_name
- jmp check_next_resource_name
- skip_resource_name:
- cmp word [esi],0FFFFh
- jne skip_unicode_string
- add esi,4
- ret
- skip_unicode_string:
- add esi,2
- cmp word [esi-2],0
- jne skip_unicode_string
- ret
- check_this_resource_name:
- or edx,edx
- jz resource_name_found
- xor ecx,ecx
- compare_with_current_resource_name:
- mov ax,[esi+ecx]
- cmp ax,[edx+ecx]
- ja check_next_resource_name
- jb resource_name_found
- add ecx,2
- mov ax,[esi+ecx]
- or ax,[edx+ecx]
- jnz compare_with_current_resource_name
- jmp same_resource_name
- resource_name_found:
- mov edx,esi
- same_resource_name:
- mov eax,[esp]
- mov [eax+8],edi
- check_next_resource_name:
- pop esi
- mov eax,[esi+16]
- lea esi,[esi+20+eax]
- jmp find_resource_name
- resource_name_ok:
- or edx,edx
- jz resource_name_directory_done
- mov ebx,edx
- make_resource_name_entry:
- mov eax,[esp]
- inc word [eax+12]
- lea eax,[edi+8]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,ebx
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- jmp make_resource_name_directory
- resource_name_directory_done:
- mov ebx,-1
- make_resource_id_directory:
- mov esi,[free_additional_memory]
- mov edx,10000h
- find_resource_id:
- cmp dword [esi],0
- je resource_id_ok
- push esi
- cmp [esi+4],ebp
- jne check_next_resource_id
- add esi,20
- call skip_resource_name
- cmp word [esi],0FFFFh
- jne check_next_resource_id
- movzx eax,word [esi+2]
- cmp eax,ebx
- jle check_next_resource_id
- cmp eax,edx
- jg check_next_resource_id
- mov edx,eax
- mov eax,[esp]
- mov [eax+8],edi
- check_next_resource_id:
- pop esi
- mov eax,[esi+16]
- lea esi,[esi+20+eax]
- jmp find_resource_id
- resource_id_ok:
- cmp edx,10000h
- je resource_id_directory_done
- mov ebx,edx
- make_resource_id_entry:
- mov eax,[esp]
- inc word [eax+14]
- lea eax,[edi+8]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,ebx
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- jmp make_resource_id_directory
- resource_id_directory_done:
- pop eax
- mov esi,ebp
- pop ecx
- add esi,8
- dec cx
- jnz make_resource_directories
- resource_directories_ok:
- shr ecx,16
- jnz make_resource_directories
- mov esi,[resource_data]
- add esi,10h
- movzx eax,word [esi-4]
- movzx edx,word [esi-2]
- add eax,edx
- lea esi,[esi+eax*8]
- push edi ; address of language directories
- update_resource_directories:
- cmp esi,[esp]
- je resource_directories_updated
- add esi,10h
- mov ecx,[esi-4]
- or cx,cx
- jz language_directories_ok
- make_language_directories:
- push ecx
- push edi
- mov edx,edi
- sub edx,[resource_data]
- bts edx,31
- mov [esi+4],edx
- lea eax,[edi+16]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- stos dword [edi]
- call make_timestamp
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov ebp,esi
- mov ebx,-1
- make_language_id_directory:
- mov esi,[free_additional_memory]
- mov edx,10000h
- find_language_id:
- cmp dword [esi],0
- je language_id_ok
- push esi
- cmp [esi+8],ebp
- jne check_next_language_id
- add esi,20
- mov eax,esi
- call skip_resource_name
- call skip_resource_name
- neg eax
- add eax,esi
- and eax,11b
- add esi,eax
- get_language_id:
- movzx eax,word [esi+6]
- cmp eax,ebx
- jle check_next_language_id
- cmp eax,edx
- jge check_next_language_id
- mov edx,eax
- mov eax,[esp]
- mov dword [value],eax
- check_next_language_id:
- pop esi
- mov eax,[esi+16]
- lea esi,[esi+20+eax]
- jmp find_language_id
- language_id_ok:
- cmp edx,10000h
- je language_id_directory_done
- mov ebx,edx
- make_language_id_entry:
- mov eax,[esp]
- inc word [eax+14]
- lea eax,[edi+8]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,ebx
- stos dword [edi]
- mov eax,dword [value]
- stos dword [edi]
- jmp make_language_id_directory
- language_id_directory_done:
- pop eax
- mov esi,ebp
- pop ecx
- add esi,8
- dec cx
- jnz make_language_directories
- language_directories_ok:
- shr ecx,16
- jnz make_language_directories
- jmp update_resource_directories
- resource_directories_updated:
- mov esi,[resource_data]
- push edi
- make_name_strings:
- add esi,10h
- movzx eax,word [esi-2]
- movzx ecx,word [esi-4]
- add eax,ecx
- lea eax,[esi+eax*8]
- push eax
- or ecx,ecx
- jz string_entries_processed
- process_string_entries:
- push ecx
- mov edx,edi
- sub edx,[resource_data]
- bts edx,31
- xchg [esi],edx
- mov ebx,edi
- xor ax,ax
- stos word [edi]
- copy_string_data:
- lea eax,[edi+2]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov ax,[edx]
- or ax,ax
- jz string_data_copied
- stos word [edi]
- inc word [ebx]
- add edx,2
- jmp copy_string_data
- string_data_copied:
- add esi,8
- pop ecx
- loop process_string_entries
- string_entries_processed:
- pop esi
- cmp esi,[esp]
- jb make_name_strings
- mov eax,edi
- sub eax,[resource_data]
- test al,11b
- jz resource_strings_alignment_ok
- xor ax,ax
- stos word [edi]
- resource_strings_alignment_ok:
- pop edx
- pop ebx ; address of language directories
- mov ebp,edi
- update_language_directories:
- add ebx,10h
- movzx eax,word [ebx-2]
- movzx ecx,word [ebx-4]
- add ecx,eax
- make_data_records:
- push ecx
- mov esi,edi
- sub esi,[resource_data]
- xchg esi,[ebx+4]
- lea eax,[edi+16]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- mov eax,esi
- stos dword [edi]
- mov eax,[esi+12]
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- pop ecx
- add ebx,8
- loop make_data_records
- cmp ebx,edx
- jb update_language_directories
- pop ebx ; file handle
- mov esi,ebp
- mov ebp,edi
- update_data_records:
- push ebp
- mov ecx,edi
- mov eax,[current_section]
- sub ecx,[eax+14h]
- add ecx,[eax+0Ch]
- xchg ecx,[esi]
- mov edx,[ecx]
- xor al,al
- call lseek
- mov edx,edi
- mov ecx,[esi+4]
- add edi,ecx
- cmp edi,[tagged_blocks]
- ja out_of_memory
- call read
- mov eax,edi
- sub eax,[resource_data]
- and eax,11b
- jz resource_data_alignment_ok
- mov ecx,4
- sub ecx,eax
- xor al,al
- rep stos byte [edi]
- resource_data_alignment_ok:
- pop ebp
- add esi,16
- cmp esi,ebp
- jb update_data_records
- pop esi
- call close
- mov eax,edi
- sub eax,[resource_data]
- mov [resource_size],eax
- resource_done:
- ret
-close_pe:
- call close_pe_section
- mov edx,[code_start]
- mov [edx+50h],eax
- call make_timestamp
- mov edx,[code_start]
- mov [edx+8],eax
- mov eax,[number_of_sections]
- mov [edx+6],ax
- imul eax,28h
- movzx ecx,word [edx+14h]
- lea eax,[eax+18h+ecx]
- add eax,[stub_size]
- mov ecx,[edx+3Ch]
- dec ecx
- add eax,ecx
- not ecx
- and eax,ecx
- cmp eax,[edx+54h]
- je pe_sections_ok
- or [next_pass_needed],-1
- pe_sections_ok:
- xor ecx,ecx
- add edx,78h
- test [format_flags],4
- jz process_directories
- add edx,10h
- process_directories:
- mov eax,[edx+ecx*8]
- or eax,eax
- jz directory_ok
- cmp dword [edx+ecx*8+4],-1
- jne directory_ok
- section_data:
- mov ebx,[edx+ecx*8]
- mov eax,[ebx+0Ch]
- mov [edx+ecx*8],eax ; directory rva
- mov eax,[ebx+8]
- mov [edx+ecx*8+4],eax ; directory size
- directory_ok:
- inc cl
- cmp cl,10h
- jb process_directories
- cmp dword [edx+5*8],0
- jne finish_pe_relocations
- mov eax,[number_of_relocations]
- shl eax,2
- sub [free_additional_memory],eax
- btr [resolver_flags],0
- jnc pe_relocations_ok
- or [next_pass_needed],-1
- jmp pe_relocations_ok
- finish_pe_relocations:
- push edi
- mov edi,[reserved_fixups]
- call make_fixups
- pop edi
- add [actual_fixups_size],eax
- cmp eax,[reserved_fixups_size]
- je pe_relocations_ok
- or [next_pass_needed],-1
- pe_relocations_ok:
- mov ebx,[code_start]
- sub ebx,[stub_size]
- mov ecx,edi
- sub ecx,ebx
- mov ebp,ecx
- shr ecx,1
- xor eax,eax
- cdq
- calculate_checksum:
- mov dx,[ebx]
- add eax,edx
- mov dx,ax
- shr eax,16
- add eax,edx
- add ebx,2
- loop calculate_checksum
- add eax,ebp
- mov ebx,[code_start]
- mov [ebx+58h],eax
- ret
-
-format_coff:
- mov eax,[additional_memory]
- mov [symbols_stream],eax
- mov ebx,eax
- add eax,20h
- cmp eax,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],eax
- xor eax,eax
- mov [ebx],al
- mov [ebx+4],eax
- mov [ebx+8],edi
- mov al,4
- mov [ebx+10h],eax
- mov al,60h
- bt [format_flags],0
- jnc flat_section_flags_ok
- or eax,0E0000000h
- flat_section_flags_ok:
- mov dword [ebx+14h],eax
- mov [current_section],ebx
- xor eax,eax
- mov [number_of_sections],eax
- 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
-coff_section:
- call close_coff_section
- mov ebx,[free_additional_memory]
- lea eax,[ebx+20h]
- cmp eax,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],eax
- mov [current_section],ebx
- inc [number_of_sections]
- xor eax,eax
- mov [ebx],al
- mov [ebx+8],edi
- mov [ebx+10h],eax
- mov [ebx+14h],eax
- 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
- mov [ebx+4],esi
- mov ecx,[esi]
- lea esi,[esi+4+ecx+1]
- cmp ecx,8
- ja name_too_long
- coff_section_flags:
- cmp byte [esi],8Ch
- je coff_section_alignment
- cmp byte [esi],19h
- jne coff_section_settings_ok
- inc esi
- lods byte [esi]
- bt [format_flags],0
- jc coff_section_flag_ok
- cmp al,7
- ja invalid_argument
- coff_section_flag_ok:
- mov cl,al
- mov eax,1
- shl eax,cl
- test dword [ebx+14h],eax
- jnz setting_already_specified
- or dword [ebx+14h],eax
- jmp coff_section_flags
- coff_section_alignment:
- bt [format_flags],0
- jnc invalid_argument
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- push ebx
- call get_count_value
- pop ebx
- mov edx,eax
- dec edx
- test eax,edx
- jnz invalid_value
- or eax,eax
- jz invalid_value
- cmp eax,2000h
- ja invalid_value
- bsf edx,eax
- inc edx
- shl edx,20
- or [ebx+14h],edx
- xchg [ebx+10h],eax
- or eax,eax
- jnz setting_already_specified
- jmp coff_section_flags
- coff_section_settings_ok:
- cmp dword [ebx+10h],0
- jne instruction_assembled
- mov dword [ebx+10h],4
- bt [format_flags],0
- jnc instruction_assembled
- or dword [ebx+14h],300000h
- jmp instruction_assembled
- close_coff_section:
- mov ebx,[current_section]
- mov eax,edi
- mov edx,[ebx+8]
- sub eax,edx
- mov [ebx+0Ch],eax
- xor eax,eax
- xchg [undefined_data_end],eax
- cmp eax,edi
- jne coff_section_ok
- cmp edx,[undefined_data_start]
- jne coff_section_ok
- mov edi,edx
- or byte [ebx+14h],80h
- coff_section_ok:
- ret
-mark_coff_relocation:
- cmp [value_type],3
- je coff_relocation_relative
- push ebx eax
- test [format_flags],8
- jnz coff_64bit_relocation
- mov al,6
- cmp [value_type],2
- je coff_relocation
- cmp [value_type],5
- jne invalid_use_of_symbol
- inc al
- jmp coff_relocation
- coff_64bit_relocation:
- mov al,1
- cmp [value_type],4
- je coff_relocation
- mov al,2
- cmp [value_type],2
- je coff_relocation
- cmp [value_type],5
- jne invalid_use_of_symbol
- inc al
- jmp coff_relocation
- coff_relocation_relative:
- push ebx
- bt [format_flags],0
- jnc relative_ok
- mov ebx,[current_section]
- mov ebx,[ebx+8]
- sub ebx,edi
- 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 byte [ebx+9],2
- jne invalid_use_of_symbol
- jmp coff_relocation
- relative_coff_64bit_relocation:
- mov al,4
- cmp byte [ebx+9],4
- jne invalid_use_of_symbol
- coff_relocation:
- mov ebx,[free_additional_memory]
- add ebx,0Ch
- cmp ebx,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],ebx
- mov byte [ebx-0Ch],al
- mov eax,[current_section]
- mov eax,[eax+8]
- neg eax
- add eax,edi
- mov [ebx-0Ch+4],eax
- mov eax,[symbol_identifier]
- mov [ebx-0Ch+8],eax
- pop eax ebx
- ret
-close_coff:
- call close_coff_section
- cmp [next_pass_needed],0
- je coff_closed
- mov eax,[symbols_stream]
- mov [free_additional_memory],eax
- coff_closed:
- ret
-coff_formatter:
- sub edi,[code_start]
- mov [code_size],edi
- call prepare_default_section
- mov edi,[free_additional_memory]
- mov ebx,edi
- mov ecx,28h shr 2
- imul ecx,[number_of_sections]
- add ecx,14h shr 2
- lea eax,[edi+ecx*4]
- cmp eax,[structures_buffer]
- jae out_of_memory
- xor eax,eax
- rep stos dword [edi]
- mov word [ebx],14Ch
- test [format_flags],8
- jz coff_magic_ok
- mov word [ebx],8664h
- coff_magic_ok:
- mov word [ebx+12h],104h
- bt [format_flags],0
- jnc coff_flags_ok
- or byte [ebx+12h],80h
- coff_flags_ok:
- push ebx
- call make_timestamp
- pop ebx
- mov [ebx+4],eax
- mov eax,[number_of_sections]
- mov [ebx+2],ax
- mov esi,[symbols_stream]
- xor eax,eax
- xor ecx,ecx
- enumerate_symbols:
- cmp esi,[free_additional_memory]
- je symbols_enumerated
- mov dl,[esi]
- or dl,dl
- jz enumerate_section
- cmp dl,0C0h
- jae enumerate_public
- cmp dl,80h
- jae enumerate_extrn
- add esi,0Ch
- jmp enumerate_symbols
- enumerate_section:
- mov edx,eax
- shl edx,8
- mov [esi],edx
- inc eax
- inc ecx
- mov [esi+1Eh],cx
- add esi,20h
- jmp enumerate_symbols
- enumerate_public:
- mov edx,eax
- shl edx,8
- mov dl,[esi]
- mov [esi],edx
- mov edx,[esi+8]
- add esi,10h
- inc eax
- cmp byte [edx+11],0
- je enumerate_symbols
- mov edx,[edx+20]
- cmp byte [edx],0C0h
- jae enumerate_symbols
- cmp byte [edx],80h
- jb enumerate_symbols
- inc eax
- jmp enumerate_symbols
- enumerate_extrn:
- mov edx,eax
- shl edx,8
- mov dl,[esi]
- mov [esi],edx
- add esi,0Ch
- inc eax
- jmp enumerate_symbols
- prepare_default_section:
- mov ebx,[symbols_stream]
- cmp dword [ebx+0Ch],0
- jne default_section_ok
- cmp [number_of_sections],0
- je default_section_ok
- mov edx,ebx
- find_references_to_default_section:
- cmp ebx,[free_additional_memory]
- jne check_reference
- add [symbols_stream],20h
- ret
- check_reference:
- mov al,[ebx]
- or al,al
- jz skip_other_section
- cmp al,0C0h
- jae check_public_reference
- cmp al,80h
- jae next_reference
- cmp edx,[ebx+8]
- je default_section_ok
- next_reference:
- add ebx,0Ch
- jmp find_references_to_default_section
- check_public_reference:
- mov eax,[ebx+8]
- add ebx,10h
- test byte [eax+8],1
- jz find_references_to_default_section
- mov cx,[current_pass]
- cmp cx,[eax+16]
- jne find_references_to_default_section
- cmp edx,[eax+20]
- je default_section_ok
- jmp find_references_to_default_section
- skip_other_section:
- add ebx,20h
- jmp find_references_to_default_section
- default_section_ok:
- inc [number_of_sections]
- ret
- symbols_enumerated:
- mov [ebx+0Ch],eax
- mov ebp,edi
- sub ebp,ebx
- push ebp
- lea edi,[ebx+14h]
- mov esi,[symbols_stream]
- find_section:
- cmp esi,[free_additional_memory]
- je sections_finished
- mov al,[esi]
- or al,al
- jz section_found
- add esi,0Ch
- cmp al,0C0h
- jb find_section
- add esi,4
- jmp find_section
- section_found:
- push esi edi
- mov esi,[esi+4]
- or esi,esi
- jz default_section
- mov ecx,[esi]
- add esi,4
- rep movs byte [edi],[esi]
- jmp section_name_ok
- default_section:
- mov al,'.'
- stos byte [edi]
- mov eax,'flat'
- stos dword [edi]
- section_name_ok:
- pop edi esi
- mov eax,[esi+0Ch]
- mov [edi+10h],eax
- mov eax,[esi+14h]
- mov [edi+24h],eax
- test al,80h
- jnz section_ptr_ok
- mov eax,[esi+8]
- sub eax,[code_start]
- add eax,ebp
- mov [edi+14h],eax
- section_ptr_ok:
- mov ebx,[code_start]
- mov edx,[code_size]
- add ebx,edx
- add edx,ebp
- xor ecx,ecx
- add esi,20h
- find_relocations:
- cmp esi,[free_additional_memory]
- je section_relocations_done
- mov al,[esi]
- or al,al
- jz section_relocations_done
- cmp al,80h
- jb add_relocation
- cmp al,0C0h
- jb next_relocation
- add esi,10h
- jmp find_relocations
- add_relocation:
- lea eax,[ebx+0Ah]
- cmp eax,[tagged_blocks]
- ja out_of_memory
- mov eax,[esi+4]
- mov [ebx],eax
- mov eax,[esi+8]
- mov eax,[eax]
- shr eax,8
- mov [ebx+4],eax
- movzx ax,byte [esi]
- mov [ebx+8],ax
- add ebx,0Ah
- inc ecx
- next_relocation:
- add esi,0Ch
- jmp find_relocations
- section_relocations_done:
- cmp ecx,10000h
- jb section_relocations_count_16bit
- bt [format_flags],0
- jnc format_limitations_exceeded
- mov word [edi+20h],0FFFFh
- or dword [edi+24h],1000000h
- mov [edi+18h],edx
- push esi edi
- push ecx
- lea esi,[ebx-1]
- add ebx,0Ah
- lea edi,[ebx-1]
- imul ecx,0Ah
- std
- rep movs byte [edi],[esi]
- cld
- pop ecx
- inc esi
- inc ecx
- mov [esi],ecx
- xor eax,eax
- mov [esi+4],eax
- mov [esi+8],ax
- pop edi esi
- jmp section_relocations_ok
- section_relocations_count_16bit:
- mov [edi+20h],cx
- jcxz section_relocations_ok
- mov [edi+18h],edx
- section_relocations_ok:
- sub ebx,[code_start]
- mov [code_size],ebx
- add edi,28h
- jmp find_section
- sections_finished:
- mov edx,[free_additional_memory]
- mov ebx,[code_size]
- add ebp,ebx
- mov [edx+8],ebp
- add ebx,[code_start]
- mov edi,ebx
- mov ecx,[edx+0Ch]
- imul ecx,12h shr 1
- xor eax,eax
- shr ecx,1
- jnc zero_symbols_table
- stos word [edi]
- zero_symbols_table:
- rep stos dword [edi]
- mov edx,edi
- stos dword [edi]
- mov esi,[symbols_stream]
- make_symbols_table:
- cmp esi,[free_additional_memory]
- je symbols_table_ok
- mov al,[esi]
- cmp al,0C0h
- jae add_public_symbol
- cmp al,80h
- jae add_extrn_symbol
- or al,al
- jz add_section_symbol
- add esi,0Ch
- jmp make_symbols_table
- add_section_symbol:
- call store_symbol_name
- movzx eax,word [esi+1Eh]
- mov [ebx+0Ch],ax
- mov byte [ebx+10h],3
- add esi,20h
- add ebx,12h
- jmp make_symbols_table
- add_extrn_symbol:
- call store_symbol_name
- mov byte [ebx+10h],2
- add esi,0Ch
- add ebx,12h
- jmp make_symbols_table
- add_public_symbol:
- call store_symbol_name
- mov eax,[esi+0Ch]
- mov [current_line],eax
- mov eax,[esi+8]
- test byte [eax+8],1
- jz undefined_coff_public
- mov cx,[current_pass]
- cmp cx,[eax+16]
- jne undefined_coff_public
- mov cl,[eax+11]
- or cl,cl
- jz public_constant
- test [format_flags],8
- jnz check_64bit_public_symbol
- cmp cl,2
- je public_symbol_type_ok
- jmp invalid_use_of_symbol
- undefined_coff_public:
- mov [error_info],eax
- jmp undefined_symbol
- check_64bit_public_symbol:
- cmp cl,4
- jne invalid_use_of_symbol
- public_symbol_type_ok:
- mov ecx,[eax+20]
- cmp byte [ecx],80h
- je alias_symbol
- cmp byte [ecx],0
- jne invalid_use_of_symbol
- mov cx,[ecx+1Eh]
- mov [ebx+0Ch],cx
- public_symbol_section_ok:
- movzx ecx,byte [eax+9]
- shr cl,1
- and cl,1
- neg ecx
- cmp ecx,[eax+4]
- jne value_out_of_range
- xor ecx,[eax]
- js value_out_of_range
- mov eax,[eax]
- mov [ebx+8],eax
- mov al,2
- cmp byte [esi],0C0h
- je store_symbol_class
- inc al
- cmp byte [esi],0C1h
- je store_symbol_class
- mov al,105
- store_symbol_class:
- mov byte [ebx+10h],al
- add esi,10h
- add ebx,12h
- jmp make_symbols_table
- alias_symbol:
- bt [format_flags],0
- jnc invalid_use_of_symbol
- mov ecx,[eax]
- or ecx,[eax+4]
- jnz invalid_use_of_symbol
- mov byte [ebx+10h],69h
- mov byte [ebx+11h],1
- add ebx,12h
- mov ecx,[eax+20]
- mov ecx,[ecx]
- shr ecx,8
- mov [ebx],ecx
- mov byte [ebx+4],3
- add esi,10h
- add ebx,12h
- jmp make_symbols_table
- public_constant:
- mov word [ebx+0Ch],0FFFFh
- jmp public_symbol_section_ok
- symbols_table_ok:
- mov eax,edi
- sub eax,edx
- mov [edx],eax
- sub edi,[code_start]
- mov [code_size],edi
- and [written_size],0
- mov edx,[output_file]
- call create
- jc write_failed
- mov edx,[free_additional_memory]
- pop ecx
- add [written_size],ecx
- call write
- jc write_failed
- jmp write_output
- store_symbol_name:
- push esi
- mov esi,[esi+4]
- or esi,esi
- jz default_name
- lods dword [esi]
- mov ecx,eax
- cmp ecx,8
- ja add_string
- push edi
- mov edi,ebx
- rep movs byte [edi],[esi]
- pop edi esi
- ret
- default_name:
- mov dword [ebx],'.fla'
- mov dword [ebx+4],'t'
- pop esi
- ret
- add_string:
- mov eax,edi
- sub eax,edx
- mov [ebx+4],eax
- inc ecx
- rep movs byte [edi],[esi]
- pop esi
- ret
-
-format_elf:
- test [format_flags],8
- jnz format_elf64
- mov edx,edi
- mov ecx,34h shr 2
- lea eax,[edi+ecx*4]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- rep stos dword [edi]
- mov dword [edx],7Fh + 'ELF' shl 8
- mov al,1
- mov [edx+4],al
- mov [edx+5],al
- mov [edx+6],al
- mov [edx+14h],al
- mov byte [edx+12h],3
- mov byte [edx+28h],34h
- mov byte [edx+2Eh],28h
- mov [code_type],32
- mov byte [edx+10h],2
- cmp word [esi],1D19h
- je format_elf_exe
- mov byte [edx+10h],3
- cmp word [esi],021Eh
- je format_elf_exe
- elf_header_ok:
- mov byte [edx+10h],1
- mov eax,[additional_memory]
- mov [symbols_stream],eax
- mov ebx,eax
- add eax,20h
- cmp eax,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],eax
- xor eax,eax
- mov [current_section],ebx
- mov [number_of_sections],eax
- mov [ebx],al
- mov [ebx+4],eax
- mov [ebx+8],edi
- mov al,111b
- mov [ebx+14h],eax
- mov al,4
- mov [ebx+10h],eax
- 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:
- mov edx,edi
- mov ecx,40h shr 2
- lea eax,[edi+ecx*4]
- cmp eax,[tagged_blocks]
- jae out_of_memory
- xor eax,eax
- rep stos dword [edi]
- mov dword [edx],7Fh + 'ELF' shl 8
- mov al,1
- mov [edx+5],al
- mov [edx+6],al
- mov [edx+14h],al
- mov byte [edx+4],2
- mov byte [edx+12h],62
- mov byte [edx+34h],40h
- mov byte [edx+3Ah],40h
- mov [code_type],64
- mov byte [edx+10h],2
- cmp word [esi],1D19h
- je format_elf64_exe
- mov byte [edx+10h],3
- cmp word [esi],021Eh
- je format_elf64_exe
- jmp elf_header_ok
-elf_section:
- bt [format_flags],0
- jc illegal_instruction
- call close_coff_section
- mov ebx,[free_additional_memory]
- lea eax,[ebx+20h]
- cmp eax,[structures_buffer]
- jae out_of_memory
- mov [free_additional_memory],eax
- mov [current_section],ebx
- inc word [number_of_sections]
- jz format_limitations_exceeded
- xor eax,eax
- mov [ebx],al
- mov [ebx+8],edi
- mov [ebx+10h],eax
- mov al,10b
- mov [ebx+14h],eax
- 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
- mov [ebx+4],esi
- mov ecx,[esi]
- lea esi,[esi+4+ecx+1]
- elf_section_flags:
- cmp byte [esi],8Ch
- je elf_section_alignment
- cmp byte [esi],19h
- jne elf_section_settings_ok
- inc esi
- lods byte [esi]
- sub al,28
- xor al,11b
- test al,not 10b
- jnz invalid_argument
- mov cl,al
- mov al,1
- shl al,cl
- test byte [ebx+14h],al
- jnz setting_already_specified
- or byte [ebx+14h],al
- jmp elf_section_flags
- elf_section_alignment:
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- push ebx
- call get_count_value
- pop ebx
- mov edx,eax
- dec edx
- test eax,edx
- jnz invalid_value
- or eax,eax
- jz invalid_value
- xchg [ebx+10h],eax
- or eax,eax
- jnz setting_already_specified
- jmp elf_section_flags
- elf_section_settings_ok:
- cmp dword [ebx+10h],0
- jne instruction_assembled
- mov dword [ebx+10h],4
- test [format_flags],8
- jz instruction_assembled
- mov byte [ebx+10h],8
- jmp instruction_assembled
-mark_elf_relocation:
- test [format_flags],1
- jnz invalid_use_of_symbol
- push ebx
- mov ebx,[addressing_space]
- cmp [value_type],3
- je elf_relocation_relative
- cmp [value_type],7
- je elf_relocation_relative
- push eax
- cmp [value_type],5
- je elf_gotoff_relocation
- ja invalid_use_of_symbol
- mov al,1 ; R_386_32 / R_AMD64_64
- test [format_flags],8
- jz coff_relocation
- cmp [value_type],4
- je coff_relocation
- mov al,11 ; R_AMD64_32S
- jmp coff_relocation
- elf_gotoff_relocation:
- test [format_flags],8
- jnz invalid_use_of_symbol
- mov al,9 ; R_386_GOTOFF
- jmp coff_relocation
- elf_relocation_relative:
- cmp byte [ebx+9],0
- je invalid_use_of_symbol
- mov ebx,[current_section]
- mov ebx,[ebx+8]
- sub ebx,edi
- sub eax,ebx
- push eax
- mov al,2 ; R_386_PC32 / R_AMD64_PC32
- cmp [value_type],3
- je coff_relocation
- mov al,4 ; R_386_PLT32 / R_AMD64_PLT32
- jmp coff_relocation
-close_elf:
- bt [format_flags],0
- jc close_elf_exe
- call close_coff_section
- cmp [next_pass_needed],0
- je elf_closed
- mov eax,[symbols_stream]
- mov [free_additional_memory],eax
- elf_closed:
- ret
-elf_formatter:
- mov ecx,edi
- sub ecx,[code_start]
- neg ecx
- and ecx,111b
- test [format_flags],8
- jnz align_elf_structures
- and ecx,11b
- align_elf_structures:
- xor al,al
- rep stos byte [edi]
- push edi
- call prepare_default_section
- mov esi,[symbols_stream]
- mov edi,[free_additional_memory]
- xor eax,eax
- mov ecx,4
- rep stos dword [edi]
- test [format_flags],8
- jz find_first_section
- mov ecx,2
- rep stos dword [edi]
- find_first_section:
- mov al,[esi]
- or al,al
- jz first_section_found
- cmp al,0C0h
- jb skip_other_symbol
- add esi,4
- skip_other_symbol:
- add esi,0Ch
- jmp find_first_section
- first_section_found:
- mov ebx,esi
- mov ebp,esi
- add esi,20h
- xor ecx,ecx
- xor edx,edx
- find_next_section:
- cmp esi,[free_additional_memory]
- je make_section_symbol
- mov al,[esi]
- or al,al
- jz make_section_symbol
- cmp al,0C0h
- jae skip_public
- cmp al,80h
- jae skip_extrn
- or byte [ebx+14h],40h
- skip_extrn:
- add esi,0Ch
- jmp find_next_section
- skip_public:
- add esi,10h
- jmp find_next_section
- make_section_symbol:
- mov eax,edi
- xchg eax,[ebx+4]
- stos dword [edi]
- test [format_flags],8
- jnz elf64_section_symbol
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- call store_section_index
- jmp section_symbol_ok
- store_section_index:
- inc ecx
- mov eax,ecx
- shl eax,8
- mov [ebx],eax
- inc dx
- jz format_limitations_exceeded
- mov eax,edx
- shl eax,16
- mov al,3
- test byte [ebx+14h],40h
- jz section_index_ok
- or ah,-1
- inc dx
- jz format_limitations_exceeded
- section_index_ok:
- stos dword [edi]
- ret
- elf64_section_symbol:
- call store_section_index
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- stos dword [edi]
- stos dword [edi]
- section_symbol_ok:
- mov ebx,esi
- add esi,20h
- cmp ebx,[free_additional_memory]
- jne find_next_section
- inc dx
- jz format_limitations_exceeded
- mov [current_section],edx
- mov esi,[symbols_stream]
- find_other_symbols:
- cmp esi,[free_additional_memory]
- je elf_symbol_table_ok
- mov al,[esi]
- or al,al
- jz skip_section
- cmp al,0C0h
- jae make_public_symbol
- cmp al,80h
- jae make_extrn_symbol
- add esi,0Ch
- jmp find_other_symbols
- skip_section:
- add esi,20h
- jmp find_other_symbols
- make_public_symbol:
- mov eax,[esi+0Ch]
- mov [current_line],eax
- cmp byte [esi],0C0h
- jne invalid_argument
- mov ebx,[esi+8]
- test byte [ebx+8],1
- jz undefined_public
- mov ax,[current_pass]
- cmp ax,[ebx+16]
- jne undefined_public
- mov dl,[ebx+11]
- or dl,dl
- jz public_absolute
- mov eax,[ebx+20]
- cmp byte [eax],0
- jne invalid_use_of_symbol
- mov eax,[eax+4]
- test [format_flags],8
- jnz elf64_public
- cmp dl,2
- jne invalid_use_of_symbol
- mov dx,[eax+0Eh]
- jmp section_for_public_ok
- undefined_public:
- mov [error_info],ebx
- jmp undefined_symbol
- elf64_public:
- cmp dl,4
- jne invalid_use_of_symbol
- mov dx,[eax+6]
- jmp section_for_public_ok
- public_absolute:
- mov dx,0FFF1h
- section_for_public_ok:
- mov eax,[esi+4]
- stos dword [edi]
- test [format_flags],8
- jnz elf64_public_symbol
- movzx eax,byte [ebx+9]
- shr al,1
- and al,1
- neg eax
- cmp eax,[ebx+4]
- jne value_out_of_range
- xor eax,[ebx]
- js value_out_of_range
- mov eax,[ebx]
- stos dword [edi]
- xor eax,eax
- mov al,[ebx+10]
- stos dword [edi]
- mov eax,edx
- shl eax,16
- mov al,10h
- cmp byte [ebx+10],0
- je elf_public_function
- or al,1
- jmp store_elf_public_info
- elf_public_function:
- or al,2
- store_elf_public_info:
- stos dword [edi]
- jmp public_symbol_ok
- elf64_public_symbol:
- mov eax,edx
- shl eax,16
- mov al,10h
- cmp byte [ebx+10],0
- je elf64_public_function
- or al,1
- jmp store_elf64_public_info
- elf64_public_function:
- or al,2
- store_elf64_public_info:
- stos dword [edi]
- mov al,[ebx+9]
- shl eax,31-1
- xor eax,[ebx+4]
- js value_out_of_range
- mov eax,[ebx]
- stos dword [edi]
- mov eax,[ebx+4]
- stos dword [edi]
- mov al,[ebx+10]
- stos dword [edi]
- xor al,al
- stos dword [edi]
- public_symbol_ok:
- inc ecx
- mov eax,ecx
- shl eax,8
- mov al,0C0h
- mov [esi],eax
- add esi,10h
- jmp find_other_symbols
- make_extrn_symbol:
- mov eax,[esi+4]
- stos dword [edi]
- test [format_flags],8
- jnz elf64_extrn_symbol
- xor eax,eax
- stos dword [edi]
- mov eax,[esi+8]
- stos dword [edi]
- mov eax,10h
- stos dword [edi]
- jmp extrn_symbol_ok
- elf64_extrn_symbol:
- mov eax,10h
- stos dword [edi]
- xor al,al
- stos dword [edi]
- stos dword [edi]
- mov eax,[esi+8]
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- extrn_symbol_ok:
- inc ecx
- mov eax,ecx
- shl eax,8
- mov al,80h
- mov [esi],eax
- add esi,0Ch
- jmp find_other_symbols
- elf_symbol_table_ok:
- mov edx,edi
- mov ebx,[free_additional_memory]
- xor al,al
- stos byte [edi]
- add edi,16
- mov [edx+1],edx
- add ebx,10h
- test [format_flags],8
- jz make_string_table
- add ebx,8
- make_string_table:
- cmp ebx,edx
- je elf_string_table_ok
- test [format_flags],8
- jnz make_elf64_string
- cmp byte [ebx+0Dh],0
- je rel_prefix_ok
- mov byte [ebx+0Dh],0
- mov eax,'.rel'
- stos dword [edi]
- rel_prefix_ok:
- mov esi,edi
- sub esi,edx
- xchg esi,[ebx]
- add ebx,10h
- make_elf_string:
- or esi,esi
- jz default_string
- lods dword [esi]
- mov ecx,eax
- rep movs byte [edi],[esi]
- xor al,al
- stos byte [edi]
- jmp make_string_table
- make_elf64_string:
- cmp byte [ebx+5],0
- je elf64_rel_prefix_ok
- mov byte [ebx+5],0
- mov eax,'.rel'
- stos dword [edi]
- mov al,'a'
- stos byte [edi]
- elf64_rel_prefix_ok:
- mov esi,edi
- sub esi,edx
- xchg esi,[ebx]
- add ebx,18h
- jmp make_elf_string
- default_string:
- mov eax,'.fla'
- stos dword [edi]
- mov ax,'t'
- stos word [edi]
- jmp make_string_table
- elf_string_table_ok:
- mov [edx+1+8],edi
- mov ebx,[code_start]
- mov eax,edi
- sub eax,[free_additional_memory]
- xor ecx,ecx
- sub ecx,eax
- test [format_flags],8
- jnz finish_elf64_header
- and ecx,11b
- add eax,ecx
- mov [ebx+20h],eax
- mov eax,[current_section]
- inc ax
- jz format_limitations_exceeded
- mov [ebx+32h],ax
- inc ax
- jz format_limitations_exceeded
- mov [ebx+30h],ax
- jmp elf_header_finished
- finish_elf64_header:
- and ecx,111b
- add eax,ecx
- mov [ebx+28h],eax
- mov eax,[current_section]
- inc ax
- jz format_limitations_exceeded
- mov [ebx+3Eh],ax
- inc ax
- jz format_limitations_exceeded
- mov [ebx+3Ch],ax
- elf_header_finished:
- xor eax,eax
- add ecx,10*4
- rep stos byte [edi]
- test [format_flags],8
- jz elf_null_section_ok
- mov ecx,6*4
- rep stos byte [edi]
- elf_null_section_ok:
- mov esi,ebp
- xor ecx,ecx
- make_section_entry:
- mov ebx,edi
- mov eax,[esi+4]
- mov eax,[eax]
- stos dword [edi]
- mov eax,1
- cmp dword [esi+0Ch],0
- je bss_section
- test byte [esi+14h],80h
- jz section_type_ok
- bss_section:
- mov al,8
- section_type_ok:
- stos dword [edi]
- mov eax,[esi+14h]
- and al,3Fh
- call store_elf_machine_word
- xor eax,eax
- call store_elf_machine_word
- mov eax,[esi+8]
- mov [image_base],eax
- sub eax,[code_start]
- call store_elf_machine_word
- mov eax,[esi+0Ch]
- call store_elf_machine_word
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov eax,[esi+10h]
- call store_elf_machine_word
- xor eax,eax
- call store_elf_machine_word
- inc ecx
- add esi,20h
- xchg edi,[esp]
- mov ebp,edi
- convert_relocations:
- cmp esi,[free_additional_memory]
- je relocations_converted
- mov al,[esi]
- or al,al
- jz relocations_converted
- cmp al,80h
- jb make_relocation_entry
- cmp al,0C0h
- jb relocation_entry_ok
- add esi,10h
- jmp convert_relocations
- make_relocation_entry:
- test [format_flags],8
- jnz make_elf64_relocation_entry
- mov eax,[esi+4]
- stos dword [edi]
- mov eax,[esi+8]
- mov eax,[eax]
- mov al,[esi]
- stos dword [edi]
- jmp relocation_entry_ok
- make_elf64_relocation_entry:
- mov eax,[esi+4]
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- movzx eax,byte [esi]
- stos dword [edi]
- mov eax,[esi+8]
- mov eax,[eax]
- shr eax,8
- stos dword [edi]
- xor eax,eax
- push edx
- mov edx,[esi+4]
- add edx,[image_base]
- xchg eax,[edx]
- stos dword [edi]
- cmp byte [esi],1
- je addend_64bit
- pop edx
- sar eax,31
- stos dword [edi]
- jmp relocation_entry_ok
- addend_64bit:
- xor eax,eax
- xchg eax,[edx+4]
- stos dword [edi]
- pop edx
- relocation_entry_ok:
- add esi,0Ch
- jmp convert_relocations
- store_elf_machine_word:
- stos dword [edi]
- test [format_flags],8
- jz elf_machine_word_ok
- and dword [edi],0
- add edi,4
- elf_machine_word_ok:
- ret
- relocations_converted:
- cmp edi,ebp
- xchg edi,[esp]
- je rel_section_ok
- mov eax,[ebx]
- sub eax,4
- test [format_flags],8
- jz store_relocations_name_offset
- dec eax
- store_relocations_name_offset:
- stos dword [edi]
- test [format_flags],8
- jnz rela_section
- mov eax,9
- jmp store_relocations_type
- rela_section:
- mov eax,4
- store_relocations_type:
- stos dword [edi]
- xor al,al
- call store_elf_machine_word
- call store_elf_machine_word
- mov eax,ebp
- sub eax,[code_start]
- call store_elf_machine_word
- mov eax,[esp]
- sub eax,ebp
- call store_elf_machine_word
- mov eax,[current_section]
- stos dword [edi]
- mov eax,ecx
- stos dword [edi]
- inc ecx
- test [format_flags],8
- jnz finish_elf64_rela_section
- mov eax,4
- stos dword [edi]
- mov al,8
- stos dword [edi]
- jmp rel_section_ok
- finish_elf64_rela_section:
- mov eax,8
- stos dword [edi]
- xor al,al
- stos dword [edi]
- mov al,24
- stos dword [edi]
- xor al,al
- stos dword [edi]
- rel_section_ok:
- cmp esi,[free_additional_memory]
- jne make_section_entry
- pop eax
- mov ebx,[code_start]
- sub eax,ebx
- mov [code_size],eax
- mov ecx,20h
- test [format_flags],8
- jz adjust_elf_section_headers_offset
- mov ecx,28h
- adjust_elf_section_headers_offset:
- add [ebx+ecx],eax
- mov eax,1
- stos dword [edi]
- mov al,2
- stos dword [edi]
- xor al,al
- call store_elf_machine_word
- call store_elf_machine_word
- mov eax,[code_size]
- call store_elf_machine_word
- mov eax,[edx+1]
- sub eax,[free_additional_memory]
- call store_elf_machine_word
- mov eax,[current_section]
- inc eax
- stos dword [edi]
- mov eax,[number_of_sections]
- inc eax
- stos dword [edi]
- test [format_flags],8
- jnz finish_elf64_sym_section
- mov eax,4
- stos dword [edi]
- mov al,10h
- stos dword [edi]
- jmp sym_section_ok
- finish_elf64_sym_section:
- mov eax,8
- stos dword [edi]
- xor al,al
- stos dword [edi]
- mov al,18h
- stos dword [edi]
- xor al,al
- stos dword [edi]
- sym_section_ok:
- mov al,1+8
- stos dword [edi]
- mov al,3
- stos dword [edi]
- xor al,al
- call store_elf_machine_word
- call store_elf_machine_word
- mov eax,[edx+1]
- sub eax,[free_additional_memory]
- add eax,[code_size]
- call store_elf_machine_word
- mov eax,[edx+1+8]
- sub eax,[edx+1]
- call store_elf_machine_word
- xor eax,eax
- stos dword [edi]
- stos dword [edi]
- mov al,1
- call store_elf_machine_word
- xor eax,eax
- call store_elf_machine_word
- mov eax,'tab'
- mov dword [edx+1],'.sym'
- mov [edx+1+4],eax
- mov dword [edx+1+8],'.str'
- mov [edx+1+8+4],eax
- mov [resource_data],edx
- mov [written_size],0
- mov edx,[output_file]
- call create
- jc write_failed
- call write_code
- mov ecx,edi
- mov edx,[free_additional_memory]
- sub ecx,edx
- add [written_size],ecx
- call write
- jc write_failed
- jmp output_written
-
-format_elf_exe:
- add esi,2
- or [format_flags],1
- cmp byte [esi],'('
- jne elf_exe_brand_ok
- inc esi
- cmp byte [esi],'.'
- je invalid_value
- push edx
- call get_byte_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- pop edx
- mov [edx+7],al
- elf_exe_brand_ok:
- mov [image_base],8048000h
- cmp byte [esi],80h
- jne elf_exe_base_ok
- lods word [esi]
- cmp ah,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- push edx
- call get_dword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov [image_base],eax
- pop edx
- elf_exe_base_ok:
- mov byte [edx+2Ah],20h
- mov ebx,edi
- mov ecx,20h shr 2
- cmp [current_pass],0
- je init_elf_segments
- imul ecx,[number_of_sections]
- init_elf_segments:
- xor eax,eax
- rep stos dword [edi]
- and [number_of_sections],0
- mov byte [ebx],1
- mov word [ebx+1Ch],1000h
- mov byte [ebx+18h],111b
- mov ebp,[image_base]
- and dword [ebx+4],0
- mov [ebx+8],ebp
- mov [ebx+0Ch],ebp
- mov eax,edi
- sub eax,[code_start]
- add eax,ebp
- mov [edx+18h],eax
- and [image_base_high],0
- elf_exe_addressing_setup:
- call init_addressing_space
- call setup_elf_exe_labels_type
- mov eax,[code_start]
- xor edx,edx
- xor cl,cl
- sub eax,[image_base]
- sbb edx,[image_base_high]
- sbb cl,0
- mov [ebx],eax
- mov [ebx+4],edx
- mov [ebx+8],cl
- mov [symbols_stream],edi
- jmp format_defined
- format_elf64_exe:
- add esi,2
- or [format_flags],1
- cmp byte [esi],'('
- jne elf64_exe_brand_ok
- inc esi
- cmp byte [esi],'.'
- je invalid_value
- push edx
- call get_byte_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- pop edx
- mov [edx+7],al
- elf64_exe_brand_ok:
- mov [image_base],400000h
- and [image_base_high],0
- cmp byte [esi],80h
- jne elf64_exe_base_ok
- lods word [esi]
- cmp ah,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- push edx
- call get_qword_value
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov [image_base],eax
- mov [image_base_high],edx
- pop edx
- elf64_exe_base_ok:
- mov byte [edx+36h],38h
- mov ebx,edi
- mov ecx,38h shr 2
- cmp [current_pass],0
- je init_elf64_segments
- imul ecx,[number_of_sections]
- init_elf64_segments:
- xor eax,eax
- rep stos dword [edi]
- and [number_of_sections],0
- mov byte [ebx],1
- mov word [ebx+30h],1000h
- mov byte [ebx+4],111b
- mov ebp,[image_base]
- mov ecx,[image_base_high]
- and dword [ebx+8],0
- mov [ebx+10h],ebp
- mov [ebx+10h+4],ecx
- mov [ebx+18h],ebp
- mov [ebx+18h+4],ecx
- mov eax,edi
- sub eax,[code_start]
- add eax,ebp
- adc ecx,0
- mov [edx+18h],eax
- mov [edx+18h+4],ecx
- jmp elf_exe_addressing_setup
- setup_elf_exe_labels_type:
- mov eax,[code_start]
- cmp byte [eax+10h],3
- jne elf_exe_labels_type_ok
- mov byte [ebx+9],2
- test [format_flags],8
- jz elf_exe_labels_type_ok
- mov byte [ebx+9],4
- elf_exe_labels_type_ok:
- ret
-elf_entry:
- lods byte [esi]
- cmp al,'('
- jne invalid_argument
- cmp byte [esi],'.'
- je invalid_value
- test [format_flags],8
- jnz elf64_entry
- call get_dword_value
- mov edx,[code_start]
- mov [edx+18h],eax
- jmp instruction_assembled
- elf64_entry:
- call get_qword_value
- mov ebx,[code_start]
- mov [ebx+18h],eax
- mov [ebx+1Ch],edx
- jmp instruction_assembled
-elf_segment:
- bt [format_flags],0
- jnc illegal_instruction
- test [format_flags],8
- jnz elf64_segment
- call close_elf_segment
- push eax
- call create_addressing_space
- call setup_elf_exe_labels_type
- mov ebp,ebx
- mov ebx,[number_of_sections]
- shl ebx,5
- add ebx,[code_start]
- add ebx,34h
- cmp ebx,[symbols_stream]
- jb new_elf_segment
- mov ebx,[symbols_stream]
- sub ebx,20h
- or [next_pass_needed],-1
- new_elf_segment:
- mov byte [ebx],1
- and dword [ebx+18h],0
- mov word [ebx+1Ch],1000h
- elf_segment_flags:
- cmp byte [esi],1Eh
- je elf_segment_type
- cmp byte [esi],19h
- jne elf_segment_flags_ok
- lods word [esi]
- sub ah,28
- jbe invalid_argument
- cmp ah,1
- je mark_elf_segment_flag
- cmp ah,3
- ja invalid_argument
- xor ah,1
- cmp ah,2
- je mark_elf_segment_flag
- inc ah
- mark_elf_segment_flag:
- test [ebx+18h],ah
- jnz setting_already_specified
- or [ebx+18h],ah
- jmp elf_segment_flags
- elf_segment_type:
- cmp byte [ebx],1
- jne setting_already_specified
- lods word [esi]
- mov ecx,[number_of_sections]
- jecxz elf_segment_type_ok
- mov edx,[code_start]
- add edx,34h
- scan_elf_segment_types:
- cmp edx,[symbols_stream]
- jae elf_segment_type_ok
- cmp [edx],ah
- je data_already_defined
- add edx,20h
- loop scan_elf_segment_types
- elf_segment_type_ok:
- mov [ebx],ah
- mov word [ebx+1Ch],1
- cmp ah,50h
- jb elf_segment_flags
- or dword [ebx],6474E500h
- jmp elf_segment_flags
- elf_segment_flags_ok:
- pop edx
- cmp byte [ebx],1
- jne no_elf_segment_merging
- cmp [merge_segment],0
- jne merge_elf_segment
- no_elf_segment_merging:
- mov eax,edi
- sub eax,[code_start]
- mov [ebx+4],eax
- and eax,0FFFh
- add eax,edx
- mov [ebx+8],eax
- mov [ebx+0Ch],eax
- xor edx,edx
- elf_segment_addressing_setup:
- xor cl,cl
- not eax
- not edx
- not cl
- add eax,1
- adc edx,0
- adc cl,0
- add eax,edi
- adc edx,0
- adc cl,0
- mov [ds:ebp],eax
- mov [ds:ebp+4],edx
- mov [ds:ebp+8],cl
- inc [number_of_sections]
- jmp instruction_assembled
- merge_elf_segment:
- xor ecx,ecx
- xchg ecx,[merge_segment]
- cmp ecx,-1
- je merge_elf_header
- mov eax,[ecx+8]
- mov ecx,[ecx+4]
- elf_segment_separated_base:
- mov [ebx+8],eax
- mov [ebx+0Ch],eax
- mov [ebx+4],ecx
- sub eax,ecx
- add eax,edi
- sub eax,[code_start]
- xor edx,edx
- jmp elf_segment_addressing_setup
- merge_elf_header:
- mov eax,[image_base]
- xor ecx,ecx
- jmp elf_segment_separated_base
- close_elf_segment:
- cmp [number_of_sections],0
- jne finish_elf_segment
- cmp edi,[symbols_stream]
- jne first_elf_segment_ok
- or [merge_segment],-1
- mov eax,[image_base]
- ret
- first_elf_segment_ok:
- and [merge_segment],0
- inc [number_of_sections]
- finish_elf_segment:
- mov ebx,[number_of_sections]
- dec ebx
- shl ebx,5
- add ebx,[code_start]
- add ebx,34h
- mov eax,edi
- sub eax,[code_start]
- sub eax,[ebx+4]
- mov edx,edi
- cmp edi,[undefined_data_end]
- jne elf_segment_size_ok
- cmp byte [ebx],1
- jne elf_segment_size_ok
- mov edi,[undefined_data_start]
- elf_segment_size_ok:
- mov [ebx+14h],eax
- add eax,edi
- sub eax,edx
- mov [ebx+10h],eax
- and [undefined_data_end],0
- mov eax,[ebx+8]
- cmp byte [ebx],1
- je elf_segment_position_move_and_align
- cmp [merge_segment],0
- jne elf_segment_position_move
- cmp byte [ebx],4
- je elf_segment_position_ok
- cmp byte [ebx],51h
- je elf_segment_position_ok
- mov [merge_segment],ebx
- elf_segment_position_move:
- add eax,[ebx+14h]
- jmp elf_segment_position_ok
- elf_segment_position_move_and_align:
- add eax,[ebx+14h]
- add eax,0FFFh
- elf_segment_position_ok:
- and eax,not 0FFFh
- ret
- elf64_segment:
- call close_elf64_segment
- push eax edx
- call create_addressing_space
- call setup_elf_exe_labels_type
- mov ebp,ebx
- mov ebx,[number_of_sections]
- imul ebx,38h
- add ebx,[code_start]
- add ebx,40h
- cmp ebx,[symbols_stream]
- jb new_elf64_segment
- or [next_pass_needed],-1
- new_elf64_segment:
- mov byte [ebx],1
- and dword [ebx+4],0
- mov word [ebx+30h],1000h
- elf64_segment_flags:
- cmp byte [esi],1Eh
- je elf64_segment_type
- cmp byte [esi],19h
- jne elf64_segment_flags_ok
- lods word [esi]
- sub ah,28
- jbe invalid_argument
- cmp ah,1
- je mark_elf64_segment_flag
- cmp ah,3
- ja invalid_argument
- xor ah,1
- cmp ah,2
- je mark_elf64_segment_flag
- inc ah
- mark_elf64_segment_flag:
- test [ebx+4],ah
- jnz setting_already_specified
- or [ebx+4],ah
- jmp elf64_segment_flags
- elf64_segment_type:
- cmp byte [ebx],1
- jne setting_already_specified
- lods word [esi]
- mov ecx,[number_of_sections]
- jecxz elf64_segment_type_ok
- mov edx,[code_start]
- add edx,40h
- scan_elf64_segment_types:
- cmp edx,[symbols_stream]
- jae elf64_segment_type_ok
- cmp [edx],ah
- je data_already_defined
- add edx,38h
- loop scan_elf64_segment_types
- elf64_segment_type_ok:
- mov [ebx],ah
- mov word [ebx+30h],1
- cmp ah,50h
- jb elf64_segment_flags
- or dword [ebx],6474E500h
- jmp elf64_segment_flags
- elf64_segment_flags_ok:
- pop edx eax
- cmp byte [ebx],1
- jne no_elf64_segment_merging
- cmp [merge_segment],0
- jne merge_elf64_segment
- no_elf64_segment_merging:
- mov ecx,edi
- sub ecx,[code_start]
- mov [ebx+8],ecx
- and ecx,0FFFh
- add eax,ecx
- adc edx,0
- mov [ebx+10h],eax
- mov [ebx+10h+4],edx
- mov [ebx+18h],eax
- mov [ebx+18h+4],edx
- jmp elf_segment_addressing_setup
- merge_elf64_segment:
- xor ecx,ecx
- xchg ecx,[merge_segment]
- cmp ecx,-1
- je merge_elf64_header
- mov eax,[ecx+10h]
- mov edx,[ecx+10h+4]
- mov ecx,[ecx+8]
- elf64_segment_separated_base:
- mov [ebx+10h],eax
- mov [ebx+10h+4],edx
- mov [ebx+18h],eax
- mov [ebx+18h+4],edx
- mov [ebx+8],ecx
- neg ecx
- add ecx,edi
- sub ecx,[code_start]
- add eax,ecx
- adc edx,0
- jmp elf_segment_addressing_setup
- merge_elf64_header:
- mov eax,[image_base]
- mov edx,[image_base_high]
- xor ecx,ecx
- jmp elf64_segment_separated_base
- close_elf64_segment:
- cmp [number_of_sections],0
- jne finish_elf64_segment
- cmp edi,[symbols_stream]
- jne first_elf64_segment_ok
- or [merge_segment],-1
- mov eax,[image_base]
- mov edx,[image_base_high]
- ret
- first_elf64_segment_ok:
- and [merge_segment],0
- inc [number_of_sections]
- finish_elf64_segment:
- mov ebx,[number_of_sections]
- dec ebx
- imul ebx,38h
- add ebx,[code_start]
- add ebx,40h
- mov eax,edi
- sub eax,[code_start]
- sub eax,[ebx+8]
- mov edx,edi
- cmp edi,[undefined_data_end]
- jne elf64_segment_size_ok
- cmp byte [ebx],1
- jne elf64_segment_size_ok
- mov edi,[undefined_data_start]
- elf64_segment_size_ok:
- mov [ebx+28h],eax
- add eax,edi
- sub eax,edx
- mov [ebx+20h],eax
- and [undefined_data_end],0
- mov eax,[ebx+10h]
- mov edx,[ebx+10h+4]
- cmp byte [ebx],1
- je elf64_segment_position_move_and_align
- cmp [merge_segment],0
- jne elf64_segment_position_move
- cmp byte [ebx],4
- je elf64_segment_position_ok
- cmp byte [ebx],51h
- je elf64_segment_position_ok
- mov [merge_segment],ebx
- elf64_segment_position_move:
- add eax,[ebx+28h]
- adc edx,0
- jmp elf64_segment_position_ok
- elf64_segment_position_move_and_align:
- add eax,[ebx+28h]
- adc edx,0
- add eax,0FFFh
- adc edx,0
- elf64_segment_position_ok:
- and eax,not 0FFFh
- ret
-close_elf_exe:
- test [format_flags],8
- jnz close_elf64_exe
- call close_elf_segment
- mov edx,[code_start]
- mov eax,[number_of_sections]
- mov byte [edx+1Ch],34h
- mov [edx+2Ch],ax
- shl eax,5
- add eax,edx
- add eax,34h
- cmp eax,[symbols_stream]
- je elf_exe_ok
- or [next_pass_needed],-1
- elf_exe_ok:
- ret
- close_elf64_exe:
- call close_elf64_segment
- mov edx,[code_start]
- mov eax,[number_of_sections]
- mov byte [edx+20h],40h
- mov [edx+38h],ax
- imul eax,38h
- add eax,edx
- add eax,40h
- cmp eax,[symbols_stream]
- je elf64_exe_ok
- or [next_pass_needed],-1
- elf64_exe_ok:
- ret
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-_out_of_memory db 'out of memory',0
-_stack_overflow db 'out of stack space',0
-_main_file_not_found db 'source file not found',0
-_code_cannot_be_generated db 'code cannot be generated',0
-_format_limitations_exceeded db 'format limitations exceeded',0
-_invalid_definition db 'invalid definition provided',0
-_write_failed db 'write failed',0
-_file_not_found db 'file not found',0
-_error_reading_file db 'error reading file',0
-_invalid_file_format db 'invalid file format',0
-_invalid_macro_arguments db 'invalid macro arguments',0
-_incomplete_macro db 'incomplete macro',0
-_unexpected_characters db 'unexpected characters',0
-_invalid_argument db 'invalid argument',0
-_illegal_instruction db 'illegal instruction',0
-_invalid_operand db 'invalid operand',0
-_invalid_operand_size db 'invalid size of operand',0
-_operand_size_not_specified db 'operand size not specified',0
-_operand_sizes_do_not_match db 'operand sizes do not match',0
-_invalid_address_size db 'invalid size of address value',0
-_address_sizes_do_not_agree db 'address sizes do not agree',0
-_disallowed_combination_of_registers db 'disallowed combination of registers',0
-_long_immediate_not_encodable db 'not encodable with long immediate',0
-_relative_jump_out_of_range db 'relative jump out of range',0
-_invalid_expression db 'invalid expression',0
-_invalid_address db 'invalid address',0
-_invalid_value db 'invalid value',0
-_value_out_of_range db 'value out of range',0
-_undefined_symbol db 'undefined symbol',0
-_symbol_out_of_scope_1 db 'symbol',0
-_symbol_out_of_scope_2 db 'out of scope',0
-_invalid_use_of_symbol db 'invalid use of symbol',0
-_name_too_long db 'name too long',0
-_invalid_name db 'invalid name',0
-_reserved_word_used_as_symbol db 'reserved word used as symbol',0
-_symbol_already_defined db 'symbol already defined',0
-_missing_end_quote db 'missing end quote',0
-_missing_end_directive db 'missing end directive',0
-_unexpected_instruction db 'unexpected instruction',0
-_extra_characters_on_line db 'extra characters on line',0
-_section_not_aligned_enough db 'section is not aligned enough',0
-_setting_already_specified db 'setting already specified',0
-_data_already_defined db 'data already defined',0
-_too_many_repeats db 'too many repeats',0
-_invoked_error db 'error directive encountered in source file',0
-_assertion_failed db 'assertion failed',0
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-parser:
- mov eax,[memory_end]
- mov [labels_list],eax
- mov eax,[additional_memory]
- mov [free_additional_memory],eax
- xor eax,eax
- mov [current_locals_prefix],eax
- mov [anonymous_reverse],eax
- mov [anonymous_forward],eax
- mov [hash_tree],eax
- mov [blocks_stack],eax
- mov [parsed_lines],eax
- mov esi,[memory_start]
- mov edi,[source_start]
- parser_loop:
- mov [current_line],esi
- lea eax,[edi+100h]
- cmp eax,[labels_list]
- jae out_of_memory
- cmp byte [esi+16],0
- je empty_line
- cmp byte [esi+16],3Bh
- je empty_line
- mov al,0Fh
- stos byte [edi]
- mov eax,esi
- stos dword [edi]
- inc [parsed_lines]
- add esi,16
- parse_line:
- mov [formatter_symbols_allowed],0
- mov [decorator_symbols_allowed],0
- cmp byte [esi],1Ah
- jne empty_instruction
- push edi
- add esi,2
- movzx ecx,byte [esi-1]
- cmp byte [esi+ecx],':'
- je simple_label
- cmp byte [esi+ecx],'='
- je constant_label
- call get_instruction
- jnc main_instruction_identified
- cmp byte [esi+ecx],1Ah
- jne no_data_label
- push esi ecx
- lea esi,[esi+ecx+2]
- movzx ecx,byte [esi-1]
- call get_data_directive
- jnc data_label
- pop ecx esi
- no_data_label:
- call get_data_directive
- jnc main_instruction_identified
- pop edi
- sub esi,2
- xor bx,bx
- call parse_line_contents
- jmp parse_next_line
- simple_label:
- pop edi
- call identify_label
- cmp byte [esi+1],':'
- je block_label
- mov byte [edi],2
- inc edi
- stos dword [edi]
- inc esi
- 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
- mov byte [edi],3
- inc edi
- stos dword [edi]
- xor al,al
- stos byte [edi]
- inc esi
- xor bx,bx
- call parse_line_contents
- jmp parse_next_line
- data_label:
- pop ecx edx
- pop edi
- push eax ebx esi
- mov esi,edx
- movzx ecx,byte [esi-1]
- call identify_label
- mov byte [edi],2
- inc edi
- stos dword [edi]
- pop esi ebx eax
- stos byte [edi]
- push edi
- main_instruction_identified:
- pop edi
- mov dl,al
- mov al,1
- stos byte [edi]
- mov ax,bx
- stos word [edi]
- mov al,dl
- stos byte [edi]
- cmp bx,if_directive-instruction_handler
- je parse_block
- cmp bx,repeat_directive-instruction_handler
- je parse_block
- cmp bx,while_directive-instruction_handler
- je parse_block
- cmp bx,end_directive-instruction_handler
- je parse_end_directive
- cmp bx,else_directive-instruction_handler
- je parse_else
- cmp bx,assert_directive-instruction_handler
- je parse_assert
- common_parse:
- call parse_line_contents
- jmp parse_next_line
- empty_instruction:
- lods byte [esi]
- or al,al
- jz parse_next_line
- cmp al,':'
- je invalid_name
- dec esi
- mov [parenthesis_stack],0
- call parse_argument
- jmp parse_next_line
- empty_line:
- add esi,16
- skip_rest_of_line:
- call skip_foreign_line
- parse_next_line:
- cmp esi,[source_start]
- jb parser_loop
- source_parsed:
- cmp [blocks_stack],0
- je blocks_stack_ok
- pop eax
- pop [current_line]
- jmp missing_end_directive
- blocks_stack_ok:
- xor al,al
- stos byte [edi]
- add edi,0Fh
- and edi,not 0Fh
- mov [code_start],edi
- ret
- parse_block:
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- push [current_line]
- mov ax,bx
- shl eax,16
- push eax
- inc [blocks_stack]
- cmp bx,if_directive-instruction_handler
- je parse_if
- cmp bx,while_directive-instruction_handler
- je parse_while
- call parse_line_contents
- jmp parse_next_line
- parse_end_directive:
- cmp byte [esi],1Ah
- jne common_parse
- push edi
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call get_instruction
- pop edi
- jnc parse_end_block
- sub esi,2
- jmp common_parse
- parse_end_block:
- mov dl,al
- mov al,1
- stos byte [edi]
- mov ax,bx
- stos word [edi]
- mov al,dl
- stos byte [edi]
- lods byte [esi]
- or al,al
- jnz extra_characters_on_line
- cmp bx,if_directive-instruction_handler
- je close_parsing_block
- cmp bx,repeat_directive-instruction_handler
- je close_parsing_block
- cmp bx,while_directive-instruction_handler
- je close_parsing_block
- jmp parse_next_line
- close_parsing_block:
- cmp [blocks_stack],0
- je unexpected_instruction
- cmp bx,[esp+2]
- jne unexpected_instruction
- dec [blocks_stack]
- pop eax edx
- cmp bx,if_directive-instruction_handler
- jne parse_next_line
- test al,1100b
- jz parse_next_line
- test al,10000b
- jnz parse_next_line
- sub edi,8
- jmp parse_next_line
- parse_if:
- push edi
- call parse_line_contents
- xor al,al
- stos byte [edi]
- xchg esi,[esp]
- mov edi,esi
- call preevaluate_logical_expression
- pop esi
- cmp al,'0'
- je parse_false_condition_block
- cmp al,'1'
- je parse_true_condition_block
- or byte [esp],10000b
- jmp parse_next_line
- parse_while:
- push edi
- call parse_line_contents
- xor al,al
- stos byte [edi]
- xchg esi,[esp]
- mov edi,esi
- call preevaluate_logical_expression
- pop esi
- cmp al,'0'
- je parse_false_condition_block
- cmp al,'1'
- jne parse_next_line
- stos byte [edi]
- jmp parse_next_line
- parse_false_condition_block:
- or byte [esp],1
- sub edi,4
- jmp skip_parsing
- parse_true_condition_block:
- or byte [esp],100b
- sub edi,4
- jmp parse_next_line
- parse_else:
- cmp [blocks_stack],0
- je unexpected_instruction
- cmp word [esp+2],if_directive-instruction_handler
- jne unexpected_instruction
- lods byte [esi]
- or al,al
- jz parse_pure_else
- cmp al,1Ah
- jne extra_characters_on_line
- push edi
- movzx ecx,byte [esi]
- inc esi
- call get_instruction
- jc extra_characters_on_line
- pop edi
- cmp bx,if_directive-instruction_handler
- jne extra_characters_on_line
- test byte [esp],100b
- jnz skip_true_condition_else
- mov dl,al
- mov al,1
- stos byte [edi]
- mov ax,bx
- stos word [edi]
- mov al,dl
- stos byte [edi]
- jmp parse_if
- parse_assert:
- push edi
- call parse_line_contents
- xor al,al
- stos byte [edi]
- xchg esi,[esp]
- mov edi,esi
- call preevaluate_logical_expression
- pop esi
- or al,al
- jz parse_next_line
- stos byte [edi]
- jmp parse_next_line
- skip_true_condition_else:
- sub edi,4
- or byte [esp],1
- jmp skip_parsing_contents
- parse_pure_else:
- bts dword [esp],1
- jc unexpected_instruction
- test byte [esp],100b
- jz parse_next_line
- sub edi,4
- or byte [esp],1
- jmp skip_parsing
- skip_parsing:
- cmp esi,[source_start]
- jae source_parsed
- mov [current_line],esi
- add esi,16
- skip_parsing_line:
- cmp byte [esi],1Ah
- jne skip_parsing_contents
- inc esi
- movzx ecx,byte [esi]
- inc esi
- cmp byte [esi+ecx],':'
- je skip_parsing_label
- push edi
- call get_instruction
- pop edi
- jnc skip_parsing_instruction
- add esi,ecx
- jmp skip_parsing_contents
- skip_parsing_label:
- lea esi,[esi+ecx+1]
- jmp skip_parsing_line
- skip_parsing_instruction:
- cmp bx,if_directive-instruction_handler
- je skip_parsing_block
- cmp bx,repeat_directive-instruction_handler
- je skip_parsing_block
- cmp bx,while_directive-instruction_handler
- je skip_parsing_block
- cmp bx,end_directive-instruction_handler
- je skip_parsing_end_directive
- cmp bx,else_directive-instruction_handler
- je skip_parsing_else
- skip_parsing_contents:
- lods byte [esi]
- or al,al
- jz skip_parsing
- cmp al,1Ah
- je skip_parsing_symbol
- cmp al,3Bh
- je skip_parsing_symbol
- cmp al,22h
- je skip_parsing_string
- jmp skip_parsing_contents
- skip_parsing_symbol:
- lods byte [esi]
- movzx eax,al
- add esi,eax
- jmp skip_parsing_contents
- skip_parsing_string:
- lods dword [esi]
- add esi,eax
- jmp skip_parsing_contents
- skip_parsing_block:
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- push [current_line]
- mov ax,bx
- shl eax,16
- push eax
- inc [blocks_stack]
- jmp skip_parsing_contents
- skip_parsing_end_directive:
- cmp byte [esi],1Ah
- jne skip_parsing_contents
- push edi
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call get_instruction
- pop edi
- jnc skip_parsing_end_block
- add esi,ecx
- jmp skip_parsing_contents
- skip_parsing_end_block:
- lods byte [esi]
- or al,al
- jnz extra_characters_on_line
- cmp bx,if_directive-instruction_handler
- je close_skip_parsing_block
- cmp bx,repeat_directive-instruction_handler
- je close_skip_parsing_block
- cmp bx,while_directive-instruction_handler
- je close_skip_parsing_block
- jmp skip_parsing
- close_skip_parsing_block:
- cmp [blocks_stack],0
- je unexpected_instruction
- cmp bx,[esp+2]
- jne unexpected_instruction
- dec [blocks_stack]
- pop eax edx
- test al,1
- jz skip_parsing
- cmp bx,if_directive-instruction_handler
- jne parse_next_line
- test al,10000b
- jz parse_next_line
- mov al,0Fh
- stos byte [edi]
- mov eax,[current_line]
- stos dword [edi]
- inc [parsed_lines]
- mov eax,1 + (end_directive-instruction_handler) shl 8
- stos dword [edi]
- mov eax,1 + (if_directive-instruction_handler) shl 8
- stos dword [edi]
- jmp parse_next_line
- skip_parsing_else:
- cmp [blocks_stack],0
- je unexpected_instruction
- cmp word [esp+2],if_directive-instruction_handler
- jne unexpected_instruction
- lods byte [esi]
- or al,al
- jz skip_parsing_pure_else
- cmp al,1Ah
- jne extra_characters_on_line
- push edi
- movzx ecx,byte [esi]
- inc esi
- call get_instruction
- jc extra_characters_on_line
- pop edi
- cmp bx,if_directive-instruction_handler
- jne extra_characters_on_line
- mov al,[esp]
- test al,1
- jz skip_parsing_contents
- test al,100b
- jnz skip_parsing_contents
- test al,10000b
- jnz parse_else_if
- xor al,al
- mov [esp],al
- mov al,0Fh
- stos byte [edi]
- mov eax,[current_line]
- stos dword [edi]
- inc [parsed_lines]
- parse_else_if:
- mov eax,1 + (if_directive-instruction_handler) shl 8
- stos dword [edi]
- jmp parse_if
- skip_parsing_pure_else:
- bts dword [esp],1
- jc unexpected_instruction
- mov al,[esp]
- test al,1
- jz skip_parsing
- test al,100b
- jnz skip_parsing
- and al,not 1
- or al,1000b
- mov [esp],al
- jmp parse_next_line
-
-parse_line_contents:
- mov [parenthesis_stack],0
- parse_instruction_arguments:
- cmp bx,prefix_instruction-instruction_handler
- je allow_embedded_instruction
- cmp bx,times_directive-instruction_handler
- je parse_times_directive
- cmp bx,end_directive-instruction_handler
- je allow_embedded_instruction
- cmp bx,label_directive-instruction_handler
- je parse_label_directive
- cmp bx,segment_directive-instruction_handler
- je parse_segment_directive
- cmp bx,load_directive-instruction_handler
- je parse_load_directive
- cmp bx,extrn_directive-instruction_handler
- je parse_extrn_directive
- cmp bx,public_directive-instruction_handler
- je parse_public_directive
- cmp bx,section_directive-instruction_handler
- je parse_formatter_argument
- cmp bx,format_directive-instruction_handler
- je parse_formatter_argument
- cmp bx,data_directive-instruction_handler
- je parse_formatter_argument
- jmp parse_argument
- parse_formatter_argument:
- or [formatter_symbols_allowed],-1
- parse_argument:
- lea eax,[edi+100h]
- cmp eax,[labels_list]
- jae out_of_memory
- lods byte [esi]
- cmp al,':'
- je instruction_separator
- cmp al,','
- je separator
- cmp al,'='
- je expression_comparator
- cmp al,'|'
- je separator
- cmp al,'&'
- je separator
- cmp al,'~'
- je separator
- cmp al,'>'
- je greater
- cmp al,'<'
- je less
- cmp al,')'
- je close_parenthesis
- or al,al
- jz contents_parsed
- cmp al,'['
- je address_argument
- cmp al,']'
- je separator
- cmp al,'{'
- je open_decorator
- cmp al,'}'
- je close_decorator
- cmp al,'#'
- je unallowed_character
- cmp al,'`'
- je unallowed_character
- cmp al,3Bh
- je foreign_argument
- cmp [decorator_symbols_allowed],0
- je not_a_separator
- cmp al,'-'
- je separator
- not_a_separator:
- dec esi
- cmp al,1Ah
- jne expression_argument
- push edi
- mov edi,directive_operators
- call get_operator
- or al,al
- jnz operator_argument
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call get_symbol
- jnc symbol_argument
- cmp ecx,1
- jne check_argument
- cmp byte [esi],'?'
- jne check_argument
- 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]
- cmp byte [esi],'+'
- jne argument_parsed
- and ax,0F0FFh
- cmp ax,6010h
- jne argument_parsed
- movs byte [edi],[esi]
- jmp argument_parsed
- operator_argument:
- pop edi
- cmp al,85h
- je ptr_argument
- stos byte [edi]
- cmp al,8Ch
- je forced_expression
- cmp al,81h
- je forced_parenthesis
- cmp al,80h
- je parse_at_operator
- cmp al,82h
- je parse_from_operator
- cmp al,89h
- je parse_label_operator
- cmp al,0F8h
- je forced_expression
- jmp argument_parsed
- instruction_separator:
- stos byte [edi]
- allow_embedded_instruction:
- cmp byte [esi],1Ah
- jne parse_argument
- push edi
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call get_instruction
- jnc embedded_instruction
- call get_data_directive
- jnc embedded_instruction
- pop edi
- sub esi,2
- jmp parse_argument
- embedded_instruction:
- pop edi
- mov dl,al
- mov al,1
- stos byte [edi]
- mov ax,bx
- stos word [edi]
- mov al,dl
- stos byte [edi]
- jmp parse_instruction_arguments
- parse_times_directive:
- mov al,'('
- stos byte [edi]
- call convert_expression
- mov al,')'
- stos byte [edi]
- cmp byte [esi],':'
- jne allow_embedded_instruction
- movs byte [edi],[esi]
- jmp allow_embedded_instruction
- parse_segment_directive:
- or [formatter_symbols_allowed],-1
- parse_label_directive:
- cmp byte [esi],1Ah
- jne argument_parsed
- push esi
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call identify_label
- pop ebx
- cmp eax,0Fh
- je non_label_identified
- mov byte [edi],2
- inc edi
- stos dword [edi]
- xor al,al
- stos byte [edi]
- jmp argument_parsed
- non_label_identified:
- mov esi,ebx
- jmp argument_parsed
- parse_load_directive:
- cmp byte [esi],1Ah
- jne argument_parsed
- push esi
- inc esi
- movzx ecx,byte [esi]
- inc esi
- call get_label_id
- pop ebx
- cmp eax,0Fh
- je non_label_identified
- mov byte [edi],2
- inc edi
- stos dword [edi]
- xor al,al
- stos byte [edi]
- jmp argument_parsed
- parse_public_directive:
- cmp byte [esi],1Ah
- jne parse_argument
- inc esi
- push esi
- movzx ecx,byte [esi]
- inc esi
- push esi ecx
- push edi
- or [formatter_symbols_allowed],-1
- call get_symbol
- mov [formatter_symbols_allowed],0
- pop edi
- jc parse_public_label
- cmp al,1Dh
- jne parse_public_label
- add esp,12
- stos word [edi]
- jmp parse_public_directive
- parse_public_label:
- pop ecx esi
- mov al,2
- stos byte [edi]
- call get_label_id
- stos dword [edi]
- mov ax,8600h
- stos word [edi]
- pop ebx
- push ebx esi edi
- mov edi,directive_operators
- call get_operator
- pop edi edx ebx
- cmp al,86h
- je argument_parsed
- mov esi,edx
- xchg esi,ebx
- movzx ecx,byte [esi]
- inc esi
- mov ax,'('
- stos word [edi]
- mov eax,ecx
- stos dword [edi]
- rep movs byte [edi],[esi]
- xor al,al
- stos byte [edi]
- xchg esi,ebx
- jmp argument_parsed
- parse_extrn_directive:
- cmp byte [esi],22h
- je parse_quoted_extrn
- cmp byte [esi],1Ah
- jne parse_argument
- push esi
- movzx ecx,byte [esi+1]
- add esi,2
- mov ax,'('
- stos word [edi]
- mov eax,ecx
- stos dword [edi]
- rep movs byte [edi],[esi]
- mov ax,8600h
- stos word [edi]
- pop esi
- parse_label_operator:
- cmp byte [esi],1Ah
- jne argument_parsed
- inc esi
- movzx ecx,byte [esi]
- inc esi
- mov al,2
- stos byte [edi]
- call get_label_id
- stos dword [edi]
- xor al,al
- stos byte [edi]
- jmp argument_parsed
- parse_from_operator:
- cmp byte [esi],22h
- je argument_parsed
- parse_at_operator:
- cmp byte [esi],':'
- je argument_parsed
- jmp forced_multipart_expression
- parse_quoted_extrn:
- inc esi
- mov ax,'('
- stos word [edi]
- lods dword [esi]
- mov ecx,eax
- stos dword [edi]
- rep movs byte [edi],[esi]
- xor al,al
- stos byte [edi]
- push esi edi
- mov edi,directive_operators
- call get_operator
- mov edx,esi
- pop edi esi
- cmp al,86h
- jne argument_parsed
- stos byte [edi]
- mov esi,edx
- jmp parse_label_operator
- ptr_argument:
- call parse_address
- jmp address_parsed
- check_argument:
- push esi ecx
- sub esi,2
- mov edi,single_operand_operators
- call get_operator
- pop ecx esi
- or al,al
- jnz not_instruction
- call get_instruction
- jnc embedded_instruction
- call get_data_directive
- jnc embedded_instruction
- not_instruction:
- pop edi
- sub esi,2
- expression_argument:
- cmp byte [esi],22h
- jne not_string
- mov eax,[esi+1]
- lea ebx,[esi+5+eax]
- push ebx ecx esi edi
- call parse_expression
- pop eax edx ecx ebx
- cmp esi,ebx
- jne expression_argument_parsed
- mov edi,eax
- mov esi,edx
- string_argument:
- inc esi
- mov ax,'('
- stos word [edi]
- lods dword [esi]
- mov ecx,eax
- stos dword [edi]
- shr ecx,1
- jnc string_movsb_ok
- movs byte [edi],[esi]
- string_movsb_ok:
- shr ecx,1
- jnc string_movsw_ok
- movs word [edi],[esi]
- string_movsw_ok:
- rep movs dword [edi],[esi]
- xor al,al
- stos byte [edi]
- 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
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- push esi edi
- inc esi
- mov al,91h
- stos byte [edi]
- inc [parenthesis_stack]
- jmp parse_argument
- expression_comparator:
- stos byte [edi]
- jmp forced_expression
- greater:
- cmp byte [esi],'='
- jne separator
- inc esi
- mov al,0F2h
- jmp separator
- less:
- cmp byte [edi-1],0F6h
- je separator
- cmp byte [esi],'>'
- je not_equal
- cmp byte [esi],'='
- jne separator
- inc esi
- mov al,0F3h
- jmp separator
- not_equal:
- inc esi
- mov al,0F1h
- jmp expression_comparator
- expression:
- call parse_expression
- jmp expression_argument_parsed
- forced_expression:
- xor al,al
- xchg al,[formatter_symbols_allowed]
- push eax
- 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]
- cmp al,']'
- je address_parsed
- cmp al,','
- je divided_address
- dec esi
- mov al,')'
- stos byte [edi]
- jmp argument_parsed
- divided_address:
- mov ax,'),'
- stos word [edi]
- jmp expression
- address_parsed:
- mov al,']'
- stos byte [edi]
- jmp argument_parsed
- parse_address:
- mov al,'['
- stos byte [edi]
- cmp word [esi],021Ah
- jne convert_address
- push esi
- add esi,4
- lea ebx,[esi+1]
- cmp byte [esi],':'
- pop esi
- jne convert_address
- add esi,2
- mov ecx,2
- push ebx edi
- call get_symbol
- pop edi esi
- jc unknown_segment_prefix
- cmp al,10h
- jne unknown_segment_prefix
- mov al,ah
- and ah,11110000b
- cmp ah,30h
- jne unknown_segment_prefix
- add al,30h
- stos byte [edi]
- jmp convert_address
- unknown_segment_prefix:
- sub esi,5
- convert_address:
- push edi
- mov edi,address_sizes
- call get_operator
- pop edi
- or al,al
- jz convert_expression
- add al,70h
- stos byte [edi]
- jmp convert_expression
- forced_parenthesis:
- cmp byte [esi],'('
- jne argument_parsed
- inc esi
- mov al,91h
- jmp separator
- unallowed_character:
- mov al,0FFh
- jmp separator
- open_decorator:
- inc [decorator_symbols_allowed]
- jmp separator
- close_decorator:
- dec [decorator_symbols_allowed]
- jmp separator
- close_parenthesis:
- mov al,92h
- separator:
- stos byte [edi]
- argument_parsed:
- cmp [parenthesis_stack],0
- je parse_argument
- dec [parenthesis_stack]
- add esp,8
- jmp argument_parsed
- expression_argument_parsed:
- cmp [parenthesis_stack],0
- je parse_argument
- cmp byte [esi],')'
- jne argument_parsed
- dec [parenthesis_stack]
- pop edi esi
- jmp expression
- contents_parsed:
- cmp [parenthesis_stack],0
- je contents_ok
- dec [parenthesis_stack]
- add esp,8
- jmp contents_parsed
- contents_ok:
- ret
-
-identify_label:
- cmp byte [esi],'.'
- je local_label_name
- call get_label_id
- cmp eax,10h
- jb label_identified
- or ebx,ebx
- jz anonymous_label_name
- dec ebx
- mov [current_locals_prefix],ebx
- label_identified:
- ret
- anonymous_label_name:
- cmp byte [esi-1],'@'
- je anonymous_label_name_ok
- mov eax,0Fh
- anonymous_label_name_ok:
- ret
- local_label_name:
- call get_label_id
- ret
-
-get_operator:
- cmp byte [esi],1Ah
- jne get_simple_operator
- mov edx,esi
- push ebp
- inc esi
- lods byte [esi]
- movzx ebp,al
- push edi
- mov ecx,ebp
- call lower_case
- pop edi
- check_operator:
- mov esi,converted
- movzx ecx,byte [edi]
- jecxz no_operator
- inc edi
- mov ebx,edi
- add ebx,ecx
- cmp ecx,ebp
- jne next_operator
- repe cmps byte [esi],[edi]
- je operator_found
- jb no_operator
- next_operator:
- mov edi,ebx
- inc edi
- jmp check_operator
- no_operator:
- mov esi,edx
- mov ecx,ebp
- pop ebp
- no_simple_operator:
- xor al,al
- ret
- operator_found:
- lea esi,[edx+2+ebp]
- mov ecx,ebp
- pop ebp
- mov al,[edi]
- ret
- get_simple_operator:
- mov al,[esi]
- cmp al,22h
- je no_simple_operator
- simple_operator:
- cmp byte [edi],1
- jb no_simple_operator
- ja simple_next_operator
- cmp al,[edi+1]
- je simple_operator_found
- simple_next_operator:
- movzx ecx,byte [edi]
- lea edi,[edi+1+ecx+1]
- jmp simple_operator
- simple_operator_found:
- inc esi
- mov al,[edi+2]
- ret
-
-get_symbol:
- push esi
- mov ebp,ecx
- call lower_case
- mov ecx,ebp
- cmp cl,11
- ja no_symbol
- sub cl,1
- jc no_symbol
- movzx ebx,word [symbols+ecx*4]
- add ebx,symbols
- movzx edx,word [symbols+ecx*4+2]
- scan_symbols:
- or edx,edx
- jz no_symbol
- mov eax,edx
- shr eax,1
- lea edi,[ebp+2]
- imul eax,edi
- lea edi,[ebx+eax]
- mov esi,converted
- mov ecx,ebp
- repe cmps byte [esi],[edi]
- ja symbols_up
- jb symbols_down
- mov ax,[edi]
- cmp al,18h
- jb symbol_ok
- cmp al,1Fh
- je decorator_symbol
- cmp [formatter_symbols_allowed],0
- je no_symbol
- symbol_ok:
- pop esi
- add esi,ebp
- clc
- ret
- decorator_symbol:
- cmp [decorator_symbols_allowed],0
- jne symbol_ok
- no_symbol:
- pop esi
- mov ecx,ebp
- stc
- ret
- symbols_down:
- shr edx,1
- jmp scan_symbols
- symbols_up:
- lea ebx,[edi+ecx+2]
- shr edx,1
- adc edx,-1
- jmp scan_symbols
-
-get_data_directive:
- push esi
- mov ebp,ecx
- call lower_case
- mov ecx,ebp
- cmp cl,4
- ja no_instruction
- sub cl,2
- jc no_instruction
- movzx ebx,word [data_directives+ecx*4]
- add ebx,data_directives
- movzx edx,word [data_directives+ecx*4+2]
- jmp scan_instructions
-
-get_instruction:
- push esi
- mov ebp,ecx
- call lower_case
- mov ecx,ebp
- cmp cl,17
- ja no_instruction
- sub cl,2
- jc no_instruction
- movzx ebx,word [instructions+ecx*4]
- add ebx,instructions
- movzx edx,word [instructions+ecx*4+2]
- scan_instructions:
- or edx,edx
- jz no_instruction
- mov eax,edx
- shr eax,1
- lea edi,[ebp+3]
- imul eax,edi
- lea edi,[ebx+eax]
- mov esi,converted
- mov ecx,ebp
- repe cmps byte [esi],[edi]
- ja instructions_up
- jb instructions_down
- pop esi
- add esi,ebp
- mov al,[edi]
- mov bx,[edi+1]
- clc
- ret
- no_instruction:
- pop esi
- mov ecx,ebp
- stc
- ret
- instructions_down:
- shr edx,1
- jmp scan_instructions
- instructions_up:
- lea ebx,[edi+ecx+3]
- shr edx,1
- adc edx,-1
- jmp scan_instructions
-
-get_label_id:
- cmp ecx,100h
- jae name_too_long
- cmp byte [esi],'@'
- je anonymous_label
- cmp byte [esi],'.'
- jne standard_label
- cmp byte [esi+1],'.'
- je standard_label
- cmp [current_locals_prefix],0
- je standard_label
- push edi
- mov edi,[additional_memory_end]
- sub edi,2
- sub edi,ecx
- push ecx esi
- mov esi,[current_locals_prefix]
- lods byte [esi]
- movzx ecx,al
- sub edi,ecx
- cmp edi,[free_additional_memory]
- jb out_of_memory
- mov word [edi],0
- add edi,2
- mov ebx,edi
- rep movs byte [edi],[esi]
- pop esi ecx
- add al,cl
- jc name_too_long
- rep movs byte [edi],[esi]
- pop edi
- push ebx esi
- movzx ecx,al
- mov byte [ebx-1],al
- mov esi,ebx
- call get_label_id
- pop esi ebx
- cmp ebx,[eax+24]
- jne composed_label_id_ok
- lea edx,[ebx-2]
- mov [additional_memory_end],edx
- composed_label_id_ok:
- ret
- anonymous_label:
- cmp ecx,2
- jne standard_label
- mov al,[esi+1]
- mov ebx,characters
- xlat byte [ebx]
- cmp al,'@'
- je new_anonymous
- cmp al,'b'
- je anonymous_back
- cmp al,'r'
- je anonymous_back
- cmp al,'f'
- jne standard_label
- add esi,2
- mov eax,[anonymous_forward]
- or eax,eax
- jnz anonymous_ok
- mov eax,[current_line]
- mov [error_line],eax
- call allocate_label
- mov [anonymous_forward],eax
- anonymous_ok:
- xor ebx,ebx
- ret
- anonymous_back:
- mov eax,[anonymous_reverse]
- add esi,2
- or eax,eax
- jz bogus_anonymous
- jmp anonymous_ok
- bogus_anonymous:
- call allocate_label
- mov [anonymous_reverse],eax
- jmp anonymous_ok
- new_anonymous:
- add esi,2
- mov eax,[anonymous_forward]
- or eax,eax
- jnz new_anonymous_ok
- call allocate_label
- new_anonymous_ok:
- mov [anonymous_reverse],eax
- mov [anonymous_forward],0
- jmp anonymous_ok
- standard_label:
- cmp byte [esi],'%'
- je get_predefined_id
- cmp byte [esi],'$'
- je current_address_label
- cmp byte [esi],'?'
- jne find_label
- cmp ecx,1
- jne find_label
- inc esi
- mov eax,0Fh
- ret
- current_address_label:
- cmp ecx,3
- je current_address_label_3_characters
- ja find_label
- inc esi
- cmp ecx,1
- jbe get_current_offset_id
- inc esi
- cmp byte [esi-1],'$'
- je get_org_origin_id
- cmp byte [esi-1],'%'
- je get_file_offset_id
- sub esi,2
- jmp find_label
- get_current_offset_id:
- xor eax,eax
- ret
- get_counter_id:
- mov eax,1
- ret
- get_timestamp_id:
- mov eax,2
- ret
- get_org_origin_id:
- mov eax,3
- ret
- get_file_offset_id:
- mov eax,4
- ret
- current_address_label_3_characters:
- cmp word [esi+1],'%%'
- jne find_label
- add esi,3
- get_actual_file_offset_id:
- mov eax,5
- ret
- get_predefined_id:
- cmp ecx,2
- ja find_label
- inc esi
- cmp cl,1
- je get_counter_id
- lods byte [esi]
- mov ebx,characters
- xlat [ebx]
- cmp al,'t'
- je get_timestamp_id
- sub esi,2
- find_label:
- xor ebx,ebx
- mov eax,2166136261
- mov ebp,16777619
- hash_label:
- xor al,[esi+ebx]
- mul ebp
- inc bl
- cmp bl,cl
- jb hash_label
- mov ebp,eax
- shl eax,8
- and ebp,0FFh shl 24
- xor ebp,eax
- or ebp,ebx
- mov [label_hash],ebp
- push edi esi
- push ecx
- mov ecx,32
- mov ebx,hash_tree
- follow_tree:
- mov edx,[ebx]
- or edx,edx
- jz extend_tree
- xor eax,eax
- shl ebp,1
- adc eax,0
- lea ebx,[edx+eax*4]
- dec ecx
- jnz follow_tree
- mov [label_leaf],ebx
- pop edx
- mov eax,[ebx]
- or eax,eax
- jz add_label
- mov ebx,esi
- mov ebp,[label_hash]
- compare_labels:
- mov esi,ebx
- mov ecx,edx
- mov edi,[eax+4]
- mov edi,[edi+24]
- repe cmps byte [esi],[edi]
- je label_found
- mov eax,[eax]
- or eax,eax
- jnz compare_labels
- jmp add_label
- label_found:
- add esp,4
- pop edi
- mov eax,[eax+4]
- ret
- extend_tree:
- mov edx,[free_additional_memory]
- lea eax,[edx+8]
- cmp eax,[additional_memory_end]
- ja out_of_memory
- mov [free_additional_memory],eax
- xor eax,eax
- mov [edx],eax
- mov [edx+4],eax
- shl ebp,1
- adc eax,0
- mov [ebx],edx
- lea ebx,[edx+eax*4]
- dec ecx
- jnz extend_tree
- mov [label_leaf],ebx
- pop edx
- add_label:
- mov ecx,edx
- pop esi
- cmp byte [esi-2],0
- je label_name_ok
- mov al,[esi]
- cmp al,30h
- jb name_first_char_ok
- cmp al,39h
- jbe numeric_name
- name_first_char_ok:
- cmp al,'$'
- jne check_for_reserved_word
- numeric_name:
- add esi,ecx
- reserved_word:
- mov eax,0Fh
- pop edi
- ret
- check_for_reserved_word:
- call get_instruction
- jnc reserved_word
- call get_data_directive
- jnc reserved_word
- call get_symbol
- jnc reserved_word
- sub esi,2
- mov edi,operators
- call get_operator
- or al,al
- jnz reserved_word
- mov edi,single_operand_operators
- call get_operator
- or al,al
- jnz reserved_word
- mov edi,directive_operators
- call get_operator
- or al,al
- jnz reserved_word
- inc esi
- movzx ecx,byte [esi]
- inc esi
- label_name_ok:
- mov edx,[free_additional_memory]
- lea eax,[edx+8]
- cmp eax,[additional_memory_end]
- ja out_of_memory
- mov [free_additional_memory],eax
- mov ebx,esi
- add esi,ecx
- mov eax,[label_leaf]
- mov edi,[eax]
- mov [edx],edi
- mov [eax],edx
- call allocate_label
- mov [edx+4],eax
- mov [eax+24],ebx
- pop edi
- ret
- allocate_label:
- mov eax,[labels_list]
- mov ecx,LABEL_STRUCTURE_SIZE shr 2
- initialize_label:
- sub eax,4
- mov dword [eax],0
- loop initialize_label
- mov [labels_list],eax
- ret
-
-LABEL_STRUCTURE_SIZE = 32
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-preprocessor:
- mov edi,characters
- xor al,al
- make_characters_table:
- stosb
- inc al
- jnz make_characters_table
- mov esi,characters+'a'
- mov edi,characters+'A'
- mov ecx,26
- rep movsb
- mov edi,characters
- mov esi,symbol_characters+1
- movzx ecx,byte [esi-1]
- xor eax,eax
- mark_symbol_characters:
- lodsb
- mov byte [edi+eax],0
- loop mark_symbol_characters
- mov edi,locals_counter
- mov ax,1 + '0' shl 8
- stos word [edi]
- mov edi,[memory_start]
- mov [include_paths],edi
- mov esi,include_variable
- call get_environment_variable
- xor al,al
- stos byte [edi]
- mov [memory_start],edi
- mov eax,[additional_memory]
- mov [free_additional_memory],eax
- mov eax,[additional_memory_end]
- mov [labels_list],eax
- xor eax,eax
- mov [source_start],eax
- mov [tagged_blocks],eax
- mov [hash_tree],eax
- mov [error],eax
- mov [macro_status],al
- mov [current_line],eax
- mov esi,[initial_definitions]
- test esi,esi
- jz predefinitions_ok
- process_predefinitions:
- movzx ecx,byte [esi]
- test ecx,ecx
- jz predefinitions_ok
- inc esi
- lea eax,[esi+ecx]
- push eax
- mov ch,10b
- call add_preprocessor_symbol
- pop esi
- mov edi,[memory_start]
- mov [edx+8],edi
- convert_predefinition:
- cmp edi,[memory_end]
- jae out_of_memory
- lods byte [esi]
- or al,al
- jz predefinition_converted
- cmp al,20h
- je convert_predefinition
- mov ah,al
- mov ebx,characters
- xlat byte [ebx]
- or al,al
- jz predefinition_separator
- cmp ah,27h
- je predefinition_string
- cmp ah,22h
- je predefinition_string
- mov byte [edi],1Ah
- scas word [edi]
- xchg al,ah
- stos byte [edi]
- mov ebx,characters
- xor ecx,ecx
- predefinition_symbol:
- lods byte [esi]
- stos byte [edi]
- xlat byte [ebx]
- or al,al
- loopnzd predefinition_symbol
- neg ecx
- cmp ecx,255
- ja invalid_definition
- mov ebx,edi
- sub ebx,ecx
- mov byte [ebx-2],cl
- found_predefinition_separator:
- dec edi
- mov ah,[esi-1]
- predefinition_separator:
- xchg al,ah
- or al,al
- jz predefinition_converted
- cmp al,20h
- je convert_predefinition
- cmp al,3Bh
- je invalid_definition
- cmp al,5Ch
- je predefinition_backslash
- stos byte [edi]
- jmp convert_predefinition
- predefinition_string:
- mov al,22h
- stos byte [edi]
- scas dword [edi]
- mov ebx,edi
- copy_predefinition_string:
- lods byte [esi]
- stos byte [edi]
- or al,al
- jz invalid_definition
- cmp al,ah
- jne copy_predefinition_string
- lods byte [esi]
- cmp al,ah
- je copy_predefinition_string
- dec esi
- dec edi
- mov eax,edi
- sub eax,ebx
- mov [ebx-4],eax
- jmp convert_predefinition
- predefinition_backslash:
- mov byte [edi],0
- lods byte [esi]
- or al,al
- jz invalid_definition
- cmp al,20h
- je invalid_definition
- cmp al,3Bh
- je invalid_definition
- mov al,1Ah
- stos byte [edi]
- mov ecx,edi
- mov ax,5C01h
- stos word [edi]
- dec esi
- group_predefinition_backslashes:
- lods byte [esi]
- cmp al,5Ch
- jne predefinition_backslashed_symbol
- stos byte [edi]
- inc byte [ecx]
- jmp group_predefinition_backslashes
- predefinition_backslashed_symbol:
- cmp al,20h
- je invalid_definition
- cmp al,22h
- je invalid_definition
- cmp al,27h
- je invalid_definition
- cmp al,3Bh
- je invalid_definition
- mov ah,al
- mov ebx,characters
- xlat byte [ebx]
- or al,al
- jz predefinition_backslashed_symbol_character
- mov al,ah
- convert_predefinition_backslashed_symbol:
- stos byte [edi]
- xlat byte [ebx]
- or al,al
- jz found_predefinition_separator
- inc byte [ecx]
- jz invalid_definition
- lods byte [esi]
- jmp convert_predefinition_backslashed_symbol
- predefinition_backslashed_symbol_character:
- mov al,ah
- stos byte [edi]
- inc byte [ecx]
- jmp convert_predefinition
- predefinition_converted:
- mov [memory_start],edi
- sub edi,[edx+8]
- mov [edx+12],edi
- jmp process_predefinitions
- predefinitions_ok:
- mov esi,[input_file]
- mov edx,esi
- call open
- jc main_file_not_found
- mov edi,[memory_start]
- call preprocess_file
- cmp [macro_status],0
- je process_postponed
- mov eax,[error_line]
- mov [current_line],eax
- jmp incomplete_macro
- process_postponed:
- mov edx,hash_tree
- mov ecx,32
- find_postponed_list:
- mov edx,[edx]
- or edx,edx
- loopnz find_postponed_list
- jz preprocessing_finished
- process_postponed_list:
- mov eax,[edx]
- or eax,eax
- jz preprocessing_finished
- push edx
- mov ebx,edx
- find_earliest_postponed:
- mov eax,[edx]
- or eax,eax
- jz earliest_postponed_found
- mov ebx,edx
- mov edx,eax
- jmp find_earliest_postponed
- earliest_postponed_found:
- mov [ebx],eax
- call use_postponed_macro
- pop edx
- cmp [macro_status],0
- je process_postponed_list
- mov eax,[error_line]
- mov [current_line],eax
- jmp incomplete_macro
- preprocessing_finished:
- mov [source_start],edi
- ret
- use_postponed_macro:
- lea esi,[edi-1]
- push ecx esi
- mov [struc_name],0
- jmp use_macro
-
-preprocess_file:
- push [memory_end]
- push esi
- mov al,2
- xor edx,edx
- call lseek
- push eax
- xor al,al
- xor edx,edx
- call lseek
- pop ecx
- mov edx,[memory_end]
- dec edx
- mov byte [edx],1Ah
- sub edx,ecx
- jc out_of_memory
- mov esi,edx
- cmp edx,edi
- jbe out_of_memory
- mov [memory_end],edx
- call read
- call close
- pop edx
- xor ecx,ecx
- mov ebx,esi
- preprocess_source:
- inc ecx
- mov [current_line],edi
- mov eax,edx
- stos dword [edi]
- mov eax,ecx
- stos dword [edi]
- mov eax,esi
- sub eax,ebx
- stos dword [edi]
- xor eax,eax
- stos dword [edi]
- push ebx edx
- call convert_line
- call preprocess_line
- pop edx ebx
- next_line:
- cmp byte [esi-1],0
- je file_end
- cmp byte [esi-1],1Ah
- jne preprocess_source
- file_end:
- pop [memory_end]
- clc
- ret
-
-convert_line:
- push ecx
- test [macro_status],0Fh
- jz convert_line_data
- mov ax,3Bh
- stos word [edi]
- convert_line_data:
- cmp edi,[memory_end]
- jae out_of_memory
- lods byte [esi]
- cmp al,20h
- je convert_line_data
- cmp al,9
- je convert_line_data
- mov ah,al
- mov ebx,characters
- xlat byte [ebx]
- or al,al
- jz convert_separator
- cmp ah,27h
- je convert_string
- cmp ah,22h
- je convert_string
- mov byte [edi],1Ah
- scas word [edi]
- xchg al,ah
- stos byte [edi]
- mov ebx,characters
- xor ecx,ecx
- convert_symbol:
- lods byte [esi]
- stos byte [edi]
- xlat byte [ebx]
- or al,al
- loopnzd convert_symbol
- neg ecx
- cmp ecx,255
- ja name_too_long
- mov ebx,edi
- sub ebx,ecx
- mov byte [ebx-2],cl
- found_separator:
- dec edi
- mov ah,[esi-1]
- convert_separator:
- xchg al,ah
- cmp al,20h
- jb control_character
- je convert_line_data
- symbol_character:
- cmp al,3Bh
- je ignore_comment
- cmp al,5Ch
- je backslash_character
- stos byte [edi]
- jmp convert_line_data
- control_character:
- cmp al,1Ah
- je line_end
- cmp al,0Dh
- je cr_character
- cmp al,0Ah
- je lf_character
- cmp al,9
- je convert_line_data
- or al,al
- jnz symbol_character
- jmp line_end
- lf_character:
- lods byte [esi]
- cmp al,0Dh
- je line_end
- dec esi
- jmp line_end
- cr_character:
- lods byte [esi]
- cmp al,0Ah
- je line_end
- dec esi
- jmp line_end
- convert_string:
- mov al,22h
- stos byte [edi]
- scas dword [edi]
- mov ebx,edi
- copy_string:
- lods byte [esi]
- stos byte [edi]
- cmp al,0Ah
- je no_end_quote
- cmp al,0Dh
- je no_end_quote
- or al,al
- jz no_end_quote
- cmp al,1Ah
- je no_end_quote
- cmp al,ah
- jne copy_string
- lods byte [esi]
- cmp al,ah
- je copy_string
- dec esi
- dec edi
- mov eax,edi
- sub eax,ebx
- mov [ebx-4],eax
- jmp convert_line_data
- backslash_character:
- mov byte [edi],0
- lods byte [esi]
- cmp al,20h
- je concatenate_lines
- cmp al,9
- je concatenate_lines
- cmp al,1Ah
- je line_end
- or al,al
- jz line_end
- cmp al,0Ah
- je concatenate_lf
- cmp al,0Dh
- je concatenate_cr
- cmp al,3Bh
- je find_concatenated_line
- mov al,1Ah
- stos byte [edi]
- mov ecx,edi
- mov ax,5C01h
- stos word [edi]
- dec esi
- group_backslashes:
- lods byte [esi]
- cmp al,5Ch
- jne backslashed_symbol
- stos byte [edi]
- inc byte [ecx]
- jz name_too_long
- jmp group_backslashes
- no_end_quote:
- mov byte [ebx-5],0
- jmp missing_end_quote
- backslashed_symbol:
- cmp al,1Ah
- je extra_characters_on_line
- or al,al
- jz extra_characters_on_line
- cmp al,0Ah
- je extra_characters_on_line
- cmp al,0Dh
- je extra_characters_on_line
- cmp al,20h
- je extra_characters_on_line
- cmp al,9
- je extra_characters_on_line
- cmp al,22h
- je extra_characters_on_line
- cmp al,27h
- je extra_characters_on_line
- cmp al,3Bh
- je extra_characters_on_line
- mov ah,al
- mov ebx,characters
- xlat byte [ebx]
- or al,al
- jz backslashed_symbol_character
- mov al,ah
- convert_backslashed_symbol:
- stos byte [edi]
- xlat byte [ebx]
- or al,al
- jz found_separator
- inc byte [ecx]
- jz name_too_long
- lods byte [esi]
- jmp convert_backslashed_symbol
- backslashed_symbol_character:
- mov al,ah
- stos byte [edi]
- inc byte [ecx]
- jmp convert_line_data
- concatenate_lines:
- lods byte [esi]
- cmp al,20h
- je concatenate_lines
- cmp al,9
- je concatenate_lines
- cmp al,1Ah
- je line_end
- or al,al
- jz line_end
- cmp al,0Ah
- je concatenate_lf
- cmp al,0Dh
- je concatenate_cr
- cmp al,3Bh
- jne extra_characters_on_line
- find_concatenated_line:
- lods byte [esi]
- cmp al,0Ah
- je concatenate_lf
- cmp al,0Dh
- je concatenate_cr
- or al,al
- jz concatenate_ok
- cmp al,1Ah
- jne find_concatenated_line
- jmp line_end
- concatenate_lf:
- lods byte [esi]
- cmp al,0Dh
- je concatenate_ok
- dec esi
- jmp concatenate_ok
- concatenate_cr:
- lods byte [esi]
- cmp al,0Ah
- je concatenate_ok
- dec esi
- concatenate_ok:
- inc dword [esp]
- jmp convert_line_data
- ignore_comment:
- lods byte [esi]
- cmp al,0Ah
- je lf_character
- cmp al,0Dh
- je cr_character
- or al,al
- jz line_end
- cmp al,1Ah
- jne ignore_comment
- line_end:
- xor al,al
- stos byte [edi]
- pop ecx
- ret
-
-lower_case:
- mov edi,converted
- mov ebx,characters
- convert_case:
- lods byte [esi]
- xlat byte [ebx]
- stos byte [edi]
- loop convert_case
- case_ok:
- ret
-
-get_directive:
- push edi
- mov edx,esi
- mov ebp,ecx
- call lower_case
- pop edi
- scan_directives:
- mov esi,converted
- movzx eax,byte [edi]
- or al,al
- jz no_directive
- mov ecx,ebp
- inc edi
- mov ebx,edi
- add ebx,eax
- mov ah,[esi]
- cmp ah,[edi]
- jb no_directive
- ja next_directive
- cmp cl,al
- jne next_directive
- repe cmps byte [esi],[edi]
- jb no_directive
- je directive_found
- next_directive:
- mov edi,ebx
- add edi,2
- jmp scan_directives
- no_directive:
- mov esi,edx
- mov ecx,ebp
- stc
- ret
- directive_found:
- call get_directive_handler_base
- directive_handler:
- lea esi,[edx+ebp]
- movzx ecx,word [ebx]
- add eax,ecx
- clc
- ret
- get_directive_handler_base:
- mov eax,[esp]
- ret
-
-preprocess_line:
- mov eax,esp
- sub eax,[stack_limit]
- cmp eax,100h
- jb stack_overflow
- push ecx esi
- preprocess_current_line:
- mov esi,[current_line]
- add esi,16
- cmp word [esi],3Bh
- jne line_start_ok
- add esi,2
- line_start_ok:
- test [macro_status],0F0h
- jnz macro_preprocessing
- cmp byte [esi],1Ah
- jne not_fix_constant
- movzx edx,byte [esi+1]
- lea edx,[esi+2+edx]
- cmp word [edx],031Ah
- jne not_fix_constant
- mov ebx,characters
- movzx eax,byte [edx+2]
- xlat byte [ebx]
- ror eax,8
- mov al,[edx+3]
- xlat byte [ebx]
- ror eax,8
- mov al,[edx+4]
- xlat byte [ebx]
- ror eax,16
- cmp eax,'fix'
- je define_fix_constant
- not_fix_constant:
- call process_fix_constants
- jmp initial_preprocessing_ok
- macro_preprocessing:
- call process_macro_operators
- initial_preprocessing_ok:
- mov esi,[current_line]
- add esi,16
- mov al,[macro_status]
- test al,2
- jnz skip_macro_block
- test al,1
- jnz find_macro_block
- preprocess_instruction:
- mov [current_offset],esi
- lods byte [esi]
- movzx ecx,byte [esi]
- inc esi
- cmp al,1Ah
- jne not_preprocessor_symbol
- cmp cl,3
- jb not_preprocessor_directive
- push edi
- mov edi,preprocessor_directives
- call get_directive
- pop edi
- jc not_preprocessor_directive
- mov byte [edx-2],3Bh
- jmp near eax
- not_preprocessor_directive:
- xor ch,ch
- call get_preprocessor_symbol
- jc not_macro
- mov byte [ebx-2],3Bh
- mov [struc_name],0
- jmp use_macro
- not_macro:
- mov [struc_name],esi
- add esi,ecx
- lods byte [esi]
- cmp al,':'
- je preprocess_label
- cmp al,1Ah
- jne not_preprocessor_symbol
- lods byte [esi]
- cmp al,3
- jne not_symbolic_constant
- mov ebx,characters
- movzx eax,byte [esi]
- xlat byte [ebx]
- ror eax,8
- mov al,[esi+1]
- xlat byte [ebx]
- ror eax,8
- mov al,[esi+2]
- xlat byte [ebx]
- ror eax,16
- cmp eax,'equ'
- je define_equ_constant
- mov al,3
- not_symbolic_constant:
- mov ch,1
- mov cl,al
- call get_preprocessor_symbol
- jc not_preprocessor_symbol
- push edx esi
- mov esi,[struc_name]
- mov [struc_label],esi
- sub [struc_label],2
- mov cl,[esi-1]
- mov ch,10b
- call get_preprocessor_symbol
- jc struc_name_ok
- test edx,edx
- jz reserved_word_used_as_symbol
- mov ecx,[edx+12]
- add ecx,3
- lea ebx,[edi+ecx]
- mov ecx,edi
- sub ecx,[struc_label]
- lea esi,[edi-1]
- lea edi,[ebx-1]
- std
- rep movs byte [edi],[esi]
- cld
- mov edi,[struc_label]
- mov esi,[edx+8]
- mov ecx,[edx+12]
- add [struc_name],ecx
- add [struc_name],3
- call move_data
- mov al,3Ah
- stos byte [edi]
- mov ax,3Bh
- stos word [edi]
- mov edi,ebx
- pop esi
- add esi,[edx+12]
- add esi,3
- pop edx
- jmp use_macro
- struc_name_ok:
- mov edx,[struc_name]
- movzx eax,byte [edx-1]
- add edx,eax
- push edi
- lea esi,[edi-1]
- mov ecx,edi
- sub ecx,edx
- std
- rep movs byte [edi],[esi]
- cld
- pop edi
- inc edi
- mov al,3Ah
- mov [edx],al
- inc al
- mov [edx+1],al
- pop esi edx
- inc esi
- jmp use_macro
- preprocess_label:
- dec esi
- sub esi,ecx
- lea ebp,[esi-2]
- mov ch,10b
- 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:
- test edx,edx
- jz reserved_word_used_as_symbol
- mov ebx,[edx+8]
- mov ecx,[edx+12]
- add ecx,ebx
- check_for_broken_label:
- cmp ebx,ecx
- je label_broken
- cmp byte [ebx],1Ah
- jne label_broken
- movzx eax,byte [ebx+1]
- lea ebx,[ebx+2+eax]
- cmp ebx,ecx
- je label_constant_ok
- 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:
- call replace_symbolic_constant
- jmp line_preprocessed
- label_constant_ok:
- mov ecx,edi
- sub ecx,esi
- mov edi,[edx+12]
- add edi,ebp
- push edi
- lea eax,[edi+ecx]
- push eax
- cmp esi,edi
- je replace_label
- jb move_rest_of_line_up
- rep movs byte [edi],[esi]
- jmp replace_label
- move_rest_of_line_up:
- lea esi,[esi+ecx-1]
- lea edi,[edi+ecx-1]
- std
- rep movs byte [edi],[esi]
- cld
- replace_label:
- mov ecx,[edx+12]
- mov edi,[esp+4]
- sub edi,ecx
- mov esi,[edx+8]
- rep movs byte [edi],[esi]
- pop edi esi
- inc esi
- jmp preprocess_instruction
- not_preprocessor_symbol:
- mov esi,[current_offset]
- call process_equ_constants
- line_preprocessed:
- pop esi ecx
- ret
-
-get_preprocessor_symbol:
- push ebp edi esi
- mov ebp,ecx
- shl ebp,22
- mov al,ch
- and al,11b
- movzx ecx,cl
- cmp al,10b
- jne no_preprocessor_special_symbol
- cmp cl,4
- jbe no_preprocessor_special_symbol
- mov ax,'__'
- cmp ax,[esi]
- jne no_preprocessor_special_symbol
- cmp ax,[esi+ecx-2]
- jne no_preprocessor_special_symbol
- add esi,2
- sub ecx,4
- push ebp
- mov edi,preprocessor_special_symbols
- call get_directive
- pop ebp
- jc preprocessor_special_symbol_not_recognized
- add esi,2
- xor edx,edx
- jmp preprocessor_symbol_found
- preprocessor_special_symbol_not_recognized:
- add ecx,4
- sub esi,2
- no_preprocessor_special_symbol:
- mov ebx,hash_tree
- mov edi,10
- follow_hashes_roots:
- mov edx,[ebx]
- or edx,edx
- jz preprocessor_symbol_not_found
- xor eax,eax
- shl ebp,1
- adc eax,0
- lea ebx,[edx+eax*4]
- dec edi
- jnz follow_hashes_roots
- mov edi,ebx
- call calculate_hash
- mov ebp,eax
- and ebp,3FFh
- shl ebp,10
- xor ebp,eax
- mov ebx,edi
- mov edi,22
- follow_hashes_tree:
- mov edx,[ebx]
- or edx,edx
- jz preprocessor_symbol_not_found
- xor eax,eax
- shl ebp,1
- adc eax,0
- lea ebx,[edx+eax*4]
- dec edi
- jnz follow_hashes_tree
- mov al,cl
- mov edx,[ebx]
- or edx,edx
- jz preprocessor_symbol_not_found
- compare_with_preprocessor_symbol:
- mov edi,[edx+4]
- cmp edi,1
- jbe next_equal_hash
- repe cmps byte [esi],[edi]
- je preprocessor_symbol_found
- mov cl,al
- mov esi,[esp]
- next_equal_hash:
- mov edx,[edx]
- or edx,edx
- jnz compare_with_preprocessor_symbol
- preprocessor_symbol_not_found:
- pop esi edi ebp
- stc
- ret
- preprocessor_symbol_found:
- pop ebx edi ebp
- clc
- ret
- calculate_hash:
- xor ebx,ebx
- mov eax,2166136261
- mov ebp,16777619
- fnv1a_hash:
- xor al,[esi+ebx]
- mul ebp
- inc bl
- cmp bl,cl
- jb fnv1a_hash
- ret
-add_preprocessor_symbol:
- push edi esi
- xor eax,eax
- or cl,cl
- jz reshape_hash
- cmp ch,11b
- je preprocessor_symbol_name_ok
- push ecx
- movzx ecx,cl
- mov edi,preprocessor_directives
- call get_directive
- jnc reserved_word_used_as_symbol
- pop ecx
- preprocessor_symbol_name_ok:
- call calculate_hash
- reshape_hash:
- mov ebp,eax
- and ebp,3FFh
- shr eax,10
- xor ebp,eax
- shl ecx,22
- or ebp,ecx
- mov ebx,hash_tree
- mov ecx,32
- find_leave_for_symbol:
- mov edx,[ebx]
- or edx,edx
- jz extend_hashes_tree
- xor eax,eax
- rol ebp,1
- adc eax,0
- lea ebx,[edx+eax*4]
- dec ecx
- jnz find_leave_for_symbol
- mov edx,[ebx]
- or edx,edx
- jz add_symbol_entry
- shr ebp,30
- cmp ebp,11b
- je reuse_symbol_entry
- cmp dword [edx+4],0
- jne add_symbol_entry
- find_entry_to_reuse:
- mov edi,[edx]
- or edi,edi
- jz reuse_symbol_entry
- cmp dword [edi+4],0
- jne reuse_symbol_entry
- mov edx,edi
- jmp find_entry_to_reuse
- add_symbol_entry:
- mov eax,edx
- mov edx,[labels_list]
- sub edx,16
- cmp edx,[free_additional_memory]
- jb out_of_memory
- mov [labels_list],edx
- mov [edx],eax
- mov [ebx],edx
- reuse_symbol_entry:
- pop esi edi
- mov [edx+4],esi
- ret
- extend_hashes_tree:
- mov edx,[labels_list]
- sub edx,8
- cmp edx,[free_additional_memory]
- jb out_of_memory
- mov [labels_list],edx
- xor eax,eax
- mov [edx],eax
- mov [edx+4],eax
- shl ebp,1
- adc eax,0
- mov [ebx],edx
- lea ebx,[edx+eax*4]
- dec ecx
- jnz extend_hashes_tree
- mov edx,[labels_list]
- sub edx,16
- cmp edx,[free_additional_memory]
- jb out_of_memory
- mov [labels_list],edx
- mov dword [edx],0
- mov [ebx],edx
- pop esi edi
- mov [edx+4],esi
- ret
-
-define_fix_constant:
- add edx,5
- add esi,2
- push edx
- mov ch,11b
- jmp define_preprocessor_constant
-define_equ_constant:
- add esi,3
- push esi
- call process_equ_constants
- mov esi,[struc_name]
- mov ch,10b
- define_preprocessor_constant:
- mov byte [esi-2],3Bh
- mov cl,[esi-1]
- call add_preprocessor_symbol
- pop ebx
- mov ecx,edi
- dec ecx
- sub ecx,ebx
- mov [edx+8],ebx
- mov [edx+12],ecx
- jmp line_preprocessed
-define_symbolic_constant:
- lods byte [esi]
- cmp al,1Ah
- jne invalid_name
- lods byte [esi]
- mov cl,al
- mov ch,10b
- call add_preprocessor_symbol
- movzx eax,byte [esi-1]
- add esi,eax
- lea ecx,[edi-1]
- sub ecx,esi
- mov [edx+8],esi
- mov [edx+12],ecx
- jmp line_preprocessed
-
-define_struc:
- mov ch,1
- jmp make_macro
-define_macro:
- xor ch,ch
- make_macro:
- lods byte [esi]
- cmp al,1Ah
- jne invalid_name
- lods byte [esi]
- mov cl,al
- call add_preprocessor_symbol
- mov eax,[current_line]
- mov [edx+12],eax
- movzx eax,byte [esi-1]
- add esi,eax
- mov [edx+8],esi
- mov al,[macro_status]
- and al,0F0h
- or al,1
- mov [macro_status],al
- mov eax,[current_line]
- mov [error_line],eax
- xor ebp,ebp
- lods byte [esi]
- or al,al
- jz line_preprocessed
- cmp al,'{'
- je found_macro_block
- dec esi
- skip_macro_arguments:
- lods byte [esi]
- cmp al,1Ah
- je skip_macro_argument
- cmp al,'['
- jne invalid_macro_arguments
- or ebp,-1
- jz invalid_macro_arguments
- lods byte [esi]
- cmp al,1Ah
- jne invalid_macro_arguments
- skip_macro_argument:
- movzx eax,byte [esi]
- inc esi
- add esi,eax
- lods byte [esi]
- cmp al,':'
- je macro_argument_with_default_value
- cmp al,'='
- je macro_argument_with_default_value
- cmp al,'*'
- jne macro_argument_end
- lods byte [esi]
- macro_argument_end:
- cmp al,','
- je skip_macro_arguments
- cmp al,'&'
- je macro_arguments_finisher
- cmp al,']'
- jne end_macro_arguments
- not ebp
- macro_arguments_finisher:
- lods byte [esi]
- end_macro_arguments:
- or ebp,ebp
- jnz invalid_macro_arguments
- or al,al
- jz line_preprocessed
- cmp al,'{'
- je found_macro_block
- jmp invalid_macro_arguments
- macro_argument_with_default_value:
- or [skip_default_argument_value],-1
- call skip_macro_argument_value
- inc esi
- jmp macro_argument_end
- skip_macro_argument_value:
- cmp byte [esi],'<'
- jne simple_argument
- mov ecx,1
- inc esi
- enclosed_argument:
- lods byte [esi]
- or al,al
- jz invalid_macro_arguments
- cmp al,1Ah
- je enclosed_symbol
- cmp al,22h
- je enclosed_string
- cmp al,'>'
- je enclosed_argument_end
- cmp al,'<'
- jne enclosed_argument
- inc ecx
- jmp enclosed_argument
- enclosed_symbol:
- movzx eax,byte [esi]
- inc esi
- add esi,eax
- jmp enclosed_argument
- enclosed_string:
- lods dword [esi]
- add esi,eax
- jmp enclosed_argument
- enclosed_argument_end:
- loop enclosed_argument
- lods byte [esi]
- or al,al
- jz argument_value_end
- cmp al,','
- je argument_value_end
- cmp [skip_default_argument_value],0
- je invalid_macro_arguments
- cmp al,'{'
- je argument_value_end
- cmp al,'&'
- je argument_value_end
- or ebp,ebp
- jz invalid_macro_arguments
- cmp al,']'
- je argument_value_end
- jmp invalid_macro_arguments
- simple_argument:
- lods byte [esi]
- or al,al
- jz argument_value_end
- cmp al,','
- je argument_value_end
- cmp al,22h
- je argument_string
- cmp al,1Ah
- je argument_symbol
- cmp [skip_default_argument_value],0
- je simple_argument
- cmp al,'{'
- je argument_value_end
- cmp al,'&'
- je argument_value_end
- or ebp,ebp
- jz simple_argument
- cmp al,']'
- je argument_value_end
- argument_symbol:
- movzx eax,byte [esi]
- inc esi
- add esi,eax
- jmp simple_argument
- argument_string:
- lods dword [esi]
- add esi,eax
- jmp simple_argument
- argument_value_end:
- dec esi
- ret
- find_macro_block:
- add esi,2
- lods byte [esi]
- or al,al
- jz line_preprocessed
- cmp al,'{'
- jne unexpected_characters
- found_macro_block:
- or [macro_status],2
- skip_macro_block:
- lods byte [esi]
- cmp al,1Ah
- je skip_macro_symbol
- cmp al,3Bh
- je skip_macro_symbol
- cmp al,22h
- je skip_macro_string
- or al,al
- jz line_preprocessed
- cmp al,'}'
- jne skip_macro_block
- mov al,[macro_status]
- and [macro_status],0F0h
- test al,8
- jnz use_instant_macro
- cmp byte [esi],0
- je line_preprocessed
- mov ecx,edi
- sub ecx,esi
- mov edx,esi
- lea esi,[esi+ecx-1]
- lea edi,[edi+1+16]
- mov ebx,edi
- dec edi
- std
- rep movs byte [edi],[esi]
- cld
- mov edi,edx
- xor al,al
- stos byte [edi]
- mov esi,[current_line]
- mov [current_line],edi
- mov ecx,4
- rep movs dword [edi],[esi]
- mov edi,ebx
- jmp initial_preprocessing_ok
- skip_macro_symbol:
- movzx eax,byte [esi]
- inc esi
- add esi,eax
- jmp skip_macro_block
- skip_macro_string:
- lods dword [esi]
- add esi,eax
- jmp skip_macro_block
-postpone_directive:
- push esi
- mov esi,edx
- xor ecx,ecx
- call add_preprocessor_symbol
- mov eax,[current_line]
- mov [error_line],eax
- mov [edx+12],eax
- pop esi
- mov [edx+8],esi
- mov al,[macro_status]
- and al,0F0h
- or al,1
- mov [macro_status],al
- lods byte [esi]
- or al,al
- jz line_preprocessed
- cmp al,'{'
- jne unexpected_characters
- jmp found_macro_block
-rept_directive:
- mov [base_code],0
- jmp define_instant_macro
-irp_directive:
- mov [base_code],1
- jmp define_instant_macro
-irps_directive:
- mov [base_code],2
- jmp define_instant_macro
-irpv_directive:
- mov [base_code],3
- jmp define_instant_macro
-match_directive:
- mov [base_code],10h
-define_instant_macro:
- mov al,[macro_status]
- and al,0F0h
- or al,8+1
- mov [macro_status],al
- mov eax,[current_line]
- mov [error_line],eax
- mov [instant_macro_start],esi
- cmp [base_code],10h
- je prepare_match
- skip_parameters:
- lods byte [esi]
- or al,al
- jz parameters_skipped
- cmp al,'{'
- je parameters_skipped
- cmp al,22h
- je skip_quoted_parameter
- cmp al,1Ah
- jne skip_parameters
- lods byte [esi]
- movzx eax,al
- add esi,eax
- jmp skip_parameters
- skip_quoted_parameter:
- lods dword [esi]
- add esi,eax
- jmp skip_parameters
- parameters_skipped:
- dec esi
- mov [parameters_end],esi
- lods byte [esi]
- cmp al,'{'
- je found_macro_block
- or al,al
- jnz invalid_macro_arguments
- jmp line_preprocessed
-prepare_match:
- call skip_pattern
- mov [value_type],80h+10b
- call process_symbolic_constants
- jmp parameters_skipped
- skip_pattern:
- lods byte [esi]
- or al,al
- jz invalid_macro_arguments
- cmp al,','
- je pattern_skipped
- cmp al,22h
- je skip_quoted_string_in_pattern
- cmp al,1Ah
- je skip_symbol_in_pattern
- cmp al,'='
- jne skip_pattern
- mov al,[esi]
- cmp al,1Ah
- je skip_pattern
- cmp al,22h
- je skip_pattern
- inc esi
- jmp skip_pattern
- skip_symbol_in_pattern:
- lods byte [esi]
- movzx eax,al
- add esi,eax
- jmp skip_pattern
- skip_quoted_string_in_pattern:
- lods dword [esi]
- add esi,eax
- jmp skip_pattern
- pattern_skipped:
- ret
-
-purge_macro:
- xor ch,ch
- jmp restore_preprocessor_symbol
-purge_struc:
- mov ch,1
- jmp restore_preprocessor_symbol
-restore_equ_constant:
- mov ch,10b
- restore_preprocessor_symbol:
- push ecx
- lods byte [esi]
- cmp al,1Ah
- jne invalid_name
- lods byte [esi]
- mov cl,al
- call get_preprocessor_symbol
- jc no_symbol_to_restore
- test edx,edx
- jz symbol_restored
- mov dword [edx+4],0
- jmp symbol_restored
- no_symbol_to_restore:
- add esi,ecx
- symbol_restored:
- pop ecx
- lods byte [esi]
- cmp al,','
- je restore_preprocessor_symbol
- or al,al
- jnz extra_characters_on_line
- jmp line_preprocessed
-
-process_fix_constants:
- mov [value_type],11b
- jmp process_symbolic_constants
-process_equ_constants:
- mov [value_type],10b
- process_symbolic_constants:
- mov ebp,esi
- lods byte [esi]
- cmp al,1Ah
- je check_symbol
- cmp al,22h
- je ignore_string
- cmp al,'{'
- je check_brace
- or al,al
- jnz process_symbolic_constants
- ret
- ignore_string:
- lods dword [esi]
- add esi,eax
- jmp process_symbolic_constants
- check_brace:
- test [value_type],80h
- jz process_symbolic_constants
- ret
- no_replacing:
- movzx ecx,byte [esi-1]
- add esi,ecx
- jmp process_symbolic_constants
- check_symbol:
- mov cl,[esi]
- inc esi
- mov ch,[value_type]
- call get_preprocessor_symbol
- jc no_replacing
- mov [current_section],edi
- replace_symbolic_constant:
- test edx,edx
- jz replace_special_symbolic_constant
- mov ecx,[edx+12]
- mov edx,[edx+8]
- xchg esi,edx
- call move_data
- mov esi,edx
- process_after_replaced:
- lods byte [esi]
- cmp al,1Ah
- je symbol_after_replaced
- stos byte [edi]
- cmp al,22h
- je string_after_replaced
- cmp al,'{'
- je brace_after_replaced
- or al,al
- jnz process_after_replaced
- mov ecx,edi
- sub ecx,esi
- mov edi,ebp
- call move_data
- mov esi,edi
- ret
- move_data:
- lea eax,[edi+ecx]
- cmp eax,[memory_end]
- jae out_of_memory
- shr ecx,1
- jnc movsb_ok
- movs byte [edi],[esi]
- movsb_ok:
- shr ecx,1
- jnc movsw_ok
- movs word [edi],[esi]
- movsw_ok:
- rep movs dword [edi],[esi]
- ret
- string_after_replaced:
- lods dword [esi]
- stos dword [edi]
- mov ecx,eax
- call move_data
- jmp process_after_replaced
- brace_after_replaced:
- test [value_type],80h
- jz process_after_replaced
- mov edx,edi
- mov ecx,[current_section]
- sub edx,ecx
- sub ecx,esi
- rep movs byte [edi],[esi]
- mov ecx,edi
- sub ecx,esi
- mov edi,ebp
- call move_data
- lea esi,[ebp+edx]
- ret
- symbol_after_replaced:
- mov cl,[esi]
- inc esi
- mov ch,[value_type]
- call get_preprocessor_symbol
- jnc replace_symbolic_constant
- movzx ecx,byte [esi-1]
- mov al,1Ah
- mov ah,cl
- stos word [edi]
- call move_data
- jmp process_after_replaced
- replace_special_symbolic_constant:
- jmp near eax
- preprocessed_file_value:
- call get_current_line_from_file
- test ebx,ebx
- jz process_after_replaced
- push esi edi
- mov esi,[ebx]
- mov edi,esi
- xor al,al
- or ecx,-1
- repne scas byte [edi]
- add ecx,2
- neg ecx
- pop edi
- lea eax,[edi+1+4+ecx]
- cmp eax,[memory_end]
- ja out_of_memory
- mov al,22h
- stos byte [edi]
- mov eax,ecx
- stos dword [edi]
- rep movs byte [edi],[esi]
- pop esi
- jmp process_after_replaced
- preprocessed_line_value:
- call get_current_line_from_file
- test ebx,ebx
- jz process_after_replaced
- lea eax,[edi+1+4+20]
- cmp eax,[memory_end]
- ja out_of_memory
- mov ecx,[ebx+4]
- call store_number_symbol
- jmp process_after_replaced
- get_current_line_from_file:
- mov ebx,[current_line]
- find_line_from_file:
- test ebx,ebx
- jz line_from_file_found
- test byte [ebx+7],80h
- jz line_from_file_found
- mov ebx,[ebx+8]
- jmp find_line_from_file
- line_from_file_found:
- ret
-
-process_macro_operators:
- xor dl,dl
- mov ebp,edi
- before_macro_operators:
- mov edi,esi
- lods byte [esi]
- cmp al,'`'
- je symbol_conversion
- cmp al,'#'
- je concatenation
- cmp al,1Ah
- je symbol_before_macro_operators
- cmp al,3Bh
- je no_more_macro_operators
- cmp al,22h
- je string_before_macro_operators
- xor dl,dl
- or al,al
- jnz before_macro_operators
- mov edi,esi
- ret
- no_more_macro_operators:
- mov edi,ebp
- ret
- symbol_before_macro_operators:
- mov dl,1Ah
- mov ebx,esi
- lods byte [esi]
- movzx ecx,al
- jecxz symbol_before_macro_operators_ok
- mov edi,esi
- cmp byte [esi],'\'
- je escaped_symbol
- symbol_before_macro_operators_ok:
- add esi,ecx
- jmp before_macro_operators
- string_before_macro_operators:
- mov dl,22h
- mov ebx,esi
- lods dword [esi]
- add esi,eax
- jmp before_macro_operators
- escaped_symbol:
- dec byte [edi-1]
- dec ecx
- inc esi
- cmp ecx,1
- rep movs byte [edi],[esi]
- jne after_macro_operators
- mov al,[esi-1]
- mov ecx,ebx
- mov ebx,characters
- xlat byte [ebx]
- mov ebx,ecx
- or al,al
- jnz after_macro_operators
- sub edi,3
- mov al,[esi-1]
- stos byte [edi]
- xor dl,dl
- jmp after_macro_operators
- reduce_symbol_conversion:
- inc esi
- symbol_conversion:
- mov edx,esi
- mov al,[esi]
- cmp al,1Ah
- jne symbol_character_conversion
- lods word [esi]
- movzx ecx,ah
- lea ebx,[edi+3]
- jecxz convert_to_quoted_string
- cmp byte [esi],'\'
- jne convert_to_quoted_string
- inc esi
- dec ecx
- dec ebx
- jmp convert_to_quoted_string
- symbol_character_conversion:
- cmp al,22h
- je after_macro_operators
- cmp al,'`'
- je reduce_symbol_conversion
- lea ebx,[edi+5]
- xor ecx,ecx
- or al,al
- jz convert_to_quoted_string
- cmp al,'#'
- je convert_to_quoted_string
- inc ecx
- convert_to_quoted_string:
- sub ebx,edx
- ja shift_line_data
- mov al,22h
- mov dl,al
- stos byte [edi]
- mov ebx,edi
- mov eax,ecx
- stos dword [edi]
- rep movs byte [edi],[esi]
- cmp edi,esi
- je before_macro_operators
- jmp after_macro_operators
- shift_line_data:
- push ecx
- mov edx,esi
- lea esi,[ebp-1]
- add ebp,ebx
- lea edi,[ebp-1]
- lea ecx,[esi+1]
- sub ecx,edx
- std
- rep movs byte [edi],[esi]
- cld
- pop eax
- sub edi,3
- mov dl,22h
- mov [edi-1],dl
- mov ebx,edi
- mov [edi],eax
- lea esi,[edi+4+eax]
- jmp before_macro_operators
- concatenation:
- cmp dl,1Ah
- je symbol_concatenation
- cmp dl,22h
- je string_concatenation
- no_concatenation:
- cmp esi,edi
- je before_macro_operators
- jmp after_macro_operators
- symbol_concatenation:
- cmp byte [esi],1Ah
- jne no_concatenation
- inc esi
- lods byte [esi]
- movzx ecx,al
- jecxz do_symbol_concatenation
- cmp byte [esi],'\'
- je concatenate_escaped_symbol
- do_symbol_concatenation:
- add [ebx],cl
- jc name_too_long
- rep movs byte [edi],[esi]
- jmp after_macro_operators
- concatenate_escaped_symbol:
- inc esi
- dec ecx
- jz do_symbol_concatenation
- movzx eax,byte [esi]
- cmp byte [characters+eax],0
- jne do_symbol_concatenation
- sub esi,3
- jmp no_concatenation
- string_concatenation:
- cmp byte [esi],22h
- je do_string_concatenation
- cmp byte [esi],'`'
- jne no_concatenation
- concatenate_converted_symbol:
- inc esi
- mov al,[esi]
- cmp al,'`'
- je concatenate_converted_symbol
- cmp al,22h
- je do_string_concatenation
- cmp al,1Ah
- jne concatenate_converted_symbol_character
- inc esi
- lods byte [esi]
- movzx ecx,al
- jecxz finish_concatenating_converted_symbol
- cmp byte [esi],'\'
- jne finish_concatenating_converted_symbol
- inc esi
- dec ecx
- finish_concatenating_converted_symbol:
- add [ebx],ecx
- rep movs byte [edi],[esi]
- jmp after_macro_operators
- concatenate_converted_symbol_character:
- or al,al
- jz after_macro_operators
- cmp al,'#'
- je after_macro_operators
- inc dword [ebx]
- movs byte [edi],[esi]
- jmp after_macro_operators
- do_string_concatenation:
- inc esi
- lods dword [esi]
- mov ecx,eax
- add [ebx],eax
- rep movs byte [edi],[esi]
- after_macro_operators:
- lods byte [esi]
- cmp al,'`'
- je symbol_conversion
- cmp al,'#'
- je concatenation
- stos byte [edi]
- cmp al,1Ah
- je symbol_after_macro_operators
- cmp al,3Bh
- je no_more_macro_operators
- cmp al,22h
- je string_after_macro_operators
- xor dl,dl
- or al,al
- jnz after_macro_operators
- ret
- symbol_after_macro_operators:
- mov dl,1Ah
- mov ebx,edi
- lods byte [esi]
- stos byte [edi]
- movzx ecx,al
- jecxz symbol_after_macro_operatorss_ok
- cmp byte [esi],'\'
- je escaped_symbol
- symbol_after_macro_operatorss_ok:
- rep movs byte [edi],[esi]
- jmp after_macro_operators
- string_after_macro_operators:
- mov dl,22h
- mov ebx,edi
- lods dword [esi]
- stos dword [edi]
- mov ecx,eax
- rep movs byte [edi],[esi]
- jmp after_macro_operators
-
-use_macro:
- push [free_additional_memory]
- push [macro_symbols]
- mov [macro_symbols],0
- push [counter_limit]
- push dword [edx+4]
- mov dword [edx+4],1
- push edx
- mov ebx,esi
- mov esi,[edx+8]
- mov eax,[edx+12]
- mov [macro_line],eax
- mov [counter_limit],0
- xor ebp,ebp
- process_macro_arguments:
- mov al,[esi]
- or al,al
- jz arguments_end
- cmp al,'{'
- je arguments_end
- inc esi
- cmp al,'['
- jne get_macro_arguments
- mov ebp,esi
- inc esi
- inc [counter_limit]
- get_macro_arguments:
- call get_macro_argument
- lods byte [esi]
- cmp al,','
- je next_argument
- cmp al,']'
- je next_arguments_group
- cmp al,'&'
- je arguments_end
- dec esi
- jmp arguments_end
- next_argument:
- cmp byte [ebx],','
- jne process_macro_arguments
- inc ebx
- jmp process_macro_arguments
- next_arguments_group:
- cmp byte [ebx],','
- jne arguments_end
- inc ebx
- inc [counter_limit]
- mov esi,ebp
- jmp process_macro_arguments
- get_macro_argument:
- lods byte [esi]
- movzx ecx,al
- mov eax,[counter_limit]
- call add_macro_symbol
- add esi,ecx
- xor eax,eax
- mov [default_argument_value],eax
- cmp byte [esi],'*'
- je required_value
- cmp byte [esi],':'
- je get_default_value
- cmp byte [esi],'='
- jne default_value_ok
- get_default_value:
- inc esi
- mov [default_argument_value],esi
- or [skip_default_argument_value],-1
- call skip_macro_argument_value
- jmp default_value_ok
- required_value:
- inc esi
- or [default_argument_value],-1
- default_value_ok:
- xchg esi,ebx
- mov [edx+12],esi
- mov [skip_default_argument_value],0
- cmp byte [ebx],'&'
- je greedy_macro_argument
- call skip_macro_argument_value
- call finish_macro_argument
- jmp got_macro_argument
- greedy_macro_argument:
- call skip_foreign_line
- dec esi
- mov eax,[edx+12]
- mov ecx,esi
- sub ecx,eax
- mov [edx+8],ecx
- got_macro_argument:
- xchg esi,ebx
- cmp dword [edx+8],0
- jne macro_argument_ok
- mov eax,[default_argument_value]
- or eax,eax
- jz macro_argument_ok
- cmp eax,-1
- je invalid_macro_arguments
- mov [edx+12],eax
- call finish_macro_argument
- macro_argument_ok:
- ret
- finish_macro_argument:
- mov eax,[edx+12]
- mov ecx,esi
- sub ecx,eax
- cmp byte [eax],'<'
- jne argument_value_length_ok
- inc dword [edx+12]
- sub ecx,2
- or ecx,80000000h
- argument_value_length_ok:
- mov [edx+8],ecx
- ret
- arguments_end:
- cmp byte [ebx],0
- jne invalid_macro_arguments
- mov eax,[esp+4]
- dec eax
- call process_macro
- pop edx
- pop dword [edx+4]
- pop [counter_limit]
- pop [macro_symbols]
- pop [free_additional_memory]
- jmp line_preprocessed
-use_instant_macro:
- push edi
- push [current_line]
- push esi
- mov eax,[error_line]
- mov [current_line],eax
- mov [macro_line],eax
- mov esi,[instant_macro_start]
- cmp [base_code],10h
- jae do_match
- cmp [base_code],0
- jne do_irp
- call precalculate_value
- cmp eax,0
- jl value_out_of_range
- push [free_additional_memory]
- push [macro_symbols]
- mov [macro_symbols],0
- push [counter_limit]
- mov [struc_name],0
- mov [counter_limit],eax
- lods byte [esi]
- or al,al
- jz rept_counters_ok
- cmp al,'{'
- je rept_counters_ok
- cmp al,1Ah
- jne invalid_macro_arguments
- add_rept_counter:
- lods byte [esi]
- movzx ecx,al
- xor eax,eax
- call add_macro_symbol
- add esi,ecx
- xor eax,eax
- mov dword [edx+12],eax
- inc eax
- mov dword [edx+8],eax
- lods byte [esi]
- cmp al,':'
- jne rept_counter_added
- push edx
- call precalculate_value
- mov edx,eax
- add edx,[counter_limit]
- jo value_out_of_range
- pop edx
- mov dword [edx+8],eax
- lods byte [esi]
- rept_counter_added:
- cmp al,','
- jne rept_counters_ok
- lods byte [esi]
- cmp al,1Ah
- jne invalid_macro_arguments
- jmp add_rept_counter
- rept_counters_ok:
- dec esi
- cmp [counter_limit],0
- je instant_macro_finish
- instant_macro_parameters_ok:
- xor eax,eax
- call process_macro
- instant_macro_finish:
- pop [counter_limit]
- pop [macro_symbols]
- pop [free_additional_memory]
- instant_macro_done:
- pop ebx esi edx
- cmp byte [ebx],0
- je line_preprocessed
- mov [current_line],edi
- mov ecx,4
- rep movs dword [edi],[esi]
- test [macro_status],0Fh
- jz instant_macro_attached_line
- mov ax,3Bh
- stos word [edi]
- instant_macro_attached_line:
- mov esi,ebx
- sub edx,ebx
- mov ecx,edx
- call move_data
- jmp initial_preprocessing_ok
- precalculate_value:
- push edi
- call convert_expression
- mov al,')'
- stosb
- push esi
- mov esi,[esp+4]
- mov [error_line],0
- mov [value_size],0
- call calculate_expression
- cmp [error_line],0
- je value_precalculated
- jmp [error]
- value_precalculated:
- mov eax,[edi]
- mov ecx,[edi+4]
- cdq
- cmp edx,ecx
- jne value_out_of_range
- cmp dl,[edi+13]
- jne value_out_of_range
- pop esi edi
- ret
-do_irp:
- cmp byte [esi],1Ah
- jne invalid_macro_arguments
- movzx eax,byte [esi+1]
- lea esi,[esi+2+eax]
- lods byte [esi]
- cmp [base_code],1
- ja irps_name_ok
- cmp al,':'
- je irp_with_default_value
- cmp al,'='
- je irp_with_default_value
- cmp al,'*'
- jne irp_name_ok
- lods byte [esi]
- irp_name_ok:
- cmp al,','
- jne invalid_macro_arguments
- jmp irp_parameters_start
- irp_with_default_value:
- xor ebp,ebp
- or [skip_default_argument_value],-1
- call skip_macro_argument_value
- cmp byte [esi],','
- jne invalid_macro_arguments
- inc esi
- jmp irp_parameters_start
- irps_name_ok:
- cmp al,','
- jne invalid_macro_arguments
- cmp [base_code],3
- je irp_parameters_start
- mov al,[esi]
- or al,al
- jz instant_macro_done
- cmp al,'{'
- je instant_macro_done
- irp_parameters_start:
- xor eax,eax
- push [free_additional_memory]
- push [macro_symbols]
- mov [macro_symbols],eax
- push [counter_limit]
- mov [counter_limit],eax
- mov [struc_name],eax
- cmp [base_code],3
- je get_irpv_parameter
- mov ebx,esi
- cmp [base_code],2
- je get_irps_parameter
- mov edx,[parameters_end]
- mov al,[edx]
- push eax
- mov byte [edx],0
- get_irp_parameter:
- inc [counter_limit]
- mov esi,[instant_macro_start]
- inc esi
- call get_macro_argument
- cmp byte [ebx],','
- jne irp_parameters_end
- inc ebx
- jmp get_irp_parameter
- irp_parameters_end:
- mov esi,ebx
- pop eax
- mov [esi],al
- jmp instant_macro_parameters_ok
- get_irps_parameter:
- mov esi,[instant_macro_start]
- inc esi
- lods byte [esi]
- movzx ecx,al
- inc [counter_limit]
- mov eax,[counter_limit]
- call add_macro_symbol
- mov [edx+12],ebx
- cmp byte [ebx],1Ah
- je irps_symbol
- cmp byte [ebx],22h
- je irps_quoted_string
- mov eax,1
- jmp irps_parameter_ok
- irps_quoted_string:
- mov eax,[ebx+1]
- add eax,1+4
- jmp irps_parameter_ok
- irps_symbol:
- movzx eax,byte [ebx+1]
- add eax,1+1
- irps_parameter_ok:
- mov [edx+8],eax
- add ebx,eax
- cmp byte [ebx],0
- je irps_parameters_end
- cmp byte [ebx],'{'
- jne get_irps_parameter
- irps_parameters_end:
- mov esi,ebx
- jmp instant_macro_parameters_ok
- get_irpv_parameter:
- lods byte [esi]
- cmp al,1Ah
- jne invalid_macro_arguments
- lods byte [esi]
- mov ebp,esi
- mov cl,al
- mov ch,10b
- call get_preprocessor_symbol
- jc instant_macro_finish
- test edx,edx
- jz invalid_use_of_symbol
- push edx
- mark_variable_value:
- inc [counter_limit]
- mov [edx+4],ebp
- next_variable_value:
- mov edx,[edx]
- or edx,edx
- jz variable_values_marked
- mov eax,[edx+4]
- cmp eax,1
- jbe next_variable_value
- mov esi,ebp
- movzx ecx,byte [esi-1]
- xchg edi,eax
- repe cmps byte [esi],[edi]
- xchg edi,eax
- je mark_variable_value
- jmp next_variable_value
- variable_values_marked:
- pop edx
- push [counter_limit]
- add_irpv_value:
- push edx
- mov esi,[instant_macro_start]
- inc esi
- lods byte [esi]
- movzx ecx,al
- mov eax,[esp+4]
- call add_macro_symbol
- mov ebx,edx
- pop edx
- mov ecx,[edx+12]
- mov eax,[edx+8]
- mov [ebx+12],eax
- mov [ebx+8],ecx
- collect_next_variable_value:
- mov edx,[edx]
- or edx,edx
- jz variable_values_collected
- cmp ebp,[edx+4]
- jne collect_next_variable_value
- dec dword [esp]
- jnz add_irpv_value
- variable_values_collected:
- pop eax
- mov esi,ebp
- movzx ecx,byte [esi-1]
- add esi,ecx
- cmp byte [esi],0
- je instant_macro_parameters_ok
- cmp byte [esi],'{'
- jne invalid_macro_arguments
- jmp instant_macro_parameters_ok
-
-do_match:
- mov ebx,esi
- call skip_pattern
- call exact_match
- mov edx,edi
- mov al,[ebx]
- cmp al,1Ah
- je free_match
- cmp al,','
- jne instant_macro_done
- cmp esi,[parameters_end]
- je matched_pattern
- jmp instant_macro_done
- free_match:
- add edx,12
- cmp edx,[memory_end]
- ja out_of_memory
- mov [edx-12],ebx
- mov [edx-8],esi
- call skip_match_element
- jc try_different_matching
- mov [edx-4],esi
- movzx eax,byte [ebx+1]
- lea ebx,[ebx+2+eax]
- cmp byte [ebx],1Ah
- je free_match
- find_exact_match:
- call exact_match
- cmp esi,[parameters_end]
- je end_matching
- cmp byte [ebx],1Ah
- je free_match
- mov ebx,[edx-12]
- movzx eax,byte [ebx+1]
- lea ebx,[ebx+2+eax]
- mov esi,[edx-4]
- jmp match_more_elements
- try_different_matching:
- sub edx,12
- cmp edx,edi
- je instant_macro_done
- mov ebx,[edx-12]
- movzx eax,byte [ebx+1]
- lea ebx,[ebx+2+eax]
- cmp byte [ebx],1Ah
- je try_different_matching
- mov esi,[edx-4]
- match_more_elements:
- call skip_match_element
- jc try_different_matching
- mov [edx-4],esi
- jmp find_exact_match
- skip_match_element:
- cmp esi,[parameters_end]
- je cannot_match
- mov al,[esi]
- cmp al,1Ah
- je skip_match_symbol
- cmp al,22h
- je skip_match_quoted_string
- add esi,1
- ret
- skip_match_quoted_string:
- mov eax,[esi+1]
- add esi,5
- jmp skip_match_ok
- skip_match_symbol:
- movzx eax,byte [esi+1]
- add esi,2
- skip_match_ok:
- add esi,eax
- ret
- cannot_match:
- stc
- ret
- exact_match:
- cmp esi,[parameters_end]
- je exact_match_complete
- mov ah,[esi]
- mov al,[ebx]
- cmp al,','
- je exact_match_complete
- cmp al,1Ah
- je exact_match_complete
- cmp al,'='
- je match_verbatim
- call match_elements
- je exact_match
- exact_match_complete:
- ret
- match_verbatim:
- inc ebx
- call match_elements
- je exact_match
- dec ebx
- ret
- match_elements:
- mov al,[ebx]
- cmp al,1Ah
- je match_symbols
- cmp al,22h
- je match_quoted_strings
- cmp al,ah
- je symbol_characters_matched
- ret
- symbol_characters_matched:
- lea ebx,[ebx+1]
- lea esi,[esi+1]
- ret
- match_quoted_strings:
- mov ecx,[ebx+1]
- add ecx,5
- jmp compare_elements
- match_symbols:
- movzx ecx,byte [ebx+1]
- add ecx,2
- compare_elements:
- mov eax,esi
- mov ebp,edi
- mov edi,ebx
- repe cmps byte [esi],[edi]
- jne elements_mismatch
- mov ebx,edi
- mov edi,ebp
- ret
- elements_mismatch:
- mov esi,eax
- mov edi,ebp
- ret
- end_matching:
- cmp byte [ebx],','
- jne instant_macro_done
- matched_pattern:
- xor eax,eax
- push [free_additional_memory]
- push [macro_symbols]
- mov [macro_symbols],eax
- push [counter_limit]
- mov [counter_limit],eax
- mov [struc_name],eax
- push esi edi edx
- add_matched_symbol:
- cmp edi,[esp]
- je matched_symbols_ok
- mov esi,[edi]
- inc esi
- lods byte [esi]
- movzx ecx,al
- xor eax,eax
- call add_macro_symbol
- mov eax,[edi+4]
- mov dword [edx+12],eax
- mov ecx,[edi+8]
- sub ecx,eax
- mov dword [edx+8],ecx
- add edi,12
- jmp add_matched_symbol
- matched_symbols_ok:
- pop edx edi esi
- jmp instant_macro_parameters_ok
-
-process_macro:
- push dword [macro_status]
- or [macro_status],10h
- push [counter]
- push [macro_block]
- push [macro_block_line]
- push [macro_block_line_number]
- push [struc_label]
- push [struc_name]
- push eax
- push [current_line]
- lods byte [esi]
- cmp al,'{'
- je macro_instructions_start
- or al,al
- jnz unexpected_characters
- find_macro_instructions:
- mov [macro_line],esi
- add esi,16+2
- lods byte [esi]
- or al,al
- jz find_macro_instructions
- cmp al,'{'
- je macro_instructions_start
- cmp al,3Bh
- jne unexpected_characters
- call skip_foreign_symbol
- jmp find_macro_instructions
- macro_instructions_start:
- mov ecx,80000000h
- mov [macro_block],esi
- mov eax,[macro_line]
- mov [macro_block_line],eax
- mov [macro_block_line_number],ecx
- xor eax,eax
- mov [counter],eax
- cmp [counter_limit],eax
- je process_macro_line
- inc [counter]
- process_macro_line:
- lods byte [esi]
- or al,al
- jz process_next_line
- cmp al,'}'
- je macro_block_processed
- dec esi
- mov [current_line],edi
- lea eax,[edi+10h]
- cmp eax,[memory_end]
- jae out_of_memory
- mov eax,[esp+4]
- or eax,eax
- jz instant_macro_line_header
- stos dword [edi]
- mov eax,ecx
- stos dword [edi]
- mov eax,[esp]
- stos dword [edi]
- mov eax,[macro_line]
- stos dword [edi]
- jmp macro_line_header_ok
- instant_macro_line_header:
- mov eax,[esp]
- add eax,16
- find_defining_directive:
- inc eax
- cmp byte [eax-1],3Bh
- je defining_directive_ok
- cmp byte [eax-1],1Ah
- jne find_defining_directive
- push eax
- movzx eax,byte [eax]
- inc eax
- add [esp],eax
- pop eax
- jmp find_defining_directive
- defining_directive_ok:
- stos dword [edi]
- mov eax,ecx
- stos dword [edi]
- mov eax,[macro_line]
- stos dword [edi]
- stos dword [edi]
- macro_line_header_ok:
- or [macro_status],20h
- push ebx ecx
- test [macro_status],0Fh
- jz process_macro_line_element
- mov ax,3Bh
- stos word [edi]
- process_macro_line_element:
- lea eax,[edi+100h]
- cmp eax,[memory_end]
- jae out_of_memory
- lods byte [esi]
- cmp al,'}'
- je macro_line_processed
- or al,al
- jz macro_line_processed
- cmp al,1Ah
- je process_macro_symbol
- cmp al,3Bh
- je macro_foreign_line
- and [macro_status],not 20h
- stos byte [edi]
- cmp al,22h
- jne process_macro_line_element
- copy_macro_string:
- mov ecx,[esi]
- add ecx,4
- call move_data
- jmp process_macro_line_element
- process_macro_symbol:
- push esi edi
- test [macro_status],20h
- jz not_macro_directive
- movzx ecx,byte [esi]
- inc esi
- mov edi,macro_directives
- call get_directive
- jnc process_macro_directive
- dec esi
- jmp not_macro_directive
- process_macro_directive:
- mov edx,eax
- pop edi eax
- mov byte [edi],0
- inc edi
- pop ecx ebx
- jmp near edx
- not_macro_directive:
- and [macro_status],not 20h
- movzx ecx,byte [esi]
- inc esi
- mov eax,[counter]
- call get_macro_symbol
- jnc group_macro_symbol
- xor eax,eax
- cmp [counter],eax
- je multiple_macro_symbol_values
- call get_macro_symbol
- jc not_macro_symbol
- replace_macro_symbol:
- pop edi eax
- mov ecx,[edx+8]
- mov edx,[edx+12]
- or edx,edx
- jz replace_macro_counter
- and ecx,not 80000000h
- xchg esi,edx
- call move_data
- mov esi,edx
- jmp process_macro_line_element
- group_macro_symbol:
- xor eax,eax
- cmp [counter],eax
- je replace_macro_symbol
- push esi edx
- sub esi,ecx
- call get_macro_symbol
- mov ebx,edx
- pop edx esi
- jc replace_macro_symbol
- cmp edx,ebx
- ja replace_macro_symbol
- mov edx,ebx
- jmp replace_macro_symbol
- multiple_macro_symbol_values:
- inc eax
- push eax
- call get_macro_symbol
- pop eax
- jc not_macro_symbol
- pop edi
- push ecx
- mov ecx,[edx+8]
- mov edx,[edx+12]
- xchg esi,edx
- btr ecx,31
- jc enclose_macro_symbol_value
- rep movs byte [edi],[esi]
- jmp macro_symbol_value_ok
- enclose_macro_symbol_value:
- mov byte [edi],'<'
- inc edi
- rep movs byte [edi],[esi]
- mov byte [edi],'>'
- inc edi
- macro_symbol_value_ok:
- cmp eax,[counter_limit]
- je multiple_macro_symbol_values_ok
- mov byte [edi],','
- inc edi
- mov esi,edx
- pop ecx
- push edi
- sub esi,ecx
- jmp multiple_macro_symbol_values
- multiple_macro_symbol_values_ok:
- pop ecx eax
- mov esi,edx
- jmp process_macro_line_element
- replace_macro_counter:
- mov eax,[counter]
- and eax,not 80000000h
- jz group_macro_counter
- add ecx,eax
- dec ecx
- call store_number_symbol
- jmp process_macro_line_element
- group_macro_counter:
- mov edx,ecx
- xor ecx,ecx
- multiple_macro_counter_values:
- push ecx edx
- add ecx,edx
- call store_number_symbol
- pop edx ecx
- inc ecx
- cmp ecx,[counter_limit]
- je process_macro_line_element
- mov byte [edi],','
- inc edi
- jmp multiple_macro_counter_values
- store_number_symbol:
- cmp ecx,0
- jge numer_symbol_sign_ok
- neg ecx
- mov al,'-'
- stos byte [edi]
- numer_symbol_sign_ok:
- mov ax,1Ah
- stos word [edi]
- push edi
- mov eax,ecx
- mov ecx,1000000000
- xor edx,edx
- xor bl,bl
- store_number_digits:
- div ecx
- push edx
- or bl,bl
- jnz store_number_digit
- cmp ecx,1
- je store_number_digit
- or al,al
- jz number_digit_ok
- not bl
- store_number_digit:
- add al,30h
- stos byte [edi]
- number_digit_ok:
- mov eax,ecx
- xor edx,edx
- mov ecx,10
- div ecx
- mov ecx,eax
- pop eax
- or ecx,ecx
- jnz store_number_digits
- pop ebx
- mov eax,edi
- sub eax,ebx
- mov [ebx-1],al
- ret
- not_macro_symbol:
- pop edi esi
- mov al,1Ah
- stos byte [edi]
- mov al,[esi]
- inc esi
- stos byte [edi]
- cmp byte [esi],'.'
- jne copy_raw_symbol
- mov ebx,[esp+8+8]
- or ebx,ebx
- jz copy_raw_symbol
- cmp al,1
- je copy_struc_name
- xchg esi,ebx
- movzx ecx,byte [esi-1]
- add [edi-1],cl
- jc name_too_long
- rep movs byte [edi],[esi]
- xchg esi,ebx
- copy_raw_symbol:
- movzx ecx,al
- rep movs byte [edi],[esi]
- jmp process_macro_line_element
- copy_struc_name:
- inc esi
- xchg esi,ebx
- movzx ecx,byte [esi-1]
- mov [edi-1],cl
- rep movs byte [edi],[esi]
- xchg esi,ebx
- mov eax,[esp+8+12]
- cmp byte [eax],3Bh
- je process_macro_line_element
- cmp byte [eax],1Ah
- jne disable_replaced_struc_name
- mov byte [eax],3Bh
- jmp process_macro_line_element
- disable_replaced_struc_name:
- mov ebx,[esp+8+8]
- push esi edi
- lea edi,[ebx-3]
- lea esi,[edi-2]
- lea ecx,[esi+1]
- sub ecx,eax
- std
- rep movs byte [edi],[esi]
- cld
- mov word [eax],3Bh
- pop edi esi
- jmp process_macro_line_element
- skip_foreign_symbol:
- lods byte [esi]
- movzx eax,al
- add esi,eax
- skip_foreign_line:
- lods byte [esi]
- cmp al,1Ah
- je skip_foreign_symbol
- cmp al,3Bh
- je skip_foreign_symbol
- cmp al,22h
- je skip_foreign_string
- or al,al
- jnz skip_foreign_line
- ret
- skip_foreign_string:
- lods dword [esi]
- add esi,eax
- jmp skip_foreign_line
- macro_foreign_line:
- call skip_foreign_symbol
- macro_line_processed:
- mov byte [edi],0
- inc edi
- push eax
- call preprocess_line
- pop eax
- pop ecx ebx
- cmp al,'}'
- je macro_block_processed
- process_next_line:
- inc ecx
- mov [macro_line],esi
- add esi,16+2
- jmp process_macro_line
- macro_block_processed:
- call close_macro_block
- jc process_macro_line
- pop [current_line]
- add esp,12
- pop [macro_block_line_number]
- pop [macro_block_line]
- pop [macro_block]
- pop [counter]
- pop eax
- and al,0F0h
- and [macro_status],0Fh
- or [macro_status],al
- ret
-
-local_symbols:
- lods byte [esi]
- cmp al,1Ah
- jne invalid_argument
- mov byte [edi-1],3Bh
- xor al,al
- stos byte [edi]
- make_local_symbol:
- push ecx
- lods byte [esi]
- movzx ecx,al
- mov eax,[counter]
- call add_macro_symbol
- mov [edx+12],edi
- movzx eax,[locals_counter]
- add eax,ecx
- inc eax
- cmp eax,100h
- jae name_too_long
- lea ebp,[edi+2+eax]
- cmp ebp,[memory_end]
- jae out_of_memory
- mov ah,al
- mov al,1Ah
- stos word [edi]
- rep movs byte [edi],[esi]
- mov al,'?'
- stos byte [edi]
- push esi
- mov esi,locals_counter+1
- movzx ecx,[locals_counter]
- rep movs byte [edi],[esi]
- pop esi
- mov eax,edi
- sub eax,[edx+12]
- mov [edx+8],eax
- xor al,al
- stos byte [edi]
- mov eax,locals_counter
- movzx ecx,byte [eax]
- counter_loop:
- inc byte [eax+ecx]
- cmp byte [eax+ecx],'9'+1
- jb counter_ok
- jne letter_digit
- mov byte [eax+ecx],'A'
- jmp counter_ok
- letter_digit:
- cmp byte [eax+ecx],'Z'+1
- jb counter_ok
- jne small_letter_digit
- mov byte [eax+ecx],'a'
- jmp counter_ok
- small_letter_digit:
- cmp byte [eax+ecx],'z'+1
- jb counter_ok
- mov byte [eax+ecx],'0'
- loop counter_loop
- inc byte [eax]
- movzx ecx,byte [eax]
- mov byte [eax+ecx],'0'
- counter_ok:
- pop ecx
- lods byte [esi]
- cmp al,'}'
- je macro_block_processed
- or al,al
- jz process_next_line
- cmp al,','
- jne extra_characters_on_line
- dec edi
- lods byte [esi]
- cmp al,1Ah
- je make_local_symbol
- jmp invalid_argument
-common_block:
- call close_macro_block
- jc process_macro_line
- mov [counter],0
- jmp new_macro_block
-forward_block:
- cmp [counter_limit],0
- je common_block
- call close_macro_block
- jc process_macro_line
- mov [counter],1
- jmp new_macro_block
-reverse_block:
- cmp [counter_limit],0
- je common_block
- call close_macro_block
- jc process_macro_line
- mov eax,[counter_limit]
- or eax,80000000h
- mov [counter],eax
- new_macro_block:
- mov [macro_block],esi
- mov eax,[macro_line]
- mov [macro_block_line],eax
- mov [macro_block_line_number],ecx
- jmp process_macro_line
-close_macro_block:
- cmp esi,[macro_block]
- je block_closed
- cmp [counter],0
- je block_closed
- jl reverse_counter
- mov eax,[counter]
- cmp eax,[counter_limit]
- je block_closed
- inc [counter]
- jmp continue_block
- reverse_counter:
- mov eax,[counter]
- dec eax
- cmp eax,80000000h
- je block_closed
- mov [counter],eax
- continue_block:
- mov esi,[macro_block]
- mov eax,[macro_block_line]
- mov [macro_line],eax
- mov ecx,[macro_block_line_number]
- stc
- ret
- block_closed:
- clc
- ret
-get_macro_symbol:
- push ecx
- call find_macro_symbol_leaf
- jc macro_symbol_not_found
- mov edx,[ebx]
- mov ebx,esi
- try_macro_symbol:
- or edx,edx
- jz macro_symbol_not_found
- mov ecx,[esp]
- mov edi,[edx+4]
- repe cmps byte [esi],[edi]
- je macro_symbol_found
- mov esi,ebx
- mov edx,[edx]
- jmp try_macro_symbol
- macro_symbol_found:
- pop ecx
- clc
- ret
- macro_symbol_not_found:
- pop ecx
- stc
- ret
- find_macro_symbol_leaf:
- shl eax,8
- mov al,cl
- mov ebp,eax
- mov ebx,macro_symbols
- follow_macro_symbols_tree:
- mov edx,[ebx]
- or edx,edx
- jz no_such_macro_symbol
- xor eax,eax
- shr ebp,1
- adc eax,0
- lea ebx,[edx+eax*4]
- or ebp,ebp
- jnz follow_macro_symbols_tree
- add ebx,8
- clc
- ret
- no_such_macro_symbol:
- stc
- ret
-add_macro_symbol:
- push ebx ebp
- call find_macro_symbol_leaf
- jc extend_macro_symbol_tree
- mov eax,[ebx]
- make_macro_symbol:
- mov edx,[free_additional_memory]
- add edx,16
- cmp edx,[labels_list]
- ja out_of_memory
- xchg edx,[free_additional_memory]
- mov [ebx],edx
- mov [edx],eax
- mov [edx+4],esi
- pop ebp ebx
- ret
- extend_macro_symbol_tree:
- mov edx,[free_additional_memory]
- add edx,16
- cmp edx,[labels_list]
- ja out_of_memory
- xchg edx,[free_additional_memory]
- xor eax,eax
- mov [edx],eax
- mov [edx+4],eax
- mov [edx+8],eax
- mov [edx+12],eax
- shr ebp,1
- adc eax,0
- mov [ebx],edx
- lea ebx,[edx+eax*4]
- or ebp,ebp
- jnz extend_macro_symbol_tree
- add ebx,8
- xor eax,eax
- jmp make_macro_symbol
-
-include_file:
- lods byte [esi]
- cmp al,22h
- jne invalid_argument
- lods dword [esi]
- cmp byte [esi+eax],0
- jne extra_characters_on_line
- push esi
- push edi
- mov ebx,[current_line]
- find_current_file_path:
- mov esi,[ebx]
- test byte [ebx+7],80h
- jz copy_current_file_path
- mov ebx,[ebx+8]
- jmp find_current_file_path
- copy_current_file_path:
- lods byte [esi]
- stos byte [edi]
- or al,al
- jnz copy_current_file_path
- cut_current_file_name:
- cmp edi,[esp]
- je current_file_path_ok
- cmp byte [edi-1],'\'
- je current_file_path_ok
- cmp byte [edi-1],'/'
- je current_file_path_ok
- dec edi
- jmp cut_current_file_name
- current_file_path_ok:
- mov esi,[esp+4]
- call expand_path
- pop edx
- mov esi,edx
- call open
- jnc include_path_ok
- mov ebp,[include_paths]
- try_include_directories:
- mov edi,esi
- mov esi,ebp
- cmp byte [esi],0
- je try_in_current_directory
- push ebp
- push edi
- call get_include_directory
- mov [esp+4],esi
- mov esi,[esp+8]
- call expand_path
- pop edx
- mov esi,edx
- call open
- pop ebp
- jnc include_path_ok
- jmp try_include_directories
- mov edi,esi
- try_in_current_directory:
- mov esi,[esp]
- push edi
- call expand_path
- pop edx
- mov esi,edx
- call open
- jc file_not_found
- include_path_ok:
- mov edi,[esp]
- copy_preprocessed_path:
- lods byte [esi]
- stos byte [edi]
- or al,al
- jnz copy_preprocessed_path
- pop esi
- lea ecx,[edi-1]
- sub ecx,esi
- mov [esi-4],ecx
- push dword [macro_status]
- and [macro_status],0Fh
- call preprocess_file
- pop eax
- and al,0F0h
- and [macro_status],0Fh
- or [macro_status],al
- jmp line_preprocessed
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-dump_symbols:
- mov edi,[code_start]
- call setup_dump_header
- mov esi,[input_file]
- call copy_asciiz
- cmp edi,[tagged_blocks]
- jae out_of_memory
- mov eax,edi
- sub eax,ebx
- mov [ebx-40h+0Ch],eax
- mov esi,[output_file]
- call copy_asciiz
- cmp edi,[tagged_blocks]
- jae out_of_memory
- mov edx,[symbols_stream]
- mov ebp,[free_additional_memory]
- and [number_of_sections],0
- cmp [output_format],4
- je prepare_strings_table
- cmp [output_format],5
- jne strings_table_ready
- bt [format_flags],0
- jc strings_table_ready
- prepare_strings_table:
- cmp edx,ebp
- je strings_table_ready
- mov al,[edx]
- test al,al
- jz prepare_string
- cmp al,80h
- je prepare_string
- add edx,0Ch
- cmp al,0C0h
- jb prepare_strings_table
- add edx,4
- jmp prepare_strings_table
- prepare_string:
- mov esi,edi
- sub esi,ebx
- xchg esi,[edx+4]
- test al,al
- jz prepare_section_string
- or dword [edx+4],1 shl 31
- add edx,0Ch
- prepare_external_string:
- mov ecx,[esi]
- add esi,4
- rep movs byte [edi],[esi]
- mov byte [edi],0
- inc edi
- cmp edi,[tagged_blocks]
- jae out_of_memory
- jmp prepare_strings_table
- prepare_section_string:
- mov ecx,[number_of_sections]
- mov eax,ecx
- inc eax
- mov [number_of_sections],eax
- xchg eax,[edx+4]
- shl ecx,2
- add ecx,[free_additional_memory]
- mov [ecx],eax
- add edx,20h
- test esi,esi
- jz prepare_default_section_string
- cmp [output_format],5
- jne prepare_external_string
- bt [format_flags],0
- jc prepare_external_string
- mov esi,[esi]
- add esi,[resource_data]
- copy_elf_section_name:
- lods byte [esi]
- cmp edi,[tagged_blocks]
- jae out_of_memory
- stos byte [edi]
- test al,al
- jnz copy_elf_section_name
- jmp prepare_strings_table
- prepare_default_section_string:
- mov eax,'.fla'
- stos dword [edi]
- mov ax,'t'
- stos word [edi]
- cmp edi,[tagged_blocks]
- jae out_of_memory
- jmp prepare_strings_table
- strings_table_ready:
- mov edx,[tagged_blocks]
- mov ebp,[memory_end]
- sub ebp,[labels_list]
- add ebp,edx
- prepare_labels_dump:
- cmp edx,ebp
- je labels_dump_ok
- mov eax,[edx+24]
- test eax,eax
- jz label_dump_name_ok
- cmp eax,[memory_start]
- jb label_name_outside_source
- cmp eax,[source_start]
- ja label_name_outside_source
- sub eax,[memory_start]
- dec eax
- mov [edx+24],eax
- jmp label_dump_name_ok
- label_name_outside_source:
- mov esi,eax
- mov eax,edi
- sub eax,ebx
- or eax,1 shl 31
- mov [edx+24],eax
- movzx ecx,byte [esi-1]
- lea eax,[edi+ecx+1]
- cmp edi,[tagged_blocks]
- jae out_of_memory
- rep movsb
- xor al,al
- stosb
- label_dump_name_ok:
- mov eax,[edx+28]
- test eax,eax
- jz label_dump_line_ok
- 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
- cmp eax,[symbols_stream]
- mov eax,[eax+4]
- jae base_symbol_for_label_ok
- xor eax,eax
- base_symbol_for_label_ok:
- mov [edx+20],eax
- mov ax,[current_pass]
- cmp ax,[edx+16]
- je label_defined_flag_ok
- and byte [edx+8],not 1
- label_defined_flag_ok:
- cmp ax,[edx+18]
- je label_used_flag_ok
- and byte [edx+8],not 8
- label_used_flag_ok:
- add edx,LABEL_STRUCTURE_SIZE
- jmp prepare_labels_dump
- labels_dump_ok:
- mov eax,edi
- sub eax,ebx
- mov [ebx-40h+14h],eax
- add eax,40h
- mov [ebx-40h+18h],eax
- mov ecx,[memory_end]
- sub ecx,[labels_list]
- mov [ebx-40h+1Ch],ecx
- add eax,ecx
- mov [ebx-40h+20h],eax
- mov ecx,[source_start]
- sub ecx,[memory_start]
- mov [ebx-40h+24h],ecx
- add eax,ecx
- mov [ebx-40h+28h],eax
- mov eax,[number_of_sections]
- shl eax,2
- mov [ebx-40h+34h],eax
- call prepare_preprocessed_source
- mov esi,[labels_list]
- mov ebp,edi
- make_lines_dump:
- cmp esi,[tagged_blocks]
- je lines_dump_ok
- mov eax,[esi-4]
- mov ecx,[esi-8]
- sub esi,8
- sub esi,ecx
- cmp eax,1
- je process_line_dump
- cmp eax,2
- jne make_lines_dump
- 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]
- test byte [ebx+0Ah],1
- jz store_offset
- xor eax,eax
- store_offset:
- stos dword [edi]
- mov eax,[esi]
- sub eax,[memory_start]
- stos dword [edi]
- mov eax,[esi+4]
- xor edx,edx
- xor cl,cl
- sub eax,[ebx]
- sbb edx,[ebx+4]
- sbb cl,[ebx+8]
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- mov eax,[ebx+10h]
- stos dword [edi]
- mov eax,[ebx+14h]
- test eax,eax
- jz base_symbol_for_line_ok
- cmp eax,[symbols_stream]
- mov eax,[eax+4]
- jae base_symbol_for_line_ok
- xor eax,eax
- base_symbol_for_line_ok:
- stos dword [edi]
- 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
- sub eax,ebp
- mov [esi],eax
- jmp make_lines_dump
- lines_dump_ok:
- mov edx,edi
- mov eax,[current_offset]
- sub eax,[code_start]
- add eax,[headers_size]
- stos dword [edi]
- mov ecx,edi
- sub ecx,ebx
- sub ecx,[ebx-40h+14h]
- mov [ebx-40h+2Ch],ecx
- add ecx,[ebx-40h+28h]
- mov [ebx-40h+30h],ecx
- add ecx,[ebx-40h+34h]
- mov [ebx-40h+38h],ecx
- find_inexisting_offsets:
- sub edx,1Ch
- cmp edx,ebp
- jb write_symbols
- test byte [edx+1Ah],1
- jnz find_inexisting_offsets
- cmp eax,[edx]
- jb correct_inexisting_offset
- mov eax,[edx]
- jmp find_inexisting_offsets
- correct_inexisting_offset:
- and dword [edx],0
- or byte [edx+1Ah],2
- jmp find_inexisting_offsets
- write_symbols:
- mov edx,[symbols_file]
- call create
- jc write_failed
- mov edx,[code_start]
- mov ecx,[edx+14h]
- add ecx,40h
- call write
- jc write_failed
- mov edx,[tagged_blocks]
- mov ecx,[memory_end]
- sub ecx,[labels_list]
- call write
- jc write_failed
- mov edx,[memory_start]
- mov ecx,[source_start]
- sub ecx,edx
- call write
- jc write_failed
- mov edx,ebp
- mov ecx,edi
- sub ecx,edx
- call write
- jc write_failed
- mov edx,[free_additional_memory]
- mov ecx,[number_of_sections]
- shl ecx,2
- call write
- jc write_failed
- mov esi,[labels_list]
- mov edi,[memory_start]
- make_references_dump:
- cmp esi,[tagged_blocks]
- je references_dump_ok
- mov eax,[esi-4]
- mov ecx,[esi-8]
- sub esi,8
- sub esi,ecx
- cmp eax,2
- je dump_reference
- cmp eax,1
- jne make_references_dump
- mov edx,[esi]
- jmp make_references_dump
- dump_reference:
- mov eax,[memory_end]
- sub eax,[esi]
- sub eax,LABEL_STRUCTURE_SIZE
- stosd
- mov eax,edx
- stosd
- cmp edi,[tagged_blocks]
- jb make_references_dump
- jmp out_of_memory
- references_dump_ok:
- mov edx,[memory_start]
- mov ecx,edi
- sub ecx,edx
- call write
- jc write_failed
- call close
- ret
- setup_dump_header:
- xor eax,eax
- mov ecx,40h shr 2
- rep stos dword [edi]
- mov ebx,edi
- mov dword [ebx-40h],'fas'+1Ah shl 24
- mov dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
- mov dword [ebx-40h+10h],40h
- ret
-prepare_preprocessed_source:
- mov esi,[memory_start]
- mov ebp,[source_start]
- test ebp,ebp
- jnz prepare_preprocessed_line
- mov ebp,[current_line]
- inc ebp
- prepare_preprocessed_line:
- cmp esi,ebp
- jae preprocessed_source_ok
- mov eax,[memory_start]
- mov edx,[input_file]
- cmp [esi],edx
- jne line_not_from_main_input
- mov [esi],eax
- line_not_from_main_input:
- sub [esi],eax
- test byte [esi+7],1 shl 7
- jz prepare_next_preprocessed_line
- sub [esi+8],eax
- sub [esi+12],eax
- prepare_next_preprocessed_line:
- call skip_preprocessed_line
- jmp prepare_preprocessed_line
- preprocessed_source_ok:
- ret
- skip_preprocessed_line:
- add esi,16
- skip_preprocessed_line_content:
- lods byte [esi]
- cmp al,1Ah
- je skip_preprocessed_symbol
- cmp al,3Bh
- je skip_preprocessed_symbol
- cmp al,22h
- je skip_preprocessed_string
- or al,al
- jnz skip_preprocessed_line_content
- ret
- skip_preprocessed_string:
- lods dword [esi]
- add esi,eax
- jmp skip_preprocessed_line_content
- skip_preprocessed_symbol:
- lods byte [esi]
- movzx eax,al
- add esi,eax
- jmp skip_preprocessed_line_content
-restore_preprocessed_source:
- mov esi,[memory_start]
- mov ebp,[source_start]
- test ebp,ebp
- jnz restore_preprocessed_line
- mov ebp,[current_line]
- inc ebp
- restore_preprocessed_line:
- cmp esi,ebp
- jae preprocessed_source_restored
- mov eax,[memory_start]
- add [esi],eax
- cmp [esi],eax
- jne preprocessed_line_source_restored
- mov edx,[input_file]
- mov [esi],edx
- preprocessed_line_source_restored:
- test byte [esi+7],1 shl 7
- jz restore_next_preprocessed_line
- add [esi+8],eax
- add [esi+12],eax
- restore_next_preprocessed_line:
- call skip_preprocessed_line
- jmp restore_preprocessed_line
- preprocessed_source_restored:
- ret
-dump_preprocessed_source:
- mov edi,[free_additional_memory]
- call setup_dump_header
- mov esi,[input_file]
- call copy_asciiz
- cmp edi,[additional_memory_end]
- jae out_of_memory
- mov eax,edi
- sub eax,ebx
- dec eax
- mov [ebx-40h+0Ch],eax
- mov eax,edi
- sub eax,ebx
- mov [ebx-40h+14h],eax
- add eax,40h
- mov [ebx-40h+20h],eax
- call prepare_preprocessed_source
- sub esi,[memory_start]
- mov [ebx-40h+24h],esi
- mov edx,[symbols_file]
- call create
- jc write_failed
- mov edx,[free_additional_memory]
- mov ecx,[edx+14h]
- add ecx,40h
- call write
- jc write_failed
- mov edx,[memory_start]
- mov ecx,esi
- call write
- jc write_failed
- call close
- ret
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-include_variable db 'INCLUDE',0
-
-symbol_characters db 27
- db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\'
-
-preprocessor_directives:
- db 6,'define'
- dw define_symbolic_constant-directive_handler
- db 7,'include'
- dw include_file-directive_handler
- db 3,'irp'
- dw irp_directive-directive_handler
- db 4,'irps'
- dw irps_directive-directive_handler
- db 4,'irpv'
- dw irpv_directive-directive_handler
- db 5,'macro'
- dw define_macro-directive_handler
- db 5,'match'
- dw match_directive-directive_handler
- db 8,'postpone'
- dw postpone_directive-directive_handler
- db 5,'purge'
- dw purge_macro-directive_handler
- db 4,'rept'
- dw rept_directive-directive_handler
- db 7,'restore'
- dw restore_equ_constant-directive_handler
- db 7,'restruc'
- dw purge_struc-directive_handler
- db 5,'struc'
- dw define_struc-directive_handler
- db 0
-
-macro_directives:
- db 6,'common'
- dw common_block-directive_handler
- db 7,'forward'
- dw forward_block-directive_handler
- db 5,'local'
- dw local_symbols-directive_handler
- db 7,'reverse'
- dw reverse_block-directive_handler
- db 0
-
-preprocessor_special_symbols:
- db 4,'file'
- dw preprocessed_file_value-directive_handler
- db 4,'line'
- dw preprocessed_line_value-directive_handler
- db 0
-
-operators:
- db 1,'+',80h
- db 1,'-',81h
- db 1,'*',90h
- db 1,'/',91h
- db 3,'and',0B0h
- db 3,'mod',0A0h
- db 2,'or',0B1h
- db 3,'shl',0C0h
- db 3,'shr',0C1h
- db 3,'xor',0B2h
- db 0
-
-single_operand_operators:
- db 1,'+',82h
- db 1,'-',83h
- db 3,'bsf',0E0h
- db 3,'bsr',0E1h
- db 3,'not',0D0h
- db 3,'plt',0F1h
- db 3,'rva',0F0h
- db 0
-
-directive_operators:
- db 5,'align',8Ch
- db 2,'as',86h
- db 2,'at',80h
- db 7,'defined',88h
- db 8,'definite',8Ah
- db 3,'dup',81h
- db 2,'eq',0F0h
- db 6,'eqtype',0F7h
- db 4,'from',82h
- db 2,'in',0F6h
- db 2,'on',84h
- db 3,'ptr',85h
- db 10,'relativeto',0F8h
- db 4,'used',89h
- db 0
-
-address_sizes:
- db 4,'byte',1
- db 5,'dword',4
- db 5,'qword',8
- db 4,'word',2
- db 0
-
-symbols:
- dw symbols_1-symbols,(symbols_2-symbols_1)/(1+2)
- dw symbols_2-symbols,(symbols_3-symbols_2)/(2+2)
- dw symbols_3-symbols,(symbols_4-symbols_3)/(3+2)
- dw symbols_4-symbols,(symbols_5-symbols_4)/(4+2)
- dw symbols_5-symbols,(symbols_6-symbols_5)/(5+2)
- dw symbols_6-symbols,(symbols_7-symbols_6)/(6+2)
- dw symbols_7-symbols,(symbols_8-symbols_7)/(7+2)
- dw symbols_8-symbols,(symbols_9-symbols_8)/(8+2)
- dw symbols_9-symbols,(symbols_10-symbols_9)/(9+2)
- dw symbols_10-symbols,(symbols_11-symbols_10)/(10+2)
- dw symbols_11-symbols,(symbols_end-symbols_11)/(11+2)
-
-symbols_1:
- db 'z',1Fh,0
-symbols_2:
- db 'ah',10h,04h
- db 'al',10h,10h
- db 'ax',10h,20h
- db 'bh',10h,07h
- db 'bl',10h,13h
- db 'bp',10h,25h
- db 'bx',10h,23h
- db 'ch',10h,05h
- db 'cl',10h,11h
- db 'cs',10h,32h
- db 'cx',10h,21h
- db 'dh',10h,06h
- db 'di',10h,27h
- db 'dl',10h,12h
- db 'ds',10h,34h
- db 'dx',10h,22h
- db 'es',10h,31h
- db 'fs',10h,35h
- db 'gs',10h,36h
- db 'k0',14h,50h
- db 'k1',14h,51h
- db 'k2',14h,52h
- db 'k3',14h,53h
- db 'k4',14h,54h
- db 'k5',14h,55h
- db 'k6',14h,56h
- db 'k7',14h,57h
- db 'ms',1Ch,41h
- db 'mz',18h,20h
- db 'nx',1Bh,83h
- db 'pe',18h,30h
- db 'r8',10h,88h
- db 'r9',10h,89h
- db 'rd',1Fh,21h
- db 'rn',1Fh,20h
- db 'ru',1Fh,22h
- db 'rz',1Fh,23h
- db 'si',10h,26h
- db 'sp',10h,24h
- db 'ss',10h,33h
- db 'st',10h,0A0h
-symbols_3:
- db 'bpl',10h,15h
- db 'cr0',14h,00h
- db 'cr1',14h,01h
- db 'cr2',14h,02h
- db 'cr3',14h,03h
- db 'cr4',14h,04h
- db 'cr5',14h,05h
- db 'cr6',14h,06h
- db 'cr7',14h,07h
- db 'cr8',14h,08h
- db 'cr9',14h,09h
- db 'dil',10h,17h
- db 'dll',1Bh,80h
- db 'dr0',14h,10h
- db 'dr1',14h,11h
- db 'dr2',14h,12h
- db 'dr3',14h,13h
- db 'dr4',14h,14h
- db 'dr5',14h,15h
- db 'dr6',14h,16h
- db 'dr7',14h,17h
- db 'dr8',14h,18h
- db 'dr9',14h,19h
- db 'eax',10h,40h
- db 'ebp',10h,45h
- db 'ebx',10h,43h
- db 'ecx',10h,41h
- db 'edi',10h,47h
- db 'edx',10h,42h
- db 'efi',1Bh,10
- db 'eip',10h,94h
- db 'elf',18h,50h
- db 'esi',10h,46h
- db 'esp',10h,44h
- db 'far',12h,3
- db 'gui',1Bh,2
- db 'mm0',10h,0B0h
- db 'mm1',10h,0B1h
- db 'mm2',10h,0B2h
- db 'mm3',10h,0B3h
- db 'mm4',10h,0B4h
- db 'mm5',10h,0B5h
- db 'mm6',10h,0B6h
- db 'mm7',10h,0B7h
- db 'r10',10h,8Ah
- db 'r11',10h,8Bh
- db 'r12',10h,8Ch
- db 'r13',10h,8Dh
- db 'r14',10h,8Eh
- db 'r15',10h,8Fh
- db 'r8b',10h,18h
- db 'r8d',10h,48h
- db 'r8l',10h,18h
- db 'r8w',10h,28h
- db 'r9b',10h,19h
- db 'r9d',10h,49h
- db 'r9l',10h,19h
- db 'r9w',10h,29h
- db 'rax',10h,80h
- db 'rbp',10h,85h
- db 'rbx',10h,83h
- db 'rcx',10h,81h
- db 'rdi',10h,87h
- db 'rdx',10h,82h
- db 'rip',10h,98h
- db 'rsi',10h,86h
- db 'rsp',10h,84h
- db 'sae',1Fh,30h
- db 'sil',10h,16h
- db 'spl',10h,14h
- db 'st0',10h,0A0h
- db 'st1',10h,0A1h
- db 'st2',10h,0A2h
- db 'st3',10h,0A3h
- db 'st4',10h,0A4h
- db 'st5',10h,0A5h
- db 'st6',10h,0A6h
- db 'st7',10h,0A7h
- db 'tr0',14h,40h
- db 'tr1',14h,41h
- db 'tr2',14h,42h
- db 'tr3',14h,43h
- db 'tr4',14h,44h
- db 'tr5',14h,45h
- db 'tr6',14h,46h
- db 'tr7',14h,47h
- db 'wdm',1Bh,81h
-symbols_4:
- db '1to2',1Fh,11h
- db '1to4',1Fh,12h
- db '1to8',1Fh,13h
- db 'bnd0',14h,60h
- db 'bnd1',14h,61h
- db 'bnd2',14h,62h
- db 'bnd3',14h,63h
- db 'byte',11h,1
- db 'code',19h,5
- db 'coff',18h,40h
- db 'cr10',14h,0Ah
- db 'cr11',14h,0Bh
- db 'cr12',14h,0Ch
- db 'cr13',14h,0Dh
- db 'cr14',14h,0Eh
- db 'cr15',14h,0Fh
- db 'data',19h,6
- db 'dr10',14h,1Ah
- db 'dr11',14h,1Bh
- db 'dr12',14h,1Ch
- db 'dr13',14h,1Dh
- db 'dr14',14h,1Eh
- db 'dr15',14h,1Fh
- db 'ms64',1Ch,49h
- db 'near',12h,2
- db 'note',1Eh,4
- db 'pe64',18h,3Ch
- db 'r10b',10h,1Ah
- db 'r10d',10h,4Ah
- db 'r10l',10h,1Ah
- db 'r10w',10h,2Ah
- db 'r11b',10h,1Bh
- db 'r11d',10h,4Bh
- db 'r11l',10h,1Bh
- db 'r11w',10h,2Bh
- db 'r12b',10h,1Ch
- db 'r12d',10h,4Ch
- db 'r12l',10h,1Ch
- db 'r12w',10h,2Ch
- db 'r13b',10h,1Dh
- db 'r13d',10h,4Dh
- db 'r13l',10h,1Dh
- db 'r13w',10h,2Dh
- db 'r14b',10h,1Eh
- db 'r14d',10h,4Eh
- db 'r14l',10h,1Eh
- db 'r14w',10h,2Eh
- db 'r15b',10h,1Fh
- db 'r15d',10h,4Fh
- db 'r15l',10h,1Fh
- db 'r15w',10h,2Fh
- db 'word',11h,2
- db 'xmm0',10h,0C0h
- db 'xmm1',10h,0C1h
- db 'xmm2',10h,0C2h
- db 'xmm3',10h,0C3h
- db 'xmm4',10h,0C4h
- db 'xmm5',10h,0C5h
- db 'xmm6',10h,0C6h
- db 'xmm7',10h,0C7h
- db 'xmm8',10h,0C8h
- db 'xmm9',10h,0C9h
- db 'ymm0',10h,0E0h
- db 'ymm1',10h,0E1h
- db 'ymm2',10h,0E2h
- db 'ymm3',10h,0E3h
- db 'ymm4',10h,0E4h
- db 'ymm5',10h,0E5h
- db 'ymm6',10h,0E6h
- db 'ymm7',10h,0E7h
- db 'ymm8',10h,0E8h
- db 'ymm9',10h,0E9h
- db 'zmm0',10h,60h
- db 'zmm1',10h,61h
- db 'zmm2',10h,62h
- db 'zmm3',10h,63h
- db 'zmm4',10h,64h
- db 'zmm5',10h,65h
- db 'zmm6',10h,66h
- db 'zmm7',10h,67h
- db 'zmm8',10h,68h
- db 'zmm9',10h,69h
-symbols_5:
- db '1to16',1Fh,14h
- db 'dword',11h,4
- db 'elf64',18h,58h
- db 'fword',11h,6
- db 'large',1Bh,82h
- db 'pword',11h,6
- db 'qword',11h,8
- db 'short',12h,1
- db 'tbyte',11h,0Ah
- db 'tword',11h,0Ah
- db 'use16',13h,16
- db 'use32',13h,32
- db 'use64',13h,64
- db 'xmm10',10h,0CAh
- db 'xmm11',10h,0CBh
- db 'xmm12',10h,0CCh
- db 'xmm13',10h,0CDh
- db 'xmm14',10h,0CEh
- db 'xmm15',10h,0CFh
- db 'xmm16',10h,0D0h
- db 'xmm17',10h,0D1h
- db 'xmm18',10h,0D2h
- db 'xmm19',10h,0D3h
- db 'xmm20',10h,0D4h
- db 'xmm21',10h,0D5h
- db 'xmm22',10h,0D6h
- db 'xmm23',10h,0D7h
- db 'xmm24',10h,0D8h
- db 'xmm25',10h,0D9h
- db 'xmm26',10h,0DAh
- db 'xmm27',10h,0DBh
- db 'xmm28',10h,0DCh
- db 'xmm29',10h,0DDh
- db 'xmm30',10h,0DEh
- db 'xmm31',10h,0DFh
- db 'xword',11h,16
- db 'ymm10',10h,0EAh
- db 'ymm11',10h,0EBh
- db 'ymm12',10h,0ECh
- db 'ymm13',10h,0EDh
- db 'ymm14',10h,0EEh
- db 'ymm15',10h,0EFh
- db 'ymm16',10h,0F0h
- db 'ymm17',10h,0F1h
- db 'ymm18',10h,0F2h
- db 'ymm19',10h,0F3h
- db 'ymm20',10h,0F4h
- db 'ymm21',10h,0F5h
- db 'ymm22',10h,0F6h
- db 'ymm23',10h,0F7h
- db 'ymm24',10h,0F8h
- db 'ymm25',10h,0F9h
- db 'ymm26',10h,0FAh
- db 'ymm27',10h,0FBh
- db 'ymm28',10h,0FCh
- db 'ymm29',10h,0FDh
- db 'ymm30',10h,0FEh
- db 'ymm31',10h,0FFh
- db 'yword',11h,32
- db 'zmm10',10h,6Ah
- db 'zmm11',10h,6Bh
- db 'zmm12',10h,6Ch
- db 'zmm13',10h,6Dh
- db 'zmm14',10h,6Eh
- db 'zmm15',10h,6Fh
- db 'zmm16',10h,70h
- db 'zmm17',10h,71h
- db 'zmm18',10h,72h
- db 'zmm19',10h,73h
- db 'zmm20',10h,74h
- db 'zmm21',10h,75h
- db 'zmm22',10h,76h
- db 'zmm23',10h,77h
- db 'zmm24',10h,78h
- db 'zmm25',10h,79h
- db 'zmm26',10h,7Ah
- db 'zmm27',10h,7Bh
- db 'zmm28',10h,7Ch
- db 'zmm29',10h,7Dh
- db 'zmm30',10h,7Eh
- db 'zmm31',10h,7Fh
- db 'zword',11h,64
-symbols_6:
- db 'binary',18h,10h
- db 'dqword',11h,16
- db 'export',1Ah,0
- db 'fixups',1Ah,5
- db 'import',1Ah,1
- db 'native',1Bh,1
- db 'qqword',11h,32
- db 'static',1Dh,1
-symbols_7:
- db 'console',1Bh,3
- db 'dqqword',11h,64
- db 'dynamic',1Eh,2
- db 'efiboot',1Bh,11
-symbols_8:
- db 'gnurelro',1Eh,52h
- db 'gnustack',1Eh,51h
- db 'linkinfo',19h,9
- db 'readable',19h,30
- db 'resource',1Ah,2
- db 'writable',19h,31
-symbols_9:
- db 'shareable',19h,28
- db 'writeable',19h,31
-symbols_10:
- db 'efiruntime',1Bh,12
- db 'executable',19h,29
- db 'gnuehframe',1Eh,50h
- db 'linkremove',19h,11
-symbols_11:
- db 'discardable',19h,25
- db 'interpreter',1Eh,3
- db 'notpageable',19h,27
-symbols_end:
-
-instructions:
- dw instructions_2-instructions,(instructions_3-instructions_2)/(2+3)
- dw instructions_3-instructions,(instructions_4-instructions_3)/(3+3)
- dw instructions_4-instructions,(instructions_5-instructions_4)/(4+3)
- dw instructions_5-instructions,(instructions_6-instructions_5)/(5+3)
- dw instructions_6-instructions,(instructions_7-instructions_6)/(6+3)
- dw instructions_7-instructions,(instructions_8-instructions_7)/(7+3)
- dw instructions_8-instructions,(instructions_9-instructions_8)/(8+3)
- dw instructions_9-instructions,(instructions_10-instructions_9)/(9+3)
- dw instructions_10-instructions,(instructions_11-instructions_10)/(10+3)
- dw instructions_11-instructions,(instructions_12-instructions_11)/(11+3)
- dw instructions_12-instructions,(instructions_13-instructions_12)/(12+3)
- dw instructions_13-instructions,(instructions_14-instructions_13)/(13+3)
- dw instructions_14-instructions,(instructions_15-instructions_14)/(14+3)
- dw instructions_15-instructions,(instructions_16-instructions_15)/(15+3)
- dw instructions_16-instructions,(instructions_17-instructions_16)/(16+3)
- dw instructions_17-instructions,(instructions_end-instructions_17)/(17+3)
-
-instructions_2:
- db 'bt',4
- dw bt_instruction-instruction_handler
- db 'if',0
- dw if_directive-instruction_handler
- db 'in',0
- dw in_instruction-instruction_handler
- db 'ja',77h
- dw conditional_jump-instruction_handler
- db 'jb',72h
- dw conditional_jump-instruction_handler
- db 'jc',72h
- dw conditional_jump-instruction_handler
- db 'je',74h
- dw conditional_jump-instruction_handler
- db 'jg',7Fh
- dw conditional_jump-instruction_handler
- db 'jl',7Ch
- dw conditional_jump-instruction_handler
- db 'jo',70h
- dw conditional_jump-instruction_handler
- db 'jp',7Ah
- dw conditional_jump-instruction_handler
- db 'js',78h
- dw conditional_jump-instruction_handler
- db 'jz',74h
- dw conditional_jump-instruction_handler
- db 'or',08h
- dw basic_instruction-instruction_handler
-instructions_3:
- db 'aaa',37h
- dw simple_instruction_except64-instruction_handler
- db 'aad',0D5h
- dw aa_instruction-instruction_handler
- db 'aam',0D4h
- dw aa_instruction-instruction_handler
- db 'aas',3Fh
- dw simple_instruction_except64-instruction_handler
- db 'adc',10h
- dw basic_instruction-instruction_handler
- db 'add',00h
- dw basic_instruction-instruction_handler
- db 'and',20h
- dw basic_instruction-instruction_handler
- db 'bnd',0F2h
- dw bnd_prefix_instruction-instruction_handler
- db 'bsf',0BCh
- dw bs_instruction-instruction_handler
- db 'bsr',0BDh
- dw bs_instruction-instruction_handler
- db 'btc',7
- dw bt_instruction-instruction_handler
- db 'btr',6
- dw bt_instruction-instruction_handler
- db 'bts',5
- dw bt_instruction-instruction_handler
- db 'cbw',98h
- dw simple_instruction_16bit-instruction_handler
- db 'cdq',99h
- dw simple_instruction_32bit-instruction_handler
- db 'clc',0F8h
- dw simple_instruction-instruction_handler
- db 'cld',0FCh
- dw simple_instruction-instruction_handler
- db 'cli',0FAh
- dw simple_instruction-instruction_handler
- db 'cmc',0F5h
- dw simple_instruction-instruction_handler
- db 'cmp',38h
- dw basic_instruction-instruction_handler
- db 'cqo',99h
- dw simple_instruction_64bit-instruction_handler
- db 'cwd',99h
- dw simple_instruction_16bit-instruction_handler
- db 'daa',27h
- dw simple_instruction_except64-instruction_handler
- db 'das',2Fh
- dw simple_instruction_except64-instruction_handler
- db 'dec',1
- dw inc_instruction-instruction_handler
- db 'div',6
- dw single_operand_instruction-instruction_handler
- db 'end',0
- dw end_directive-instruction_handler
- db 'err',0
- dw err_directive-instruction_handler
- db 'fld',0
- dw fld_instruction-instruction_handler
- db 'fst',2
- dw fld_instruction-instruction_handler
- db 'hlt',0F4h
- dw simple_instruction-instruction_handler
- db 'inc',0
- dw inc_instruction-instruction_handler
- db 'ins',6Ch
- dw ins_instruction-instruction_handler
- db 'int',0CDh
- dw int_instruction-instruction_handler
- db 'jae',73h
- dw conditional_jump-instruction_handler
- db 'jbe',76h
- dw conditional_jump-instruction_handler
- db 'jge',7Dh
- dw conditional_jump-instruction_handler
- db 'jle',7Eh
- dw conditional_jump-instruction_handler
- db 'jmp',0
- dw jmp_instruction-instruction_handler
- db 'jna',76h
- dw conditional_jump-instruction_handler
- db 'jnb',73h
- dw conditional_jump-instruction_handler
- db 'jnc',73h
- dw conditional_jump-instruction_handler
- db 'jne',75h
- dw conditional_jump-instruction_handler
- db 'jng',7Eh
- dw conditional_jump-instruction_handler
- db 'jnl',7Dh
- dw conditional_jump-instruction_handler
- db 'jno',71h
- dw conditional_jump-instruction_handler
- db 'jnp',7Bh
- dw conditional_jump-instruction_handler
- db 'jns',79h
- dw conditional_jump-instruction_handler
- db 'jnz',75h
- dw conditional_jump-instruction_handler
- db 'jpe',7Ah
- dw conditional_jump-instruction_handler
- db 'jpo',7Bh
- dw conditional_jump-instruction_handler
- db 'lar',2
- dw lar_instruction-instruction_handler
- db 'lds',3
- dw ls_instruction-instruction_handler
- db 'lea',0
- dw lea_instruction-instruction_handler
- db 'les',0
- dw ls_instruction-instruction_handler
- db 'lfs',4
- dw ls_instruction-instruction_handler
- db 'lgs',5
- dw ls_instruction-instruction_handler
- db 'lsl',3
- dw lar_instruction-instruction_handler
- db 'lss',2
- dw ls_instruction-instruction_handler
- db 'ltr',3
- dw pm_word_instruction-instruction_handler
- db 'mov',0
- dw mov_instruction-instruction_handler
- db 'mul',4
- dw single_operand_instruction-instruction_handler
- db 'neg',3
- dw single_operand_instruction-instruction_handler
- db 'nop',90h
- dw nop_instruction-instruction_handler
- db 'not',2
- dw single_operand_instruction-instruction_handler
- db 'org',0
- dw org_directive-instruction_handler
- db 'out',0
- dw out_instruction-instruction_handler
- db 'pop',0
- dw pop_instruction-instruction_handler
- db 'por',0EBh
- dw basic_mmx_instruction-instruction_handler
- db 'rcl',2
- dw sh_instruction-instruction_handler
- db 'rcr',3
- dw sh_instruction-instruction_handler
- db 'rep',0F3h
- dw prefix_instruction-instruction_handler
- db 'ret',0C2h
- dw ret_instruction-instruction_handler
- db 'rol',0
- dw sh_instruction-instruction_handler
- db 'ror',1
- dw sh_instruction-instruction_handler
- db 'rsm',0AAh
- dw simple_extended_instruction-instruction_handler
- db 'sal',4
- dw sh_instruction-instruction_handler
- db 'sar',7
- dw sh_instruction-instruction_handler
- db 'sbb',18h
- dw basic_instruction-instruction_handler
- db 'shl',4
- dw sh_instruction-instruction_handler
- db 'shr',5
- dw sh_instruction-instruction_handler
- db 'stc',0F9h
- dw simple_instruction-instruction_handler
- db 'std',0FDh
- dw simple_instruction-instruction_handler
- db 'sti',0FBh
- dw simple_instruction-instruction_handler
- db 'str',1
- dw pm_store_word_instruction-instruction_handler
- db 'sub',28h
- dw basic_instruction-instruction_handler
- db 'ud0',0FFh
- dw ud_instruction-instruction_handler
- db 'ud1',0B9h
- dw ud_instruction-instruction_handler
- db 'ud2',0Bh
- dw simple_extended_instruction-instruction_handler
- 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
- dw arpl_instruction-instruction_handler
- db 'blci',26h
- dw tbm_instruction-instruction_handler
- db 'blcs',13h
- dw tbm_instruction-instruction_handler
- db 'blsi',3
- dw bmi_instruction-instruction_handler
- db 'blsr',1
- dw bmi_instruction-instruction_handler
- db 'bzhi',0F5h
- dw bzhi_instruction-instruction_handler
- db 'call',0
- dw call_instruction-instruction_handler
- db 'cdqe',98h
- dw simple_instruction_64bit-instruction_handler
- db 'clac',0CAh
- dw simple_instruction_0f_01-instruction_handler
- db 'clgi',0DDh
- dw simple_instruction_0f_01-instruction_handler
- db 'clts',6
- dw simple_extended_instruction-instruction_handler
- db 'clwb',6
- dw clflushopt_instruction-instruction_handler
- db 'cmps',0A6h
- dw cmps_instruction-instruction_handler
- db 'cwde',98h
- dw simple_instruction_32bit-instruction_handler
- db 'data',0
- dw data_directive-instruction_handler
- db 'dppd',41h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'dpps',40h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'else',0
- dw else_directive-instruction_handler
- db 'emms',77h
- dw simple_extended_instruction-instruction_handler
- db 'fabs',100001b
- dw simple_fpu_instruction-instruction_handler
- db 'fadd',0
- dw basic_fpu_instruction-instruction_handler
- db 'fbld',4
- dw fbld_instruction-instruction_handler
- db 'fchs',100000b
- dw simple_fpu_instruction-instruction_handler
- db 'fcom',2
- dw basic_fpu_instruction-instruction_handler
- db 'fcos',111111b
- dw simple_fpu_instruction-instruction_handler
- db 'fdiv',6
- dw basic_fpu_instruction-instruction_handler
- db 'feni',0E0h
- dw finit_instruction-instruction_handler
- db 'fild',0
- dw fild_instruction-instruction_handler
- db 'fist',2
- dw fild_instruction-instruction_handler
- db 'fld1',101000b
- dw simple_fpu_instruction-instruction_handler
- db 'fldz',101110b
- dw simple_fpu_instruction-instruction_handler
- db 'fmul',1
- dw basic_fpu_instruction-instruction_handler
- db 'fnop',010000b
- dw simple_fpu_instruction-instruction_handler
- db 'fsin',111110b
- dw simple_fpu_instruction-instruction_handler
- db 'fstp',3
- dw fld_instruction-instruction_handler
- db 'fsub',4
- dw basic_fpu_instruction-instruction_handler
- db 'ftst',100100b
- dw simple_fpu_instruction-instruction_handler
- db 'fxam',100101b
- dw simple_fpu_instruction-instruction_handler
- db 'fxch',0
- dw fxch_instruction-instruction_handler
- db 'heap',0
- dw heap_directive-instruction_handler
- db 'idiv',7
- dw single_operand_instruction-instruction_handler
- db 'imul',0
- dw imul_instruction-instruction_handler
- db 'insb',6Ch
- dw simple_instruction-instruction_handler
- db 'insd',6Dh
- dw simple_instruction_32bit-instruction_handler
- db 'insw',6Dh
- dw simple_instruction_16bit-instruction_handler
- db 'int1',0F1h
- dw simple_instruction-instruction_handler
- db 'int3',0CCh
- dw simple_instruction-instruction_handler
- db 'into',0CEh
- dw simple_instruction_except64-instruction_handler
- db 'invd',8
- dw simple_extended_instruction-instruction_handler
- db 'iret',0CFh
- dw iret_instruction-instruction_handler
- db 'jcxz',0E3h
- dw loop_instruction_16bit-instruction_handler
- db 'jnae',72h
- dw conditional_jump-instruction_handler
- db 'jnbe',77h
- dw conditional_jump-instruction_handler
- db 'jnge',7Ch
- dw conditional_jump-instruction_handler
- db 'jnle',7Fh
- dw conditional_jump-instruction_handler
- db 'korb',45h
- dw mask_instruction_b-instruction_handler
- db 'kord',45h
- dw mask_instruction_d-instruction_handler
- db 'korq',45h
- dw mask_instruction_q-instruction_handler
- db 'korw',45h
- dw mask_instruction_w-instruction_handler
- db 'lahf',9Fh
- dw simple_instruction-instruction_handler
- db 'lgdt',2
- dw lgdt_instruction-instruction_handler
- db 'lidt',3
- dw lgdt_instruction-instruction_handler
- db 'lldt',2
- dw pm_word_instruction-instruction_handler
- db 'lmsw',16h
- dw pm_word_instruction-instruction_handler
- db 'load',0
- dw load_directive-instruction_handler
- db 'lock',0F0h
- dw prefix_instruction-instruction_handler
- db 'lods',0ACh
- dw lods_instruction-instruction_handler
- db 'loop',0E2h
- dw loop_instruction-instruction_handler
- db 'movd',0
- dw movd_instruction-instruction_handler
- db 'movq',0
- dw movq_instruction-instruction_handler
- db 'movs',0A4h
- dw movs_instruction-instruction_handler
- db 'mulx',0F6h
- dw pdep_instruction-instruction_handler
- db 'orpd',56h
- dw sse_pd_instruction-instruction_handler
- db 'orps',56h
- dw sse_ps_instruction-instruction_handler
- db 'outs',6Eh
- dw outs_instruction-instruction_handler
- db 'pand',0DBh
- dw basic_mmx_instruction-instruction_handler
- db 'pdep',0F5h
- dw pdep_instruction-instruction_handler
- db 'pext',0F5h
- dw pext_instruction-instruction_handler
- db 'popa',61h
- dw simple_instruction_except64-instruction_handler
- db 'popd',4
- dw pop_instruction-instruction_handler
- db 'popf',9Dh
- dw simple_instruction-instruction_handler
- db 'popq',8
- dw pop_instruction-instruction_handler
- db 'popw',2
- dw pop_instruction-instruction_handler
- db 'push',0
- dw push_instruction-instruction_handler
- db 'pxor',0EFh
- dw basic_mmx_instruction-instruction_handler
- db 'repe',0F3h
- dw prefix_instruction-instruction_handler
- db 'repz',0F3h
- dw prefix_instruction-instruction_handler
- db 'retd',0C2h
- dw ret_instruction_32bit_except64-instruction_handler
- db 'retf',0CAh
- dw retf_instruction-instruction_handler
- db 'retn',0C2h
- dw ret_instruction-instruction_handler
- db 'retq',0C2h
- dw ret_instruction_only64-instruction_handler
- db 'retw',0C2h
- dw ret_instruction_16bit-instruction_handler
- db 'rorx',0F0h
- dw rorx_instruction-instruction_handler
- db 'sahf',9Eh
- dw simple_instruction-instruction_handler
- db 'salc',0D6h
- dw simple_instruction_except64-instruction_handler
- db 'sarx',0F7h
- dw sarx_instruction-instruction_handler
- db 'scas',0AEh
- dw stos_instruction-instruction_handler
- db 'seta',97h
- dw set_instruction-instruction_handler
- db 'setb',92h
- dw set_instruction-instruction_handler
- db 'setc',92h
- dw set_instruction-instruction_handler
- db 'sete',94h
- dw set_instruction-instruction_handler
- db 'setg',9Fh
- dw set_instruction-instruction_handler
- db 'setl',9Ch
- dw set_instruction-instruction_handler
- db 'seto',90h
- dw set_instruction-instruction_handler
- db 'setp',9Ah
- dw set_instruction-instruction_handler
- db 'sets',98h
- dw set_instruction-instruction_handler
- db 'setz',94h
- dw set_instruction-instruction_handler
- db 'sgdt',0
- dw lgdt_instruction-instruction_handler
- db 'shld',0A4h
- dw shd_instruction-instruction_handler
- db 'shlx',0F7h
- dw shlx_instruction-instruction_handler
- db 'shrd',0ACh
- dw shd_instruction-instruction_handler
- db 'shrx',0F7h
- dw shrx_instruction-instruction_handler
- db 'sidt',1
- dw lgdt_instruction-instruction_handler
- db 'sldt',0
- dw pm_store_word_instruction-instruction_handler
- db 'smsw',14h
- dw pm_store_word_instruction-instruction_handler
- db 'stac',0CBh
- dw simple_instruction_0f_01-instruction_handler
- db 'stgi',0DCh
- dw simple_instruction_0f_01-instruction_handler
- db 'stos',0AAh
- dw stos_instruction-instruction_handler
- db 'test',0
- dw test_instruction-instruction_handler
- db 'verr',4
- dw pm_word_instruction-instruction_handler
- db 'verw',5
- dw pm_word_instruction-instruction_handler
- db 'vpor',0EBh
- dw avx_pd_instruction_noevex-instruction_handler
- db 'wait',9Bh
- dw simple_instruction-instruction_handler
- db 'xadd',0C0h
- dw basic_486_instruction-instruction_handler
- db 'xchg',0
- dw xchg_instruction-instruction_handler
- db 'xend',0D5h
- dw simple_instruction_0f_01-instruction_handler
- db 'xlat',0D7h
- dw xlat_instruction-instruction_handler
-instructions_5:
- db 'addpd',58h
- dw sse_pd_instruction-instruction_handler
- db 'addps',58h
- dw sse_ps_instruction-instruction_handler
- db 'addsd',58h
- dw sse_sd_instruction-instruction_handler
- db 'addss',58h
- dw sse_ss_instruction-instruction_handler
- db 'align',0
- dw align_directive-instruction_handler
- db 'andpd',54h
- dw sse_pd_instruction-instruction_handler
- db 'andps',54h
- dw sse_ps_instruction-instruction_handler
- db 'bextr',0F7h
- dw bextr_instruction-instruction_handler
- db 'blcic',15h
- dw tbm_instruction-instruction_handler
- db 'blsic',16h
- dw tbm_instruction-instruction_handler
- db 'bndcl',1Ah
- dw bndcl_instruction-instruction_handler
- db 'bndcn',1Bh
- dw bndcu_instruction-instruction_handler
- db 'bndcu',1Ah
- dw bndcu_instruction-instruction_handler
- db 'bndmk',1Bh
- dw bndmk_instruction-instruction_handler
- db 'bound',0
- dw bound_instruction-instruction_handler
- db 'break',0
- dw break_directive-instruction_handler
- db 'bswap',0
- dw bswap_instruction-instruction_handler
- db 'cmova',47h
- dw bs_instruction-instruction_handler
- db 'cmovb',42h
- dw bs_instruction-instruction_handler
- db 'cmovc',42h
- dw bs_instruction-instruction_handler
- db 'cmove',44h
- dw bs_instruction-instruction_handler
- db 'cmovg',4Fh
- dw bs_instruction-instruction_handler
- db 'cmovl',4Ch
- dw bs_instruction-instruction_handler
- db 'cmovo',40h
- dw bs_instruction-instruction_handler
- db 'cmovp',4Ah
- dw bs_instruction-instruction_handler
- db 'cmovs',48h
- dw bs_instruction-instruction_handler
- db 'cmovz',44h
- dw bs_instruction-instruction_handler
- db 'cmppd',-1
- dw cmp_pd_instruction-instruction_handler
- db 'cmpps',-1
- dw cmp_ps_instruction-instruction_handler
- db 'cmpsb',0A6h
- dw simple_instruction-instruction_handler
- db 'cmpsd',-1
- dw cmpsd_instruction-instruction_handler
- db 'cmpsq',0A7h
- dw simple_instruction_64bit-instruction_handler
- db 'cmpss',-1
- dw cmp_ss_instruction-instruction_handler
- db 'cmpsw',0A7h
- dw simple_instruction_16bit-instruction_handler
- db 'cpuid',0A2h
- dw simple_extended_instruction-instruction_handler
- db 'crc32',0
- dw crc32_instruction-instruction_handler
- db 'divpd',5Eh
- dw sse_pd_instruction-instruction_handler
- db 'divps',5Eh
- dw sse_ps_instruction-instruction_handler
- db 'divsd',5Eh
- dw sse_sd_instruction-instruction_handler
- db 'divss',5Eh
- dw sse_ss_instruction-instruction_handler
- db 'enter',0
- dw enter_instruction-instruction_handler
- db 'entry',0
- dw entry_directive-instruction_handler
- db 'extrn',0
- dw extrn_directive-instruction_handler
- db 'extrq',0
- dw extrq_instruction-instruction_handler
- db 'f2xm1',110000b
- dw simple_fpu_instruction-instruction_handler
- db 'faddp',0
- dw faddp_instruction-instruction_handler
- db 'fbstp',6
- dw fbld_instruction-instruction_handler
- db 'fclex',0E2h
- dw finit_instruction-instruction_handler
- db 'fcomi',0F0h
- dw fcomi_instruction-instruction_handler
- db 'fcomp',3
- dw basic_fpu_instruction-instruction_handler
- db 'fdisi',0E1h
- dw finit_instruction-instruction_handler
- db 'fdivp',7
- dw faddp_instruction-instruction_handler
- db 'fdivr',7
- dw basic_fpu_instruction-instruction_handler
- db 'femms',0Eh
- dw simple_extended_instruction-instruction_handler
- db 'ffree',0
- dw ffree_instruction-instruction_handler
- db 'fiadd',0
- dw fi_instruction-instruction_handler
- db 'ficom',2
- dw fi_instruction-instruction_handler
- db 'fidiv',6
- dw fi_instruction-instruction_handler
- db 'fimul',1
- dw fi_instruction-instruction_handler
- db 'finit',0E3h
- dw finit_instruction-instruction_handler
- db 'fistp',3
- dw fild_instruction-instruction_handler
- db 'fisub',4
- dw fi_instruction-instruction_handler
- db 'fldcw',5
- dw fldcw_instruction-instruction_handler
- db 'fldpi',101011b
- dw simple_fpu_instruction-instruction_handler
- db 'fmulp',1
- dw faddp_instruction-instruction_handler
- db 'fneni',0E0h
- dw fninit_instruction-instruction_handler
- db 'fprem',111000b
- dw simple_fpu_instruction-instruction_handler
- db 'fptan',110010b
- dw simple_fpu_instruction-instruction_handler
- db 'fsave',6
- dw fsave_instruction-instruction_handler
- db 'fsqrt',111010b
- dw simple_fpu_instruction-instruction_handler
- db 'fstcw',7
- dw fstcw_instruction-instruction_handler
- db 'fstsw',0
- dw fstsw_instruction-instruction_handler
- db 'fsubp',5
- dw faddp_instruction-instruction_handler
- db 'fsubr',5
- dw basic_fpu_instruction-instruction_handler
- db 'fucom',4
- dw ffree_instruction-instruction_handler
- db 'fwait',9Bh
- dw simple_instruction-instruction_handler
- db 'fyl2x',110001b
- dw simple_fpu_instruction-instruction_handler
- db 'icebp',0F1h
- dw simple_instruction-instruction_handler
- db 'iretd',0CFh
- dw simple_instruction_32bit-instruction_handler
- db 'iretq',0CFh
- dw simple_instruction_64bit-instruction_handler
- db 'iretw',0CFh
- dw simple_instruction_16bit-instruction_handler
- db 'jecxz',0E3h
- dw loop_instruction_32bit-instruction_handler
- db 'jrcxz',0E3h
- dw loop_instruction_64bit-instruction_handler
- db 'kaddb',4Ah
- dw mask_instruction_b-instruction_handler
- db 'kaddd',4Ah
- dw mask_instruction_d-instruction_handler
- db 'kaddq',4Ah
- dw mask_instruction_q-instruction_handler
- db 'kaddw',4Ah
- dw mask_instruction_w-instruction_handler
- db 'kandb',41h
- dw mask_instruction_b-instruction_handler
- db 'kandd',41h
- dw mask_instruction_d-instruction_handler
- db 'kandq',41h
- dw mask_instruction_q-instruction_handler
- db 'kandw',41h
- dw mask_instruction_w-instruction_handler
- db 'kmovb',1
- dw kmov_instruction-instruction_handler
- db 'kmovd',4
- dw kmov_instruction-instruction_handler
- db 'kmovq',8
- dw kmov_instruction-instruction_handler
- db 'kmovw',2
- dw kmov_instruction-instruction_handler
- db 'knotb',44h
- dw mask_instruction_single_source_b-instruction_handler
- db 'knotd',44h
- dw mask_instruction_single_source_d-instruction_handler
- db 'knotq',44h
- dw mask_instruction_single_source_q-instruction_handler
- db 'knotw',44h
- dw mask_instruction_single_source_w-instruction_handler
- db 'kxorb',47h
- dw mask_instruction_b-instruction_handler
- db 'kxord',47h
- dw mask_instruction_d-instruction_handler
- db 'kxorq',47h
- dw mask_instruction_q-instruction_handler
- db 'kxorw',47h
- dw mask_instruction_w-instruction_handler
- db 'label',0
- dw label_directive-instruction_handler
- db 'lddqu',0
- dw lddqu_instruction-instruction_handler
- db 'leave',0C9h
- dw simple_instruction-instruction_handler
- db 'lodsb',0ACh
- dw simple_instruction-instruction_handler
- db 'lodsd',0ADh
- dw simple_instruction_32bit-instruction_handler
- db 'lodsq',0ADh
- dw simple_instruction_64bit-instruction_handler
- db 'lodsw',0ADh
- dw simple_instruction_16bit-instruction_handler
- db 'loopd',0E2h
- dw loop_instruction_32bit-instruction_handler
- db 'loope',0E1h
- dw loop_instruction-instruction_handler
- db 'loopq',0E2h
- dw loop_instruction_64bit-instruction_handler
- db 'loopw',0E2h
- dw loop_instruction_16bit-instruction_handler
- db 'loopz',0E1h
- dw loop_instruction-instruction_handler
- db 'lzcnt',0BDh
- dw popcnt_instruction-instruction_handler
- db 'maxpd',5Fh
- dw sse_pd_instruction-instruction_handler
- db 'maxps',5Fh
- dw sse_ps_instruction-instruction_handler
- db 'maxsd',5Fh
- dw sse_sd_instruction-instruction_handler
- db 'maxss',5Fh
- dw sse_ss_instruction-instruction_handler
- db 'minpd',5Dh
- dw sse_pd_instruction-instruction_handler
- db 'minps',5Dh
- dw sse_ps_instruction-instruction_handler
- db 'minsd',5Dh
- dw sse_sd_instruction-instruction_handler
- db 'minss',5Dh
- dw sse_ss_instruction-instruction_handler
- db 'movbe',0F0h
- dw movbe_instruction-instruction_handler
- db 'movsb',0A4h
- dw simple_instruction-instruction_handler
- db 'movsd',0
- dw movsd_instruction-instruction_handler
- db 'movsq',0A5h
- dw simple_instruction_64bit-instruction_handler
- db 'movss',0
- dw movss_instruction-instruction_handler
- db 'movsw',0A5h
- dw simple_instruction_16bit-instruction_handler
- db 'movsx',0BEh
- dw movx_instruction-instruction_handler
- db 'movzx',0B6h
- dw movx_instruction-instruction_handler
- db 'mulpd',59h
- dw sse_pd_instruction-instruction_handler
- db 'mulps',59h
- dw sse_ps_instruction-instruction_handler
- db 'mulsd',59h
- dw sse_sd_instruction-instruction_handler
- db 'mulss',59h
- dw sse_ss_instruction-instruction_handler
- db 'mwait',0C9h
- dw monitor_instruction-instruction_handler
- db 'outsb',6Eh
- dw simple_instruction-instruction_handler
- db 'outsd',6Fh
- dw simple_instruction_32bit-instruction_handler
- db 'outsw',6Fh
- dw simple_instruction_16bit-instruction_handler
- db 'pabsb',1Ch
- dw ssse3_instruction-instruction_handler
- db 'pabsd',1Eh
- dw ssse3_instruction-instruction_handler
- db 'pabsw',1Dh
- dw ssse3_instruction-instruction_handler
- db 'paddb',0FCh
- dw basic_mmx_instruction-instruction_handler
- db 'paddd',0FEh
- dw basic_mmx_instruction-instruction_handler
- db 'paddq',0D4h
- dw basic_mmx_instruction-instruction_handler
- db 'paddw',0FDh
- dw basic_mmx_instruction-instruction_handler
- db 'pandn',0DFh
- dw basic_mmx_instruction-instruction_handler
- db 'pause',0
- dw pause_instruction-instruction_handler
- db 'pavgb',0E0h
- dw basic_mmx_instruction-instruction_handler
- db 'pavgw',0E3h
- dw basic_mmx_instruction-instruction_handler
- db 'pf2id',1Dh
- dw amd3dnow_instruction-instruction_handler
- db 'pf2iw',1Ch
- dw amd3dnow_instruction-instruction_handler
- db 'pfacc',0AEh
- dw amd3dnow_instruction-instruction_handler
- db 'pfadd',9Eh
- dw amd3dnow_instruction-instruction_handler
- db 'pfmax',0A4h
- dw amd3dnow_instruction-instruction_handler
- db 'pfmin',94h
- dw amd3dnow_instruction-instruction_handler
- db 'pfmul',0B4h
- dw amd3dnow_instruction-instruction_handler
- db 'pfrcp',96h
- dw amd3dnow_instruction-instruction_handler
- db 'pfsub',9Ah
- dw amd3dnow_instruction-instruction_handler
- db 'pi2fd',0Dh
- dw amd3dnow_instruction-instruction_handler
- db 'pi2fw',0Ch
- dw amd3dnow_instruction-instruction_handler
- db 'popad',61h
- dw simple_instruction_32bit_except64-instruction_handler
- db 'popaw',61h
- dw simple_instruction_16bit_except64-instruction_handler
- db 'popfd',9Dh
- dw simple_instruction_32bit_except64-instruction_handler
- db 'popfq',9Dh
- dw simple_instruction_only64-instruction_handler
- db 'popfw',9Dh
- dw simple_instruction_16bit-instruction_handler
- db 'pslld',0F2h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psllq',0F3h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psllw',0F1h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psrad',0E2h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psraw',0E1h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psrld',0D2h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psrlq',0D3h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psrlw',0D1h
- dw mmx_bit_shift_instruction-instruction_handler
- db 'psubb',0F8h
- dw basic_mmx_instruction-instruction_handler
- db 'psubd',0FAh
- dw basic_mmx_instruction-instruction_handler
- db 'psubq',0FBh
- dw basic_mmx_instruction-instruction_handler
- db 'psubw',0F9h
- dw basic_mmx_instruction-instruction_handler
- db 'ptest',17h
- dw sse4_instruction_66_38-instruction_handler
- db 'pusha',60h
- dw simple_instruction_except64-instruction_handler
- db 'pushd',4
- dw push_instruction-instruction_handler
- db 'pushf',9Ch
- dw simple_instruction-instruction_handler
- db 'pushq',8
- dw push_instruction-instruction_handler
- db 'pushw',2
- dw push_instruction-instruction_handler
- db 'rcpps',53h
- dw sse_ps_instruction-instruction_handler
- db 'rcpss',53h
- dw sse_ss_instruction-instruction_handler
- db 'rdmsr',32h
- dw simple_extended_instruction-instruction_handler
- db 'rdpid',7
- dw rdpid_instruction-instruction_handler
- db 'rdpmc',33h
- dw simple_extended_instruction-instruction_handler
- db 'rdpru',0FDh
- dw simple_instruction_0f_01-instruction_handler
- db 'rdtsc',31h
- dw simple_extended_instruction-instruction_handler
- db 'repne',0F2h
- dw prefix_instruction-instruction_handler
- db 'repnz',0F2h
- dw prefix_instruction-instruction_handler
- db 'retfd',0CAh
- dw retf_instruction_32bit-instruction_handler
- db 'retfq',0CAh
- dw retf_instruction_64bit-instruction_handler
- db 'retfw',0CAh
- dw retf_instruction_16bit-instruction_handler
- db 'retnd',0C2h
- dw ret_instruction_32bit_except64-instruction_handler
- db 'retnq',0C2h
- dw ret_instruction_only64-instruction_handler
- db 'retnw',0C2h
- dw ret_instruction_16bit-instruction_handler
- db 'scasb',0AEh
- dw simple_instruction-instruction_handler
- db 'scasd',0AFh
- dw simple_instruction_32bit-instruction_handler
- db 'scasq',0AFh
- dw simple_instruction_64bit-instruction_handler
- db 'scasw',0AFh
- dw simple_instruction_16bit-instruction_handler
- db 'setae',93h
- dw set_instruction-instruction_handler
- db 'setbe',96h
- dw set_instruction-instruction_handler
- db 'setge',9Dh
- dw set_instruction-instruction_handler
- db 'setle',9Eh
- dw set_instruction-instruction_handler
- db 'setna',96h
- dw set_instruction-instruction_handler
- db 'setnb',93h
- dw set_instruction-instruction_handler
- db 'setnc',93h
- dw set_instruction-instruction_handler
- db 'setne',95h
- dw set_instruction-instruction_handler
- db 'setng',9Eh
- dw set_instruction-instruction_handler
- db 'setnl',9Dh
- dw set_instruction-instruction_handler
- db 'setno',91h
- dw set_instruction-instruction_handler
- db 'setnp',9Bh
- dw set_instruction-instruction_handler
- db 'setns',99h
- dw set_instruction-instruction_handler
- db 'setnz',95h
- dw set_instruction-instruction_handler
- db 'setpe',9Ah
- dw set_instruction-instruction_handler
- db 'setpo',9Bh
- dw set_instruction-instruction_handler
- db 'stack',0
- dw stack_directive-instruction_handler
- db 'store',0
- dw store_directive-instruction_handler
- db 'stosb',0AAh
- dw simple_instruction-instruction_handler
- db 'stosd',0ABh
- dw simple_instruction_32bit-instruction_handler
- db 'stosq',0ABh
- dw simple_instruction_64bit-instruction_handler
- db 'stosw',0ABh
- dw simple_instruction_16bit-instruction_handler
- db 'subpd',5Ch
- dw sse_pd_instruction-instruction_handler
- db 'subps',5Ch
- dw sse_ps_instruction-instruction_handler
- db 'subsd',5Ch
- dw sse_sd_instruction-instruction_handler
- db 'subss',5Ch
- dw sse_ss_instruction-instruction_handler
- db 'times',0
- dw times_directive-instruction_handler
- db 'tzcnt',0BCh
- dw popcnt_instruction-instruction_handler
- db 'tzmsk',14h
- dw tbm_instruction-instruction_handler
- db 'vdppd',41h
- dw avx_128bit_instruction_3a_imm8_noevex-instruction_handler
- db 'vdpps',40h
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vmovd',0
- dw avx_movd_instruction-instruction_handler
- db 'vmovq',0
- dw avx_movq_instruction-instruction_handler
- db 'vmrun',0D8h
- dw simple_svm_instruction-instruction_handler
- db 'vmxon',6
- dw vmxon_instruction-instruction_handler
- db 'vorpd',56h
- dw avx_pd_instruction-instruction_handler
- db 'vorps',56h
- dw avx_ps_instruction-instruction_handler
- db 'vpand',0DBh
- dw avx_pd_instruction_noevex-instruction_handler
- db 'vpord',0EBh
- dw avx_d_instruction_evex-instruction_handler
- db 'vporq',0EBh
- dw avx_q_instruction_evex-instruction_handler
- db 'vpxor',0EFh
- dw avx_pd_instruction_noevex-instruction_handler
- db 'while',0
- dw while_directive-instruction_handler
- db 'wrmsr',30h
- dw simple_extended_instruction-instruction_handler
- db 'wrssd',0F6h
- dw wrssd_instruction-instruction_handler
- db 'wrssq',0F6h
- dw wrssq_instruction-instruction_handler
- db 'xlatb',0D7h
- dw simple_instruction-instruction_handler
- db 'xorpd',57h
- dw sse_pd_instruction-instruction_handler
- db 'xorps',57h
- dw sse_ps_instruction-instruction_handler
- db 'xsave',100b
- dw fxsave_instruction-instruction_handler
- db 'xtest',0D6h
- dw simple_instruction_0f_01-instruction_handler
-instructions_6:
- db 'aesdec',0DEh
- dw sse4_instruction_66_38-instruction_handler
- db 'aesenc',0DCh
- dw sse4_instruction_66_38-instruction_handler
- db 'aesimc',0DBh
- dw sse4_instruction_66_38-instruction_handler
- db 'andnpd',55h
- dw sse_pd_instruction-instruction_handler
- db 'andnps',55h
- dw sse_ps_instruction-instruction_handler
- db 'assert',0
- dw assert_directive-instruction_handler
- db 'blcmsk',21h
- dw tbm_instruction-instruction_handler
- db 'blsmsk',2
- dw bmi_instruction-instruction_handler
- db 'bndldx',1Ah
- dw bndldx_instruction-instruction_handler
- db 'bndmov',1Ah
- dw bndmov_instruction-instruction_handler
- db 'bndstx',1Bh
- dw bndstx_instruction-instruction_handler
- db 'clzero',0
- dw clzero_instruction-instruction_handler
- db 'cmovae',43h
- dw bs_instruction-instruction_handler
- db 'cmovbe',46h
- dw bs_instruction-instruction_handler
- db 'cmovge',4Dh
- dw bs_instruction-instruction_handler
- db 'cmovle',4Eh
- dw bs_instruction-instruction_handler
- db 'cmovna',46h
- dw bs_instruction-instruction_handler
- db 'cmovnb',43h
- dw bs_instruction-instruction_handler
- db 'cmovnc',43h
- dw bs_instruction-instruction_handler
- db 'cmovne',45h
- dw bs_instruction-instruction_handler
- db 'cmovng',4Eh
- dw bs_instruction-instruction_handler
- db 'cmovnl',4Dh
- dw bs_instruction-instruction_handler
- db 'cmovno',41h
- dw bs_instruction-instruction_handler
- db 'cmovnp',4Bh
- dw bs_instruction-instruction_handler
- db 'cmovns',49h
- dw bs_instruction-instruction_handler
- db 'cmovnz',45h
- dw bs_instruction-instruction_handler
- db 'cmovpe',4Ah
- dw bs_instruction-instruction_handler
- db 'cmovpo',4Bh
- dw bs_instruction-instruction_handler
- db 'comisd',2Fh
- dw comisd_instruction-instruction_handler
- db 'comiss',2Fh
- dw comiss_instruction-instruction_handler
- db 'fcmovb',0C0h
- dw fcmov_instruction-instruction_handler
- db 'fcmove',0C8h
- dw fcmov_instruction-instruction_handler
- db 'fcmovu',0D8h
- dw fcmov_instruction-instruction_handler
- db 'fcomip',0F0h
- dw fcomip_instruction-instruction_handler
- db 'fcompp',0
- dw fcompp_instruction-instruction_handler
- db 'fdivrp',6
- dw faddp_instruction-instruction_handler
- db 'ffreep',0
- dw ffreep_instruction-instruction_handler
- db 'ficomp',3
- dw fi_instruction-instruction_handler
- db 'fidivr',7
- dw fi_instruction-instruction_handler
- db 'fisttp',1
- dw fild_instruction-instruction_handler
- db 'fisubr',5
- dw fi_instruction-instruction_handler
- db 'fldenv',4
- dw fldenv_instruction-instruction_handler
- db 'fldl2e',101010b
- dw simple_fpu_instruction-instruction_handler
- db 'fldl2t',101001b
- dw simple_fpu_instruction-instruction_handler
- db 'fldlg2',101100b
- dw simple_fpu_instruction-instruction_handler
- db 'fldln2',101101b
- dw simple_fpu_instruction-instruction_handler
- db 'fnclex',0E2h
- dw fninit_instruction-instruction_handler
- db 'fndisi',0E1h
- dw fninit_instruction-instruction_handler
- db 'fninit',0E3h
- dw fninit_instruction-instruction_handler
- db 'fnsave',6
- dw fnsave_instruction-instruction_handler
- db 'fnstcw',7
- dw fldcw_instruction-instruction_handler
- db 'fnstsw',0
- dw fnstsw_instruction-instruction_handler
- db 'format',0
- dw format_directive-instruction_handler
- db 'fpatan',110011b
- dw simple_fpu_instruction-instruction_handler
- db 'fprem1',110101b
- dw simple_fpu_instruction-instruction_handler
- db 'frstor',4
- dw fnsave_instruction-instruction_handler
- db 'frstpm',0E5h
- dw fninit_instruction-instruction_handler
- db 'fsaved',6
- dw fsave_instruction_32bit-instruction_handler
- db 'fsavew',6
- dw fsave_instruction_16bit-instruction_handler
- db 'fscale',111101b
- dw simple_fpu_instruction-instruction_handler
- db 'fsetpm',0E4h
- dw fninit_instruction-instruction_handler
- db 'fstenv',6
- dw fstenv_instruction-instruction_handler
- db 'fsubrp',4
- dw faddp_instruction-instruction_handler
- db 'fucomi',0E8h
- dw fcomi_instruction-instruction_handler
- db 'fucomp',5
- dw ffree_instruction-instruction_handler
- db 'fxsave',0
- dw fxsave_instruction-instruction_handler
- db 'getsec',37h
- dw simple_extended_instruction-instruction_handler
- db 'haddpd',07Ch
- dw sse_pd_instruction-instruction_handler
- db 'haddps',07Ch
- dw cvtpd2dq_instruction-instruction_handler
- db 'hsubpd',07Dh
- dw sse_pd_instruction-instruction_handler
- db 'hsubps',07Dh
- dw cvtpd2dq_instruction-instruction_handler
- db 'invept',80h
- dw vmx_inv_instruction-instruction_handler
- db 'invlpg',0
- dw invlpg_instruction-instruction_handler
- db 'kandnb',42h
- dw mask_instruction_b-instruction_handler
- db 'kandnd',42h
- dw mask_instruction_d-instruction_handler
- db 'kandnq',42h
- dw mask_instruction_q-instruction_handler
- db 'kandnw',42h
- dw mask_instruction_w-instruction_handler
- db 'ktestb',99h
- dw mask_instruction_single_source_b-instruction_handler
- db 'ktestd',99h
- dw mask_instruction_single_source_d-instruction_handler
- db 'ktestq',99h
- dw mask_instruction_single_source_q-instruction_handler
- db 'ktestw',99h
- dw mask_instruction_single_source_w-instruction_handler
- db 'kxnorb',46h
- dw mask_instruction_b-instruction_handler
- db 'kxnord',46h
- dw mask_instruction_d-instruction_handler
- db 'kxnorq',46h
- dw mask_instruction_q-instruction_handler
- db 'kxnorw',46h
- dw mask_instruction_w-instruction_handler
- db 'lfence',0E8h
- dw fence_instruction-instruction_handler
- db 'llwpcb',0
- dw llwpcb_instruction-instruction_handler
- db 'looped',0E1h
- dw loop_instruction_32bit-instruction_handler
- db 'loopeq',0E1h
- dw loop_instruction_64bit-instruction_handler
- db 'loopew',0E1h
- dw loop_instruction_16bit-instruction_handler
- db 'loopne',0E0h
- dw loop_instruction-instruction_handler
- db 'loopnz',0E0h
- dw loop_instruction-instruction_handler
- db 'loopzd',0E1h
- dw loop_instruction_32bit-instruction_handler
- db 'loopzq',0E1h
- dw loop_instruction_64bit-instruction_handler
- db 'loopzw',0E1h
- dw loop_instruction_16bit-instruction_handler
- db 'lwpins',0
- dw lwpins_instruction-instruction_handler
- db 'lwpval',1
- dw lwpins_instruction-instruction_handler
- db 'mfence',0F0h
- dw fence_instruction-instruction_handler
- db 'movapd',28h
- dw movpd_instruction-instruction_handler
- db 'movaps',28h
- dw movps_instruction-instruction_handler
- db 'movdqa',66h
- dw movdq_instruction-instruction_handler
- db 'movdqu',0F3h
- dw movdq_instruction-instruction_handler
- db 'movhpd',16h
- dw movlpd_instruction-instruction_handler
- db 'movhps',16h
- dw movlps_instruction-instruction_handler
- db 'movlpd',12h
- dw movlpd_instruction-instruction_handler
- db 'movlps',12h
- dw movlps_instruction-instruction_handler
- db 'movnti',0C3h
- dw movnti_instruction-instruction_handler
- db 'movntq',0E7h
- dw movntq_instruction-instruction_handler
- db 'movsxd',63h
- dw movsxd_instruction-instruction_handler
- db 'movupd',10h
- dw movpd_instruction-instruction_handler
- db 'movups',10h
- dw movps_instruction-instruction_handler
- db 'mwaitx',0FBh
- dw monitor_instruction-instruction_handler
- db 'paddsb',0ECh
- dw basic_mmx_instruction-instruction_handler
- db 'paddsw',0EDh
- dw basic_mmx_instruction-instruction_handler
- db 'pextrb',14h
- dw pextrb_instruction-instruction_handler
- db 'pextrd',16h
- dw pextrd_instruction-instruction_handler
- db 'pextrq',16h
- dw pextrq_instruction-instruction_handler
- db 'pextrw',15h
- dw pextrw_instruction-instruction_handler
- db 'pfnacc',8Ah
- dw amd3dnow_instruction-instruction_handler
- db 'pfsubr',0AAh
- dw amd3dnow_instruction-instruction_handler
- db 'phaddd',2
- dw ssse3_instruction-instruction_handler
- db 'phaddw',1
- dw ssse3_instruction-instruction_handler
- db 'phsubd',6
- dw ssse3_instruction-instruction_handler
- db 'phsubw',5
- dw ssse3_instruction-instruction_handler
- db 'pinsrb',20h
- dw pinsrb_instruction-instruction_handler
- db 'pinsrd',22h
- dw pinsrd_instruction-instruction_handler
- db 'pinsrq',22h
- dw pinsrq_instruction-instruction_handler
- db 'pinsrw',0C4h
- dw pinsrw_instruction-instruction_handler
- db 'pmaxsb',3Ch
- dw sse4_instruction_66_38-instruction_handler
- db 'pmaxsd',3Dh
- dw sse4_instruction_66_38-instruction_handler
- db 'pmaxsw',0EEh
- dw basic_mmx_instruction-instruction_handler
- db 'pmaxub',0DEh
- dw basic_mmx_instruction-instruction_handler
- db 'pmaxud',3Fh
- dw sse4_instruction_66_38-instruction_handler
- db 'pmaxuw',3Eh
- dw sse4_instruction_66_38-instruction_handler
- db 'pminsb',38h
- dw sse4_instruction_66_38-instruction_handler
- db 'pminsd',39h
- dw sse4_instruction_66_38-instruction_handler
- db 'pminsw',0EAh
- dw basic_mmx_instruction-instruction_handler
- db 'pminub',0DAh
- dw basic_mmx_instruction-instruction_handler
- db 'pminud',3Bh
- dw sse4_instruction_66_38-instruction_handler
- db 'pminuw',3Ah
- dw sse4_instruction_66_38-instruction_handler
- db 'pmuldq',28h
- dw sse4_instruction_66_38-instruction_handler
- db 'pmulhw',0E5h
- dw basic_mmx_instruction-instruction_handler
- db 'pmulld',40h
- dw sse4_instruction_66_38-instruction_handler
- db 'pmullw',0D5h
- dw basic_mmx_instruction-instruction_handler
- db 'popcnt',0B8h
- dw popcnt_instruction-instruction_handler
- db 'psadbw',0F6h
- dw basic_mmx_instruction-instruction_handler
- db 'pshufb',0
- dw ssse3_instruction-instruction_handler
- db 'pshufd',66h
- dw pshufd_instruction-instruction_handler
- db 'pshufw',0
- dw pshufw_instruction-instruction_handler
- db 'psignb',8
- dw ssse3_instruction-instruction_handler
- db 'psignd',0Ah
- dw ssse3_instruction-instruction_handler
- db 'psignw',9
- dw ssse3_instruction-instruction_handler
- db 'pslldq',111b
- dw pslldq_instruction-instruction_handler
- db 'psmash',0FFh
- dw simple_instruction_f3_0f_01-instruction_handler
- db 'psrldq',011b
- dw pslldq_instruction-instruction_handler
- db 'psubsb',0E8h
- dw basic_mmx_instruction-instruction_handler
- db 'psubsw',0E9h
- dw basic_mmx_instruction-instruction_handler
- db 'pswapd',0BBh
- dw amd3dnow_instruction-instruction_handler
- db 'public',0
- dw public_directive-instruction_handler
- db 'pushad',60h
- dw simple_instruction_32bit_except64-instruction_handler
- db 'pushaw',60h
- dw simple_instruction_16bit_except64-instruction_handler
- db 'pushfd',9Ch
- dw simple_instruction_32bit_except64-instruction_handler
- db 'pushfq',9Ch
- dw simple_instruction_only64-instruction_handler
- db 'pushfw',9Ch
- dw simple_instruction_16bit-instruction_handler
- db 'rdmsrq',32h
- dw simple_extended_instruction_64bit-instruction_handler
- db 'rdpkru',0EEh
- dw simple_instruction_0f_01-instruction_handler
- db 'rdrand',110b
- dw rdrand_instruction-instruction_handler
- db 'rdseed',111b
- dw rdrand_instruction-instruction_handler
- db 'rdsspd',1
- dw rdsspd_instruction-instruction_handler
- db 'rdsspq',1
- dw rdsspq_instruction-instruction_handler
- db 'rdtscp',0F9h
- dw simple_instruction_0f_01-instruction_handler
- db 'repeat',0
- dw repeat_directive-instruction_handler
- db 'setalc',0D6h
- dw simple_instruction_except64-instruction_handler
- db 'setnae',92h
- dw set_instruction-instruction_handler
- db 'setnbe',97h
- dw set_instruction-instruction_handler
- db 'setnge',9Ch
- dw set_instruction-instruction_handler
- db 'setnle',9Fh
- dw set_instruction-instruction_handler
- db 'sfence',0F8h
- dw fence_instruction-instruction_handler
- db 'shufpd',0C6h
- dw sse_pd_instruction_imm8-instruction_handler
- db 'shufps',0C6h
- dw sse_ps_instruction_imm8-instruction_handler
- db 'skinit',0
- dw skinit_instruction-instruction_handler
- db 'slwpcb',1
- dw llwpcb_instruction-instruction_handler
- db 'sqrtpd',51h
- dw sse_pd_instruction-instruction_handler
- db 'sqrtps',51h
- dw sse_ps_instruction-instruction_handler
- db 'sqrtsd',51h
- dw sse_sd_instruction-instruction_handler
- db 'sqrtss',51h
- dw sse_ss_instruction-instruction_handler
- db 'swapgs',0F8h
- dw swapgs_instruction-instruction_handler
- db 'sysret',07h
- dw simple_extended_instruction-instruction_handler
- db 't1mskc',17h
- dw tbm_instruction-instruction_handler
- db 'tpause',66h
- dw tpause_instruction-instruction_handler
- db 'umwait',0F2h
- dw tpause_instruction-instruction_handler
- db 'vaddpd',58h
- dw avx_pd_instruction_er-instruction_handler
- db 'vaddps',58h
- dw avx_ps_instruction_er-instruction_handler
- db 'vaddsd',58h
- dw avx_sd_instruction_er-instruction_handler
- db 'vaddss',58h
- dw avx_ss_instruction_er-instruction_handler
- db 'vandpd',54h
- dw avx_pd_instruction-instruction_handler
- db 'vandps',54h
- dw avx_ps_instruction-instruction_handler
- db 'vcmppd',-1
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpps',-1
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpsd',-1
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpss',-1
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vdivpd',5Eh
- dw avx_pd_instruction_er-instruction_handler
- db 'vdivps',5Eh
- dw avx_ps_instruction_er-instruction_handler
- db 'vdivsd',5Eh
- dw avx_sd_instruction_er-instruction_handler
- db 'vdivss',5Eh
- dw avx_ss_instruction_er-instruction_handler
- db 'vlddqu',0F0h
- dw avx_lddqu_instruction-instruction_handler
- db 'vmaxpd',5Fh
- dw avx_pd_instruction_sae-instruction_handler
- db 'vmaxps',5Fh
- dw avx_ps_instruction_sae-instruction_handler
- db 'vmaxsd',5Fh
- dw avx_sd_instruction_sae-instruction_handler
- db 'vmaxss',5Fh
- dw avx_ss_instruction_sae-instruction_handler
- db 'vmcall',0C1h
- dw simple_instruction_0f_01-instruction_handler
- db 'vmfunc',0D4h
- dw simple_instruction_0f_01-instruction_handler
- db 'vminpd',5Dh
- dw avx_pd_instruction_sae-instruction_handler
- db 'vminps',5Dh
- dw avx_ps_instruction_sae-instruction_handler
- db 'vminsd',5Dh
- dw avx_sd_instruction_sae-instruction_handler
- db 'vminss',5Dh
- dw avx_ss_instruction_sae-instruction_handler
- db 'vmload',0DAh
- dw simple_svm_instruction-instruction_handler
- db 'vmovsd',0
- dw avx_movsd_instruction-instruction_handler
- db 'vmovss',0
- dw avx_movss_instruction-instruction_handler
- db 'vmread',0
- dw vmread_instruction-instruction_handler
- db 'vmsave',0DBh
- dw simple_svm_instruction-instruction_handler
- db 'vmulpd',59h
- dw avx_pd_instruction_er-instruction_handler
- db 'vmulps',59h
- dw avx_ps_instruction_er-instruction_handler
- db 'vmulsd',59h
- dw avx_sd_instruction_er-instruction_handler
- db 'vmulss',59h
- dw avx_ss_instruction_er-instruction_handler
- db 'vmxoff',0C4h
- dw simple_instruction_0f_01-instruction_handler
- db 'vpabsb',1Ch
- dw avx_single_source_bw_instruction_38-instruction_handler
- db 'vpabsd',1Eh
- dw avx_single_source_d_instruction_38-instruction_handler
- db 'vpabsq',1Fh
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vpabsw',1Dh
- dw avx_single_source_bw_instruction_38-instruction_handler
- db 'vpaddb',0FCh
- dw avx_bw_instruction-instruction_handler
- db 'vpaddd',0FEh
- dw avx_d_instruction-instruction_handler
- db 'vpaddq',0D4h
- dw avx_q_instruction-instruction_handler
- db 'vpaddw',0FDh
- dw avx_bw_instruction-instruction_handler
- db 'vpandd',0DBh
- dw avx_d_instruction_evex-instruction_handler
- db 'vpandn',0DFh
- dw avx_pd_instruction_noevex-instruction_handler
- db 'vpandq',0DBh
- dw avx_q_instruction_evex-instruction_handler
- db 'vpavgb',0E0h
- dw avx_bw_instruction-instruction_handler
- db 'vpavgw',0E3h
- dw avx_bw_instruction-instruction_handler
- db 'vpcmov',0A2h
- dw vpcmov_instruction-instruction_handler
- db 'vpcmpb',-1
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpd',-1
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpq',-1
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmpw',-1
- dw avx512_cmp_w_instruction-instruction_handler
- db 'vpcomb',-1
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomd',-1
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomq',-1
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomw',-1
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpermb',8Dh
- dw avx_bw_instruction_38_evex-instruction_handler
- db 'vpermd',36h
- dw avx_permd_instruction-instruction_handler
- db 'vpermq',0
- dw avx_permq_instruction-instruction_handler
- db 'vpermw',8Dh
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpperm',0A3h
- dw xop_128bit_instruction-instruction_handler
- db 'vprold',1
- dw avx512_rotate_d_instruction-instruction_handler
- db 'vprolq',1
- dw avx512_rotate_q_instruction-instruction_handler
- db 'vprord',0
- dw avx512_rotate_d_instruction-instruction_handler
- db 'vprorq',0
- dw avx512_rotate_q_instruction-instruction_handler
- db 'vprotb',90h
- dw xop_shift_instruction-instruction_handler
- db 'vprotd',92h
- dw xop_shift_instruction-instruction_handler
- db 'vprotq',93h
- dw xop_shift_instruction-instruction_handler
- db 'vprotw',91h
- dw xop_shift_instruction-instruction_handler
- db 'vpshab',98h
- dw xop_shift_instruction-instruction_handler
- db 'vpshad',9Ah
- dw xop_shift_instruction-instruction_handler
- db 'vpshaq',9Bh
- dw xop_shift_instruction-instruction_handler
- db 'vpshaw',99h
- dw xop_shift_instruction-instruction_handler
- db 'vpshlb',94h
- dw xop_shift_instruction-instruction_handler
- db 'vpshld',96h
- dw xop_shift_instruction-instruction_handler
- db 'vpshlq',97h
- dw xop_shift_instruction-instruction_handler
- db 'vpshlw',95h
- dw xop_shift_instruction-instruction_handler
- db 'vpslld',0F2h
- dw avx_shift_d_instruction-instruction_handler
- db 'vpsllq',0F3h
- dw avx_shift_q_instruction-instruction_handler
- db 'vpsllw',0F1h
- dw avx_shift_bw_instruction-instruction_handler
- db 'vpsrad',0E2h
- dw avx_shift_d_instruction-instruction_handler
- db 'vpsraq',0E2h
- dw avx_shift_q_instruction_evex-instruction_handler
- db 'vpsraw',0E1h
- dw avx_shift_bw_instruction-instruction_handler
- db 'vpsrld',0D2h
- dw avx_shift_d_instruction-instruction_handler
- db 'vpsrlq',0D3h
- dw avx_shift_q_instruction-instruction_handler
- db 'vpsrlw',0D1h
- dw avx_shift_bw_instruction-instruction_handler
- db 'vpsubb',0F8h
- dw avx_bw_instruction-instruction_handler
- db 'vpsubd',0FAh
- dw avx_d_instruction-instruction_handler
- db 'vpsubq',0FBh
- dw avx_q_instruction-instruction_handler
- db 'vpsubw',0F9h
- dw avx_bw_instruction-instruction_handler
- db 'vptest',17h
- dw avx_single_source_instruction_38_noevex-instruction_handler
- db 'vpxord',0EFh
- dw avx_d_instruction_evex-instruction_handler
- db 'vpxorq',0EFh
- dw avx_q_instruction_evex-instruction_handler
- db 'vrcpps',53h
- dw avx_single_source_ps_instruction_noevex-instruction_handler
- db 'vrcpss',53h
- dw avx_ss_instruction_noevex-instruction_handler
- db 'vsubpd',5Ch
- dw avx_pd_instruction_er-instruction_handler
- db 'vsubps',5Ch
- dw avx_ps_instruction_er-instruction_handler
- db 'vsubsd',5Ch
- dw avx_sd_instruction_er-instruction_handler
- db 'vsubss',5Ch
- dw avx_ss_instruction_er-instruction_handler
- db 'vxorpd',57h
- dw avx_pd_instruction-instruction_handler
- db 'vxorps',57h
- dw avx_ps_instruction-instruction_handler
- db 'wbinvd',9
- dw simple_extended_instruction-instruction_handler
- db 'wrmsrq',30h
- dw simple_extended_instruction_64bit-instruction_handler
- db 'wrpkru',0EFh
- dw simple_instruction_0f_01-instruction_handler
- db 'wrussd',0F5h
- dw wrussd_instruction-instruction_handler
- db 'wrussq',0F5h
- dw wrussq_instruction-instruction_handler
- db 'xabort',0
- dw xabort_instruction-instruction_handler
- db 'xbegin',0
- dw xbegin_instruction-instruction_handler
- db 'xgetbv',0D0h
- dw simple_instruction_0f_01-instruction_handler
- db 'xrstor',101b
- dw fxsave_instruction-instruction_handler
- db 'xsavec',4
- dw xsaves_instruction-instruction_handler
- db 'xsaves',5
- dw xsaves_instruction-instruction_handler
- db 'xsetbv',0D1h
- dw simple_instruction_0f_01-instruction_handler
-instructions_7:
- db 'blcfill',11h
- dw tbm_instruction-instruction_handler
- db 'blendpd',0Dh
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'blendps',0Ch
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'blsfill',12h
- dw tbm_instruction-instruction_handler
- db 'clflush',111b
- dw clflush_instruction-instruction_handler
- db 'cmovnae',42h
- dw bs_instruction-instruction_handler
- db 'cmovnbe',47h
- dw bs_instruction-instruction_handler
- db 'cmovnge',4Ch
- dw bs_instruction-instruction_handler
- db 'cmovnle',4Fh
- dw bs_instruction-instruction_handler
- db 'cmpeqpd',0
- dw cmp_pd_instruction-instruction_handler
- db 'cmpeqps',0
- dw cmp_ps_instruction-instruction_handler
- db 'cmpeqsd',0
- dw cmp_sd_instruction-instruction_handler
- db 'cmpeqss',0
- dw cmp_ss_instruction-instruction_handler
- db 'cmplepd',2
- dw cmp_pd_instruction-instruction_handler
- db 'cmpleps',2
- dw cmp_ps_instruction-instruction_handler
- db 'cmplesd',2
- dw cmp_sd_instruction-instruction_handler
- db 'cmpless',2
- dw cmp_ss_instruction-instruction_handler
- db 'cmpltpd',1
- dw cmp_pd_instruction-instruction_handler
- db 'cmpltps',1
- dw cmp_ps_instruction-instruction_handler
- db 'cmpltsd',1
- dw cmp_sd_instruction-instruction_handler
- db 'cmpltss',1
- dw cmp_ss_instruction-instruction_handler
- db 'cmpxchg',0B0h
- dw basic_486_instruction-instruction_handler
- db 'display',0
- dw display_directive-instruction_handler
- db 'endbr32',0FBh
- dw endbr_instruction-instruction_handler
- db 'endbr64',0FAh
- dw endbr_instruction-instruction_handler
- db 'fcmovbe',0D0h
- dw fcmov_instruction-instruction_handler
- db 'fcmovnb',0C0h
- dw fcomi_instruction-instruction_handler
- db 'fcmovne',0C8h
- dw fcomi_instruction-instruction_handler
- db 'fcmovnu',0D8h
- dw fcomi_instruction-instruction_handler
- db 'fdecstp',110110b
- dw simple_fpu_instruction-instruction_handler
- db 'fincstp',110111b
- dw simple_fpu_instruction-instruction_handler
- db 'fldenvd',4
- dw fldenv_instruction_32bit-instruction_handler
- db 'fldenvw',4
- dw fldenv_instruction_16bit-instruction_handler
- db 'fnsaved',6
- dw fnsave_instruction_32bit-instruction_handler
- db 'fnsavew',6
- dw fnsave_instruction_16bit-instruction_handler
- db 'fnstenv',6
- dw fldenv_instruction-instruction_handler
- db 'frndint',111100b
- dw simple_fpu_instruction-instruction_handler
- db 'frstord',4
- dw fnsave_instruction_32bit-instruction_handler
- db 'frstorw',4
- dw fnsave_instruction_16bit-instruction_handler
- db 'fsincos',111011b
- dw simple_fpu_instruction-instruction_handler
- db 'fstenvd',6
- dw fstenv_instruction_32bit-instruction_handler
- db 'fstenvw',6
- dw fstenv_instruction_16bit-instruction_handler
- db 'fucomip',0E8h
- dw fcomip_instruction-instruction_handler
- db 'fucompp',0
- dw fucompp_instruction-instruction_handler
- db 'fxrstor',1
- dw fxsave_instruction-instruction_handler
- db 'fxtract',110100b
- dw simple_fpu_instruction-instruction_handler
- db 'fyl2xp1',111001b
- dw simple_fpu_instruction-instruction_handler
- db 'incsspd',5
- dw incsspd_instruction-instruction_handler
- db 'incsspq',5
- dw incsspq_instruction-instruction_handler
- db 'insertq',0
- dw insertq_instruction-instruction_handler
- db 'invlpga',0DFh
- dw invlpga_instruction-instruction_handler
- db 'invlpgb',0FEh
- dw simple_instruction_0f_01-instruction_handler
- db 'invpcid',82h
- dw vmx_inv_instruction-instruction_handler
- db 'invvpid',81h
- dw vmx_inv_instruction-instruction_handler
- db 'ldmxcsr',10b
- dw stmxcsr_instruction-instruction_handler
- db 'loopned',0E0h
- dw loop_instruction_32bit-instruction_handler
- db 'loopneq',0E0h
- dw loop_instruction_64bit-instruction_handler
- db 'loopnew',0E0h
- dw loop_instruction_16bit-instruction_handler
- db 'loopnzd',0E0h
- dw loop_instruction_32bit-instruction_handler
- db 'loopnzq',0E0h
- dw loop_instruction_64bit-instruction_handler
- db 'loopnzw',0E0h
- dw loop_instruction_16bit-instruction_handler
- db 'mcommit',0FAh
- dw simple_instruction_f3_0f_01-instruction_handler
- db 'monitor',0C8h
- dw monitor_instruction-instruction_handler
- db 'movddup',12h
- dw sse_sd_instruction-instruction_handler
- db 'movdiri',0F9h
- dw movdiri_instruction-instruction_handler
- db 'movdq2q',0
- dw movdq2q_instruction-instruction_handler
- db 'movhlps',12h
- dw movhlps_instruction-instruction_handler
- db 'movlhps',16h
- dw movhlps_instruction-instruction_handler
- db 'movntdq',0E7h
- dw movntpd_instruction-instruction_handler
- db 'movntpd',2Bh
- dw movntpd_instruction-instruction_handler
- db 'movntps',2Bh
- dw movntps_instruction-instruction_handler
- db 'movntsd',2Bh
- dw movntsd_instruction-instruction_handler
- db 'movntss',2Bh
- dw movntss_instruction-instruction_handler
- db 'movq2dq',0
- dw movq2dq_instruction-instruction_handler
- db 'mpsadbw',42h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'paddusb',0DCh
- dw basic_mmx_instruction-instruction_handler
- db 'paddusw',0DDh
- dw basic_mmx_instruction-instruction_handler
- db 'palignr',0
- dw palignr_instruction-instruction_handler
- db 'pavgusb',0BFh
- dw amd3dnow_instruction-instruction_handler
- db 'pblendw',0Eh
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'pcmpeqb',74h
- dw basic_mmx_instruction-instruction_handler
- db 'pcmpeqd',76h
- dw basic_mmx_instruction-instruction_handler
- db 'pcmpeqq',29h
- dw sse4_instruction_66_38-instruction_handler
- db 'pcmpeqw',75h
- dw basic_mmx_instruction-instruction_handler
- db 'pcmpgtb',64h
- dw basic_mmx_instruction-instruction_handler
- db 'pcmpgtd',66h
- dw basic_mmx_instruction-instruction_handler
- db 'pcmpgtq',37h
- dw sse4_instruction_66_38-instruction_handler
- db 'pcmpgtw',65h
- dw basic_mmx_instruction-instruction_handler
- db 'pcommit',0F8h
- dw pcommit_instruction-instruction_handler
- db 'pconfig',0C5h
- dw pconfig_instruction-instruction_handler
- db 'pfcmpeq',0B0h
- dw amd3dnow_instruction-instruction_handler
- db 'pfcmpge',90h
- dw amd3dnow_instruction-instruction_handler
- db 'pfcmpgt',0A0h
- dw amd3dnow_instruction-instruction_handler
- db 'pfpnacc',8Eh
- dw amd3dnow_instruction-instruction_handler
- db 'pfrsqrt',97h
- dw amd3dnow_instruction-instruction_handler
- db 'phaddsw',3
- dw ssse3_instruction-instruction_handler
- db 'phsubsw',7
- dw ssse3_instruction-instruction_handler
- db 'pmaddwd',0F5h
- dw basic_mmx_instruction-instruction_handler
- db 'pmulhrw',0B7h
- dw amd3dnow_instruction-instruction_handler
- db 'pmulhuw',0E4h
- dw basic_mmx_instruction-instruction_handler
- db 'pmuludq',0F4h
- dw basic_mmx_instruction-instruction_handler
- db 'pshufhw',0F3h
- dw pshufd_instruction-instruction_handler
- db 'pshuflw',0F2h
- dw pshufd_instruction-instruction_handler
- db 'psubusb',0D8h
- dw basic_mmx_instruction-instruction_handler
- db 'psubusw',0D9h
- dw basic_mmx_instruction-instruction_handler
- db 'ptwrite',4
- dw ptwrite_instruction-instruction_handler
- db 'roundpd',9
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'roundps',8
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'roundsd',0Bh
- dw sse4_sd_instruction_66_3a_imm8-instruction_handler
- db 'roundss',0Ah
- dw sse4_ss_instruction_66_3a_imm8-instruction_handler
- db 'rsqrtps',52h
- dw sse_ps_instruction-instruction_handler
- db 'rsqrtss',52h
- dw sse_ss_instruction-instruction_handler
- db 'section',0
- dw section_directive-instruction_handler
- db 'segment',0
- dw segment_directive-instruction_handler
- db 'stmxcsr',11b
- dw stmxcsr_instruction-instruction_handler
- db 'syscall',05h
- dw simple_extended_instruction-instruction_handler
- db 'sysexit',35h
- dw simple_extended_instruction-instruction_handler
- db 'sysretq',07h
- dw simple_extended_instruction_64bit-instruction_handler
- db 'tlbsync',0FFh
- dw simple_instruction_0f_01-instruction_handler
- db 'ucomisd',2Eh
- dw comisd_instruction-instruction_handler
- db 'ucomiss',2Eh
- dw comiss_instruction-instruction_handler
- db 'vaesdec',0DEh
- dw avx_instruction_38_nomask-instruction_handler
- db 'vaesenc',0DCh
- dw avx_instruction_38_nomask-instruction_handler
- db 'vaesimc',0DBh
- dw avx_single_source_128bit_instruction_38_noevex-instruction_handler
- db 'valignd',3
- dw avx_d_instruction_3a_imm8_evex-instruction_handler
- db 'valignq',3
- dw avx_q_instruction_3a_imm8_evex-instruction_handler
- db 'vandnpd',55h
- dw avx_pd_instruction-instruction_handler
- db 'vandnps',55h
- dw avx_ps_instruction-instruction_handler
- db 'vcomisd',2Fh
- dw avx_comisd_instruction-instruction_handler
- db 'vcomiss',2Fh
- dw avx_comiss_instruction-instruction_handler
- db 'vexp2pd',0C8h
- dw avx512_exp2pd_instruction-instruction_handler
- db 'vexp2ps',0C8h
- dw avx512_exp2ps_instruction-instruction_handler
- db 'vfrczpd',81h
- dw xop_single_source_instruction-instruction_handler
- db 'vfrczps',80h
- dw xop_single_source_instruction-instruction_handler
- db 'vfrczsd',83h
- dw xop_single_source_sd_instruction-instruction_handler
- db 'vfrczss',82h
- dw xop_single_source_ss_instruction-instruction_handler
- db 'vhaddpd',07Ch
- dw avx_pd_instruction_noevex-instruction_handler
- db 'vhaddps',07Ch
- dw avx_ps_instruction_noevex-instruction_handler
- db 'vhsubpd',07Dh
- dw avx_pd_instruction_noevex-instruction_handler
- db 'vhsubps',07Dh
- dw avx_ps_instruction_noevex-instruction_handler
- db 'virtual',0
- dw virtual_directive-instruction_handler
- db 'vmclear',6
- dw vmclear_instruction-instruction_handler
- db 'vmmcall',0D9h
- dw simple_instruction_0f_01-instruction_handler
- db 'vmovapd',28h
- dw avx_movpd_instruction-instruction_handler
- db 'vmovaps',28h
- dw avx_movps_instruction-instruction_handler
- db 'vmovdqa',6Fh
- dw avx_movdqa_instruction-instruction_handler
- db 'vmovdqu',6Fh
- dw avx_movdqu_instruction-instruction_handler
- db 'vmovhpd',16h
- dw avx_movlpd_instruction-instruction_handler
- db 'vmovhps',16h
- dw avx_movlps_instruction-instruction_handler
- db 'vmovlpd',12h
- dw avx_movlpd_instruction-instruction_handler
- db 'vmovlps',12h
- dw avx_movlps_instruction-instruction_handler
- db 'vmovupd',10h
- dw avx_movpd_instruction-instruction_handler
- db 'vmovups',10h
- dw avx_movps_instruction-instruction_handler
- db 'vmptrld',6
- dw vmx_instruction-instruction_handler
- db 'vmptrst',7
- dw vmx_instruction-instruction_handler
- db 'vmwrite',0
- dw vmwrite_instruction-instruction_handler
- db 'vpaddsb',0ECh
- dw avx_bw_instruction-instruction_handler
- db 'vpaddsw',0EDh
- dw avx_bw_instruction-instruction_handler
- db 'vpandnd',0DFh
- dw avx_d_instruction_evex-instruction_handler
- db 'vpandnq',0DFh
- dw avx_q_instruction_evex-instruction_handler
- db 'vpcmpub',-1
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpud',-1
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpuq',-1
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpuw',-1
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcomub',-1
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomud',-1
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomuq',-1
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomuw',-1
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpermpd',1
- dw avx_permq_instruction-instruction_handler
- db 'vpermps',16h
- dw avx_permd_instruction-instruction_handler
- db 'vpextrb',14h
- dw avx_extract_b_instruction-instruction_handler
- db 'vpextrd',16h
- dw avx_extract_d_instruction-instruction_handler
- db 'vpextrq',16h
- dw avx_extract_q_instruction-instruction_handler
- db 'vpextrw',15h
- dw avx_extract_w_instruction-instruction_handler
- db 'vphaddd',2
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vphaddw',1
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vphsubd',6
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vphsubw',5
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vpinsrb',20h
- dw avx_pinsrb_instruction-instruction_handler
- db 'vpinsrd',22h
- dw avx_pinsrd_instruction-instruction_handler
- db 'vpinsrq',22h
- dw avx_pinsrq_instruction-instruction_handler
- db 'vpinsrw',0C4h
- dw avx_pinsrw_instruction-instruction_handler
- db 'vpmaxsb',3Ch
- dw avx_bw_instruction_38-instruction_handler
- db 'vpmaxsd',3Dh
- dw avx_d_instruction_38-instruction_handler
- db 'vpmaxsq',3Dh
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpmaxsw',0EEh
- dw avx_bw_instruction-instruction_handler
- db 'vpmaxub',0DEh
- dw avx_bw_instruction-instruction_handler
- db 'vpmaxud',3Fh
- dw avx_d_instruction_38-instruction_handler
- db 'vpmaxuq',3Fh
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpmaxuw',3Eh
- dw avx_bw_instruction_38-instruction_handler
- db 'vpminsb',38h
- dw avx_bw_instruction_38-instruction_handler
- db 'vpminsd',39h
- dw avx_d_instruction_38-instruction_handler
- db 'vpminsq',39h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpminsw',0EAh
- dw avx_bw_instruction-instruction_handler
- db 'vpminub',0DAh
- dw avx_bw_instruction-instruction_handler
- db 'vpminud',3Bh
- dw avx_d_instruction_38-instruction_handler
- db 'vpminuq',3Bh
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpminuw',3Ah
- dw avx_bw_instruction_38-instruction_handler
- db 'vpmovdb',31h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovdw',33h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovqb',32h
- dw avx512_pmovqb_instruction-instruction_handler
- db 'vpmovqd',35h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovqw',34h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovwb',30h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmuldq',28h
- dw avx_q_instruction_38-instruction_handler
- db 'vpmulhw',0E5h
- dw avx_bw_instruction-instruction_handler
- db 'vpmulld',40h
- dw avx_d_instruction_38-instruction_handler
- db 'vpmullq',40h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpmullw',0D5h
- dw avx_bw_instruction-instruction_handler
- db 'vprolvd',15h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vprolvq',15h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vprorvd',14h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vprorvq',14h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpsadbw',0F6h
- dw avx_bw_instruction-instruction_handler
- db 'vpshldd',71h
- dw avx_d_instruction_3a_imm8_evex-instruction_handler
- db 'vpshldq',71h
- dw avx_q_instruction_3a_imm8_evex-instruction_handler
- db 'vpshldw',70h
- dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
- db 'vpshrdd',73h
- dw avx_d_instruction_3a_imm8_evex-instruction_handler
- db 'vpshrdq',73h
- dw avx_q_instruction_3a_imm8_evex-instruction_handler
- db 'vpshrdw',72h
- dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
- db 'vpshufb',0
- dw avx_bw_instruction_38-instruction_handler
- db 'vpshufd',70h
- dw avx_single_source_d_instruction_imm8-instruction_handler
- db 'vpsignb',8
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vpsignd',0Ah
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vpsignw',9
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vpslldq',111b
- dw avx_shift_dq_instruction-instruction_handler
- db 'vpsllvd',47h
- dw avx_d_instruction_38-instruction_handler
- db 'vpsllvq',47h
- dw avx_q_instruction_38_w1-instruction_handler
- db 'vpsllvw',12h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpsravd',46h
- dw avx_d_instruction_38-instruction_handler
- db 'vpsravq',46h
- dw avx_q_instruction_38_w1_evex-instruction_handler
- db 'vpsravw',11h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpsrldq',011b
- dw avx_shift_dq_instruction-instruction_handler
- db 'vpsrlvd',45h
- dw avx_d_instruction_38-instruction_handler
- db 'vpsrlvq',45h
- dw avx_q_instruction_38_w1-instruction_handler
- db 'vpsrlvw',10h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpsubsb',0E8h
- dw avx_bw_instruction-instruction_handler
- db 'vpsubsw',0E9h
- dw avx_bw_instruction-instruction_handler
- db 'vshufpd',0C6h
- dw avx_pd_instruction_imm8-instruction_handler
- db 'vshufps',0C6h
- dw avx_ps_instruction_imm8-instruction_handler
- db 'vsqrtpd',51h
- dw avx_single_source_pd_instruction_er-instruction_handler
- db 'vsqrtps',51h
- dw avx_single_source_ps_instruction_er-instruction_handler
- db 'vsqrtsd',51h
- dw avx_sd_instruction_er-instruction_handler
- db 'vsqrtss',51h
- dw avx_ss_instruction_er-instruction_handler
- db 'vtestpd',0Fh
- dw avx_single_source_instruction_38_noevex-instruction_handler
- db 'vtestps',0Eh
- dw avx_single_source_instruction_38_noevex-instruction_handler
- db 'xrstors',3
- dw xsaves_instruction-instruction_handler
- db 'xsave64',100b
- dw fxsave_instruction_64bit-instruction_handler
-instructions_8:
- db 'addsubpd',0D0h
- dw sse_pd_instruction-instruction_handler
- db 'addsubps',0D0h
- dw cvtpd2dq_instruction-instruction_handler
- db 'blendvpd',15h
- dw sse4_instruction_66_38_xmm0-instruction_handler
- db 'blendvps',14h
- dw sse4_instruction_66_38_xmm0-instruction_handler
- db 'cldemote',0
- dw cldemote_instruction-instruction_handler
- db 'clrssbsy',6
- dw clrssbsy_instruction-instruction_handler
- db 'cmpneqpd',4
- dw cmp_pd_instruction-instruction_handler
- db 'cmpneqps',4
- dw cmp_ps_instruction-instruction_handler
- db 'cmpneqsd',4
- dw cmp_sd_instruction-instruction_handler
- db 'cmpneqss',4
- dw cmp_ss_instruction-instruction_handler
- db 'cmpnlepd',6
- dw cmp_pd_instruction-instruction_handler
- db 'cmpnleps',6
- dw cmp_ps_instruction-instruction_handler
- db 'cmpnlesd',6
- dw cmp_sd_instruction-instruction_handler
- db 'cmpnless',6
- dw cmp_ss_instruction-instruction_handler
- db 'cmpnltpd',5
- dw cmp_pd_instruction-instruction_handler
- db 'cmpnltps',5
- dw cmp_ps_instruction-instruction_handler
- db 'cmpnltsd',5
- dw cmp_sd_instruction-instruction_handler
- db 'cmpnltss',5
- dw cmp_ss_instruction-instruction_handler
- db 'cmpordpd',7
- dw cmp_pd_instruction-instruction_handler
- db 'cmpordps',7
- dw cmp_ps_instruction-instruction_handler
- db 'cmpordsd',7
- dw cmp_sd_instruction-instruction_handler
- db 'cmpordss',7
- dw cmp_ss_instruction-instruction_handler
- db 'cvtdq2pd',0E6h
- dw cvtdq2pd_instruction-instruction_handler
- db 'cvtdq2ps',5Bh
- dw sse_ps_instruction-instruction_handler
- db 'cvtpd2dq',0E6h
- dw cvtpd2dq_instruction-instruction_handler
- db 'cvtpd2pi',2Dh
- dw cvtpd2pi_instruction-instruction_handler
- db 'cvtpd2ps',5Ah
- dw sse_pd_instruction-instruction_handler
- db 'cvtpi2pd',2Ah
- dw cvtpi2pd_instruction-instruction_handler
- db 'cvtpi2ps',2Ah
- dw cvtpi2ps_instruction-instruction_handler
- db 'cvtps2dq',5Bh
- dw sse_pd_instruction-instruction_handler
- db 'cvtps2pd',5Ah
- dw cvtps2pd_instruction-instruction_handler
- db 'cvtps2pi',2Dh
- dw cvtps2pi_instruction-instruction_handler
- db 'cvtsd2si',2Dh
- dw cvtsd2si_instruction-instruction_handler
- db 'cvtsd2ss',5Ah
- dw sse_sd_instruction-instruction_handler
- db 'cvtsi2sd',2Ah
- dw cvtsi2sd_instruction-instruction_handler
- db 'cvtsi2ss',2Ah
- dw cvtsi2ss_instruction-instruction_handler
- db 'cvtss2sd',5Ah
- dw sse_ss_instruction-instruction_handler
- db 'cvtss2si',2Dh
- dw cvtss2si_instruction-instruction_handler
- db 'fcmovnbe',0D0h
- dw fcomi_instruction-instruction_handler
- db 'fnstenvd',6
- dw fldenv_instruction_32bit-instruction_handler
- db 'fnstenvw',6
- dw fldenv_instruction_16bit-instruction_handler
- db 'fxsave64',0
- dw fxsave_instruction_64bit-instruction_handler
- db 'insertps',21h
- dw insertps_instruction-instruction_handler
- db 'kortestb',98h
- dw mask_instruction_single_source_b-instruction_handler
- db 'kortestd',98h
- dw mask_instruction_single_source_d-instruction_handler
- db 'kortestq',98h
- dw mask_instruction_single_source_q-instruction_handler
- db 'kortestw',98h
- dw mask_instruction_single_source_w-instruction_handler
- db 'kshiftlb',32h
- dw mask_shift_instruction_d-instruction_handler
- db 'kshiftld',33h
- dw mask_shift_instruction_d-instruction_handler
- db 'kshiftlq',33h
- dw mask_shift_instruction_q-instruction_handler
- db 'kshiftlw',32h
- dw mask_shift_instruction_q-instruction_handler
- db 'kshiftrb',30h
- dw mask_shift_instruction_d-instruction_handler
- db 'kshiftrd',31h
- dw mask_shift_instruction_d-instruction_handler
- db 'kshiftrq',31h
- dw mask_shift_instruction_q-instruction_handler
- db 'kshiftrw',30h
- dw mask_shift_instruction_q-instruction_handler
- db 'kunpckbw',4Bh
- dw mask_instruction_b-instruction_handler
- db 'kunpckdq',4Bh
- dw mask_instruction_q-instruction_handler
- db 'kunpckwd',4Bh
- dw mask_instruction_w-instruction_handler
- db 'maskmovq',0
- dw maskmovq_instruction-instruction_handler
- db 'monitorx',0FAh
- dw monitor_instruction-instruction_handler
- db 'movmskpd',0
- dw movmskpd_instruction-instruction_handler
- db 'movmskps',0
- dw movmskps_instruction-instruction_handler
- db 'movntdqa',2Ah
- dw movntdqa_instruction-instruction_handler
- db 'movshdup',16h
- dw movshdup_instruction-instruction_handler
- db 'movsldup',12h
- dw movshdup_instruction-instruction_handler
- db 'packssdw',6Bh
- dw basic_mmx_instruction-instruction_handler
- db 'packsswb',63h
- dw basic_mmx_instruction-instruction_handler
- db 'packusdw',2Bh
- dw sse4_instruction_66_38-instruction_handler
- db 'packuswb',67h
- dw basic_mmx_instruction-instruction_handler
- db 'pblendvb',10h
- dw sse4_instruction_66_38_xmm0-instruction_handler
- db 'pfrcpit1',0A6h
- dw amd3dnow_instruction-instruction_handler
- db 'pfrcpit2',0B6h
- dw amd3dnow_instruction-instruction_handler
- db 'pfrsqit1',0A7h
- dw amd3dnow_instruction-instruction_handler
- db 'pmovmskb',0D7h
- dw pmovmskb_instruction-instruction_handler
- db 'pmovsxbd',21h
- dw pmovsxbd_instruction-instruction_handler
- db 'pmovsxbq',22h
- dw pmovsxbq_instruction-instruction_handler
- db 'pmovsxbw',20h
- dw pmovsxbw_instruction-instruction_handler
- db 'pmovsxdq',25h
- dw pmovsxdq_instruction-instruction_handler
- db 'pmovsxwd',23h
- dw pmovsxwd_instruction-instruction_handler
- db 'pmovsxwq',24h
- dw pmovsxwq_instruction-instruction_handler
- db 'pmovzxbd',31h
- dw pmovsxbd_instruction-instruction_handler
- db 'pmovzxbq',32h
- dw pmovsxbq_instruction-instruction_handler
- db 'pmovzxbw',30h
- dw pmovsxbw_instruction-instruction_handler
- db 'pmovzxdq',35h
- dw pmovsxdq_instruction-instruction_handler
- db 'pmovzxwd',33h
- dw pmovsxwd_instruction-instruction_handler
- db 'pmovzxwq',34h
- dw pmovsxwq_instruction-instruction_handler
- db 'pmulhrsw',0Bh
- dw ssse3_instruction-instruction_handler
- db 'prefetch',0
- dw amd_prefetch_instruction-instruction_handler
- db 'rdfsbase',0
- dw rdfsbase_instruction-instruction_handler
- db 'rdgsbase',1
- dw rdfsbase_instruction-instruction_handler
- db 'rstorssp',5
- dw rstorssp_instruction-instruction_handler
- db 'setssbsy',0E8h
- dw setssbsy_instruction-instruction_handler
- db 'sha1msg1',0C9h
- dw sse4_instruction_38-instruction_handler
- db 'sha1msg2',0CAh
- dw sse4_instruction_38-instruction_handler
- db 'sysenter',34h
- dw simple_extended_instruction-instruction_handler
- db 'sysexitq',35h
- dw simple_extended_instruction_64bit-instruction_handler
- db 'umonitor',0
- dw umonitor_instruction-instruction_handler
- db 'unpckhpd',15h
- dw sse_pd_instruction-instruction_handler
- db 'unpckhps',15h
- dw sse_ps_instruction-instruction_handler
- db 'unpcklpd',14h
- dw sse_pd_instruction-instruction_handler
- db 'unpcklps',14h
- dw sse_ps_instruction-instruction_handler
- db 'vblendpd',0Dh
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vblendps',0Ch
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vcmpeqpd',0
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpeqps',0
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpeqsd',0
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpeqss',0
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpgepd',0Dh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpgeps',0Dh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpgesd',0Dh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpgess',0Dh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpgtpd',0Eh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpgtps',0Eh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpgtsd',0Eh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpgtss',0Eh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmplepd',2
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpleps',2
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmplesd',2
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpless',2
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpltpd',1
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpltps',1
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpltsd',1
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpltss',1
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vfmaddpd',69h
- dw fma4_instruction_p-instruction_handler
- db 'vfmaddps',68h
- dw fma4_instruction_p-instruction_handler
- db 'vfmaddsd',6Bh
- dw fma4_instruction_sd-instruction_handler
- db 'vfmaddss',6Ah
- dw fma4_instruction_ss-instruction_handler
- db 'vfmsubpd',6Dh
- dw fma4_instruction_p-instruction_handler
- db 'vfmsubps',6Ch
- dw fma4_instruction_p-instruction_handler
- db 'vfmsubsd',6Fh
- dw fma4_instruction_sd-instruction_handler
- db 'vfmsubss',6Eh
- dw fma4_instruction_ss-instruction_handler
- db 'vldmxcsr',10b
- dw vstmxcsr_instruction-instruction_handler
- db 'vmlaunch',0C2h
- dw simple_instruction_0f_01-instruction_handler
- db 'vmovddup',12h
- dw avx_movddup_instruction-instruction_handler
- db 'vmovdqu8',6Fh
- dw avx512_movdqu8_instruction-instruction_handler
- db 'vmovhlps',12h
- dw avx_movhlps_instruction-instruction_handler
- db 'vmovlhps',16h
- dw avx_movhlps_instruction-instruction_handler
- db 'vmovntdq',0E7h
- dw avx_movntdq_instruction-instruction_handler
- db 'vmovntpd',2Bh
- dw avx_movntpd_instruction-instruction_handler
- db 'vmovntps',2Bh
- dw avx_movntps_instruction-instruction_handler
- db 'vmpsadbw',42h
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vmresume',0C3h
- dw simple_instruction_0f_01-instruction_handler
- db 'vpaddusb',0DCh
- dw avx_bw_instruction-instruction_handler
- db 'vpaddusw',0DDh
- dw avx_bw_instruction-instruction_handler
- db 'vpalignr',0Fh
- dw avx_pi_instruction_3a_imm8-instruction_handler
- db 'vpblendd',2
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vpblendw',0Eh
- dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
- db 'vpcmpeqb',74h
- dw avx_cmpeqb_instruction-instruction_handler
- db 'vpcmpeqd',76h
- dw avx_cmpeqd_instruction-instruction_handler
- db 'vpcmpeqq',29h
- dw avx_cmpeqq_instruction-instruction_handler
- db 'vpcmpeqw',75h
- dw avx_cmpeqb_instruction-instruction_handler
- db 'vpcmpgtb',64h
- dw avx_cmpeqb_instruction-instruction_handler
- db 'vpcmpgtd',66h
- dw avx_cmpeqd_instruction-instruction_handler
- db 'vpcmpgtq',37h
- dw avx_cmpeqq_instruction-instruction_handler
- db 'vpcmpgtw',65h
- dw avx_cmpeqb_instruction-instruction_handler
- db 'vpcmpleb',2
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpled',2
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpleq',2
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmplew',2
- dw avx512_cmp_w_instruction-instruction_handler
- db 'vpcmpltb',1
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpltd',1
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpltq',1
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmpltw',1
- dw avx512_cmp_w_instruction-instruction_handler
- db 'vpcomeqb',4
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomeqd',4
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomeqq',4
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomeqw',4
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpcomgeb',3
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomged',3
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomgeq',3
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomgew',3
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpcomgtb',2
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomgtd',2
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomgtq',2
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomgtw',2
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpcomleb',1
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomled',1
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomleq',1
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomlew',1
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpcomltb',0
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomltd',0
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomltq',0
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomltw',0
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpdpbusd',50h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpdpwssd',52h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpermi2b',75h
- dw avx_bw_instruction_38_evex-instruction_handler
- db 'vpermi2d',76h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpermi2q',76h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpermi2w',75h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpermt2b',7Dh
- dw avx_bw_instruction_38_evex-instruction_handler
- db 'vpermt2d',7Eh
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpermt2q',7Eh
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpermt2w',7Dh
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vphaddbd',0C2h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddbq',0C3h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddbw',0C1h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphadddq',0CBh
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddsw',3
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vphaddwd',0C6h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddwq',0C7h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphsubbw',0E1h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphsubdq',0E3h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphsubsw',7
- dw avx_pi_instruction_38_noevex-instruction_handler
- db 'vphsubwd',0E2h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vplzcntd',44h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vplzcntq',44h
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vpmacsdd',9Eh
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacswd',96h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacsww',95h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmaddwd',0F5h
- dw avx_bw_instruction-instruction_handler
- db 'vpmovb2m',29h
- dw avx512_pmov_2m_instruction-instruction_handler
- db 'vpmovd2m',39h
- dw avx512_pmov_2m_instruction-instruction_handler
- db 'vpmovm2b',28h
- dw avx512_pmov_m2_instruction-instruction_handler
- db 'vpmovm2d',38h
- dw avx512_pmov_m2_instruction-instruction_handler
- db 'vpmovm2q',38h
- dw avx512_pmov_m2_instruction_w1-instruction_handler
- db 'vpmovm2w',28h
- dw avx512_pmov_m2_instruction_w1-instruction_handler
- db 'vpmovq2m',39h
- dw avx512_pmov_2m_instruction_w1-instruction_handler
- db 'vpmovsdb',21h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovsdw',23h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovsqb',22h
- dw avx512_pmovqb_instruction-instruction_handler
- db 'vpmovsqd',25h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovsqw',24h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovswb',20h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovw2m',29h
- dw avx512_pmov_2m_instruction_w1-instruction_handler
- db 'vpmulhuw',0E4h
- dw avx_bw_instruction-instruction_handler
- db 'vpmuludq',0F4h
- dw avx_q_instruction-instruction_handler
- db 'vpopcntb',54h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vpopcntd',55h
- dw avx512_single_source_ps_instruction-instruction_handler
- db 'vpopcntq',55h
- dw avx512_single_source_pd_instruction-instruction_handler
- db 'vpopcntw',54h
- dw avx_single_source_d_instruction_38_evex_w1-instruction_handler
- db 'vpshldvd',71h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpshldvq',71h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpshldvw',70h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpshrdvd',73h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpshrdvq',73h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpshrdvw',72
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpshufhw',0F3h
- dw avx_pshuf_w_instruction-instruction_handler
- db 'vpshuflw',0F2h
- dw avx_pshuf_w_instruction-instruction_handler
- db 'vpsubusb',0D8h
- dw avx_bw_instruction-instruction_handler
- db 'vpsubusw',0D9h
- dw avx_bw_instruction-instruction_handler
- db 'vptestmb',26h
- dw avx512_ptestmb_instruction-instruction_handler
- db 'vptestmd',27h
- dw avx512_ptestmd_instruction-instruction_handler
- db 'vptestmq',27h
- dw avx512_ptestmq_instruction-instruction_handler
- db 'vptestmw',26h
- dw avx512_ptestmw_instruction-instruction_handler
- db 'vrangepd',50h
- dw avx512_pd_instruction_sae_imm8-instruction_handler
- db 'vrangeps',50h
- dw avx512_ps_instruction_sae_imm8-instruction_handler
- db 'vrangesd',51h
- dw avx512_sd_instruction_sae_imm8-instruction_handler
- db 'vrangess',51h
- dw avx512_ss_instruction_sae_imm8-instruction_handler
- db 'vrcp14pd',4Ch
- dw avx512_single_source_pd_instruction-instruction_handler
- db 'vrcp14ps',4Ch
- dw avx512_single_source_ps_instruction-instruction_handler
- db 'vrcp14sd',4Dh
- dw avx512_sd_instruction-instruction_handler
- db 'vrcp14ss',4Dh
- dw avx512_ss_instruction-instruction_handler
- db 'vrcp28pd',0CAh
- dw avx512_exp2pd_instruction-instruction_handler
- db 'vrcp28ps',0CAh
- dw avx512_exp2ps_instruction-instruction_handler
- db 'vrcp28sd',0CBh
- dw avx512_sd_instruction_sae-instruction_handler
- db 'vrcp28ss',0CBh
- dw avx512_ss_instruction_sae-instruction_handler
- db 'vroundpd',9
- dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
- db 'vroundps',8
- dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
- db 'vroundsd',0Bh
- dw avx_sd_instruction_3a_imm8_noevex-instruction_handler
- db 'vroundss',0Ah
- dw avx_ss_instruction_3a_imm8_noevex-instruction_handler
- db 'vrsqrtps',52h
- dw avx_single_source_ps_instruction_noevex-instruction_handler
- db 'vrsqrtss',52h
- dw avx_ss_instruction_noevex-instruction_handler
- db 'vstmxcsr',11b
- dw vstmxcsr_instruction-instruction_handler
- db 'vucomisd',2Eh
- dw avx_comisd_instruction-instruction_handler
- db 'vucomiss',2Eh
- dw avx_comiss_instruction-instruction_handler
- db 'vzeroall',77h
- dw vzeroall_instruction-instruction_handler
- db 'wbnoinvd',9
- dw simple_extended_instruction_f3-instruction_handler
- db 'wrfsbase',2
- dw rdfsbase_instruction-instruction_handler
- db 'wrgsbase',3
- dw rdfsbase_instruction-instruction_handler
- db 'xacquire',0F2h
- dw prefix_instruction-instruction_handler
- db 'xrelease',0F3h
- dw prefix_instruction-instruction_handler
- db 'xrstor64',101b
- dw fxsave_instruction_64bit-instruction_handler
- db 'xsavec64',4
- dw xsaves_instruction_64bit-instruction_handler
- db 'xsaveopt',110b
- dw fxsave_instruction-instruction_handler
- db 'xsaves64',5
- dw xsaves_instruction_64bit-instruction_handler
-instructions_9:
- db 'cmpxchg8b',8
- dw cmpxchgx_instruction-instruction_handler
- db 'cvttpd2dq',0E6h
- dw sse_pd_instruction-instruction_handler
- db 'cvttpd2pi',2Ch
- dw cvtpd2pi_instruction-instruction_handler
- db 'cvttps2dq',5Bh
- dw movshdup_instruction-instruction_handler
- db 'cvttps2pi',2Ch
- dw cvtps2pi_instruction-instruction_handler
- db 'cvttsd2si',2Ch
- dw cvtsd2si_instruction-instruction_handler
- db 'cvttss2si',2Ch
- dw cvtss2si_instruction-instruction_handler
- db 'extractps',17h
- dw extractps_instruction-instruction_handler
- db 'fxrstor64',1
- dw fxsave_instruction_64bit-instruction_handler
- db 'gf2p8mulb',0CFh
- dw sse4_instruction_66_38-instruction_handler
- db 'movdir64b',0F8h
- dw movdir64b_instruction-instruction_handler
- db 'pclmulqdq',-1
- dw pclmulqdq_instruction-instruction_handler
- db 'pcmpestri',61h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'pcmpestrm',60h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'pcmpistri',63h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'pcmpistrm',62h
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'pmaddubsw',4
- dw ssse3_instruction-instruction_handler
- db 'prefetchw',1
- dw amd_prefetch_instruction-instruction_handler
- db 'punpckhbw',68h
- dw basic_mmx_instruction-instruction_handler
- db 'punpckhdq',6Ah
- dw basic_mmx_instruction-instruction_handler
- db 'punpckhwd',69h
- dw basic_mmx_instruction-instruction_handler
- db 'punpcklbw',60h
- dw basic_mmx_instruction-instruction_handler
- db 'punpckldq',62h
- dw basic_mmx_instruction-instruction_handler
- db 'punpcklwd',61h
- dw basic_mmx_instruction-instruction_handler
- db 'pvalidate',0FFh
- dw simple_instruction_f2_0f_01-instruction_handler
- db 'rmpadjust',0FEh
- dw simple_instruction_f3_0f_01-instruction_handler
- db 'rmpupdate',0FEh
- dw simple_instruction_f2_0f_01-instruction_handler
- db 'sha1nexte',0C8h
- dw sse4_instruction_38-instruction_handler
- db 'sha1rnds4',0CCh
- dw sse4_instruction_3a_imm8-instruction_handler
- db 'useavx256',0
- dw set_evex_mode-instruction_handler
- db 'useavx512',1
- dw set_evex_mode-instruction_handler
- db 'vaddsubpd',0D0h
- dw avx_pd_instruction_noevex-instruction_handler
- db 'vaddsubps',0D0h
- dw avx_ps_instruction_noevex-instruction_handler
- db 'vblendmpd',65h
- dw avx_pd_instruction_38_evex-instruction_handler
- db 'vblendmps',65h
- dw avx_ps_instruction_66_38_evex-instruction_handler
- db 'vblendvpd',4Bh
- dw avx_triple_source_instruction_3a_noevex-instruction_handler
- db 'vblendvps',4Ah
- dw avx_triple_source_instruction_3a_noevex-instruction_handler
- db 'vcmpneqpd',4
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpneqps',4
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpneqsd',4
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpneqss',4
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpngepd',9
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpngeps',9
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpngesd',9
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpngess',9
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpngtpd',0Ah
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpngtps',0Ah
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpngtsd',0Ah
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpngtss',0Ah
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpnlepd',6
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpnleps',6
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpnlesd',6
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpnless',6
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpnltpd',5
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpnltps',5
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpnltsd',5
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpnltss',5
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpordpd',7
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpordps',7
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpordsd',7
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpordss',7
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcvtdq2pd',0E6h
- dw avx_cvtdq2pd_instruction-instruction_handler
- db 'vcvtdq2ps',5Bh
- dw avx_single_source_ps_instruction_er-instruction_handler
- db 'vcvtpd2dq',0E6h
- dw avx_cvtpd2dq_instruction-instruction_handler
- db 'vcvtpd2ps',5Ah
- dw avx_cvtpd2ps_instruction-instruction_handler
- db 'vcvtpd2qq',7Bh
- dw avx_single_source_pd_instruction_er_evex-instruction_handler
- db 'vcvtph2ps',13h
- dw avx_cvtph2ps_instruction-instruction_handler
- db 'vcvtps2dq',5Bh
- dw avx_cvtps2dq_instruction-instruction_handler
- db 'vcvtps2pd',5Ah
- dw avx_cvtps2pd_instruction-instruction_handler
- db 'vcvtps2ph',1Dh
- dw avx_cvtps2ph_instruction-instruction_handler
- db 'vcvtps2qq',7Bh
- dw avx_cvtps2qq_instruction-instruction_handler
- db 'vcvtqq2pd',0E6h
- dw avx_cvtqq2pd_instruction-instruction_handler
- db 'vcvtqq2ps',5Bh
- dw avx_cvtpd2udq_instruction-instruction_handler
- db 'vcvtsd2si',2Dh
- dw avx_cvtsd2si_instruction-instruction_handler
- db 'vcvtsd2ss',5Ah
- dw avx_sd_instruction_er-instruction_handler
- db 'vcvtsi2sd',2Ah
- dw avx_cvtsi2sd_instruction-instruction_handler
- db 'vcvtsi2ss',2Ah
- dw avx_cvtsi2ss_instruction-instruction_handler
- db 'vcvtss2sd',5Ah
- dw avx_ss_instruction_sae-instruction_handler
- db 'vcvtss2si',2Dh
- dw avx_cvtss2si_instruction-instruction_handler
- db 'vdbpsadbw',42h
- dw avx_bw_instruction_3a_imm8_evex-instruction_handler
- db 'vexpandpd',88h
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vexpandps',88h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vfnmaddpd',79h
- dw fma4_instruction_p-instruction_handler
- db 'vfnmaddps',78h
- dw fma4_instruction_p-instruction_handler
- db 'vfnmaddsd',7Bh
- dw fma4_instruction_sd-instruction_handler
- db 'vfnmaddss',7Ah
- dw fma4_instruction_ss-instruction_handler
- db 'vfnmsubpd',7Dh
- dw fma4_instruction_p-instruction_handler
- db 'vfnmsubps',7Ch
- dw fma4_instruction_p-instruction_handler
- db 'vfnmsubsd',7Fh
- dw fma4_instruction_sd-instruction_handler
- db 'vfnmsubss',7Eh
- dw fma4_instruction_ss-instruction_handler
- db 'vgetexppd',42h
- dw avx512_single_source_pd_instruction_sae-instruction_handler
- db 'vgetexpps',42h
- dw avx512_single_source_ps_instruction_sae-instruction_handler
- db 'vgetexpsd',43h
- dw avx512_sd_instruction_sae-instruction_handler
- db 'vgetexpss',43h
- dw avx512_ss_instruction_sae-instruction_handler
- db 'vinsertps',21h
- dw avx_insertps_instruction-instruction_handler
- db 'vmovdqa32',6Fh
- dw avx512_movdqa32_instruction-instruction_handler
- db 'vmovdqa64',6Fh
- dw avx512_movdqa64_instruction-instruction_handler
- db 'vmovdqu16',6Fh
- dw avx512_movdqu16_instruction-instruction_handler
- db 'vmovdqu32',6Fh
- dw avx512_movdqu32_instruction-instruction_handler
- db 'vmovdqu64',6Fh
- dw avx512_movdqu64_instruction-instruction_handler
- db 'vmovmskpd',0
- dw avx_movmskpd_instruction-instruction_handler
- db 'vmovmskps',0
- dw avx_movmskps_instruction-instruction_handler
- db 'vmovntdqa',2Ah
- dw avx_movntdqa_instruction-instruction_handler
- db 'vmovshdup',16h
- dw avx_movshdup_instruction-instruction_handler
- db 'vmovsldup',12h
- dw avx_movshdup_instruction-instruction_handler
- db 'vp4dpwssd',52h
- dw avx512_4vnniw_instruction-instruction_handler
- db 'vpackssdw',6Bh
- dw avx_d_instruction-instruction_handler
- db 'vpacksswb',63h
- dw avx_bw_instruction-instruction_handler
- db 'vpackusdw',2Bh
- dw avx_d_instruction_38-instruction_handler
- db 'vpackuswb',67h
- dw avx_bw_instruction-instruction_handler
- db 'vpblendmb',66h
- dw avx_bw_instruction_38_evex-instruction_handler
- db 'vpblendmd',64h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpblendmq',64h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpblendmw',66h
- dw avx_bw_instruction_38_w1_evex-instruction_handler
- db 'vpblendvb',4Ch
- dw avx_triple_source_instruction_3a_noevex-instruction_handler
- db 'vpcmpleub',2
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpleud',2
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpleuq',2
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpleuw',2
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcmpltub',1
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpltud',1
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpltuq',1
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpltuw',1
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcmpneqb',4
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpneqd',4
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpneqq',4
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmpneqw',4
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpnleb',6
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpnled',6
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpnleq',6
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmpnlew',6
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpnltb',5
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcmpnltd',5
- dw avx512_cmp_d_instruction-instruction_handler
- db 'vpcmpnltq',5
- dw avx512_cmp_q_instruction-instruction_handler
- db 'vpcmpnltw',5
- dw avx512_cmp_b_instruction-instruction_handler
- db 'vpcomequb',4
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomequd',4
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomequq',4
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomequw',4
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomgeub',3
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomgeud',3
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomgeuq',3
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomgeuw',3
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomgtub',2
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomgtud',2
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomgtuq',2
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomgtuw',2
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomleub',1
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomleud',1
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomleuq',1
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomleuw',1
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomltub',0
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomltud',0
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomltuq',0
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomltuw',0
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomneqb',5
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomneqd',5
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomneqq',5
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomneqw',5
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpdpbusds',51h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpdpwssds',53h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpermi2pd',77h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpermi2ps',77h
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpermilpd',5
- dw avx_permilpd_instruction-instruction_handler
- db 'vpermilps',4
- dw avx_permilps_instruction-instruction_handler
- db 'vpermt2pd',7Fh
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpermt2ps',7Fh
- dw avx_d_instruction_38_evex-instruction_handler
- db 'vpexpandb',62h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vpexpandd',89h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vpexpandq',89h
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vpexpandw',62h
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vphaddubd',0D2h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddubq',0D3h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddubw',0D1h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphaddudq',0DBh
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphadduwd',0D6h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vphadduwq',0D7h
- dw xop_single_source_128bit_instruction-instruction_handler
- db 'vpmacsdqh',9Fh
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacsdql',97h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacssdd',8Eh
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacsswd',86h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacssww',85h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmadcswd',0B6h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmovmskb',0D7h
- dw avx_pmovmskb_instruction-instruction_handler
- db 'vpmovsxbd',21h
- dw avx_pmovsxbd_instruction-instruction_handler
- db 'vpmovsxbq',22h
- dw avx_pmovsxbq_instruction-instruction_handler
- db 'vpmovsxbw',20h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovsxdq',25h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovsxwd',23h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovsxwq',24h
- dw avx_pmovsxbd_instruction-instruction_handler
- db 'vpmovusdb',11h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovusdw',13h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovusqb',12h
- dw avx512_pmovqb_instruction-instruction_handler
- db 'vpmovusqd',15h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovusqw',14h
- dw avx512_pmovdb_instruction-instruction_handler
- db 'vpmovuswb',10h
- dw avx512_pmovwb_instruction-instruction_handler
- db 'vpmovzxbd',31h
- dw avx_pmovsxbd_instruction-instruction_handler
- db 'vpmovzxbq',32h
- dw avx_pmovsxbq_instruction-instruction_handler
- db 'vpmovzxbw',30h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovzxdq',35h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovzxwd',33h
- dw avx_pmovsxbw_instruction-instruction_handler
- db 'vpmovzxwq',34h
- dw avx_pmovsxbd_instruction-instruction_handler
- db 'vpmulhrsw',0Bh
- dw avx_bw_instruction_38-instruction_handler
- db 'vptestnmb',26h
- dw avx512_ptestnmb_instruction-instruction_handler
- db 'vptestnmd',27h
- dw avx512_ptestnmd_instruction-instruction_handler
- db 'vptestnmq',27h
- dw avx512_ptestnmq_instruction-instruction_handler
- db 'vptestnmw',26h
- dw avx512_ptestnmw_instruction-instruction_handler
- db 'vreducepd',56h
- dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
- db 'vreduceps',56h
- dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
- db 'vreducesd',57h
- dw avx512_sd_instruction_sae_imm8-instruction_handler
- db 'vreducess',57h
- dw avx512_ss_instruction_sae_imm8-instruction_handler
- db 'vscalefpd',2Ch
- dw avx512_pd_instruction_er-instruction_handler
- db 'vscalefps',2Ch
- dw avx512_ps_instruction_er-instruction_handler
- db 'vscalefsd',2Dh
- dw avx512_sd_instruction_er-instruction_handler
- db 'vscalefss',2Dh
- dw avx512_ss_instruction_er-instruction_handler
- db 'vunpckhpd',15h
- dw avx_pd_instruction-instruction_handler
- db 'vunpckhps',15h
- dw avx_ps_instruction-instruction_handler
- db 'vunpcklpd',14h
- dw avx_pd_instruction-instruction_handler
- db 'vunpcklps',14h
- dw avx_ps_instruction-instruction_handler
- db 'xrstors64',3
- dw xsaves_instruction_64bit-instruction_handler
-instructions_10:
- db 'aesdeclast',0DFh
- dw sse4_instruction_66_38-instruction_handler
- db 'aesenclast',0DDh
- dw sse4_instruction_66_38-instruction_handler
- db 'clflushopt',7
- dw clflushopt_instruction-instruction_handler
- db 'cmpunordpd',3
- dw cmp_pd_instruction-instruction_handler
- db 'cmpunordps',3
- dw cmp_ps_instruction-instruction_handler
- db 'cmpunordsd',3
- dw cmp_sd_instruction-instruction_handler
- db 'cmpunordss',3
- dw cmp_ss_instruction-instruction_handler
- db 'cmpxchg16b',16
- dw cmpxchgx_instruction-instruction_handler
- db 'loadall286',5
- dw simple_extended_instruction-instruction_handler
- db 'loadall386',7
- dw simple_extended_instruction-instruction_handler
- db 'maskmovdqu',0
- dw maskmovdqu_instruction-instruction_handler
- db 'phminposuw',41h
- dw sse4_instruction_66_38-instruction_handler
- db 'prefetcht0',1
- dw prefetch_instruction-instruction_handler
- db 'prefetcht1',2
- dw prefetch_instruction-instruction_handler
- db 'prefetcht2',3
- dw prefetch_instruction-instruction_handler
- db 'punpckhqdq',6Dh
- dw sse_pd_instruction-instruction_handler
- db 'punpcklqdq',6Ch
- dw sse_pd_instruction-instruction_handler
- db 'sha256msg1',0CCh
- dw sse4_instruction_38-instruction_handler
- db 'sha256msg2',0CDh
- dw sse4_instruction_38-instruction_handler
- db 'vcmptruepd',0Fh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmptrueps',0Fh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmptruesd',0Fh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmptruess',0Fh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcvtpd2udq',79h
- dw avx_cvtpd2udq_instruction-instruction_handler
- db 'vcvtpd2uqq',79h
- dw avx_single_source_pd_instruction_er_evex-instruction_handler
- db 'vcvtps2udq',79h
- dw avx_single_source_ps_instruction_er_evex-instruction_handler
- db 'vcvtps2uqq',79h
- dw avx_cvtps2qq_instruction-instruction_handler
- db 'vcvtsd2usi',79h
- dw avx_cvtsd2usi_instruction-instruction_handler
- db 'vcvtss2usi',79h
- dw avx_cvtss2usi_instruction-instruction_handler
- db 'vcvttpd2dq',0E6h
- dw avx_cvttpd2dq_instruction-instruction_handler
- db 'vcvttpd2qq',7Ah
- dw avx_single_source_pd_instruction_sae_evex-instruction_handler
- db 'vcvttps2dq',5Bh
- dw avx_cvttps2dq_instruction-instruction_handler
- db 'vcvttps2qq',7Ah
- dw avx_cvttps2qq_instruction-instruction_handler
- db 'vcvttsd2si',2Ch
- dw avx_cvttsd2si_instruction-instruction_handler
- db 'vcvttss2si',2Ch
- dw avx_cvttss2si_instruction-instruction_handler
- db 'vcvtudq2pd',7Ah
- dw avx_cvtudq2pd_instruction-instruction_handler
- db 'vcvtudq2ps',7Ah
- dw avx_cvtudq2ps_instruction-instruction_handler
- db 'vcvtuqq2pd',7Ah
- dw avx_cvtqq2pd_instruction-instruction_handler
- db 'vcvtuqq2ps',7Ah
- dw avx_cvtuqq2ps_instruction-instruction_handler
- db 'vcvtusi2sd',7Bh
- dw avx_cvtusi2sd_instruction-instruction_handler
- db 'vcvtusi2ss',7Bh
- dw avx_cvtusi2ss_instruction-instruction_handler
- db 'vextractps',17h
- dw avx_extract_d_instruction-instruction_handler
- db 'vfpclasspd',66h
- dw avx512_fpclasspd_instruction-instruction_handler
- db 'vfpclassps',66h
- dw avx512_fpclassps_instruction-instruction_handler
- db 'vfpclasssd',67h
- dw avx512_fpclasssd_instruction-instruction_handler
- db 'vfpclassss',67h
- dw avx512_fpclassss_instruction-instruction_handler
- db 'vgatherdpd',92h
- dw gather_pd_instruction-instruction_handler
- db 'vgatherdps',92h
- dw gather_ps_instruction-instruction_handler
- db 'vgatherqpd',93h
- dw gather_pd_instruction-instruction_handler
- db 'vgatherqps',93h
- dw gather_ps_instruction-instruction_handler
- db 'vgetmantpd',26h
- dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
- db 'vgetmantps',26h
- dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
- db 'vgetmantsd',27h
- dw avx512_sd_instruction_sae_imm8-instruction_handler
- db 'vgetmantss',27h
- dw avx512_ss_instruction_sae_imm8-instruction_handler
- db 'vgf2p8mulb',0CFh
- dw avx_bw_instruction_38-instruction_handler
- db 'vmaskmovpd',2Dh
- dw avx_maskmov_instruction-instruction_handler
- db 'vmaskmovps',2Ch
- dw avx_maskmov_instruction-instruction_handler
- db 'vp4dpwssds',53h
- dw avx512_4vnniw_instruction-instruction_handler
- db 'vpclmulqdq',-1
- dw avx_pclmulqdq_instruction-instruction_handler
- db 'vpcmpestri',61h
- dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
- db 'vpcmpestrm',60h
- dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
- db 'vpcmpistri',63h
- dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
- db 'vpcmpistrm',62h
- dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
- db 'vpcmpnequb',4
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpnequd',4
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpnequq',4
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpnequw',4
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcmpnleub',6
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpnleud',6
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpnleuq',6
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpnleuw',6
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcmpnltub',5
- dw avx512_cmp_ub_instruction-instruction_handler
- db 'vpcmpnltud',5
- dw avx512_cmp_ud_instruction-instruction_handler
- db 'vpcmpnltuq',5
- dw avx512_cmp_uq_instruction-instruction_handler
- db 'vpcmpnltuw',5
- dw avx512_cmp_uw_instruction-instruction_handler
- db 'vpcomnequb',5
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomnequd',5
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomnequq',5
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomnequw',5
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpcomtrueb',7
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomtrued',7
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomtrueq',7
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomtruew',7
- dw xop_pcom_w_instruction-instruction_handler
- db 'vperm2f128',6
- dw avx_perm2f128_instruction-instruction_handler
- db 'vperm2i128',46h
- dw avx_perm2f128_instruction-instruction_handler
- db 'vpermil2pd',49h
- dw vpermil2_instruction-instruction_handler
- db 'vpermil2ps',48h
- dw vpermil2_instruction-instruction_handler
- db 'vpgatherdd',90h
- dw gather_ps_instruction-instruction_handler
- db 'vpgatherdq',90h
- dw gather_pd_instruction-instruction_handler
- db 'vpgatherqd',91h
- dw gather_ps_instruction-instruction_handler
- db 'vpgatherqq',91h
- dw gather_pd_instruction-instruction_handler
- db 'vpmacssdqh',8Fh
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmacssdql',87h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmadcsswd',0A6h
- dw xop_triple_source_128bit_instruction-instruction_handler
- db 'vpmaddubsw',4
- dw avx_bw_instruction_38-instruction_handler
- db 'vpmaskmovd',8Ch
- dw avx_maskmov_instruction-instruction_handler
- db 'vpmaskmovq',8Ch
- dw avx_maskmov_w1_instruction-instruction_handler
- db 'vpternlogd',25h
- dw avx_d_instruction_3a_imm8_evex-instruction_handler
- db 'vpternlogq',25h
- dw avx_q_instruction_3a_imm8_evex-instruction_handler
- db 'vpunpckhbw',68h
- dw avx_bw_instruction-instruction_handler
- db 'vpunpckhdq',6Ah
- dw avx_d_instruction-instruction_handler
- db 'vpunpckhwd',69h
- dw avx_bw_instruction-instruction_handler
- db 'vpunpcklbw',60h
- dw avx_bw_instruction-instruction_handler
- db 'vpunpckldq',62h
- dw avx_d_instruction-instruction_handler
- db 'vpunpcklwd',61h
- dw avx_bw_instruction-instruction_handler
- db 'vrsqrt14pd',4Eh
- dw avx512_single_source_pd_instruction-instruction_handler
- db 'vrsqrt14ps',4Eh
- dw avx512_single_source_ps_instruction-instruction_handler
- db 'vrsqrt14sd',4Fh
- dw avx512_sd_instruction-instruction_handler
- db 'vrsqrt14ss',4Fh
- dw avx512_ss_instruction-instruction_handler
- db 'vrsqrt28pd',0CCh
- dw avx512_exp2pd_instruction-instruction_handler
- db 'vrsqrt28ps',0CCh
- dw avx512_exp2ps_instruction-instruction_handler
- db 'vrsqrt28sd',0CDh
- dw avx512_sd_instruction_sae-instruction_handler
- db 'vrsqrt28ss',0CDh
- dw avx512_ss_instruction_sae-instruction_handler
- db 'vshuff32x4',23h
- dw avx512_shuf_d_instruction-instruction_handler
- db 'vshuff64x2',23h
- dw avx512_shuf_q_instruction-instruction_handler
- db 'vshufi32x4',43h
- dw avx512_shuf_d_instruction-instruction_handler
- db 'vshufi64x2',43h
- dw avx512_shuf_q_instruction-instruction_handler
- db 'vzeroupper',77h
- dw vzeroupper_instruction-instruction_handler
- db 'xsaveopt64',110b
- dw fxsave_instruction_64bit-instruction_handler
-instructions_11:
- db 'pclmulhqhdq',10001b
- dw pclmulqdq_instruction-instruction_handler
- db 'pclmullqhdq',10000b
- dw pclmulqdq_instruction-instruction_handler
- db 'prefetchnta',0
- dw prefetch_instruction-instruction_handler
- db 'prefetchwt1',2
- dw amd_prefetch_instruction-instruction_handler
- db 'saveprevssp',0EAh
- dw setssbsy_instruction-instruction_handler
- db 'sha256rnds2',0CBh
- dw sse4_instruction_38_xmm0-instruction_handler
- db 'vaesdeclast',0DFh
- dw avx_instruction_38_nomask-instruction_handler
- db 'vaesenclast',0DDh
- dw avx_instruction_38_nomask-instruction_handler
- db 'vcmpeq_ospd',10h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpeq_osps',10h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpeq_ossd',10h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpeq_osss',10h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpeq_uqpd',8
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpeq_uqps',8
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpeq_uqsd',8
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpeq_uqss',8
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpeq_uspd',18h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpeq_usps',18h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpeq_ussd',18h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpeq_usss',18h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpfalsepd',0Bh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpfalseps',0Bh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpfalsesd',0Bh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpfalsess',0Bh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpge_oqpd',1Dh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpge_oqps',1Dh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpge_oqsd',1Dh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpge_oqss',1Dh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpgt_oqpd',1Eh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpgt_oqps',1Eh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpgt_oqsd',1Eh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpgt_oqss',1Eh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmple_oqpd',12h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmple_oqps',12h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmple_oqsd',12h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmple_oqss',12h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmplt_oqpd',11h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmplt_oqps',11h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmplt_oqsd',11h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmplt_oqss',11h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpord_spd',17h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpord_sps',17h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpord_ssd',17h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpord_sss',17h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpunordpd',3
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpunordps',3
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpunordsd',3
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpunordss',3
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcompresspd',8Ah
- dw avx_compress_q_instruction-instruction_handler
- db 'vcompressps',8Ah
- dw avx_compress_d_instruction-instruction_handler
- db 'vcvttpd2udq',78h
- dw avx_cvttpd2udq_instruction-instruction_handler
- db 'vcvttpd2uqq',78h
- dw avx_single_source_pd_instruction_sae_evex-instruction_handler
- db 'vcvttps2udq',78h
- dw avx_cvttps2udq_instruction-instruction_handler
- db 'vcvttps2uqq',78h
- dw avx_cvttps2qq_instruction-instruction_handler
- db 'vcvttsd2usi',78h
- dw avx_cvttsd2usi_instruction-instruction_handler
- db 'vcvttss2usi',78h
- dw avx_cvttss2usi_instruction-instruction_handler
- db 'vfixupimmpd',54h
- dw avx512_pd_instruction_sae_imm8-instruction_handler
- db 'vfixupimmps',54h
- dw avx512_ps_instruction_sae_imm8-instruction_handler
- db 'vfixupimmsd',55h
- dw avx512_sd_instruction_sae_imm8-instruction_handler
- db 'vfixupimmss',55h
- dw avx512_ss_instruction_sae_imm8-instruction_handler
- db 'vfmadd132pd',98h
- dw fma_instruction_pd-instruction_handler
- db 'vfmadd132ps',98h
- dw fma_instruction_ps-instruction_handler
- db 'vfmadd132sd',99h
- dw fma_instruction_sd-instruction_handler
- db 'vfmadd132ss',99h
- dw fma_instruction_ss-instruction_handler
- db 'vfmadd213pd',0A8h
- dw fma_instruction_pd-instruction_handler
- db 'vfmadd213ps',0A8h
- dw fma_instruction_ps-instruction_handler
- db 'vfmadd213sd',0A9h
- dw fma_instruction_sd-instruction_handler
- db 'vfmadd213ss',0A9h
- dw fma_instruction_ss-instruction_handler
- db 'vfmadd231pd',0B8h
- dw fma_instruction_pd-instruction_handler
- db 'vfmadd231ps',0B8h
- dw fma_instruction_ps-instruction_handler
- db 'vfmadd231sd',0B9h
- dw fma_instruction_sd-instruction_handler
- db 'vfmadd231ss',0B9h
- dw fma_instruction_ss-instruction_handler
- db 'vfmaddsubpd',5Dh
- dw fma4_instruction_p-instruction_handler
- db 'vfmaddsubps',5Ch
- dw fma4_instruction_p-instruction_handler
- db 'vfmsub132pd',9Ah
- dw fma_instruction_pd-instruction_handler
- db 'vfmsub132ps',9Ah
- dw fma_instruction_ps-instruction_handler
- db 'vfmsub132sd',9Bh
- dw fma_instruction_sd-instruction_handler
- db 'vfmsub132ss',9Bh
- dw fma_instruction_ss-instruction_handler
- db 'vfmsub213pd',0AAh
- dw fma_instruction_pd-instruction_handler
- db 'vfmsub213ps',0AAh
- dw fma_instruction_ps-instruction_handler
- db 'vfmsub213sd',0ABh
- dw fma_instruction_sd-instruction_handler
- db 'vfmsub213ss',0ABh
- dw fma_instruction_ss-instruction_handler
- db 'vfmsub231pd',0BAh
- dw fma_instruction_pd-instruction_handler
- db 'vfmsub231ps',0BAh
- dw fma_instruction_ps-instruction_handler
- db 'vfmsub231sd',0BBh
- dw fma_instruction_sd-instruction_handler
- db 'vfmsub231ss',0BBh
- dw fma_instruction_ss-instruction_handler
- db 'vfmsubaddpd',5Fh
- dw fma4_instruction_p-instruction_handler
- db 'vfmsubaddps',5Eh
- dw fma4_instruction_p-instruction_handler
- db 'vinsertf128',18h
- dw avx_insertf128_instruction-instruction_handler
- db 'vinserti128',38h
- dw avx_insertf128_instruction-instruction_handler
- db 'vmaskmovdqu',0
- dw avx_maskmovdqu_instruction-instruction_handler
- db 'vpcomfalseb',6
- dw xop_pcom_b_instruction-instruction_handler
- db 'vpcomfalsed',6
- dw xop_pcom_d_instruction-instruction_handler
- db 'vpcomfalseq',6
- dw xop_pcom_q_instruction-instruction_handler
- db 'vpcomfalsew',6
- dw xop_pcom_w_instruction-instruction_handler
- db 'vpcompressb',63h
- dw avx_compress_d_instruction-instruction_handler
- db 'vpcompressd',8Bh
- dw avx_compress_d_instruction-instruction_handler
- db 'vpcompressq',8Bh
- dw avx_compress_q_instruction-instruction_handler
- db 'vpcompressw',63h
- dw avx_compress_q_instruction-instruction_handler
- db 'vpcomtrueub',7
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomtrueud',7
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomtrueuq',7
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomtrueuw',7
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpconflictd',0C4h
- dw avx_single_source_d_instruction_38_evex-instruction_handler
- db 'vpconflictq',0C4h
- dw avx_single_source_q_instruction_38_evex-instruction_handler
- db 'vphminposuw',41h
- dw avx_single_source_instruction_38_noevex-instruction_handler
- db 'vpmadd52huq',0B5h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpmadd52luq',0B4h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vpscatterdd',0A0h
- dw scatter_ps_instruction-instruction_handler
- db 'vpscatterdq',0A0h
- dw scatter_pd_instruction-instruction_handler
- db 'vpscatterqd',0A1h
- dw scatter_ps_instruction-instruction_handler
- db 'vpscatterqq',0A1h
- dw scatter_pd_instruction-instruction_handler
- db 'vpunpckhqdq',6Dh
- dw avx_q_instruction-instruction_handler
- db 'vpunpcklqdq',6Ch
- dw avx_q_instruction-instruction_handler
- db 'vrndscalepd',9
- dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
- db 'vrndscaleps',8
- dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
- db 'vrndscalesd',0Bh
- dw avx512_sd_instruction_sae_imm8-instruction_handler
- db 'vrndscaless',0Ah
- dw avx512_ss_instruction_sae_imm8-instruction_handler
- db 'vscatterdpd',0A2h
- dw scatter_pd_instruction-instruction_handler
- db 'vscatterdps',0A2h
- dw scatter_ps_instruction-instruction_handler
- db 'vscatterqpd',0A3h
- dw scatter_pd_instruction-instruction_handler
- db 'vscatterqps',0A3h
- dw scatter_ps_instruction-instruction_handler
-instructions_12:
- db 'pclmulhqhqdq',10001b
- dw pclmulqdq_instruction-instruction_handler
- db 'pclmulhqlqdq',1
- dw pclmulqdq_instruction-instruction_handler
- db 'pclmullqhqdq',10000b
- dw pclmulqdq_instruction-instruction_handler
- db 'pclmullqlqdq',0
- dw pclmulqdq_instruction-instruction_handler
- db 'vbroadcastsd',19h
- dw avx_broadcastsd_instruction-instruction_handler
- db 'vbroadcastss',18h
- dw avx_broadcastss_instruction-instruction_handler
- db 'vcmpneq_oqpd',0Ch
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpneq_oqps',0Ch
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpneq_oqsd',0Ch
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpneq_oqss',0Ch
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpneq_ospd',1Ch
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpneq_osps',1Ch
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpneq_ossd',1Ch
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpneq_osss',1Ch
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpneq_uspd',14h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpneq_usps',14h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpneq_ussd',14h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpneq_usss',14h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpnge_uqpd',19h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpnge_uqps',19h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpnge_uqsd',19h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpnge_uqss',19h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpngt_uqpd',1Ah
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpngt_uqps',1Ah
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpngt_uqsd',1Ah
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpngt_uqss',1Ah
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpnle_uqpd',16h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpnle_uqps',16h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpnle_uqsd',16h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpnle_uqss',16h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpnlt_uqpd',15h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpnlt_uqps',15h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpnlt_uqsd',15h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpnlt_uqss',15h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vextractf128',19h
- dw avx_extractf128_instruction-instruction_handler
- db 'vextracti128',39h
- dw avx_extractf128_instruction-instruction_handler
- db 'vfnmadd132pd',9Ch
- dw fma_instruction_pd-instruction_handler
- db 'vfnmadd132ps',9Ch
- dw fma_instruction_ps-instruction_handler
- db 'vfnmadd132sd',9Dh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmadd132ss',9Dh
- dw fma_instruction_ss-instruction_handler
- db 'vfnmadd213pd',0ACh
- dw fma_instruction_pd-instruction_handler
- db 'vfnmadd213ps',0ACh
- dw fma_instruction_ps-instruction_handler
- db 'vfnmadd213sd',0ADh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmadd213ss',0ADh
- dw fma_instruction_ss-instruction_handler
- db 'vfnmadd231pd',0BCh
- dw fma_instruction_pd-instruction_handler
- db 'vfnmadd231ps',0BCh
- dw fma_instruction_ps-instruction_handler
- db 'vfnmadd231sd',0BDh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmadd231ss',0BDh
- dw fma_instruction_ss-instruction_handler
- db 'vfnmsub132pd',9Eh
- dw fma_instruction_pd-instruction_handler
- db 'vfnmsub132ps',9Eh
- dw fma_instruction_ps-instruction_handler
- db 'vfnmsub132sd',9Fh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmsub132ss',9Fh
- dw fma_instruction_ss-instruction_handler
- db 'vfnmsub213pd',0AEh
- dw fma_instruction_pd-instruction_handler
- db 'vfnmsub213ps',0AEh
- dw fma_instruction_ps-instruction_handler
- db 'vfnmsub213sd',0AFh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmsub213ss',0AFh
- dw fma_instruction_ss-instruction_handler
- db 'vfnmsub231pd',0BEh
- dw fma_instruction_pd-instruction_handler
- db 'vfnmsub231ps',0BEh
- dw fma_instruction_ps-instruction_handler
- db 'vfnmsub231sd',0BFh
- dw fma_instruction_sd-instruction_handler
- db 'vfnmsub231ss',0BFh
- dw fma_instruction_ss-instruction_handler
- db 'vinsertf32x4',18h
- dw avx512_insert_32x4_instruction-instruction_handler
- db 'vinsertf32x8',1Ah
- dw avx512_insert_32x8_instruction-instruction_handler
- db 'vinsertf64x2',18h
- dw avx512_insert_64x2_instruction-instruction_handler
- db 'vinsertf64x4',1Ah
- dw avx512_insert_64x4_instruction-instruction_handler
- db 'vinserti32x4',38h
- dw avx512_insert_32x4_instruction-instruction_handler
- db 'vinserti32x8',3Ah
- dw avx512_insert_32x8_instruction-instruction_handler
- db 'vinserti64x2',38h
- dw avx512_insert_64x2_instruction-instruction_handler
- db 'vinserti64x4',3Ah
- dw avx512_insert_64x4_instruction-instruction_handler
- db 'vpbroadcastb',78h
- dw avx_pbroadcastb_instruction-instruction_handler
- db 'vpbroadcastd',58h
- dw avx_pbroadcastd_instruction-instruction_handler
- db 'vpbroadcastq',59h
- dw avx_pbroadcastq_instruction-instruction_handler
- db 'vpbroadcastw',79h
- dw avx_pbroadcastw_instruction-instruction_handler
- db 'vpclmulhqhdq',10001b
- dw avx_pclmulqdq_instruction-instruction_handler
- db 'vpclmullqhdq',10000b
- dw avx_pclmulqdq_instruction-instruction_handler
- db 'vpcomfalseub',6
- dw xop_pcom_ub_instruction-instruction_handler
- db 'vpcomfalseud',6
- dw xop_pcom_ud_instruction-instruction_handler
- db 'vpcomfalseuq',6
- dw xop_pcom_uq_instruction-instruction_handler
- db 'vpcomfalseuw',6
- dw xop_pcom_uw_instruction-instruction_handler
- db 'vpermilmo2pd',10b
- dw vpermil_2pd_instruction-instruction_handler
- db 'vpermilmo2ps',10b
- dw vpermil_2ps_instruction-instruction_handler
- db 'vpermilmz2pd',11b
- dw vpermil_2pd_instruction-instruction_handler
- db 'vpermilmz2ps',11b
- dw vpermil_2ps_instruction-instruction_handler
- db 'vpermiltd2pd',0
- dw vpermil_2pd_instruction-instruction_handler
- db 'vpermiltd2ps',0
- dw vpermil_2ps_instruction-instruction_handler
- db 'vpshufbitqmb',8Fh
- dw avx512_ptestmb_instruction-instruction_handler
-instructions_13:
- db 'gf2p8affineqb',0CEh
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'vcmptrue_uspd',1Fh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmptrue_usps',1Fh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmptrue_ussd',1Fh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmptrue_usss',1Fh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vcmpunord_spd',13h
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpunord_sps',13h
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpunord_ssd',13h
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpunord_sss',13h
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vextractf32x4',19h
- dw avx512_extract_32x4_instruction-instruction_handler
- db 'vextractf32x8',1Bh
- dw avx512_extract_32x8_instruction-instruction_handler
- db 'vextractf64x2',19h
- dw avx512_extract_64x2_instruction-instruction_handler
- db 'vextractf64x4',1Bh
- dw avx512_extract_64x4_instruction-instruction_handler
- db 'vextracti32x4',39h
- dw avx512_extract_32x4_instruction-instruction_handler
- db 'vextracti32x8',3Bh
- dw avx512_extract_32x8_instruction-instruction_handler
- db 'vextracti64x2',39h
- dw avx512_extract_64x2_instruction-instruction_handler
- db 'vextracti64x4',3Bh
- dw avx512_extract_64x4_instruction-instruction_handler
- db 'vgatherpf0dpd',1
- dw gatherpf_dpd_instruction-instruction_handler
- db 'vgatherpf0dps',1
- dw gatherpf_dps_instruction-instruction_handler
- db 'vgatherpf0qpd',1
- dw gatherpf_qpd_instruction-instruction_handler
- db 'vgatherpf0qps',1
- dw gatherpf_qps_instruction-instruction_handler
- db 'vgatherpf1dpd',2
- dw gatherpf_dpd_instruction-instruction_handler
- db 'vgatherpf1dps',2
- dw gatherpf_dps_instruction-instruction_handler
- db 'vgatherpf1qpd',2
- dw gatherpf_qpd_instruction-instruction_handler
- db 'vgatherpf1qps',2
- dw gatherpf_qps_instruction-instruction_handler
- db 'vpclmulhqlqdq',1
- dw avx_pclmulqdq_instruction-instruction_handler
- db 'vpclmullqlqdq',0
- dw avx_pclmulqdq_instruction-instruction_handler
-instructions_14:
- db 'vbroadcastf128',1Ah
- dw avx_broadcast_128_instruction_noevex-instruction_handler
- db 'vbroadcasti128',5Ah
- dw avx_broadcast_128_instruction_noevex-instruction_handler
- db 'vcmpfalse_ospd',1Bh
- dw avx_cmp_pd_instruction-instruction_handler
- db 'vcmpfalse_osps',1Bh
- dw avx_cmp_ps_instruction-instruction_handler
- db 'vcmpfalse_ossd',1Bh
- dw avx_cmp_sd_instruction-instruction_handler
- db 'vcmpfalse_osss',1Bh
- dw avx_cmp_ss_instruction-instruction_handler
- db 'vfmaddsub132pd',96h
- dw fma_instruction_pd-instruction_handler
- db 'vfmaddsub132ps',96h
- dw fma_instruction_ps-instruction_handler
- db 'vfmaddsub213pd',0A6h
- dw fma_instruction_pd-instruction_handler
- db 'vfmaddsub213ps',0A6h
- dw fma_instruction_ps-instruction_handler
- db 'vfmaddsub231pd',0B6h
- dw fma_instruction_pd-instruction_handler
- db 'vfmaddsub231ps',0B6h
- dw fma_instruction_ps-instruction_handler
- db 'vfmsubadd132pd',97h
- dw fma_instruction_pd-instruction_handler
- db 'vfmsubadd132ps',97h
- dw fma_instruction_ps-instruction_handler
- db 'vfmsubadd213pd',0A7h
- dw fma_instruction_pd-instruction_handler
- db 'vfmsubadd213ps',0A7h
- dw fma_instruction_ps-instruction_handler
- db 'vfmsubadd231pd',0B7h
- dw fma_instruction_pd-instruction_handler
- db 'vfmsubadd231ps',0B7h
- dw fma_instruction_ps-instruction_handler
- db 'vgf2p8affineqb',0CEh
- dw avx_q_instruction_3a_imm8_w1-instruction_handler
- db 'vpmultishiftqb',83h
- dw avx_q_instruction_38_evex-instruction_handler
- db 'vscatterpf0dpd',5
- dw gatherpf_dpd_instruction-instruction_handler
- db 'vscatterpf0dps',5
- dw gatherpf_dps_instruction-instruction_handler
- db 'vscatterpf0qpd',5
- dw gatherpf_qpd_instruction-instruction_handler
- db 'vscatterpf0qps',5
- dw gatherpf_qps_instruction-instruction_handler
- db 'vscatterpf1dpd',6
- dw gatherpf_dpd_instruction-instruction_handler
- db 'vscatterpf1dps',6
- dw gatherpf_dps_instruction-instruction_handler
- db 'vscatterpf1qpd',6
- dw gatherpf_qpd_instruction-instruction_handler
- db 'vscatterpf1qps',6
- dw gatherpf_qps_instruction-instruction_handler
-instructions_15:
- db 'aeskeygenassist',0DFh
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'vbroadcastf32x2',19h
- dw avx512_broadcast_32x2_instruction-instruction_handler
- db 'vbroadcastf32x4',1Ah
- dw avx512_broadcast_32x4_instruction-instruction_handler
- db 'vbroadcastf32x8',1Bh
- dw avx512_broadcast_32x8_instruction-instruction_handler
- db 'vbroadcastf64x2',1Ah
- dw avx512_broadcast_64x2_instruction-instruction_handler
- db 'vbroadcastf64x4',1Bh
- dw avx512_broadcast_64x4_instruction-instruction_handler
- db 'vbroadcasti32x2',59h
- dw avx512_broadcast_32x2_instruction-instruction_handler
- db 'vbroadcasti32x4',5Ah
- dw avx512_broadcast_32x4_instruction-instruction_handler
- db 'vbroadcasti32x8',5Bh
- dw avx512_broadcast_32x8_instruction-instruction_handler
- db 'vbroadcasti64x2',5Ah
- dw avx512_broadcast_64x2_instruction-instruction_handler
- db 'vbroadcasti64x4',5Bh
- dw avx512_broadcast_64x4_instruction-instruction_handler
- db 'vpbroadcastmb2q',2Ah
- dw avx512_pmov_m2_instruction_w1-instruction_handler
- db 'vpbroadcastmw2d',3Ah
- dw avx512_pmov_m2_instruction-instruction_handler
-instructions_16:
- db 'gf2p8affineinvqb',0CFh
- dw sse4_instruction_66_3a_imm8-instruction_handler
- db 'vaeskeygenassist',0DFh
- dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
-instructions_17:
- db 'vgf2p8affineinvqb',0CFh
- dw avx_q_instruction_3a_imm8_w1-instruction_handler
-instructions_end:
-
-data_directives:
- dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3)
- dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3)
- dw data_directives_4-data_directives,(data_directives_end-data_directives_4)/(4+3)
-
-data_directives_2:
- db 'db',1
- dw data_bytes-instruction_handler
- db 'dd',4
- dw data_dwords-instruction_handler
- db 'df',6
- dw data_pwords-instruction_handler
- db 'dp',6
- dw data_pwords-instruction_handler
- db 'dq',8
- dw data_qwords-instruction_handler
- db 'dt',10
- dw data_twords-instruction_handler
- db 'du',2
- dw data_unicode-instruction_handler
- db 'dw',2
- dw data_words-instruction_handler
- db 'rb',1
- dw reserve_bytes-instruction_handler
- db 'rd',4
- dw reserve_dwords-instruction_handler
- db 'rf',6
- dw reserve_pwords-instruction_handler
- db 'rp',6
- dw reserve_pwords-instruction_handler
- db 'rq',8
- dw reserve_qwords-instruction_handler
- db 'rt',10
- dw reserve_twords-instruction_handler
- db 'rw',2
- dw reserve_words-instruction_handler
-data_directives_3:
-data_directives_4:
- db 'file',1
- dw data_file-instruction_handler
-data_directives_end:
+++ /dev/null
-
-; flat assembler core variables
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-; Variables which have to be set up by interface:
-
-memory_start dd ?
-memory_end dd ?
-
-additional_memory dd ?
-additional_memory_end dd ?
-
-stack_limit dd ?
-
-initial_definitions dd ?
-input_file dd ?
-output_file dd ?
-symbols_file dd ?
-
-passes_limit dw ?
-
-; Internal core variables:
-
-current_pass dw ?
-
-include_paths dd ?
-free_additional_memory dd ?
-source_start dd ?
-code_start dd ?
-code_size dd ?
-real_code_size dd ?
-written_size dd ?
-headers_size dd ?
-
-current_line dd ?
-macro_line dd ?
-macro_block dd ?
-macro_block_line dd ?
-macro_block_line_number dd ?
-macro_symbols dd ?
-struc_name dd ?
-struc_label dd ?
-instant_macro_start dd ?
-parameters_end dd ?
-default_argument_value dd ?
-locals_counter rb 8
-current_locals_prefix dd ?
-anonymous_reverse dd ?
-anonymous_forward dd ?
-labels_list dd ?
-label_hash dd ?
-label_leaf dd ?
-hash_tree dd ?
-addressing_space dd ?
-undefined_data_start dd ?
-undefined_data_end dd ?
-counter dd ?
-counter_limit dd ?
-error_info dd ?
-error_line dd ?
-error dd ?
-tagged_blocks dd ?
-structures_buffer dd ?
-number_start dd ?
-current_offset dd ?
-value dq ?
-fp_value rd 8
-adjustment dq ?
-symbol_identifier dd ?
-address_symbol dd ?
-address_high dd ?
-uncompressed_displacement dd ?
-format_flags dd ?
-resolver_flags dd ?
-symbols_stream dd ?
-number_of_relocations dd ?
-number_of_sections dd ?
-stub_size dd ?
-stub_file dd ?
-current_section dd ?
-machine dw ?
-subsystem dw ?
-subsystem_version dd ?
-image_base dd ?
-image_base_high dd ?
-merge_segment dd ?
-resource_data dd ?
-resource_size dd ?
-actual_fixups_size dd ?
-reserved_fixups dd ?
-reserved_fixups_size dd ?
-last_fixup_base dd ?
-last_fixup_header dd ?
-parenthesis_stack dd ?
-blocks_stack dd ?
-parsed_lines dd ?
-logical_value_parentheses dd ?
-file_extension dd ?
-
-operand_size db ?
-operand_flags db ?
-operand_prefix db ?
-rex_prefix db ?
-opcode_prefix db ?
-vex_required db ?
-vex_register db ?
-immediate_size db ?
-mask_register db ?
-broadcast_size db ?
-rounding_mode db ?
-
-base_code db ?
-extended_code db ?
-supplemental_code db ?
-postbyte_register db ?
-segment_register db ?
-xop_opcode_map db ?
-
-mmx_size db ?
-jump_type db ?
-push_size db ?
-value_size db ?
-address_size db ?
-label_size db ?
-size_declared db ?
-address_size_declared db ?
-displacement_compression db ?
-
-value_undefined db ?
-value_constant db ?
-value_type db ?
-value_sign db ?
-fp_sign db ?
-fp_format db ?
-address_sign db ?
-address_register db ?
-compare_type db ?
-logical_value_wrapping db ?
-next_pass_needed db ?
-output_format db ?
-code_type db ?
-adjustment_sign db ?
-evex_mode db ?
-
-macro_status db ?
-skip_default_argument_value db ?
-prefix_flags db ?
-formatter_symbols_allowed db ?
-decorator_symbols_allowed db ?
-free_address_range db ?
-
-characters rb 100h
-converted rb 100h
-message rb 180h
+++ /dev/null
-
-; flat assembler version 1.73
-; Copyright (c) 1999-2023, Tomasz Grysztar.
-; All rights reserved.
-;
-; This programs is free for commercial and non-commercial use as long as
-; the following conditions are adhered to.
-;
-; Redistribution and use in source and binary forms, with or without
-; modification, are permitted provided that the following conditions are
-; met:
-;
-; 1. Redistributions of source code must retain the above copyright notice,
-; this list of conditions and the following disclaimer.
-; 2. Redistributions in binary form must reproduce the above copyright
-; notice, this list of conditions and the following disclaimer in the
-; documentation and/or other materials provided with the distribution.
-;
-; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
-; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-;
-; The licence and distribution terms for any publically available
-; version or derivative of this code cannot be changed. i.e. this code
-; cannot simply be copied and put under another distribution licence
-; (including the GNU Public Licence).
-
-VERSION_STRING equ "1.73.32"
-
-VERSION_MAJOR = 1
-VERSION_MINOR = 73
+++ /dev/null
-
-; flat assembler core
-; Copyright (c) 1999-2022, Tomasz Grysztar.
-; All rights reserved.
-
-simple_instruction_except64:
- cmp [code_type],64
- je illegal_instruction
-simple_instruction:
- stos byte [edi]
- jmp instruction_assembled
-simple_instruction_only64:
- cmp [code_type],64
- jne illegal_instruction
- jmp simple_instruction
-simple_instruction_16bit_except64:
- cmp [code_type],64
- je illegal_instruction
-simple_instruction_16bit:
- cmp [code_type],16
- jne size_prefix
- stos byte [edi]
- jmp instruction_assembled
- size_prefix:
- mov ah,al
- mov al,66h
- stos word [edi]
- jmp instruction_assembled
-simple_instruction_32bit_except64:
- cmp [code_type],64
- je illegal_instruction
-simple_instruction_32bit:
- cmp [code_type],16
- je size_prefix
- stos byte [edi]
- jmp instruction_assembled
-iret_instruction:
- cmp [code_type],64
- jne simple_instruction
-simple_instruction_64bit:
- cmp [code_type],64
- jne illegal_instruction
- mov ah,al
- mov al,48h
- stos word [edi]
- jmp instruction_assembled
-simple_extended_instruction_64bit:
- cmp [code_type],64
- jne illegal_instruction
- mov byte [edi],48h
- inc edi
-simple_extended_instruction:
- mov ah,al
- mov al,0Fh
- stos word [edi]
- jmp instruction_assembled
-simple_extended_instruction_f3:
- mov byte [edi],0F3h
- inc edi
- jmp simple_extended_instruction
-prefix_instruction:
- stos byte [edi]
- or [prefix_flags],1
- jmp continue_line
-segment_prefix:
- mov ah,al
- shr ah,4
- cmp ah,3
- jne illegal_instruction
- and al,1111b
- mov [segment_register],al
- call store_segment_prefix
- or [prefix_flags],1
- jmp continue_line
-bnd_prefix_instruction:
- stos byte [edi]
- or [prefix_flags],1 + 10h
- jmp continue_line
-int_instruction:
- lods byte [esi]
- call get_size_operator
- cmp ah,1
- ja invalid_operand_size
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- test eax,eax
- jns int_imm_ok
- call recoverable_overflow
- int_imm_ok:
- mov ah,al
- mov al,0CDh
- stos word [edi]
- jmp instruction_assembled
-aa_instruction:
- cmp [code_type],64
- je illegal_instruction
- push eax
- mov bl,10
- cmp byte [esi],'('
- jne aa_store
- inc esi
- xor al,al
- xchg al,[operand_size]
- cmp al,1
- ja invalid_operand_size
- call get_byte_value
- mov bl,al
- aa_store:
- cmp [operand_size],0
- jne invalid_operand
- pop eax
- mov ah,bl
- stos word [edi]
- jmp instruction_assembled
-
-basic_instruction:
- mov [base_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je basic_reg
- cmp al,'['
- jne invalid_operand
- basic_mem:
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je basic_mem_imm
- cmp al,10h
- jne invalid_operand
- basic_mem_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- pop ecx ebx edx
- mov al,ah
- cmp al,1
- je instruction_ready
- call operand_autodetect
- inc [base_code]
- instruction_ready:
- call store_instruction
- jmp instruction_assembled
- basic_mem_imm:
- mov al,[operand_size]
- cmp al,1
- jb basic_mem_imm_nosize
- je basic_mem_imm_8bit
- cmp al,2
- je basic_mem_imm_16bit
- cmp al,4
- je basic_mem_imm_32bit
- cmp al,8
- jne invalid_operand_size
- basic_mem_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp basic_mem_imm_32bit_ok
- basic_mem_imm_nosize:
- call recoverable_unknown_size
- basic_mem_imm_8bit:
- call get_byte_value
- mov byte [value],al
- mov al,[base_code]
- shr al,3
- mov [postbyte_register],al
- pop ecx ebx edx
- mov [base_code],80h
- call store_instruction_with_imm8
- jmp instruction_assembled
- basic_mem_imm_16bit:
- call operand_16bit
- call get_word_value
- mov word [value],ax
- mov al,[base_code]
- shr al,3
- mov [postbyte_register],al
- pop ecx ebx edx
- cmp [value_type],0
- jne basic_mem_imm_16bit_store
- cmp [size_declared],0
- jne basic_mem_imm_16bit_store
- cmp word [value],80h
- jb basic_mem_simm_8bit
- cmp word [value],-80h
- jae basic_mem_simm_8bit
- basic_mem_imm_16bit_store:
- mov [base_code],81h
- call store_instruction_with_imm16
- jmp instruction_assembled
- basic_mem_simm_8bit:
- mov [base_code],83h
- call store_instruction_with_imm8
- jmp instruction_assembled
- basic_mem_imm_32bit:
- call operand_32bit
- call get_dword_value
- basic_mem_imm_32bit_ok:
- mov dword [value],eax
- mov al,[base_code]
- shr al,3
- mov [postbyte_register],al
- pop ecx ebx edx
- cmp [value_type],0
- jne basic_mem_imm_32bit_store
- cmp [size_declared],0
- jne basic_mem_imm_32bit_store
- cmp dword [value],80h
- jb basic_mem_simm_8bit
- cmp dword [value],-80h
- jae basic_mem_simm_8bit
- basic_mem_imm_32bit_store:
- mov [base_code],81h
- call store_instruction_with_imm32
- jmp instruction_assembled
- get_simm32:
- call get_qword_value
- mov ecx,edx
- cdq
- cmp ecx,edx
- je simm32_range_ok
- call recoverable_overflow
- simm32_range_ok:
- cmp [value_type],4
- jne get_simm32_ok
- mov [value_type],2
- get_simm32_ok:
- ret
- basic_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je basic_reg_reg
- cmp al,'('
- je basic_reg_imm
- cmp al,'['
- jne invalid_operand
- basic_reg_mem:
- call get_address
- mov al,[operand_size]
- cmp al,1
- je basic_reg_mem_8bit
- call operand_autodetect
- add [base_code],3
- jmp instruction_ready
- basic_reg_mem_8bit:
- add [base_code],2
- jmp instruction_ready
- basic_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,[postbyte_register]
- mov [postbyte_register],al
- mov al,ah
- cmp al,1
- je nomem_instruction_ready
- call operand_autodetect
- inc [base_code]
- nomem_instruction_ready:
- call store_nomem_instruction
- jmp instruction_assembled
- basic_reg_imm:
- mov al,[operand_size]
- cmp al,1
- je basic_reg_imm_8bit
- cmp al,2
- je basic_reg_imm_16bit
- cmp al,4
- je basic_reg_imm_32bit
- cmp al,8
- jne invalid_operand_size
- basic_reg_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp basic_reg_imm_32bit_ok
- basic_reg_imm_8bit:
- call get_byte_value
- mov dl,al
- mov bl,[base_code]
- shr bl,3
- xchg bl,[postbyte_register]
- or bl,bl
- jz basic_al_imm
- mov [base_code],80h
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- basic_al_imm:
- mov al,[base_code]
- add al,4
- stos byte [edi]
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- basic_reg_imm_16bit:
- call operand_16bit
- call get_word_value
- mov dx,ax
- mov bl,[base_code]
- shr bl,3
- xchg bl,[postbyte_register]
- cmp [value_type],0
- jne basic_reg_imm_16bit_store
- cmp [size_declared],0
- jne basic_reg_imm_16bit_store
- cmp dx,80h
- jb basic_reg_simm_8bit
- cmp dx,-80h
- jae basic_reg_simm_8bit
- basic_reg_imm_16bit_store:
- or bl,bl
- jz basic_ax_imm
- mov [base_code],81h
- call store_nomem_instruction
- basic_store_imm_16bit:
- mov ax,dx
- call mark_relocation
- stos word [edi]
- jmp instruction_assembled
- basic_reg_simm_8bit:
- mov [base_code],83h
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- basic_ax_imm:
- add [base_code],5
- call store_classic_instruction_code
- jmp basic_store_imm_16bit
- basic_reg_imm_32bit:
- call operand_32bit
- call get_dword_value
- basic_reg_imm_32bit_ok:
- mov edx,eax
- mov bl,[base_code]
- shr bl,3
- xchg bl,[postbyte_register]
- cmp [value_type],0
- jne basic_reg_imm_32bit_store
- cmp [size_declared],0
- jne basic_reg_imm_32bit_store
- cmp edx,80h
- jb basic_reg_simm_8bit
- cmp edx,-80h
- jae basic_reg_simm_8bit
- basic_reg_imm_32bit_store:
- or bl,bl
- jz basic_eax_imm
- mov [base_code],81h
- call store_nomem_instruction
- basic_store_imm_32bit:
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- basic_eax_imm:
- add [base_code],5
- call store_classic_instruction_code
- jmp basic_store_imm_32bit
- recoverable_unknown_size:
- cmp [error_line],0
- jne ignore_unknown_size
- push [current_line]
- pop [error_line]
- mov [error],operand_size_not_specified
- ignore_unknown_size:
- ret
-single_operand_instruction:
- mov [base_code],0F6h
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je single_reg
- cmp al,'['
- jne invalid_operand
- single_mem:
- call get_address
- mov al,[operand_size]
- cmp al,1
- je single_mem_8bit
- jb single_mem_nosize
- call operand_autodetect
- inc [base_code]
- jmp instruction_ready
- single_mem_nosize:
- call recoverable_unknown_size
- single_mem_8bit:
- jmp instruction_ready
- single_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- cmp al,1
- je single_reg_8bit
- call operand_autodetect
- inc [base_code]
- single_reg_8bit:
- jmp nomem_instruction_ready
-mov_instruction:
- mov [base_code],88h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je mov_reg
- cmp al,14h
- je mov_creg
- cmp al,'['
- jne invalid_operand
- mov_mem:
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je mov_mem_imm
- cmp al,10h
- jne invalid_operand
- mov_mem_reg:
- lods byte [esi]
- cmp al,30h
- jb mov_mem_general_reg
- cmp al,40h
- jb mov_mem_sreg
- mov_mem_general_reg:
- call convert_register
- mov [postbyte_register],al
- pop ecx ebx edx
- cmp ah,1
- je mov_mem_reg_8bit
- inc [base_code]
- mov al,ah
- call operand_autodetect
- mov al,[postbyte_register]
- or al,bl
- or al,bh
- jz mov_mem_ax
- jmp instruction_ready
- mov_mem_reg_8bit:
- or al,bl
- or al,bh
- jnz instruction_ready
- mov_mem_al:
- test ch,22h
- jnz mov_mem_address16_al
- test ch,44h
- jnz mov_mem_address32_al
- test ch,not 88h
- jnz invalid_address_size
- call check_mov_address64
- cmp al,0
- jg mov_mem_address64_al
- jl instruction_ready
- cmp [code_type],16
- jne mov_mem_address32_al
- cmp edx,10000h
- jb mov_mem_address16_al
- mov_mem_address32_al:
- call store_segment_prefix_if_necessary
- call address_32bit_prefix
- mov [base_code],0A2h
- store_mov_address32:
- call store_classic_instruction_code
- call store_address_32bit_value
- jmp instruction_assembled
- mov_mem_address16_al:
- call store_segment_prefix_if_necessary
- call address_16bit_prefix
- mov [base_code],0A2h
- store_mov_address16:
- cmp [code_type],64
- je invalid_address
- call store_classic_instruction_code
- mov eax,edx
- stos word [edi]
- cmp edx,10000h
- jge value_out_of_range
- jmp instruction_assembled
- check_mov_address64:
- cmp [code_type],64
- jne no_address64
- test ch,88h
- jnz address64_required
- mov eax,[address_high]
- or eax,eax
- jz no_address64
- bt edx,31
- adc eax,0
- jz address64_simm32
- address64_required:
- mov al,1
- ret
- address64_simm32:
- mov al,-1
- ret
- no_address64:
- test ch,08h
- jnz invalid_address_size
- xor al,al
- ret
- mov_mem_address64_al:
- call store_segment_prefix_if_necessary
- mov [base_code],0A2h
- store_mov_address64:
- call store_classic_instruction_code
- call store_address_64bit_value
- jmp instruction_assembled
- mov_mem_ax:
- test ch,22h
- jnz mov_mem_address16_ax
- test ch,44h
- jnz mov_mem_address32_ax
- test ch,not 88h
- jnz invalid_address_size
- call check_mov_address64
- cmp al,0
- jg mov_mem_address64_ax
- jl instruction_ready
- cmp [code_type],16
- jne mov_mem_address32_ax
- cmp edx,10000h
- jb mov_mem_address16_ax
- mov_mem_address32_ax:
- call store_segment_prefix_if_necessary
- call address_32bit_prefix
- mov [base_code],0A3h
- jmp store_mov_address32
- mov_mem_address16_ax:
- call store_segment_prefix_if_necessary
- call address_16bit_prefix
- mov [base_code],0A3h
- jmp store_mov_address16
- mov_mem_address64_ax:
- call store_segment_prefix_if_necessary
- mov [base_code],0A3h
- jmp store_mov_address64
- mov_mem_sreg:
- sub al,31h
- mov [postbyte_register],al
- pop ecx ebx edx
- mov ah,[operand_size]
- or ah,ah
- jz mov_mem_sreg_store
- cmp ah,2
- jne invalid_operand_size
- mov_mem_sreg_store:
- mov [base_code],8Ch
- jmp instruction_ready
- mov_mem_imm:
- mov al,[operand_size]
- cmp al,1
- jb mov_mem_imm_nosize
- je mov_mem_imm_8bit
- cmp al,2
- je mov_mem_imm_16bit
- cmp al,4
- je mov_mem_imm_32bit
- cmp al,8
- jne invalid_operand_size
- mov_mem_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp mov_mem_imm_32bit_store
- mov_mem_imm_nosize:
- call recoverable_unknown_size
- mov_mem_imm_8bit:
- call get_byte_value
- mov byte [value],al
- mov [postbyte_register],0
- mov [base_code],0C6h
- pop ecx ebx edx
- call store_instruction_with_imm8
- jmp instruction_assembled
- mov_mem_imm_16bit:
- call operand_16bit
- call get_word_value
- mov word [value],ax
- mov [postbyte_register],0
- mov [base_code],0C7h
- pop ecx ebx edx
- call store_instruction_with_imm16
- jmp instruction_assembled
- mov_mem_imm_32bit:
- call operand_32bit
- call get_dword_value
- mov_mem_imm_32bit_store:
- mov dword [value],eax
- mov [postbyte_register],0
- mov [base_code],0C7h
- pop ecx ebx edx
- call store_instruction_with_imm32
- jmp instruction_assembled
- mov_reg:
- lods byte [esi]
- mov ah,al
- sub ah,10h
- and ah,al
- test ah,0F0h
- jnz mov_sreg
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je mov_reg_mem
- cmp al,'('
- je mov_reg_imm
- cmp al,14h
- je mov_reg_creg
- cmp al,10h
- jne invalid_operand
- mov_reg_reg:
- lods byte [esi]
- mov ah,al
- sub ah,10h
- and ah,al
- test ah,0F0h
- jnz mov_reg_sreg
- call convert_register
- mov bl,[postbyte_register]
- mov [postbyte_register],al
- mov al,ah
- cmp al,1
- je mov_reg_reg_8bit
- call operand_autodetect
- inc [base_code]
- mov_reg_reg_8bit:
- jmp nomem_instruction_ready
- mov_reg_sreg:
- mov bl,[postbyte_register]
- mov ah,al
- and al,1111b
- mov [postbyte_register],al
- shr ah,4
- cmp ah,3
- jne invalid_operand
- dec [postbyte_register]
- cmp [operand_size],8
- je mov_reg_sreg64
- cmp [operand_size],4
- je mov_reg_sreg32
- cmp [operand_size],2
- jne invalid_operand_size
- call operand_16bit
- jmp mov_reg_sreg_store
- mov_reg_sreg64:
- call operand_64bit
- jmp mov_reg_sreg_store
- mov_reg_sreg32:
- call operand_32bit
- mov_reg_sreg_store:
- mov [base_code],8Ch
- jmp nomem_instruction_ready
- mov_reg_creg:
- lods byte [esi]
- mov bl,al
- shr al,4
- cmp al,4
- ja invalid_operand
- add al,20h
- mov [extended_code],al
- and bl,1111b
- xchg bl,[postbyte_register]
- mov [base_code],0Fh
- cmp [code_type],64
- je mov_reg_creg_64bit
- cmp [operand_size],4
- jne invalid_operand_size
- cmp [postbyte_register],8
- jne mov_reg_creg_store
- cmp [extended_code],20h
- jne mov_reg_creg_store
- mov al,0F0h
- stos byte [edi]
- mov [postbyte_register],0
- mov_reg_creg_store:
- jmp nomem_instruction_ready
- mov_reg_creg_64bit:
- cmp [operand_size],8
- jne invalid_operand_size
- jmp nomem_instruction_ready
- mov_reg_mem:
- add [base_code],2
- call get_address
- mov al,[operand_size]
- cmp al,1
- je mov_reg_mem_8bit
- inc [base_code]
- call operand_autodetect
- mov al,[postbyte_register]
- or al,bl
- or al,bh
- jz mov_ax_mem
- jmp instruction_ready
- mov_reg_mem_8bit:
- mov al,[postbyte_register]
- or al,bl
- or al,bh
- jz mov_al_mem
- jmp instruction_ready
- mov_al_mem:
- test ch,22h
- jnz mov_al_mem_address16
- test ch,44h
- jnz mov_al_mem_address32
- test ch,not 88h
- jnz invalid_address_size
- call check_mov_address64
- cmp al,0
- jg mov_al_mem_address64
- jl instruction_ready
- cmp [code_type],16
- jne mov_al_mem_address32
- cmp edx,10000h
- jb mov_al_mem_address16
- mov_al_mem_address32:
- call store_segment_prefix_if_necessary
- call address_32bit_prefix
- mov [base_code],0A0h
- jmp store_mov_address32
- mov_al_mem_address16:
- call store_segment_prefix_if_necessary
- call address_16bit_prefix
- mov [base_code],0A0h
- jmp store_mov_address16
- mov_al_mem_address64:
- call store_segment_prefix_if_necessary
- mov [base_code],0A0h
- jmp store_mov_address64
- mov_ax_mem:
- test ch,22h
- jnz mov_ax_mem_address16
- test ch,44h
- jnz mov_ax_mem_address32
- test ch,not 88h
- jnz invalid_address_size
- call check_mov_address64
- cmp al,0
- jg mov_ax_mem_address64
- jl instruction_ready
- cmp [code_type],16
- jne mov_ax_mem_address32
- cmp edx,10000h
- jb mov_ax_mem_address16
- mov_ax_mem_address32:
- call store_segment_prefix_if_necessary
- call address_32bit_prefix
- mov [base_code],0A1h
- jmp store_mov_address32
- mov_ax_mem_address16:
- call store_segment_prefix_if_necessary
- call address_16bit_prefix
- mov [base_code],0A1h
- jmp store_mov_address16
- mov_ax_mem_address64:
- call store_segment_prefix_if_necessary
- mov [base_code],0A1h
- jmp store_mov_address64
- mov_reg_imm:
- mov al,[operand_size]
- cmp al,1
- je mov_reg_imm_8bit
- cmp al,2
- je mov_reg_imm_16bit
- cmp al,4
- je mov_reg_imm_32bit
- cmp al,8
- jne invalid_operand_size
- mov_reg_imm_64bit:
- call operand_64bit
- call get_qword_value
- mov ecx,edx
- cmp [size_declared],0
- jne mov_reg_imm_64bit_store
- cmp [value_type],4
- jae mov_reg_imm_64bit_store
- cdq
- cmp ecx,edx
- je mov_reg_64bit_imm_32bit
- mov_reg_imm_64bit_store:
- push eax ecx
- mov al,0B8h
- call store_mov_reg_imm_code
- pop edx eax
- call mark_relocation
- stos dword [edi]
- mov eax,edx
- stos dword [edi]
- jmp instruction_assembled
- mov_reg_imm_8bit:
- call get_byte_value
- mov dl,al
- mov al,0B0h
- call store_mov_reg_imm_code
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- mov_reg_imm_16bit:
- call get_word_value
- mov dx,ax
- call operand_16bit
- mov al,0B8h
- call store_mov_reg_imm_code
- mov ax,dx
- call mark_relocation
- stos word [edi]
- jmp instruction_assembled
- mov_reg_imm_32bit:
- call operand_32bit
- call get_dword_value
- mov edx,eax
- mov al,0B8h
- call store_mov_reg_imm_code
- mov_store_imm_32bit:
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- store_mov_reg_imm_code:
- mov ah,[postbyte_register]
- test ah,1000b
- jz mov_reg_imm_prefix_ok
- or [rex_prefix],41h
- mov_reg_imm_prefix_ok:
- and ah,111b
- add al,ah
- mov [base_code],al
- call store_classic_instruction_code
- ret
- mov_reg_64bit_imm_32bit:
- mov edx,eax
- mov bl,[postbyte_register]
- mov [postbyte_register],0
- mov [base_code],0C7h
- call store_nomem_instruction
- jmp mov_store_imm_32bit
- mov_sreg:
- mov ah,al
- and al,1111b
- mov [postbyte_register],al
- shr ah,4
- cmp ah,3
- jne invalid_operand
- cmp al,2
- je illegal_instruction
- dec [postbyte_register]
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je mov_sreg_mem
- cmp al,10h
- jne invalid_operand
- mov_sreg_reg:
- lods byte [esi]
- call convert_register
- or ah,ah
- jz mov_sreg_reg_size_ok
- cmp ah,2
- jne invalid_operand_size
- mov bl,al
- mov_sreg_reg_size_ok:
- mov [base_code],8Eh
- jmp nomem_instruction_ready
- mov_sreg_mem:
- call get_address
- mov al,[operand_size]
- or al,al
- jz mov_sreg_mem_size_ok
- cmp al,2
- jne invalid_operand_size
- mov_sreg_mem_size_ok:
- mov [base_code],8Eh
- jmp instruction_ready
- mov_creg:
- lods byte [esi]
- mov ah,al
- shr ah,4
- cmp ah,4
- ja invalid_operand
- add ah,22h
- mov [extended_code],ah
- and al,1111b
- mov [postbyte_register],al
- mov [base_code],0Fh
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov bl,al
- cmp [code_type],64
- je mov_creg_64bit
- cmp ah,4
- jne invalid_operand_size
- cmp [postbyte_register],8
- jne mov_creg_store
- cmp [extended_code],22h
- jne mov_creg_store
- mov al,0F0h
- stos byte [edi]
- mov [postbyte_register],0
- mov_creg_store:
- jmp nomem_instruction_ready
- mov_creg_64bit:
- cmp ah,8
- je mov_creg_store
- jmp invalid_operand_size
-test_instruction:
- mov [base_code],84h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je test_reg
- cmp al,'['
- jne invalid_operand
- test_mem:
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je test_mem_imm
- cmp al,10h
- jne invalid_operand
- test_mem_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- pop ecx ebx edx
- mov al,ah
- cmp al,1
- je test_mem_reg_8bit
- call operand_autodetect
- inc [base_code]
- test_mem_reg_8bit:
- jmp instruction_ready
- test_mem_imm:
- mov al,[operand_size]
- cmp al,1
- jb test_mem_imm_nosize
- je test_mem_imm_8bit
- cmp al,2
- je test_mem_imm_16bit
- cmp al,4
- je test_mem_imm_32bit
- cmp al,8
- jne invalid_operand_size
- test_mem_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp test_mem_imm_32bit_store
- test_mem_imm_nosize:
- call recoverable_unknown_size
- test_mem_imm_8bit:
- call get_byte_value
- mov byte [value],al
- mov [postbyte_register],0
- mov [base_code],0F6h
- pop ecx ebx edx
- call store_instruction_with_imm8
- jmp instruction_assembled
- test_mem_imm_16bit:
- call operand_16bit
- call get_word_value
- mov word [value],ax
- mov [postbyte_register],0
- mov [base_code],0F7h
- pop ecx ebx edx
- call store_instruction_with_imm16
- jmp instruction_assembled
- test_mem_imm_32bit:
- call operand_32bit
- call get_dword_value
- test_mem_imm_32bit_store:
- mov dword [value],eax
- mov [postbyte_register],0
- mov [base_code],0F7h
- pop ecx ebx edx
- call store_instruction_with_imm32
- jmp instruction_assembled
- test_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je test_reg_mem
- cmp al,'('
- je test_reg_imm
- cmp al,10h
- jne invalid_operand
- test_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,[postbyte_register]
- mov [postbyte_register],al
- mov al,ah
- cmp al,1
- je test_reg_reg_8bit
- call operand_autodetect
- inc [base_code]
- test_reg_reg_8bit:
- jmp nomem_instruction_ready
- test_reg_imm:
- mov al,[operand_size]
- cmp al,1
- je test_reg_imm_8bit
- cmp al,2
- je test_reg_imm_16bit
- cmp al,4
- je test_reg_imm_32bit
- cmp al,8
- jne invalid_operand_size
- test_reg_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp test_reg_imm_32bit_store
- test_reg_imm_8bit:
- call get_byte_value
- mov dl,al
- mov bl,[postbyte_register]
- mov [postbyte_register],0
- mov [base_code],0F6h
- or bl,bl
- jz test_al_imm
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- test_al_imm:
- mov [base_code],0A8h
- call store_classic_instruction_code
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- test_reg_imm_16bit:
- call operand_16bit
- call get_word_value
- mov dx,ax
- mov bl,[postbyte_register]
- mov [postbyte_register],0
- mov [base_code],0F7h
- or bl,bl
- jz test_ax_imm
- call store_nomem_instruction
- mov ax,dx
- call mark_relocation
- stos word [edi]
- jmp instruction_assembled
- test_ax_imm:
- mov [base_code],0A9h
- call store_classic_instruction_code
- mov ax,dx
- stos word [edi]
- jmp instruction_assembled
- test_reg_imm_32bit:
- call operand_32bit
- call get_dword_value
- test_reg_imm_32bit_store:
- mov edx,eax
- mov bl,[postbyte_register]
- mov [postbyte_register],0
- mov [base_code],0F7h
- or bl,bl
- jz test_eax_imm
- call store_nomem_instruction
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- test_eax_imm:
- mov [base_code],0A9h
- call store_classic_instruction_code
- mov eax,edx
- stos dword [edi]
- jmp instruction_assembled
- test_reg_mem:
- call get_address
- mov al,[operand_size]
- cmp al,1
- je test_reg_mem_8bit
- call operand_autodetect
- inc [base_code]
- test_reg_mem_8bit:
- jmp instruction_ready
-xchg_instruction:
- mov [base_code],86h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je xchg_reg
- cmp al,'['
- jne invalid_operand
- xchg_mem:
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je test_mem_reg
- jmp invalid_operand
- xchg_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je test_reg_mem
- cmp al,10h
- jne invalid_operand
- xchg_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- cmp al,1
- je xchg_reg_reg_8bit
- call operand_autodetect
- cmp [postbyte_register],0
- je xchg_ax_reg
- or bl,bl
- jnz xchg_reg_reg_store
- mov bl,[postbyte_register]
- xchg_ax_reg:
- cmp [code_type],64
- jne xchg_ax_reg_ok
- cmp ah,4
- jne xchg_ax_reg_ok
- or bl,bl
- jz xchg_reg_reg_store
- xchg_ax_reg_ok:
- test bl,1000b
- jz xchg_ax_reg_store
- or [rex_prefix],41h
- and bl,111b
- xchg_ax_reg_store:
- add bl,90h
- mov [base_code],bl
- call store_classic_instruction_code
- jmp instruction_assembled
- xchg_reg_reg_store:
- inc [base_code]
- xchg_reg_reg_8bit:
- jmp nomem_instruction_ready
-push_instruction:
- mov [push_size],al
- push_next:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je push_reg
- cmp al,'('
- je push_imm
- cmp al,'['
- jne invalid_operand
- push_mem:
- call get_address
- mov al,[operand_size]
- mov ah,[push_size]
- cmp al,2
- je push_mem_16bit
- cmp al,4
- je push_mem_32bit
- cmp al,8
- je push_mem_64bit
- or al,al
- jnz invalid_operand_size
- cmp ah,2
- je push_mem_16bit
- cmp ah,4
- je push_mem_32bit
- cmp ah,8
- je push_mem_64bit
- call recoverable_unknown_size
- jmp push_mem_store
- push_mem_16bit:
- test ah,not 2
- jnz invalid_operand_size
- call operand_16bit
- jmp push_mem_store
- push_mem_32bit:
- test ah,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp push_mem_store
- push_mem_64bit:
- test ah,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- push_mem_store:
- mov [base_code],0FFh
- mov [postbyte_register],110b
- call store_instruction
- jmp push_done
- push_reg:
- lods byte [esi]
- mov ah,al
- sub ah,10h
- and ah,al
- test ah,0F0h
- jnz push_sreg
- call convert_register
- test al,1000b
- jz push_reg_ok
- or [rex_prefix],41h
- and al,111b
- push_reg_ok:
- add al,50h
- mov [base_code],al
- mov al,ah
- mov ah,[push_size]
- cmp al,2
- je push_reg_16bit
- cmp al,4
- je push_reg_32bit
- cmp al,8
- jne invalid_operand_size
- push_reg_64bit:
- test ah,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- jmp push_reg_store
- push_reg_32bit:
- test ah,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp push_reg_store
- push_reg_16bit:
- test ah,not 2
- jnz invalid_operand_size
- call operand_16bit
- push_reg_store:
- call store_classic_instruction_code
- jmp push_done
- push_sreg:
- mov bl,al
- mov dl,[operand_size]
- mov dh,[push_size]
- cmp dl,2
- je push_sreg16
- cmp dl,4
- je push_sreg32
- cmp dl,8
- je push_sreg64
- or dl,dl
- jnz invalid_operand_size
- cmp dh,2
- je push_sreg16
- cmp dh,4
- je push_sreg32
- cmp dh,8
- je push_sreg64
- jmp push_sreg_store
- push_sreg16:
- test dh,not 2
- jnz invalid_operand_size
- call operand_16bit
- jmp push_sreg_store
- push_sreg32:
- test dh,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp push_sreg_store
- push_sreg64:
- test dh,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- push_sreg_store:
- mov al,bl
- cmp al,40h
- jae invalid_operand
- sub al,31h
- jc invalid_operand
- cmp al,4
- jae push_sreg_386
- shl al,3
- add al,6
- mov [base_code],al
- cmp [code_type],64
- je illegal_instruction
- jmp push_reg_store
- push_sreg_386:
- sub al,4
- shl al,3
- add al,0A0h
- mov [extended_code],al
- mov [base_code],0Fh
- jmp push_reg_store
- push_imm:
- mov al,[operand_size]
- mov ah,[push_size]
- or al,al
- je push_imm_size_ok
- or ah,ah
- je push_imm_size_ok
- cmp al,ah
- jne invalid_operand_size
- push_imm_size_ok:
- cmp al,2
- je push_imm_16bit
- cmp al,4
- je push_imm_32bit
- cmp al,8
- je push_imm_64bit
- cmp ah,2
- je push_imm_optimized_16bit
- cmp ah,4
- je push_imm_optimized_32bit
- cmp ah,8
- je push_imm_optimized_64bit
- or al,al
- jnz invalid_operand_size
- cmp [code_type],16
- je push_imm_optimized_16bit
- cmp [code_type],32
- je push_imm_optimized_32bit
- push_imm_optimized_64bit:
- cmp [code_type],64
- jne illegal_instruction
- call get_simm32
- mov edx,eax
- cmp [value_type],0
- jne push_imm_32bit_store
- cmp eax,-80h
- jl push_imm_32bit_store
- cmp eax,80h
- jge push_imm_32bit_store
- jmp push_imm_8bit
- push_imm_optimized_32bit:
- cmp [code_type],64
- je illegal_instruction
- call get_dword_value
- mov edx,eax
- call operand_32bit
- cmp [value_type],0
- jne push_imm_32bit_store
- cmp eax,-80h
- jl push_imm_32bit_store
- cmp eax,80h
- jge push_imm_32bit_store
- jmp push_imm_8bit
- push_imm_optimized_16bit:
- call get_word_value
- mov dx,ax
- call operand_16bit
- cmp [value_type],0
- jne push_imm_16bit_store
- cmp ax,-80h
- jl push_imm_16bit_store
- cmp ax,80h
- jge push_imm_16bit_store
- push_imm_8bit:
- mov ah,al
- mov [base_code],6Ah
- call store_classic_instruction_code
- mov al,ah
- stos byte [edi]
- jmp push_done
- push_imm_16bit:
- call get_word_value
- mov dx,ax
- call operand_16bit
- push_imm_16bit_store:
- mov [base_code],68h
- call store_classic_instruction_code
- mov ax,dx
- call mark_relocation
- stos word [edi]
- jmp push_done
- push_imm_64bit:
- cmp [code_type],64
- jne illegal_instruction
- call get_simm32
- mov edx,eax
- jmp push_imm_32bit_store
- push_imm_32bit:
- cmp [code_type],64
- je illegal_instruction
- call get_dword_value
- mov edx,eax
- call operand_32bit
- push_imm_32bit_store:
- mov [base_code],68h
- call store_classic_instruction_code
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- push_done:
- lods byte [esi]
- dec esi
- cmp al,0Fh
- je instruction_assembled
- or al,al
- jz instruction_assembled
-; mov [operand_size],0
-; mov [operand_flags],0
-; mov [operand_prefix],0
-; mov [rex_prefix],0
- and dword [operand_size],0
- jmp push_next
-pop_instruction:
- mov [push_size],al
- pop_next:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pop_reg
- cmp al,'['
- jne invalid_operand
- pop_mem:
- call get_address
- mov al,[operand_size]
- mov ah,[push_size]
- cmp al,2
- je pop_mem_16bit
- cmp al,4
- je pop_mem_32bit
- cmp al,8
- je pop_mem_64bit
- or al,al
- jnz invalid_operand_size
- cmp ah,2
- je pop_mem_16bit
- cmp ah,4
- je pop_mem_32bit
- cmp ah,8
- je pop_mem_64bit
- call recoverable_unknown_size
- jmp pop_mem_store
- pop_mem_16bit:
- test ah,not 2
- jnz invalid_operand_size
- call operand_16bit
- jmp pop_mem_store
- pop_mem_32bit:
- test ah,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp pop_mem_store
- pop_mem_64bit:
- test ah,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- pop_mem_store:
- mov [base_code],08Fh
- mov [postbyte_register],0
- call store_instruction
- jmp pop_done
- pop_reg:
- lods byte [esi]
- mov ah,al
- sub ah,10h
- and ah,al
- test ah,0F0h
- jnz pop_sreg
- call convert_register
- test al,1000b
- jz pop_reg_ok
- or [rex_prefix],41h
- and al,111b
- pop_reg_ok:
- add al,58h
- mov [base_code],al
- mov al,ah
- mov ah,[push_size]
- cmp al,2
- je pop_reg_16bit
- cmp al,4
- je pop_reg_32bit
- cmp al,8
- je pop_reg_64bit
- jmp invalid_operand_size
- pop_reg_64bit:
- test ah,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- jmp pop_reg_store
- pop_reg_32bit:
- test ah,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp pop_reg_store
- pop_reg_16bit:
- test ah,not 2
- jnz invalid_operand_size
- call operand_16bit
- pop_reg_store:
- call store_classic_instruction_code
- pop_done:
- lods byte [esi]
- dec esi
- cmp al,0Fh
- je instruction_assembled
- or al,al
- jz instruction_assembled
-; mov [operand_size],0
-; mov [operand_flags],0
-; mov [operand_prefix],0
-; mov [rex_prefix],0
- and dword [operand_size],0
- jmp pop_next
- pop_sreg:
- mov dl,[operand_size]
- mov dh,[push_size]
- cmp al,32h
- je pop_cs
- mov bl,al
- cmp dl,2
- je pop_sreg16
- cmp dl,4
- je pop_sreg32
- cmp dl,8
- je pop_sreg64
- or dl,dl
- jnz invalid_operand_size
- cmp dh,2
- je pop_sreg16
- cmp dh,4
- je pop_sreg32
- cmp dh,8
- je pop_sreg64
- jmp pop_sreg_store
- pop_sreg16:
- test dh,not 2
- jnz invalid_operand_size
- call operand_16bit
- jmp pop_sreg_store
- pop_sreg32:
- test dh,not 4
- jnz invalid_operand_size
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp pop_sreg_store
- pop_sreg64:
- test dh,not 8
- jnz invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- pop_sreg_store:
- mov al,bl
- cmp al,40h
- jae invalid_operand
- sub al,31h
- jc invalid_operand
- cmp al,4
- jae pop_sreg_386
- shl al,3
- add al,7
- mov [base_code],al
- cmp [code_type],64
- je illegal_instruction
- jmp pop_reg_store
- pop_cs:
- cmp [code_type],16
- jne illegal_instruction
- cmp dl,2
- je pop_cs_store
- or dl,dl
- jnz invalid_operand_size
- cmp dh,2
- je pop_cs_store
- or dh,dh
- jnz illegal_instruction
- pop_cs_store:
- test dh,not 2
- jnz invalid_operand_size
- mov al,0Fh
- stos byte [edi]
- jmp pop_done
- pop_sreg_386:
- sub al,4
- shl al,3
- add al,0A1h
- mov [extended_code],al
- mov [base_code],0Fh
- jmp pop_reg_store
-inc_instruction:
- mov [base_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je inc_reg
- cmp al,'['
- je inc_mem
- jne invalid_operand
- inc_mem:
- call get_address
- mov al,[operand_size]
- cmp al,1
- je inc_mem_8bit
- jb inc_mem_nosize
- call operand_autodetect
- mov al,0FFh
- xchg al,[base_code]
- mov [postbyte_register],al
- jmp instruction_ready
- inc_mem_nosize:
- call recoverable_unknown_size
- inc_mem_8bit:
- mov al,0FEh
- xchg al,[base_code]
- mov [postbyte_register],al
- jmp instruction_ready
- inc_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,0FEh
- xchg al,[base_code]
- mov [postbyte_register],al
- mov al,ah
- cmp al,1
- je inc_reg_8bit
- call operand_autodetect
- cmp [code_type],64
- je inc_reg_long_form
- mov al,[postbyte_register]
- shl al,3
- add al,bl
- add al,40h
- mov [base_code],al
- call store_classic_instruction_code
- jmp instruction_assembled
- inc_reg_long_form:
- inc [base_code]
- inc_reg_8bit:
- jmp nomem_instruction_ready
-set_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je set_reg
- cmp al,'['
- jne invalid_operand
- set_mem:
- call get_address
- cmp [operand_size],1
- ja invalid_operand_size
- mov [postbyte_register],0
- jmp instruction_ready
- set_reg:
- lods byte [esi]
- call convert_register
- cmp ah,1
- jne invalid_operand_size
- mov bl,al
- mov [postbyte_register],0
- jmp nomem_instruction_ready
-arpl_instruction:
- cmp [code_type],64
- je illegal_instruction
- mov [base_code],63h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je arpl_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- cmp ah,2
- jne invalid_operand_size
- jmp instruction_ready
- arpl_reg:
- lods byte [esi]
- call convert_register
- cmp ah,2
- jne invalid_operand_size
- mov bl,al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- jmp nomem_instruction_ready
-bound_instruction:
- cmp [code_type],64
- je illegal_instruction
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,2
- je bound_store
- cmp al,4
- jne invalid_operand_size
- bound_store:
- call operand_autodetect
- mov [base_code],62h
- jmp instruction_ready
-enter_instruction:
- lods byte [esi]
- call get_size_operator
- cmp ah,2
- je enter_imm16_size_ok
- or ah,ah
- jnz invalid_operand_size
- enter_imm16_size_ok:
- cmp al,'('
- jne invalid_operand
- call get_word_value
- cmp [next_pass_needed],0
- jne enter_imm16_ok
- cmp [value_type],0
- jne invalid_use_of_symbol
- test eax,eax
- js value_out_of_range
- enter_imm16_ok:
- push eax
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp ah,1
- je enter_imm8_size_ok
- or ah,ah
- jnz invalid_operand_size
- enter_imm8_size_ok:
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- cmp [next_pass_needed],0
- jne enter_imm8_ok
- test eax,eax
- js value_out_of_range
- enter_imm8_ok:
- mov dl,al
- pop ebx
- mov al,0C8h
- stos byte [edi]
- mov ax,bx
- stos word [edi]
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-ret_instruction_only64:
- cmp [code_type],64
- jne illegal_instruction
- jmp ret_instruction
-ret_instruction_32bit_except64:
- cmp [code_type],64
- je illegal_instruction
-ret_instruction_32bit:
- call operand_32bit
- jmp ret_instruction
-ret_instruction_16bit:
- call operand_16bit
- jmp ret_instruction
-ret_instruction_64bit:
- call operand_64bit
-ret_instruction:
- and [prefix_flags],not 10h
- ret_common:
- mov [base_code],al
- lods byte [esi]
- dec esi
- or al,al
- jz simple_ret
- cmp al,0Fh
- je simple_ret
- lods byte [esi]
- call get_size_operator
- or ah,ah
- jz ret_imm
- cmp ah,2
- je ret_imm
- jmp invalid_operand_size
- ret_imm:
- cmp al,'('
- jne invalid_operand
- call get_word_value
- cmp [next_pass_needed],0
- jne ret_imm_ok
- cmp [value_type],0
- jne invalid_use_of_symbol
- test eax,eax
- js value_out_of_range
- ret_imm_ok:
- cmp [size_declared],0
- jne ret_imm_store
- or ax,ax
- jz simple_ret
- ret_imm_store:
- mov dx,ax
- call store_classic_instruction_code
- mov ax,dx
- stos word [edi]
- jmp instruction_assembled
- simple_ret:
- inc [base_code]
- call store_classic_instruction_code
- jmp instruction_assembled
-retf_instruction:
- cmp [code_type],64
- jne ret_common
-retf_instruction_64bit:
- call operand_64bit
- jmp ret_common
-retf_instruction_32bit:
- call operand_32bit
- jmp ret_common
-retf_instruction_16bit:
- call operand_16bit
- jmp ret_common
-lea_instruction:
- mov [base_code],8Dh
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor al,al
- xchg al,[operand_size]
- push eax
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- or [operand_flags],1
- call get_address
- pop eax
- mov [operand_size],al
- call operand_autodetect
- jmp instruction_ready
-ls_instruction:
- or al,al
- jz les_instruction
- cmp al,3
- jz lds_instruction
- add al,0B0h
- mov [extended_code],al
- mov [base_code],0Fh
- jmp ls_code_ok
- les_instruction:
- mov [base_code],0C4h
- jmp ls_short_code
- lds_instruction:
- mov [base_code],0C5h
- ls_short_code:
- cmp [code_type],64
- je illegal_instruction
- ls_code_ok:
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- add [operand_size],2
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,4
- je ls_16bit
- cmp al,6
- je ls_32bit
- cmp al,10
- je ls_64bit
- jmp invalid_operand_size
- ls_16bit:
- call operand_16bit
- jmp instruction_ready
- ls_32bit:
- call operand_32bit
- jmp instruction_ready
- ls_64bit:
- call operand_64bit
- jmp instruction_ready
-sh_instruction:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je sh_reg
- cmp al,'['
- jne invalid_operand
- sh_mem:
- call get_address
- push edx ebx ecx
- mov al,[operand_size]
- push eax
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je sh_mem_imm
- cmp al,10h
- jne invalid_operand
- sh_mem_reg:
- lods byte [esi]
- cmp al,11h
- jne invalid_operand
- pop eax ecx ebx edx
- cmp al,1
- je sh_mem_cl_8bit
- jb sh_mem_cl_nosize
- call operand_autodetect
- mov [base_code],0D3h
- jmp instruction_ready
- sh_mem_cl_nosize:
- call recoverable_unknown_size
- sh_mem_cl_8bit:
- mov [base_code],0D2h
- jmp instruction_ready
- sh_mem_imm:
- mov al,[operand_size]
- or al,al
- jz sh_mem_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- sh_mem_imm_size_ok:
- call get_byte_value
- mov byte [value],al
- pop eax ecx ebx edx
- cmp al,1
- je sh_mem_imm_8bit
- jb sh_mem_imm_nosize
- call operand_autodetect
- cmp byte [value],1
- je sh_mem_1
- mov [base_code],0C1h
- call store_instruction_with_imm8
- jmp instruction_assembled
- sh_mem_1:
- mov [base_code],0D1h
- jmp instruction_ready
- sh_mem_imm_nosize:
- call recoverable_unknown_size
- sh_mem_imm_8bit:
- cmp byte [value],1
- je sh_mem_1_8bit
- mov [base_code],0C0h
- call store_instruction_with_imm8
- jmp instruction_assembled
- sh_mem_1_8bit:
- mov [base_code],0D0h
- jmp instruction_ready
- sh_reg:
- lods byte [esi]
- call convert_register
- mov bx,ax
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je sh_reg_imm
- cmp al,10h
- jne invalid_operand
- sh_reg_reg:
- lods byte [esi]
- cmp al,11h
- jne invalid_operand
- mov al,bh
- cmp al,1
- je sh_reg_cl_8bit
- call operand_autodetect
- mov [base_code],0D3h
- jmp nomem_instruction_ready
- sh_reg_cl_8bit:
- mov [base_code],0D2h
- jmp nomem_instruction_ready
- sh_reg_imm:
- mov al,[operand_size]
- or al,al
- jz sh_reg_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- sh_reg_imm_size_ok:
- push ebx
- call get_byte_value
- mov dl,al
- pop ebx
- mov al,bh
- cmp al,1
- je sh_reg_imm_8bit
- call operand_autodetect
- cmp dl,1
- je sh_reg_1
- mov [base_code],0C1h
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- sh_reg_1:
- mov [base_code],0D1h
- jmp nomem_instruction_ready
- sh_reg_imm_8bit:
- cmp dl,1
- je sh_reg_1_8bit
- mov [base_code],0C0h
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- sh_reg_1_8bit:
- mov [base_code],0D0h
- jmp nomem_instruction_ready
-shd_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je shd_reg
- cmp al,'['
- jne invalid_operand
- shd_mem:
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov al,ah
- mov [operand_size],0
- push eax
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je shd_mem_reg_imm
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- cmp al,11h
- jne invalid_operand
- pop eax ecx ebx edx
- call operand_autodetect
- inc [extended_code]
- jmp instruction_ready
- shd_mem_reg_imm:
- mov al,[operand_size]
- or al,al
- jz shd_mem_reg_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- shd_mem_reg_imm_size_ok:
- call get_byte_value
- mov byte [value],al
- pop eax ecx ebx edx
- call operand_autodetect
- call store_instruction_with_imm8
- jmp instruction_assembled
- shd_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov bl,[postbyte_register]
- mov [postbyte_register],al
- mov al,ah
- push eax ebx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je shd_reg_reg_imm
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- cmp al,11h
- jne invalid_operand
- pop ebx eax
- call operand_autodetect
- inc [extended_code]
- jmp nomem_instruction_ready
- shd_reg_reg_imm:
- mov al,[operand_size]
- or al,al
- jz shd_reg_reg_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- shd_reg_reg_imm_size_ok:
- call get_byte_value
- mov dl,al
- pop ebx eax
- call operand_autodetect
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-movx_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- call take_register
- mov [postbyte_register],al
- mov al,ah
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movx_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- pop eax
- mov ah,[operand_size]
- or ah,ah
- jz movx_unknown_size
- cmp ah,al
- jae invalid_operand_size
- cmp ah,1
- je movx_mem_store
- cmp ah,2
- jne invalid_operand_size
- inc [extended_code]
- movx_mem_store:
- call operand_autodetect
- jmp instruction_ready
- movx_unknown_size:
- cmp al,2
- je movx_mem_store
- call recoverable_unknown_size
- jmp movx_mem_store
- movx_reg:
- lods byte [esi]
- call convert_register
- pop ebx
- xchg bl,al
- cmp ah,al
- jae invalid_operand_size
- cmp ah,1
- je movx_reg_8bit
- cmp ah,2
- je movx_reg_16bit
- jmp invalid_operand_size
- movx_reg_8bit:
- call operand_autodetect
- jmp nomem_instruction_ready
- movx_reg_16bit:
- call operand_autodetect
- inc [extended_code]
- jmp nomem_instruction_ready
-movsxd_instruction:
- mov [base_code],al
- call take_register
- mov [postbyte_register],al
- cmp ah,8
- jne invalid_operand_size
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movsxd_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],4
- je movsxd_mem_store
- cmp [operand_size],0
- jne invalid_operand_size
- movsxd_mem_store:
- call operand_64bit
- jmp instruction_ready
- movsxd_reg:
- lods byte [esi]
- call convert_register
- cmp ah,4
- jne invalid_operand_size
- mov bl,al
- call operand_64bit
- jmp nomem_instruction_ready
-bt_instruction:
- mov [postbyte_register],al
- shl al,3
- add al,83h
- mov [extended_code],al
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je bt_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- push eax ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- cmp byte [esi],'('
- je bt_mem_imm
- cmp byte [esi],11h
- jne bt_mem_reg
- cmp byte [esi+2],'('
- je bt_mem_imm
- bt_mem_reg:
- call take_register
- mov [postbyte_register],al
- pop ecx ebx edx
- mov al,ah
- call operand_autodetect
- jmp instruction_ready
- bt_mem_imm:
- xor al,al
- xchg al,[operand_size]
- push eax
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- mov al,[operand_size]
- or al,al
- jz bt_mem_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- bt_mem_imm_size_ok:
- call get_byte_value
- mov byte [value],al
- pop eax
- or al,al
- jz bt_mem_imm_nosize
- call operand_autodetect
- bt_mem_imm_store:
- pop ecx ebx edx
- mov [extended_code],0BAh
- call store_instruction_with_imm8
- jmp instruction_assembled
- bt_mem_imm_nosize:
- call recoverable_unknown_size
- jmp bt_mem_imm_store
- bt_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- cmp byte [esi],'('
- je bt_reg_imm
- cmp byte [esi],11h
- jne bt_reg_reg
- cmp byte [esi+2],'('
- je bt_reg_imm
- bt_reg_reg:
- call take_register
- mov [postbyte_register],al
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
- bt_reg_imm:
- xor al,al
- xchg al,[operand_size]
- push eax ebx
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- mov al,[operand_size]
- or al,al
- jz bt_reg_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- bt_reg_imm_size_ok:
- call get_byte_value
- mov byte [value],al
- pop ebx eax
- call operand_autodetect
- bt_reg_imm_store:
- mov [extended_code],0BAh
- call store_nomem_instruction
- mov al,byte [value]
- stos byte [edi]
- jmp instruction_assembled
-bs_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- call get_reg_mem
- jc bs_reg_reg
- mov al,[operand_size]
- call operand_autodetect
- jmp instruction_ready
- bs_reg_reg:
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
- get_reg_mem:
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je get_reg_reg
- cmp al,'['
- jne invalid_argument
- call get_address
- clc
- ret
- get_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- stc
- ret
-ud_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- call get_reg_mem
- jc ud_reg_reg
- cmp [operand_size],4
- jne invalid_operand_size
- jmp instruction_ready
- ud_reg_reg:
- cmp ah,4
- jne invalid_operand_size
- jmp nomem_instruction_ready
-
-imul_instruction:
- mov [base_code],0F6h
- mov [postbyte_register],5
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je imul_reg
- cmp al,'['
- jne invalid_operand
- imul_mem:
- call get_address
- mov al,[operand_size]
- cmp al,1
- je imul_mem_8bit
- jb imul_mem_nosize
- call operand_autodetect
- inc [base_code]
- jmp instruction_ready
- imul_mem_nosize:
- call recoverable_unknown_size
- imul_mem_8bit:
- jmp instruction_ready
- imul_reg:
- lods byte [esi]
- call convert_register
- cmp byte [esi],','
- je imul_reg_
- mov bl,al
- mov al,ah
- cmp al,1
- je imul_reg_8bit
- call operand_autodetect
- inc [base_code]
- imul_reg_8bit:
- jmp nomem_instruction_ready
- imul_reg_:
- mov [postbyte_register],al
- inc esi
- cmp byte [esi],'('
- je imul_reg_imm
- cmp byte [esi],11h
- jne imul_reg_noimm
- cmp byte [esi+2],'('
- je imul_reg_imm
- imul_reg_noimm:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je imul_reg_reg
- cmp al,'['
- jne invalid_operand
- imul_reg_mem:
- call get_address
- push edx ebx ecx
- cmp byte [esi],','
- je imul_reg_mem_imm
- mov al,[operand_size]
- call operand_autodetect
- pop ecx ebx edx
- mov [base_code],0Fh
- mov [extended_code],0AFh
- jmp instruction_ready
- imul_reg_mem_imm:
- inc esi
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- mov al,[operand_size]
- cmp al,2
- je imul_reg_mem_imm_16bit
- cmp al,4
- je imul_reg_mem_imm_32bit
- cmp al,8
- jne invalid_operand_size
- imul_reg_mem_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp imul_reg_mem_imm_32bit_ok
- imul_reg_mem_imm_16bit:
- call operand_16bit
- call get_word_value
- mov word [value],ax
- cmp [value_type],0
- jne imul_reg_mem_imm_16bit_store
- cmp [size_declared],0
- jne imul_reg_mem_imm_16bit_store
- cmp ax,-80h
- jl imul_reg_mem_imm_16bit_store
- cmp ax,80h
- jl imul_reg_mem_imm_8bit_store
- imul_reg_mem_imm_16bit_store:
- pop ecx ebx edx
- mov [base_code],69h
- call store_instruction_with_imm16
- jmp instruction_assembled
- imul_reg_mem_imm_32bit:
- call operand_32bit
- call get_dword_value
- imul_reg_mem_imm_32bit_ok:
- mov dword [value],eax
- cmp [value_type],0
- jne imul_reg_mem_imm_32bit_store
- cmp [size_declared],0
- jne imul_reg_mem_imm_32bit_store
- cmp eax,-80h
- jl imul_reg_mem_imm_32bit_store
- cmp eax,80h
- jl imul_reg_mem_imm_8bit_store
- imul_reg_mem_imm_32bit_store:
- pop ecx ebx edx
- mov [base_code],69h
- call store_instruction_with_imm32
- jmp instruction_assembled
- imul_reg_mem_imm_8bit_store:
- pop ecx ebx edx
- mov [base_code],6Bh
- call store_instruction_with_imm8
- jmp instruction_assembled
- imul_reg_imm:
- mov bl,[postbyte_register]
- dec esi
- jmp imul_reg_reg_imm
- imul_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- cmp byte [esi],','
- je imul_reg_reg_imm
- mov al,ah
- call operand_autodetect
- mov [base_code],0Fh
- mov [extended_code],0AFh
- jmp nomem_instruction_ready
- imul_reg_reg_imm:
- inc esi
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- mov al,[operand_size]
- cmp al,2
- je imul_reg_reg_imm_16bit
- cmp al,4
- je imul_reg_reg_imm_32bit
- cmp al,8
- jne invalid_operand_size
- imul_reg_reg_imm_64bit:
- cmp [size_declared],0
- jne long_immediate_not_encodable
- call operand_64bit
- push ebx
- call get_simm32
- cmp [value_type],4
- jae long_immediate_not_encodable
- jmp imul_reg_reg_imm_32bit_ok
- imul_reg_reg_imm_16bit:
- call operand_16bit
- push ebx
- call get_word_value
- pop ebx
- mov dx,ax
- cmp [value_type],0
- jne imul_reg_reg_imm_16bit_store
- cmp [size_declared],0
- jne imul_reg_reg_imm_16bit_store
- cmp ax,-80h
- jl imul_reg_reg_imm_16bit_store
- cmp ax,80h
- jl imul_reg_reg_imm_8bit_store
- imul_reg_reg_imm_16bit_store:
- mov [base_code],69h
- call store_nomem_instruction
- mov ax,dx
- call mark_relocation
- stos word [edi]
- jmp instruction_assembled
- imul_reg_reg_imm_32bit:
- call operand_32bit
- push ebx
- call get_dword_value
- imul_reg_reg_imm_32bit_ok:
- pop ebx
- mov edx,eax
- cmp [value_type],0
- jne imul_reg_reg_imm_32bit_store
- cmp [size_declared],0
- jne imul_reg_reg_imm_32bit_store
- cmp eax,-80h
- jl imul_reg_reg_imm_32bit_store
- cmp eax,80h
- jl imul_reg_reg_imm_8bit_store
- imul_reg_reg_imm_32bit_store:
- mov [base_code],69h
- call store_nomem_instruction
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- imul_reg_reg_imm_8bit_store:
- mov [base_code],6Bh
- call store_nomem_instruction
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-in_instruction:
- call take_register
- or al,al
- jnz invalid_operand
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov al,ah
- push eax
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je in_imm
- cmp al,10h
- je in_reg
- jmp invalid_operand
- in_reg:
- lods byte [esi]
- cmp al,22h
- jne invalid_operand
- pop eax
- cmp al,1
- je in_al_dx
- cmp al,2
- je in_ax_dx
- cmp al,4
- jne invalid_operand_size
- in_ax_dx:
- call operand_autodetect
- mov [base_code],0EDh
- call store_classic_instruction_code
- jmp instruction_assembled
- in_al_dx:
- mov al,0ECh
- stos byte [edi]
- jmp instruction_assembled
- in_imm:
- mov al,[operand_size]
- or al,al
- jz in_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- in_imm_size_ok:
- call get_byte_value
- mov dl,al
- pop eax
- cmp al,1
- je in_al_imm
- cmp al,2
- je in_ax_imm
- cmp al,4
- jne invalid_operand_size
- in_ax_imm:
- call operand_autodetect
- mov [base_code],0E5h
- call store_classic_instruction_code
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- in_al_imm:
- mov al,0E4h
- stos byte [edi]
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-out_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'('
- je out_imm
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- cmp al,22h
- jne invalid_operand
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- call take_register
- or al,al
- jnz invalid_operand
- mov al,ah
- cmp al,1
- je out_dx_al
- cmp al,2
- je out_dx_ax
- cmp al,4
- jne invalid_operand_size
- out_dx_ax:
- call operand_autodetect
- mov [base_code],0EFh
- call store_classic_instruction_code
- jmp instruction_assembled
- out_dx_al:
- mov al,0EEh
- stos byte [edi]
- jmp instruction_assembled
- out_imm:
- mov al,[operand_size]
- or al,al
- jz out_imm_size_ok
- cmp al,1
- jne invalid_operand_size
- out_imm_size_ok:
- call get_byte_value
- mov dl,al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- call take_register
- or al,al
- jnz invalid_operand
- mov al,ah
- cmp al,1
- je out_imm_al
- cmp al,2
- je out_imm_ax
- cmp al,4
- jne invalid_operand_size
- out_imm_ax:
- call operand_autodetect
- mov [base_code],0E7h
- call store_classic_instruction_code
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
- out_imm_al:
- mov al,0E6h
- stos byte [edi]
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-
-call_instruction:
- mov [postbyte_register],10b
- mov [base_code],0E8h
- mov [extended_code],9Ah
- jmp process_jmp
-jmp_instruction:
- mov [postbyte_register],100b
- mov [base_code],0E9h
- mov [extended_code],0EAh
- process_jmp:
- lods byte [esi]
- call get_jump_operator
- test [prefix_flags],10h
- jz jmp_type_ok
- test [jump_type],not 2
- jnz illegal_instruction
- mov [jump_type],2
- and [prefix_flags],not 10h
- jmp_type_ok:
- call get_size_operator
- cmp al,'('
- je jmp_imm
- mov [base_code],0FFh
- cmp al,10h
- je jmp_reg
- cmp al,'['
- jne invalid_operand
- jmp_mem:
- cmp [jump_type],1
- je illegal_instruction
- call get_address
- mov edx,eax
- mov al,[operand_size]
- or al,al
- jz jmp_mem_size_not_specified
- cmp al,2
- je jmp_mem_16bit
- cmp al,4
- je jmp_mem_32bit
- cmp al,6
- je jmp_mem_48bit
- cmp al,8
- je jmp_mem_64bit
- cmp al,10
- je jmp_mem_80bit
- jmp invalid_operand_size
- jmp_mem_size_not_specified:
- cmp [jump_type],3
- je jmp_mem_far
- cmp [jump_type],2
- je jmp_mem_near
- call recoverable_unknown_size
- jmp_mem_near:
- cmp [code_type],16
- je jmp_mem_16bit
- cmp [code_type],32
- je jmp_mem_near_32bit
- jmp_mem_64bit:
- cmp [jump_type],3
- je invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- jmp instruction_ready
- jmp_mem_far:
- cmp [code_type],16
- je jmp_mem_far_32bit
- jmp_mem_48bit:
- call operand_32bit
- jmp_mem_far_store:
- cmp [jump_type],2
- je invalid_operand_size
- inc [postbyte_register]
- jmp instruction_ready
- jmp_mem_80bit:
- call operand_64bit
- jmp jmp_mem_far_store
- jmp_mem_far_32bit:
- call operand_16bit
- jmp jmp_mem_far_store
- jmp_mem_32bit:
- cmp [jump_type],3
- je jmp_mem_far_32bit
- cmp [jump_type],2
- je jmp_mem_near_32bit
- cmp [code_type],16
- je jmp_mem_far_32bit
- jmp_mem_near_32bit:
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp instruction_ready
- jmp_mem_16bit:
- cmp [jump_type],3
- je invalid_operand_size
- call operand_16bit
- jmp instruction_ready
- jmp_reg:
- test [jump_type],1
- jnz invalid_operand
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- cmp al,2
- je jmp_reg_16bit
- cmp al,4
- je jmp_reg_32bit
- cmp al,8
- jne invalid_operand_size
- jmp_reg_64bit:
- cmp [code_type],64
- jne illegal_instruction
- jmp nomem_instruction_ready
- jmp_reg_32bit:
- cmp [code_type],64
- je illegal_instruction
- call operand_32bit
- jmp nomem_instruction_ready
- jmp_reg_16bit:
- call operand_16bit
- jmp nomem_instruction_ready
- jmp_imm:
- cmp byte [esi],'.'
- je invalid_value
- mov ebx,esi
- dec esi
- call skip_symbol
- xchg esi,ebx
- cmp byte [ebx],':'
- je jmp_far
- cmp [jump_type],3
- je invalid_operand
- jmp_near:
- mov al,[operand_size]
- cmp al,2
- je jmp_imm_16bit
- cmp al,4
- je jmp_imm_32bit
- cmp al,8
- je jmp_imm_64bit
- or al,al
- jnz invalid_operand_size
- cmp [code_type],16
- je jmp_imm_16bit
- cmp [code_type],64
- je jmp_imm_64bit
- jmp_imm_32bit:
- cmp [code_type],64
- je invalid_operand_size
- call get_address_dword_value
- cmp [code_type],16
- jne jmp_imm_32bit_prefix_ok
- mov byte [edi],66h
- inc edi
- jmp_imm_32bit_prefix_ok:
- call calculate_jump_offset
- cdq
- call check_for_short_jump
- jc jmp_short
- jmp_imm_32bit_store:
- mov edx,eax
- sub edx,3
- jno jmp_imm_32bit_ok
- cmp [code_type],64
- je jump_out_of_range
- jmp_imm_32bit_ok:
- mov al,[base_code]
- stos byte [edi]
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- jmp_imm_64bit:
- cmp [code_type],64
- jne invalid_operand_size
- call get_address_qword_value
- call calculate_jump_offset
- mov ecx,edx
- cdq
- cmp edx,ecx
- jne jump_out_of_range
- call check_for_short_jump
- jnc jmp_imm_32bit_store
- jmp_short:
- mov ah,al
- mov al,0EBh
- stos word [edi]
- jmp instruction_assembled
- jmp_imm_16bit:
- call get_address_word_value
- cmp [code_type],16
- je jmp_imm_16bit_prefix_ok
- mov byte [edi],66h
- inc edi
- jmp_imm_16bit_prefix_ok:
- call calculate_jump_offset
- cwde
- cdq
- call check_for_short_jump
- jc jmp_short
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,eax
- dec edx
- mov al,[base_code]
- stos byte [edi]
- mov eax,edx
- stos word [edi]
- jmp instruction_assembled
- calculate_jump_offset:
- add edi,2
- mov ebp,[addressing_space]
- call calculate_relative_offset
- sub edi,2
- ret
- check_for_short_jump:
- cmp [jump_type],1
- je forced_short
- ja no_short_jump
- cmp [base_code],0E8h
- je no_short_jump
- cmp [value_type],0
- jne no_short_jump
- cmp eax,80h
- jb short_jump
- cmp eax,-80h
- jae short_jump
- no_short_jump:
- clc
- ret
- forced_short:
- cmp [base_code],0E8h
- je illegal_instruction
- cmp [next_pass_needed],0
- jne jmp_short_value_type_ok
- cmp [value_type],0
- jne invalid_use_of_symbol
- jmp_short_value_type_ok:
- cmp eax,-80h
- jae short_jump
- cmp eax,80h
- jae jump_out_of_range
- short_jump:
- stc
- ret
- jump_out_of_range:
- cmp [error_line],0
- jne instruction_assembled
- mov eax,[current_line]
- mov [error_line],eax
- mov [error],relative_jump_out_of_range
- jmp instruction_assembled
- jmp_far:
- cmp [jump_type],2
- je invalid_operand
- cmp [code_type],64
- je illegal_instruction
- mov al,[extended_code]
- mov [base_code],al
- call get_word_value
- push eax
- inc esi
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[value_type]
- push eax
- push [symbol_identifier]
- cmp byte [esi],'.'
- je invalid_value
- mov al,[operand_size]
- cmp al,4
- je jmp_far_16bit
- cmp al,6
- je jmp_far_32bit
- or al,al
- jnz invalid_operand_size
- cmp [code_type],16
- jne jmp_far_32bit
- jmp_far_16bit:
- call get_word_value
- mov ebx,eax
- call operand_16bit
- call store_classic_instruction_code
- mov ax,bx
- call mark_relocation
- stos word [edi]
- jmp_far_segment:
- pop [symbol_identifier]
- pop eax
- mov [value_type],al
- pop eax
- call mark_relocation
- stos word [edi]
- jmp instruction_assembled
- jmp_far_32bit:
- call get_dword_value
- mov ebx,eax
- call operand_32bit
- call store_classic_instruction_code
- mov eax,ebx
- call mark_relocation
- stos dword [edi]
- jmp jmp_far_segment
-conditional_jump:
- mov [base_code],al
- and [prefix_flags],not 10h
- lods byte [esi]
- call get_jump_operator
- cmp [jump_type],3
- je invalid_operand
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- cmp byte [esi],'.'
- je invalid_value
- mov al,[operand_size]
- cmp al,2
- je conditional_jump_16bit
- cmp al,4
- je conditional_jump_32bit
- cmp al,8
- je conditional_jump_64bit
- or al,al
- jnz invalid_operand_size
- cmp [code_type],16
- je conditional_jump_16bit
- cmp [code_type],64
- je conditional_jump_64bit
- conditional_jump_32bit:
- cmp [code_type],64
- je invalid_operand_size
- call get_address_dword_value
- cmp [code_type],16
- jne conditional_jump_32bit_prefix_ok
- mov byte [edi],66h
- inc edi
- conditional_jump_32bit_prefix_ok:
- call calculate_jump_offset
- cdq
- call check_for_short_jump
- jc conditional_jump_short
- conditional_jump_32bit_store:
- mov edx,eax
- sub edx,4
- jno conditional_jump_32bit_range_ok
- cmp [code_type],64
- je jump_out_of_range
- conditional_jump_32bit_range_ok:
- mov ah,[base_code]
- add ah,10h
- mov al,0Fh
- stos word [edi]
- mov eax,edx
- call mark_relocation
- stos dword [edi]
- jmp instruction_assembled
- conditional_jump_64bit:
- cmp [code_type],64
- jne invalid_operand_size
- call get_address_qword_value
- call calculate_jump_offset
- mov ecx,edx
- cdq
- cmp edx,ecx
- jne jump_out_of_range
- call check_for_short_jump
- jnc conditional_jump_32bit_store
- conditional_jump_short:
- mov ah,al
- mov al,[base_code]
- stos word [edi]
- jmp instruction_assembled
- conditional_jump_16bit:
- call get_address_word_value
- cmp [code_type],16
- je conditional_jump_16bit_prefix_ok
- mov byte [edi],66h
- inc edi
- conditional_jump_16bit_prefix_ok:
- call calculate_jump_offset
- cwde
- cdq
- call check_for_short_jump
- jc conditional_jump_short
- cmp [value_type],0
- jne invalid_use_of_symbol
- mov edx,eax
- sub dx,2
- mov ah,[base_code]
- add ah,10h
- mov al,0Fh
- stos word [edi]
- mov eax,edx
- stos word [edi]
- jmp instruction_assembled
-loop_instruction_16bit:
- cmp [code_type],64
- je illegal_instruction
- cmp [code_type],16
- je loop_instruction
- mov [operand_prefix],67h
- jmp loop_instruction
-loop_instruction_32bit:
- cmp [code_type],32
- je loop_instruction
- mov [operand_prefix],67h
- jmp loop_instruction
-loop_instruction_64bit:
- cmp [code_type],64
- jne illegal_instruction
-loop_instruction:
- mov [base_code],al
- lods byte [esi]
- call get_jump_operator
- cmp [jump_type],1
- ja invalid_operand
- call get_size_operator
- cmp al,'('
- jne invalid_operand
- cmp byte [esi],'.'
- je invalid_value
- mov al,[operand_size]
- cmp al,2
- je loop_jump_16bit
- cmp al,4
- je loop_jump_32bit
- cmp al,8
- je loop_jump_64bit
- or al,al
- jnz invalid_operand_size
- cmp [code_type],16
- je loop_jump_16bit
- cmp [code_type],64
- je loop_jump_64bit
- loop_jump_32bit:
- cmp [code_type],64
- je invalid_operand_size
- call get_address_dword_value
- cmp [code_type],16
- jne loop_jump_32bit_prefix_ok
- mov byte [edi],66h
- inc edi
- loop_jump_32bit_prefix_ok:
- call loop_counter_size
- call calculate_jump_offset
- cdq
- make_loop_jump:
- call check_for_short_jump
- jc conditional_jump_short
- scas word [edi]
- jmp jump_out_of_range
- loop_counter_size:
- cmp [operand_prefix],0
- je loop_counter_size_ok
- push eax
- mov al,[operand_prefix]
- stos byte [edi]
- pop eax
- loop_counter_size_ok:
- ret
- loop_jump_64bit:
- cmp [code_type],64
- jne invalid_operand_size
- call get_address_qword_value
- call loop_counter_size
- call calculate_jump_offset
- mov ecx,edx
- cdq
- cmp edx,ecx
- jne jump_out_of_range
- jmp make_loop_jump
- loop_jump_16bit:
- call get_address_word_value
- cmp [code_type],16
- je loop_jump_16bit_prefix_ok
- mov byte [edi],66h
- inc edi
- loop_jump_16bit_prefix_ok:
- call loop_counter_size
- call calculate_jump_offset
- cwde
- cdq
- jmp make_loop_jump
-
-movs_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp [segment_register],1
- ja invalid_address
- push ebx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- pop edx
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- mov al,dh
- mov ah,bh
- shr al,4
- shr ah,4
- cmp al,ah
- jne address_sizes_do_not_agree
- and bh,111b
- and dh,111b
- cmp bh,6
- jne invalid_address
- cmp dh,7
- jne invalid_address
- cmp al,2
- je movs_address_16bit
- cmp al,4
- je movs_address_32bit
- cmp [code_type],64
- jne invalid_address_size
- jmp movs_store
- movs_address_32bit:
- call address_32bit_prefix
- jmp movs_store
- movs_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- movs_store:
- xor ebx,ebx
- call store_segment_prefix_if_necessary
- mov al,0A4h
- movs_check_size:
- mov bl,[operand_size]
- cmp bl,1
- je simple_instruction
- inc al
- cmp bl,2
- je simple_instruction_16bit
- cmp bl,4
- je simple_instruction_32bit
- cmp bl,8
- je simple_instruction_64bit
- or bl,bl
- jnz invalid_operand_size
- call recoverable_unknown_size
- jmp simple_instruction
-lods_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp bh,26h
- je lods_address_16bit
- cmp bh,46h
- je lods_address_32bit
- cmp bh,86h
- jne invalid_address
- cmp [code_type],64
- jne invalid_address_size
- jmp lods_store
- lods_address_32bit:
- call address_32bit_prefix
- jmp lods_store
- lods_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- lods_store:
- xor ebx,ebx
- call store_segment_prefix_if_necessary
- mov al,0ACh
- jmp movs_check_size
-stos_instruction:
- mov [base_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp bh,27h
- je stos_address_16bit
- cmp bh,47h
- je stos_address_32bit
- cmp bh,87h
- jne invalid_address
- cmp [code_type],64
- jne invalid_address_size
- jmp stos_store
- stos_address_32bit:
- call address_32bit_prefix
- jmp stos_store
- stos_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- stos_store:
- cmp [segment_register],1
- ja invalid_address
- mov al,[base_code]
- jmp movs_check_size
-cmps_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- mov al,[segment_register]
- push eax ebx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- pop edx eax
- cmp [segment_register],1
- ja invalid_address
- mov [segment_register],al
- mov al,dh
- mov ah,bh
- shr al,4
- shr ah,4
- cmp al,ah
- jne address_sizes_do_not_agree
- and bh,111b
- and dh,111b
- cmp bh,7
- jne invalid_address
- cmp dh,6
- jne invalid_address
- cmp al,2
- je cmps_address_16bit
- cmp al,4
- je cmps_address_32bit
- cmp [code_type],64
- jne invalid_address_size
- jmp cmps_store
- cmps_address_32bit:
- call address_32bit_prefix
- jmp cmps_store
- cmps_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- cmps_store:
- xor ebx,ebx
- call store_segment_prefix_if_necessary
- mov al,0A6h
- jmp movs_check_size
-ins_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp bh,27h
- je ins_address_16bit
- cmp bh,47h
- je ins_address_32bit
- cmp bh,87h
- jne invalid_address
- cmp [code_type],64
- jne invalid_address_size
- jmp ins_store
- ins_address_32bit:
- call address_32bit_prefix
- jmp ins_store
- ins_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- ins_store:
- cmp [segment_register],1
- ja invalid_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- cmp al,22h
- jne invalid_operand
- mov al,6Ch
- ins_check_size:
- cmp [operand_size],8
- jne movs_check_size
- jmp invalid_operand_size
-outs_instruction:
- lods byte [esi]
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- cmp al,22h
- jne invalid_operand
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp bh,26h
- je outs_address_16bit
- cmp bh,46h
- je outs_address_32bit
- cmp bh,86h
- jne invalid_address
- cmp [code_type],64
- jne invalid_address_size
- jmp outs_store
- outs_address_32bit:
- call address_32bit_prefix
- jmp outs_store
- outs_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- outs_store:
- xor ebx,ebx
- call store_segment_prefix_if_necessary
- mov al,6Eh
- jmp ins_check_size
-xlat_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- or eax,eax
- jnz invalid_address
- or bl,ch
- jnz invalid_address
- cmp bh,23h
- je xlat_address_16bit
- cmp bh,43h
- je xlat_address_32bit
- cmp bh,83h
- jne invalid_address
- cmp [code_type],64
- jne invalid_address_size
- jmp xlat_store
- xlat_address_32bit:
- call address_32bit_prefix
- jmp xlat_store
- xlat_address_16bit:
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- xlat_store:
- call store_segment_prefix_if_necessary
- mov al,0D7h
- cmp [operand_size],1
- jbe simple_instruction
- jmp invalid_operand_size
-
-pm_word_instruction:
- mov ah,al
- shr ah,4
- and al,111b
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pm_reg
- pm_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,2
- je pm_mem_store
- or al,al
- jnz invalid_operand_size
- pm_mem_store:
- jmp instruction_ready
- pm_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- cmp ah,2
- jne invalid_operand_size
- jmp nomem_instruction_ready
-pm_store_word_instruction:
- mov ah,al
- shr ah,4
- and al,111b
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne pm_mem
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
-lgdt_instruction:
- mov [base_code],0Fh
- mov [extended_code],1
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,6
- je lgdt_mem_48bit
- cmp al,10
- je lgdt_mem_80bit
- or al,al
- jnz invalid_operand_size
- jmp lgdt_mem_store
- lgdt_mem_80bit:
- cmp [code_type],64
- jne illegal_instruction
- jmp lgdt_mem_store
- lgdt_mem_48bit:
- cmp [code_type],64
- je illegal_instruction
- cmp [postbyte_register],2
- jb lgdt_mem_store
- call operand_32bit
- lgdt_mem_store:
- jmp instruction_ready
-lar_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- xor al,al
- xchg al,[operand_size]
- call operand_autodetect
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je lar_reg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz lar_reg_mem
- cmp al,2
- jne invalid_operand_size
- lar_reg_mem:
- jmp instruction_ready
- lar_reg_reg:
- lods byte [esi]
- call convert_register
- cmp ah,2
- jne invalid_operand_size
- mov bl,al
- jmp nomem_instruction_ready
-invlpg_instruction:
- mov [base_code],0Fh
- mov [extended_code],1
- mov [postbyte_register],7
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp instruction_ready
-simple_instruction_f2_0f_01:
- mov byte [edi],0F2h
- inc edi
- jmp simple_instruction_0f_01
-simple_instruction_f3_0f_01:
- mov byte [edi],0F3h
- inc edi
- jmp simple_instruction_0f_01
-swapgs_instruction:
- cmp [code_type],64
- jne illegal_instruction
-simple_instruction_0f_01:
- mov ah,al
- mov al,0Fh
- stos byte [edi]
- mov al,1
- stos word [edi]
- jmp instruction_assembled
-
-basic_486_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je basic_486_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- pop ecx ebx edx
- mov al,ah
- cmp al,1
- je basic_486_mem_reg_8bit
- call operand_autodetect
- inc [extended_code]
- basic_486_mem_reg_8bit:
- jmp instruction_ready
- basic_486_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov bl,al
- xchg bl,[postbyte_register]
- mov al,ah
- cmp al,1
- je basic_486_reg_reg_8bit
- call operand_autodetect
- inc [extended_code]
- basic_486_reg_reg_8bit:
- jmp nomem_instruction_ready
-bswap_instruction:
- call take_register
- test al,1000b
- jz bswap_reg_code_ok
- or [rex_prefix],41h
- and al,111b
- bswap_reg_code_ok:
- add al,0C8h
- mov [extended_code],al
- mov [base_code],0Fh
- cmp ah,8
- je bswap_reg64
- cmp ah,4
- jne invalid_operand_size
- call operand_32bit
- call store_classic_instruction_code
- jmp instruction_assembled
- bswap_reg64:
- call operand_64bit
- call store_classic_instruction_code
- jmp instruction_assembled
-cmpxchgx_instruction:
- mov [base_code],0Fh
- mov [extended_code],0C7h
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov ah,1
- xchg [postbyte_register],ah
- mov al,[operand_size]
- or al,al
- jz cmpxchgx_size_ok
- cmp al,ah
- jne invalid_operand_size
- cmpxchgx_size_ok:
- cmp ah,16
- jne cmpxchgx_store
- call operand_64bit
- cmpxchgx_store:
- jmp instruction_ready
-nop_instruction:
- mov ah,[esi]
- cmp ah,10h
- je extended_nop
- cmp ah,11h
- je extended_nop
- cmp ah,'['
- je extended_nop
- stos byte [edi]
- jmp instruction_assembled
- extended_nop:
- mov [base_code],0Fh
- mov [extended_code],1Fh
- mov [postbyte_register],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je extended_nop_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz extended_nop_store
- call operand_autodetect
- extended_nop_store:
- jmp instruction_ready
- extended_nop_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
-
-basic_fpu_instruction:
- mov [postbyte_register],al
- mov [base_code],0D8h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je basic_fpu_streg
- cmp al,'['
- je basic_fpu_mem
- dec esi
- mov ah,[postbyte_register]
- cmp ah,2
- jb invalid_operand
- cmp ah,3
- ja invalid_operand
- mov bl,1
- jmp nomem_instruction_ready
- basic_fpu_mem:
- call get_address
- mov al,[operand_size]
- cmp al,4
- je basic_fpu_mem_32bit
- cmp al,8
- je basic_fpu_mem_64bit
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- basic_fpu_mem_32bit:
- jmp instruction_ready
- basic_fpu_mem_64bit:
- mov [base_code],0DCh
- jmp instruction_ready
- basic_fpu_streg:
- lods byte [esi]
- call convert_fpu_register
- mov bl,al
- mov ah,[postbyte_register]
- cmp ah,2
- je basic_fpu_single_streg
- cmp ah,3
- je basic_fpu_single_streg
- or al,al
- jz basic_fpu_st0
- test ah,110b
- jz basic_fpu_streg_st0
- xor [postbyte_register],1
- basic_fpu_streg_st0:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_fpu_register
- or al,al
- jnz invalid_operand
- mov [base_code],0DCh
- jmp nomem_instruction_ready
- basic_fpu_st0:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_fpu_register
- mov bl,al
- basic_fpu_single_streg:
- mov [base_code],0D8h
- jmp nomem_instruction_ready
-simple_fpu_instruction:
- mov ah,al
- or ah,11000000b
- mov al,0D9h
- stos word [edi]
- jmp instruction_assembled
-fi_instruction:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,2
- je fi_mem_16bit
- cmp al,4
- je fi_mem_32bit
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- fi_mem_32bit:
- mov [base_code],0DAh
- jmp instruction_ready
- fi_mem_16bit:
- mov [base_code],0DEh
- jmp instruction_ready
-fld_instruction:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je fld_streg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,4
- je fld_mem_32bit
- cmp al,8
- je fld_mem_64bit
- cmp al,10
- je fld_mem_80bit
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- fld_mem_32bit:
- mov [base_code],0D9h
- jmp instruction_ready
- fld_mem_64bit:
- mov [base_code],0DDh
- jmp instruction_ready
- fld_mem_80bit:
- mov al,[postbyte_register]
- cmp al,0
- je fld_mem_80bit_store
- dec [postbyte_register]
- cmp al,3
- je fld_mem_80bit_store
- jmp invalid_operand_size
- fld_mem_80bit_store:
- add [postbyte_register],5
- mov [base_code],0DBh
- jmp instruction_ready
- fld_streg:
- lods byte [esi]
- call convert_fpu_register
- mov bl,al
- cmp [postbyte_register],2
- jae fst_streg
- mov [base_code],0D9h
- jmp nomem_instruction_ready
- fst_streg:
- mov [base_code],0DDh
- jmp nomem_instruction_ready
-fild_instruction:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,2
- je fild_mem_16bit
- cmp al,4
- je fild_mem_32bit
- cmp al,8
- je fild_mem_64bit
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- fild_mem_32bit:
- mov [base_code],0DBh
- jmp instruction_ready
- fild_mem_16bit:
- mov [base_code],0DFh
- jmp instruction_ready
- fild_mem_64bit:
- mov al,[postbyte_register]
- cmp al,1
- je fisttp_64bit_store
- jb fild_mem_64bit_store
- dec [postbyte_register]
- cmp al,3
- je fild_mem_64bit_store
- jmp invalid_operand_size
- fild_mem_64bit_store:
- add [postbyte_register],5
- mov [base_code],0DFh
- jmp instruction_ready
- fisttp_64bit_store:
- mov [base_code],0DDh
- jmp instruction_ready
-fbld_instruction:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz fbld_mem_80bit
- cmp al,10
- je fbld_mem_80bit
- jmp invalid_operand_size
- fbld_mem_80bit:
- mov [base_code],0DFh
- jmp instruction_ready
-faddp_instruction:
- mov [postbyte_register],al
- mov [base_code],0DEh
- mov edx,esi
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je faddp_streg
- mov esi,edx
- mov bl,1
- jmp nomem_instruction_ready
- faddp_streg:
- lods byte [esi]
- call convert_fpu_register
- mov bl,al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_fpu_register
- or al,al
- jnz invalid_operand
- jmp nomem_instruction_ready
-fcompp_instruction:
- mov ax,0D9DEh
- stos word [edi]
- jmp instruction_assembled
-fucompp_instruction:
- mov ax,0E9DAh
- stos word [edi]
- jmp instruction_assembled
-fxch_instruction:
- mov dx,01D9h
- jmp fpu_single_operand
-ffreep_instruction:
- mov dx,00DFh
- jmp fpu_single_operand
-ffree_instruction:
- mov dl,0DDh
- mov dh,al
- fpu_single_operand:
- mov ebx,esi
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je fpu_streg
- or dh,dh
- jz invalid_operand
- mov esi,ebx
- shl dh,3
- or dh,11000001b
- mov ax,dx
- stos word [edi]
- jmp instruction_assembled
- fpu_streg:
- lods byte [esi]
- call convert_fpu_register
- shl dh,3
- or dh,al
- or dh,11000000b
- mov ax,dx
- stos word [edi]
- jmp instruction_assembled
-
-fstenv_instruction:
- mov byte [edi],9Bh
- inc edi
-fldenv_instruction:
- mov [base_code],0D9h
- jmp fpu_mem
-fstenv_instruction_16bit:
- mov byte [edi],9Bh
- inc edi
-fldenv_instruction_16bit:
- call operand_16bit
- jmp fldenv_instruction
-fstenv_instruction_32bit:
- mov byte [edi],9Bh
- inc edi
-fldenv_instruction_32bit:
- call operand_32bit
- jmp fldenv_instruction
-fsave_instruction_32bit:
- mov byte [edi],9Bh
- inc edi
-fnsave_instruction_32bit:
- call operand_32bit
- jmp fnsave_instruction
-fsave_instruction_16bit:
- mov byte [edi],9Bh
- inc edi
-fnsave_instruction_16bit:
- call operand_16bit
- jmp fnsave_instruction
-fsave_instruction:
- mov byte [edi],9Bh
- inc edi
-fnsave_instruction:
- mov [base_code],0DDh
- fpu_mem:
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- jne invalid_operand_size
- jmp instruction_ready
-fstcw_instruction:
- mov byte [edi],9Bh
- inc edi
-fldcw_instruction:
- mov [postbyte_register],al
- mov [base_code],0D9h
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz fldcw_mem_16bit
- cmp al,2
- je fldcw_mem_16bit
- jmp invalid_operand_size
- fldcw_mem_16bit:
- jmp instruction_ready
-fstsw_instruction:
- mov al,9Bh
- stos byte [edi]
-fnstsw_instruction:
- mov [base_code],0DDh
- mov [postbyte_register],7
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je fstsw_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz fstsw_mem_16bit
- cmp al,2
- je fstsw_mem_16bit
- jmp invalid_operand_size
- fstsw_mem_16bit:
- jmp instruction_ready
- fstsw_reg:
- lods byte [esi]
- call convert_register
- cmp ax,0200h
- jne invalid_operand
- mov ax,0E0DFh
- stos word [edi]
- jmp instruction_assembled
-finit_instruction:
- mov byte [edi],9Bh
- inc edi
-fninit_instruction:
- mov ah,al
- mov al,0DBh
- stos word [edi]
- jmp instruction_assembled
-fcmov_instruction:
- mov dh,0DAh
- jmp fcomi_streg
-fcomi_instruction:
- mov dh,0DBh
- jmp fcomi_streg
-fcomip_instruction:
- mov dh,0DFh
- fcomi_streg:
- mov dl,al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_fpu_register
- mov ah,al
- cmp byte [esi],','
- je fcomi_st0_streg
- add ah,dl
- mov al,dh
- stos word [edi]
- jmp instruction_assembled
- fcomi_st0_streg:
- or ah,ah
- jnz invalid_operand
- inc esi
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_fpu_register
- mov ah,al
- add ah,dl
- mov al,dh
- stos word [edi]
- jmp instruction_assembled
-
-basic_mmx_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- mmx_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- call make_mmx_prefix
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je mmx_mmreg_mmreg
- cmp al,'['
- jne invalid_operand
- mmx_mmreg_mem:
- call get_address
- jmp instruction_ready
- mmx_mmreg_mmreg:
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- jmp nomem_instruction_ready
-mmx_bit_shift_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- call make_mmx_prefix
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je mmx_mmreg_mmreg
- cmp al,'('
- je mmx_ps_mmreg_imm8
- cmp al,'['
- je mmx_mmreg_mem
- jmp invalid_operand
- mmx_ps_mmreg_imm8:
- call get_byte_value
- mov byte [value],al
- test [operand_size],not 1
- jnz invalid_value
- mov bl,[extended_code]
- mov al,bl
- shr bl,4
- and al,1111b
- add al,70h
- mov [extended_code],al
- sub bl,0Ch
- shl bl,1
- xchg bl,[postbyte_register]
- call store_nomem_instruction
- mov al,byte [value]
- stos byte [edi]
- jmp instruction_assembled
-pmovmskb_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- call take_register
- cmp ah,4
- je pmovmskb_reg_size_ok
- cmp [code_type],64
- jne invalid_operand_size
- cmp ah,8
- jnz invalid_operand_size
- pmovmskb_reg_size_ok:
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- call make_mmx_prefix
- cmp [extended_code],0C5h
- je mmx_nomem_imm8
- jmp nomem_instruction_ready
- mmx_imm8:
- push ebx ecx edx
- xor cl,cl
- xchg cl,[operand_size]
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- test ah,not 1
- jnz invalid_operand_size
- mov [operand_size],cl
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- mov byte [value],al
- pop edx ecx ebx
- call store_instruction_with_imm8
- jmp instruction_assembled
- mmx_nomem_imm8:
- call store_nomem_instruction
- call append_imm8
- jmp instruction_assembled
- append_imm8:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- test ah,not 1
- jnz invalid_operand_size
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- stosb
- ret
-pinsrw_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- call make_mmx_prefix
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pinsrw_mmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je mmx_imm8
- cmp [operand_size],2
- jne invalid_operand_size
- jmp mmx_imm8
- pinsrw_mmreg_reg:
- lods byte [esi]
- call convert_register
- cmp ah,4
- jne invalid_operand_size
- mov bl,al
- jmp mmx_nomem_imm8
-pshufw_instruction:
- mov [mmx_size],8
- mov [opcode_prefix],al
- jmp pshuf_instruction
-pshufd_instruction:
- mov [mmx_size],16
- mov [opcode_prefix],al
- pshuf_instruction:
- mov [base_code],0Fh
- mov [extended_code],70h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pshuf_mmreg_mmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp mmx_imm8
- pshuf_mmreg_mmreg:
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- jmp mmx_nomem_imm8
-movd_instruction:
- mov [base_code],0Fh
- mov [extended_code],7Eh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movd_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- test [operand_size],not 4
- jnz invalid_operand_size
- call get_mmx_source_register
- jmp instruction_ready
- movd_reg:
- lods byte [esi]
- cmp al,0B0h
- jae movd_mmreg
- call convert_register
- cmp ah,4
- jne invalid_operand_size
- mov bl,al
- call get_mmx_source_register
- jmp nomem_instruction_ready
- movd_mmreg:
- mov [extended_code],6Eh
- call convert_mmx_register
- mov [postbyte_register],al
- call make_mmx_prefix
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movd_mmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- test [operand_size],not 4
- jnz invalid_operand_size
- jmp instruction_ready
- movd_mmreg_reg:
- lods byte [esi]
- call convert_register
- cmp ah,4
- jne invalid_operand_size
- mov bl,al
- jmp nomem_instruction_ready
- get_mmx_source_register:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- mov [postbyte_register],al
- make_mmx_prefix:
- cmp [operand_size],16
- jne no_mmx_prefix
- mov [operand_prefix],66h
- no_mmx_prefix:
- ret
-movq_instruction:
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movq_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- test [operand_size],not 8
- jnz invalid_operand_size
- call get_mmx_source_register
- mov al,7Fh
- cmp ah,8
- je movq_mem_ready
- mov al,0D6h
- movq_mem_ready:
- mov [extended_code],al
- jmp instruction_ready
- movq_reg:
- lods byte [esi]
- cmp al,0B0h
- jae movq_mmreg
- call convert_register
- cmp ah,8
- jne invalid_operand_size
- mov bl,al
- mov [extended_code],7Eh
- call operand_64bit
- call get_mmx_source_register
- jmp nomem_instruction_ready
- movq_mmreg:
- call convert_mmx_register
- mov [postbyte_register],al
- mov [extended_code],6Fh
- mov [mmx_size],ah
- cmp ah,16
- jne movq_mmreg_
- mov [extended_code],7Eh
- mov [opcode_prefix],0F3h
- movq_mmreg_:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movq_mmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- test [operand_size],not 8
- jnz invalid_operand_size
- jmp instruction_ready
- movq_mmreg_reg:
- lods byte [esi]
- cmp al,0B0h
- jae movq_mmreg_mmreg
- mov [operand_size],0
- call convert_register
- cmp ah,8
- jne invalid_operand_size
- mov [extended_code],6Eh
- mov [opcode_prefix],0
- mov bl,al
- cmp [mmx_size],16
- jne movq_mmreg_reg_store
- mov [opcode_prefix],66h
- movq_mmreg_reg_store:
- call operand_64bit
- jmp nomem_instruction_ready
- movq_mmreg_mmreg:
- call convert_mmx_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov bl,al
- jmp nomem_instruction_ready
-movdq_instruction:
- mov [opcode_prefix],al
- mov [base_code],0Fh
- mov [extended_code],6Fh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movdq_mmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [extended_code],7Fh
- jmp instruction_ready
- movdq_mmreg:
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je movdq_mmreg_mmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp instruction_ready
- movdq_mmreg_mmreg:
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- jmp nomem_instruction_ready
-lddqu_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- pop eax
- mov [postbyte_register],al
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],0F0h
- jmp instruction_ready
-
-movdq2q_instruction:
- mov [opcode_prefix],0F2h
- mov [mmx_size],8
- jmp movq2dq_
-movq2dq_instruction:
- mov [opcode_prefix],0F3h
- mov [mmx_size],16
- movq2dq_:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- xor [mmx_size],8+16
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov bl,al
- mov [base_code],0Fh
- mov [extended_code],0D6h
- jmp nomem_instruction_ready
-
-sse_ps_instruction_imm8:
- mov [immediate_size],1
-sse_ps_instruction:
- mov [mmx_size],16
- jmp sse_instruction
-sse_pd_instruction_imm8:
- mov [immediate_size],1
-sse_pd_instruction:
- mov [mmx_size],16
- mov [opcode_prefix],66h
- jmp sse_instruction
-sse_ss_instruction:
- mov [mmx_size],4
- mov [opcode_prefix],0F3h
- jmp sse_instruction
-sse_sd_instruction:
- mov [mmx_size],8
- mov [opcode_prefix],0F2h
- jmp sse_instruction
-cmp_pd_instruction:
- mov [opcode_prefix],66h
-cmp_ps_instruction:
- mov [mmx_size],16
- mov byte [value],al
- mov al,0C2h
- jmp sse_instruction
-cmp_ss_instruction:
- mov [mmx_size],4
- mov [opcode_prefix],0F3h
- jmp cmp_sx_instruction
-cmpsd_instruction:
- mov al,0A7h
- mov ah,[esi]
- or ah,ah
- jz simple_instruction_32bit
- cmp ah,0Fh
- je simple_instruction_32bit
- mov al,-1
-cmp_sd_instruction:
- mov [mmx_size],8
- mov [opcode_prefix],0F2h
- cmp_sx_instruction:
- mov byte [value],al
- mov al,0C2h
- jmp sse_instruction
-comiss_instruction:
- mov [mmx_size],4
- jmp sse_instruction
-comisd_instruction:
- mov [mmx_size],8
- mov [opcode_prefix],66h
- jmp sse_instruction
-cvtdq2pd_instruction:
- mov [opcode_prefix],0F3h
-cvtps2pd_instruction:
- mov [mmx_size],8
- jmp sse_instruction
-cvtpd2dq_instruction:
- mov [mmx_size],16
- mov [opcode_prefix],0F2h
- jmp sse_instruction
-movshdup_instruction:
- mov [mmx_size],16
- mov [opcode_prefix],0F3h
-sse_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- sse_xmmreg:
- lods byte [esi]
- call convert_xmm_register
- sse_reg:
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je sse_xmmreg_xmmreg
- sse_reg_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je sse_mem_size_ok
- mov al,[mmx_size]
- cmp [operand_size],al
- jne invalid_operand_size
- sse_mem_size_ok:
- mov al,[extended_code]
- mov ah,[supplemental_code]
- cmp al,0C2h
- je sse_cmp_mem_ok
- cmp ax,443Ah
- je sse_cmp_mem_ok
- cmp [immediate_size],1
- je mmx_imm8
- cmp [immediate_size],-1
- jne sse_ok
- call take_additional_xmm0
- mov [immediate_size],0
- sse_ok:
- jmp instruction_ready
- sse_cmp_mem_ok:
- cmp byte [value],-1
- je mmx_imm8
- call store_instruction_with_imm8
- jmp instruction_assembled
- sse_xmmreg_xmmreg:
- cmp [operand_prefix],66h
- jne sse_xmmreg_xmmreg_ok
- cmp [extended_code],12h
- je invalid_operand
- cmp [extended_code],16h
- je invalid_operand
- sse_xmmreg_xmmreg_ok:
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- mov al,[extended_code]
- mov ah,[supplemental_code]
- cmp al,0C2h
- je sse_cmp_nomem_ok
- cmp ax,443Ah
- je sse_cmp_nomem_ok
- cmp [immediate_size],1
- je mmx_nomem_imm8
- cmp [immediate_size],-1
- jne sse_nomem_ok
- call take_additional_xmm0
- mov [immediate_size],0
- sse_nomem_ok:
- jmp nomem_instruction_ready
- sse_cmp_nomem_ok:
- cmp byte [value],-1
- je mmx_nomem_imm8
- call store_nomem_instruction
- mov al,byte [value]
- stosb
- jmp instruction_assembled
- take_additional_xmm0:
- cmp byte [esi],','
- jne additional_xmm0_ok
- inc esi
- lods byte [esi]
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- test al,al
- jnz invalid_operand
- additional_xmm0_ok:
- ret
-
-pslldq_instruction:
- mov [postbyte_register],al
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],73h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- jmp mmx_nomem_imm8
-movpd_instruction:
- mov [opcode_prefix],66h
-movps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],16
- jmp sse_mov_instruction
-movss_instruction:
- mov [mmx_size],4
- mov [opcode_prefix],0F3h
- jmp sse_movs
-movsd_instruction:
- mov al,0A5h
- mov ah,[esi]
- or ah,ah
- jz simple_instruction_32bit
- cmp ah,0Fh
- je simple_instruction_32bit
- mov [mmx_size],8
- mov [opcode_prefix],0F2h
- sse_movs:
- mov [base_code],0Fh
- mov [extended_code],10h
- jmp sse_mov_instruction
-sse_mov_instruction:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je sse_xmmreg
- sse_mem:
- cmp al,'['
- jne invalid_operand
- inc [extended_code]
- call get_address
- cmp [operand_size],0
- je sse_mem_xmmreg
- mov al,[mmx_size]
- cmp [operand_size],al
- jne invalid_operand_size
- mov [operand_size],0
- sse_mem_xmmreg:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- jmp instruction_ready
-movlpd_instruction:
- mov [opcode_prefix],66h
-movlps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],8
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne sse_mem
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- jmp sse_reg_mem
-movhlps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- mov [mmx_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je sse_xmmreg_xmmreg_ok
- jmp invalid_operand
-maskmovq_instruction:
- mov cl,8
- jmp maskmov_instruction
-maskmovdqu_instruction:
- mov cl,16
- mov [opcode_prefix],66h
- maskmov_instruction:
- mov [base_code],0Fh
- mov [extended_code],0F7h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,cl
- jne invalid_operand_size
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- jmp nomem_instruction_ready
-movmskpd_instruction:
- mov [opcode_prefix],66h
-movmskps_instruction:
- mov [base_code],0Fh
- mov [extended_code],50h
- call take_register
- mov [postbyte_register],al
- cmp ah,4
- je movmskps_reg_ok
- cmp ah,8
- jne invalid_operand_size
- cmp [code_type],64
- jne invalid_operand
- movmskps_reg_ok:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je sse_xmmreg_xmmreg_ok
- jmp invalid_operand
-
-cvtpi2pd_instruction:
- mov [opcode_prefix],66h
-cvtpi2ps_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je cvtpi_xmmreg_xmmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je cvtpi_size_ok
- cmp [operand_size],8
- jne invalid_operand_size
- cvtpi_size_ok:
- jmp instruction_ready
- cvtpi_xmmreg_xmmreg:
- lods byte [esi]
- call convert_mmx_register
- cmp ah,8
- jne invalid_operand_size
- mov bl,al
- jmp nomem_instruction_ready
-cvtsi2ss_instruction:
- mov [opcode_prefix],0F3h
- jmp cvtsi_instruction
-cvtsi2sd_instruction:
- mov [opcode_prefix],0F2h
- cvtsi_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- cvtsi_xmmreg:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je cvtsi_xmmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je cvtsi_size_ok
- cmp [operand_size],4
- je cvtsi_size_ok
- cmp [operand_size],8
- jne invalid_operand_size
- call operand_64bit
- cvtsi_size_ok:
- jmp instruction_ready
- cvtsi_xmmreg_reg:
- lods byte [esi]
- call convert_register
- cmp ah,4
- je cvtsi_xmmreg_reg_store
- cmp ah,8
- jne invalid_operand_size
- call operand_64bit
- cvtsi_xmmreg_reg_store:
- mov bl,al
- jmp nomem_instruction_ready
-cvtps2pi_instruction:
- mov [mmx_size],8
- jmp cvtpd_instruction
-cvtpd2pi_instruction:
- mov [opcode_prefix],66h
- mov [mmx_size],16
- cvtpd_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,8
- jne invalid_operand_size
- mov [operand_size],0
- jmp sse_reg
-cvtss2si_instruction:
- mov [opcode_prefix],0F3h
- mov [mmx_size],4
- jmp cvt2si_instruction
-cvtsd2si_instruction:
- mov [opcode_prefix],0F2h
- mov [mmx_size],8
- cvt2si_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- call take_register
- mov [operand_size],0
- cmp ah,4
- je sse_reg
- cmp ah,8
- jne invalid_operand_size
- call operand_64bit
- jmp sse_reg
-
-ssse3_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- jmp mmx_instruction
-palignr_instruction:
- mov [base_code],0Fh
- mov [extended_code],3Ah
- mov [supplemental_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- call make_mmx_prefix
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je palignr_mmreg_mmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp mmx_imm8
- palignr_mmreg_mmreg:
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- jmp mmx_nomem_imm8
-amd3dnow_instruction:
- mov [base_code],0Fh
- mov [extended_code],0Fh
- mov byte [value],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,8
- jne invalid_operand_size
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je amd3dnow_mmreg_mmreg
- cmp al,'['
- jne invalid_operand
- call get_address
- call store_instruction_with_imm8
- jmp instruction_assembled
- amd3dnow_mmreg_mmreg:
- lods byte [esi]
- call convert_mmx_register
- cmp ah,8
- jne invalid_operand_size
- mov bl,al
- call store_nomem_instruction
- mov al,byte [value]
- stos byte [edi]
- jmp instruction_assembled
-
-sse4_instruction_38_xmm0:
- mov [immediate_size],-1
- jmp sse4_instruction_38
-sse4_instruction_66_38_xmm0:
- mov [immediate_size],-1
-sse4_instruction_66_38:
- mov [opcode_prefix],66h
-sse4_instruction_38:
- mov [mmx_size],16
- mov [supplemental_code],al
- mov al,38h
- jmp sse_instruction
-sse4_ss_instruction_66_3a_imm8:
- mov [immediate_size],1
- mov cl,4
- jmp sse4_instruction_66_3a_setup
-sse4_sd_instruction_66_3a_imm8:
- mov [immediate_size],1
- mov cl,8
- jmp sse4_instruction_66_3a_setup
-sse4_instruction_66_3a_imm8:
- mov [immediate_size],1
- mov cl,16
- sse4_instruction_66_3a_setup:
- mov [opcode_prefix],66h
- sse4_instruction_3a_setup:
- mov [supplemental_code],al
- mov al,3Ah
- mov [mmx_size],cl
- jmp sse_instruction
-sse4_instruction_3a_imm8:
- mov [immediate_size],1
- mov cl,16
- jmp sse4_instruction_3a_setup
-pclmulqdq_instruction:
- mov byte [value],al
- mov al,44h
- mov cl,16
- jmp sse4_instruction_66_3a_setup
-extractps_instruction:
- call setup_66_0f_3a
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je extractps_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],4
- je extractps_size_ok
- cmp [operand_size],0
- jne invalid_operand_size
- extractps_size_ok:
- push edx ebx ecx
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- pop ecx ebx edx
- jmp mmx_imm8
- extractps_reg:
- lods byte [esi]
- call convert_register
- push eax
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- pop ebx
- mov al,bh
- cmp al,4
- je mmx_nomem_imm8
- cmp al,8
- jne invalid_operand_size
- cmp [code_type],64
- jne illegal_instruction
- jmp mmx_nomem_imm8
- setup_66_0f_3a:
- mov [extended_code],3Ah
- mov [supplemental_code],al
- mov [base_code],0Fh
- mov [opcode_prefix],66h
- ret
-insertps_instruction:
- call setup_66_0f_3a
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je insertps_xmmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],4
- je insertps_size_ok
- cmp [operand_size],0
- jne invalid_operand_size
- insertps_size_ok:
- jmp mmx_imm8
- insertps_xmmreg_reg:
- lods byte [esi]
- call convert_mmx_register
- mov bl,al
- jmp mmx_nomem_imm8
-pextrq_instruction:
- mov [mmx_size],8
- jmp pextr_instruction
-pextrd_instruction:
- mov [mmx_size],4
- jmp pextr_instruction
-pextrw_instruction:
- mov [mmx_size],2
- jmp pextr_instruction
-pextrb_instruction:
- mov [mmx_size],1
- pextr_instruction:
- call setup_66_0f_3a
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pextr_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[mmx_size]
- cmp al,[operand_size]
- je pextr_size_ok
- cmp [operand_size],0
- jne invalid_operand_size
- pextr_size_ok:
- cmp al,8
- jne pextr_prefix_ok
- call operand_64bit
- pextr_prefix_ok:
- push edx ebx ecx
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- pop ecx ebx edx
- jmp mmx_imm8
- pextr_reg:
- lods byte [esi]
- call convert_register
- cmp [mmx_size],4
- ja pextrq_reg
- cmp ah,4
- je pextr_reg_size_ok
- cmp [code_type],64
- jne pextr_invalid_size
- cmp ah,8
- je pextr_reg_size_ok
- pextr_invalid_size:
- jmp invalid_operand_size
- pextrq_reg:
- cmp ah,8
- jne pextr_invalid_size
- call operand_64bit
- pextr_reg_size_ok:
- mov [operand_size],0
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- mov ebx,eax
- pop eax
- mov [postbyte_register],al
- mov al,ah
- cmp [mmx_size],2
- jne pextr_reg_store
- mov [opcode_prefix],0
- mov [extended_code],0C5h
- call make_mmx_prefix
- jmp mmx_nomem_imm8
- pextr_reg_store:
- cmp bh,16
- jne invalid_operand_size
- xchg bl,[postbyte_register]
- jmp mmx_nomem_imm8
-pinsrb_instruction:
- mov [mmx_size],1
- jmp pinsr_instruction
-pinsrd_instruction:
- mov [mmx_size],4
- jmp pinsr_instruction
-pinsrq_instruction:
- mov [mmx_size],8
- call operand_64bit
- pinsr_instruction:
- call setup_66_0f_3a
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- pinsr_xmmreg:
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pinsr_xmmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je mmx_imm8
- mov al,[mmx_size]
- cmp al,[operand_size]
- je mmx_imm8
- jmp invalid_operand_size
- pinsr_xmmreg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- cmp [mmx_size],8
- je pinsrq_xmmreg_reg
- cmp ah,4
- je mmx_nomem_imm8
- jmp invalid_operand_size
- pinsrq_xmmreg_reg:
- cmp ah,8
- je mmx_nomem_imm8
- jmp invalid_operand_size
-pmovsxbw_instruction:
- mov [mmx_size],8
- jmp pmovsx_instruction
-pmovsxbd_instruction:
- mov [mmx_size],4
- jmp pmovsx_instruction
-pmovsxbq_instruction:
- mov [mmx_size],2
- jmp pmovsx_instruction
-pmovsxwd_instruction:
- mov [mmx_size],8
- jmp pmovsx_instruction
-pmovsxwq_instruction:
- mov [mmx_size],4
- jmp pmovsx_instruction
-pmovsxdq_instruction:
- mov [mmx_size],8
- pmovsx_instruction:
- call setup_66_0f_38
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je pmovsx_xmmreg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- cmp [operand_size],0
- je instruction_ready
- mov al,[mmx_size]
- cmp al,[operand_size]
- jne invalid_operand_size
- jmp instruction_ready
- pmovsx_xmmreg_reg:
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- jmp nomem_instruction_ready
- setup_66_0f_38:
- mov [extended_code],38h
- mov [supplemental_code],al
- mov [base_code],0Fh
- mov [opcode_prefix],66h
- ret
-
-xsaves_instruction_64bit:
- call operand_64bit
-xsaves_instruction:
- mov ah,0C7h
- jmp xsave_common
-fxsave_instruction_64bit:
- call operand_64bit
-fxsave_instruction:
- mov ah,0AEh
- xor cl,cl
- xsave_common:
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [postbyte_register],al
- mov [mmx_size],cl
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov ah,[operand_size]
- or ah,ah
- jz xsave_size_ok
- cmp ah,[mmx_size]
- jne invalid_operand_size
- xsave_size_ok:
- jmp instruction_ready
-clflush_instruction:
- mov ah,0AEh
- mov cl,1
- jmp xsave_common
-cldemote_instruction:
- mov ah,1Ch
- mov cl,1
- jmp xsave_common
-stmxcsr_instruction:
- mov ah,0AEh
- mov cl,4
- jmp xsave_common
-prefetch_instruction:
- mov [extended_code],18h
- prefetch_mem_8bit:
- mov [base_code],0Fh
- mov [postbyte_register],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- or ah,ah
- jz prefetch_size_ok
- cmp ah,1
- jne invalid_operand_size
- prefetch_size_ok:
- call get_address
- jmp instruction_ready
-amd_prefetch_instruction:
- mov [extended_code],0Dh
- jmp prefetch_mem_8bit
-clflushopt_instruction:
- mov [extended_code],0AEh
- mov [opcode_prefix],66h
- jmp prefetch_mem_8bit
-pcommit_instruction:
- mov byte [edi],66h
- inc edi
-fence_instruction:
- mov bl,al
- mov ax,0AE0Fh
- stos word [edi]
- mov al,bl
- stos byte [edi]
- jmp instruction_assembled
-pause_instruction:
- mov ax,90F3h
- stos word [edi]
- jmp instruction_assembled
-movntq_instruction:
- mov [mmx_size],8
- jmp movnt_instruction
-movntpd_instruction:
- mov [opcode_prefix],66h
-movntps_instruction:
- mov [mmx_size],16
- movnt_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_mmx_register
- cmp ah,[mmx_size]
- jne invalid_operand_size
- mov [postbyte_register],al
- jmp instruction_ready
-
-movntsd_instruction:
- mov [opcode_prefix],0F2h
- mov [mmx_size],8
- jmp movnts_instruction
-movntss_instruction:
- mov [opcode_prefix],0F3h
- mov [mmx_size],4
- movnts_instruction:
- mov [extended_code],al
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,[mmx_size]
- je movnts_size_ok
- test al,al
- jnz invalid_operand_size
- movnts_size_ok:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- jmp instruction_ready
-
-movdiri_instruction:
- mov [supplemental_code],al
- mov al,38h
-movnti_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- cmp ah,4
- je movnti_store
- cmp ah,8
- jne invalid_operand_size
- call operand_64bit
- movnti_store:
- mov [postbyte_register],al
- jmp instruction_ready
-monitor_instruction:
- mov [postbyte_register],al
- cmp byte [esi],0
- je monitor_instruction_store
- cmp byte [esi],0Fh
- je monitor_instruction_store
- call take_register
- cmp ax,0400h
- jne invalid_operand
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- cmp ax,0401h
- jne invalid_operand
- cmp [postbyte_register],0C8h
- jne monitor_instruction_store
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- cmp ax,0402h
- jne invalid_operand
- monitor_instruction_store:
- mov ax,010Fh
- stos word [edi]
- mov al,[postbyte_register]
- stos byte [edi]
- jmp instruction_assembled
-pconfig_instruction:
- mov [postbyte_register],al
- jmp monitor_instruction_store
-movntdqa_instruction:
- call setup_66_0f_38
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- jmp instruction_ready
-
-extrq_instruction:
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],78h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je extrq_xmmreg_xmmreg
- test ah,not 1
- jnz invalid_operand_size
- cmp al,'('
- jne invalid_operand
- xor bl,bl
- xchg bl,[postbyte_register]
- call store_nomem_instruction
- call get_byte_value
- stosb
- call append_imm8
- jmp instruction_assembled
- extrq_xmmreg_xmmreg:
- inc [extended_code]
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- jmp nomem_instruction_ready
-insertq_instruction:
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],78h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov [postbyte_register],al
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_xmm_register
- mov bl,al
- cmp byte [esi],','
- je insertq_with_imm
- inc [extended_code]
- jmp nomem_instruction_ready
- insertq_with_imm:
- call store_nomem_instruction
- call append_imm8
- call append_imm8
- jmp instruction_assembled
-
-crc32_instruction:
- mov [opcode_prefix],0F2h
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],0F0h
- call take_register
- mov [postbyte_register],al
- cmp ah,4
- je crc32_reg_size_ok
- cmp ah,8
- jne invalid_operand
- cmp [code_type],64
- jne illegal_instruction
- crc32_reg_size_ok:
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- mov [operand_size],0
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je crc32_reg_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- test al,al
- jz crc32_unknown_size
- cmp al,1
- je crc32_reg_mem_store
- inc [supplemental_code]
- call operand_autodetect
- crc32_reg_mem_store:
- jmp instruction_ready
- crc32_unknown_size:
- call recoverable_unknown_size
- jmp crc32_reg_mem_store
- crc32_reg_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- cmp al,1
- je crc32_reg_reg_store
- inc [supplemental_code]
- call operand_autodetect
- crc32_reg_reg_store:
- jmp nomem_instruction_ready
-popcnt_instruction:
- mov [opcode_prefix],0F3h
- jmp bs_instruction
-movbe_instruction:
- mov [supplemental_code],al
- mov [extended_code],38h
- mov [base_code],0Fh
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je movbe_mem
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_argument
- call get_address
- mov al,[operand_size]
- call operand_autodetect
- jmp instruction_ready
- movbe_mem:
- inc [supplemental_code]
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- pop ecx ebx edx
- 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
-rdpid_instruction:
- mov [postbyte_register],al
- mov [extended_code],0C7h
- mov [base_code],0Fh
- mov [opcode_prefix],0F3h
- call take_register
- mov bl,al
- cmp [code_type],64
- je rdpid_64bit
- cmp ah,4
- jne invalid_operand_size
- jmp nomem_instruction_ready
- rdpid_64bit:
- cmp ah,8
- jne invalid_operand_size
- jmp nomem_instruction_ready
-ptwrite_instruction:
- mov [base_code],0Fh
- mov [extended_code],0AEh
- mov [postbyte_register],al
- mov [opcode_prefix],0F3h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je ptwrite_reg
- ptwrite_mem:
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- cmp al,4
- je ptwrite_mem_store
- cmp al,8
- je ptwrite_mem_64bit
- or al,al
- jnz invalid_operand_size
- call recoverable_unknown_size
- jmp ptwrite_mem_store
- ptwrite_mem_64bit:
- call operand_64bit
- ptwrite_mem_store:
- mov al,[operand_size]
- call operand_autodetect
- jmp instruction_ready
- ptwrite_reg:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov al,ah
- cmp al,4
- je nomem_instruction_ready
- cmp al,8
- jne invalid_operand_size
- call operand_64bit
- jmp nomem_instruction_ready
-
-vmclear_instruction:
- mov [opcode_prefix],66h
- jmp vmx_instruction
-vmxon_instruction:
- mov [opcode_prefix],0F3h
-vmx_instruction:
- mov [postbyte_register],al
- mov [extended_code],0C7h
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz vmx_size_ok
- cmp al,8
- jne invalid_operand_size
- vmx_size_ok:
- mov [base_code],0Fh
- jmp instruction_ready
-vmread_instruction:
- mov [extended_code],78h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je vmread_nomem
- cmp al,'['
- jne invalid_operand
- call get_address
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- call vmread_check_size
- jmp vmx_size_ok
- vmread_nomem:
- lods byte [esi]
- call convert_register
- push eax
- call vmread_check_size
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- call vmread_check_size
- pop ebx
- mov [base_code],0Fh
- jmp nomem_instruction_ready
- vmread_check_size:
- cmp [code_type],64
- je vmread_long
- cmp [operand_size],4
- jne invalid_operand_size
- ret
- vmread_long:
- cmp [operand_size],8
- jne invalid_operand_size
- ret
-vmwrite_instruction:
- mov [extended_code],79h
- call take_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je vmwrite_nomem
- cmp al,'['
- jne invalid_operand
- call get_address
- call vmread_check_size
- jmp vmx_size_ok
- vmwrite_nomem:
- lods byte [esi]
- call convert_register
- mov bl,al
- mov [base_code],0Fh
- jmp nomem_instruction_ready
-vmx_inv_instruction:
- call setup_66_0f_38
- call take_register
- mov [postbyte_register],al
- call vmread_check_size
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz vmx_size_ok
- cmp al,16
- jne invalid_operand_size
- jmp vmx_size_ok
-simple_svm_instruction:
- push eax
- mov [base_code],0Fh
- mov [extended_code],1
- call take_register
- or al,al
- jnz invalid_operand
- simple_svm_detect_size:
- cmp ah,2
- je simple_svm_16bit
- cmp ah,4
- je simple_svm_32bit
- cmp [code_type],64
- jne invalid_operand_size
- jmp simple_svm_store
- simple_svm_16bit:
- cmp [code_type],16
- je simple_svm_store
- cmp [code_type],64
- je invalid_operand_size
- jmp prefixed_svm_store
- simple_svm_32bit:
- cmp [code_type],32
- je simple_svm_store
- prefixed_svm_store:
- mov al,67h
- stos byte [edi]
- simple_svm_store:
- call store_classic_instruction_code
- pop eax
- stos byte [edi]
- jmp instruction_assembled
-skinit_instruction:
- call take_register
- cmp ax,0400h
- jne invalid_operand
- mov al,0DEh
- jmp simple_instruction_0f_01
-clzero_instruction:
- call take_register
- or al,al
- jnz invalid_operand
- mov al,0FCh
- cmp [code_type],64
- je clzero_64bit
- cmp ah,4
- jne invalid_operand
- jmp simple_instruction_0f_01
- clzero_64bit:
- cmp ah,8
- jne invalid_operand
- jmp simple_instruction_0f_01
-invlpga_instruction:
- push eax
- mov [base_code],0Fh
- mov [extended_code],1
- call take_register
- or al,al
- jnz invalid_operand
- mov bl,ah
- mov [operand_size],0
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- cmp ax,0401h
- jne invalid_operand
- mov ah,bl
- jmp simple_svm_detect_size
-
-rdrand_instruction:
- mov [base_code],0Fh
- mov [extended_code],0C7h
- mov [postbyte_register],al
- call take_register
- mov bl,al
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
-rdfsbase_instruction:
- cmp [code_type],64
- jne illegal_instruction
- mov [opcode_prefix],0F3h
- mov [base_code],0Fh
- mov [extended_code],0AEh
- mov [postbyte_register],al
- call take_register
- mov bl,al
- mov al,ah
- cmp ah,2
- je invalid_operand_size
- call operand_autodetect
- jmp nomem_instruction_ready
-
-xabort_instruction:
- lods byte [esi]
- call get_size_operator
- cmp ah,1
- ja invalid_operand_size
- cmp al,'('
- jne invalid_operand
- call get_byte_value
- mov dl,al
- mov ax,0F8C6h
- stos word [edi]
- mov al,dl
- stos byte [edi]
- jmp instruction_assembled
-xbegin_instruction:
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[code_type]
- cmp al,64
- je xbegin_64bit
- cmp al,32
- je xbegin_32bit
- xbegin_16bit:
- call get_address_word_value
- add edi,4
- mov ebp,[addressing_space]
- call calculate_relative_offset
- sub edi,4
- shl eax,16
- mov ax,0F8C7h
- stos dword [edi]
- jmp instruction_assembled
- xbegin_32bit:
- call get_address_dword_value
- jmp xbegin_address_ok
- xbegin_64bit:
- 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
- cwde
- cmp eax,edx
- jne xbegin_rel32
- mov al,66h
- stos byte [edi]
- mov eax,edx
- shl eax,16
- mov ax,0F8C7h
- stos dword [edi]
- jmp instruction_assembled
- xbegin_rel32:
- sub edx,1
- jno xbegin_rel32_ok
- cmp [code_type],64
- je jump_out_of_range
- xbegin_rel32_ok:
- mov ax,0F8C7h
- stos word [edi]
- mov eax,edx
- stos dword [edi]
- jmp instruction_assembled
-
-bndcl_instruction:
- mov ah,0F3h
- jmp bndc_instruction
-bndcu_instruction:
- mov ah,0F2h
- bndc_instruction:
- mov [opcode_prefix],ah
- mov [base_code],0Fh
- mov [extended_code],al
- call take_bnd_register
- mov [postbyte_register],al
- call get_bnd_size
- mov [operand_size],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- je bndc_mem
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov bl,al
- jmp nomem_instruction_ready
- bndc_mem:
- call get_address_of_required_size
- jmp instruction_ready
-bndmov_instruction:
- mov [opcode_prefix],66h
- mov [base_code],0Fh
- mov [extended_code],al
- call get_bnd_size
- shl al,1
- mov [operand_size],al
- lods byte [esi]
- cmp al,14h
- je bndmov_reg
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- inc [extended_code]
- call get_address_of_required_size
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_bnd_register
- mov [postbyte_register],al
- jmp instruction_ready
- bndmov_reg:
- lods byte [esi]
- call convert_bnd_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,14h
- je bndmov_reg_reg
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address_of_required_size
- jmp instruction_ready
- bndmov_reg_reg:
- lods byte [esi]
- call convert_bnd_register
- mov bl,al
- jmp nomem_instruction_ready
- take_bnd_register:
- lods byte [esi]
- cmp al,14h
- jne invalid_operand
- lods byte [esi]
- convert_bnd_register:
- mov ah,al
- shr ah,4
- cmp ah,6
- jne invalid_operand
- and al,1111b
- ret
-bndmk_instruction:
- mov [opcode_prefix],0F3h
- mov [base_code],0Fh
- mov [extended_code],al
- call take_bnd_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_bnd_size
- call get_address_prefixes
- call get_address_component
- cmp byte [esi-1],']'
- je bndmk_ready
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- or dl,bl
- or dl,[address_sign]
- or edx,[address_high]
- jnz invalid_address
- mov [address_register],bh
- call get_address_component
- lods byte [esi]
- cmp al,']'
- jne invalid_operand
- or bh,bh
- jz bndmk_selected_base
- cmp bl,bh
- je bndmk_to_index
- or bl,bl
- jnz invalid_address
- mov bl,bh
- bndmk_to_index:
- inc cl
- bndmk_selected_base:
- mov bh,[address_register]
- bndmk_ready:
- or bx,bx
- jz instruction_ready
- cmp [address_size_declared],0
- jne instruction_ready
- and ch,not 0Fh
- jmp instruction_ready
- get_bnd_size:
- mov al,4
- cmp [code_type],64
- jne bnd_size_ok
- add al,4
- bnd_size_ok:
- mov [address_size],al
- ret
- get_address_component:
- mov [free_address_range],0
- call calculate_address
- mov [address_high],edx
- mov edx,eax
- or bx,bx
- jz address_component_ok
- mov al,bl
- or al,bh
- shr al,4
- cmp al,[address_size]
- jne invalid_address
- address_component_ok:
- ret
-bndldx_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- call take_bnd_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_bnd_mib
- jmp bndmk_ready
-bndstx_instruction:
- mov [base_code],0Fh
- mov [extended_code],al
- call take_bnd_mib
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_bnd_register
- mov [postbyte_register],al
- jmp bndmk_ready
- take_bnd_mib:
- lods byte [esi]
- cmp al,'['
- jne invalid_operand
- call get_bnd_size
- call get_address_prefixes
- call get_address_component
- cmp byte [esi-1],']'
- je bnd_mib_ok
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- cmp al,'('
- jne invalid_operand
- mov al,[address_sign]
- push eax ebx ecx edx
- push [address_symbol]
- call get_address_component
- lods byte [esi]
- cmp al,']'
- jne invalid_operand
- or dl,bl
- or dl,[address_sign]
- or edx,[address_high]
- jnz invalid_address
- mov [address_register],bh
- pop [address_symbol]
- pop edx ecx ebx eax
- mov [address_sign],al
- or bl,bl
- jz mib_place_index
- or bh,bh
- jnz invalid_address
- cmp cl,1
- jne invalid_address
- mov bh,bl
- mib_place_index:
- mov bl,[address_register]
- xor cl,cl
- or bl,bl
- jz bnd_mib_ok
- inc cl
- bnd_mib_ok:
- ret
-
-tpause_instruction:
- mov [postbyte_register],6
- mov [extended_code],0AEh
- mov [base_code],0Fh
- mov [opcode_prefix],al
- call take_register
- cmp ah,4
- jne invalid_operand_size
- mov bl,al
- cmp byte [esi],','
- jne nomem_instruction_ready
- inc esi
- call take_register
- cmp ax,0402h
- jne invalid_operand
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- cmp ax,0400h
- jne invalid_operand
- jmp nomem_instruction_ready
-umonitor_instruction:
- mov [postbyte_register],6
- mov [extended_code],0AEh
- mov [base_code],0Fh
- mov [opcode_prefix],0F3h
- call take_register
- mov bl,al
- mov al,ah
- call operand_autodetect
- jmp nomem_instruction_ready
-movdir64b_instruction:
- call setup_66_0f_38
- call take_register
- mov [postbyte_register],al
- xor al,al
- xchg al,[operand_size]
- push eax
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- mov al,[operand_size]
- or al,al
- jz movdir64b_ready
- cmp al,64
- jne invalid_operand_size
- movdir64b_ready:
- push edi
- call store_instruction
- pop ebx eax
- mov cl,[code_type]
- cmp byte [ebx],67h
- jne movdir64b_size_check
- shr cl,1
- cmp cl,16
- jae movdir64b_size_check
- mov cl,32
- movdir64b_size_check:
- shl al,3
- cmp al,cl
- jne invalid_operand_size
- jmp instruction_assembled
-
-setssbsy_instruction:
- shl eax,24
- or eax,010FF3h
- stos dword [edi]
- jmp instruction_assembled
-rstorssp_instruction:
- mov ah,1
- jmp setup_clrssbsy
-clrssbsy_instruction:
- mov ah,0AEh
- setup_clrssbsy:
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [postbyte_register],al
- mov [opcode_prefix],0F3h
- lods byte [esi]
- call get_size_operator
- cmp al,'['
- jne invalid_operand
- call get_address
- test [operand_size],not 8
- jnz invalid_operand_size
- jmp instruction_ready
-rdsspq_instruction:
- mov [rex_prefix],48h
-rdsspd_instruction:
- mov ah,1Eh
- jmp setup_incssp
-incsspq_instruction:
- mov [rex_prefix],48h
-incsspd_instruction:
- mov ah,0AEh
- setup_incssp:
- mov [base_code],0Fh
- mov [extended_code],ah
- mov [postbyte_register],al
- mov [opcode_prefix],0F3h
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
- call convert_register
- mov bl,al
- call cet_size_check
- jmp nomem_instruction_ready
- cet_size_check:
- cmp [rex_prefix],0
- je cet_dword
- cmp [code_type],64
- jne illegal_instruction
- shr ah,1
- cet_dword:
- cmp ah,4
- jne invalid_operand_size
- ret
-wrussq_instruction:
- mov [opcode_prefix],66h
-wrssq_instruction:
- mov [rex_prefix],48h
- jmp wrssd_instruction
-wrussd_instruction:
- mov [opcode_prefix],66h
-wrssd_instruction:
- mov [base_code],0Fh
- mov [extended_code],38h
- mov [supplemental_code],al
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- je wrss_reg
- cmp al,'['
- jne invalid_operand
- call get_address
- push edx ebx ecx
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov [postbyte_register],al
- pop ecx ebx edx
- call cet_size_check
- jmp instruction_ready
- wrss_reg:
- lods byte [esi]
- call convert_register
- mov [postbyte_register],al
- lods byte [esi]
- cmp al,','
- jne invalid_operand
- call take_register
- mov bl,al
- xchg bl,[postbyte_register]
- call cet_size_check
- jmp nomem_instruction_ready
-endbr_instruction:
- shl eax,24
- or eax,1E0FF3h
- stos dword [edi]
- jmp instruction_assembled
-
-take_register:
- lods byte [esi]
- call get_size_operator
- cmp al,10h
- jne invalid_operand
- lods byte [esi]
-convert_register:
- mov ah,al
- shr ah,4
- and al,0Fh
- cmp ah,8
- je match_register_size
- cmp ah,4
- ja invalid_operand
- cmp ah,1
- ja match_register_size
- cmp al,4
- jb match_register_size
- or ah,ah
- jz high_byte_register
- or [rex_prefix],40h
- match_register_size:
- cmp ah,[operand_size]
- je register_size_ok
- cmp [operand_size],0
- jne operand_sizes_do_not_match
- mov [operand_size],ah
- register_size_ok:
- ret
- high_byte_register:
- mov ah,1
- or [rex_prefix],10h
- jmp match_register_size
-convert_fpu_register:
- mov ah,al
- shr ah,4
- and al,111b
- cmp ah,10
- jne invalid_operand
- jmp match_register_size
-convert_mmx_register:
- mov ah,al
- shr ah,4
- cmp ah,0Ch
- je xmm_register
- ja invalid_operand
- and al,111b
- cmp ah,0Bh
- jne invalid_operand
- mov ah,8
- jmp match_register_size
- xmm_register:
- and al,0Fh
- mov ah,16
- cmp al,8
- jb match_register_size
- cmp [code_type],64
- jne invalid_operand
- jmp match_register_size
-convert_xmm_register:
- mov ah,al
- shr ah,4
- cmp ah,0Ch
- je xmm_register
- jmp invalid_operand
-get_size_operator:
- xor ah,ah
- cmp al,11h
- jne no_size_operator
- mov [size_declared],1
- lods word [esi]
- xchg al,ah
- or [operand_flags],1
- cmp ah,[operand_size]
- je size_operator_ok
- cmp [operand_size],0
- jne operand_sizes_do_not_match
- mov [operand_size],ah
- size_operator_ok:
- ret
- no_size_operator:
- mov [size_declared],0
- cmp al,'['
- jne size_operator_ok
- and [operand_flags],not 1
- ret
-get_jump_operator:
- mov [jump_type],0
- cmp al,12h
- jne jump_operator_ok
- lods word [esi]
- mov [jump_type],al
- mov al,ah
- jump_operator_ok:
- ret
-get_address:
- and [address_size],0
- get_address_of_required_size:
- call get_address_prefixes
- and [free_address_range],0
- call calculate_address
- cmp byte [esi-1],']'
- jne invalid_address
- mov [address_high],edx
- mov edx,eax
- cmp [address_size_declared],0
- jne address_ok
- cmp [segment_register],4
- ja address_ok
- or bx,bx
- jnz clear_address_size
- cmp [code_type],64
- jne address_ok
- calculate_relative_address:
- 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
- cmp edx,[address_high]
- je address_high_ok
- call recoverable_overflow
- address_high_ok:
- mov edx,eax
- ror ecx,16
- mov cl,[value_type]
- rol ecx,16
- mov bx,9900h
- clear_address_size:
- and ch,not 0Fh
- address_ok:
- ret
-get_address_prefixes:
- and [segment_register],0
- and [address_size_declared],0
- mov al,[code_type]
- shr al,3
- mov [value_size],al
- mov al,[esi]
- and al,11110000b
- cmp al,60h
- jne get_address_size_prefix
- lods byte [esi]
- sub al,60h
- mov [segment_register],al
- mov al,[esi]
- and al,11110000b
- get_address_size_prefix:
- cmp al,70h
- jne address_size_prefix_ok
- lods byte [esi]
- sub al,70h
- cmp al,2
- jb invalid_address_size
- cmp al,8
- ja invalid_address_size
- mov [value_size],al
- or [address_size_declared],1
- or [address_size],al
- cmp al,[address_size]
- jne invalid_address_size
- address_size_prefix_ok:
- ret
-operand_16bit:
- cmp [code_type],16
- je size_prefix_ok
- mov [operand_prefix],66h
- ret
-operand_32bit:
- cmp [code_type],16
- jne size_prefix_ok
- mov [operand_prefix],66h
- size_prefix_ok:
- ret
-operand_64bit:
- cmp [code_type],64
- jne illegal_instruction
- or [rex_prefix],48h
- ret
-operand_autodetect:
- cmp al,2
- je operand_16bit
- cmp al,4
- je operand_32bit
- cmp al,8
- je operand_64bit
- jmp invalid_operand_size
-store_segment_prefix_if_necessary:
- mov al,[segment_register]
- or al,al
- jz segment_prefix_ok
- cmp al,4
- ja segment_prefix_386
- cmp [code_type],64
- je segment_prefix_ok
- cmp al,3
- je ss_prefix
- jb segment_prefix_86
- cmp bl,25h
- je segment_prefix_86
- cmp bh,25h
- je segment_prefix_86
- cmp bh,45h
- je segment_prefix_86
- cmp bh,44h
- je segment_prefix_86
- ret
- ss_prefix:
- cmp bl,25h
- je segment_prefix_ok
- cmp bh,25h
- je segment_prefix_ok
- cmp bh,45h
- je segment_prefix_ok
- cmp bh,44h
- je segment_prefix_ok
- jmp segment_prefix_86
-store_segment_prefix:
- mov al,[segment_register]
- or al,al
- jz segment_prefix_ok
- cmp al,5
- jae segment_prefix_386
- segment_prefix_86:
- dec al
- shl al,3
- add al,26h
- stos byte [edi]
- jmp segment_prefix_ok
- segment_prefix_386:
- add al,64h-5
- stos byte [edi]
- segment_prefix_ok:
- ret
-store_instruction_code:
- cmp [vex_required],0
- jne store_vex_instruction_code
-store_classic_instruction_code:
- mov al,[operand_prefix]
- or al,al
- jz operand_prefix_ok
- stos byte [edi]
- operand_prefix_ok:
- mov al,[opcode_prefix]
- or al,al
- jz opcode_prefix_ok
- stos byte [edi]
- opcode_prefix_ok:
- mov al,[rex_prefix]
- test al,40h
- jz rex_prefix_ok
- cmp [code_type],64
- jne invalid_operand
- test al,0B0h
- jnz disallowed_combination_of_registers
- stos byte [edi]
- rex_prefix_ok:
- mov al,[base_code]
- stos byte [edi]
- cmp al,0Fh
- jne instruction_code_ok
- store_extended_code:
- mov al,[extended_code]
- stos byte [edi]
- cmp al,38h
- je store_supplemental_code
- cmp al,3Ah
- je store_supplemental_code
- instruction_code_ok:
- ret
- store_supplemental_code:
- mov al,[supplemental_code]
- stos byte [edi]
- ret
-store_nomem_instruction:
- test [postbyte_register],10000b
- jz nomem_reg_high_code_ok
- or [vex_required],10h
- and [postbyte_register],1111b
- nomem_reg_high_code_ok:
- test [postbyte_register],1000b
- jz nomem_reg_code_ok
- or [rex_prefix],44h
- and [postbyte_register],111b
- nomem_reg_code_ok:
- test bl,10000b
- jz nomem_rm_high_code_ok
- or [rex_prefix],42h
- or [vex_required],8
- and bl,1111b
- nomem_rm_high_code_ok:
- test bl,1000b
- jz nomem_rm_code_ok
- or [rex_prefix],41h
- and bl,111b
- nomem_rm_code_ok:
- and [displacement_compression],0
- call store_instruction_code
- mov al,[postbyte_register]
- shl al,3
- or al,bl
- or al,11000000b
- stos byte [edi]
- ret
-store_instruction:
- mov [current_offset],edi
- and [displacement_compression],0
- test [postbyte_register],10000b
- jz reg_high_code_ok
- or [vex_required],10h
- and [postbyte_register],1111b
- reg_high_code_ok:
- test [postbyte_register],1000b
- jz reg_code_ok
- or [rex_prefix],44h
- and [postbyte_register],111b
- reg_code_ok:
- cmp [code_type],64
- jne address_value_ok
- xor eax,eax
- bt edx,31
- sbb eax,[address_high]
- jz address_value_ok
- cmp [address_high],0
- jne address_value_out_of_range
- test ch,44h
- jnz address_value_ok
- test bx,8080h
- jz address_value_ok
- address_value_out_of_range:
- call recoverable_overflow
- address_value_ok:
- call store_segment_prefix_if_necessary
- test [vex_required],4
- jnz address_vsib
- or bx,bx
- jz address_immediate
- cmp bx,9800h
- je address_rip_based
- cmp bx,9400h
- je address_eip_based
- cmp bx,9900h
- je address_relative
- mov al,bl
- or al,bh
- and al,11110000b
- cmp al,80h
- je postbyte_64bit
- cmp al,40h
- je postbyte_32bit
- cmp al,20h
- jne invalid_address
- cmp [code_type],64
- je invalid_address_size
- call address_16bit_prefix
- test ch,22h
- setz [displacement_compression]
- call store_instruction_code
- cmp bl,bh
- jbe determine_16bit_address
- xchg bl,bh
- determine_16bit_address:
- cmp bx,2600h
- je address_si
- cmp bx,2700h
- je address_di
- cmp bx,2300h
- je address_bx
- cmp bx,2500h
- je address_bp
- cmp bx,2625h
- je address_bp_si
- cmp bx,2725h
- je address_bp_di
- cmp bx,2723h
- je address_bx_di
- cmp bx,2623h
- jne invalid_address
- address_bx_si:
- xor al,al
- jmp postbyte_16bit
- address_bx_di:
- mov al,1
- jmp postbyte_16bit
- address_bp_si:
- mov al,10b
- jmp postbyte_16bit
- address_bp_di:
- mov al,11b
- jmp postbyte_16bit
- address_si:
- mov al,100b
- jmp postbyte_16bit
- address_di:
- mov al,101b
- jmp postbyte_16bit
- address_bx:
- mov al,111b
- jmp postbyte_16bit
- address_bp:
- mov al,110b
- postbyte_16bit:
- test ch,22h
- jnz address_16bit_value
- or ch,ch
- jnz address_sizes_do_not_agree
- cmp edx,10000h
- jge value_out_of_range
- cmp edx,-8000h
- jl value_out_of_range
- or dx,dx
- jz address
- cmp [displacement_compression],2
- ja address_8bit_value
- je address_16bit_value
- cmp dx,80h
- jb address_8bit_value
- cmp dx,-80h
- jae address_8bit_value
- address_16bit_value:
- or al,10000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- mov eax,edx
- stos word [edi]
- ret
- address_8bit_value:
- or al,01000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- mov al,dl
- stos byte [edi]
- ret
- address:
- cmp al,110b
- je address_8bit_value
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- ret
- address_vsib:
- mov al,bl
- shr al,4
- test al,1
- jz vsib_high_code_ok
- or [vex_register],10000b
- or [vex_required],8
- xor al,1
- vsib_high_code_ok:
- cmp al,6
- je vsib_index_ok
- cmp al,0Ch
- jb invalid_address
- vsib_index_ok:
- mov al,bh
- shr al,4
- cmp al,4
- je postbyte_32bit
- cmp [code_type],64
- je address_prefix_ok
- test al,al
- jnz invalid_address
- postbyte_32bit:
- call address_32bit_prefix
- jmp address_prefix_ok
- postbyte_64bit:
- cmp [code_type],64
- jne invalid_address_size
- address_prefix_ok:
- cmp bl,44h
- je invalid_address
- cmp bl,84h
- je invalid_address
- test bh,1000b
- jz base_code_ok
- or [rex_prefix],41h
- base_code_ok:
- test bl,1000b
- jz index_code_ok
- or [rex_prefix],42h
- index_code_ok:
- test ch,44h or 88h
- setz [displacement_compression]
- call store_instruction_code
- or cl,cl
- jz only_base_register
- base_and_index:
- mov al,100b
- xor ah,ah
- cmp cl,1
- je scale_ok
- cmp cl,2
- je scale_1
- cmp cl,4
- je scale_2
- or ah,11000000b
- jmp scale_ok
- scale_2:
- or ah,10000000b
- jmp scale_ok
- scale_1:
- or ah,01000000b
- scale_ok:
- or bh,bh
- jz only_index_register
- and bl,111b
- shl bl,3
- or ah,bl
- and bh,111b
- or ah,bh
- sib_ready:
- test ch,44h or 88h
- jnz sib_address_32bit_value
- or ch,ch
- jnz address_sizes_do_not_agree
- cmp bh,5
- je address_value
- or edx,edx
- jz sib_address
- address_value:
- cmp [displacement_compression],2
- ja sib_address_8bit_value
- je sib_address_32bit_value
- cmp edx,80h
- jb sib_address_8bit_value
- cmp edx,-80h
- jnb sib_address_8bit_value
- sib_address_32bit_value:
- or al,10000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos word [edi]
- jmp store_address_32bit_value
- sib_address_8bit_value:
- or al,01000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos word [edi]
- mov al,dl
- stos byte [edi]
- ret
- sib_address:
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos word [edi]
- ret
- only_index_register:
- or ah,101b
- and bl,111b
- shl bl,3
- or ah,bl
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos word [edi]
- test ch,44h or 88h
- jnz store_address_32bit_value
- or ch,ch
- jnz invalid_address_size
- cmp [displacement_compression],2
- jbe store_address_32bit_value
- mov edx,[uncompressed_displacement]
- jmp store_address_32bit_value
- zero_index_register:
- mov bl,4
- mov cl,1
- jmp base_and_index
- only_base_register:
- mov al,bh
- and al,111b
- cmp al,4
- je zero_index_register
- test ch,44h or 88h
- jnz simple_address_32bit_value
- or ch,ch
- jnz address_sizes_do_not_agree
- or edx,edx
- jz simple_address
- cmp [displacement_compression],2
- ja simple_address_8bit_value
- je simple_address_32bit_value
- cmp edx,80h
- jb simple_address_8bit_value
- cmp edx,-80h
- jnb simple_address_8bit_value
- simple_address_32bit_value:
- or al,10000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- jmp store_address_32bit_value
- simple_address_8bit_value:
- or al,01000000b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- mov al,dl
- stos byte [edi]
- ret
- simple_address:
- cmp al,5
- je simple_address_8bit_value
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- ret
- address_immediate:
- cmp [code_type],64
- je address_immediate_sib
- test ch,44h or 88h
- jnz address_immediate_32bit
- test ch,22h
- jnz address_immediate_16bit
- or ch,ch
- jnz invalid_address_size
- cmp [code_type],16
- je addressing_16bit
- address_immediate_32bit:
- call address_32bit_prefix
- call store_instruction_code
- store_immediate_address:
- mov al,101b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- store_address_32bit_value:
- test ch,0F0h
- jz address_32bit_relocation_ok
- mov eax,ecx
- shr eax,16
- cmp al,4
- jne address_32bit_relocation
- mov al,2
- address_32bit_relocation:
- xchg [value_type],al
- mov ebx,[address_symbol]
- xchg ebx,[symbol_identifier]
- call mark_relocation
- mov [value_type],al
- mov [symbol_identifier],ebx
- address_32bit_relocation_ok:
- mov eax,edx
- stos dword [edi]
- ret
- store_address_64bit_value:
- test ch,0F0h
- jz address_64bit_relocation_ok
- mov eax,ecx
- shr eax,16
- xchg [value_type],al
- mov ebx,[address_symbol]
- xchg ebx,[symbol_identifier]
- call mark_relocation
- mov [value_type],al
- mov [symbol_identifier],ebx
- address_64bit_relocation_ok:
- mov eax,edx
- stos dword [edi]
- mov eax,[address_high]
- stos dword [edi]
- ret
- address_immediate_sib:
- test ch,44h
- jnz address_immediate_sib_32bit
- test ch,not 88h
- jnz invalid_address_size
- test edx,80000000h
- jz address_immediate_sib_store
- cmp [address_high],0
- je address_immediate_sib_nosignextend
- address_immediate_sib_store:
- call store_instruction_code
- mov al,100b
- mov ah,100101b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos word [edi]
- jmp store_address_32bit_value
- address_immediate_sib_32bit:
- test ecx,0FF0000h
- jnz address_immediate_sib_nosignextend
- test edx,80000000h
- jz address_immediate_sib_store
- address_immediate_sib_nosignextend:
- call address_32bit_prefix
- jmp address_immediate_sib_store
- address_eip_based:
- mov al,67h
- stos byte [edi]
- address_rip_based:
- cmp [code_type],64
- jne invalid_address
- call store_instruction_code
- jmp store_immediate_address
- address_relative:
- call store_instruction_code
- movzx eax,[immediate_size]
- add eax,edi
- sub eax,[current_offset]
- add eax,5
- sub edx,eax
- jno address_relative_ok
- call recoverable_overflow
- address_relative_ok:
- mov al,101b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- shr ecx,16
- xchg [value_type],cl
- mov ebx,[address_symbol]
- xchg ebx,[symbol_identifier]
- mov eax,edx
- call mark_relocation
- mov [value_type],cl
- mov [symbol_identifier],ebx
- stos dword [edi]
- ret
- addressing_16bit:
- cmp edx,10000h
- jge address_immediate_32bit
- cmp edx,-8000h
- jl address_immediate_32bit
- movzx edx,dx
- address_immediate_16bit:
- call address_16bit_prefix
- call store_instruction_code
- mov al,110b
- mov cl,[postbyte_register]
- shl cl,3
- or al,cl
- stos byte [edi]
- mov eax,edx
- stos word [edi]
- cmp edx,10000h
- jge value_out_of_range
- cmp edx,-8000h
- jl value_out_of_range
- ret
- address_16bit_prefix:
- cmp [code_type],16
- je instruction_prefix_ok
- mov al,67h
- stos byte [edi]
- ret
- address_32bit_prefix:
- cmp [code_type],32
- je instruction_prefix_ok
- mov al,67h
- stos byte [edi]
- instruction_prefix_ok:
- ret
-store_instruction_with_imm8:
- mov [immediate_size],1
- call store_instruction
- mov al,byte [value]
- stos byte [edi]
- ret
-store_instruction_with_imm16:
- mov [immediate_size],2
- call store_instruction
- mov ax,word [value]
- call mark_relocation
- stos word [edi]
- ret
-store_instruction_with_imm32:
- mov [immediate_size],4
- call store_instruction
- mov eax,dword [value]
- call mark_relocation
- stos dword [edi]
- ret