fasm: the program updated to 1.70.01

tested with the kernel and several applications
sorry for previous ugly commit


git-svn-id: svn://kolibrios.org@2665 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2012-05-20 14:43:49 +00:00
parent 96a29bfdda
commit 73798864bd
15 changed files with 6038 additions and 5183 deletions

View File

@ -2,46 +2,26 @@
Visit http://flatassembler.net/ for more information. Visit http://flatassembler.net/ for more information.
version 1.69.11 (Dec 19, 2009) version 1.70.01 (Apr 30, 2012)
[+] Allowed syntax of "pmovmskb" with 64-bit register destination in long mode. [-] Corrected a recently introduced bug that caused some incorrect
address expressions to cause an error prematurely during the
[-] The code generated for "call eax" instruction was missing prefix in 16-bit parsing stage.
mode - fixed.
version 1.69.10 (Oct 28, 2009) version 1.70 (Apr 17, 2012)
[-] Fixed long mode opcode generator to allow absolute addresses to be [+] Added support for AVX, AVX2, AES, CLMUL, FMA, RDRAND, FSGSBASE, F16C,
generated with "qword" keyword inside square brackets. FMA4, XOP, MOVBE, BMI, TBM, INVPCID, HLE and RTM instruction sets.
[+] Added half-precision floating point values support.
version 1.69.09 (Oct 20, 2009) [+] Extended the syntax of "rept" directive to allow numerical expressions
to be calculated by preprocessor in its arguments.
[-] Fixed a crash during the symbolic information generation when a "static" [+] Added "large" and "NX" settings from PE format.
symbol was encountered.
[+] Allowed PE fixups to be resolved anywhere in the generated executable.
version 1.69.08 (Oct 04, 2009)
[-] Minor bugfixes.
version 1.69.07 (Oct 03, 2009)
[-] Corrected encoding of "extrq" intruction for some cases.
version 1.69.06 (Sep 29, 2009)
[-] The prefix 67h for "jecxz" and "loopd" instructions in 64-bit mode wasn't
correctly generated - fixed.
[-] It's no longer possible to define two special segments of the same type
in ELF executables.
version 1.69.05 (Sep 14, 2009)
[+] Allowed to specify branding value (use 3 for Linux) after the [+] Allowed to specify branding value (use 3 for Linux) after the
"format ELF executable" setting. "format ELF executable" setting.
@ -49,38 +29,42 @@ version 1.69.05 (Sep 14, 2009)
[+] Added "intepreter", "dynamic" and "note" keywords for creation of [+] Added "intepreter", "dynamic" and "note" keywords for creation of
special segments in ELF executables. special segments in ELF executables.
[-] Fixed long mode opcode generator to allow absolute addresses to be
generated with "qword" keyword inside square brackets.
version 1.69.04 (Sep 7, 2009) [-] Disallowed negative immediates with "int", "enter", "ret" instructions.
[-] Fixed a bug with REX prefix generation with address of type "rX+rsp". [+] Allowed symbolic information dump file to be created even in case of error.
In such case it contains only the preprocessed source that can be extracted
with PREPSRC tool. If error occured during preprocessing, only the source up
to the point of error is provided.
[+] Added symbol references table to symbolic dump file.
version 1.69.03 (Aug 03, 2009) [-] Corrected the "defined" and "used" flags in the symbols dump to reflect the
state from the final assembly pass.
[+] Allowed simplified syntax for "monitor", "mwait", "blendvps", "blendvpd" and [+] Added "assert" directive.
"pblendvb" instructions.
[-] Formatter symbols like "PE" or "readable" are now recognized only in the
context of formatter directives, and thus are no longer disallowed as
labels.
version 1.69.02 (Jul 04, 2009) [+] Macroinstruction argument now can have default value, defined with "="
symbol followed by value after the argument name in definition.
[-] Minor bugfixes. [+] Added "relativeto" operator, which can be used in logical expressions
to test whether two values differ only by a constant and not relocatable
amount.
[-] Revised the expression calculator, it now is able to correctly perform
version 1.69.01 (Jul 01, 2009) calculations in signed and unsigned ranges in full 64-bit. This fixes
a number of issues - the overflow will now be correctly detected for
[+] Added "movbe" instruction. 64-bit values in cases, where previous versions could not distinguish
whether it was an overflow or not. The effect of these corrections is
[-] "extractps" no longer generates the double 66h prefix. that "dq" directive will now behave consistently with behavior of the
data directives for smaller sizes, and the same applies to all the
places where "qword" size for value is used.
version 1.69.00 (Jun 23, 2009)
[+] Extended the syntax of "rept" directive to allow numerical expressions
to be calculated by preprocessor in its arguments.
[-] The code of assembler (but not data) has been made position-independent, and
this allowed to use code segmentation in DOS unREAL mode, so the code is
no longer limited to 64 kilobytes.
version 1.68 (Jun 13, 2009) version 1.68 (Jun 13, 2009)

View File

@ -35,6 +35,8 @@ assembler:
mov [file_extension],eax mov [file_extension],eax
mov [next_pass_needed],al mov [next_pass_needed],al
mov [output_format],al mov [output_format],al
mov [org_origin_sign],al
mov [adjustment_sign],al
mov [labels_type],al mov [labels_type],al
mov [virtual_data],al mov [virtual_data],al
mov [code_type],16 mov [code_type],16
@ -169,6 +171,8 @@ assemble_line:
mov [prefixed_instruction],0 mov [prefixed_instruction],0
cmp [symbols_file],0 cmp [symbols_file],0
je continue_line je continue_line
cmp [next_pass_needed],0
jne continue_line
mov ebx,[display_buffer] mov ebx,[display_buffer]
mov dword [ebx-4],1 mov dword [ebx-4],1
mov dword [ebx-8],1Ch mov dword [ebx-8],1Ch
@ -185,6 +189,11 @@ assemble_line:
mov [ebx+8+4],edx mov [ebx+8+4],edx
mov [ebx+10h],ecx mov [ebx+10h],ecx
mov edx,[org_symbol] mov edx,[org_symbol]
; mov al,[virtual_data]
; mov ah,[org_origin_sign]
; shl eax,16
; mov al,[labels_type]
; mov ah,[code_type]
mov eax,dword [labels_type] mov eax,dword [labels_type]
mov [ebx+14h],edx mov [ebx+14h],edx
mov [ebx+18h],eax mov [ebx+18h],eax
@ -199,24 +208,39 @@ assemble_line:
je reserved_word_used_as_symbol je reserved_word_used_as_symbol
mov ebx,eax mov ebx,eax
lods byte [esi] lods byte [esi]
mov cl,al mov [label_size],al
call make_label
jmp continue_line
make_label:
mov eax,edi mov eax,edi
xor edx,edx xor edx,edx
xor cl,cl
sub eax,dword [org_origin] sub eax,dword [org_origin]
sbb edx,dword [org_origin+4] sbb edx,dword [org_origin+4]
mov ch,[labels_type] sbb cl,[org_origin_sign]
jp label_value_ok
call recoverable_overflow
label_value_ok:
mov [address_sign],cl
cmp [virtual_data],0 cmp [virtual_data],0
jne make_virtual_label jne make_virtual_label
or byte [ebx+9],1 or byte [ebx+9],1
xchg eax,[ebx] xchg eax,[ebx]
xchg edx,[ebx+4] xchg edx,[ebx+4]
mov ch,[ebx+9]
shr ch,1
and ch,1
neg ch
sub eax,[ebx] sub eax,[ebx]
sbb edx,[ebx+4] sbb edx,[ebx+4]
sbb ch,cl
mov dword [adjustment],eax mov dword [adjustment],eax
mov dword [adjustment+4],edx mov dword [adjustment+4],edx
mov [adjustment_sign],ch
or al,ch
or eax,edx or eax,edx
setnz ah setnz ah
jmp finish_label_symbol jmp finish_label
make_virtual_label: make_virtual_label:
and byte [ebx+9],not 1 and byte [ebx+9],not 1
cmp eax,[ebx] cmp eax,[ebx]
@ -226,7 +250,17 @@ assemble_line:
mov [ebx+4],edx mov [ebx+4],edx
setne al setne al
or ah,al or ah,al
finish_label:
mov ch,[labels_type]
mov cl,[label_size]
mov ebp,[org_registers]
mov edx,[org_symbol]
finish_label_symbol: 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] cmp cl,[ebx+10]
mov [ebx+10],cl mov [ebx+10],cl
setne al setne al
@ -235,14 +269,12 @@ assemble_line:
mov [ebx+11],ch mov [ebx+11],ch
setne al setne al
or ah,al or ah,al
mov edx,[org_registers] cmp ebp,[ebx+12]
cmp edx,[ebx+12] mov [ebx+12],ebp
mov [ebx+12],edx
setne al setne al
or ah,al or ah,al
or ch,ch or ch,ch
jz label_symbol_ok jz label_symbol_ok
mov edx,[org_symbol]
cmp edx,[ebx+20] cmp edx,[ebx+20]
mov [ebx+20],edx mov [ebx+20],edx
setne al setne al
@ -261,17 +293,18 @@ assemble_line:
sub cx,[ebx+16] sub cx,[ebx+16]
setnz al setnz al
or ah,al or ah,al
jz continue_line jz label_made
test byte [ebx+8],8 test byte [ebx+8],8
jz continue_line jz label_made
mov cx,[current_pass] mov cx,[current_pass]
cmp cx,[ebx+18] cmp cx,[ebx+18]
jne continue_line jne label_made
or [next_pass_needed],-1 or [next_pass_needed],-1
jmp continue_line label_made:
ret
new_label: new_label:
or byte [ebx+8],1 or byte [ebx+8],1
jmp continue_line ret
define_constant: define_constant:
lods dword [esi] lods dword [esi]
inc esi inc esi
@ -293,6 +326,7 @@ assemble_line:
push eax push eax
mov al,byte [esi-1] mov al,byte [esi-1]
push eax push eax
or [size_override],-1
call get_value call get_value
pop ebx pop ebx
mov ch,bl mov ch,bl
@ -314,6 +348,11 @@ assemble_line:
mov [ebx+4],edx mov [ebx+4],edx
setne al setne al
or ah,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] cmp cl,[ebx+10]
mov [ebx+10],cl mov [ebx+10],cl
setne al setne al
@ -370,12 +409,12 @@ assemble_line:
; mov [size_override],0 ; mov [size_override],0
; mov [operand_prefix],0 ; mov [operand_prefix],0
; mov [opcode_prefix],0 ; mov [opcode_prefix],0
mov dword [operand_size],0 and dword [operand_size],0
; mov [rex_prefix],0 ; mov [rex_prefix],0
; mov [vex_required],0 ; mov [vex_required],0
; mov [vex_register],0 ; mov [vex_register],0
; mov [immediate_size],0 ; mov [immediate_size],0
mov dword [rex_prefix],0 and dword [rex_prefix],0
call instruction_handler call instruction_handler
instruction_handler: instruction_handler:
movzx ebx,word [esi] movzx ebx,word [esi]
@ -408,13 +447,18 @@ org_directive:
test cl,1 test cl,1
jnz invalid_use_of_symbol jnz invalid_use_of_symbol
mov [labels_type],cl mov [labels_type],cl
mov ecx,edi mov dword [org_origin],edi
sub ecx,eax xor ecx,ecx
adc edx,0 mov dword [org_origin+4],ecx
neg edx mov [org_origin_sign],cl
mov dword [org_origin],ecx mov [org_registers],ecx
mov dword [org_origin+4],edx mov cl,[value_sign]
mov [org_registers],0 sub dword [org_origin],eax
sbb dword [org_origin+4],edx
sbb [org_origin_sign],cl
jp org_value_ok
call recoverable_overflow
org_value_ok:
mov [org_start],edi mov [org_start],edi
mov edx,[symbol_identifier] mov edx,[symbol_identifier]
mov [org_symbol],edx mov [org_symbol],edx
@ -436,7 +480,7 @@ label_directive:
je reserved_word_used_as_symbol je reserved_word_used_as_symbol
inc esi inc esi
mov ebx,eax mov ebx,eax
xor cl,cl mov [label_size],0
lods byte [esi] lods byte [esi]
cmp al,':' cmp al,':'
je get_label_size je get_label_size
@ -447,30 +491,12 @@ label_directive:
lods word [esi] lods word [esi]
cmp al,11h cmp al,11h
jne invalid_argument jne invalid_argument
mov cl,ah mov [label_size],ah
label_size_ok: label_size_ok:
mov eax,edi
xor edx,edx
sub eax,dword [org_origin]
sbb edx,dword [org_origin+4]
mov ebp,[org_registers]
cmp byte [esi],80h cmp byte [esi],80h
je get_free_label_value je get_free_label_value
mov ch,[labels_type] call make_label
push [org_symbol] jmp instruction_assembled
pop [address_symbol]
cmp [virtual_data],0
jne make_free_label
or byte [ebx+9],1
xchg eax,[ebx]
xchg edx,[ebx+4]
sub eax,[ebx]
sbb edx,[ebx+4]
mov dword [adjustment],eax
mov dword [adjustment+4],edx
or eax,edx
setne ah
jmp finish_label
get_free_label_value: get_free_label_value:
inc esi inc esi
lods byte [esi] lods byte [esi]
@ -507,50 +533,9 @@ label_directive:
mov [ebx+4],edx mov [ebx+4],edx
setne al setne al
or ah,al or ah,al
finish_label:
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 free_label_symbol_ok
mov edx,[address_symbol] mov edx,[address_symbol]
cmp edx,[ebx+20] mov cl,[label_size]
mov [ebx+20],edx call finish_label_symbol
setne al
or ah,al
free_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_free_label
cmp cx,[ebx+16]
je symbol_already_defined
inc cx
sub cx,[ebx+16]
setnz al
or ah,al
jz instruction_assembled
test byte [ebx+8],8
jz instruction_assembled
mov cx,[current_pass]
cmp cx,[ebx+18]
jne instruction_assembled
or [next_pass_needed],-1
jmp instruction_assembled
new_free_label:
or byte [ebx+8],1
jmp instruction_assembled jmp instruction_assembled
load_directive: load_directive:
lods byte [esi] lods byte [esi]
@ -571,8 +556,8 @@ load_directive:
cmp al,8 cmp al,8
ja invalid_value ja invalid_value
mov [operand_size],al mov [operand_size],al
mov dword [value],0 and dword [value],0
mov dword [value+4],0 and dword [value+4],0
lods word [esi] lods word [esi]
cmp ax,82h+'(' shl 8 cmp ax,82h+'(' shl 8
jne invalid_argument jne invalid_argument
@ -603,13 +588,10 @@ load_directive:
rep movs byte [edi],[esi] rep movs byte [edi],[esi]
jmp value_loaded jmp value_loaded
bad_load_address: bad_load_address:
cmp [error_line],0 call recoverable_overflow
jne value_loaded
mov eax,[current_line]
mov [error_line],eax
mov [error],value_out_of_range
value_loaded: value_loaded:
pop edi esi pop edi esi
mov [value_sign],0
mov eax,dword [value] mov eax,dword [value]
mov edx,dword [value+4] mov edx,dword [value+4]
pop ebx pop ebx
@ -627,6 +609,7 @@ store_directive:
mov [operand_size],1 mov [operand_size],1
jmp store_value_ok jmp store_value_ok
sized_store: sized_store:
or [size_override],-1
call get_value call get_value
store_value_ok: store_value_ok:
cmp [value_type],0 cmp [value_type],0
@ -669,11 +652,7 @@ store_directive:
jmp instruction_assembled jmp instruction_assembled
bad_store_address: bad_store_address:
pop edi esi pop edi esi
cmp [error_line],0 call recoverable_overflow
jne instruction_assembled
mov eax,[current_line]
mov [error_line],eax
mov [error],value_out_of_range
jmp instruction_assembled jmp instruction_assembled
display_directive: display_directive:
@ -795,10 +774,8 @@ virtual_directive:
je invalid_value je invalid_value
call get_address_value call get_address_value
mov ebp,[address_symbol] mov ebp,[address_symbol]
xor ch,ch
or bh,bh or bh,bh
jz set_virtual setnz ch
mov ch,1
jmp set_virtual jmp set_virtual
virtual_at_current: virtual_at_current:
dec esi dec esi
@ -807,8 +784,11 @@ virtual_directive:
mov ebp,[org_symbol] mov ebp,[org_symbol]
mov eax,edi mov eax,edi
xor edx,edx xor edx,edx
xor cl,cl
sub eax,dword [org_origin] sub eax,dword [org_origin]
sbb edx,dword [org_origin+4] sbb edx,dword [org_origin+4]
sbb cl,[org_origin_sign]
mov [address_sign],cl
mov bx,word [org_registers] mov bx,word [org_registers]
mov cx,word [org_registers+2] mov cx,word [org_registers+2]
xchg bh,bl xchg bh,bl
@ -821,19 +801,27 @@ virtual_directive:
mov byte [org_registers+3],cl mov byte [org_registers+3],cl
call allocate_structure_data call allocate_structure_data
mov word [ebx],virtual_directive-instruction_handler mov word [ebx],virtual_directive-instruction_handler
mov cl,[address_sign]
not eax not eax
not edx not edx
not cl
add eax,1 add eax,1
adc edx,0 adc edx,0
adc cl,0
add eax,edi add eax,edi
adc edx,0 adc edx,0
adc cl,0
xchg dword [org_origin],eax xchg dword [org_origin],eax
xchg dword [org_origin+4],edx xchg dword [org_origin+4],edx
xchg [org_origin_sign],cl
mov [ebx+10h],eax mov [ebx+10h],eax
mov [ebx+14h],edx mov [ebx+14h],edx
pop eax pop eax
mov [ebx+18h],eax mov [ebx+18h],eax
mov al,[virtual_data] mov al,[virtual_data]
and al,0Fh
shl cl,4
or al,cl
mov [ebx+2],al mov [ebx+2],al
mov al,[labels_type] mov al,[labels_type]
mov [ebx+3],al mov [ebx+3],al
@ -876,7 +864,14 @@ virtual_directive:
call find_structure_data call find_structure_data
jc unexpected_instruction jc unexpected_instruction
mov al,[ebx+2] mov al,[ebx+2]
mov ah,al
shr ah,4
and al,1
neg al
and ah,1
neg ah
mov [virtual_data],al mov [virtual_data],al
mov [org_origin_sign],ah
mov al,[ebx+3] mov al,[ebx+3]
mov [labels_type],al mov [labels_type],al
mov eax,[ebx+10h] mov eax,[ebx+10h]
@ -1339,7 +1334,7 @@ data_words:
cmp al,'?' cmp al,'?'
jne invalid_argument jne invalid_argument
mov eax,edi mov eax,edi
mov word [edi],0 and word [edi],0
scas word [edi] scas word [edi]
jmp undefined_data jmp undefined_data
ret ret
@ -1377,7 +1372,7 @@ data_dwords:
cmp al,'?' cmp al,'?'
jne invalid_argument jne invalid_argument
mov eax,edi mov eax,edi
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
jmp undefined_data jmp undefined_data
get_dword: get_dword:
@ -1420,9 +1415,9 @@ data_pwords:
cmp al,'?' cmp al,'?'
jne invalid_argument jne invalid_argument
mov eax,edi mov eax,edi
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
mov word [edi],0 and word [edi],0
scas word [edi] scas word [edi]
jmp undefined_data jmp undefined_data
get_pword: get_pword:
@ -1467,9 +1462,9 @@ data_qwords:
cmp al,'?' cmp al,'?'
jne invalid_argument jne invalid_argument
mov eax,edi mov eax,edi
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
jmp undefined_data jmp undefined_data
get_qword: get_qword:
@ -1487,11 +1482,11 @@ data_twords:
cmp al,'?' cmp al,'?'
jne invalid_argument jne invalid_argument
mov eax,edi mov eax,edi
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
mov dword [edi],0 and dword [edi],0
scas dword [edi] scas dword [edi]
mov word [edi],0 and word [edi],0
scas word [edi] scas word [edi]
jmp undefined_data jmp undefined_data
get_tword: get_tword:
@ -1647,7 +1642,7 @@ data_file:
mov esi,[eax] mov esi,[eax]
test byte [eax+7],80h test byte [eax+7],80h
jz get_current_path jz get_current_path
mov eax,[eax+12] mov eax,[eax+8]
jmp find_current_source_path jmp find_current_source_path
get_current_path: get_current_path:
lodsb lodsb
@ -1665,15 +1660,31 @@ data_file:
jmp cut_current_path jmp cut_current_path
current_path_ok: current_path_ok:
mov esi,[esp+4] mov esi,[esp+4]
call preprocess_path call expand_path
pop edx pop edx
mov esi,edx mov esi,edx
call open call open
jnc file_opened 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 edi,esi
mov esi,[esp] mov esi,[esp]
push edi push edi
call preprocess_path call expand_path
pop edx pop edx
mov esi,edx mov esi,edx
call open call open

