From 7cc70d63f1b5040ab402804436e69eb55a4e2c87 Mon Sep 17 00:00:00 2001 From: Tomasz Grysztar Date: Sat, 17 Nov 2001 12:00:00 +0000 Subject: [PATCH] release 1.20 --- FASM.DOC | 22 +- LICENSE.TXT | 2 +- SOURCE/ASSEMBLE.INC | 1839 +++++++++++++++++++++++----------------- SOURCE/EXPRESSI.INC | 451 +++++----- SOURCE/FORMATS.INC | 35 +- SOURCE/PARSER.INC | 11 + SOURCE/PREPROCE.INC | 21 +- SOURCE/TABLES.INC | 126 ++- SOURCE/VERSION.INC | 4 +- SOURCE/WIN32/FASMW.ASM | 13 + WHATSNEW.TXT | 9 + 11 files changed, 1479 insertions(+), 1054 deletions(-) diff --git a/FASM.DOC b/FASM.DOC index 8e18b68..2efa9f4 100644 --- a/FASM.DOC +++ b/FASM.DOC @@ -9,7 +9,7 @@ ÛÛ Û ÛÛ Ü ÞÛ ÞÛ Û Ý ßßßßßß ßßßßß ßß ßßßßßß ß ß ß - flat assembler version 1.14 + flat assembler version 1.20 Copyright (c) 1999-2001, Tomasz Grysztar. All rights reserved. @@ -115,7 +115,7 @@ use size override: 'mov eax,dword [myvar]', or (short form): 8-bit or a 16-bit variable; eax will contain whatever is in the four bytes beginning at the address of 'myvar'! Allowed size overrides are: byte (8-bit), word (16-bit), dword (32-bit), pword (48-bit), qword (64-bit), tword (80-bit), -xword (128-bit), first letters are the short forms. +dqword (128-bit), first letters are the short forms. 2.1.1.2 Jumps and calls @@ -167,12 +167,12 @@ be [ebx+00000001], etc. 2.1.1.5 Special cases - 'xlat' instruction accepts no arguments, or one argument: -'[bx]'/'byte [bx]' to create 16-bit version, or '[ebx]'/'byte [ebx]' -to create 32-bit version of opcode; in the similar way advanced settings -of string instructions can be done, like 'movs byte [es:edi],[fs:esi]', -to adjust address registers size and segment override ('movs' needs two -arguments). 'xlatb', 'movsb', etc. accept no arguments. + 'xlat' instruction accepts one argument: '[bx]'/'byte [bx]' to create +16-bit version, or '[ebx]'/'byte [ebx]' to create 32-bit version of opcode; +in the similar way advanced settings of string instructions can be done, like +'movs byte [es:edi],[fs:esi]', to adjust address registers size and segment +override ('movs' needs two arguments). 'xlatb', 'movsb', etc. accept no +arguments. 2.1.1.6 FPU and MMX instructions @@ -188,7 +188,7 @@ arguments). 'xlatb', 'movsb', etc. accept no arguments. paddb mm0,mm1 ; packed add bytes pand mm7,qword [esi] ; logical and addps xmm0,xmm1 ; packed single fp add - cmpeqps xmm7,xword [esi] ; packed single fp compare + cmpeqps xmm7,dqword [esi] ; packed single fp compare shufps xmm4,xmm5,1 ; shuffle single fp 2.1.2 Number syntax @@ -287,6 +287,10 @@ directive before data definition, for example: 2.2.1 Preprocessor directives +common - used inside macro definitions, all following instructions in this + part of macroinstructions will be processed only once, even if + multiple arguments are processed. + include - includes source file in source code before assembly macro - defines macroinstructions, arguments are macro name and names diff --git a/LICENSE.TXT b/LICENSE.TXT index 5b4330f..38eb4df 100644 --- a/LICENSE.TXT +++ b/LICENSE.TXT @@ -1,5 +1,5 @@ -flat assembler version 1.14 +flat assembler version 1.20 Copyright (c) 1999-2001, Tomasz Grysztar All rights reserved. diff --git a/SOURCE/ASSEMBLE.INC b/SOURCE/ASSEMBLE.INC index 8249c99..b38672b 100644 --- a/SOURCE/ASSEMBLE.INC +++ b/SOURCE/ASSEMBLE.INC @@ -22,6 +22,7 @@ assembler: mov esi,[source_start] mov edi,[code_start] mov [org_start],edi + mov [org_sib],0 mov [error_line],0 mov [virtual_mode],0 mov [counter],0 @@ -154,22 +155,26 @@ assemble_line: .reloc_ok: xchg ch,[ebx+11] mov al,[current_pass] - cmp byte [ebx+8],0 - je .new + test byte [ebx+8],1 + jz .new cmp al,[ebx+9] je symbol_already_defined mov [ebx+9],al mov eax,edi sub eax,[org_start] xchg [ebx],eax - xor edx,edx + cdq xchg [ebx+4],edx + mov ebp,[org_sib] + xchg [ebx+12],ebp cmp [current_pass],0 je assemble_line cmp eax,[ebx] jne .changed - or edx,edx - jnz .changed + cmp edx,[ebx+4] + jne .changed + cmp ebp,[ebx+12] + jne .changed cmp ch,[ebx+11] jne .changed jmp assemble_line @@ -177,13 +182,16 @@ assemble_line: mov [next_pass_needed],1 jmp assemble_line .new: - mov byte [ebx+8],1 + or byte [ebx+8],1 mov [ebx+9],al mov byte [ebx+10],dl mov eax,edi sub eax,[org_start] mov [ebx],eax - mov dword [ebx+4],0 + cdq + mov dword [ebx+4],edx + mov eax,[org_sib] + mov [ebx+12],eax jmp assemble_line define_constant: lods dword [esi] @@ -196,13 +204,13 @@ assemble_line: pop ebx make_constant: mov cl,[current_pass] - cmp byte [ebx+8],0 - je .new + test byte [ebx+8],1 + jz .new cmp cl,[ebx+9] jne .redefine - cmp byte [ebx+12],1 - jne symbol_already_defined - mov byte [ebx+13],1 + test byte [ebx+8],2 + jz symbol_already_defined + or byte [ebx+8],4 .redefine: mov [ebx+9],cl xchg [ebx],eax @@ -219,13 +227,12 @@ assemble_line: jne .changed jmp assemble_line .changed: - cmp byte [ebx+13],1 - je assemble_line + test byte [ebx+8],4 + jnz assemble_line mov [next_pass_needed],1 jmp assemble_line .new: - mov byte [ebx+12],1 - mov byte [ebx+8],1 + or byte [ebx+8],1+2 mov word [ebx+9],cx mov [ebx],eax mov [ebx+4],edx @@ -356,6 +363,7 @@ org_directive: mov ecx,edi sub ecx,eax mov [org_start],ecx + mov [org_sib],0 jmp instruction_assembled label_directive: lods byte [esi] @@ -363,10 +371,15 @@ label_directive: jne invalid_argument lods dword [esi] mov ebx,eax - call get_operand_size - mov ch,[operand_size] + xor ch,ch + cmp byte [esi],11h + jne label_size_ok + lods word [esi] + mov ch,ah + label_size_ok: mov eax,edi sub eax,[org_start] + mov ebp,[org_sib] cmp word [esi],13h jne .define add esi,2 @@ -377,7 +390,14 @@ label_directive: push ebx cx cmp byte [esi],'.' je invalid_value - call get_dword_value + call get_address_value + or bh,bh + setnz ch + xchg ch,cl + mov bp,cx + shl ebp,16 + mov bl,bh + mov bp,bx pop cx ebx mov dl,al mov dh,[value_type] @@ -392,21 +412,24 @@ label_directive: .reloc_ok: xchg dh,[ebx+11] mov cl,[current_pass] - cmp byte [ebx+8],0 - je .new + test byte [ebx+8],1 + jz .new cmp cl,[ebx+9] je symbol_already_defined mov ch,dh mov [ebx+9],cl xchg [ebx],eax - xor edx,edx + cdq xchg [ebx+4],edx + xchg [ebx+12],ebp cmp [current_pass],0 je instruction_assembled cmp eax,[ebx] jne .changed - or edx,edx - jnz .changed + cmp edx,[ebx+4] + jne .changed + cmp ebp,[ebx+12] + jne .changed cmp ch,[ebx+11] jne .changed jmp instruction_assembled @@ -414,11 +437,13 @@ label_directive: mov [next_pass_needed],1 jmp instruction_assembled .new: - mov byte [ebx+8],1 + or byte [ebx+8],1 mov [ebx+9],cl mov byte [ebx+10],ch mov [ebx],eax - mov dword [ebx+4],0 + cdq + mov dword [ebx+4],edx + mov [ebx+12],ebp jmp instruction_assembled load_directive: lods byte [esi] @@ -426,13 +451,15 @@ load_directive: jne invalid_argument lods dword [esi] push eax - call get_operand_size - cmp [operand_size],0 + mov al,1 + cmp byte [esi],11h jne load_size_ok - mov [operand_size],1 + lods byte [esi] + lods byte [esi] load_size_ok: - cmp [operand_size],8 + cmp al,8 ja invalid_value + mov [operand_size],al lods word [esi] cmp ax,0213h jne invalid_argument @@ -537,18 +564,27 @@ virtual_directive: jne invalid_argument cmp byte [esi],'.' je invalid_value - call get_dword_value - mov dl,[value_type] + call get_address_value + xor ch,ch + or bh,bh + jz set_virtual + mov ch,1 jmp set_virtual virtual_at_current: dec esi mov eax,edi sub eax,[org_start] - xor dl,dl + xor bx,bx + xor cx,cx + mov [value_type],0 cmp [reloc_labels],0 je set_virtual mov dl,2 set_virtual: + mov byte [org_sib],bh + mov byte [org_sib+1],bl + mov byte [org_sib+2],ch + mov byte [org_sib+3],cl cmp [virtual_mode],0 jne status_stored mov ebx,[org_start] @@ -559,9 +595,9 @@ virtual_directive: status_stored: mov [virtual_mode],1 mov [reloc_labels],0 - cmp dl,1 + cmp [value_type],1 je invalid_use_of_symbol - cmp dl,2 + cmp [value_type],2 jne virtual_mode_ok mov [reloc_labels],1 virtual_mode_ok: @@ -575,6 +611,7 @@ virtual_directive: mov [virtual_mode],0 mov eax,[stored_org] mov [org_start],eax + mov [org_sib],0 mov edi,[stored_offset] mov al,[stored_reloc_labels] mov [reloc_labels],al @@ -1459,10 +1496,10 @@ prefix_instruction: stos byte [edi] jmp assemble_line int_instruction: - call get_operand_size - cmp [operand_size],1 - ja invalid_operand_size lods byte [esi] + call get_size_operator + cmp ah,1 + ja invalid_operand_size cmp al,'(' jne invalid_operand call get_byte_value @@ -1472,7 +1509,6 @@ int_instruction: jmp instruction_assembled aa_instruction: push ax - call get_operand_size mov bl,10 cmp byte [esi],'(' jne .store @@ -1493,8 +1529,8 @@ aa_instruction: basic_instruction: mov [base_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je basic_reg cmp al,'[' @@ -1508,8 +1544,8 @@ basic_instruction: cmp byte [esi],11h sete al mov [imm_sized],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je basic_mem_imm cmp al,10h @@ -1519,7 +1555,7 @@ basic_instruction: call convert_register mov [postbyte_register],al pop cx bx edx - mov al,[operand_size] + mov al,ah cmp al,1 je basic_mem_reg_8bit cmp al,2 @@ -1629,8 +1665,8 @@ basic_instruction: cmp byte [esi],11h sete al mov [imm_sized],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je basic_reg_reg cmp al,'(' @@ -1668,7 +1704,7 @@ basic_instruction: mov bl,[postbyte_register] or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je basic_reg_reg_8bit cmp al,2 @@ -1803,8 +1839,8 @@ basic_instruction: single_operand_instruction: mov [base_code],0F6h mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je single_reg cmp al,'[' @@ -1844,7 +1880,7 @@ single_operand_instruction: shl bl,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je single_reg_8bit cmp al,2 @@ -1871,8 +1907,8 @@ single_operand_instruction: jmp instruction_assembled mov_instruction: mov [base_code],88h - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je mov_reg cmp al,'[' @@ -1883,8 +1919,8 @@ mov_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je mov_mem_imm cmp al,10h @@ -1896,7 +1932,6 @@ mov_instruction: call convert_register mov [postbyte_register],al pop cx bx edx - mov ah,[operand_size] cmp ah,1 je mov_mem_reg_8bit cmp ah,2 @@ -1923,7 +1958,7 @@ mov_instruction: jb mov_mem_address16_al mov_mem_address32_al: call address_32bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A2h store_mov_address32: stos byte [edi] @@ -1931,7 +1966,7 @@ mov_instruction: jmp store_address_32bit_value mov_mem_address16_al: call address_16bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A2h store_mov_address16: stos byte [edi] @@ -1962,12 +1997,12 @@ mov_instruction: jb mov_mem_address16_ax mov_mem_address32_ax: call address_32bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A3h jmp store_mov_address32 mov_mem_address16_ax: call address_16bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A3h jmp store_mov_address16 mov_mem_reg_32bit: @@ -2060,8 +2095,8 @@ mov_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' je mov_reg_mem cmp al,'(' @@ -2077,7 +2112,7 @@ mov_instruction: mov bl,[postbyte_register] or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je mov_reg_reg_8bit cmp al,2 @@ -2179,12 +2214,12 @@ mov_instruction: jb mov_al_mem_address16 mov_al_mem_address32: call address_32bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A0h jmp store_mov_address32 mov_al_mem_address16: call address_16bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A0h jmp store_mov_address16 mov_reg_mem_16bit: @@ -2209,12 +2244,12 @@ mov_instruction: jb mov_ax_mem_address16 mov_ax_mem_address32: call address_32bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A1h jmp store_mov_address32 mov_ax_mem_address16: call address_16bit_prefix - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0A1h jmp store_mov_address16 mov_reg_mem_32bit: @@ -2281,8 +2316,8 @@ mov_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' je mov_sreg_mem cmp al,10h @@ -2290,7 +2325,6 @@ mov_instruction: mov_sreg_reg: lods byte [esi] call convert_register - mov ah,[operand_size] or ah,ah jz mov_sreg_reg_size_ok cmp ah,4 @@ -2362,7 +2396,7 @@ mov_instruction: jne invalid_operand lods byte [esi] call convert_register - cmp [operand_size],4 + cmp ah,4 jne invalid_operand_size mov bl,11000000b or bl,al @@ -2378,8 +2412,8 @@ mov_instruction: cmov_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -2388,8 +2422,8 @@ cmov_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' je cmov_reg_mem cmp al,10h @@ -2401,7 +2435,7 @@ cmov_instruction: shl bl,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,2 je cmov_reg_reg_16bit cmp al,4 @@ -2437,8 +2471,8 @@ cmov_instruction: jmp instruction_assembled test_instruction: mov [base_code],84h - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je test_reg cmp al,'[' @@ -2449,8 +2483,8 @@ test_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je test_mem_imm cmp al,10h @@ -2460,7 +2494,7 @@ test_instruction: call convert_register mov [postbyte_register],al pop cx bx edx - mov al,[operand_size] + mov al,ah cmp al,1 je test_mem_reg_8bit cmp al,2 @@ -2537,8 +2571,8 @@ test_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je test_reg_imm cmp al,10h @@ -2550,7 +2584,7 @@ test_instruction: mov bl,[postbyte_register] or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je test_reg_reg_8bit cmp al,2 @@ -2652,8 +2686,8 @@ test_instruction: jmp instruction_assembled xchg_instruction: mov [base_code],86h - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je xchg_reg cmp al,'[' @@ -2664,8 +2698,8 @@ xchg_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand xchg_mem_reg: @@ -2673,7 +2707,7 @@ xchg_instruction: call convert_register mov [postbyte_register],al pop cx bx edx - mov al,[operand_size] + mov al,ah cmp al,1 je xchg_mem_reg_8bit cmp al,2 @@ -2701,8 +2735,8 @@ xchg_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' je xchg_reg_mem cmp al,10h @@ -2715,7 +2749,7 @@ xchg_instruction: shl [postbyte_register],3 or al,11000000b or [postbyte_register],al - mov al,[operand_size] + mov al,ah cmp al,1 je xchg_reg_reg_8bit cmp al,2 @@ -2774,8 +2808,8 @@ xchg_instruction: call store_instruction jmp instruction_assembled push_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je push_reg cmp al,'(' @@ -2814,7 +2848,7 @@ push_instruction: call convert_register mov dl,al add dl,50h - mov al,[operand_size] + mov al,ah cmp al,2 je push_reg_16bit cmp al,4 @@ -2934,8 +2968,8 @@ push_instruction: mov [forced_size],0 jmp push_instruction pop_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je pop_reg cmp al,'[' @@ -2972,7 +3006,7 @@ pop_instruction: call convert_register mov dl,al add dl,58h - mov al,[operand_size] + mov al,ah cmp al,2 je pop_reg_16bit cmp al,4 @@ -3039,8 +3073,8 @@ pop_instruction: jmp pop_instruction inc_instruction: mov [base_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je inc_reg cmp al,'[' @@ -3086,7 +3120,7 @@ inc_instruction: call convert_register mov dl,al shr al,4 - mov al,[operand_size] + mov al,ah cmp al,1 je inc_reg_8bit mov dh,[base_code] @@ -3118,8 +3152,8 @@ inc_instruction: jmp instruction_assembled arpl_instruction: mov [base_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je arpl_reg cmp al,'[' @@ -3134,7 +3168,7 @@ arpl_instruction: lods byte [esi] call convert_register mov [postbyte_register],al - cmp [operand_size],2 + cmp ah,2 jne invalid_operand_size mov [base_code],63h call store_instruction @@ -3142,7 +3176,7 @@ arpl_instruction: arpl_reg: lods byte [esi] call convert_register - cmp [operand_size],2 + cmp ah,2 jne invalid_operand_size mov dl,al lods byte [esi] @@ -3153,7 +3187,7 @@ arpl_instruction: jne invalid_operand lods byte [esi] call convert_register - cmp [operand_size],2 + cmp ah,2 jne invalid_operand_size mov ah,al shl ah,3 @@ -3163,8 +3197,8 @@ arpl_instruction: stos word [edi] jmp instruction_assembled bound_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -3196,8 +3230,8 @@ bound_instruction: set_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je set_reg cmp al,'[' @@ -3213,7 +3247,7 @@ set_instruction: lods byte [esi] call convert_register mov bl,al - cmp [operand_size],1 + cmp ah,1 jne invalid_operand_size mov ah,[extended_code] mov al,0Fh @@ -3241,15 +3275,14 @@ ret_instruction: je simple_ret cmp al,81h je simple_ret - call get_operand_size - mov al,[operand_size] - or al,al + lods byte [esi] + call get_size_operator + or ah,ah jz ret_imm - cmp al,2 + cmp ah,2 je ret_imm jmp invalid_operand_size ret_imm: - lods byte [esi] cmp al,'(' jne invalid_operand call get_word_value @@ -3268,8 +3301,8 @@ ret_instruction: jmp instruction_assembled lea_instruction: mov [base_code],8Dh - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -3281,8 +3314,8 @@ lea_instruction: mov al,[operand_size] push ax mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -3315,8 +3348,8 @@ ls_instruction: lds_instruction: mov [base_code],0C5h ls_code_ok: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -3326,8 +3359,8 @@ ls_instruction: cmp al,',' jne invalid_operand add [operand_size],2 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -3354,14 +3387,13 @@ ls_instruction: jne invalid_operand_size jmp instruction_assembled enter_instruction: - call get_operand_size - mov al,[operand_size] - cmp al,2 + lods byte [esi] + call get_size_operator + cmp ah,2 je enter_imm16_size_ok - or al,al + or ah,ah jnz invalid_operand_size enter_imm16_size_ok: - lods byte [esi] cmp al,'(' jne invalid_operand call get_word_value @@ -3372,14 +3404,13 @@ enter_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size - mov al,[operand_size] - cmp al,1 + lods byte [esi] + call get_size_operator + cmp ah,1 je enter_imm8_size_ok - or al,al + or ah,ah jnz invalid_operand_size enter_imm8_size_ok: - lods byte [esi] cmp al,'(' jne invalid_operand call get_byte_value @@ -3394,8 +3425,8 @@ enter_instruction: jmp instruction_assembled sh_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je sh_reg cmp al,'[' @@ -3409,8 +3440,8 @@ sh_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je sh_mem_imm cmp al,10h @@ -3514,14 +3545,14 @@ sh_instruction: shl [postbyte_register],3 or al,11000000b or [postbyte_register],al - mov al,[operand_size] + mov al,ah push ax mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je sh_reg_imm cmp al,10h @@ -3629,8 +3660,8 @@ sh_instruction: shd_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je shd_reg cmp al,'[' @@ -3641,8 +3672,8 @@ shd_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -3654,8 +3685,8 @@ shd_instruction: xor al,al xchg al,[operand_size] push ax - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je shd_mem_reg_imm cmp al,10h @@ -3663,7 +3694,6 @@ shd_instruction: lods byte [esi] cmp al,11h jne invalid_operand - call convert_register pop ax cx bx edx cmp al,2 je shd_mem_reg_cl_16bit @@ -3714,8 +3744,8 @@ shd_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -3724,14 +3754,14 @@ shd_instruction: shl al,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah push ax bx lods byte [esi] cmp al,',' jne invalid_operand mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je shd_reg_reg_imm cmp al,10h @@ -3739,7 +3769,6 @@ shd_instruction: lods byte [esi] cmp al,11h jne invalid_operand - call convert_register pop bx ax cmp al,2 je shd_reg_reg_cl_16bit @@ -3791,14 +3820,14 @@ shd_instruction: movx_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al - mov al,[operand_size] + mov al,ah cmp al,2 je movx_16bit cmp al,4 @@ -3809,8 +3838,8 @@ movx_instruction: cmp al,',' jne invalid_operand mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je movx_16bit_reg cmp al,'[' @@ -3832,7 +3861,7 @@ movx_instruction: shl bl,3 or bl,al or bl,11000000b - cmp [operand_size],1 + cmp ah,1 jne invalid_operand_size call operand_16bit_prefix mov al,0Fh @@ -3847,8 +3876,8 @@ movx_instruction: cmp al,',' jne invalid_operand mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je movx_32bit_reg cmp al,'[' @@ -3881,7 +3910,7 @@ movx_instruction: shl bl,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je movx_32bit_reg_8bit cmp al,2 @@ -3912,8 +3941,8 @@ bt_instruction: add al,83h mov [extended_code],al mov [base_code],0Fh - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je bt_reg cmp al,'[' @@ -3930,15 +3959,15 @@ bt_instruction: cmp byte [esi+2],'(' je bt_mem_imm bt_mem_reg: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al pop cx bx edx - mov al,[operand_size] + mov al,ah cmp al,2 je bt_mem_reg_16bit cmp al,4 @@ -3956,8 +3985,8 @@ bt_instruction: xor al,al xchg al,[operand_size] push ax - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand mov al,[operand_size] @@ -4009,8 +4038,8 @@ bt_instruction: cmp byte [esi+2],'(' je bt_reg_imm bt_reg_reg: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -4019,7 +4048,7 @@ bt_instruction: shl al,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,2 je bt_reg_reg_16bit cmp al,4 @@ -4045,8 +4074,8 @@ bt_instruction: xor al,al xchg al,[operand_size] push ax - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand mov al,[operand_size] @@ -4089,8 +4118,8 @@ bt_instruction: bs_instruction: mov [extended_code],al mov [base_code],0Fh - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -4126,7 +4155,7 @@ bs_instruction: shl bl,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,2 je bs_reg_reg_16bit cmp al,4 @@ -4152,8 +4181,8 @@ pm_word_instruction: mov [base_code],0Fh mov [extended_code],ah mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je pm_reg cmp al,'[' @@ -4170,7 +4199,7 @@ pm_word_instruction: pm_reg: lods byte [esi] call convert_register - cmp [operand_size],2 + cmp ah,2 jne invalid_operand_size mov bl,al mov al,0Fh @@ -4186,8 +4215,8 @@ pm_pword_instruction: mov [base_code],0Fh mov [extended_code],1 mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -4203,8 +4232,8 @@ pm_pword_instruction: imul_instruction: mov [base_code],0F6h mov [postbyte_register],5 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je imul_reg cmp al,'[' @@ -4246,7 +4275,6 @@ imul_instruction: shl bl,3 or bl,al or bl,11000000b - mov ah,[operand_size] cmp ah,1 je imul_reg_8bit cmp ah,2 @@ -4281,8 +4309,8 @@ imul_instruction: cmp byte [esi+2],'(' je imul_reg_imm imul_reg__: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je imul_reg_reg cmp al,'[' @@ -4314,8 +4342,8 @@ imul_instruction: inc esi xor cl,cl xchg cl,[operand_size] - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand mov al,[operand_size] @@ -4393,7 +4421,7 @@ imul_instruction: mov dl,al cmp byte [esi],',' je imul_reg_reg_imm - mov al,[operand_size] + mov al,ah cmp al,2 je imul_reg_reg_16bit cmp al,4 @@ -4417,8 +4445,8 @@ imul_instruction: inc esi xor cl,cl xchg cl,[operand_size] - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand mov al,[operand_size] @@ -4520,8 +4548,8 @@ imul_instruction: stos dword [edi] jmp instruction_assembled in_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -4531,11 +4559,11 @@ in_instruction: lods byte [esi] cmp al,',' jne invalid_operand - mov al,[operand_size] + mov al,ah push ax mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je in_imm cmp al,10h @@ -4545,7 +4573,6 @@ in_instruction: lods byte [esi] cmp al,22h jne invalid_operand - call convert_register pop ax cmp al,1 je in_al_dx @@ -4606,8 +4633,8 @@ in_instruction: stos byte [edi] jmp instruction_assembled out_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' je out_imm cmp al,10h @@ -4615,20 +4642,19 @@ out_instruction: lods byte [esi] cmp al,22h jne invalid_operand - call convert_register lods byte [esi] cmp al,',' jne invalid_operand mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register or al,al jnz invalid_operand - mov al,[operand_size] + mov al,ah cmp al,1 je out_dx_al cmp al,2 @@ -4663,15 +4689,15 @@ out_instruction: cmp al,',' jne invalid_operand mov [operand_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register or al,al jnz invalid_operand - mov al,[operand_size] + mov al,ah cmp al,1 je out_imm_al cmp al,2 @@ -4702,8 +4728,8 @@ out_instruction: lar_instruction: mov [extended_code],al mov [base_code],0Fh - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -4712,8 +4738,8 @@ lar_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je lar_reg_reg cmp al,'[' @@ -4740,7 +4766,7 @@ lar_instruction: shl bl,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,2 je lar_reg_reg_16bit cmp al,4 @@ -4762,8 +4788,8 @@ invlpg_instruction: mov [base_code],0Fh mov [extended_code],1 mov [postbyte_register],7 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -4772,8 +4798,8 @@ invlpg_instruction: basic_486_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je basic_486_reg cmp al,'[' @@ -4783,15 +4809,15 @@ basic_486_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al pop cx bx edx - mov al,[operand_size] + mov al,ah cmp al,1 je basic_486_mem_reg_8bit cmp al,2 @@ -4819,8 +4845,8 @@ basic_486_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] @@ -4829,7 +4855,7 @@ basic_486_instruction: shl al,3 or bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,1 je basic_486_reg_reg_8bit cmp al,2 @@ -4852,15 +4878,15 @@ basic_486_instruction: stos byte [edi] jmp instruction_assembled bswap_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov ah,al add ah,0C8h - cmp [operand_size],4 + cmp ah,4 jne invalid_operand_size call operand_32bit_prefix mov al,0Fh @@ -4870,8 +4896,8 @@ cmpxchg8b_instruction: mov [base_code],0Fh mov [extended_code],0C7h mov [postbyte_register],1 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -4886,11 +4912,11 @@ cmpxchg8b_instruction: conditional_jump: mov [base_code],al + lods byte [esi] call get_jump_operator - call get_operand_size cmp [jump_type],2 je invalid_operand - lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand cmp byte [esi],'.' @@ -4901,6 +4927,8 @@ conditional_jump: sub eax,edi add eax,[org_start] sub eax,2 + cmp [org_sib],0 + jne invalid_use_of_symbol mov bl,[operand_size] cmp bl,1 je conditional_jump_8bit @@ -4978,11 +5006,11 @@ loop_instruction_32bit: mov al,cl loop_instruction: mov [base_code],al + lods byte [esi] call get_jump_operator - call get_operand_size cmp [jump_type],2 je invalid_operand - lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_operand cmp byte [esi],'.' @@ -4992,6 +5020,8 @@ loop_instruction: je invalid_use_of_symbol sub eax,edi add eax,[org_start] + cmp [org_sib],0 + jne invalid_use_of_symbol mov bl,[operand_size] cmp bl,1 je loop_8bit @@ -5019,9 +5049,9 @@ jmp_instruction: mov [base_code],0E9h mov [extended_code],0EAh process_jmp: - call get_jump_operator - call get_operand_size lods byte [esi] + call get_jump_operator + call get_size_operator cmp al,10h je jmp_reg cmp al,'(' @@ -5092,7 +5122,7 @@ jmp_instruction: call convert_register mov bl,al or bl,11000000b - mov al,[operand_size] + mov al,ah cmp al,2 je jmp_reg_16bit cmp al,4 @@ -5150,6 +5180,8 @@ jmp_instruction: sub eax,edi add eax,[org_start] sub eax,2 + cmp [org_sib],0 + jne invalid_use_of_symbol mov bl,[operand_size] cmp bl,1 je jmp_8bit @@ -5270,8 +5302,8 @@ jmp_instruction: stos word [edi] jmp instruction_assembled ins_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5320,8 +5352,8 @@ outs_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5354,8 +5386,8 @@ outs_instruction: je operand_size_not_specified jmp invalid_operand_size movs_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5369,8 +5401,8 @@ movs_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5417,8 +5449,8 @@ movs_instruction: jz operand_size_not_specified jmp invalid_operand_size lods_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5452,8 +5484,8 @@ lods_instruction: jmp invalid_operand_size stos_instruction: mov [base_code],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5484,8 +5516,8 @@ stos_instruction: je operand_size_not_specified jmp invalid_operand_size cmps_instruction: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5498,8 +5530,8 @@ cmps_instruction: lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5549,10 +5581,10 @@ cmps_instruction: jz operand_size_not_specified jmp invalid_operand_size xlat_instruction: - call get_operand_size - cmp byte [esi],'[' - jne xlatb_instruction - inc esi + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand call get_address or eax,eax jnz invalid_address @@ -5567,21 +5599,16 @@ xlat_instruction: xlat_16bit: call address_16bit_prefix xlat_store: - call store_segment_prefix + call store_segment_prefix_if_necessary mov al,0D7h cmp [operand_size],1 jbe simple_instruction jmp invalid_operand_size - xlatb_instruction: - cmp [operand_size],0 - jne invalid_operand - mov al,0D7h - jmp simple_instruction basic_fpu_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,14h je basic_fpu_freg cmp al,'[' @@ -5664,8 +5691,8 @@ simple_fpu_instruction: jmp instruction_assembled fi_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5690,8 +5717,8 @@ fi_instruction: jmp instruction_assembled fld_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,14h je fld_freg cmp al,'[' @@ -5750,8 +5777,8 @@ fld_instruction: jmp instruction_assembled fild_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5791,8 +5818,8 @@ fild_instruction: jmp instruction_assembled fbld_instruction: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5860,18 +5887,20 @@ fsave_instruction: mov [base_code],0DDh fpu_mem: mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address + cmp [operand_size],0 + jne invalid_operand_size call store_instruction jmp instruction_assembled fldcw_instruction: mov [postbyte_register],al mov [base_code],0D9h - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -5890,8 +5919,8 @@ fstsw_instruction: fnstsw_instruction: mov [base_code],0DDh mov [postbyte_register],7 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,10h je fstsw_reg cmp al,'[' @@ -5910,7 +5939,6 @@ fnstsw_instruction: lods byte [esi] cmp al,20h jne invalid_operand - call convert_register mov ax,0E0DFh stos word [edi] jmp instruction_assembled @@ -5944,103 +5972,115 @@ fucomip_instruction: jmp instruction_assembled movd_instruction: - call get_operand_size lods byte [esi] cmp al,16h je movd_mmreg cmp al,10h je movd_reg + call get_size_operator cmp al,'[' jne invalid_operand call get_address + test [operand_size],not 4 + jnz invalid_operand_size + mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register + call make_mmx_prefix mov [postbyte_register],al - cmp [operand_size],0 - je movd_mem_mmreg - cmp [operand_size],4 - jne invalid_operand_size - movd_mem_mmreg: mov [base_code],0Fh mov [extended_code],7Eh - call store_instruction - jmp instruction_assembled - movd_reg: - lods byte [esi] - call convert_register - cmp [operand_size],4 - jne invalid_operand_size - push ax - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,16h - jne invalid_operand - lods byte [esi] - pop bx - shl al,3 - or bl,al - or bl,11000000b - mov ax,7E0Fh - stos word [edi] - mov al,bl - stos byte [edi] + call store_mmx_instruction jmp instruction_assembled movd_mmreg: - cmp [operand_size],0 - jne invalid_operand lods byte [esi] + call convert_mmx_register + call make_mmx_prefix push ax + mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size lods byte [esi] - cmp al,'[' - je movd_mmreg_mem cmp al,10h + je movd_mmreg_reg + call get_size_operator + cmp al,'[' jne invalid_operand + call get_address + pop ax + mov [postbyte_register],al + test [operand_size],not 4 + jnz invalid_operand_size + mov [base_code],0Fh + mov [extended_code],6Eh + call store_mmx_instruction + jmp instruction_assembled + movd_mmreg_reg: lods byte [esi] call convert_register - cmp [operand_size],4 + cmp ah,4 jne invalid_operand_size pop bx shl bl,3 or bl,al or bl,11000000b + call store_mmx_prefix mov ax,6E0Fh stos word [edi] mov al,bl stos byte [edi] jmp instruction_assembled - movd_mmreg_mem: - call get_address - pop ax - mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],4 + movd_reg: + lods byte [esi] + call convert_register + cmp ah,4 jne invalid_operand_size - .store: - mov [base_code],0Fh - mov [extended_code],6Eh - call store_instruction + mov [operand_size],0 + push ax + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + pop bx + shl al,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov ax,7E0Fh + stos word [edi] + mov al,bl + stos byte [edi] jmp instruction_assembled + make_mmx_prefix: + mov [mmx_prefix],0 + cmp [operand_size],16 + jne no_mmx_prefix + mov [mmx_prefix],66h + no_mmx_prefix: + ret movq_instruction: - call get_operand_size lods byte [esi] cmp al,16h je movq_mmreg + call get_size_operator cmp al,'[' jne invalid_operand call get_address + test [operand_size],not 8 + jnz invalid_operand_size + mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand @@ -6048,43 +6088,74 @@ movq_instruction: cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register mov [postbyte_register],al - cmp [operand_size],0 - je movq_mem_mmreg - cmp [operand_size],8 - jne invalid_operand_size - movq_mem_mmreg: mov [base_code],0Fh + cmp ah,16 + je movq_mem_xmmreg mov [extended_code],7Fh call store_instruction jmp instruction_assembled - movq_mmreg: - cmp [operand_size],0 - jne invalid_operand + movq_mem_xmmreg: + mov [extended_code],0D6h + mov [mmx_prefix],66h + call store_mmx_instruction + jmp instruction_assembled + movq_mmreg: lods byte [esi] + call convert_mmx_register push ax lods byte [esi] cmp al,',' jne invalid_operand - call get_operand_size + mov [operand_size],0 lods byte [esi] - cmp al,'[' - jne invalid_operand + cmp al,16h + je movq_mmreg_mmreg + call get_size_operator call get_address + test [operand_size],not 8 + jnz invalid_operand_size pop ax mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],8 - jne invalid_operand_size - .store: mov [base_code],0Fh + cmp [operand_size],16 + je movq_xmmreg_mem mov [extended_code],6Fh call store_instruction jmp instruction_assembled -movntq_instruction: - call get_operand_size + movq_xmmreg_mem: + mov [extended_code],7Eh + mov [mmx_prefix],0F3h + call store_instruction + jmp instruction_assembled + movq_mmreg_mmreg: + pop bx lods byte [esi] + call convert_mmx_register + shl bl,3 + or bl,al + or bl,11000000b + cmp ah,16 + je movq_xmmreg_xmmreg + mov ax,6F0Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled + movq_xmmreg_xmmreg: + mov ax,0FF3h + stos word [edi] + mov al,07Eh + mov ah,bl + stos word [edi] + jmp instruction_assembled +movdq_instruction: + mov [mmx_prefix],al + lods byte [esi] + cmp al,16h + je movdq_mmreg + call get_size_operator cmp al,'[' jne invalid_operand call get_address @@ -6095,170 +6166,177 @@ movntq_instruction: cmp al,16h jne invalid_operand lods byte [esi] - mov [postbyte_register],al - cmp [operand_size],0 - je movntq_mem_mmreg - cmp [operand_size],8 + call convert_mmx_register + cmp ah,16 jne invalid_operand_size - movntq_mem_mmreg: + mov [postbyte_register],al mov [base_code],0Fh - mov [extended_code],0E7h - call store_instruction + mov [extended_code],7Fh + call store_mmx_instruction jmp instruction_assembled -mmx_instruction: - mov [base_code],0Fh - mov [extended_code],al - call get_operand_size - lods byte [esi] - mov [mmx_size],al - cmp al,16h - je mmx_size_ok - cmp al,1Ch - jne invalid_operand - mov al,66h - stos byte [edi] - mmx_size_ok: - cmp [operand_size],0 - jne invalid_operand + movdq_mmreg: lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size push ax lods byte [esi] cmp al,',' jne invalid_operand - mov al,[mmx_size] - cmp byte [esi],al - je mmx_mmreg_mmreg - call get_operand_size lods byte [esi] + cmp al,16h + je movdq_mmreg_mmreg + call get_size_operator cmp al,'[' jne invalid_operand call get_address pop ax mov [postbyte_register],al - cmp [operand_size],0 - je mmx_mem_size_ok - cmp [mmx_size],1Ch - je xmmreg_mem - cmp [operand_size],8 + mov [base_code],0Fh + mov [extended_code],6Fh + call store_mmx_instruction + jmp instruction_assembled + movdq_mmreg_mmreg: + pop bx + lods byte [esi] + call convert_mmx_register + cmp ah,16 jne invalid_operand_size - jmp mmx_mem_size_ok - xmmreg_mem: - cmp [operand_size],16 + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov ax,6F0Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled +movq2dq_instruction: + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 jne invalid_operand_size - mmx_mem_size_ok: - call store_instruction - cmp [extended_code],70h - je mmx_imm8 + mov bl,al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + shl bl,3 + or bl,al + or bl,11000000b + mov ax,0FF3h + stos word [edi] + mov al,0D6h + mov ah,bl + stos word [edi] + jmp instruction_assembled +movdq2q_instruction: + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov bl,al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + shl bl,3 + or bl,al + or bl,11000000b + mov ax,0FF2h + stos word [edi] + mov al,0D6h + mov ah,bl + stos word [edi] + jmp instruction_assembled + +mmx_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + push ax + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + je mmx_mmreg_mmreg + call get_size_operator + cmp al,'[' + jne invalid_operand + mmx_mmreg_mem: + call get_address + pop ax + mov [postbyte_register],al + call store_mmx_instruction jmp instruction_assembled mmx_mmreg_mmreg: - inc esi lods byte [esi] + call convert_mmx_register pop bx shl bl,3 or bl,al or bl,11000000b + call store_mmx_prefix mov ah,[extended_code] mov al,0Fh stos word [edi] mov al,bl stos byte [edi] - cmp [extended_code],70h - je mmx_imm8 - jmp instruction_assembled - mmx_imm8: - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,'(' - jne invalid_operand - call get_byte_value - stos byte [edi] - jmp instruction_assembled -mmx_32bit_instruction: - mov [base_code],0Fh - mov [extended_code],al - call get_operand_size - lods byte [esi] - cmp al,16h - jne invalid_operand - cmp [operand_size],0 - jne invalid_operand - lods byte [esi] - push ax - lods byte [esi] - cmp al,',' - jne invalid_operand - cmp byte [esi],16h - je mmx_mmreg_mmreg - call get_operand_size - lods byte [esi] - cmp al,'[' - jne invalid_operand - call get_address - pop ax - mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],4 - jne invalid_operand_size - .store: - call store_instruction jmp instruction_assembled mmx_ps_instruction: mov [base_code],0Fh mov [extended_code],al - call get_operand_size lods byte [esi] cmp al,16h jne invalid_operand - cmp [operand_size],0 - jne invalid_operand lods byte [esi] + call convert_mmx_register + call make_mmx_prefix push ax lods byte [esi] cmp al,',' jne invalid_operand - cmp byte [esi],16h - je mmx_ps_mmreg_mmreg - call get_operand_size + mov [operand_size],0 lods byte [esi] + cmp al,16h + je mmx_mmreg_mmreg + call get_size_operator cmp al,'(' je mmx_ps_mmreg_imm8 cmp al,'[' - jne invalid_operand - call get_address - pop ax - mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],8 - jne invalid_operand_size - .store: - call store_instruction - jmp instruction_assembled - mmx_ps_mmreg_mmreg: - inc esi - lods byte [esi] - pop bx - shl bl,3 - or bl,al - or bl,11000000b - mov ah,[extended_code] - mov al,0Fh - stos word [edi] - mov al,bl - stos byte [edi] - jmp instruction_assembled + je mmx_mmreg_mem + jmp invalid_operand mmx_ps_mmreg_imm8: call get_byte_value mov byte [value],al - mov al,[operand_size] - cmp al,1 - je mmx_ps_imm8_size_ok - or al,al - jnz invalid_operand_size - mmx_ps_imm8_size_ok: + test [operand_size],not 1 + jnz invalid_value mov al,[extended_code] mov ah,al shr al,4 @@ -6271,6 +6349,7 @@ mmx_ps_instruction: shl al,3 or bl,al or bl,11000000b + call store_mmx_prefix mov ah,[extended_code] mov al,0Fh stos word [edi] @@ -6279,60 +6358,204 @@ mmx_ps_instruction: mov al,byte [value] stos byte [edi] jmp instruction_assembled -sse_pd_instruction: - mov byte [edi],66h - inc edi -sse_ps_instruction: - mov [base_code],0Fh - mov [mmx_size],16 - jmp sse_instruction -sse_sd_instruction: - mov byte [edi],66h - inc edi - mov [base_code],0F3h - mov [mmx_size],8 - jmp sse_instruction -sse_ss_instruction: - mov [base_code],0F3h - mov [mmx_size],4 - jmp sse_instruction -comisd_instruction: - mov byte [edi],66h - inc edi - mov [base_code],0Fh - mov [mmx_size],8 - jmp sse_instruction -comiss_instruction: - mov [base_code],0Fh - mov [mmx_size],4 - sse_instruction: +pmovmskb_instruction: mov [extended_code],al lods byte [esi] - cmp al,1Ch + cmp al,10h jne invalid_operand - sse_xmmreg: lods byte [esi] - push ax - sse_reg: + call convert_register + cmp ah,4 + jnz invalid_operand_size + mov bl,al + mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand - cmp byte [esi],1Ch - je sse_xmmreg_xmmreg - call get_operand_size lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov al,0Fh + mov ah,[extended_code] + stos word [edi] + mov al,bl + stos byte [edi] + cmp [extended_code],0C5h + jne instruction_assembled + mmx_imm8: + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + test ah,not 1 + jnz invalid_operand_size + cmp al,'(' + jne invalid_operand + call get_byte_value + stos byte [edi] + jmp instruction_assembled +pinsrw_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + je pinsrw_mmreg_reg + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + je pinsrw_store + cmp [operand_size],2 + jne invalid_operand_size + pinsrw_store: + call store_mmx_instruction + jmp mmx_imm8 + pinsrw_mmreg_reg: + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov bl,[postbyte_register] + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov al,0Fh + mov ah,[extended_code] + stos word [edi] + mov al,bl + stos byte [edi] + jmp mmx_imm8 +pshufw_instruction: + mov [mmx_size],8 + mov [mmx_prefix],al + jmp pshuf_instruction +pshufd_instruction: + mov [mmx_size],16 + mov [mmx_prefix],al + pshuf_instruction: + mov [base_code],0Fh + mov [extended_code],70h + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,[mmx_size] + jne invalid_operand_size + push ax + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + je pshufw_mmreg_mmreg + call get_size_operator cmp al,'[' jne invalid_operand call get_address pop ax mov [postbyte_register],al + call store_mmx_instruction + jmp mmx_imm8 + pshufw_mmreg_mmreg: + lods byte [esi] + call convert_mmx_register + pop bx + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov ah,[extended_code] + mov al,0Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp mmx_imm8 + +sse_ps_instruction: + mov [mmx_size],16 + mov [mmx_prefix],0 + jmp sse_instruction +sse_pd_instruction: + mov [mmx_size],16 + mov [mmx_prefix],66h + jmp sse_instruction +sse_ss_instruction: + mov [mmx_size],4 + mov [mmx_prefix],0F3h + jmp sse_instruction +sse_sd_instruction: + mov [mmx_size],8 + mov [mmx_prefix],0F2h + jmp sse_instruction +comiss_instruction: + mov [mmx_size],4 + mov [mmx_prefix],0 + jmp sse_instruction +comisd_instruction: + mov [mmx_size],8 + mov [mmx_prefix],66h + jmp sse_instruction +cvtpd2dq_instruction: + mov [mmx_size],16 + mov [mmx_prefix],0F2h + jmp sse_instruction +cvtdq2pd_instruction: + mov [mmx_size],16 + mov [mmx_prefix],0F3h +sse_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + cmp al,16h + jne invalid_operand + sse_xmmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + sse_reg: + push ax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + je sse_xmmreg_xmmreg + call get_size_operator + call get_address + pop ax + mov [postbyte_register],al cmp [operand_size],0 - je .store + je sse_mem_size_ok mov al,[mmx_size] cmp [operand_size],al jne invalid_operand_size - .store: - call store_instruction + sse_mem_size_ok: + call store_mmx_instruction cmp [extended_code],0C6h je mmx_imm8 jmp instruction_assembled @@ -6342,139 +6565,54 @@ comiss_instruction: cmp [extended_code],16h je invalid_operand sse_xmmreg_xmmreg_ok: - inc esi lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size pop bx shl bl,3 or bl,al or bl,11000000b - mov al,[base_code] - cmp al,0F3h - jne .store - stos byte [edi] - .store: - mov ah,[extended_code] + call store_mmx_prefix mov al,0Fh + mov ah,[extended_code] stos word [edi] mov al,bl stos byte [edi] cmp [extended_code],0C6h - je mmx_imm8 - jmp instruction_assembled -cvtpi2ps_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - cmp al,1Ch - jne invalid_operand - lods byte [esi] - push ax - lods byte [esi] - cmp al,',' - jne invalid_operand - cmp byte [esi],16h - je cvtpi2ps_xmmreg_mmreg - call get_operand_size - lods byte [esi] - cmp al,'[' - jne invalid_operand - call get_address - pop ax - mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],8 - jne invalid_operand_size - .store: - call store_instruction - jmp instruction_assembled - cvtpi2ps_xmmreg_mmreg: - inc esi - lods byte [esi] - pop bx - shl bl,3 - or bl,al - or bl,11000000b - mov ah,[extended_code] - mov al,0Fh - stos word [edi] - mov al,bl - stos byte [edi] - jmp instruction_assembled -cvtsi2ss_instruction: - mov [base_code],0F3h - mov [extended_code],al - lods byte [esi] - cmp al,1Ch - jne invalid_operand - lods byte [esi] - push ax - lods byte [esi] - cmp al,',' - jne invalid_operand - cmp byte [esi],10h - je cvtsi2ss_xmmreg_reg - call get_operand_size - lods byte [esi] - cmp al,'[' - jne invalid_operand - call get_address - pop ax - mov [postbyte_register],al - cmp [operand_size],0 - je .store - cmp [operand_size],4 - jne invalid_operand_size - .store: - call store_instruction - jmp instruction_assembled - cvtsi2ss_xmmreg_reg: - inc esi - lods byte [esi] - call convert_register - cmp [operand_size],4 - jne invalid_operand_size - pop bx - shl bl,3 - or bl,al - or bl,11000000b - mov ax,0FF3h - stos word [edi] - mov al,[extended_code] - mov ah,bl - stos word [edi] - jmp instruction_assembled -cvtps2pi_instruction: - mov [base_code],0Fh - mov [mmx_size],8 - mov [extended_code],al - call get_operand_size + jne instruction_assembled +ps_dq_instruction: + mov bl,al lods byte [esi] cmp al,16h jne invalid_operand - jmp sse_xmmreg -cvtss2si_instruction: - mov [base_code],0F3h - mov [mmx_size],4 - mov [extended_code],al - call get_operand_size lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp [operand_size],4 + call convert_mmx_register + cmp ah,16 jne invalid_operand_size - push ax - jmp sse_reg -movupd_instruction: - mov al,66h - stos byte [edi] -movups_instruction: + shl bl,3 + or bl,al + or bl,11000000b + mov ax,0F66h + stos word [edi] + mov ah,bl + mov al,73h + stos word [edi] + jmp mmx_imm8 +movps_instruction: + mov [mmx_prefix],0 + jmp sse_movp +movpd_instruction: + mov [mmx_prefix],66h + sse_movp: mov [base_code],0Fh - mov [extended_code],10h + mov [extended_code],al mov [mmx_size],16 jmp sse_mov_instruction +movss_instruction: + mov [mmx_size],4 + mov [mmx_prefix],0F3h + jmp sse_movs movsd_instruction: mov al,0A5h mov ah,[esi] @@ -6486,109 +6624,131 @@ movsd_instruction: je simple_instruction_32bit mov al,66h stos byte [edi] - mov [base_code],0F3h - mov [extended_code],10h mov [mmx_size],8 - jmp sse_mov_instruction -movss_instruction: - mov [base_code],0F3h - mov [extended_code],10h - mov [mmx_size],4 - jmp sse_mov_instruction -movapd_instruction: - mov al,66h - stos byte [edi] -movaps_instruction: + mov [mmx_prefix],0F2h + sse_movs: mov [base_code],0Fh - mov [extended_code],28h - mov [mmx_size],16 + mov [extended_code],10h jmp sse_mov_instruction -movlpd_instruction: - mov al,66h - stos byte [edi] - ;??????????? movlps_instruction: + mov [mmx_prefix],0 + jmp sse_movlp +movlpd_instruction: + mov [mmx_prefix],66h + sse_movlp: mov [base_code],0Fh mov [extended_code],al mov [mmx_size],8 jmp sse_mov_instruction - sse_mov_instruction: - call get_operand_size +sse_mov_instruction: lods byte [esi] - cmp al,1Ch + cmp al,16h je sse_xmmreg + call get_size_operator cmp al,'[' jne invalid_operand inc [extended_code] - sse_mem: call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,1Ch - jne invalid_operand - lods byte [esi] - mov [postbyte_register],al cmp [operand_size],0 je sse_mem_xmmreg mov al,[mmx_size] cmp [operand_size],al jne invalid_operand_size + mov [operand_size],0 sse_mem_xmmreg: - call store_instruction - jmp instruction_assembled -movntpd_instruction: - mov byte [edi],66h - inc edi -movntps_instruction: - mov [base_code],0Fh - mov [extended_code],al - mov [mmx_size],16 - call get_operand_size lods byte [esi] - cmp al,'[' + cmp al,',' jne invalid_operand - jmp sse_mem -movhlpd_instruction: - mov byte [edi],66h - inc edi + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + call store_mmx_instruction + jmp instruction_assembled movhlps_instruction: mov [base_code],0Fh mov [extended_code],al mov [mmx_size],0 - call get_operand_size + mov [mmx_prefix],0 lods byte [esi] - cmp al,1Ch - jne invalid_operand - cmp [operand_size],0 + cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size push ax lods byte [esi] cmp al,',' jne invalid_operand - cmp byte [esi],1Ch + lods byte [esi] + cmp al,16h je sse_xmmreg_xmmreg_ok jmp invalid_operand -cmppd_instruction: - mov byte [edi],66h - inc edi +movmskps_instruction: + mov [mmx_prefix],0 + jmp sse_movmsk +movmskpd_instruction: + mov [mmx_prefix],66h + sse_movmsk: + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov [operand_size],0 + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov ax,500Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled cmpps_instruction: + mov [mmx_prefix],0 + jmp cmppx_instruction +cmppd_instruction: + mov [mmx_prefix],66h + cmppx_instruction: mov [base_code],0Fh mov [extended_code],0C2h mov [mmx_size],16 mov [nextbyte],-1 jmp sse_cmp_instruction -cmp_pd_instruction: - mov byte [edi],66h - inc edi cmp_ps_instruction: + mov [mmx_prefix],0 + jmp cmp_px_instruction +cmp_pd_instruction: + mov [mmx_prefix],66h + cmp_px_instruction: mov [base_code],0Fh mov [extended_code],0C2h mov [mmx_size],16 mov [nextbyte],al jmp sse_cmp_instruction +cmpss_instruction: + mov [mmx_size],4 + mov [mmx_prefix],0F3h + jmp cmpsx_instruction cmpsd_instruction: mov al,0A7h mov ah,[esi] @@ -6598,68 +6758,65 @@ cmpsd_instruction: je simple_instruction_32bit cmp ah,81h je simple_instruction_32bit - mov [base_code],0F3h - mov [extended_code],0C2h mov [mmx_size],8 - mov [nextbyte],-1 - mov al,66h - stos byte [edi] - jmp sse_cmp_instruction -cmpss_instruction: - mov [base_code],0F3h + mov [mmx_prefix],0F2h + cmpsx_instruction: + mov [base_code],0Fh mov [extended_code],0C2h - mov [mmx_size],4 mov [nextbyte],-1 jmp sse_cmp_instruction -cmp_sd_instruction: - mov [base_code],0F3h - mov [extended_code],0C2h - mov [mmx_size],8 - mov [nextbyte],al - mov al,66h - stos byte [edi] - jmp sse_cmp_instruction cmp_ss_instruction: - mov [base_code],0F3h - mov [extended_code],0C2h mov [mmx_size],4 + mov [mmx_prefix],0F3h + jmp cmp_sx_instruction +cmp_sd_instruction: + mov [mmx_size],8 + mov [mmx_prefix],0F2h + cmp_sx_instruction: + mov [base_code],0Fh + mov [extended_code],0C2h mov [nextbyte],al - sse_cmp_instruction: - call get_operand_size +sse_cmp_instruction: lods byte [esi] - cmp al,1Ch - jne invalid_operand - cmp [operand_size],0 + cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size push ax lods byte [esi] cmp al,',' jne invalid_operand - cmp byte [esi],1Ch - je sse_cmp_xmmreg_xmmreg - call get_operand_size lods byte [esi] + cmp al,16h + je sse_cmp_xmmreg_xmmreg + call get_size_operator cmp al,'[' jne invalid_operand + mov [operand_size],0 call get_address pop ax mov [postbyte_register],al cmp [operand_size],0 - je .store + je sse_cmp_xmmreg_mem_store mov al,[mmx_size] cmp [operand_size],al jne invalid_operand_size - .store: - call store_instruction + sse_cmp_xmmreg_mem_store: + call store_mmx_instruction sse_cmp_nextbyte: mov al,[nextbyte] cmp al,-1 jne nextbyte_ok + mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] + call get_size_operator + test [operand_size],not 1 + jnz invalid_value cmp al,'(' jne invalid_operand call get_byte_value @@ -6669,54 +6826,187 @@ cmp_ss_instruction: stos byte [edi] jmp instruction_assembled sse_cmp_xmmreg_xmmreg: - inc esi lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size pop bx shl bl,3 or bl,al or bl,11000000b - mov al,[base_code] - cmp al,0F3h - jne .store - stos byte [edi] - .store: + call store_mmx_prefix mov ah,[extended_code] mov al,0Fh stos word [edi] mov al,bl stos byte [edi] jmp sse_cmp_nextbyte +cvtpi2ps_instruction: + mov [mmx_prefix],0 + jmp cvtpi_instruction +cvtpi2pd_instruction: + mov [mmx_prefix],66h + cvtpi_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + push ax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + je cvtpi_xmmreg_xmmreg + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + pop ax + mov [postbyte_register],al + cmp [operand_size],0 + je cvtpi_size_ok + cmp [operand_size],8 + jne invalid_operand_size + cvtpi_size_ok: + call store_mmx_instruction + jmp instruction_assembled + cvtpi_xmmreg_xmmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + pop bx + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov ah,[extended_code] + mov al,0Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled +cvtsi2ss_instruction: + mov [mmx_prefix],0F3h + jmp cvtsi_instruction +cvtsi2sd_instruction: + mov [mmx_prefix],0F2h + cvtsi_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + push ax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + je cvtsi_xmmreg_reg + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + pop ax + mov [postbyte_register],al + cmp [operand_size],0 + je cvtsi_size_ok + cmp [operand_size],4 + jne invalid_operand_size + cvtsi_size_ok: + call store_mmx_instruction + jmp instruction_assembled + cvtsi_xmmreg_reg: + lods byte [esi] + call convert_register + cmp [operand_size],4 + jne invalid_operand_size + pop bx + shl bl,3 + or bl,al + or bl,11000000b + call store_mmx_prefix + mov al,0Fh + mov ah,[extended_code] + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled +cvtps2pi_instruction: + mov [mmx_prefix],0 + jmp cvtpd_instruction +cvtpd2pi_instruction: + mov [mmx_prefix],66h + cvtpd_instruction: + mov [base_code],0Fh + mov [extended_code],al + mov [mmx_size],8 + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov [operand_size],0 + jmp sse_reg +cvtss2si_instruction: + mov [mmx_prefix],0F3h + jmp cvt2si_instruction +cvtsd2si_instruction: + mov [mmx_prefix],0F2h + cvt2si_instruction: + mov [extended_code],al + mov [base_code],0Fh + mov [mmx_size],4 + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov [operand_size],0 + jmp sse_reg + fxsave_instruction: mov [extended_code],0AEh extended_mem: mov [base_code],0Fh mov [postbyte_register],al - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'[' jne invalid_operand + cmp ah,0 + je fxsave_size_ok + cmp ah,4 + jne invalid_operand_size + mov al,[postbyte_register] + cmp al,10b + jb invalid_operand_size + cmp al,11b + ja invalid_operand_size + fxsave_size_ok: call get_address call store_instruction jmp instruction_assembled prefetch_instruction: mov [extended_code],18h jmp extended_mem -ldmxcsr_instruction: - mov [extended_code],0AEh - mov [base_code],0Fh - mov [postbyte_register],al - call get_operand_size - lods byte [esi] - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - je .store - cmp [operand_size],4 - jne invalid_operand_size - .store: - call store_instruction - jmp instruction_assembled fence_instruction: mov bl,al mov ax,0AE0Fh @@ -6729,10 +7019,20 @@ pause_instruction: stos word [edi] jmp instruction_assembled maskmovq_instruction: + mov cl,8 + mov [mmx_prefix],0 + jmp maskmov_instruction +maskmovdqu_instruction: + mov cl,16 + mov [mmx_prefix],66h + maskmov_instruction: lods byte [esi] cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register + cmp ah,cl + jne invalid_operand_size push ax lods byte [esi] cmp al,',' @@ -6741,141 +7041,75 @@ maskmovq_instruction: cmp al,16h jne invalid_operand lods byte [esi] + call convert_mmx_register pop bx shl bl,3 or bl,al or bl,11000000b + call store_mmx_prefix mov ax,0F70Fh stos word [edi] mov al,bl stos byte [edi] jmp instruction_assembled -movmskpd_instruction: - mov al,66h - stos byte [edi] -movmskps_instruction: - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp [operand_size],4 - jne invalid_operand_size - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,1Ch - jne invalid_operand - lods byte [esi] - shl bl,3 - or bl,al - or bl,11000000b - mov ax,500Fh - stos word [edi] - mov al,bl - stos byte [edi] - jmp instruction_assembled -pmovmskb_instruction: +movntq_instruction: mov [extended_code],al - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp [operand_size],4 - jne invalid_operand_size - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,16h - je pmovmskb_size_ok - cmp al,1Ch - jne invalid_operand - mov al,66h - stos byte [edi] - pmovmskb_size_ok: - lods byte [esi] - shl bl,3 - or bl,al - or bl,11000000b - mov al,0Fh - mov ah,[extended_code] - stos word [edi] - mov al,bl - stos byte [edi] - cmp [extended_code],0C5h - je mmx_imm8 - jmp instruction_assembled -pinsrw_instruction: + mov [mmx_prefix],0 + jmp movnt_instruction +movntdq_instruction: mov [extended_code],al + mov [mmx_prefix],66h + movnt_instruction: mov [base_code],0Fh + cmp [extended_code],0E7h lods byte [esi] - cmp al,16h - jne invalid_operand - lods byte [esi] - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - call get_operand_size - lods byte [esi] - cmp al,10h - je pinsrw_mmreg_reg + call get_size_operator cmp al,'[' jne invalid_operand call get_address - cmp [operand_size],0 - je .store - cmp [operand_size],2 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,16h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + jne movnt_128bit + cmp [mmx_prefix],0 + jne movnt_128bit + cmp ah,8 + je movnt_store + jmp invalid_operand_size + movnt_128bit: + cmp ah,16 jne invalid_operand_size - .store: - call store_instruction - jmp mmx_imm8 - pinsrw_mmreg_reg: + movnt_store: + mov [postbyte_register],al + call store_mmx_instruction + jmp instruction_assembled +movnti_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand lods byte [esi] call convert_register - cmp [operand_size],4 + cmp ah,4 jne invalid_operand_size - mov bl,[postbyte_register] - shl bl,3 - or bl,al - or bl,11000000b - mov al,0Fh - mov ah,[extended_code] - stos word [edi] - mov al,bl - stos byte [edi] - jmp mmx_imm8 + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled -get_operand_size: - cmp byte [esi],11h - jne operand_size_ok - lods word [esi] - xchg [operand_size],ah - mov [forced_size],1 - or ah,ah - jz forced_ok - cmp ah,[operand_size] - jne operand_sizes_do_not_match - jmp forced_ok - operand_size_ok: - cmp byte [esi],'[' - jne forced_ok - mov [forced_size],0 - forced_ok: - ret -get_jump_operator: - mov [jump_type],0 - cmp byte [esi],12h - jne jump_operator_ok - lods word [esi] - mov [jump_type],ah - jump_operator_ok: - ret convert_register: cmp al,60h jae invalid_operand @@ -6884,13 +7118,51 @@ convert_register: and al,111b cmp ah,4 ja invalid_operand - xchg ah,[operand_size] - or ah,ah - jz register_size_ok + match_register_size: cmp ah,[operand_size] + je register_size_ok + cmp [operand_size],0 jne operand_sizes_do_not_match + mov [operand_size],ah register_size_ok: ret +convert_mmx_register: + test al,10h + jnz xmm_register + mov ah,8 + jmp match_register_size + xmm_register: + and al,0Fh + mov ah,16 + jmp match_register_size +get_size_operator: + xor ah,ah + cmp al,11h + jne operand_size_ok + lods word [esi] + xchg al,ah + mov [forced_size],1 + cmp ah,[operand_size] + je forced_ok + cmp [operand_size],0 + jne operand_sizes_do_not_match + mov [operand_size],ah + forced_ok: + ret + operand_size_ok: + cmp al,'[' + jne forced_ok + mov [forced_size],0 + ret +get_jump_operator: + mov [jump_type],0 + cmp al,12h + jne jump_operator_ok + lods word [esi] + mov [jump_type],al + mov al,ah + jump_operator_ok: + ret operand_16bit_prefix: cmp [code_type],16 je size_prefix_ok @@ -6904,12 +7176,37 @@ operand_32bit_prefix: stos byte [edi] size_prefix_ok: ret +store_segment_prefix_if_necessary: + mov al,[segment_register] + or al,al + jz segment_prefix_ok + cmp al,3 + je ss_prefix + cmp al,4 + ja segment_prefix_386 + jb segment_prefix + cmp bh,25h + je segment_prefix + cmp bh,45h + je segment_prefix + cmp bh,44h + je segment_prefix + ret + ss_prefix: + cmp bh,25h + je segment_prefix_ok + cmp bh,45h + je segment_prefix_ok + cmp bh,44h + je segment_prefix_ok + jmp segment_prefix store_segment_prefix: mov al,[segment_register] or al,al jz segment_prefix_ok cmp al,5 jae segment_prefix_386 + segment_prefix: dec al shl al,3 add al,26h @@ -6920,8 +7217,20 @@ store_segment_prefix: stos byte [edi] segment_prefix_ok: ret -store_instruction: +store_mmx_prefix: + mov al,[mmx_prefix] + or al,al + jz mmx_prefix_ok + stos byte [edi] + mmx_prefix_ok: + ret +store_mmx_instruction: call store_segment_prefix + call store_mmx_prefix + jmp store_instruction_main +store_instruction: + call store_segment_prefix_if_necessary + store_instruction_main: or bx,bx jz address_immediate mov al,bl @@ -7214,8 +7523,6 @@ store_instruction: store_instruction_code: mov al,[base_code] stos byte [edi] - cmp al,0F3h - je sse_code cmp al,0Fh jne instruction_code_ok store_extended_code: @@ -7223,10 +7530,6 @@ store_instruction: stos byte [edi] instruction_code_ok: ret - sse_code: - mov al,0Fh - stos byte [edi] - jmp store_extended_code address_16bit_prefix: cmp [code_type],16 je instruction_prefix_ok @@ -7250,6 +7553,7 @@ next_pass_needed db ? home_line dd ? current_line dd ? org_start dd ? +org_sib dd ? undefined_data_start dd ? undefined_data_end dd ? virtual_mode db ? @@ -7276,4 +7580,5 @@ operand_size db ? imm_sized db ? jump_type db ? mmx_size db ? +mmx_prefix db ? nextbyte db ? diff --git a/SOURCE/EXPRESSI.INC b/SOURCE/EXPRESSI.INC index 6281673..0835123 100644 --- a/SOURCE/EXPRESSI.INC +++ b/SOURCE/EXPRESSI.INC @@ -743,11 +743,11 @@ calculate_expression: je expression_calculated cmp al,']' je expression_calculated - sub edi,20h + sub edi,10h mov ebx,edi - sub ebx,20h - mov dx,[ebx+24] - or dx,[edi+24] + sub ebx,10h + mov dx,[ebx+8] + or dx,[edi+8] cmp al,0E0h je calculate_rva cmp al,0D0h @@ -758,8 +758,8 @@ calculate_expression: je calculate_add cmp al,81h je calculate_sub - mov ah,[ebx+26] - or ah,[edi+26] + mov ah,[ebx+12] + or ah,[edi+12] jnz invalid_use_of_symbol cmp al,90h je calculate_mul @@ -781,70 +781,67 @@ calculate_expression: je calculate_shr jmp invalid_expression expression_calculated: - sub edi,20h + sub edi,10h ret get_byte_number: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 xor eax,eax lods byte [esi] stos dword [edi] xor al,al stos dword [edi] - add edi,18h + add edi,8 jmp calculate_expression get_word_number: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 xor eax,eax lods word [esi] stos dword [edi] xor ax,ax stos dword [edi] - add edi,18h + add edi,8 jmp calculate_expression get_dword_number: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 movs dword [edi],[esi] xor eax,eax stos dword [edi] - add edi,18h + add edi,8 jmp calculate_expression get_qword_number: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 movs dword [edi],[esi] movs dword [edi],[esi] - add edi,18h + add edi,8 jmp calculate_expression get_register: - mov byte [edi+25],0 - mov byte [edi+26],0 + mov byte [edi+9],0 + mov byte [edi+12],0 lods byte [esi] - mov [edi+24],al + mov [edi+8],al + mov byte [edi+10],1 xor eax,eax stos dword [edi] stos dword [edi] - mov al,1 - stos dword [edi] - xor al,al - stos dword [edi] - add edi,10h + add edi,8 jmp calculate_expression get_label: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 lods dword [esi] or eax,eax jz current_offset_label cmp eax,1 je counter_label mov ebx,eax - cmp byte [ebx+8],0 - je label_undefined - cmp byte [ebx+13],0 - je label_defined + test byte [ebx+8],1 + jz label_undefined + test byte [ebx+8],4 + jz label_defined mov al,[current_pass] cmp al,[ebx+9] jne label_undefined @@ -856,12 +853,14 @@ calculate_expression: jne label_type_ok xor al,al label_type_ok: - mov [edi+26],al + mov [edi+12],al + mov eax,[ebx+12] + mov [edi+8],eax mov eax,[ebx] stos dword [edi] mov eax,[ebx+4] stos dword [edi] - add edi,18h + add edi,8 mov al,[ebx+10] or al,al jz calculate_expression @@ -883,43 +882,45 @@ calculate_expression: current_offset_label: cmp [reloc_labels],0 je get_current_offset - mov byte [edi+26],2 + mov byte [edi+12],2 get_current_offset: mov eax,[current_offset] sub eax,[org_start] + cdq stos dword [edi] - xor eax,eax + mov eax,edx stos dword [edi] - add edi,18h + mov eax,[org_sib] + stos dword [edi] + add edi,4 jmp calculate_expression counter_label: mov eax,[counter] stos dword [edi] xor eax,eax stos dword [edi] - add edi,18h + add edi,8 jmp calculate_expression label_undefined: cmp [current_pass],0 jne invalid_value mov [next_pass_needed],1 - mov byte [edi+26],0 + mov byte [edi+12],0 xor eax,eax stos dword [edi] stos dword [edi] - add edi,18h + add edi,8 jmp calculate_expression calculate_add: cmp [next_pass_needed],0 jne add_values - cmp byte [edi+26],0 + cmp byte [edi+12],0 je add_values - cmp byte [ebx+26],0 - je add_values - jmp invalid_use_of_symbol + cmp byte [ebx+12],0 + jne invalid_use_of_symbol add_values: - mov al,[edi+26] - or [ebx+26],al + mov al,[edi+12] + or [ebx+12],al mov eax,[edi] add [ebx],eax mov eax,[edi+4] @@ -928,11 +929,11 @@ calculate_expression: jz calculate_expression push esi mov esi,ebx - lea ebx,[edi+8] - mov cl,[edi+24] + lea ebx,[edi+10] + mov cl,[edi+8] call add_register - lea ebx,[edi+16] - mov cl,[edi+25] + lea ebx,[edi+11] + mov cl,[edi+9] call add_register pop esi jmp calculate_expression @@ -940,61 +941,49 @@ calculate_expression: or cl,cl jz add_register_done add_register_start: - cmp [esi+24],cl + cmp [esi+8],cl jne add_in_second_slot - mov eax,[ebx] - add [esi+8],eax - mov eax,[ebx+4] - adc [esi+8+4],eax - mov eax,[esi+8] - or eax,[esi+8+4] + mov al,[ebx] + add [esi+10],al jnz add_register_done - mov byte [esi+24],0 + mov byte [esi+8],0 ret add_in_second_slot: - cmp [esi+25],cl + cmp [esi+9],cl jne create_in_first_slot - mov eax,[ebx] - add [esi+16],eax - mov eax,[ebx+4] - adc [esi+16+4],eax - mov eax,[esi+16] - or eax,[esi+16+4] + mov al,[ebx] + add [esi+11],al jnz add_register_done - mov byte [esi+25],0 + mov byte [esi+9],0 ret create_in_first_slot: - cmp byte [esi+24],0 + cmp byte [esi+8],0 jne create_in_second_slot - mov [esi+24],cl - mov eax,[ebx] - mov [esi+8],eax - mov eax,[ebx+4] - mov [esi+8+4],eax + mov [esi+8],cl + mov al,[ebx] + mov [esi+10],al ret create_in_second_slot: - cmp byte [esi+25],0 + cmp byte [esi+9],0 jne invalid_expression - mov [esi+25],cl - mov eax,[ebx] - mov [esi+16],eax - mov eax,[ebx+4] - mov [esi+16+4],eax + mov [esi+9],cl + mov al,[ebx] + mov [esi+11],al add_register_done: ret calculate_sub: xor ah,ah cmp [next_pass_needed],0 jne sub_values - mov ah,[ebx+26] - mov al,[edi+26] + mov ah,[ebx+12] + mov al,[edi+12] or al,al jz sub_values cmp al,ah jne invalid_use_of_symbol xor ah,ah sub_values: - mov byte [ebx+26],ah + mov byte [ebx+12],ah mov eax,[edi] sub [ebx],eax mov eax,[edi+4] @@ -1003,26 +992,23 @@ calculate_expression: jz calculate_expression push esi mov esi,ebx - lea ebx,[edi+8] - mov cl,[edi+24] + lea ebx,[edi+10] + mov cl,[edi+8] call sub_register - lea ebx,[edi+16] - mov cl,[edi+25] + lea ebx,[edi+11] + mov cl,[edi+9] call sub_register pop esi jmp calculate_expression sub_register: or cl,cl jz add_register_done - not dword [ebx] - not dword [ebx+4] - add dword [ebx],1 - adc dword [ebx+4],0 + neg byte [ebx] jmp add_register_start calculate_mul: or dx,dx jz mul_start - cmp word [ebx+24],0 + cmp word [ebx+8],0 jne mul_start mov eax,[ebx] xchg eax,[edi] @@ -1033,39 +1019,96 @@ calculate_expression: mov eax,[ebx+8] xchg eax,[edi+8] mov [ebx+8],eax - mov eax,[ebx+8+4] - xchg eax,[edi+8+4] - mov [ebx+8+4],eax - mov eax,[ebx+16] - xchg eax,[edi+16] - mov [ebx+16],eax - mov eax,[ebx+16+4] - xchg eax,[edi+16+4] - mov [ebx+16+4],eax - mov ax,[ebx+24] - xchg ax,[edi+24] - mov [ebx+24],ax + mov eax,[ebx+12] + xchg eax,[edi+12] + mov [ebx+12],eax mul_start: push esi dx mov esi,ebx - call mul_64 + xor bl,bl + test dword [esi+4],1 shl 31 + jz mul_first_sign_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + not bl + mul_first_sign_ok: + test dword [edi+4],1 shl 31 + jz mul_second_sign_ok + not dword [edi] + not dword [edi+4] + add dword [edi],1 + adc dword [edi+4],0 + not bl + mul_second_sign_ok: + cmp dword [esi+4],0 + jz mul_numbers + cmp dword [edi+4],0 + jnz value_out_of_range + mul_numbers: + mov eax,[esi+4] + mul dword [edi] + or edx,edx + jnz value_out_of_range + mov ecx,eax + mov eax,[esi] + mul dword [edi+4] + or edx,edx + jnz value_out_of_range + add ecx,eax jc value_out_of_range + mov eax,[esi] + mul dword [edi] + add edx,ecx + jc value_out_of_range + mov [esi],eax + mov [esi+4],edx + or bl,bl + jz mul_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + mul_ok: pop dx or dx,dx jz mul_calculated - cmp word [edi+24],0 + cmp word [edi+8],0 jne invalid_value - add esi,8 - cmp byte [esi+16],0 + cmp byte [esi+8],0 je mul_first_register_ok - call mul_64 - jc value_out_of_range + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + imul byte [esi+10] + mov dl,ah + cbw + cmp ah,dl + jne value_out_of_range + mov [esi+10],al mul_first_register_ok: - add esi,8 cmp byte [esi+9],0 je mul_calculated - call mul_64 - jc value_out_of_range + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + imul byte [esi+11] + mov dl,ah + cbw + cmp ah,dl + jne value_out_of_range + mov [esi+11],al mul_calculated: pop esi jmp calculate_expression @@ -1076,19 +1119,39 @@ calculate_expression: pop dx or dx,dx jz div_calculated - add esi,8 - cmp byte [esi+16],0 + cmp byte [esi+8],0 je div_first_register_ok - call div_64 - or eax,edx - jnz invalid_value + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + or al,al + jz value_out_of_range + mov al,[esi+10] + cbw + idiv byte [edi] + mov [esi+10],al div_first_register_ok: - add esi,8 cmp byte [esi+9],0 je div_calculated - call div_64 - or eax,edx - jnz invalid_value + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + or al,al + jz value_out_of_range + mov al,[esi+11] + cbw + idiv byte [edi] + mov [esi+11],al div_calculated: pop esi jmp calculate_expression @@ -1225,9 +1288,9 @@ calculate_expression: mov dword [ebx+4],0 jmp calculate_expression calculate_not: - cmp word [edi+24],0 + cmp word [edi+8],0 jne invalid_expression - cmp byte [edi+26],0 + cmp byte [edi+12],0 jne invalid_use_of_symbol cmp [value_size],1 je not_byte @@ -1240,7 +1303,7 @@ calculate_expression: not_qword: not dword [edi] not dword [edi+4] - add edi,20h + add edi,10h jmp calculate_expression not_byte: cmp dword [edi+4],0 @@ -1250,7 +1313,7 @@ calculate_expression: cmp byte [edi+1],0 jne not_qword not byte [edi] - add edi,20h + add edi,10h jmp calculate_expression not_word: cmp dword [edi+4],0 @@ -1258,25 +1321,25 @@ calculate_expression: cmp word [edi+2],0 jne not_qword not word [edi] - add edi,20h + add edi,10h jmp calculate_expression not_dword: cmp dword [edi+4],0 jne not_qword not dword [edi] - add edi,20h + add edi,10h jmp calculate_expression not_pword: cmp word [edi+6],0 jne not_qword not dword [edi] not word [edi+4] - add edi,20h + add edi,10h jmp calculate_expression calculate_neg: - cmp word [edi+24],0 + cmp word [edi+8],0 jne invalid_expression - cmp byte [edi+26],0 + cmp byte [edi+12],0 jne invalid_use_of_symbol mov eax,[edi] mov edx,[edi+4] @@ -1284,12 +1347,12 @@ calculate_expression: mov dword [edi+4],0 sub [edi],eax sbb [edi+4],edx - add edi,20h + add edi,10h jmp calculate_expression calculate_rva: - cmp word [edi+24],0 + cmp word [edi+8],0 jne invalid_expression - mov al,[edi+26] + mov al,[edi+12] cmp al,2 je rva_ok or al,al @@ -1297,64 +1360,12 @@ calculate_expression: cmp [next_pass_needed],0 je invalid_use_of_symbol rva_ok: - mov byte [edi+26],0 + mov byte [edi+12],0 mov eax,[image_base] sub [edi],eax sbb dword [edi+4],0 - add edi,20h + add edi,10h jmp calculate_expression - mul_64: - xor bl,bl - test dword [esi+4],1 shl 31 - jz mul_first_sign_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - not bl - mul_first_sign_ok: - test dword [edi+4],1 shl 31 - jz mul_second_sign_ok - not dword [edi] - not dword [edi+4] - add dword [edi],1 - adc dword [edi+4],0 - not bl - mul_second_sign_ok: - cmp dword [esi+4],0 - jz mul_numbers - cmp dword [edi+4],0 - jnz mul_error - mul_numbers: - mov eax,[esi+4] - mul dword [edi] - or edx,edx - jnz mul_error - mov ecx,eax - mov eax,[esi] - mul dword [edi+4] - or edx,edx - jnz mul_error - add ecx,eax - jc mul_error - mov eax,[esi] - mul dword [edi] - add edx,ecx - jc mul_error - mov [esi],eax - mov [esi+4],edx - or bl,bl - jz mul_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - mul_ok: - clc - ret - mul_error: - stc - ret div_64: xor bl,bl cmp dword [edi],0 @@ -1430,8 +1441,8 @@ calculate_expression: div_ok: ret convert_fp: - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 mov al,[value_size] cmp al,4 je convert_fp_dword @@ -1517,8 +1528,8 @@ calculate_expression: rep movs byte [edi],[esi] mov edi,edx inc esi - mov word [edi+24],0 - mov byte [edi+26],0 + mov word [edi+8],0 + mov byte [edi+12],0 ret get_byte_value: @@ -1526,11 +1537,9 @@ get_byte_value: mov [forced_size],2 mov [current_offset],edi call calculate_expression - cmp byte [edi+24],0 + cmp word [edi+8],0 jne invalid_value - cmp byte [edi+25],0 - jne invalid_value - cmp byte [edi+26],0 + cmp byte [edi+12],0 jne invalid_use_of_symbol mov eax,[edi] cmp dword [edi+4],0 @@ -1559,11 +1568,9 @@ get_word_value: mov [forced_size],2 mov [current_offset],edi call calculate_expression - cmp byte [edi+24],0 + cmp word [edi+8],0 jne invalid_value - cmp byte [edi+25],0 - jne invalid_value - mov al,[edi+26] + mov al,[edi+12] cmp al,2 je invalid_use_of_symbol mov [value_type],al @@ -1585,11 +1592,9 @@ get_dword_value: mov [forced_size],2 mov [current_offset],edi call calculate_expression - cmp byte [edi+24],0 + cmp word [edi+8],0 jne invalid_value - cmp byte [edi+25],0 - jne invalid_value - mov al,[edi+26] + mov al,[edi+12] mov [value_type],al check_dword_value: mov eax,[edi] @@ -1606,11 +1611,9 @@ get_pword_value: mov [forced_size],2 mov [current_offset],edi call calculate_expression - cmp byte [edi+24],0 + cmp word [edi+8],0 jne invalid_value - cmp byte [edi+25],0 - jne invalid_value - mov al,[edi+26] + mov al,[edi+12] mov [value_type],al mov eax,[edi] mov edx,[edi+4] @@ -1624,11 +1627,9 @@ get_qword_value: mov [forced_size],2 mov [current_offset],edi call calculate_expression - cmp byte [edi+24],0 + cmp word [edi+8],0 jne invalid_value - cmp byte [edi+25],0 - jne invalid_value - mov al,[edi+26] + mov al,[edi+12] mov [value_type],al mov eax,[edi] mov edx,[edi+4] @@ -1636,8 +1637,8 @@ get_qword_value: get_value: mov [operand_size],0 mov [forced_size],0 - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_value mov al,[operand_size] @@ -1698,10 +1699,16 @@ get_address: ja invalid_address_size mov [address_size],al mov [value_size],al + jmp calculate_address +get_address_value: + mov [address_size],0 + mov [value_size],4 + push address_ok calculate_address: mov [current_offset],edi call calculate_expression - mov al,[edi+26] + mov al,[edi+12] + mov [value_type],al cmp al,1 je invalid_use_of_symbol or al,al @@ -1716,13 +1723,13 @@ get_address: xor bx,bx xor cl,cl mov ch,[address_size] - cmp word [edi+24],0 + cmp word [edi+8],0 je check_dword_value - mov al,[edi+24] - lea edx,[edi+8] + mov al,[edi+8] + mov dl,[edi+10] call get_address_register - mov al,[edi+25] - lea edx,[edi+16] + mov al,[edi+9] + mov dl,[edi+11] call get_address_register mov ax,bx shr ah,4 @@ -1775,9 +1782,7 @@ get_address: get_address_register: or al,al jz address_register_ok - cmp dword [edx+4],0 - jne invalid_address - cmp dword [edx],1 + cmp dl,1 jne scaled_register or bh,bh jnz scaled_register @@ -1788,9 +1793,7 @@ get_address: or bl,bl jnz invalid_address mov bl,al - mov cl,[edx] - cmp dword [edx],255 - ja invalid_address + mov cl,dl jmp address_register_ok address_ok: mov edx,eax diff --git a/SOURCE/FORMATS.INC b/SOURCE/FORMATS.INC index ebb02e7..1201d1b 100644 --- a/SOURCE/FORMATS.INC +++ b/SOURCE/FORMATS.INC @@ -226,12 +226,12 @@ mz_stack: mz_heap: cmp [output_format],2 jne unexpected_instruction - call get_operand_size - cmp [operand_size],1 - je invalid_value - cmp [operand_size],2 - ja invalid_value lods byte [esi] + call get_size_operator + cmp ah,1 + je invalid_value + cmp ah,2 + ja invalid_value cmp al,'(' jne invalid_argument call get_word_value @@ -596,12 +596,11 @@ section_directive: mov [current_data],-1 jmp instruction_assembled pe_entry: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_argument - mov al,[operand_size] - test al,not 4 + test ah,not 4 jnz invalid_address cmp byte [esi],'.' je invalid_value @@ -618,12 +617,11 @@ pe_entry: mov [entry_rva],eax jmp instruction_assembled pe_stack: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_argument - mov al,[operand_size] - test al,not 4 + test ah,not 4 jnz invalid_address cmp byte [esi],'.' je invalid_value @@ -634,12 +632,11 @@ pe_stack: cmp byte [esi],',' jne default_stack_commit lods byte [esi] - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_argument - mov al,[operand_size] - test al,not 4 + test ah,not 4 jnz invalid_address cmp byte [esi],'.' je invalid_value @@ -658,12 +655,11 @@ pe_stack: mov [stack_commit],eax jmp instruction_assembled pe_heap: - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_argument - mov al,[operand_size] - test al,not 4 + test ah,not 4 jnz invalid_address cmp byte [esi],'.' je invalid_value @@ -674,12 +670,11 @@ pe_heap: cmp byte [esi],',' jne default_heap_commit lods byte [esi] - call get_operand_size lods byte [esi] + call get_size_operator cmp al,'(' jne invalid_argument - mov al,[operand_size] - test al,not 4 + test ah,not 4 jnz invalid_address cmp byte [esi],'.' je invalid_value diff --git a/SOURCE/PARSER.INC b/SOURCE/PARSER.INC index fd28d10..465d59a 100644 --- a/SOURCE/PARSER.INC +++ b/SOURCE/PARSER.INC @@ -410,6 +410,8 @@ parse_line: jc not_symbol_argument pop edi stos word [edi] + cmp ax,13h + je at_parsed jmp argument_parsed not_symbol_argument: cmp ecx,1 @@ -498,6 +500,15 @@ parse_line: mov eax,[fp_value+8] stos dword [edi] jmp expression_parsed + at_parsed: + cmp [parenthesis_stack],0 + je at_expression + dec [parenthesis_stack] + add esp,8 + jmp at_parsed + at_expression: + mov al,'(' + stos byte [edi] expression: call convert_expression mov al,')' diff --git a/SOURCE/PREPROCE.INC b/SOURCE/PREPROCE.INC index 9f03b4d..8498faf 100644 --- a/SOURCE/PREPROCE.INC +++ b/SOURCE/PREPROCE.INC @@ -557,9 +557,9 @@ define_macro: lods byte [esi] macro_arguments_end: or al,al - jz find_macro_start + jz find_macro_block cmp al,';' - je find_macro_start + je find_macro_block cmp al,'{' je find_macro_end jmp invalid_macro_arguments @@ -572,7 +572,7 @@ define_macro: cmp al,';' je invalid_macro_arguments jmp find_macro_argument - find_macro_start: + find_macro_block: mov ebp,esp call get_macro_line jc unexpected_end_of_file @@ -580,9 +580,9 @@ define_macro: call skip_spaces lods byte [esi] or al,al - jz find_macro_start + jz find_macro_block cmp al,';' - je find_macro_start + je find_macro_block cmp al,'{' jne unexpected_characters find_macro_end: @@ -1198,6 +1198,7 @@ use_macro: lods byte [esi] cmp al,',' je local_symbols + macro_directive_processed: or al,al jz macro_directive_end cmp al,';' @@ -1216,6 +1217,15 @@ use_macro: pop esi dec edi jmp macro_process + common_block: + lods byte [esi] + cmp [multi_macro_current],0 + je macro_directive_processed + mov cx,[multi_macro_count] + cmp [multi_macro_current],cx + jb end_macro_block + mov [multi_macro_current],0 + jmp macro_directive_processed skip_string: lods byte [esi] stos byte [edi] @@ -1256,6 +1266,7 @@ use_macro: cmp al,'}' jne macro_process dec edi + end_macro_block: xor al,al stos byte [edi] mov [current_line_end],edi diff --git a/SOURCE/TABLES.INC b/SOURCE/TABLES.INC index a75c240..e36299e 100644 --- a/SOURCE/TABLES.INC +++ b/SOURCE/TABLES.INC @@ -288,6 +288,8 @@ symbols: db 2,'di',10h,27h db 11,'discardable',19h,25 db 2,'dl',10h,12h + db 2,'dq',11h,16 + db 6,'dqword',11h,16 db 3,'dr0',10h,80h db 3,'dr1',10h,81h db 3,'dr2',10h,82h @@ -364,16 +366,14 @@ symbols: db 1,'w',11h,2 db 4,'word',11h,2 db 9,'writeable',19h,31 - db 1,'x',11h,16 - db 4,'xmm0',1Ch,0 - db 4,'xmm1',1Ch,1 - db 4,'xmm2',1Ch,2 - db 4,'xmm3',1Ch,3 - db 4,'xmm4',1Ch,4 - db 4,'xmm5',1Ch,5 - db 4,'xmm6',1Ch,6 - db 4,'xmm7',1Ch,7 - db 5,'xword',11h,16 + db 4,'xmm0',16h,10h + db 4,'xmm1',16h,11h + db 4,'xmm2',16h,12h + db 4,'xmm3',16h,13h + db 4,'xmm4',16h,14h + db 4,'xmm5',16h,15h + db 4,'xmm6',16h,16h + db 4,'xmm7',16h,17h db 0 preprocessor_directives: @@ -388,6 +388,8 @@ preprocessor_directives: db 0 macro_directives: + db 6,'common' + dw common_block-preprocessor db 5,'local' dw local_symbols-preprocessor db 0 @@ -1015,6 +1017,8 @@ instructions_5: dw mmx_instruction-assembler,0FCh db 'paddd' dw mmx_instruction-assembler,0FEh + db 'paddq' + dw mmx_instruction-assembler,0D4h db 'paddw' dw mmx_instruction-assembler,0FDh db 'pandn' @@ -1053,6 +1057,8 @@ instructions_5: dw mmx_instruction-assembler,0F8h db 'psubd' dw mmx_instruction-assembler,0FAh + db 'psubq' + dw mmx_instruction-assembler,0FBh db 'psubw' dw mmx_instruction-assembler,0F9h db 'pusha' @@ -1254,9 +1260,13 @@ instructions_6: db 'mfence' dw fence_instruction-assembler,0F0h db 'movapd' - dw movapd_instruction-assembler,0 + dw movpd_instruction-assembler,28h db 'movaps' - dw movaps_instruction-assembler,0 + dw movps_instruction-assembler,28h + db 'movdqa' + dw movdq_instruction-assembler,66h + db 'movdqu' + dw movdq_instruction-assembler,0F3h db 'movhpd' dw movlpd_instruction-assembler,16h db 'movhps' @@ -1265,12 +1275,14 @@ instructions_6: dw movlpd_instruction-assembler,12h db 'movlps' dw movlps_instruction-assembler,12h + db 'movnti' + dw movnti_instruction-assembler,0C3h db 'movntq' - dw movntq_instruction-assembler,0 + dw movntq_instruction-assembler,0E7h db 'movupd' - dw movupd_instruction-assembler,0 + dw movpd_instruction-assembler,10h db 'movups' - dw movups_instruction-assembler,0 + dw movps_instruction-assembler,10h db 'paddsb' dw mmx_instruction-assembler,0ECh db 'paddsw' @@ -1293,8 +1305,14 @@ instructions_6: dw mmx_instruction-assembler,0D5h db 'psadbw' dw mmx_instruction-assembler,0F6h + db 'pshufd' + dw pshufd_instruction-assembler,66h db 'pshufw' - dw mmx_instruction-assembler,70h + dw pshufw_instruction-assembler,0 + db 'pslldq' + dw ps_dq_instruction-assembler,111b + db 'psrldq' + dw ps_dq_instruction-assembler,011b db 'psubsb' dw mmx_instruction-assembler,0E8h db 'psubsw' @@ -1329,12 +1347,16 @@ instructions_6: dw sse_pd_instruction-assembler,51h db 'sqrtps' dw sse_ps_instruction-assembler,51h + db 'sqrtsd' + dw sse_sd_instruction-assembler,51h db 'sqrtss' dw sse_ss_instruction-assembler,51h db 'wbinvd' dw simple_extended_instruction-assembler,9 db 0 instructions_7: + db 'clflush' + dw fxsave_instruction-assembler,111b db 'cmovnae' dw cmov_instruction-assembler,42h db 'cmovnbe' @@ -1410,7 +1432,7 @@ instructions_7: db 'fyl2xp1' dw simple_fpu_instruction-assembler,111001b db 'ldmxcsr' - dw ldmxcsr_instruction-assembler,10b + dw fxsave_instruction-assembler,10b db 'loopned' dw loop_instruction_32bit-assembler,0E0h db 'loopnew' @@ -1419,12 +1441,20 @@ instructions_7: dw loop_instruction_32bit-assembler,0E0h db 'loopnzw' dw loop_instruction_16bit-assembler,0E0h + db 'movdq2q' + dw movdq2q_instruction-assembler,0 db 'movhlps' dw movhlps_instruction-assembler,12h db 'movlhps' dw movhlps_instruction-assembler,16h + db 'movntdq' + dw movntdq_instruction-assembler,0E7h + db 'movntpd' + dw movntdq_instruction-assembler,2Bh db 'movntps' - dw movntps_instruction-assembler,2Bh + dw movntq_instruction-assembler,2Bh + db 'movq2dq' + dw movq2dq_instruction-assembler,0 db 'paddusb' dw mmx_instruction-assembler,0DCh db 'paddusw' @@ -1447,20 +1477,24 @@ instructions_7: dw mmx_instruction-assembler,0E4h db 'pmuludq' dw mmx_instruction-assembler,0F4h - db 'psqrtps' - dw sse_ps_instruction-assembler,52h - db 'psqrtss' - dw sse_ss_instruction-assembler,52h + db 'pshufhw' + dw pshufd_instruction-assembler,0F3h + db 'pshuflw' + dw pshufd_instruction-assembler,0F2h db 'psubusb' dw mmx_instruction-assembler,0D8h db 'psubusw' dw mmx_instruction-assembler,0D9h + db 'rsqrtps' + dw sse_ps_instruction-assembler,52h + db 'rsqrtss' + dw sse_ss_instruction-assembler,52h db 'section' dw section_directive-assembler,0 db 'segment' dw segment_directive-assembler,0 db 'stmxcsr' - dw ldmxcsr_instruction-assembler,11b + dw fxsave_instruction-assembler,11b db 'sysexit' dw simple_extended_instruction-assembler,35h db 'ucomisd' @@ -1479,12 +1513,36 @@ instructions_8: dw cmp_ps_instruction-assembler,7 db 'cmpordss' dw cmp_ss_instruction-assembler,7 + db 'cvtdq2pd' + dw cvtdq2pd_instruction-assembler,0E6h + db 'cvtdq2ps' + dw sse_ps_instruction-assembler,5Bh + db 'cvtpd2dq' + dw cvtpd2dq_instruction-assembler,0E6h + db 'cvtpd2pi' + dw cvtpd2pi_instruction-assembler,2Dh + db 'cvtpd2ps' + dw sse_pd_instruction-assembler,5Ah + db 'cvtpi2pd' + dw cvtpi2pd_instruction-assembler,2Ah db 'cvtpi2ps' dw cvtpi2ps_instruction-assembler,2Ah + db 'cvtps2dq' + dw sse_pd_instruction-assembler,5Bh + db 'cvtps2pd' + dw sse_ps_instruction-assembler,5Ah db 'cvtps2pi' dw cvtps2pi_instruction-assembler,2Dh + db 'cvtsd2si' + dw cvtsd2si_instruction-assembler,2Dh + db 'cvtsd2ss' + dw sse_sd_instruction-assembler,5Ah + db 'cvtsi2sd' + dw cvtsi2sd_instruction-assembler,2Ah db 'cvtsi2ss' dw cvtsi2ss_instruction-assembler,2Ah + db 'cvtss2sd' + dw sse_ss_instruction-assembler,5Ah db 'cvtss2si' dw cvtss2si_instruction-assembler,2Dh db 'fcmovnbe' @@ -1517,8 +1575,16 @@ instructions_8: instructions_9: db 'cmpxchg8b' dw cmpxchg8b_instruction-assembler,0 + db 'cvttpd2dq' + dw sse_pd_instruction-assembler,0E6h + db 'cvttpd2pi' + dw cvtpd2pi_instruction-assembler,2Ch + db 'cvttps2dq' + dw cvtdq2pd_instruction-assembler,5Bh db 'cvttps2pi' dw cvtps2pi_instruction-assembler,2Ch + db 'cvttsd2si' + dw cvtsd2si_instruction-assembler,2Ch db 'cvttss2si' dw cvtss2si_instruction-assembler,2Ch db 'punpckhbw' @@ -1528,11 +1594,11 @@ instructions_9: db 'punpckhwd' dw mmx_instruction-assembler,69h db 'punpcklbw' - dw mmx_32bit_instruction-assembler,60h + dw mmx_instruction-assembler,60h db 'punpckldq' - dw mmx_32bit_instruction-assembler,62h + dw mmx_instruction-assembler,62h db 'punpcklwd' - dw mmx_32bit_instruction-assembler,61h + dw mmx_instruction-assembler,61h db 0 instructions_10: db 'cmpunordps' @@ -1543,13 +1609,21 @@ instructions_10: dw simple_extended_instruction-assembler,5 db 'loadall386' dw simple_extended_instruction-assembler,7 + db 'maskmovdqu' + dw maskmovdqu_instruction-assembler,0 db 'prefetcht0' dw prefetch_instruction-assembler,1 db 'prefetcht1' dw prefetch_instruction-assembler,2 db 'prefetcht2' dw prefetch_instruction-assembler,3 + db 'punpckhqdq' + dw sse_pd_instruction-assembler,6Dh + db 'punpcklqdq' + dw sse_pd_instruction-assembler,6Ch db 0 instructions_11: db 'prefetchnta' dw prefetch_instruction-assembler,0 + + diff --git a/SOURCE/VERSION.INC b/SOURCE/VERSION.INC index e659de4..34f27b6 100644 --- a/SOURCE/VERSION.INC +++ b/SOURCE/VERSION.INC @@ -1,5 +1,5 @@ -; flat assembler version 1.14 +; flat assembler version 1.20 ; Copyright (c) 1999-2001, Tomasz Grysztar ; All rights reserved. ; @@ -33,4 +33,4 @@ ; cannot simply be copied and put under another distribution licence ; (including the GNU Public Licence). -VERSION equ "1.14" +VERSION equ "1.20" diff --git a/SOURCE/WIN32/FASMW.ASM b/SOURCE/WIN32/FASMW.ASM index 14a70f8..7e65935 100644 --- a/SOURCE/WIN32/FASMW.ASM +++ b/SOURCE/WIN32/FASMW.ASM @@ -89,6 +89,12 @@ get_params: call [GetCommandLine] mov esi,eax mov edi,params + find_command_start: + lodsb + cmp al,20h + je find_command_start + cmp al,22h + je skip_quoted_name skip_name: lodsb cmp al,20h @@ -96,6 +102,13 @@ get_params: or al,al jz all_params jmp skip_name + skip_quoted_name: + lodsb + cmp al,22h + je find_param + or al,al + jz all_params + jmp skip_quoted_name find_param: lodsb cmp al,20h diff --git a/WHATSNEW.TXT b/WHATSNEW.TXT index b2db74e..c885e89 100644 --- a/WHATSNEW.TXT +++ b/WHATSNEW.TXT @@ -2,6 +2,15 @@ Questions or comments please send to: grysztar@omega.im.uj.edu.pl +version 1.20 +[17-11-2001] +------------ +[+] full SSE2 instructions support +[+] SIB addresses allowed for virtual data +[+] common directive in macroinstructions +[-] segment prefixes only if necessary +[-] general revisions and improvements + version 1.14 [17-10-2001] ------------