View File

@ -68,6 +68,10 @@ avx_movshdup_instruction:
or [vex_required],2 or [vex_required],2
mov [opcode_prefix],0F3h mov [opcode_prefix],0F3h
mov [mmx_size],0 mov [mmx_size],0
jmp avx_instruction
avx_128bit_instruction:
mov [mmx_size],16
mov [opcode_prefix],66h
avx_instruction: avx_instruction:
mov [base_code],0Fh mov [base_code],0Fh
mov [extended_code],al mov [extended_code],al
@ -207,8 +211,11 @@ avx_instruction:
ret ret
avx_smem: avx_smem:
xchg al,[operand_size] xchg al,[operand_size]
or al,al
jz avx_smem_ok
cmp al,[mmx_size] cmp al,[mmx_size]
jne invalid_operand_size jne invalid_operand_size
avx_smem_ok:
clc clc
ret ret
take_imm4_if_needed: take_imm4_if_needed:
@ -229,23 +236,24 @@ avx_instruction:
imm4_ok: imm4_ok:
ret ret
avx_128bit_instruction:
mov [mmx_size],16
mov [opcode_prefix],66h
jmp avx_instruction
avx_single_source_128bit_instruction_38: avx_single_source_128bit_instruction_38:
or [vex_required],2 or [vex_required],2
avx_128bit_instruction_38: avx_128bit_instruction_38:
mov [mmx_size],16 mov [mmx_size],16
jmp avx_instruction_38_setup
avx_single_source_instruction_38:
or [vex_required],2
avx_instruction_38:
mov [mmx_size],0
avx_instruction_38_setup: avx_instruction_38_setup:
mov [opcode_prefix],66h mov [opcode_prefix],66h
mov [supplemental_code],al mov [supplemental_code],al
mov al,38h mov al,38h
jmp avx_instruction jmp avx_instruction
avx_single_source_instruction_38: avx_instruction_38_w1:
or [vex_required],2 or [rex_prefix],8
mov [mmx_size],0 jmp avx_instruction_38
jmp avx_instruction_38_setup
avx_ss_instruction_3a_imm8: avx_ss_instruction_3a_imm8:
mov [mmx_size],4 mov [mmx_size],4
jmp avx_instruction_3a_imm8_setup jmp avx_instruction_3a_imm8_setup
@ -262,11 +270,6 @@ avx_triple_source_instruction_3a:
mov [immediate_size],-1 mov [immediate_size],-1
mov byte [value],0 mov byte [value],0
jmp avx_instruction_3a_setup jmp avx_instruction_3a_setup
avx_triple_source_128bit_instruction_3a:
mov [mmx_size],16
mov [immediate_size],-1
mov byte [value],0
jmp avx_instruction_3a_setup
avx_single_source_instruction_3a_imm8: avx_single_source_instruction_3a_imm8:
or [vex_required],2 or [vex_required],2
avx_instruction_3a_imm8: avx_instruction_3a_imm8:
@ -283,9 +286,21 @@ avx_pclmulqdq_instruction:
mov [mmx_size],16 mov [mmx_size],16
mov al,44h mov al,44h
jmp avx_instruction_3a_setup jmp avx_instruction_3a_setup
avx_permq_instruction:
or [vex_required],2
or [rex_prefix],8
avx_perm2f128_instruction: avx_perm2f128_instruction:
call setup_66_0f_3a
mov [immediate_size],1 mov [immediate_size],1
mov ah,3Ah
jmp avx_perm_instruction
avx_permd_instruction:
mov ah,38h
avx_perm_instruction:
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],ah
mov [supplemental_code],al
mov [mmx_size],0 mov [mmx_size],0
or [vex_required],1 or [vex_required],1
call take_avx_register call take_avx_register
@ -293,12 +308,6 @@ avx_perm2f128_instruction:
jne invalid_operand_size jne invalid_operand_size
mov [postbyte_register],al mov [postbyte_register],al
jmp avx_vex_reg jmp avx_vex_reg
setup_66_0f_3a:
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],3Ah
mov [supplemental_code],al
ret
avx_movdqu_instruction: avx_movdqu_instruction:
mov [opcode_prefix],0F3h mov [opcode_prefix],0F3h
@ -340,7 +349,7 @@ avx_movntps_instruction:
avx_lddqu_instruction: avx_lddqu_instruction:
mov [opcode_prefix],0F2h mov [opcode_prefix],0F2h
mov [mmx_size],0 mov [mmx_size],0
xor cl,cl xor cx,cx
avx_load_instruction: avx_load_instruction:
mov [base_code],0Fh mov [base_code],0Fh
mov [extended_code],al mov [extended_code],al
@ -362,6 +371,8 @@ avx_lddqu_instruction:
jne invalid_operand jne invalid_operand
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
cmp al,10h
je avx_load_reg_reg
cmp al,'[' cmp al,'['
jne invalid_operand jne invalid_operand
call get_address call get_address
@ -376,25 +387,50 @@ avx_lddqu_instruction:
cmp al,ah cmp al,ah
jne invalid_operand_size jne invalid_operand_size
jmp instruction_ready jmp instruction_ready
avx_load_reg_reg:
lods byte [esi]
call convert_avx_register
cmp ch,ah
jne invalid_operand
mov bl,al
pop eax
xchg ah,[operand_size]
mov [postbyte_register],al
jmp nomem_instruction_ready
avx_movntdqa_instruction: avx_movntdqa_instruction:
mov [mmx_size],16 mov [mmx_size],0
mov al,2Ah xor cx,cx
mov cl,16
jmp avx_load_instruction_38 jmp avx_load_instruction_38
avx_broadcastss_instruction: avx_broadcastss_instruction:
mov [mmx_size],4 mov [mmx_size],4
mov al,18h
xor cl,cl xor cl,cl
mov ch,16
jmp avx_load_instruction_38 jmp avx_load_instruction_38
avx_broadcastsd_instruction: avx_broadcastsd_instruction:
mov [mmx_size],8 mov [mmx_size],8
mov al,19h
mov cl,32 mov cl,32
mov ch,16
jmp avx_load_instruction_38
avx_pbroadcastb_instruction:
mov [mmx_size],1
jmp avx_pbroadcast_instruction
avx_pbroadcastw_instruction:
mov [mmx_size],2
jmp avx_pbroadcast_instruction
avx_pbroadcastd_instruction:
mov [mmx_size],4
jmp avx_pbroadcast_instruction
avx_pbroadcastq_instruction:
mov [mmx_size],8
avx_pbroadcast_instruction:
xor cl,cl
mov ch,16
jmp avx_load_instruction_38 jmp avx_load_instruction_38
avx_broadcastf128_instruction: avx_broadcastf128_instruction:
mov [mmx_size],16 mov [mmx_size],16
mov al,1Ah
mov cl,32 mov cl,32
xor ch,ch
avx_load_instruction_38: avx_load_instruction_38:
mov [opcode_prefix],66h mov [opcode_prefix],66h
mov [supplemental_code],al mov [supplemental_code],al
@ -467,11 +503,10 @@ avx_movhlps_instruction:
call take_avx_register call take_avx_register
mov bl,al mov bl,al
jmp nomem_instruction_ready jmp nomem_instruction_ready
avx_maskmov_w1_instruction:
or [rex_prefix],8
avx_maskmov_instruction: avx_maskmov_instruction:
mov [opcode_prefix],66h call setup_66_0f_38
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
mov [mmx_size],0 mov [mmx_size],0
or [vex_required],1 or [vex_required],1
lods byte [esi] lods byte [esi]
@ -508,6 +543,12 @@ avx_maskmov_instruction:
mov [postbyte_register],al mov [postbyte_register],al
add [supplemental_code],2 add [supplemental_code],2
jmp instruction_ready jmp instruction_ready
setup_66_0f_38:
mov [extended_code],38h
mov [supplemental_code],al
mov [base_code],0Fh
mov [opcode_prefix],66h
ret
avx_movd_instruction: avx_movd_instruction:
or [vex_required],1 or [vex_required],1
jmp movd_instruction jmp movd_instruction
@ -638,13 +679,14 @@ avx_cvtps2pd_instruction:
jne invalid_operand jne invalid_operand
mov [mmx_size],cl mov [mmx_size],cl
call get_address call get_address
mov al,[operand_size] mov al,[mmx_size]
mov ah,al
xchg al,[operand_size]
or al,al or al,al
jz instruction_ready jz instruction_ready
shl al,1 shl al,1
cmp al,[mmx_size] cmp al,ah
jne invalid_operand_size jne invalid_operand_size
mov [operand_size],al
jmp instruction_ready jmp instruction_ready
avx_cvtpd2dq_instruction: avx_cvtpd2dq_instruction:
mov [opcode_prefix],0F2h mov [opcode_prefix],0F2h
@ -753,6 +795,12 @@ avx_extractf128_instruction:
mov [postbyte_register],al mov [postbyte_register],al
pop ebx pop ebx
jmp mmx_nomem_imm8 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
avx_insertf128_instruction: avx_insertf128_instruction:
or [vex_required],1 or [vex_required],1
call setup_66_0f_3a call setup_66_0f_3a
@ -840,10 +888,46 @@ avx_maskmovdqu_instruction:
jmp maskmovdqu_instruction jmp maskmovdqu_instruction
avx_pmovmskb_instruction: avx_pmovmskb_instruction:
or [vex_required],1 or [vex_required],1
jmp pmovmskb_instruction 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
avx_pshufd_instruction: avx_pshufd_instruction:
or [vex_required],1 or [vex_required],1
jmp pshufd_instruction mov [mmx_size],0
mov [opcode_prefix],al
mov [base_code],0Fh
mov [extended_code],70h
call take_avx_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_rm
jnc mmx_imm8
mov bl,al
jmp mmx_nomem_imm8
avx_pmovsxbw_instruction: avx_pmovsxbw_instruction:
mov [mmx_size],8 mov [mmx_size],8
jmp avx_pmovsx_instruction jmp avx_pmovsx_instruction
@ -863,7 +947,40 @@ avx_pmovsxdq_instruction:
mov [mmx_size],8 mov [mmx_size],8
avx_pmovsx_instruction: avx_pmovsx_instruction:
or [vex_required],1 or [vex_required],1
jmp pmovsx_instruction call setup_66_0f_38
call take_avx_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,10h
je avx_pmovsx_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
pop eax
cmp al,32
jb avx_pmovsx_size_check
shl [mmx_size],1
avx_pmovsx_size_check:
xchg al,[operand_size]
test al,al
jz instruction_ready
cmp al,[mmx_size]
jne invalid_operand_size
jmp instruction_ready
avx_pmovsx_xmmreg_reg:
lods byte [esi]
call convert_xmm_register
mov bl,al
pop eax
mov [operand_size],al
jmp nomem_instruction_ready
avx_permil_instruction: avx_permil_instruction:
call setup_66_0f_3a call setup_66_0f_3a
or [vex_required],1 or [vex_required],1
@ -915,30 +1032,12 @@ avx_permil_instruction:
avx_permil_reg_mem: avx_permil_reg_mem:
call get_address call get_address
jmp mmx_imm8 jmp mmx_imm8
avx_pslldq_instruction:
mov [postbyte_register],al
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],73h
or [vex_required],1
call take_avx_register
cmp ah,16
jne invalid_operand
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp mmx_nomem_imm8
avx_bit_shift_instruction: avx_bit_shift_instruction:
mov [opcode_prefix],66h mov [opcode_prefix],66h
mov [base_code],0Fh mov [base_code],0Fh
mov [extended_code],al mov [extended_code],al
or [vex_required],1 or [vex_required],1
call take_avx_register call take_avx_register
cmp ah,16
jne invalid_operand
mov [postbyte_register],al mov [postbyte_register],al
lods byte [esi] lods byte [esi]
cmp al,',' cmp al,','
@ -953,12 +1052,12 @@ avx_bit_shift_instruction:
xchg cl,[operand_size] xchg cl,[operand_size]
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
xchg cl,[operand_size]
pop esi
cmp al,10h cmp al,10h
je avx_bit_shift_regs_reg je avx_bit_shift_regs_reg
pop esi
cmp al,'[' cmp al,'['
je avx_bit_shift_regs_mem je avx_bit_shift_regs_mem
xchg cl,[operand_size]
dec esi dec esi
mov bl,[extended_code] mov bl,[extended_code]
mov al,bl mov al,bl
@ -972,14 +1071,38 @@ avx_bit_shift_instruction:
xchg bl,[vex_register] xchg bl,[vex_register]
jmp mmx_nomem_imm8 jmp mmx_nomem_imm8
avx_bit_shift_regs_reg: avx_bit_shift_regs_reg:
call take_avx_register pop eax
lods byte [esi]
call convert_xmm_register
xchg cl,[operand_size]
mov bl,al mov bl,al
jmp nomem_instruction_ready jmp nomem_instruction_ready
avx_bit_shift_regs_mem: avx_bit_shift_regs_mem:
push ecx
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
call get_address 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 jmp instruction_ready
avx_pslldq_instruction:
mov [postbyte_register],al
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],73h
or [vex_required],1
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp mmx_nomem_imm8
vzeroall_instruction: vzeroall_instruction:
mov [operand_size],32 mov [operand_size],32
@ -1026,6 +1149,166 @@ vcvtps2ph_instruction:
mov [postbyte_register],al mov [postbyte_register],al
jmp mmx_nomem_imm8 jmp mmx_nomem_imm8
bmi_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],0F3h
mov [postbyte_register],al
bmi_reg:
or [vex_required],1
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],1
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],1
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],1
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],1
call get_reg_mem
jc rorx_reg_reg
call operand_32or64
jmp mmx_imm8
rorx_reg_reg:
call operand_32or64
jmp mmx_nomem_imm8
fma_instruction_pd: fma_instruction_pd:
or [rex_prefix],8 or [rex_prefix],8
fma_instruction_ps: fma_instruction_ps:
@ -1219,6 +1502,157 @@ vpermil2_instruction:
mov [mmx_size],0 mov [mmx_size],0
jmp avx_instruction jmp avx_instruction
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],1
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],1
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
gather_instruction_pd:
or [rex_prefix],8
gather_instruction_ps:
call setup_66_0f_38
or [vex_required],4
call take_avx_register
mov [postbyte_register],al
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]
test al,al
jz gather_elements_size_ok
test [rex_prefix],8
jnz gather_elements_64bit
cmp al,4
jne invalid_operand_size
jmp gather_elements_size_ok
gather_elements_64bit:
cmp al,8
jne invalid_operand_size
gather_elements_size_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
cmp al,[postbyte_register]
je disallowed_combination_of_registers
mov al,bl
and al,1111b
cmp al,[postbyte_register]
je disallowed_combination_of_registers
cmp al,[vex_register]
je disallowed_combination_of_registers
mov al,bl
shr al,4
cmp al,0Ch
je gather_vr_128bit
mov al,[rex_prefix]
shr al,3
xor al,[supplemental_code]
test al,1
jz gather_256bit
test [supplemental_code],1
jz invalid_operand_size
mov al,32
xchg al,[operand_size]
cmp al,16
jne invalid_operand_size
jmp instruction_ready
gather_256bit:
cmp ah,32
jne invalid_operand_size
jmp instruction_ready
gather_vr_128bit:
cmp ah,16
je instruction_ready
test [supplemental_code],1
jnz invalid_operand_size
test [rex_prefix],8
jz invalid_operand_size
jmp instruction_ready
take_avx_register: take_avx_register:
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
@ -1276,7 +1710,7 @@ store_vex_instruction_code:
cmp ah,0F2h cmp ah,0F2h
je vex_f2 je vex_f2
test ah,ah test ah,ah
jnz prefix_conflict jnz disallowed_combination_of_registers
ret ret
vex_f2: vex_f2:
or al,11b or al,11b

View File

@ -72,8 +72,8 @@ invalid_address_size:
address_sizes_do_not_agree: address_sizes_do_not_agree:
push _address_sizes_do_not_agree push _address_sizes_do_not_agree
jmp error_with_source jmp error_with_source
prefix_conflict: disallowed_combination_of_registers:
push _prefix_conflict push _disallowed_combination_of_registers
jmp error_with_source jmp error_with_source
long_immediate_not_encodable: long_immediate_not_encodable:
push _long_immediate_not_encodable push _long_immediate_not_encodable

File diff suppressed because it is too large Load Diff

View File

@ -134,11 +134,39 @@ convert_number:
symbol_value: symbol_value:
cmp [source_start],0 cmp [source_start],0
je preprocessor_value je preprocessor_value
push edi push edi esi
mov edi,address_registers lods word [esi]
call get_operator cmp al,1Ah
or al,al jne no_address_register
jnz register_value 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
cmp ah,8
je register_value
cmp ah,0Ch
je register_value
cmp ah,0Dh
je register_value
cmp ah,0Fh
je register_value
cmp ah,2
jne no_address_register
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 mov edi,directive_operators
call get_operator call get_operator
pop edi pop edi
@ -158,7 +186,7 @@ convert_number:
mov eax,0Fh mov eax,0Fh
jmp store_label_value jmp store_label_value
register_value: register_value:
pop edi pop edx edi
mov byte [edi-1],10h mov byte [edi-1],10h
stos byte [edi] stos byte [edi]
ret ret

View File

@ -35,14 +35,15 @@ formatter:
jae out_of_memory jae out_of_memory
cmp [file_extension],0 cmp [file_extension],0
jne extension_specified jne extension_specified
cmp [output_format],2 mov al,[output_format]
cmp al,2
je exe_extension je exe_extension
jb bin_extension jb bin_extension
cmp [output_format],4 cmp al,4
je obj_extension je obj_extension
cmp [output_format],5 cmp al,5
je o_extension je o_extension
cmp [output_format],3 cmp al,3
jne no_extension jne no_extension
cmp [subsystem],1 cmp [subsystem],1
je sys_extension je sys_extension
@ -164,7 +165,7 @@ formatter:
mov [current_offset],edi mov [current_offset],edi
sub edi,[code_start] sub edi,[code_start]
mov [code_size],edi mov [code_size],edi
mov [written_size],0 and [written_size],0
mov edx,[output_file] mov edx,[output_file]
call create call create
jc write_failed jc write_failed
@ -324,10 +325,18 @@ public_directive:
cmp eax,0Fh cmp eax,0Fh
jb invalid_use_of_symbol jb invalid_use_of_symbol
je reserved_word_used_as_symbol je reserved_word_used_as_symbol
inc esi
mov dx,[current_pass] mov dx,[current_pass]
mov [eax+18],dx mov [eax+18],dx
or byte [eax+8],8 or byte [eax+8],8
inc esi cmp [symbols_file],0
je public_reference_ok
cmp [next_pass_needed],0
jne public_reference_ok
mov ebx,eax
call store_label_reference
mov eax,ebx
public_reference_ok:
mov ebx,[free_additional_memory] mov ebx,[free_additional_memory]
lea edx,[ebx+10h] lea edx,[ebx+10h]
cmp edx,[structures_buffer] cmp edx,[structures_buffer]
@ -395,6 +404,7 @@ extrn_directive:
jne invalid_argument jne invalid_argument
extrn_size_ok: extrn_size_ok:
mov [address_symbol],edx mov [address_symbol],edx
mov [label_size],ah
movzx ecx,ah movzx ecx,ah
mov [edx+8],ecx mov [edx+8],ecx
xor eax,eax xor eax,eax
@ -485,6 +495,7 @@ mz_segment:
rep stos byte [edi] rep stos byte [edi]
mov dword [org_origin],edi mov dword [org_origin],edi
mov dword [org_origin+4],eax mov dword [org_origin+4],eax
mov [org_origin_sign],al
mov [org_registers],eax mov [org_registers],eax
mov [org_start],edi mov [org_start],edi
mov eax,edx mov eax,edx
@ -503,7 +514,8 @@ mz_segment:
segment_type_ok: segment_type_ok:
mov [code_type],al mov [code_type],al
mov eax,edx mov eax,edx
mov cx,0100h mov ch,1
mov [label_size],0
xor edx,edx xor edx,edx
xor ebp,ebp xor ebp,ebp
mov [address_symbol],edx mov [address_symbol],edx
@ -515,11 +527,7 @@ mz_entry:
call get_word_value call get_word_value
cmp [value_type],1 cmp [value_type],1
je initial_cs_ok je initial_cs_ok
cmp [error_line],0 call recoverable_invalid_address
jne initial_cs_ok
mov eax,[current_line]
mov [error_line],eax
mov [error],invalid_address
initial_cs_ok: initial_cs_ok:
mov edx,[additional_memory] mov edx,[additional_memory]
mov [edx+16h],ax mov [edx+16h],ax
@ -536,6 +544,14 @@ mz_entry:
mov edx,[additional_memory] mov edx,[additional_memory]
mov [edx+14h],ax mov [edx+14h],ax
jmp instruction_assembled 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: mz_stack:
lods byte [esi] lods byte [esi]
cmp al,'(' cmp al,'('
@ -553,11 +569,7 @@ mz_stack:
stack_pointer: stack_pointer:
cmp [value_type],1 cmp [value_type],1
je initial_ss_ok je initial_ss_ok
cmp [error_line],0 call recoverable_invalid_address
jne initial_ss_ok
mov eax,[current_line]
mov [error_line],eax
mov [error],invalid_address
initial_ss_ok: initial_ss_ok:
mov edx,[additional_memory] mov edx,[additional_memory]
mov [edx+0Eh],ax mov [edx+0Eh],ax
@ -834,7 +846,7 @@ format_pe:
mov [subsystem],3 mov [subsystem],3
mov [subsystem_version],3 + 10 shl 16 mov [subsystem_version],3 + 10 shl 16
mov [image_base],400000h mov [image_base],400000h
mov [image_base_high],0 and [image_base_high],0
test [format_flags],8 test [format_flags],8
jz pe_settings jz pe_settings
mov [machine],8664h mov [machine],8664h
@ -1061,7 +1073,7 @@ format_pe:
jc pe_entry_init_ok jc pe_entry_init_ok
mov [edx+28h],eax ; entry point rva mov [edx+28h],eax ; entry point rva
pe_entry_init_ok: pe_entry_init_ok:
mov [number_of_sections],0 and [number_of_sections],0
movzx ebx,word [edx+14h] movzx ebx,word [edx+14h]
lea ebx,[edx+18h+ebx] lea ebx,[edx+18h+ebx]
mov [current_section],ebx mov [current_section],ebx
@ -1071,38 +1083,45 @@ format_pe:
mov [ebx+0Ch],eax mov [ebx+0Ch],eax
mov dword [ebx+24h],0E0000060h mov dword [ebx+24h],0E0000060h
xor ecx,ecx xor ecx,ecx
xor bl,bl
not eax not eax
not ecx not ecx
not bl
add eax,1 add eax,1
adc ecx,0 adc ecx,0
adc bl,0
add eax,edi add eax,edi
adc ecx,0 adc ecx,0
adc bl,0
test [format_flags],4 test [format_flags],4
jnz peplus_org jnz peplus_org
sub eax,[edx+34h] sub eax,[edx+34h]
sbb ecx,0 sbb ecx,0
sbb bl,0
jmp pe_org_ok jmp pe_org_ok
peplus_org: peplus_org:
sub eax,[edx+30h] sub eax,[edx+30h]
sbb ecx,[edx+34h] sbb ecx,[edx+34h]
sbb bl,0
pe_org_ok: pe_org_ok:
test [format_flags],8 test [format_flags],8
jnz pe64_code jnz pe64_code
mov bl,2 mov bh,2
mov [code_type],32 mov [code_type],32
jmp pe_code_type_ok jmp pe_code_type_ok
pe64_code: pe64_code:
mov bl,4 mov bh,4
mov [code_type],64 mov [code_type],64
pe_code_type_ok: pe_code_type_ok:
bt [resolver_flags],0 bt [resolver_flags],0
jc pe_labels_type_ok jc pe_labels_type_ok
xor bl,bl xor bh,bh
pe_labels_type_ok: pe_labels_type_ok:
mov [labels_type],bl mov [labels_type],bh
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],ecx mov dword [org_origin+4],ecx
mov [org_registers],0 mov [org_origin_sign],bl
and [org_registers],0
mov [org_start],edi mov [org_start],edi
bt [format_flags],8 bt [format_flags],8
jnc dll_flag_ok jnc dll_flag_ok
@ -1155,13 +1174,15 @@ pe_section:
mov esi,edx mov esi,edx
rep movs byte [edi],[esi] rep movs byte [edi],[esi]
pop edi esi pop edi esi
mov dword [ebx+24h],0 and dword [ebx+24h],0
mov [ebx+14h],edi mov [ebx+14h],edi
mov edx,[code_start] mov edx,[code_start]
mov eax,edi mov eax,edi
xor ecx,ecx xor ecx,ecx
mov [org_origin_sign],0
sub eax,[ebx+0Ch] sub eax,[ebx+0Ch]
sbb ecx,0 sbb ecx,0
sbb [org_origin_sign],0
mov [labels_type],2 mov [labels_type],2
mov [code_type],32 mov [code_type],32
test [format_flags],8 test [format_flags],8
@ -1173,6 +1194,7 @@ pe_section:
jnz peplus_section_org jnz peplus_section_org
sub eax,[edx+34h] sub eax,[edx+34h]
sbb ecx,0 sbb ecx,0
sbb [org_origin_sign],0
bt [resolver_flags],0 bt [resolver_flags],0
jc pe_section_org_ok jc pe_section_org_ok
mov [labels_type],0 mov [labels_type],0
@ -1180,13 +1202,14 @@ pe_section:
peplus_section_org: peplus_section_org:
sub eax,[edx+30h] sub eax,[edx+30h]
sbb ecx,[edx+34h] sbb ecx,[edx+34h]
sbb [org_origin_sign],0
bt [resolver_flags],0 bt [resolver_flags],0
jc pe_section_org_ok jc pe_section_org_ok
mov [labels_type],0 mov [labels_type],0
pe_section_org_ok: pe_section_org_ok:
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],ecx mov dword [org_origin+4],ecx
mov [org_registers],0 and [org_registers],0
mov [org_start],edi mov [org_start],edi
get_section_flags: get_section_flags:
lods byte [esi] lods byte [esi]
@ -1246,7 +1269,7 @@ pe_section:
jb align_section jb align_section
mov edi,[undefined_data_start] mov edi,[undefined_data_start]
align_section: align_section:
mov [undefined_data_end],0 and [undefined_data_end],0
mov ebp,edi mov ebp,edi
sub ebp,[ebx+14h] sub ebp,[ebx+14h]
mov ecx,[edx+3Ch] mov ecx,[edx+3Ch]
@ -1373,11 +1396,7 @@ pe_entry:
check_pe_entry_label_type: check_pe_entry_label_type:
cmp [value_type],bl cmp [value_type],bl
je pe_entry_ok je pe_entry_ok
cmp [error_line],0 call recoverable_invalid_address
jne pe_entry_ok
mov edx,[current_line]
mov [error_line],edx
mov [error],invalid_address
pe_entry_ok: pe_entry_ok:
cdq cdq
test [format_flags],4 test [format_flags],4
@ -1395,19 +1414,13 @@ pe_entry:
check_pe64_entry_label_type: check_pe64_entry_label_type:
cmp [value_type],bl cmp [value_type],bl
je pe64_entry_type_ok je pe64_entry_type_ok
cmp [error_line],0 call recoverable_invalid_address
jne pe64_entry_type_ok
mov edx,[current_line]
mov [error_line],edx
mov [error],invalid_address
pe64_entry_type_ok: pe64_entry_type_ok:
mov ecx,[code_start] mov ecx,[code_start]
sub eax,[ecx+30h] sub eax,[ecx+30h]
sbb edx,[ecx+34h] sbb edx,[ecx+34h]
jz pe64_entry_range_ok jz pe64_entry_range_ok
mov edx,[current_line] call recoverable_overflow
mov [error_line],edx
mov [error],value_out_of_range
pe64_entry_range_ok: pe64_entry_range_ok:
mov [ecx+28h],eax mov [ecx+28h],eax
jmp instruction_assembled jmp instruction_assembled
@ -1540,11 +1553,7 @@ mark_pe_relocation:
check_standard_pe_relocation_type: check_standard_pe_relocation_type:
cmp [value_type],2 cmp [value_type],2
je pe_relocation_type_ok je pe_relocation_type_ok
cmp [error_line],0 call recoverable_misuse
jne pe_relocation_type_ok
mov eax,[current_line]
mov [error_line],eax
mov [error],invalid_use_of_symbol
pe_relocation_type_ok: pe_relocation_type_ok:
mov ebx,[current_section] mov ebx,[current_section]
mov eax,edi mov eax,edi
@ -1580,7 +1589,7 @@ make_pe_fixups:
jc fixups_ready jc fixups_ready
or [next_pass_needed],-1 or [next_pass_needed],-1
fixups_ready: fixups_ready:
mov [last_fixup_base],0 and [last_fixup_base],0
call make_fixups call make_fixups
xchg eax,[actual_fixups_size] xchg eax,[actual_fixups_size]
sub eax,[actual_fixups_size] sub eax,[actual_fixups_size]
@ -1652,7 +1661,7 @@ make_pe_resource:
je resource_from_file je resource_from_file
cmp [current_pass],0 cmp [current_pass],0
jne reserve_space_for_resource jne reserve_space_for_resource
mov [resource_size],0 and [resource_size],0
reserve_space_for_resource: reserve_space_for_resource:
add edi,[resource_size] add edi,[resource_size]
cmp edi,[display_buffer] cmp edi,[display_buffer]
@ -2310,18 +2319,28 @@ format_coff:
mov [current_section],ebx mov [current_section],ebx
xor eax,eax xor eax,eax
mov [number_of_sections],eax mov [number_of_sections],eax
mov dword [org_origin],edi call setup_coff_section_org
mov dword [org_origin+4],eax
mov [org_registers],eax
mov [org_start],edi
mov [org_symbol],ebx
mov [labels_type],2
mov [code_type],32 mov [code_type],32
test [format_flags],8 test [format_flags],8
jz format_defined jz format_defined
mov [labels_type],4
mov [code_type],64 mov [code_type],64
jmp format_defined jmp format_defined
setup_coff_section_org:
xor eax,eax
mov dword [org_origin],edi
mov dword [org_origin+4],eax
mov [org_origin_sign],al
mov [org_registers],eax
mov [org_start],edi
mov [org_symbol],ebx
test [format_flags],8
jnz coff_64bit_labels
mov [labels_type],2
ret
coff_64bit_labels:
mov [labels_type],4
ret
coff_section: coff_section:
call close_coff_section call close_coff_section
mov ebx,[free_additional_memory] mov ebx,[free_additional_memory]
@ -2334,18 +2353,9 @@ coff_section:
xor eax,eax xor eax,eax
mov [ebx],al mov [ebx],al
mov [ebx+8],edi mov [ebx+8],edi
mov dword [org_origin],edi
mov dword [org_origin+4],eax
mov [org_registers],eax
mov [org_start],edi
mov [org_symbol],ebx
mov [labels_type],2
test [format_flags],8
jz coff_labels_type_ok
mov [labels_type],4
coff_labels_type_ok:
mov [ebx+10h],eax mov [ebx+10h],eax
mov [ebx+14h],eax mov [ebx+14h],eax
call setup_coff_section_org
lods word [esi] lods word [esi]
cmp ax,'(' cmp ax,'('
jne invalid_argument jne invalid_argument
@ -2552,8 +2562,8 @@ coff_formatter:
mov edx,[esi+8] mov edx,[esi+8]
add esi,10h add esi,10h
inc eax inc eax
cmp byte [edx+11],2 cmp byte [edx+11],0
jne enumerate_symbols je enumerate_symbols
mov edx,[edx+20] mov edx,[edx+20]
cmp byte [edx],0C0h cmp byte [edx],0C0h
jae enumerate_symbols jae enumerate_symbols
@ -2803,13 +2813,14 @@ coff_formatter:
mov cx,[ecx+1Eh] mov cx,[ecx+1Eh]
mov [ebx+0Ch],cx mov [ebx+0Ch],cx
public_symbol_section_ok: public_symbol_section_ok:
cmp dword [eax+4],0 movzx ecx,byte [eax+9]
je store_public_symbol shr cl,1
cmp dword [eax+4],-1 and cl,1
neg ecx
cmp ecx,[eax+4]
jne value_out_of_range jne value_out_of_range
bt dword [eax],31 xor ecx,[eax]
jnc value_out_of_range js value_out_of_range
store_public_symbol:
mov eax,[eax] mov eax,[eax]
mov [ebx+8],eax mov [ebx+8],eax
mov al,2 mov al,2
@ -2850,7 +2861,7 @@ coff_formatter:
mov [edx],eax mov [edx],eax
sub edi,[code_start] sub edi,[code_start]
mov [code_size],edi mov [code_size],edi
mov [written_size],0 and [written_size],0
mov edx,[output_file] mov edx,[output_file]
call create call create
jc write_failed jc write_failed
@ -2910,7 +2921,6 @@ format_elf:
mov [code_type],32 mov [code_type],32
cmp word [esi],1D19h cmp word [esi],1D19h
je format_elf_exe je format_elf_exe
mov [labels_type],2
elf_header_ok: elf_header_ok:
mov byte [edx+10h],1 mov byte [edx+10h],1
mov eax,[additional_memory] mov eax,[additional_memory]
@ -2923,11 +2933,6 @@ format_elf:
xor eax,eax xor eax,eax
mov [current_section],ebx mov [current_section],ebx
mov [number_of_sections],eax mov [number_of_sections],eax
mov dword [org_origin],edi
mov dword [org_origin+4],eax
mov [org_registers],eax
mov [org_start],edi
mov [org_symbol],ebx
mov [ebx],al mov [ebx],al
mov [ebx+4],eax mov [ebx+4],eax
mov [ebx+8],edi mov [ebx+8],edi
@ -2935,6 +2940,7 @@ format_elf:
mov [ebx+14h],eax mov [ebx+14h],eax
mov al,4 mov al,4
mov [ebx+10h],eax mov [ebx+10h],eax
call setup_coff_section_org
test [format_flags],8 test [format_flags],8
jz format_defined jz format_defined
mov byte [ebx+10h],8 mov byte [ebx+10h],8
@ -2958,9 +2964,8 @@ format_elf:
mov byte [edx+3Ah],40h mov byte [edx+3Ah],40h
mov [code_type],64 mov [code_type],64
cmp word [esi],1D19h cmp word [esi],1D19h
je format_elf64_exe jne elf_header_ok
mov [labels_type],4 jmp format_elf64_exe
jmp elf_header_ok
elf_section: elf_section:
bt [format_flags],0 bt [format_flags],0
jc illegal_instruction jc illegal_instruction
@ -2976,21 +2981,10 @@ elf_section:
xor eax,eax xor eax,eax
mov [ebx],al mov [ebx],al
mov [ebx+8],edi mov [ebx+8],edi
mov dword [org_origin],edi
mov dword [org_origin+4],eax
mov [org_registers],eax
mov [org_start],edi
mov [org_symbol],ebx
test [format_flags],8
jnz elf64_labels_type
mov [labels_type],2
jmp elf_labels_type_ok
elf64_labels_type:
mov [labels_type],4
elf_labels_type_ok:
mov [ebx+10h],eax mov [ebx+10h],eax
mov al,10b mov al,10b
mov [ebx+14h],eax mov [ebx+14h],eax
call setup_coff_section_org
lods word [esi] lods word [esi]
cmp ax,'(' cmp ax,'('
jne invalid_argument jne invalid_argument
@ -3218,8 +3212,7 @@ elf_formatter:
mov dx,[eax+0Eh] mov dx,[eax+0Eh]
jmp section_for_public_ok jmp section_for_public_ok
undefined_public: undefined_public:
mov eax,[ebx+24] mov [error_info],ebx
mov [error_info],eax
jmp undefined_symbol jmp undefined_symbol
elf64_public: elf64_public:
cmp dl,4 cmp dl,4
@ -3233,7 +3226,15 @@ elf_formatter:
stos dword [edi] stos dword [edi]
test [format_flags],8 test [format_flags],8
jnz elf64_public_symbol jnz elf64_public_symbol
call get_public_value 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] stos dword [edi]
xor eax,eax xor eax,eax
mov al,[ebx+10] mov al,[ebx+10]
@ -3262,9 +3263,13 @@ elf_formatter:
or al,2 or al,2
store_elf64_public_info: store_elf64_public_info:
stos dword [edi] stos dword [edi]
call get_public_value mov al,[ebx+9]
shl eax,31-1
xor eax,[ebx+4]
js value_out_of_range
mov eax,[ebx]
stos dword [edi] stos dword [edi]
xor eax,eax mov eax,[ebx+4]
stos dword [edi] stos dword [edi]
mov al,[ebx+10] mov al,[ebx+10]
stos dword [edi] stos dword [edi]
@ -3278,16 +3283,6 @@ elf_formatter:
mov [esi],eax mov [esi],eax
add esi,10h add esi,10h
jmp find_other_symbols jmp find_other_symbols
get_public_value:
mov eax,[ebx]
cmp dword [ebx+4],0
je public_value_ok
cmp dword [ebx+4],-1
jne value_out_of_range
bt eax,31
jnc value_out_of_range
public_value_ok:
ret
make_extrn_symbol: make_extrn_symbol:
mov eax,[esi+4] mov eax,[esi+4]
stos dword [edi] stos dword [edi]
@ -3488,7 +3483,7 @@ elf_formatter:
stos dword [edi] stos dword [edi]
test [format_flags],8 test [format_flags],8
jz elf_machine_word_ok jz elf_machine_word_ok
mov dword [edi],0 and dword [edi],0
add edi,4 add edi,4
elf_machine_word_ok: elf_machine_word_ok:
ret ret
@ -3669,27 +3664,36 @@ format_elf_exe:
init_elf_segments: init_elf_segments:
xor eax,eax xor eax,eax
rep stos dword [edi] rep stos dword [edi]
mov [number_of_sections],0 and [number_of_sections],0
mov byte [ebx],1 mov byte [ebx],1
mov word [ebx+1Ch],1000h mov word [ebx+1Ch],1000h
mov byte [ebx+18h],111b mov byte [ebx+18h],111b
mov eax,edi mov eax,edi
xor ebp,ebp
xor cl,cl
sub eax,[code_start] sub eax,[code_start]
sbb ebp,0
sbb cl,0
mov [ebx+4],eax mov [ebx+4],eax
add eax,[image_base] add eax,[image_base]
adc ebp,0
adc cl,0
mov [ebx+8],eax mov [ebx+8],eax
mov [ebx+0Ch],eax mov [ebx+0Ch],eax
mov [edx+18h],eax mov [edx+18h],eax
xor edx,edx
not eax not eax
not edx not ebp
not cl
add eax,1 add eax,1
adc edx,0 adc ebp,0
adc cl,0
add eax,edi add eax,edi
adc edx,0 adc ebp,0
adc cl,0
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],edx mov dword [org_origin+4],edx
mov [org_registers],0 mov [org_origin_sign],cl
and [org_registers],0
mov [org_start],edi mov [org_start],edi
mov [symbols_stream],edi mov [symbols_stream],edi
jmp format_defined jmp format_defined
@ -3709,7 +3713,7 @@ format_elf_exe:
mov [edx+7],al mov [edx+7],al
elf64_exe_brand_ok: elf64_exe_brand_ok:
mov [image_base],400000h mov [image_base],400000h
mov [image_base_high],0 and [image_base_high],0
cmp byte [esi],80h cmp byte [esi],80h
jne elf64_exe_base_ok jne elf64_exe_base_ok
lods word [esi] lods word [esi]
@ -3735,7 +3739,7 @@ format_elf_exe:
init_elf64_segments: init_elf64_segments:
xor eax,eax xor eax,eax
rep stos dword [edi] rep stos dword [edi]
mov [number_of_sections],0 and [number_of_sections],0
mov byte [ebx],1 mov byte [ebx],1
mov word [ebx+30h],1000h mov word [ebx+30h],1000h
mov byte [ebx+4],111b mov byte [ebx+4],111b
@ -3744,8 +3748,10 @@ format_elf_exe:
sub eax,[code_start] sub eax,[code_start]
mov [ebx+8],eax mov [ebx+8],eax
xor edx,edx xor edx,edx
xor cl,cl
add eax,[image_base] add eax,[image_base]
adc edx,[image_base_high] adc edx,[image_base_high]
adc cl,0
mov [ebx+10h],eax mov [ebx+10h],eax
mov [ebx+10h+4],edx mov [ebx+10h+4],edx
mov [ebx+18h],eax mov [ebx+18h],eax
@ -3755,13 +3761,17 @@ format_elf_exe:
mov [ebx+18h+4],edx mov [ebx+18h+4],edx
not eax not eax
not edx not edx
not cl
add eax,1 add eax,1
adc edx,0 adc edx,0
adc cl,0
add eax,edi add eax,edi
adc edx,0 adc edx,0
adc cl,0
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],edx mov dword [org_origin+4],edx
mov [org_registers],0 mov [org_origin_sign],cl
and [org_registers],0
mov [org_start],edi mov [org_start],edi
mov [symbols_stream],edi mov [symbols_stream],edi
jmp format_defined jmp format_defined
@ -3863,15 +3873,20 @@ elf_segment:
mov [ebx+0Ch],edx mov [ebx+0Ch],edx
mov eax,edx mov eax,edx
xor edx,edx xor edx,edx
xor cl,cl
not eax not eax
not edx not edx
not cl
add eax,1 add eax,1
adc edx,0 adc edx,0
adc cl,0
add eax,edi add eax,edi
adc edx,0 adc edx,0
adc cl,0
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],edx mov dword [org_origin+4],edx
mov [org_registers],0 mov [org_origin_sign],cl
and [org_registers],0
mov [org_start],edi mov [org_start],edi
inc [number_of_sections] inc [number_of_sections]
jmp instruction_assembled jmp instruction_assembled
@ -3990,15 +4005,20 @@ elf_segment:
mov [ebx+10h+4],edx mov [ebx+10h+4],edx
mov [ebx+18h],eax mov [ebx+18h],eax
mov [ebx+18h+4],edx mov [ebx+18h+4],edx
xor cl,cl
not eax not eax
not edx not edx
not cl
add eax,1 add eax,1
adc edx,0 adc edx,0
adc cl,0
add eax,edi add eax,edi
adc edx,0 adc edx,0
adc cl,0
mov dword [org_origin],eax mov dword [org_origin],eax
mov dword [org_origin+4],edx mov dword [org_origin+4],edx
mov [org_registers],0 mov [org_origin_sign],cl
and [org_registers],0
mov [org_start],edi mov [org_start],edi
inc [number_of_sections] inc [number_of_sections]
jmp instruction_assembled jmp instruction_assembled

View File

@ -25,7 +25,7 @@ _operand_size_not_specified db 'operand size not specified',0
_operand_sizes_do_not_match db 'operand sizes do not match',0 _operand_sizes_do_not_match db 'operand sizes do not match',0
_invalid_address_size db 'invalid size of address value',0 _invalid_address_size db 'invalid size of address value',0
_address_sizes_do_not_agree db 'address sizes do not agree',0 _address_sizes_do_not_agree db 'address sizes do not agree',0
_prefix_conflict db 'disallowed combination of registers',0 _disallowed_combination_of_registers db 'disallowed combination of registers',0
_long_immediate_not_encodable db 'not encodable with long immediate',0 _long_immediate_not_encodable db 'not encodable with long immediate',0
_relative_jump_out_of_range db 'relative jump out of range',0 _relative_jump_out_of_range db 'relative jump out of range',0
_invalid_expression db 'invalid expression',0 _invalid_expression db 'invalid expression',0

View File

@ -503,7 +503,7 @@ parse_line_contents:
cmp al,',' cmp al,','
je separator je separator
cmp al,'=' cmp al,'='
je separator je expression_comparator
cmp al,'|' cmp al,'|'
je separator je separator
cmp al,'&' cmp al,'&'
@ -569,7 +569,11 @@ parse_line_contents:
je parse_from_operator je parse_from_operator
cmp al,89h cmp al,89h
je parse_label_operator je parse_label_operator
cmp al,0F8h
je forced_expression
jmp argument_parsed jmp argument_parsed
instruction_separator:
stos byte [edi]
allow_embedded_instruction: allow_embedded_instruction:
cmp byte [esi],1Ah cmp byte [esi],1Ah
jne parse_argument jne parse_argument
@ -810,6 +814,29 @@ parse_line_contents:
stos byte [edi] stos byte [edi]
inc [parenthesis_stack] inc [parenthesis_stack]
jmp parse_argument 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: expression:
mov al,'(' mov al,'('
stos byte [edi] stos byte [edi]
@ -892,30 +919,6 @@ parse_line_contents:
mov al,'}' mov al,'}'
separator: separator:
stos byte [edi] stos byte [edi]
jmp argument_parsed
instruction_separator:
stos byte [edi]
jmp allow_embedded_instruction
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 separator
argument_parsed: argument_parsed:
cmp [parenthesis_stack],0 cmp [parenthesis_stack],0
je parse_argument je parse_argument
@ -984,6 +987,7 @@ get_operator:
jne next_operator jne next_operator
repe cmps byte [esi],[edi] repe cmps byte [esi],[edi]
je operator_found je operator_found
jb no_operator
next_operator: next_operator:
mov edi,ebx mov edi,ebx
inc edi inc edi
@ -1046,12 +1050,10 @@ get_symbol:
ja symbols_up ja symbols_up
jb symbols_down jb symbols_down
mov ax,[edi] mov ax,[edi]
cmp al,18h cmp al,18h
jb symbol_ok jb symbol_ok
cmp [formatter_symbols_allowed],0 cmp [formatter_symbols_allowed],0
je no_symbol je no_symbol
symbol_ok: symbol_ok:
pop esi pop esi
add esi,ebp add esi,ebp

View File

@ -40,6 +40,7 @@ preprocessor:
mov [source_start],eax mov [source_start],eax
mov [display_buffer],eax mov [display_buffer],eax
mov [hash_tree],eax mov [hash_tree],eax
mov [error],eax
mov [macro_status],al mov [macro_status],al
mov esi,[input_file] mov esi,[input_file]
mov edx,esi mov edx,esi
@ -870,6 +871,7 @@ define_macro:
je found_macro_block je found_macro_block
jmp invalid_macro_arguments jmp invalid_macro_arguments
macro_argument_with_default_value: macro_argument_with_default_value:
or [default_argument_value],-1
call skip_macro_argument_value call skip_macro_argument_value
inc esi inc esi
jmp macro_argument_end jmp macro_argument_end
@ -908,6 +910,10 @@ define_macro:
jz argument_value_end jz argument_value_end
cmp al,',' cmp al,','
je argument_value_end je argument_value_end
cmp [default_argument_value],0
je invalid_macro_arguments
cmp al,'{'
je argument_value_end
or ebp,ebp or ebp,ebp
jz invalid_macro_arguments jz invalid_macro_arguments
cmp al,']' cmp al,']'
@ -923,6 +929,10 @@ define_macro:
je argument_string je argument_string
cmp al,1Ah cmp al,1Ah
je argument_symbol je argument_symbol
cmp [default_argument_value],0
je simple_argument
cmp al,'{'
je argument_value_end
or ebp,ebp or ebp,ebp
jz simple_argument jz simple_argument
cmp al,']' cmp al,']'
@ -1500,10 +1510,8 @@ use_macro:
add esi,ecx add esi,ecx
xchg esi,ebx xchg esi,ebx
mov [edx+12],esi mov [edx+12],esi
push ebp mov [default_argument_value],0
xor ebp,ebp
call skip_macro_argument_value call skip_macro_argument_value
pop ebp
call finish_macro_argument call finish_macro_argument
xchg esi,ebx xchg esi,ebx
cmp byte [esi],'=' cmp byte [esi],'='
@ -1523,12 +1531,14 @@ use_macro:
jne argument_value_length_ok jne argument_value_length_ok
inc dword [edx+12] inc dword [edx+12]
sub ecx,2 sub ecx,2
or ecx,80000000h
argument_value_length_ok: argument_value_length_ok:
mov [edx+8],ecx mov [edx+8],ecx
ret ret
argument_with_default_value: argument_with_default_value:
inc esi inc esi
push esi push esi
or [default_argument_value],-1
call skip_macro_argument_value call skip_macro_argument_value
pop eax pop eax
cmp dword [edx+8],0 cmp dword [edx+8],0
@ -1637,14 +1647,21 @@ use_instant_macro:
stosb stosb
push esi push esi
mov esi,[esp+4] mov esi,[esp+4]
mov [value_size],8 mov [error_line],0
mov [value_size],0
call calculate_expression call calculate_expression
cmp [error_line],0
je value_precalculated
jmp [error]
value_precalculated:
mov eax,[edi] mov eax,[edi]
mov ecx,[edi+4] mov ecx,[edi+4]
pop esi edi
cdq cdq
cmp edx,ecx cmp edx,ecx
jne value_out_of_range jne value_out_of_range
cmp dl,[edi+13]
jne value_out_of_range
pop esi edi
ret ret
do_irp: do_irp:
cmp byte [esi],1Ah cmp byte [esi],1Ah
@ -1665,6 +1682,7 @@ do_irp:
jmp irp_parameters_start jmp irp_parameters_start
irp_with_default_value: irp_with_default_value:
xor ebp,ebp xor ebp,ebp
or [default_argument_value],-1
call skip_macro_argument_value call skip_macro_argument_value
inc esi inc esi
irps_name_ok: irps_name_ok:
@ -2490,7 +2508,7 @@ include_file:
jmp cut_current_file_name jmp cut_current_file_name
current_file_path_ok: current_file_path_ok:
mov esi,[esp+4] mov esi,[esp+4]
call preprocess_path call expand_path
pop edx pop edx
mov esi,edx mov esi,edx
call open call open
@ -2503,26 +2521,10 @@ include_file:
je try_in_current_directory je try_in_current_directory
push ebp push ebp
push edi push edi
copy_include_directory: call get_include_directory
lods byte [esi]
cmp al,';'
je include_directory_ok
stos byte [edi]
or al,al
jnz copy_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:
mov [esp+4],esi mov [esp+4],esi
mov esi,[esp+8] mov esi,[esp+8]
call preprocess_path call expand_path
pop edx pop edx
mov esi,edx mov esi,edx
call open call open
@ -2533,7 +2535,7 @@ include_file:
try_in_current_directory: try_in_current_directory:
mov esi,[esp] mov esi,[esp]
push edi push edi
call preprocess_path call expand_path
pop edx pop edx
mov esi,edx mov esi,edx
call open call open
@ -2553,35 +2555,7 @@ include_file:
and [macro_status],0Fh and [macro_status],0Fh
call preprocess_file call preprocess_file
pop eax pop eax
mov [macro_status],al and al,0F0h
and [macro_status],0Fh
or [macro_status],al
jmp line_preprocessed jmp line_preprocessed
preprocess_path:
lods byte [esi]
cmp al,'%'
je environment_variable
stos byte [edi]
or al,al
jnz preprocess_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 preprocess_path
not_environment_variable:
mov al,'%'
stos byte [edi]
mov esi,ebx
jmp preprocess_path

View File

@ -12,14 +12,14 @@ dump_symbols:
jae out_of_memory jae out_of_memory
mov eax,edi mov eax,edi
sub eax,ebx sub eax,ebx
mov [ebx-38h+0Ch],eax mov [ebx-40h+0Ch],eax
mov esi,[output_file] mov esi,[output_file]
call copy_asciiz call copy_asciiz
cmp edi,[display_buffer] cmp edi,[display_buffer]
jae out_of_memory jae out_of_memory
mov edx,[symbols_stream] mov edx,[symbols_stream]
mov ebp,[free_additional_memory] mov ebp,[free_additional_memory]
mov [number_of_sections],0 and [number_of_sections],0
cmp [output_format],4 cmp [output_format],4
je prepare_strings_table je prepare_strings_table
cmp [output_format],5 cmp [output_format],5
@ -152,22 +152,22 @@ dump_symbols:
labels_dump_ok: labels_dump_ok:
mov eax,edi mov eax,edi
sub eax,ebx sub eax,ebx
mov [ebx-38h+14h],eax mov [ebx-40h+14h],eax
add eax,38h add eax,40h
mov [ebx-38h+18h],eax mov [ebx-40h+18h],eax
mov ecx,[memory_end] mov ecx,[memory_end]
sub ecx,[labels_list] sub ecx,[labels_list]
mov [ebx-38h+1Ch],ecx mov [ebx-40h+1Ch],ecx
add eax,ecx add eax,ecx
mov [ebx-38h+20h],eax mov [ebx-40h+20h],eax
mov ecx,[source_start] mov ecx,[source_start]
sub ecx,[memory_start] sub ecx,[memory_start]
mov [ebx-38h+24h],ecx mov [ebx-40h+24h],ecx
add eax,ecx add eax,ecx
mov [ebx-38h+28h],eax mov [ebx-40h+28h],eax
mov eax,[number_of_sections] mov eax,[number_of_sections]
shl eax,2 shl eax,2
mov [ebx-38h+34h],eax mov [ebx-40h+34h],eax
call prepare_preprocessed_source call prepare_preprocessed_source
mov esi,[labels_list] mov esi,[labels_list]
mov ebp,edi mov ebp,edi
@ -179,7 +179,12 @@ dump_symbols:
sub esi,8 sub esi,8
sub esi,ecx sub esi,ecx
cmp eax,1 cmp eax,1
je process_line_dump
cmp eax,2
jne make_lines_dump jne make_lines_dump
add dword [ebx-40h+3Ch],8
jmp make_lines_dump
process_line_dump:
mov eax,[esi+4] mov eax,[esi+4]
sub eax,[code_start] sub eax,[code_start]
add eax,[headers_size] add eax,[headers_size]
@ -193,8 +198,10 @@ dump_symbols:
stos dword [edi] stos dword [edi]
mov eax,[esi+4] mov eax,[esi+4]
xor edx,edx xor edx,edx
xor cl,cl
sub eax,[esi+8] sub eax,[esi+8]
sbb edx,[esi+8+4] sbb edx,[esi+8+4]
sbb cl,[esi+1Bh]
stos dword [edi] stos dword [edi]
mov eax,edx mov eax,edx
stos dword [edi] stos dword [edi]
@ -210,10 +217,15 @@ dump_symbols:
base_symbol_for_line_ok: base_symbol_for_line_ok:
stos dword [edi] stos dword [edi]
mov eax,[esi+18h] mov eax,[esi+18h]
and eax,001FFFFh and eax,01FFFFh
stos dword [edi] stos dword [edi]
mov [edi-1],cl
cmp edi,[display_buffer] cmp edi,[display_buffer]
jae out_of_memory jae out_of_memory
mov eax,edi
sub eax,1Ch
sub eax,ebp
mov [esi],eax
jmp make_lines_dump jmp make_lines_dump
lines_dump_ok: lines_dump_ok:
mov edx,edi mov edx,edi
@ -223,10 +235,12 @@ dump_symbols:
stos dword [edi] stos dword [edi]
mov ecx,edi mov ecx,edi
sub ecx,ebx sub ecx,ebx
sub ecx,[ebx-38h+14h] sub ecx,[ebx-40h+14h]
mov [ebx-38h+2Ch],ecx mov [ebx-40h+2Ch],ecx
add ecx,[ebx-38h+28h] add ecx,[ebx-40h+28h]
mov [ebx-38h+30h],ecx mov [ebx-40h+30h],ecx
add ecx,[ebx-40h+34h]
mov [ebx-40h+38h],ecx
find_inexisting_offsets: find_inexisting_offsets:
sub edx,1Ch sub edx,1Ch
cmp edx,ebp cmp edx,ebp
@ -238,7 +252,7 @@ dump_symbols:
mov eax,[edx] mov eax,[edx]
jmp find_inexisting_offsets jmp find_inexisting_offsets
correct_inexisting_offset: correct_inexisting_offset:
mov dword [edx],0 and dword [edx],0
or byte [edx+1Ah],2 or byte [edx+1Ah],2
jmp find_inexisting_offsets jmp find_inexisting_offsets
write_symbols: write_symbols:
@ -247,7 +261,7 @@ dump_symbols:
jc write_failed jc write_failed
mov edx,[code_start] mov edx,[code_start]
mov ecx,[edx+14h] mov ecx,[edx+14h]
add ecx,38h add ecx,40h
call write call write
jc write_failed jc write_failed
mov edx,[display_buffer] mov edx,[display_buffer]
@ -270,16 +284,47 @@ dump_symbols:
shl ecx,2 shl ecx,2
call write call write
jc write_failed jc write_failed
mov esi,[labels_list]
mov edi,[memory_start]
make_references_dump:
cmp esi,[display_buffer]
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,[display_buffer]
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 call close
ret ret
setup_dump_header: setup_dump_header:
xor eax,eax xor eax,eax
mov ecx,38h shr 2 mov ecx,40h shr 2
rep stos dword [edi] rep stos dword [edi]
mov ebx,edi mov ebx,edi
mov dword [ebx-38h],'fas'+1Ah shl 24 mov dword [ebx-40h],'fas'+1Ah shl 24
mov dword [ebx-38h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 38h shl 16 mov dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
mov dword [ebx-38h+10h],38h mov dword [ebx-40h+10h],40h
ret ret
prepare_preprocessed_source: prepare_preprocessed_source:
mov esi,[memory_start] mov esi,[memory_start]
@ -365,21 +410,21 @@ dump_preprocessed_source:
mov eax,edi mov eax,edi
sub eax,ebx sub eax,ebx
dec eax dec eax
mov [ebx-38h+0Ch],eax mov [ebx-40h+0Ch],eax
mov eax,edi mov eax,edi
sub eax,ebx sub eax,ebx
mov [ebx-38h+14h],eax mov [ebx-40h+14h],eax
add eax,38h add eax,40h
mov [ebx-38h+20h],eax mov [ebx-40h+20h],eax
call prepare_preprocessed_source call prepare_preprocessed_source
sub esi,[memory_start] sub esi,[memory_start]
mov [ebx-38h+24h],esi mov [ebx-40h+24h],esi
mov edx,[symbols_file] mov edx,[symbols_file]
call create call create
jc write_failed jc write_failed
mov edx,[free_additional_memory] mov edx,[free_additional_memory]
mov ecx,[edx+14h] mov ecx,[edx+14h]
add ecx,38h add ecx,40h
call write call write
jc write_failed jc write_failed
mov edx,[memory_start] mov edx,[memory_start]

View File

@ -49,12 +49,12 @@ operators:
db 1,'-',81h db 1,'-',81h
db 1,'*',90h db 1,'*',90h
db 1,'/',91h db 1,'/',91h
db 3,'mod',0A0h
db 3,'and',0B0h db 3,'and',0B0h
db 3,'mod',0A0h
db 2,'or',0B1h db 2,'or',0B1h
db 3,'xor',0B2h
db 3,'shl',0C0h db 3,'shl',0C0h
db 3,'shr',0C1h db 3,'shr',0C1h
db 3,'xor',0B2h
db 0 db 0
single_operand_operators: single_operand_operators:
@ -77,50 +77,10 @@ directive_operators:
db 2,'in',0F6h db 2,'in',0F6h
db 2,'on',84h db 2,'on',84h
db 3,'ptr',85h db 3,'ptr',85h
db 10,'relativeto',0F8h
db 4,'used',89h db 4,'used',89h
db 0 db 0
address_registers:
db 2,'bp',25h
db 2,'bx',23h
db 2,'di',27h
db 3,'eax',40h
db 3,'ebp',45h
db 3,'ebx',43h
db 3,'ecx',41h
db 3,'edi',47h
db 3,'edx',42h
db 3,'eip',0F4h
db 3,'esi',46h
db 3,'esp',44h
db 3,'r10',8Ah
db 4,'r10d',4Ah
db 3,'r11',8Bh
db 4,'r11d',4Bh
db 3,'r12',8Ch
db 4,'r12d',4Ch
db 3,'r13',8Dh
db 4,'r13d',4Dh
db 3,'r14',8Eh
db 4,'r14d',4Eh
db 3,'r15',8Fh
db 4,'r15d',4Fh
db 2,'r8',88h
db 3,'r8d',48h
db 2,'r9',89h
db 3,'r9d',49h
db 3,'rax',80h
db 3,'rbp',85h
db 3,'rbx',83h
db 3,'rcx',81h
db 3,'rdi',87h
db 3,'rdx',82h
db 3,'rip',0F8h
db 3,'rsi',86h
db 3,'rsp',84h
db 2,'si',26h
db 0
address_sizes: address_sizes:
db 4,'byte',1 db 4,'byte',1
db 5,'dword',4 db 5,'dword',4
@ -603,8 +563,20 @@ instructions_3:
db 'xor',30h db 'xor',30h
dw basic_instruction-instruction_handler dw basic_instruction-instruction_handler
instructions_4: instructions_4:
db 'andn',0F2h
dw andn_instruction-instruction_handler
db 'arpl',0 db 'arpl',0
dw arpl_instruction-instruction_handler 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 db 'call',0
dw call_instruction-instruction_handler dw call_instruction-instruction_handler
db 'cdqe',98h db 'cdqe',98h
@ -723,6 +695,8 @@ instructions_4:
dw movq_instruction-instruction_handler dw movq_instruction-instruction_handler
db 'movs',0A4h db 'movs',0A4h
dw movs_instruction-instruction_handler dw movs_instruction-instruction_handler
db 'mulx',0F6h
dw pdep_instruction-instruction_handler
db 'orpd',56h db 'orpd',56h
dw sse_pd_instruction-instruction_handler dw sse_pd_instruction-instruction_handler
db 'orps',56h db 'orps',56h
@ -731,6 +705,10 @@ instructions_4:
dw outs_instruction-instruction_handler dw outs_instruction-instruction_handler
db 'pand',0DBh db 'pand',0DBh
dw basic_mmx_instruction-instruction_handler 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 db 'popa',61h
dw simple_instruction_except64-instruction_handler dw simple_instruction_except64-instruction_handler
db 'popd',4 db 'popd',4
@ -759,10 +737,14 @@ instructions_4:
dw ret_instruction_only64-instruction_handler dw ret_instruction_only64-instruction_handler
db 'retw',0C2h db 'retw',0C2h
dw ret_instruction_16bit-instruction_handler dw ret_instruction_16bit-instruction_handler
db 'rorx',0F0h
dw rorx_instruction-instruction_handler
db 'sahf',9Eh db 'sahf',9Eh
dw simple_instruction-instruction_handler dw simple_instruction-instruction_handler
db 'salc',0D6h db 'salc',0D6h
dw simple_instruction_except64-instruction_handler dw simple_instruction_except64-instruction_handler
db 'sarx',0F7h
dw sarx_instruction-instruction_handler
db 'scas',0AEh db 'scas',0AEh
dw stos_instruction-instruction_handler dw stos_instruction-instruction_handler
db 'seta',97h db 'seta',97h
@ -789,8 +771,12 @@ instructions_4:
dw lgdt_instruction-instruction_handler dw lgdt_instruction-instruction_handler
db 'shld',0A4h db 'shld',0A4h
dw shd_instruction-instruction_handler dw shd_instruction-instruction_handler
db 'shlx',0F7h
dw shlx_instruction-instruction_handler
db 'shrd',0ACh db 'shrd',0ACh
dw shd_instruction-instruction_handler dw shd_instruction-instruction_handler
db 'shrx',0F7h
dw shrx_instruction-instruction_handler
db 'sidt',1 db 'sidt',1
dw lgdt_instruction-instruction_handler dw lgdt_instruction-instruction_handler
db 'sldt',0 db 'sldt',0
@ -808,13 +794,15 @@ instructions_4:
db 'verw',5 db 'verw',5
dw pm_word_instruction-instruction_handler dw pm_word_instruction-instruction_handler
db 'vpor',0EBh db 'vpor',0EBh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'wait',9Bh db 'wait',9Bh
dw simple_instruction-instruction_handler dw simple_instruction-instruction_handler
db 'xadd',0C0h db 'xadd',0C0h
dw basic_486_instruction-instruction_handler dw basic_486_instruction-instruction_handler
db 'xchg',0 db 'xchg',0
dw xchg_instruction-instruction_handler dw xchg_instruction-instruction_handler
db 'xend',0D5h
dw simple_vmx_instruction-instruction_handler
db 'xlat',0D7h db 'xlat',0D7h
dw xlat_instruction-instruction_handler dw xlat_instruction-instruction_handler
instructions_5: instructions_5:
@ -832,6 +820,12 @@ instructions_5:
dw sse_pd_instruction-instruction_handler dw sse_pd_instruction-instruction_handler
db 'andps',54h db 'andps',54h
dw sse_ps_instruction-instruction_handler 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 'bound',0 db 'bound',0
dw bound_instruction-instruction_handler dw bound_instruction-instruction_handler
db 'break',0 db 'break',0
@ -839,25 +833,25 @@ instructions_5:
db 'bswap',0 db 'bswap',0
dw bswap_instruction-instruction_handler dw bswap_instruction-instruction_handler
db 'cmova',47h db 'cmova',47h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovb',42h db 'cmovb',42h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovc',42h db 'cmovc',42h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmove',44h db 'cmove',44h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovg',4Fh db 'cmovg',4Fh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovl',4Ch db 'cmovl',4Ch
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovo',40h db 'cmovo',40h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovp',4Ah db 'cmovp',4Ah
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovs',48h db 'cmovs',48h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovz',44h db 'cmovz',44h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmppd',-1 db 'cmppd',-1
dw cmp_pd_instruction-instruction_handler dw cmp_pd_instruction-instruction_handler
db 'cmpps',-1 db 'cmpps',-1
@ -1222,6 +1216,10 @@ instructions_5:
dw sse_ss_instruction-instruction_handler dw sse_ss_instruction-instruction_handler
db 'times',0 db 'times',0
dw times_directive-instruction_handler dw times_directive-instruction_handler
db 'tzcnt',0BCh
dw popcnt_instruction-instruction_handler
db 'tzmsk',14h
dw tbm_instruction-instruction_handler
db 'vdppd',41h db 'vdppd',41h
dw avx_128bit_instruction_3a_imm8-instruction_handler dw avx_128bit_instruction_3a_imm8-instruction_handler
db 'vdpps',40h db 'vdpps',40h
@ -1239,9 +1237,9 @@ instructions_5:
db 'vorps',56h db 'vorps',56h
dw avx_ps_instruction-instruction_handler dw avx_ps_instruction-instruction_handler
db 'vpand',0DBh db 'vpand',0DBh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpxor',0EFh db 'vpxor',0EFh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'while',0 db 'while',0
dw while_directive-instruction_handler dw while_directive-instruction_handler
db 'wrmsr',30h db 'wrmsr',30h
@ -1254,6 +1252,8 @@ instructions_5:
dw sse_ps_instruction-instruction_handler dw sse_ps_instruction-instruction_handler
db 'xsave',100b db 'xsave',100b
dw fxsave_instruction-instruction_handler dw fxsave_instruction-instruction_handler
db 'xtest',0D6h
dw simple_vmx_instruction-instruction_handler
instructions_6: instructions_6:
db 'aesdec',0DEh db 'aesdec',0DEh
dw sse4_instruction_38-instruction_handler dw sse4_instruction_38-instruction_handler
@ -1267,38 +1267,42 @@ instructions_6:
dw sse_ps_instruction-instruction_handler dw sse_ps_instruction-instruction_handler
db 'assert',0 db 'assert',0
dw assert_directive-instruction_handler dw assert_directive-instruction_handler
db 'blcmsk',21h
dw tbm_instruction-instruction_handler
db 'blsmsk',2
dw bmi_instruction-instruction_handler
db 'cmovae',43h db 'cmovae',43h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovbe',46h db 'cmovbe',46h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovge',4Dh db 'cmovge',4Dh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovle',4Eh db 'cmovle',4Eh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovna',46h db 'cmovna',46h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnb',43h db 'cmovnb',43h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnc',43h db 'cmovnc',43h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovne',45h db 'cmovne',45h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovng',4Eh db 'cmovng',4Eh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnl',4Dh db 'cmovnl',4Dh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovno',41h db 'cmovno',41h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnp',4Bh db 'cmovnp',4Bh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovns',49h db 'cmovns',49h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnz',45h db 'cmovnz',45h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovpe',4Ah db 'cmovpe',4Ah
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovpo',4Bh db 'cmovpo',4Bh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'comisd',2Fh db 'comisd',2Fh
dw comisd_instruction-instruction_handler dw comisd_instruction-instruction_handler
db 'comiss',2Fh db 'comiss',2Fh
@ -1391,6 +1395,8 @@ instructions_6:
dw invlpg_instruction-instruction_handler dw invlpg_instruction-instruction_handler
db 'lfence',0E8h db 'lfence',0E8h
dw fence_instruction-instruction_handler dw fence_instruction-instruction_handler
db 'llwpcb',0
dw llwpcb_instruction-instruction_handler
db 'looped',0E1h db 'looped',0E1h
dw loop_instruction_32bit-instruction_handler dw loop_instruction_32bit-instruction_handler
db 'loopeq',0E1h db 'loopeq',0E1h
@ -1407,6 +1413,10 @@ instructions_6:
dw loop_instruction_64bit-instruction_handler dw loop_instruction_64bit-instruction_handler
db 'loopzw',0E1h db 'loopzw',0E1h
dw loop_instruction_16bit-instruction_handler 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 db 'mfence',0F0h
dw fence_instruction-instruction_handler dw fence_instruction-instruction_handler
db 'movapd',28h db 'movapd',28h
@ -1563,6 +1573,8 @@ instructions_6:
dw sse_ps_instruction_imm8-instruction_handler dw sse_ps_instruction_imm8-instruction_handler
db 'skinit',0 db 'skinit',0
dw skinit_instruction-instruction_handler dw skinit_instruction-instruction_handler
db 'slwpcb',1
dw llwpcb_instruction-instruction_handler
db 'sqrtpd',51h db 'sqrtpd',51h
dw sse_pd_instruction-instruction_handler dw sse_pd_instruction-instruction_handler
db 'sqrtps',51h db 'sqrtps',51h
@ -1575,6 +1587,8 @@ instructions_6:
dw swapgs_instruction-instruction_handler dw swapgs_instruction-instruction_handler
db 'sysret',07h db 'sysret',07h
dw simple_extended_instruction-instruction_handler dw simple_extended_instruction-instruction_handler
db 't1mskc',17h
dw tbm_instruction-instruction_handler
db 'vaddpd',58h db 'vaddpd',58h
dw avx_pd_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vaddps',58h db 'vaddps',58h
@ -1644,25 +1658,25 @@ instructions_6:
db 'vmxoff',0C4h db 'vmxoff',0C4h
dw simple_vmx_instruction-instruction_handler dw simple_vmx_instruction-instruction_handler
db 'vpabsb',1Ch db 'vpabsb',1Ch
dw avx_single_source_128bit_instruction_38-instruction_handler dw avx_single_source_instruction_38-instruction_handler
db 'vpabsd',1Eh db 'vpabsd',1Eh
dw avx_single_source_128bit_instruction_38-instruction_handler dw avx_single_source_instruction_38-instruction_handler
db 'vpabsw',1Dh db 'vpabsw',1Dh
dw avx_single_source_128bit_instruction_38-instruction_handler dw avx_single_source_instruction_38-instruction_handler
db 'vpaddb',0FCh db 'vpaddb',0FCh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpaddd',0FEh db 'vpaddd',0FEh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpaddq',0D4h db 'vpaddq',0D4h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpaddw',0FDh db 'vpaddw',0FDh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpandn',0DFh db 'vpandn',0DFh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpavgb',0E0h db 'vpavgb',0E0h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpavgw',0E3h db 'vpavgw',0E3h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmov',0A2h db 'vpcmov',0A2h
dw vpcmov_instruction-instruction_handler dw vpcmov_instruction-instruction_handler
db 'vpcomb',-1 db 'vpcomb',-1
@ -1673,6 +1687,10 @@ instructions_6:
dw xop_pcom_q_instruction-instruction_handler dw xop_pcom_q_instruction-instruction_handler
db 'vpcomw',-1 db 'vpcomw',-1
dw xop_pcom_w_instruction-instruction_handler dw xop_pcom_w_instruction-instruction_handler
db 'vpermd',36h
dw avx_permd_instruction-instruction_handler
db 'vpermq',0
dw avx_permq_instruction-instruction_handler
db 'vpperm',0A3h db 'vpperm',0A3h
dw xop_128bit_instruction-instruction_handler dw xop_128bit_instruction-instruction_handler
db 'vprotb',90h db 'vprotb',90h
@ -1716,13 +1734,13 @@ instructions_6:
db 'vpsrlw',0D1h db 'vpsrlw',0D1h
dw avx_bit_shift_instruction-instruction_handler dw avx_bit_shift_instruction-instruction_handler
db 'vpsubb',0F8h db 'vpsubb',0F8h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsubd',0FAh db 'vpsubd',0FAh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsubq',0FBh db 'vpsubq',0FBh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsubw',0F9h db 'vpsubw',0F9h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vptest',17h db 'vptest',17h
dw avx_single_source_instruction_38-instruction_handler dw avx_single_source_instruction_38-instruction_handler
db 'vrcpps',53h db 'vrcpps',53h
@ -1745,6 +1763,10 @@ instructions_6:
dw simple_extended_instruction-instruction_handler dw simple_extended_instruction-instruction_handler
db 'wrmsrq',30h db 'wrmsrq',30h
dw simple_extended_instruction_64bit-instruction_handler dw simple_extended_instruction_64bit-instruction_handler
db 'xabort',0
dw xabort_instruction-instruction_handler
db 'xbegin',0
dw xbegin_instruction-instruction_handler
db 'xgetbv',0D0h db 'xgetbv',0D0h
dw simple_vmx_instruction-instruction_handler dw simple_vmx_instruction-instruction_handler
db 'xrstor',101b db 'xrstor',101b
@ -1752,20 +1774,24 @@ instructions_6:
db 'xsetbv',0D1h db 'xsetbv',0D1h
dw simple_vmx_instruction-instruction_handler dw simple_vmx_instruction-instruction_handler
instructions_7: instructions_7:
db 'blcfill',11h
dw tbm_instruction-instruction_handler
db 'blendpd',0Dh db 'blendpd',0Dh
dw sse4_instruction_3a_imm8-instruction_handler dw sse4_instruction_3a_imm8-instruction_handler
db 'blendps',0Ch db 'blendps',0Ch
dw sse4_instruction_3a_imm8-instruction_handler dw sse4_instruction_3a_imm8-instruction_handler
db 'blsfill',12h
dw tbm_instruction-instruction_handler
db 'clflush',111b db 'clflush',111b
dw fxsave_instruction-instruction_handler dw fxsave_instruction-instruction_handler
db 'cmovnae',42h db 'cmovnae',42h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnbe',47h db 'cmovnbe',47h
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnge',4Ch db 'cmovnge',4Ch
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmovnle',4Fh db 'cmovnle',4Fh
dw cmov_instruction-instruction_handler dw bs_instruction-instruction_handler
db 'cmpeqpd',0 db 'cmpeqpd',0
dw cmp_pd_instruction-instruction_handler dw cmp_pd_instruction-instruction_handler
db 'cmpeqps',0 db 'cmpeqps',0
@ -1842,6 +1868,8 @@ instructions_7:
dw insertq_instruction-instruction_handler dw insertq_instruction-instruction_handler
db 'invlpga',0DFh db 'invlpga',0DFh
dw invlpga_instruction-instruction_handler dw invlpga_instruction-instruction_handler
db 'invpcid',82h
dw vmx_inv_instruction-instruction_handler
db 'invvpid',81h db 'invvpid',81h
dw vmx_inv_instruction-instruction_handler dw vmx_inv_instruction-instruction_handler
db 'ldmxcsr',10b db 'ldmxcsr',10b
@ -2029,9 +2057,9 @@ instructions_7:
db 'vmwrite',0 db 'vmwrite',0
dw vmwrite_instruction-instruction_handler dw vmwrite_instruction-instruction_handler
db 'vpaddsb',0ECh db 'vpaddsb',0ECh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpaddsw',0EDh db 'vpaddsw',0EDh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcomub',-1 db 'vpcomub',-1
dw xop_pcom_ub_instruction-instruction_handler dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomud',-1 db 'vpcomud',-1
@ -2040,6 +2068,10 @@ instructions_7:
dw xop_pcom_uq_instruction-instruction_handler dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomuw',-1 db 'vpcomuw',-1
dw xop_pcom_uw_instruction-instruction_handler 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 db 'vpextrb',14h
dw avx_pextrb_instruction-instruction_handler dw avx_pextrb_instruction-instruction_handler
db 'vpextrd',16h db 'vpextrd',16h
@ -2049,13 +2081,13 @@ instructions_7:
db 'vpextrw',15h db 'vpextrw',15h
dw avx_pextrw_instruction-instruction_handler dw avx_pextrw_instruction-instruction_handler
db 'vphaddd',2 db 'vphaddd',2
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vphaddw',1 db 'vphaddw',1
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vphsubd',6 db 'vphsubd',6
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vphsubw',5 db 'vphsubw',5
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpinsrb',20h db 'vpinsrb',20h
dw avx_pinsrb_instruction-instruction_handler dw avx_pinsrb_instruction-instruction_handler
db 'vpinsrd',22h db 'vpinsrd',22h
@ -2065,57 +2097,67 @@ instructions_7:
db 'vpinsrw',0C4h db 'vpinsrw',0C4h
dw avx_pinsrw_instruction-instruction_handler dw avx_pinsrw_instruction-instruction_handler
db 'vpmaxsb',3Ch db 'vpmaxsb',3Ch
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmaxsd',3Dh db 'vpmaxsd',3Dh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmaxsw',0EEh db 'vpmaxsw',0EEh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpmaxub',0DEh db 'vpmaxub',0DEh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpmaxud',3Fh db 'vpmaxud',3Fh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmaxuw',3Eh db 'vpmaxuw',3Eh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpminsb',38h db 'vpminsb',38h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpminsd',39h db 'vpminsd',39h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpminsw',0EAh db 'vpminsw',0EAh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpminub',0DAh db 'vpminub',0DAh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpminud',3Bh db 'vpminud',3Bh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpminuw',3Ah db 'vpminuw',3Ah
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmuldq',28h db 'vpmuldq',28h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmulhw',0E5h db 'vpmulhw',0E5h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpmulld',40h db 'vpmulld',40h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmullw',0D5h db 'vpmullw',0D5h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsadbw',0F6h db 'vpsadbw',0F6h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpshufb',0 db 'vpshufb',0
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpshufd',66h db 'vpshufd',66h
dw avx_pshufd_instruction-instruction_handler dw avx_pshufd_instruction-instruction_handler
db 'vpsignb',8 db 'vpsignb',8
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpsignd',0Ah db 'vpsignd',0Ah
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpsignw',9 db 'vpsignw',9
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpslldq',111b db 'vpslldq',111b
dw avx_pslldq_instruction-instruction_handler dw avx_pslldq_instruction-instruction_handler
db 'vpsllvd',47h
dw avx_instruction_38-instruction_handler
db 'vpsllvq',47h
dw avx_instruction_38_w1-instruction_handler
db 'vpsravd',46h
dw avx_instruction_38-instruction_handler
db 'vpsrldq',011b db 'vpsrldq',011b
dw avx_pslldq_instruction-instruction_handler dw avx_pslldq_instruction-instruction_handler
db 'vpsrlvd',45h
dw avx_instruction_38-instruction_handler
db 'vpsrlvq',45h
dw avx_instruction_38_w1-instruction_handler
db 'vpsubsb',0E8h db 'vpsubsb',0E8h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsubsw',0E9h db 'vpsubsw',0E9h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vshufpd',0C6h db 'vshufpd',0C6h
dw avx_pd_instruction_imm8-instruction_handler dw avx_pd_instruction_imm8-instruction_handler
db 'vshufps',0C6h db 'vshufps',0C6h
@ -2213,6 +2255,8 @@ instructions_8:
dw fldenv_instruction_32bit-instruction_handler dw fldenv_instruction_32bit-instruction_handler
db 'fnstenvw',6 db 'fnstenvw',6
dw fldenv_instruction_16bit-instruction_handler dw fldenv_instruction_16bit-instruction_handler
db 'fxsave64',0
dw fxsave_instruction_64bit-instruction_handler
db 'insertps',0 db 'insertps',0
dw insertps_instruction-instruction_handler dw insertps_instruction-instruction_handler
db 'maskmovq',0 db 'maskmovq',0
@ -2221,7 +2265,7 @@ instructions_8:
dw movmskpd_instruction-instruction_handler dw movmskpd_instruction-instruction_handler
db 'movmskps',0 db 'movmskps',0
dw movmskps_instruction-instruction_handler dw movmskps_instruction-instruction_handler
db 'movntdqa',0 db 'movntdqa',2Ah
dw movntdqa_instruction-instruction_handler dw movntdqa_instruction-instruction_handler
db 'movshdup',16h db 'movshdup',16h
dw movshdup_instruction-instruction_handler dw movshdup_instruction-instruction_handler
@ -2366,33 +2410,35 @@ instructions_8:
db 'vmovntps',2Bh db 'vmovntps',2Bh
dw avx_movntps_instruction-instruction_handler dw avx_movntps_instruction-instruction_handler
db 'vmpsadbw',42h db 'vmpsadbw',42h
dw avx_128bit_instruction_3a_imm8-instruction_handler dw avx_instruction_3a_imm8-instruction_handler
db 'vmresume',0C3h db 'vmresume',0C3h
dw simple_vmx_instruction-instruction_handler dw simple_vmx_instruction-instruction_handler
db 'vpaddusb',0DCh db 'vpaddusb',0DCh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpaddusw',0DDh db 'vpaddusw',0DDh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpalignr',0Fh db 'vpalignr',0Fh
dw avx_128bit_instruction_3a_imm8-instruction_handler dw avx_instruction_3a_imm8-instruction_handler
db 'vpblendd',2
dw avx_instruction_3a_imm8-instruction_handler
db 'vpblendw',0Eh db 'vpblendw',0Eh
dw avx_128bit_instruction_3a_imm8-instruction_handler dw avx_instruction_3a_imm8-instruction_handler
db 'vpcmpeqb',74h db 'vpcmpeqb',74h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmpeqd',76h db 'vpcmpeqd',76h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmpeqq',29h db 'vpcmpeqq',29h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpcmpeqw',75h db 'vpcmpeqw',75h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmpgtb',64h db 'vpcmpgtb',64h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmpgtd',66h db 'vpcmpgtd',66h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcmpgtq',37h db 'vpcmpgtq',37h
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpcmpgtw',65h db 'vpcmpgtw',65h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpcomeqb',4 db 'vpcomeqb',4
dw xop_pcom_b_instruction-instruction_handler dw xop_pcom_b_instruction-instruction_handler
db 'vpcomeqd',4 db 'vpcomeqd',4
@ -2442,7 +2488,7 @@ instructions_8:
db 'vphadddq',0CBh db 'vphadddq',0CBh
dw xop_single_source_128bit_instruction-instruction_handler dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddsw',3 db 'vphaddsw',3
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vphaddwd',0C6h db 'vphaddwd',0C6h
dw xop_single_source_128bit_instruction-instruction_handler dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddwq',0C7h db 'vphaddwq',0C7h
@ -2452,7 +2498,7 @@ instructions_8:
db 'vphsubdq',0E3h db 'vphsubdq',0E3h
dw xop_single_source_128bit_instruction-instruction_handler dw xop_single_source_128bit_instruction-instruction_handler
db 'vphsubsw',7 db 'vphsubsw',7
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vphsubwd',0E2h db 'vphsubwd',0E2h
dw xop_single_source_128bit_instruction-instruction_handler dw xop_single_source_128bit_instruction-instruction_handler
db 'vpmacsdd',9Eh db 'vpmacsdd',9Eh
@ -2462,19 +2508,19 @@ instructions_8:
db 'vpmacsww',95h db 'vpmacsww',95h
dw xop_triple_source_128bit_instruction-instruction_handler dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmaddwd',0F5h db 'vpmaddwd',0F5h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpmulhuw',0E4h db 'vpmulhuw',0E4h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpmuludq',0F4h db 'vpmuludq',0F4h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpshufhw',0F3h db 'vpshufhw',0F3h
dw avx_pshufd_instruction-instruction_handler dw avx_pshufd_instruction-instruction_handler
db 'vpshuflw',0F2h db 'vpshuflw',0F2h
dw avx_pshufd_instruction-instruction_handler dw avx_pshufd_instruction-instruction_handler
db 'vpsubusb',0D8h db 'vpsubusb',0D8h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpsubusw',0D9h db 'vpsubusw',0D9h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vroundpd',9 db 'vroundpd',9
dw avx_single_source_instruction_3a_imm8-instruction_handler dw avx_single_source_instruction_3a_imm8-instruction_handler
db 'vroundps',8 db 'vroundps',8
@ -2499,6 +2545,10 @@ instructions_8:
dw rdfsbase_instruction-instruction_handler dw rdfsbase_instruction-instruction_handler
db 'wrgsbase',3 db 'wrgsbase',3
dw rdfsbase_instruction-instruction_handler dw rdfsbase_instruction-instruction_handler
db 'xacquire',0F2h
dw prefix_instruction-instruction_handler
db 'xrelease',0F3h
dw prefix_instruction-instruction_handler
db 'xrstor64',101b db 'xrstor64',101b
dw fxsave_instruction_64bit-instruction_handler dw fxsave_instruction_64bit-instruction_handler
db 'xsaveopt',110b db 'xsaveopt',110b
@ -2520,6 +2570,8 @@ instructions_9:
dw cvtss2si_instruction-instruction_handler dw cvtss2si_instruction-instruction_handler
db 'extractps',0 db 'extractps',0
dw extractps_instruction-instruction_handler dw extractps_instruction-instruction_handler
db 'fxrstor64',1
dw fxsave_instruction_64bit-instruction_handler
db 'pclmulqdq',-1 db 'pclmulqdq',-1
dw pclmulqdq_instruction-instruction_handler dw pclmulqdq_instruction-instruction_handler
db 'pcmpestri',61h db 'pcmpestri',61h
@ -2652,22 +2704,22 @@ instructions_9:
dw avx_movmskpd_instruction-instruction_handler dw avx_movmskpd_instruction-instruction_handler
db 'vmovmskps',0 db 'vmovmskps',0
dw avx_movmskps_instruction-instruction_handler dw avx_movmskps_instruction-instruction_handler
db 'vmovntdqa',0 db 'vmovntdqa',2Ah
dw avx_movntdqa_instruction-instruction_handler dw avx_movntdqa_instruction-instruction_handler
db 'vmovshdup',16h db 'vmovshdup',16h
dw avx_movshdup_instruction-instruction_handler dw avx_movshdup_instruction-instruction_handler
db 'vmovsldup',12h db 'vmovsldup',12h
dw avx_movshdup_instruction-instruction_handler dw avx_movshdup_instruction-instruction_handler
db 'vpackssdw',6Bh db 'vpackssdw',6Bh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpacksswb',63h db 'vpacksswb',63h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpackusdw',2Bh db 'vpackusdw',2Bh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpackuswb',67h db 'vpackuswb',67h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpblendvb',4Ch db 'vpblendvb',4Ch
dw avx_triple_source_128bit_instruction_3a-instruction_handler dw avx_triple_source_instruction_3a-instruction_handler
db 'vpcomequb',4 db 'vpcomequb',4
dw xop_pcom_ub_instruction-instruction_handler dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomequd',4 db 'vpcomequd',4
@ -2771,15 +2823,15 @@ instructions_9:
db 'vpmovzxwq',34h db 'vpmovzxwq',34h
dw avx_pmovsxwq_instruction-instruction_handler dw avx_pmovsxwq_instruction-instruction_handler
db 'vpmulhrsw',0Bh db 'vpmulhrsw',0Bh
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vunpckhpd',15h db 'vunpckhpd',15h
dw avx_pd_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vunpckhps',15h db 'vunpckhps',15h
dw avx_instruction-instruction_handler dw avx_ps_instruction-instruction_handler
db 'vunpcklpd',14h db 'vunpcklpd',14h
dw avx_pd_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vunpcklps',14h db 'vunpcklps',14h
dw avx_instruction-instruction_handler dw avx_ps_instruction-instruction_handler
instructions_10: instructions_10:
db 'aesdeclast',0DFh db 'aesdeclast',0DFh
dw sse4_instruction_38-instruction_handler dw sse4_instruction_38-instruction_handler
@ -2831,6 +2883,14 @@ instructions_10:
dw avx_cvtss2si_instruction-instruction_handler dw avx_cvtss2si_instruction-instruction_handler
db 'vextractps',0 db 'vextractps',0
dw avx_extractps_instruction-instruction_handler dw avx_extractps_instruction-instruction_handler
db 'vgatherdpd',92h
dw gather_instruction_pd-instruction_handler
db 'vgatherdps',92h
dw gather_instruction_ps-instruction_handler
db 'vgatherqpd',93h
dw gather_instruction_pd-instruction_handler
db 'vgatherqps',93h
dw gather_instruction_ps-instruction_handler
db 'vmaskmovpd',2Dh db 'vmaskmovpd',2Dh
dw avx_maskmov_instruction-instruction_handler dw avx_maskmov_instruction-instruction_handler
db 'vmaskmovps',2Ch db 'vmaskmovps',2Ch
@ -2863,10 +2923,20 @@ instructions_10:
dw xop_pcom_w_instruction-instruction_handler dw xop_pcom_w_instruction-instruction_handler
db 'vperm2f128',6 db 'vperm2f128',6
dw avx_perm2f128_instruction-instruction_handler dw avx_perm2f128_instruction-instruction_handler
db 'vperm2i128',46h
dw avx_perm2f128_instruction-instruction_handler
db 'vpermil2pd',49h db 'vpermil2pd',49h
dw vpermil2_instruction-instruction_handler dw vpermil2_instruction-instruction_handler
db 'vpermil2ps',48h db 'vpermil2ps',48h
dw vpermil2_instruction-instruction_handler dw vpermil2_instruction-instruction_handler
db 'vpgatherdd',90h
dw gather_instruction_ps-instruction_handler
db 'vpgatherdq',90h
dw gather_instruction_pd-instruction_handler
db 'vpgatherqd',91h
dw gather_instruction_ps-instruction_handler
db 'vpgatherqq',91h
dw gather_instruction_pd-instruction_handler
db 'vpmacssdqh',8Fh db 'vpmacssdqh',8Fh
dw xop_triple_source_128bit_instruction-instruction_handler dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacssdql',87h db 'vpmacssdql',87h
@ -2874,19 +2944,23 @@ instructions_10:
db 'vpmadcsswd',0A6h db 'vpmadcsswd',0A6h
dw xop_triple_source_128bit_instruction-instruction_handler dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmaddubsw',4 db 'vpmaddubsw',4
dw avx_128bit_instruction_38-instruction_handler dw avx_instruction_38-instruction_handler
db 'vpmaskmovd',8Ch
dw avx_maskmov_instruction-instruction_handler
db 'vpmaskmovq',8Ch
dw avx_maskmov_w1_instruction-instruction_handler
db 'vpunpckhbw',68h db 'vpunpckhbw',68h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpckhdq',6Ah db 'vpunpckhdq',6Ah
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpckhwd',69h db 'vpunpckhwd',69h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpcklbw',60h db 'vpunpcklbw',60h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpckldq',62h db 'vpunpckldq',62h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpcklwd',61h db 'vpunpcklwd',61h
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vzeroupper',77h db 'vzeroupper',77h
dw vzeroupper_instruction-instruction_handler dw vzeroupper_instruction-instruction_handler
db 'xsaveopt64',110b db 'xsaveopt64',110b
@ -3040,6 +3114,8 @@ instructions_11:
dw fma4_instruction_p-instruction_handler dw fma4_instruction_p-instruction_handler
db 'vinsertf128',18h db 'vinsertf128',18h
dw avx_insertf128_instruction-instruction_handler dw avx_insertf128_instruction-instruction_handler
db 'vinserti128',38h
dw avx_insertf128_instruction-instruction_handler
db 'vmaskmovdqu',0 db 'vmaskmovdqu',0
dw avx_maskmovdqu_instruction-instruction_handler dw avx_maskmovdqu_instruction-instruction_handler
db 'vpcomfalseb',6 db 'vpcomfalseb',6
@ -3059,19 +3135,23 @@ instructions_11:
db 'vpcomtrueuw',7 db 'vpcomtrueuw',7
dw xop_pcom_uw_instruction-instruction_handler dw xop_pcom_uw_instruction-instruction_handler
db 'vphminposuw',41h db 'vphminposuw',41h
dw avx_single_source_128bit_instruction_38-instruction_handler dw avx_single_source_instruction_38-instruction_handler
db 'vpunpckhqdq',6Dh db 'vpunpckhqdq',6Dh
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
db 'vpunpcklqdq',6Ch db 'vpunpcklqdq',6Ch
dw avx_128bit_instruction-instruction_handler dw avx_pd_instruction-instruction_handler
instructions_12: instructions_12:
db 'pclmulhqhqdq',10001b
dw pclmulqdq_instruction-instruction_handler
db 'pclmulhqlqdq',1 db 'pclmulhqlqdq',1
dw pclmulqdq_instruction-instruction_handler dw pclmulqdq_instruction-instruction_handler
db 'pclmullqhqdq',10000b
dw pclmulqdq_instruction-instruction_handler
db 'pclmullqlqdq',0 db 'pclmullqlqdq',0
dw pclmulqdq_instruction-instruction_handler dw pclmulqdq_instruction-instruction_handler
db 'vbroadcastsd',0 db 'vbroadcastsd',19h
dw avx_broadcastsd_instruction-instruction_handler dw avx_broadcastsd_instruction-instruction_handler
db 'vbroadcastss',0 db 'vbroadcastss',18h
dw avx_broadcastss_instruction-instruction_handler dw avx_broadcastss_instruction-instruction_handler
db 'vcmpneq_oqpd',0Ch db 'vcmpneq_oqpd',0Ch
dw avx_cmp_pd_instruction-instruction_handler dw avx_cmp_pd_instruction-instruction_handler
@ -3131,6 +3211,8 @@ instructions_12:
dw avx_cmp_ss_instruction-instruction_handler dw avx_cmp_ss_instruction-instruction_handler
db 'vextractf128',19h db 'vextractf128',19h
dw avx_extractf128_instruction-instruction_handler dw avx_extractf128_instruction-instruction_handler
db 'vextracti128',39h
dw avx_extractf128_instruction-instruction_handler
db 'vfnmadd132pd',9Ch db 'vfnmadd132pd',9Ch
dw fma_instruction_pd-instruction_handler dw fma_instruction_pd-instruction_handler
db 'vfnmadd132ps',9Ch db 'vfnmadd132ps',9Ch
@ -3179,6 +3261,14 @@ instructions_12:
dw fma_instruction_sd-instruction_handler dw fma_instruction_sd-instruction_handler
db 'vfnmsub231ss',0BFh db 'vfnmsub231ss',0BFh
dw fma_instruction_ss-instruction_handler dw fma_instruction_ss-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 db 'vpclmulhqhdq',10001b
dw avx_pclmulqdq_instruction-instruction_handler dw avx_pclmulqdq_instruction-instruction_handler
db 'vpclmullqhdq',10000b db 'vpclmullqhdq',10000b
@ -3225,7 +3315,9 @@ instructions_13:
db 'vpclmullqlqdq',0 db 'vpclmullqlqdq',0
dw avx_pclmulqdq_instruction-instruction_handler dw avx_pclmulqdq_instruction-instruction_handler
instructions_14: instructions_14:
db 'vbroadcastf128',0 db 'vbroadcastf128',1Ah
dw avx_broadcastf128_instruction-instruction_handler
db 'vbroadcasti128',5Ah
dw avx_broadcastf128_instruction-instruction_handler dw avx_broadcastf128_instruction-instruction_handler
db 'vcmpfalse_ospd',1Bh db 'vcmpfalse_ospd',1Bh
dw avx_cmp_pd_instruction-instruction_handler dw avx_cmp_pd_instruction-instruction_handler

View File

@ -117,12 +117,16 @@ jump_type db ?
push_size db ? push_size db ?
value_size db ? value_size db ?
address_size db ? address_size db ?
label_size db ?
size_declared db ? size_declared db ?
value_undefined db ? value_undefined db ?
value_constant db ?
value_type db ? value_type db ?
value_sign db ?
fp_sign db ? fp_sign db ?
fp_format db ? fp_format db ?
address_sign db ?
compare_type db ? compare_type db ?
logical_value_wrapping db ? logical_value_wrapping db ?
next_pass_needed db ? next_pass_needed db ?
@ -130,8 +134,11 @@ output_format db ?
labels_type db ? labels_type db ?
code_type db ? code_type db ?
virtual_data db ? virtual_data db ?
org_origin_sign db ?
adjustment_sign db ?
macro_status db ? macro_status db ?
default_argument_value db ?
prefixed_instruction db ? prefixed_instruction db ?
formatter_symbols_allowed db ? formatter_symbols_allowed db ?

View File

@ -1,5 +1,5 @@
; flat assembler version 1.69 ; flat assembler version 1.70
; Copyright (c) 1999-2012, Tomasz Grysztar. ; Copyright (c) 1999-2012, Tomasz Grysztar.
; All rights reserved. ; All rights reserved.
; ;
@ -33,7 +33,7 @@
; cannot simply be copied and put under another distribution licence ; cannot simply be copied and put under another distribution licence
; (including the GNU Public Licence). ; (including the GNU Public Licence).
VERSION_STRING equ "1.69.36" VERSION_STRING equ "1.70.01"
VERSION_MAJOR = 1 VERSION_MAJOR = 1
VERSION_MINOR = 69 VERSION_MINOR = 70

View File

@ -76,10 +76,9 @@ int_instruction:
cmp al,'(' cmp al,'('
jne invalid_operand jne invalid_operand
call get_byte_value call get_byte_value
cmp [next_pass_needed],0
jne int_imm_ok
test eax,eax test eax,eax
js value_out_of_range jns int_imm_ok
call recoverable_overflow
int_imm_ok: int_imm_ok:
mov ah,al mov ah,al
mov al,0CDh mov al,0CDh
@ -160,11 +159,7 @@ basic_instruction:
jae long_immediate_not_encodable jae long_immediate_not_encodable
jmp basic_mem_imm_32bit_ok jmp basic_mem_imm_32bit_ok
basic_mem_imm_nosize: basic_mem_imm_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne basic_mem_imm_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
basic_mem_imm_8bit: basic_mem_imm_8bit:
call get_byte_value call get_byte_value
mov byte [value],al mov byte [value],al
@ -373,6 +368,14 @@ basic_instruction:
add [base_code],5 add [base_code],5
call store_instruction_code call store_instruction_code
jmp basic_store_imm_32bit 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: single_operand_instruction:
mov [base_code],0F6h mov [base_code],0F6h
mov [postbyte_register],al mov [postbyte_register],al
@ -392,11 +395,7 @@ single_operand_instruction:
inc [base_code] inc [base_code]
jmp instruction_ready jmp instruction_ready
single_mem_nosize: single_mem_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne single_mem_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
single_mem_8bit: single_mem_8bit:
jmp instruction_ready jmp instruction_ready
single_reg: single_reg:
@ -575,11 +574,7 @@ mov_instruction:
call store_instruction_with_imm16 call store_instruction_with_imm16
jmp instruction_assembled jmp instruction_assembled
mov_mem_imm_nosize: mov_mem_imm_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne mov_mem_imm_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
mov_mem_imm_32bit: mov_mem_imm_32bit:
call operand_32bit call operand_32bit
call get_dword_value call get_dword_value
@ -920,37 +915,6 @@ mov_instruction:
cmp ah,8 cmp ah,8
je mov_xrx_store je mov_xrx_store
jmp invalid_operand_size jmp invalid_operand_size
cmov_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_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je cmov_reg_mem
cmp al,10h
jne invalid_operand
cmov_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
cmov_reg_mem:
call get_address
mov al,[operand_size]
call operand_autodetect
jmp instruction_ready
test_instruction: test_instruction:
mov [base_code],84h mov [base_code],84h
lods byte [esi] lods byte [esi]
@ -1020,11 +984,7 @@ test_instruction:
call store_instruction_with_imm16 call store_instruction_with_imm16
jmp instruction_assembled jmp instruction_assembled
test_mem_imm_nosize: test_mem_imm_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne test_mem_imm_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
test_mem_imm_32bit: test_mem_imm_32bit:
call operand_32bit call operand_32bit
call get_dword_value call get_dword_value
@ -1243,11 +1203,7 @@ push_instruction:
je push_mem_32bit je push_mem_32bit
cmp ah,8 cmp ah,8
je push_mem_64bit je push_mem_64bit
cmp [error_line],0 call recoverable_unknown_size
jne push_mem_store
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp push_mem_store jmp push_mem_store
push_mem_16bit: push_mem_16bit:
test ah,not 2 test ah,not 2
@ -1509,11 +1465,7 @@ pop_instruction:
je pop_mem_32bit je pop_mem_32bit
cmp ah,8 cmp ah,8
je pop_mem_64bit je pop_mem_64bit
cmp [error_line],0 call recoverable_unknown_size
jne pop_mem_store
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp pop_mem_store jmp pop_mem_store
pop_mem_16bit: pop_mem_16bit:
test ah,not 2 test ah,not 2
@ -1689,11 +1641,7 @@ inc_instruction:
mov [postbyte_register],al mov [postbyte_register],al
jmp instruction_ready jmp instruction_ready
inc_mem_nosize: inc_mem_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne inc_mem_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
inc_mem_8bit: inc_mem_8bit:
mov al,0FEh mov al,0FEh
xchg al,[base_code] xchg al,[base_code]
@ -2028,11 +1976,7 @@ sh_instruction:
mov [base_code],0D3h mov [base_code],0D3h
jmp instruction_ready jmp instruction_ready
sh_mem_cl_nosize: sh_mem_cl_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne sh_mem_cl_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
sh_mem_cl_8bit: sh_mem_cl_8bit:
mov [base_code],0D2h mov [base_code],0D2h
jmp instruction_ready jmp instruction_ready
@ -2059,11 +2003,7 @@ sh_instruction:
mov [base_code],0D1h mov [base_code],0D1h
jmp instruction_ready jmp instruction_ready
sh_mem_imm_nosize: sh_mem_imm_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne sh_mem_imm_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
sh_mem_imm_8bit: sh_mem_imm_8bit:
cmp byte [value],1 cmp byte [value],1
je sh_mem_1_8bit je sh_mem_1_8bit
@ -2277,11 +2217,7 @@ movx_instruction:
call operand_autodetect call operand_autodetect
jmp instruction_ready jmp instruction_ready
movx_unknown_size: movx_unknown_size:
cmp [error_line],0 call recoverable_unknown_size
jne movx_mem_store
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp movx_mem_store jmp movx_mem_store
movx_reg: movx_reg:
lods byte [esi] lods byte [esi]
@ -2400,11 +2336,7 @@ bt_instruction:
call store_instruction_with_imm8 call store_instruction_with_imm8
jmp instruction_assembled jmp instruction_assembled
bt_mem_imm_nosize: bt_mem_imm_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne bt_mem_imm_store
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp bt_mem_imm_store jmp bt_mem_imm_store
bt_reg: bt_reg:
lods byte [esi] lods byte [esi]
@ -2457,6 +2389,16 @@ bt_instruction:
bs_instruction: bs_instruction:
mov [extended_code],al mov [extended_code],al
mov [base_code],0Fh 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:
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
cmp al,10h cmp al,10h
@ -2470,20 +2412,19 @@ bs_instruction:
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
cmp al,10h cmp al,10h
je bs_reg_reg je get_reg_reg
cmp al,'[' cmp al,'['
jne invalid_argument jne invalid_argument
call get_address call get_address
mov al,[operand_size] clc
call operand_autodetect ret
jmp instruction_ready get_reg_reg:
bs_reg_reg:
lods byte [esi] lods byte [esi]
call convert_register call convert_register
mov bl,al mov bl,al
mov al,ah stc
call operand_autodetect ret
jmp nomem_instruction_ready
imul_instruction: imul_instruction:
mov [base_code],0F6h mov [base_code],0F6h
mov [postbyte_register],5 mov [postbyte_register],5
@ -2503,11 +2444,7 @@ imul_instruction:
inc [base_code] inc [base_code]
jmp instruction_ready jmp instruction_ready
imul_mem_nosize: imul_mem_nosize:
cmp [error_line],0 call recoverable_unknown_size
jne imul_mem_8bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
imul_mem_8bit: imul_mem_8bit:
jmp instruction_ready jmp instruction_ready
imul_reg: imul_reg:
@ -2892,11 +2829,7 @@ jmp_instruction:
je jmp_mem_far je jmp_mem_far
cmp [jump_type],2 cmp [jump_type],2
je jmp_mem_near je jmp_mem_near
cmp [error_line],0 call recoverable_unknown_size
jne jmp_mem_near
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp_mem_near: jmp_mem_near:
cmp [code_type],16 cmp [code_type],16
je jmp_mem_16bit je jmp_mem_16bit
@ -3007,6 +2940,10 @@ jmp_instruction:
jmp_imm_32bit_store: jmp_imm_32bit_store:
mov edx,eax mov edx,eax
sub edx,3 sub edx,3
jno jmp_imm_32bit_ok
cmp [code_type],64
je relative_jump_out_of_range
jmp_imm_32bit_ok:
mov al,[base_code] mov al,[base_code]
stos byte [edi] stos byte [edi]
mov eax,edx mov eax,edx
@ -3021,7 +2958,7 @@ jmp_instruction:
mov ecx,edx mov ecx,edx
cdq cdq
cmp edx,ecx cmp edx,ecx
jne value_out_of_range jne relative_jump_out_of_range
call check_for_short_jump call check_for_short_jump
jnc jmp_imm_32bit_store jnc jmp_imm_32bit_store
jmp_short: jmp_short:
@ -3202,7 +3139,7 @@ conditional_jump:
mov ecx,edx mov ecx,edx
cdq cdq
cmp edx,ecx cmp edx,ecx
jne value_out_of_range jne relative_jump_out_of_range
call check_for_short_jump call check_for_short_jump
jnc conditional_jump_32bit_store jnc conditional_jump_32bit_store
conditional_jump_short: conditional_jump_short:
@ -3307,7 +3244,7 @@ loop_instruction:
mov ecx,edx mov ecx,edx
cdq cdq
cmp edx,ecx cmp edx,ecx
jne value_out_of_range jne relative_jump_out_of_range
jmp make_loop_jump jmp make_loop_jump
loop_jump_16bit: loop_jump_16bit:
call get_address_word_value call get_address_word_value
@ -3393,11 +3330,7 @@ movs_instruction:
je simple_instruction_64bit je simple_instruction_64bit
or bl,bl or bl,bl
jnz invalid_operand_size jnz invalid_operand_size
cmp [error_line],0 call recoverable_unknown_size
jne simple_instruction
mov ebx,[current_line]
mov [error_line],ebx
mov [error],operand_size_not_specified
jmp simple_instruction jmp simple_instruction
lods_instruction: lods_instruction:
lods byte [esi] lods byte [esi]
@ -3935,11 +3868,7 @@ basic_fpu_instruction:
je basic_fpu_mem_64bit je basic_fpu_mem_64bit
or al,al or al,al
jnz invalid_operand_size jnz invalid_operand_size
cmp [error_line],0 call recoverable_unknown_size
jne basic_fpu_mem_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
basic_fpu_mem_32bit: basic_fpu_mem_32bit:
jmp instruction_ready jmp instruction_ready
basic_fpu_mem_64bit: basic_fpu_mem_64bit:
@ -4007,11 +3936,7 @@ fi_instruction:
je fi_mem_32bit je fi_mem_32bit
or al,al or al,al
jnz invalid_operand_size jnz invalid_operand_size
cmp [error_line],0 call recoverable_unknown_size
jne fi_mem_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
fi_mem_32bit: fi_mem_32bit:
mov [base_code],0DAh mov [base_code],0DAh
jmp instruction_ready jmp instruction_ready
@ -4036,11 +3961,7 @@ fld_instruction:
je fld_mem_80bit je fld_mem_80bit
or al,al or al,al
jnz invalid_operand_size jnz invalid_operand_size
cmp [error_line],0 call recoverable_unknown_size
jne fld_mem_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
fld_mem_32bit: fld_mem_32bit:
mov [base_code],0D9h mov [base_code],0D9h
jmp instruction_ready jmp instruction_ready
@ -4086,11 +4007,7 @@ fild_instruction:
je fild_mem_64bit je fild_mem_64bit
or al,al or al,al
jnz invalid_operand_size jnz invalid_operand_size
cmp [error_line],0 call recoverable_unknown_size
jne fild_mem_32bit
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
fild_mem_32bit: fild_mem_32bit:
mov [base_code],0DBh mov [base_code],0DBh
jmp instruction_ready jmp instruction_ready
@ -5648,7 +5565,7 @@ pmovsxdq_instruction:
jne invalid_operand jne invalid_operand
call get_address call get_address
cmp [operand_size],0 cmp [operand_size],0
je mmx_imm8 je instruction_ready
mov al,[mmx_size] mov al,[mmx_size]
cmp al,[operand_size] cmp al,[operand_size]
jne invalid_operand_size jne invalid_operand_size
@ -5854,7 +5771,7 @@ movntdqa_instruction:
mov [opcode_prefix],66h mov [opcode_prefix],66h
mov [base_code],0Fh mov [base_code],0Fh
mov [extended_code],38h mov [extended_code],38h
mov [supplemental_code],2Ah mov [supplemental_code],al
lods byte [esi] lods byte [esi]
call get_size_operator call get_size_operator
cmp al,10h cmp al,10h
@ -5979,11 +5896,7 @@ crc32_instruction:
crc32_reg32_mem_store: crc32_reg32_mem_store:
jmp instruction_ready jmp instruction_ready
crc32_unknown_size: crc32_unknown_size:
cmp [error_line],0 call recoverable_unknown_size
jne crc32_reg32_mem_store
mov eax,[current_line]
mov [error_line],eax
mov [error],operand_size_not_specified
jmp crc32_reg32_mem_store jmp crc32_reg32_mem_store
crc32_reg32_reg: crc32_reg32_reg:
lods byte [esi] lods byte [esi]
@ -6301,6 +6214,8 @@ rdrand_instruction:
call operand_autodetect call operand_autodetect
jmp nomem_instruction_ready jmp nomem_instruction_ready
rdfsbase_instruction: rdfsbase_instruction:
cmp [code_type],64
jne illegal_instruction
mov [opcode_prefix],0F3h mov [opcode_prefix],0F3h
mov [base_code],0Fh mov [base_code],0Fh
mov [extended_code],0AEh mov [extended_code],0AEh
@ -6318,6 +6233,70 @@ rdfsbase_instruction:
call operand_autodetect call operand_autodetect
jmp nomem_instruction_ready 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
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
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 relative_jump_out_of_range
xbegin_rel32_ok:
mov ax,0F8C7h
stos word [edi]
mov eax,edx
stos dword [edi]
jmp instruction_assembled
convert_register: convert_register:
mov ah,al mov ah,al
shr ah,4 shr ah,4
@ -6456,11 +6435,7 @@ get_address:
cdq cdq
cmp edx,[address_high] cmp edx,[address_high]
je address_high_ok je address_high_ok
cmp [error_line],0 call recoverable_overflow
jne address_high_ok
mov ebx,[current_line]
mov [error_line],ebx
mov [error],value_out_of_range
address_high_ok: address_high_ok:
mov edx,eax mov edx,eax
ror ecx,16 ror ecx,16
@ -6559,7 +6534,7 @@ store_instruction_code:
cmp [code_type],64 cmp [code_type],64
jne invalid_operand jne invalid_operand
test al,0B0h test al,0B0h
jnz prefix_conflict jnz disallowed_combination_of_registers
stos byte [edi] stos byte [edi]
rex_prefix_ok: rex_prefix_ok:
mov al,[base_code] mov al,[base_code]
@ -6617,13 +6592,11 @@ store_instruction:
test bx,8080h test bx,8080h
jz address_value_ok jz address_value_ok
address_value_out_of_range: address_value_out_of_range:
cmp [error_line],0 call recoverable_overflow
jne address_value_ok
mov edx,[current_line]
mov [error_line],edx
mov [error],value_out_of_range
address_value_ok: address_value_ok:
call store_segment_prefix_if_necessary call store_segment_prefix_if_necessary
test [vex_required],4
jnz address_vsib
or bx,bx or bx,bx
jz address_immediate jz address_immediate
cmp bx,0F800h cmp bx,0F800h
@ -6733,6 +6706,22 @@ store_instruction:
or al,cl or al,cl
stos byte [edi] stos byte [edi]
ret ret
address_vsib:
mov al,bl
shr al,4
cmp al,0Ch
je vector_index_ok
cmp al,0Dh
jne invalid_address
vector_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: postbyte_32bit:
call address_32bit_prefix call address_32bit_prefix
jmp address_prefix_ok jmp address_prefix_ok
@ -6779,6 +6768,7 @@ store_instruction:
or ah,bl or ah,bl
and bh,111b and bh,111b
or ah,bh or ah,bh
sib_ready:
test ch,44h test ch,44h
jnz sib_address_32bit_value jnz sib_address_32bit_value
test ch,88h test ch,88h