0,0 → 1,7923 |
|
; flat assembler core |
; Copyright (c) 1999-2005, Tomasz Grysztar. |
; All rights reserved. |
|
simple_instruction_except64: |
cmp [code_type],64 |
je illegal_instruction |
simple_instruction: |
stos byte [edi] |
jmp instruction_assembled |
simple_instruction_only64: |
cmp [code_type],64 |
jne illegal_instruction |
jmp simple_instruction |
simple_instruction_16bit_except64: |
cmp [code_type],64 |
je illegal_instruction |
simple_instruction_16bit: |
cmp [code_type],16 |
jne size_prefix |
stos byte [edi] |
jmp instruction_assembled |
size_prefix: |
mov ah,al |
mov al,66h |
stos word [edi] |
jmp instruction_assembled |
simple_instruction_32bit_except64: |
cmp [code_type],64 |
je illegal_instruction |
simple_instruction_32bit: |
cmp [code_type],16 |
je size_prefix |
stos byte [edi] |
jmp instruction_assembled |
simple_instruction_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
mov ah,al |
mov al,48h |
stos word [edi] |
jmp instruction_assembled |
simple_extended_instruction: |
mov ah,al |
mov al,0Fh |
stos word [edi] |
jmp instruction_assembled |
prefix_instruction: |
stos byte [edi] |
or [prefixed_instruction],-1 |
jmp continue_line |
segment_prefix: |
mov ah,al |
shr ah,4 |
cmp ah,6 |
jne illegal_instruction |
and al,1111b |
mov [segment_register],al |
call store_segment_prefix |
or [prefixed_instruction],-1 |
jmp continue_line |
int_instruction: |
lods byte [esi] |
call get_size_operator |
cmp ah,1 |
ja invalid_operand_size |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
mov ah,al |
mov al,0CDh |
stos word [edi] |
jmp instruction_assembled |
iret_instruction: |
cmp [code_type],64 |
jne simple_instruction |
call operand_64bit |
jmp simple_instruction |
aa_instruction: |
cmp [code_type],64 |
je illegal_instruction |
push eax |
mov bl,10 |
cmp byte [esi],'(' |
jne aa_store |
inc esi |
xor al,al |
xchg al,[operand_size] |
cmp al,1 |
ja invalid_operand_size |
call get_byte_value |
mov bl,al |
aa_store: |
cmp [operand_size],0 |
jne invalid_operand |
pop eax |
mov ah,bl |
stos word [edi] |
jmp instruction_assembled |
|
basic_instruction: |
mov [base_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je basic_reg |
cmp al,'[' |
jne invalid_operand |
basic_mem: |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je basic_mem_imm |
cmp al,10h |
jne invalid_operand |
basic_mem_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
pop cx bx edx |
mov al,ah |
cmp al,1 |
je basic_mem_reg_8bit |
call operand_autodetect |
inc [base_code] |
basic_mem_reg_8bit: |
call store_instruction |
jmp instruction_assembled |
basic_mem_imm: |
mov al,[operand_size] |
cmp al,1 |
je basic_mem_imm_8bit |
cmp al,2 |
je basic_mem_imm_16bit |
cmp al,4 |
je basic_mem_imm_32bit |
cmp al,8 |
je basic_mem_imm_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne basic_mem_imm_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
basic_mem_imm_8bit: |
call get_byte_value |
mov byte [value],al |
mov al,[base_code] |
shr al,3 |
mov [postbyte_register],al |
pop cx bx edx |
mov [base_code],80h |
call store_instruction_with_imm8 |
jmp instruction_assembled |
basic_mem_imm_16bit: |
call operand_16bit |
call get_word_value |
mov word [value],ax |
mov al,[base_code] |
shr al,3 |
mov [postbyte_register],al |
pop cx bx edx |
cmp [value_type],0 |
jne basic_mem_imm_16bit_store |
cmp [size_declared],0 |
jne basic_mem_imm_16bit_store |
cmp word [value],80h |
jb basic_mem_simm_8bit |
cmp word [value],-80h |
jae basic_mem_simm_8bit |
basic_mem_imm_16bit_store: |
mov [base_code],81h |
call store_instruction_with_imm16 |
jmp instruction_assembled |
basic_mem_simm_8bit: |
mov [base_code],83h |
call store_instruction_with_imm8 |
jmp instruction_assembled |
basic_mem_imm_32bit: |
call operand_32bit |
call get_dword_value |
basic_mem_imm_32bit_ok: |
mov dword [value],eax |
mov al,[base_code] |
shr al,3 |
mov [postbyte_register],al |
pop cx bx edx |
cmp [value_type],0 |
jne basic_mem_imm_32bit_store |
cmp [size_declared],0 |
jne basic_mem_imm_32bit_store |
cmp dword [value],80h |
jb basic_mem_simm_8bit |
cmp dword [value],-80h |
jae basic_mem_simm_8bit |
basic_mem_imm_32bit_store: |
mov [base_code],81h |
call store_instruction_with_imm32 |
jmp instruction_assembled |
basic_mem_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp basic_mem_imm_32bit_ok |
get_simm32: |
call get_qword_value |
mov ecx,edx |
cdq |
cmp ecx,edx |
jne value_out_of_range |
ret |
basic_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je basic_reg_reg |
cmp al,'(' |
je basic_reg_imm |
cmp al,'[' |
jne invalid_operand |
basic_reg_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je basic_reg_mem_8bit |
call operand_autodetect |
add [base_code],3 |
call store_instruction |
jmp instruction_assembled |
basic_reg_mem_8bit: |
add [base_code],2 |
call store_instruction |
jmp instruction_assembled |
basic_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,[postbyte_register] |
mov [postbyte_register],al |
mov al,ah |
cmp al,1 |
je basic_reg_reg_8bit |
call operand_autodetect |
inc [base_code] |
basic_reg_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
basic_reg_imm: |
mov al,[operand_size] |
cmp al,1 |
je basic_reg_imm_8bit |
cmp al,2 |
je basic_reg_imm_16bit |
cmp al,4 |
je basic_reg_imm_32bit |
cmp al,8 |
je basic_reg_imm_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne basic_reg_imm_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp basic_reg_imm_32bit |
basic_reg_imm_8bit: |
call get_byte_value |
mov dl,al |
mov bl,[base_code] |
shr bl,3 |
xchg bl,[postbyte_register] |
or bl,bl |
jz basic_al_imm |
mov [base_code],80h |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
basic_al_imm: |
mov al,[base_code] |
add al,4 |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
basic_reg_imm_16bit: |
call operand_16bit |
call get_word_value |
mov dx,ax |
mov bl,[base_code] |
shr bl,3 |
xchg bl,[postbyte_register] |
cmp [value_type],0 |
jne basic_reg_imm_16bit_store |
cmp [size_declared],0 |
jne basic_reg_imm_16bit_store |
cmp dx,80h |
jb basic_reg_simm_8bit |
cmp dx,-80h |
jae basic_reg_simm_8bit |
basic_reg_imm_16bit_store: |
or bl,bl |
jz basic_ax_imm |
mov [base_code],81h |
call store_nomem_instruction |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
basic_reg_simm_8bit: |
mov [base_code],83h |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
basic_ax_imm: |
add [base_code],5 |
call store_instruction_code |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
basic_reg_imm_32bit: |
call operand_32bit |
call get_dword_value |
basic_reg_imm_32bit_ok: |
mov edx,eax |
mov bl,[base_code] |
shr bl,3 |
xchg bl,[postbyte_register] |
cmp [value_type],0 |
jne basic_reg_imm_32bit_store |
cmp [size_declared],0 |
jne basic_reg_imm_32bit_store |
cmp edx,80h |
jb basic_reg_simm_8bit |
cmp edx,-80h |
jae basic_reg_simm_8bit |
basic_reg_imm_32bit_store: |
or bl,bl |
jz basic_eax_imm |
mov [base_code],81h |
call store_nomem_instruction |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
basic_eax_imm: |
add [base_code],5 |
call store_instruction_code |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
basic_reg_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp basic_reg_imm_32bit_ok |
single_operand_instruction: |
mov [base_code],0F6h |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je single_reg |
cmp al,'[' |
jne invalid_operand |
single_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je single_mem_8bit |
jb single_mem_nosize |
call operand_autodetect |
inc [base_code] |
call store_instruction |
jmp instruction_assembled |
single_mem_nosize: |
cmp [error_line],0 |
jne single_mem_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
single_mem_8bit: |
call store_instruction |
jmp instruction_assembled |
single_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
cmp al,1 |
je single_reg_8bit |
call operand_autodetect |
inc [base_code] |
single_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
mov_instruction: |
mov [base_code],88h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je mov_reg |
cmp al,'[' |
jne invalid_operand |
mov_mem: |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je mov_mem_imm |
cmp al,10h |
jne invalid_operand |
mov_mem_reg: |
lods byte [esi] |
cmp al,60h |
jb mov_mem_general_reg |
cmp al,70h |
jb mov_mem_sreg |
mov_mem_general_reg: |
call convert_register |
mov [postbyte_register],al |
pop cx bx edx |
cmp ah,1 |
je mov_mem_reg_8bit |
mov al,ah |
call operand_autodetect |
mov al,[postbyte_register] |
or al,bl |
or al,bh |
jz mov_mem_ax |
inc [base_code] |
call store_instruction |
jmp instruction_assembled |
mov_mem_reg_8bit: |
or al,bl |
or al,bh |
jz mov_mem_al |
call store_instruction |
jmp instruction_assembled |
mov_mem_al: |
test ch,22h |
jnz mov_mem_address16_al |
test ch,44h |
jnz mov_mem_address32_al |
test ch,88h |
jnz mov_mem_address64_al |
or ch,ch |
jnz invalid_address_size |
cmp [code_type],64 |
je mov_mem_address64_al |
cmp [code_type],32 |
je mov_mem_address32_al |
cmp edx,10000h |
jb mov_mem_address16_al |
mov_mem_address32_al: |
call store_segment_prefix_if_necessary |
call address_32bit_prefix |
mov [base_code],0A2h |
store_mov_address32: |
call store_instruction_code |
push instruction_assembled |
jmp store_address_32bit_value |
mov_mem_address16_al: |
call store_segment_prefix_if_necessary |
call address_16bit_prefix |
mov [base_code],0A2h |
store_mov_address16: |
cmp [code_type],64 |
je invalid_address |
call store_instruction_code |
mov eax,edx |
stos word [edi] |
cmp edx,10000h |
jge value_out_of_range |
jmp instruction_assembled |
mov_mem_address64_al: |
call store_segment_prefix_if_necessary |
mov [base_code],0A2h |
store_mov_address64: |
call store_instruction_code |
push instruction_assembled |
jmp store_address_64bit_value |
mov_mem_ax: |
test ch,22h |
jnz mov_mem_address16_ax |
test ch,44h |
jnz mov_mem_address32_ax |
test ch,88h |
jnz mov_mem_address64_ax |
or ch,ch |
jnz invalid_address_size |
cmp [code_type],64 |
je mov_mem_address64_ax |
cmp [code_type],32 |
je mov_mem_address32_ax |
cmp edx,10000h |
jb mov_mem_address16_ax |
mov_mem_address32_ax: |
call store_segment_prefix_if_necessary |
call address_32bit_prefix |
mov [base_code],0A3h |
jmp store_mov_address32 |
mov_mem_address16_ax: |
call store_segment_prefix_if_necessary |
call address_16bit_prefix |
mov [base_code],0A3h |
jmp store_mov_address16 |
mov_mem_address64_ax: |
call store_segment_prefix_if_necessary |
mov [base_code],0A3h |
jmp store_mov_address64 |
mov_mem_sreg: |
sub al,61h |
mov [postbyte_register],al |
pop cx bx edx |
mov ah,[operand_size] |
or ah,ah |
jz mov_mem_sreg_store |
cmp ah,2 |
jne invalid_operand_size |
mov_mem_sreg_store: |
mov [base_code],8Ch |
call store_instruction |
jmp instruction_assembled |
mov_mem_imm: |
mov al,[operand_size] |
cmp al,1 |
je mov_mem_imm_8bit |
cmp al,2 |
je mov_mem_imm_16bit |
cmp al,4 |
je mov_mem_imm_32bit |
cmp al,8 |
je mov_mem_imm_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne mov_mem_imm_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp mov_mem_imm_32bit |
mov_mem_imm_8bit: |
call get_byte_value |
mov byte [value],al |
mov [postbyte_register],0 |
mov [base_code],0C6h |
pop cx bx edx |
call store_instruction_with_imm8 |
jmp instruction_assembled |
mov_mem_imm_16bit: |
call operand_16bit |
call get_word_value |
mov word [value],ax |
mov [postbyte_register],0 |
mov [base_code],0C7h |
pop cx bx edx |
call store_instruction_with_imm16 |
jmp instruction_assembled |
mov_mem_imm_32bit: |
call operand_32bit |
call get_dword_value |
mov_mem_imm_32bit_store: |
mov dword [value],eax |
mov [postbyte_register],0 |
mov [base_code],0C7h |
pop cx bx edx |
call store_instruction_with_imm32 |
jmp instruction_assembled |
mov_mem_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp mov_mem_imm_32bit_store |
mov_reg: |
lods byte [esi] |
mov ah,al |
sub ah,10h |
and ah,al |
test ah,0F0h |
jnz mov_sreg |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
je mov_reg_mem |
cmp al,'(' |
je mov_reg_imm |
cmp al,10h |
jne invalid_operand |
mov_reg_reg: |
lods byte [esi] |
mov ah,al |
sub ah,10h |
and ah,al |
test ah,0F0h |
jnz mov_reg_sreg |
call convert_register |
mov bl,[postbyte_register] |
mov [postbyte_register],al |
mov al,ah |
cmp al,1 |
je mov_reg_reg_8bit |
call operand_autodetect |
inc [base_code] |
mov_reg_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
mov_reg_sreg: |
mov bl,[postbyte_register] |
mov ah,al |
and al,1111b |
mov [postbyte_register],al |
shr ah,4 |
cmp ah,5 |
je mov_reg_creg |
cmp ah,7 |
je mov_reg_dreg |
ja mov_reg_treg |
dec [postbyte_register] |
cmp [operand_size],8 |
je mov_reg_sreg64 |
cmp [operand_size],4 |
je mov_reg_sreg32 |
cmp [operand_size],2 |
jne invalid_operand_size |
call operand_16bit |
jmp mov_reg_sreg_store |
mov_reg_sreg64: |
call operand_64bit |
jmp mov_reg_sreg_store |
mov_reg_sreg32: |
call operand_32bit |
mov_reg_sreg_store: |
mov [base_code],8Ch |
call store_nomem_instruction |
jmp instruction_assembled |
mov_reg_treg: |
cmp ah,9 |
jne invalid_operand |
mov [extended_code],24h |
jmp mov_reg_xrx |
mov_reg_dreg: |
mov [extended_code],21h |
jmp mov_reg_xrx |
mov_reg_creg: |
mov [extended_code],20h |
mov_reg_xrx: |
mov [base_code],0Fh |
cmp [code_type],64 |
je mov_reg_xrx_64bit |
cmp [operand_size],4 |
jne invalid_operand_size |
call store_nomem_instruction |
jmp instruction_assembled |
mov_reg_xrx_64bit: |
cmp [operand_size],8 |
jne invalid_operand_size |
call store_nomem_instruction |
jmp instruction_assembled |
mov_reg_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je mov_reg_mem_8bit |
call operand_autodetect |
mov al,[postbyte_register] |
or al,bl |
or al,bh |
jz mov_ax_mem |
add [base_code],3 |
call store_instruction |
jmp instruction_assembled |
mov_reg_mem_8bit: |
mov al,[postbyte_register] |
or al,bl |
or al,bh |
jz mov_al_mem |
add [base_code],2 |
call store_instruction |
jmp instruction_assembled |
mov_al_mem: |
test ch,22h |
jnz mov_al_mem_address16 |
test ch,44h |
jnz mov_al_mem_address32 |
test ch,88h |
jnz mov_al_mem_address64 |
or ch,ch |
jnz invalid_address_size |
cmp [code_type],64 |
je mov_al_mem_address64 |
cmp [code_type],32 |
je mov_al_mem_address32 |
cmp edx,10000h |
jb mov_al_mem_address16 |
mov_al_mem_address32: |
call store_segment_prefix_if_necessary |
call address_32bit_prefix |
mov [base_code],0A0h |
jmp store_mov_address32 |
mov_al_mem_address16: |
call store_segment_prefix_if_necessary |
call address_16bit_prefix |
mov [base_code],0A0h |
jmp store_mov_address16 |
mov_al_mem_address64: |
call store_segment_prefix_if_necessary |
mov [base_code],0A0h |
jmp store_mov_address64 |
mov_ax_mem: |
test ch,22h |
jnz mov_ax_mem_address16 |
test ch,44h |
jnz mov_ax_mem_address32 |
test ch,88h |
jnz mov_ax_mem_address64 |
or ch,ch |
jnz invalid_address_size |
cmp [code_type],64 |
je mov_ax_mem_address64 |
cmp [code_type],32 |
je mov_ax_mem_address32 |
cmp edx,10000h |
jb mov_ax_mem_address16 |
mov_ax_mem_address32: |
call store_segment_prefix_if_necessary |
call address_32bit_prefix |
mov [base_code],0A1h |
jmp store_mov_address32 |
mov_ax_mem_address16: |
call store_segment_prefix_if_necessary |
mov [base_code],0A1h |
jmp store_mov_address16 |
mov_ax_mem_address64: |
call store_segment_prefix_if_necessary |
mov [base_code],0A1h |
jmp store_mov_address64 |
mov_reg_imm: |
mov al,[operand_size] |
cmp al,1 |
je mov_reg_imm_8bit |
cmp al,2 |
je mov_reg_imm_16bit |
cmp al,4 |
je mov_reg_imm_32bit |
cmp al,8 |
je mov_reg_imm_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne mov_reg_imm_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp mov_reg_imm_32bit |
mov_reg_imm_8bit: |
call get_byte_value |
mov dl,al |
mov al,0B0h |
call store_mov_reg_imm_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
mov_reg_imm_16bit: |
call get_word_value |
mov dx,ax |
call operand_16bit |
mov al,0B8h |
call store_mov_reg_imm_code |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
mov_reg_imm_32bit: |
call operand_32bit |
call get_dword_value |
mov edx,eax |
mov al,0B8h |
call store_mov_reg_imm_code |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
mov_reg_imm_64bit: |
call operand_64bit |
call get_qword_value |
mov ecx,edx |
cmp [size_declared],0 |
jne mov_reg_imm_64bit_store |
cmp [value_type],4 |
jae mov_reg_imm_64bit_store |
cdq |
cmp ecx,edx |
je mov_reg_64bit_imm_32bit |
mov_reg_imm_64bit_store: |
push eax ecx |
mov al,0B8h |
call store_mov_reg_imm_code |
pop edx eax |
call mark_relocation |
stos dword [edi] |
mov eax,edx |
stos dword [edi] |
jmp instruction_assembled |
store_mov_reg_imm_code: |
mov ah,[postbyte_register] |
test ah,1000b |
jz mov_reg_imm_prefix_ok |
or [rex_prefix],41h |
mov_reg_imm_prefix_ok: |
and ah,111b |
add al,ah |
mov [base_code],al |
call store_instruction_code |
ret |
mov_reg_64bit_imm_32bit: |
mov edx,eax |
mov bl,[postbyte_register] |
mov [postbyte_register],0 |
mov [base_code],0C7h |
call store_nomem_instruction |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
mov_sreg: |
mov ah,al |
and al,111b |
mov [postbyte_register],al |
shr ah,4 |
cmp ah,5 |
je mov_creg |
cmp ah,7 |
je mov_dreg |
ja mov_treg |
cmp al,2 |
je illegal_instruction |
dec [postbyte_register] |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
je mov_sreg_mem |
cmp al,10h |
jne invalid_operand |
mov_sreg_reg: |
lods byte [esi] |
call convert_register |
or ah,ah |
jz mov_sreg_reg_size_ok |
cmp ah,2 |
jne invalid_operand_size |
mov bl,al |
mov_sreg_reg_size_ok: |
mov [base_code],8Eh |
call store_nomem_instruction |
jmp instruction_assembled |
mov_sreg_mem: |
call get_address |
mov al,[operand_size] |
or al,al |
jz mov_sreg_mem_size_ok |
cmp al,2 |
jne invalid_operand_size |
mov_sreg_mem_size_ok: |
mov [base_code],8Eh |
call store_instruction |
jmp instruction_assembled |
mov_treg: |
cmp ah,9 |
jne invalid_operand |
mov [extended_code],26h |
jmp mov_xrx |
mov_dreg: |
mov [extended_code],23h |
jmp mov_xrx |
mov_creg: |
mov [extended_code],22h |
mov_xrx: |
mov [base_code],0Fh |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,al |
cmp [code_type],64 |
je mov_xrx_64bit |
cmp ah,4 |
jne invalid_operand_size |
call store_nomem_instruction |
jmp instruction_assembled |
mov_xrx_64bit: |
cmp ah,8 |
jne invalid_operand_size |
call store_nomem_instruction |
jmp instruction_assembled |
cmov_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
je cmov_reg_mem |
cmp al,10h |
jne invalid_operand |
cmov_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
call operand_autodetect |
call store_nomem_instruction |
jmp instruction_assembled |
cmov_reg_mem: |
call get_address |
mov al,[operand_size] |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
test_instruction: |
mov [base_code],84h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je test_reg |
cmp al,'[' |
jne invalid_operand |
test_mem: |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je test_mem_imm |
cmp al,10h |
jne invalid_operand |
test_mem_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
pop cx bx edx |
mov al,ah |
cmp al,1 |
je test_mem_reg_8bit |
call operand_autodetect |
inc [base_code] |
test_mem_reg_8bit: |
call store_instruction |
jmp instruction_assembled |
test_mem_imm: |
mov al,[operand_size] |
cmp al,1 |
je test_mem_imm_8bit |
cmp al,2 |
je test_mem_imm_16bit |
cmp al,4 |
je test_mem_imm_32bit |
cmp al,8 |
je test_mem_imm_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne test_mem_imm_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp test_mem_imm_32bit |
test_mem_imm_8bit: |
call get_byte_value |
mov byte [value],al |
mov [postbyte_register],0 |
mov [base_code],0F6h |
pop cx bx edx |
call store_instruction_with_imm8 |
jmp instruction_assembled |
test_mem_imm_16bit: |
call operand_16bit |
call get_word_value |
mov word [value],ax |
mov [postbyte_register],0 |
mov [base_code],0F7h |
pop cx bx edx |
call store_instruction_with_imm16 |
jmp instruction_assembled |
test_mem_imm_32bit: |
call operand_32bit |
call get_dword_value |
test_mem_imm_32bit_store: |
mov dword [value],eax |
mov [postbyte_register],0 |
mov [base_code],0F7h |
pop cx bx edx |
call store_instruction_with_imm32 |
jmp instruction_assembled |
test_mem_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp test_mem_imm_32bit_store |
test_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
je test_reg_mem |
cmp al,'(' |
je test_reg_imm |
cmp al,10h |
jne invalid_operand |
test_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,[postbyte_register] |
mov [postbyte_register],al |
mov al,ah |
cmp al,1 |
je test_reg_reg_8bit |
call operand_autodetect |
inc [base_code] |
test_reg_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
test_reg_imm: |
mov al,[operand_size] |
cmp al,1 |
je test_reg_imm_8bit |
cmp al,2 |
je test_reg_imm_16bit |
cmp al,4 |
je test_reg_imm_32bit |
cmp al,8 |
je test_reg_imm_64bit |
jmp invalid_operand_size |
test_reg_imm_8bit: |
call get_byte_value |
mov dl,al |
mov bl,[postbyte_register] |
mov [postbyte_register],0 |
mov [base_code],0F6h |
or bl,bl |
jz test_al_imm |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
test_al_imm: |
mov [base_code],0A8h |
call store_instruction_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
test_reg_imm_16bit: |
call operand_16bit |
call get_word_value |
mov dx,ax |
mov bl,[postbyte_register] |
mov [postbyte_register],0 |
mov [base_code],0F7h |
or bl,bl |
jz test_ax_imm |
call store_nomem_instruction |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
test_ax_imm: |
mov [base_code],0A9h |
call store_instruction_code |
mov ax,dx |
stos word [edi] |
jmp instruction_assembled |
test_reg_imm_32bit: |
call operand_32bit |
call get_dword_value |
test_reg_imm_32bit_store: |
mov edx,eax |
mov bl,[postbyte_register] |
mov [postbyte_register],0 |
mov [base_code],0F7h |
or bl,bl |
jz test_eax_imm |
call store_nomem_instruction |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
test_eax_imm: |
mov [base_code],0A9h |
call store_instruction_code |
mov eax,edx |
stos dword [edi] |
jmp instruction_assembled |
test_reg_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp test_reg_imm_32bit_store |
test_reg_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je test_reg_mem_8bit |
call operand_autodetect |
inc [base_code] |
test_reg_mem_8bit: |
call store_instruction |
jmp instruction_assembled |
xchg_instruction: |
mov [base_code],86h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je xchg_reg |
cmp al,'[' |
jne invalid_operand |
xchg_mem: |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je test_mem_reg |
jmp invalid_operand |
xchg_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
je test_reg_mem |
cmp al,10h |
jne invalid_operand |
xchg_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
cmp al,1 |
je xchg_reg_reg_8bit |
call operand_autodetect |
cmp [postbyte_register],0 |
je xchg_ax_reg |
or bl,bl |
jnz xchg_reg_reg_store |
mov bl,[postbyte_register] |
xchg_ax_reg: |
cmp [code_type],64 |
jne xchg_ax_reg_ok |
cmp ah,4 |
jne xchg_ax_reg_ok |
or bl,bl |
jz xchg_reg_reg_store |
xchg_ax_reg_ok: |
test bl,1000b |
jz xchg_ax_reg_store |
or [rex_prefix],41h |
and bl,111b |
xchg_ax_reg_store: |
add bl,90h |
mov [base_code],bl |
call store_instruction_code |
jmp instruction_assembled |
xchg_reg_reg_store: |
inc [base_code] |
xchg_reg_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
push_instruction: |
mov [extended_code],al |
push_next: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je push_reg |
cmp al,'(' |
je push_imm |
cmp al,'[' |
jne invalid_operand |
push_mem: |
call get_address |
mov al,[operand_size] |
mov ah,[extended_code] |
cmp al,2 |
je push_mem_16bit |
cmp al,4 |
je push_mem_32bit |
cmp al,8 |
je push_mem_64bit |
or al,al |
jnz invalid_operand_size |
cmp ah,2 |
je push_mem_16bit |
cmp ah,4 |
je push_mem_32bit |
cmp ah,8 |
je push_mem_64bit |
cmp [error_line],0 |
jne push_mem_store |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp push_mem_store |
push_mem_16bit: |
test ah,not 2 |
jnz invalid_operand_size |
call operand_16bit |
jmp push_mem_store |
push_mem_32bit: |
test ah,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp push_mem_store |
push_mem_64bit: |
test ah,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
push_mem_store: |
mov [base_code],0FFh |
mov [postbyte_register],110b |
call store_instruction |
jmp push_done |
push_reg: |
lods byte [esi] |
mov ah,al |
sub ah,10h |
and ah,al |
test ah,0F0h |
jnz push_sreg |
call convert_register |
test al,1000b |
jz push_reg_ok |
or [rex_prefix],41h |
and al,111b |
push_reg_ok: |
add al,50h |
mov [base_code],al |
mov al,ah |
mov ah,[extended_code] |
cmp al,2 |
je push_reg_16bit |
cmp al,4 |
je push_reg_32bit |
cmp al,8 |
jne invalid_operand_size |
push_reg_64bit: |
test ah,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
jmp push_reg_store |
push_reg_32bit: |
test ah,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp push_reg_store |
push_reg_16bit: |
test ah,not 2 |
jnz invalid_operand_size |
call operand_16bit |
push_reg_store: |
call store_instruction_code |
jmp push_done |
push_sreg: |
mov bl,al |
mov dl,[operand_size] |
mov dh,[extended_code] |
cmp dl,2 |
je push_sreg16 |
cmp dl,4 |
je push_sreg32 |
cmp dl,8 |
je push_sreg64 |
or dl,dl |
jnz invalid_operand_size |
cmp dh,2 |
je push_sreg16 |
cmp dh,4 |
je push_sreg32 |
cmp dh,8 |
je push_sreg64 |
jmp push_sreg_store |
push_sreg16: |
test dh,not 2 |
jnz invalid_operand_size |
call operand_16bit |
jmp push_sreg_store |
push_sreg32: |
test dh,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp push_sreg_store |
push_sreg64: |
test dh,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
push_sreg_store: |
mov al,bl |
cmp al,70h |
jae invalid_operand |
sub al,61h |
cmp al,4 |
jae push_sreg_386 |
shl al,3 |
add al,6 |
mov [base_code],al |
cmp [code_type],64 |
je illegal_instruction |
jmp push_reg_store |
push_sreg_386: |
sub al,4 |
shl al,3 |
add al,0A0h |
mov [extended_code],al |
mov [base_code],0Fh |
jmp push_reg_store |
push_imm: |
mov al,[operand_size] |
mov ah,[extended_code] |
or al,al |
je push_imm_size_ok |
or ah,ah |
je push_imm_size_ok |
cmp al,ah |
jne invalid_operand_size |
push_imm_size_ok: |
cmp al,2 |
je push_imm_16bit |
cmp al,4 |
je push_imm_32bit |
cmp al,8 |
je push_imm_64bit |
cmp ah,2 |
je push_imm_optimized_16bit |
cmp ah,4 |
je push_imm_optimized_32bit |
cmp ah,8 |
je push_imm_optimized_64bit |
or al,al |
jnz invalid_operand_size |
cmp [code_type],16 |
je push_imm_optimized_16bit |
cmp [code_type],32 |
je push_imm_optimized_32bit |
push_imm_optimized_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
call get_simm32 |
mov edx,eax |
cmp [value_type],0 |
jne push_imm_32bit_store |
cmp eax,-80h |
jl push_imm_32bit_store |
cmp eax,80h |
jge push_imm_32bit_store |
jmp push_imm_8bit |
push_imm_optimized_32bit: |
cmp [code_type],64 |
je illegal_instruction |
call get_dword_value |
mov edx,eax |
cmp [value_type],0 |
jne push_imm_32bit_store |
cmp eax,-80h |
jl push_imm_32bit_store |
cmp eax,80h |
jge push_imm_32bit_store |
call operand_32bit |
jmp push_imm_8bit |
push_imm_optimized_16bit: |
call get_word_value |
mov dx,ax |
cmp [value_type],0 |
jne push_imm_16bit_store |
cmp ax,-80h |
jl push_imm_16bit_store |
cmp ax,80h |
jge push_imm_16bit_store |
call operand_16bit |
push_imm_8bit: |
mov ah,al |
mov al,6Ah |
stos word [edi] |
jmp push_done |
push_imm_16bit: |
call get_word_value |
mov dx,ax |
call operand_16bit |
push_imm_16bit_store: |
mov [base_code],68h |
call store_instruction_code |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp push_done |
push_imm_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
call get_simm32 |
mov edx,eax |
jmp push_imm_32bit_store |
push_imm_32bit: |
cmp [code_type],64 |
je illegal_instruction |
call get_dword_value |
mov edx,eax |
call operand_32bit |
push_imm_32bit_store: |
mov [base_code],68h |
call store_instruction_code |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
push_done: |
lods byte [esi] |
dec esi |
cmp al,0Fh |
je instruction_assembled |
or al,al |
jz instruction_assembled |
mov [operand_size],0 |
mov [size_override],0 |
mov [operand_prefix],0 |
mov [rex_prefix],0 |
jmp push_next |
pop_instruction: |
mov [extended_code],al |
pop_next: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je pop_reg |
cmp al,'[' |
jne invalid_operand |
pop_mem: |
call get_address |
mov al,[operand_size] |
mov ah,[extended_code] |
cmp al,2 |
je pop_mem_16bit |
cmp al,4 |
je pop_mem_32bit |
cmp al,8 |
je pop_mem_64bit |
or al,al |
jnz invalid_operand_size |
cmp ah,2 |
je pop_mem_16bit |
cmp ah,4 |
je pop_mem_32bit |
cmp ah,8 |
je pop_mem_64bit |
cmp [error_line],0 |
jne pop_mem_store |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp pop_mem_store |
pop_mem_16bit: |
test ah,not 2 |
jnz invalid_operand_size |
call operand_16bit |
jmp pop_mem_store |
pop_mem_32bit: |
test ah,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp pop_mem_store |
pop_mem_64bit: |
test ah,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
pop_mem_store: |
mov [base_code],08Fh |
mov [postbyte_register],0 |
call store_instruction |
jmp pop_done |
pop_reg: |
lods byte [esi] |
mov ah,al |
sub ah,10h |
and ah,al |
test ah,0F0h |
jnz pop_sreg |
call convert_register |
test al,1000b |
jz pop_reg_ok |
or [rex_prefix],41h |
and al,111b |
pop_reg_ok: |
add al,58h |
mov [base_code],al |
mov al,ah |
mov ah,[extended_code] |
cmp al,2 |
je pop_reg_16bit |
cmp al,4 |
je pop_reg_32bit |
cmp al,8 |
je pop_reg_64bit |
jmp invalid_operand_size |
pop_reg_64bit: |
test ah,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
jmp pop_reg_store |
pop_reg_32bit: |
test ah,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp pop_reg_store |
pop_reg_16bit: |
test ah,not 2 |
jnz invalid_operand_size |
call operand_16bit |
pop_reg_store: |
call store_instruction_code |
pop_done: |
lods byte [esi] |
dec esi |
cmp al,0Fh |
je instruction_assembled |
or al,al |
jz instruction_assembled |
mov [operand_size],0 |
mov [size_override],0 |
mov [operand_prefix],0 |
mov [rex_prefix],0 |
jmp pop_next |
pop_sreg: |
mov bl,al |
mov dl,[operand_size] |
mov dh,[extended_code] |
cmp dl,2 |
je pop_sreg16 |
cmp dl,4 |
je pop_sreg32 |
cmp dl,8 |
je pop_sreg64 |
or dl,dl |
jnz invalid_operand_size |
cmp dh,2 |
je pop_sreg16 |
cmp dh,4 |
je pop_sreg32 |
cmp dh,8 |
je pop_sreg64 |
jmp pop_sreg_store |
pop_sreg16: |
test dh,not 2 |
jnz invalid_operand_size |
call operand_16bit |
jmp pop_sreg_store |
pop_sreg32: |
test dh,not 4 |
jnz invalid_operand_size |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
jmp pop_sreg_store |
pop_sreg64: |
test dh,not 8 |
jnz invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
pop_sreg_store: |
mov al,bl |
cmp al,70h |
jae invalid_operand |
sub al,61h |
cmp al,4 |
jae pop_sreg_386 |
shl al,3 |
add al,7 |
mov [base_code],al |
cmp [code_type],64 |
je illegal_instruction |
jmp pop_reg_store |
pop_sreg_386: |
sub al,4 |
shl al,3 |
add al,0A1h |
mov [extended_code],al |
mov [base_code],0Fh |
jmp pop_reg_store |
inc_instruction: |
mov [base_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je inc_reg |
cmp al,'[' |
je inc_mem |
jne invalid_operand |
inc_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je inc_mem_8bit |
jb inc_mem_nosize |
call operand_autodetect |
mov al,0FFh |
xchg al,[base_code] |
mov [postbyte_register],al |
call store_instruction |
jmp instruction_assembled |
inc_mem_nosize: |
cmp [error_line],0 |
jne inc_mem_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
inc_mem_8bit: |
mov al,0FEh |
xchg al,[base_code] |
mov [postbyte_register],al |
call store_instruction |
jmp instruction_assembled |
inc_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,0FEh |
xchg al,[base_code] |
mov [postbyte_register],al |
mov al,ah |
cmp al,1 |
je inc_reg_8bit |
call operand_autodetect |
cmp [code_type],64 |
je inc_reg_long_form |
mov al,[postbyte_register] |
shl al,3 |
add al,bl |
add al,40h |
mov [base_code],al |
call store_instruction_code |
jmp instruction_assembled |
inc_reg_long_form: |
inc [base_code] |
inc_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
set_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je set_reg |
cmp al,'[' |
jne invalid_operand |
set_mem: |
call get_address |
cmp [operand_size],1 |
ja invalid_operand_size |
mov [postbyte_register],0 |
call store_instruction |
jmp instruction_assembled |
set_reg: |
lods byte [esi] |
call convert_register |
cmp ah,1 |
jne invalid_operand_size |
mov bl,al |
mov [postbyte_register],0 |
call store_nomem_instruction |
jmp instruction_assembled |
arpl_instruction: |
cmp [code_type],64 |
je illegal_instruction |
mov [base_code],63h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je arpl_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
cmp ah,2 |
jne invalid_operand_size |
call store_instruction |
jmp instruction_assembled |
arpl_reg: |
lods byte [esi] |
call convert_register |
cmp ah,2 |
jne invalid_operand_size |
mov bl,al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ah,2 |
jne invalid_operand_size |
mov [postbyte_register],al |
call store_nomem_instruction |
jmp instruction_assembled |
bound_instruction: |
cmp [code_type],64 |
je illegal_instruction |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,2 |
je bound_16bit |
cmp al,4 |
je bound_32bit |
jmp invalid_operand_size |
bound_32bit: |
call operand_32bit |
mov [base_code],62h |
call store_instruction |
jmp instruction_assembled |
bound_16bit: |
call operand_16bit |
mov [base_code],62h |
call store_instruction |
jmp instruction_assembled |
enter_instruction: |
lods byte [esi] |
call get_size_operator |
cmp ah,2 |
je enter_imm16_size_ok |
or ah,ah |
jnz invalid_operand_size |
enter_imm16_size_ok: |
cmp al,'(' |
jne invalid_operand |
call get_word_value |
cmp [next_pass_needed],0 |
jne enter_imm16_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
enter_imm16_ok: |
push eax |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp ah,1 |
je enter_imm8_size_ok |
or ah,ah |
jnz invalid_operand_size |
enter_imm8_size_ok: |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
mov dl,al |
pop ebx |
mov al,0C8h |
stos byte [edi] |
mov ax,bx |
stos word [edi] |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
ret_instruction_only64: |
cmp [code_type],64 |
jne illegal_instruction |
jmp ret_instruction |
ret_instruction_32bit_except64: |
cmp [code_type],64 |
je illegal_instruction |
ret_instruction_32bit: |
call operand_32bit |
jmp ret_instruction |
ret_instruction_16bit: |
call operand_16bit |
jmp ret_instruction |
retf_instruction: |
cmp [code_type],64 |
jne ret_instruction |
ret_instruction_64bit: |
call operand_64bit |
ret_instruction: |
mov [base_code],al |
lods byte [esi] |
dec esi |
or al,al |
jz simple_ret |
cmp al,0Fh |
je simple_ret |
lods byte [esi] |
call get_size_operator |
or ah,ah |
jz ret_imm |
cmp ah,2 |
je ret_imm |
jmp invalid_operand_size |
ret_imm: |
cmp al,'(' |
jne invalid_operand |
call get_word_value |
cmp [next_pass_needed],0 |
jne ret_imm_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
ret_imm_ok: |
mov dx,ax |
call store_instruction_code |
mov ax,dx |
stos word [edi] |
jmp instruction_assembled |
simple_ret: |
inc [base_code] |
call store_instruction_code |
jmp instruction_assembled |
lea_instruction: |
mov [base_code],8Dh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
xor al,al |
xchg al,[operand_size] |
push eax |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
pop eax |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
ls_instruction: |
or al,al |
jz les_instruction |
cmp al,3 |
jz lds_instruction |
add al,0B0h |
mov [extended_code],al |
mov [base_code],0Fh |
jmp ls_code_ok |
les_instruction: |
mov [base_code],0C4h |
jmp ls_short_code |
lds_instruction: |
mov [base_code],0C5h |
ls_short_code: |
cmp [code_type],64 |
je illegal_instruction |
ls_code_ok: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
add [operand_size],2 |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,4 |
je ls_16bit |
cmp al,6 |
je ls_32bit |
cmp al,10 |
je ls_64bit |
jmp invalid_operand_size |
ls_16bit: |
call operand_16bit |
call store_instruction |
jmp instruction_assembled |
ls_32bit: |
call operand_32bit |
call store_instruction |
jmp instruction_assembled |
ls_64bit: |
call operand_64bit |
call store_instruction |
jmp instruction_assembled |
sh_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je sh_reg |
cmp al,'[' |
jne invalid_operand |
sh_mem: |
call get_address |
push edx bx cx |
mov al,[operand_size] |
push eax |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je sh_mem_imm |
cmp al,10h |
jne invalid_operand |
sh_mem_reg: |
lods byte [esi] |
cmp al,11h |
jne invalid_operand |
pop eax cx bx edx |
cmp al,1 |
je sh_mem_cl_8bit |
jb sh_mem_cl_nosize |
call operand_autodetect |
mov [base_code],0D3h |
call store_instruction |
jmp instruction_assembled |
sh_mem_cl_nosize: |
cmp [error_line],0 |
jne sh_mem_cl_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
sh_mem_cl_8bit: |
mov [base_code],0D2h |
call store_instruction |
jmp instruction_assembled |
sh_mem_imm: |
mov al,[operand_size] |
or al,al |
jz sh_mem_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
sh_mem_imm_size_ok: |
call get_byte_value |
mov byte [value],al |
pop eax cx bx edx |
cmp al,1 |
je sh_mem_imm_8bit |
jb sh_mem_imm_nosize |
call operand_autodetect |
cmp byte [value],1 |
je sh_mem_1 |
mov [base_code],0C1h |
call store_instruction_with_imm8 |
jmp instruction_assembled |
sh_mem_1: |
mov [base_code],0D1h |
call store_instruction |
jmp instruction_assembled |
sh_mem_imm_nosize: |
cmp [error_line],0 |
jne sh_mem_imm_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
sh_mem_imm_8bit: |
cmp byte [value],1 |
je sh_mem_1_8bit |
mov [base_code],0C0h |
call store_instruction_with_imm8 |
jmp instruction_assembled |
sh_mem_1_8bit: |
mov [base_code],0D0h |
call store_instruction |
jmp instruction_assembled |
sh_reg: |
lods byte [esi] |
call convert_register |
mov bx,ax |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je sh_reg_imm |
cmp al,10h |
jne invalid_operand |
sh_reg_reg: |
lods byte [esi] |
cmp al,11h |
jne invalid_operand |
mov al,bh |
cmp al,1 |
je sh_reg_cl_8bit |
call operand_autodetect |
mov [base_code],0D3h |
call store_nomem_instruction |
jmp instruction_assembled |
sh_reg_cl_8bit: |
mov [base_code],0D2h |
call store_nomem_instruction |
jmp instruction_assembled |
sh_reg_imm: |
mov al,[operand_size] |
or al,al |
jz sh_reg_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
sh_reg_imm_size_ok: |
push ebx |
call get_byte_value |
mov dl,al |
pop ebx |
mov al,bh |
cmp al,1 |
je sh_reg_imm_8bit |
call operand_autodetect |
cmp dl,1 |
je sh_reg_1 |
mov [base_code],0C1h |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
sh_reg_1: |
mov [base_code],0D1h |
call store_nomem_instruction |
jmp instruction_assembled |
sh_reg_imm_8bit: |
cmp dl,1 |
je sh_reg_1_8bit |
mov [base_code],0C0h |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
sh_reg_1_8bit: |
mov [base_code],0D0h |
call store_nomem_instruction |
jmp instruction_assembled |
shd_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je shd_reg |
cmp al,'[' |
jne invalid_operand |
shd_mem: |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov al,ah |
mov [operand_size],0 |
push eax |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je shd_mem_reg_imm |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
cmp al,11h |
jne invalid_operand |
pop eax cx bx edx |
call operand_autodetect |
inc [extended_code] |
call store_instruction |
jmp instruction_assembled |
shd_mem_reg_imm: |
mov al,[operand_size] |
or al,al |
jz shd_mem_reg_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
shd_mem_reg_imm_size_ok: |
call get_byte_value |
mov byte [value],al |
pop eax cx bx edx |
call operand_autodetect |
call store_instruction_with_imm8 |
jmp instruction_assembled |
shd_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,[postbyte_register] |
mov [postbyte_register],al |
mov al,ah |
push eax ebx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je shd_reg_reg_imm |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
cmp al,11h |
jne invalid_operand |
pop ebx eax |
call operand_autodetect |
inc [extended_code] |
call store_nomem_instruction |
jmp instruction_assembled |
shd_reg_reg_imm: |
mov al,[operand_size] |
or al,al |
jz shd_reg_reg_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
shd_reg_reg_imm_size_ok: |
call get_byte_value |
mov dl,al |
pop ebx eax |
call operand_autodetect |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
movx_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
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,ah |
push eax |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movx_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
pop eax |
mov ah,[operand_size] |
cmp ah,al |
jae invalid_operand_size |
cmp ah,1 |
je movx_mem_8bit |
cmp ah,2 |
je movx_mem_16bit |
or ah,ah |
jnz invalid_operand_size |
cmp [error_line],0 |
jne movx_mem_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
movx_mem_8bit: |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
movx_mem_16bit: |
inc [extended_code] |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
movx_reg: |
lods byte [esi] |
call convert_register |
pop ebx |
xchg bl,al |
cmp ah,al |
jae invalid_operand_size |
cmp ah,1 |
je movx_reg_8bit |
cmp ah,2 |
je movx_reg_16bit |
jmp invalid_operand_size |
movx_reg_8bit: |
call operand_autodetect |
call store_nomem_instruction |
jmp instruction_assembled |
movx_reg_16bit: |
call operand_autodetect |
inc [extended_code] |
call store_nomem_instruction |
jmp instruction_assembled |
movsxd_instruction: |
mov [base_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
cmp ah,8 |
jne invalid_operand_size |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movsxd_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],4 |
je movsxd_mem_store |
cmp [operand_size],0 |
jne invalid_operand_size |
movsxd_mem_store: |
call operand_64bit |
call store_instruction |
jmp instruction_assembled |
movsxd_reg: |
lods byte [esi] |
call convert_register |
cmp ah,4 |
jne invalid_operand_size |
call operand_64bit |
call store_nomem_instruction |
jmp instruction_assembled |
bt_instruction: |
mov [postbyte_register],al |
shl al,3 |
add al,83h |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je bt_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
push eax bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
cmp byte [esi],'(' |
je bt_mem_imm |
cmp byte [esi],11h |
jne bt_mem_reg |
cmp byte [esi+2],'(' |
je bt_mem_imm |
bt_mem_reg: |
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,ah |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
bt_mem_imm: |
xor al,al |
xchg al,[operand_size] |
push eax |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
mov al,[operand_size] |
or al,al |
jz bt_mem_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
bt_mem_imm_size_ok: |
call get_byte_value |
mov byte [value],al |
pop eax |
or al,al |
jz bt_mem_imm_nosize |
call operand_autodetect |
bt_mem_imm_store: |
pop cx bx edx |
mov [extended_code],0BAh |
call store_instruction_with_imm8 |
jmp instruction_assembled |
bt_mem_imm_nosize: |
cmp [error_line],0 |
jne bt_mem_imm_store |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp bt_mem_imm_store |
bt_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
cmp byte [esi],'(' |
je bt_reg_imm |
cmp byte [esi],11h |
jne bt_reg_reg |
cmp byte [esi+2],'(' |
je bt_reg_imm |
bt_reg_reg: |
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,ah |
call operand_autodetect |
call store_nomem_instruction |
jmp instruction_assembled |
bt_reg_imm: |
xor al,al |
xchg al,[operand_size] |
push eax |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
mov al,[operand_size] |
or al,al |
jz bt_reg_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
bt_reg_imm_size_ok: |
call get_byte_value |
mov byte [value],al |
pop eax |
call operand_autodetect |
bt_reg_imm_store: |
mov [extended_code],0BAh |
call store_nomem_instruction |
mov al,byte [value] |
stos byte [edi] |
jmp instruction_assembled |
bs_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je bs_reg_reg |
cmp al,'[' |
jne invalid_argument |
call get_address |
mov al,[operand_size] |
call operand_autodetect |
call store_instruction |
jmp instruction_assembled |
bs_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
call operand_autodetect |
call store_nomem_instruction |
jmp instruction_assembled |
imul_instruction: |
mov [base_code],0F6h |
mov [postbyte_register],5 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je imul_reg |
cmp al,'[' |
jne invalid_operand |
imul_mem: |
call get_address |
mov al,[operand_size] |
cmp al,1 |
je imul_mem_8bit |
jb imul_mem_nosize |
call operand_autodetect |
inc [base_code] |
call store_instruction |
jmp instruction_assembled |
imul_mem_nosize: |
cmp [error_line],0 |
jne imul_mem_8bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
imul_mem_8bit: |
call store_instruction |
jmp instruction_assembled |
imul_reg: |
lods byte [esi] |
call convert_register |
cmp byte [esi],',' |
je imul_reg_ |
mov bl,al |
mov al,ah |
cmp al,1 |
je imul_reg_8bit |
call operand_autodetect |
inc [base_code] |
call store_nomem_instruction |
jmp instruction_assembled |
imul_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
imul_reg_: |
mov [postbyte_register],al |
inc esi |
cmp byte [esi],'(' |
je imul_reg_imm |
cmp byte [esi],11h |
jne imul_reg_noimm |
cmp byte [esi+2],'(' |
je imul_reg_imm |
imul_reg_noimm: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je imul_reg_reg |
cmp al,'[' |
jne invalid_operand |
imul_reg_mem: |
call get_address |
push edx bx cx |
cmp byte [esi],',' |
je imul_reg_mem_imm |
mov al,[operand_size] |
call operand_autodetect |
pop cx bx edx |
mov [base_code],0Fh |
mov [extended_code],0AFh |
call store_instruction |
jmp instruction_assembled |
imul_reg_mem_imm: |
inc esi |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
mov al,[operand_size] |
cmp al,2 |
je imul_reg_mem_imm_16bit |
cmp al,4 |
je imul_reg_mem_imm_32bit |
cmp al,8 |
je imul_reg_mem_imm_64bit |
jmp invalid_operand_size |
imul_reg_mem_imm_16bit: |
call operand_16bit |
call get_word_value |
mov word [value],ax |
cmp [value_type],0 |
jne imul_reg_mem_imm_16bit_store |
cmp [size_declared],0 |
jne imul_reg_mem_imm_16bit_store |
cmp ax,-80h |
jl imul_reg_mem_imm_16bit_store |
cmp ax,80h |
jl imul_reg_mem_imm_8bit_store |
imul_reg_mem_imm_16bit_store: |
pop cx bx edx |
mov [base_code],69h |
call store_instruction_with_imm16 |
jmp instruction_assembled |
imul_reg_mem_imm_32bit: |
call operand_32bit |
call get_dword_value |
imul_reg_mem_imm_32bit_ok: |
mov dword [value],eax |
cmp [value_type],0 |
jne imul_reg_mem_imm_32bit_store |
cmp [size_declared],0 |
jne imul_reg_mem_imm_32bit_store |
cmp eax,-80h |
jl imul_reg_mem_imm_32bit_store |
cmp eax,80h |
jl imul_reg_mem_imm_8bit_store |
imul_reg_mem_imm_32bit_store: |
pop cx bx edx |
mov [base_code],69h |
call store_instruction_with_imm32 |
jmp instruction_assembled |
imul_reg_mem_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp imul_reg_mem_imm_32bit_ok |
imul_reg_mem_imm_8bit_store: |
pop cx bx edx |
mov [base_code],6Bh |
call store_instruction_with_imm8 |
jmp instruction_assembled |
imul_reg_imm: |
mov bl,[postbyte_register] |
dec esi |
jmp imul_reg_reg_imm |
imul_reg_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
cmp byte [esi],',' |
je imul_reg_reg_imm |
mov al,ah |
call operand_autodetect |
mov [base_code],0Fh |
mov [extended_code],0AFh |
call store_nomem_instruction |
jmp instruction_assembled |
imul_reg_reg_imm: |
inc esi |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
mov al,[operand_size] |
cmp al,2 |
je imul_reg_reg_imm_16bit |
cmp al,4 |
je imul_reg_reg_imm_32bit |
cmp al,8 |
je imul_reg_reg_imm_64bit |
jmp invalid_operand_size |
imul_reg_reg_imm_16bit: |
call operand_16bit |
push ebx |
call get_word_value |
pop ebx |
mov dx,ax |
cmp [value_type],0 |
jne imul_reg_reg_imm_16bit_store |
cmp [size_declared],0 |
jne imul_reg_reg_imm_16bit_store |
cmp ax,-80h |
jl imul_reg_reg_imm_16bit_store |
cmp ax,80h |
jl imul_reg_reg_imm_8bit_store |
imul_reg_reg_imm_16bit_store: |
mov [base_code],69h |
call store_nomem_instruction |
mov ax,dx |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
imul_reg_reg_imm_32bit: |
call operand_32bit |
push ebx |
call get_dword_value |
imul_reg_reg_imm_32bit_ok: |
pop ebx |
mov edx,eax |
cmp [value_type],0 |
jne imul_reg_reg_imm_32bit_store |
cmp [size_declared],0 |
jne imul_reg_reg_imm_32bit_store |
cmp eax,-80h |
jl imul_reg_reg_imm_32bit_store |
cmp eax,80h |
jl imul_reg_reg_imm_8bit_store |
imul_reg_reg_imm_32bit_store: |
mov [base_code],69h |
call store_nomem_instruction |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
imul_reg_reg_imm_64bit: |
cmp [size_declared],0 |
jne long_immediate_not_encodable |
call operand_64bit |
push ebx |
call get_simm32 |
cmp [value_type],4 |
jae long_immediate_not_encodable |
jmp imul_reg_reg_imm_32bit_ok |
imul_reg_reg_imm_8bit_store: |
mov [base_code],6Bh |
call store_nomem_instruction |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
in_instruction: |
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 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov al,ah |
push eax |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je in_imm |
cmp al,10h |
je in_reg |
jmp invalid_operand |
in_reg: |
lods byte [esi] |
cmp al,22h |
jne invalid_operand |
pop eax |
cmp al,1 |
je in_al_dx |
cmp al,2 |
je in_ax_dx |
cmp al,4 |
je in_eax_dx |
jmp invalid_operand_size |
in_al_dx: |
mov al,0ECh |
stos byte [edi] |
jmp instruction_assembled |
in_ax_dx: |
call operand_16bit |
mov [base_code],0EDh |
call store_instruction_code |
jmp instruction_assembled |
in_eax_dx: |
call operand_32bit |
mov [base_code],0EDh |
call store_instruction_code |
jmp instruction_assembled |
in_imm: |
mov al,[operand_size] |
or al,al |
jz in_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
in_imm_size_ok: |
call get_byte_value |
mov dl,al |
pop eax |
cmp al,1 |
je in_al_imm |
cmp al,2 |
je in_ax_imm |
cmp al,4 |
je in_eax_imm |
jmp invalid_operand_size |
in_al_imm: |
mov al,0E4h |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
in_ax_imm: |
call operand_16bit |
mov [base_code],0E5h |
call store_instruction_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
in_eax_imm: |
call operand_32bit |
mov [base_code],0E5h |
call store_instruction_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
out_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'(' |
je out_imm |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
cmp al,22h |
jne invalid_operand |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
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,ah |
cmp al,1 |
je out_dx_al |
cmp al,2 |
je out_dx_ax |
cmp al,4 |
je out_dx_eax |
jmp invalid_operand_size |
out_dx_al: |
mov al,0EEh |
stos byte [edi] |
jmp instruction_assembled |
out_dx_ax: |
call operand_16bit |
mov [base_code],0EFh |
call store_instruction_code |
jmp instruction_assembled |
out_dx_eax: |
call operand_32bit |
mov [base_code],0EFh |
call store_instruction_code |
jmp instruction_assembled |
out_imm: |
mov al,[operand_size] |
or al,al |
jz out_imm_size_ok |
cmp al,1 |
jne invalid_operand_size |
out_imm_size_ok: |
call get_byte_value |
mov dl,al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
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,ah |
cmp al,1 |
je out_imm_al |
cmp al,2 |
je out_imm_ax |
cmp al,4 |
je out_imm_eax |
jmp invalid_operand_size |
out_imm_al: |
mov al,0E6h |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
out_imm_ax: |
call operand_16bit |
mov [base_code],0E7h |
call store_instruction_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
out_imm_eax: |
call operand_32bit |
mov [base_code],0E7h |
call store_instruction_code |
mov al,dl |
stos byte [edi] |
jmp instruction_assembled |
|
conditional_jump: |
mov [base_code],al |
lods byte [esi] |
call get_jump_operator |
cmp [jump_type],2 |
je invalid_operand |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
cmp byte [esi],'.' |
je invalid_value |
call get_relative_offset |
sub eax,2 |
jo jump_out_of_range |
cmp [next_pass_needed],0 |
jne conditional_jump_value_ok |
cmp [value_type],1 |
je invalid_use_of_symbol |
ja conditional_jump_32bit |
conditional_jump_value_ok: |
mov bl,[operand_size] |
cmp bl,1 |
je conditional_jump_8bit |
cmp bl,2 |
je conditional_jump_16bit |
cmp bl,4 |
je conditional_jump_32bit |
or bl,bl |
jnz invalid_operand_size |
cmp eax,80h |
jb conditional_jump_8bit |
cmp eax,-80h |
jae conditional_jump_8bit |
cmp [code_type],16 |
je conditional_jump_16bit |
conditional_jump_32bit: |
sub eax,2 |
jo jump_out_of_range |
mov edx,eax |
mov ecx,edi |
call operand_32bit |
mov al,[base_code] |
add al,10h |
mov [extended_code],al |
mov [base_code],0Fh |
call store_instruction_code |
mov eax,edi |
sub eax,ecx |
sub edx,eax |
jo jump_out_of_range |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
conditional_jump_16bit: |
mov edx,eax |
mov ecx,edi |
call operand_16bit |
mov al,[base_code] |
add al,10h |
mov [extended_code],al |
mov [base_code],0Fh |
call store_instruction_code |
mov eax,edi |
sub eax,ecx |
sub edx,eax |
jo jump_out_of_range |
mov eax,edx |
stos word [edi] |
cmp eax,10000h |
jge jump_out_of_range |
cmp eax,-10000h |
jl jump_out_of_range |
jmp instruction_assembled |
conditional_jump_8bit: |
mov edx,eax |
mov ah,al |
mov al,[base_code] |
stos word [edi] |
cmp edx,80h |
jge jump_out_of_range |
cmp edx,-80h |
jl jump_out_of_range |
jmp instruction_assembled |
jump_out_of_range: |
cmp [error_line],0 |
jne instruction_assembled |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],relative_jump_out_of_range |
jmp instruction_assembled |
loop_instruction_16bit: |
cmp [code_type],64 |
je illegal_instruction |
mov dl,al |
call address_16bit_prefix |
mov al,dl |
jmp loop_instruction |
loop_instruction_32bit: |
mov dl,al |
call address_32bit_prefix |
mov al,dl |
jmp loop_instruction |
loop_instruction_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
loop_instruction: |
mov [base_code],al |
lods byte [esi] |
call get_jump_operator |
cmp [jump_type],2 |
je invalid_operand |
call get_size_operator |
cmp al,'(' |
jne invalid_operand |
cmp byte [esi],'.' |
je invalid_value |
call get_relative_offset |
cmp [next_pass_needed],0 |
jne loop_value_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
loop_value_ok: |
mov bl,[operand_size] |
cmp bl,1 |
je loop_8bit |
or bl,bl |
jnz invalid_operand_size |
loop_8bit: |
sub eax,2 |
jo jump_out_of_range |
mov edx,eax |
mov al,[base_code] |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
cmp edx,80h |
jge jump_out_of_range |
cmp edx,-80h |
jl jump_out_of_range |
jmp instruction_assembled |
call_instruction: |
mov [postbyte_register],10b |
mov [base_code],0E8h |
mov [extended_code],9Ah |
jmp process_jmp |
jmp_instruction: |
mov [postbyte_register],100b |
mov [base_code],0E9h |
mov [extended_code],0EAh |
process_jmp: |
lods byte [esi] |
call get_jump_operator |
call get_size_operator |
cmp al,'(' |
je jmp_imm |
mov [base_code],0FFh |
cmp al,10h |
je jmp_reg |
cmp al,'[' |
jne invalid_operand |
jmp_mem: |
call get_address |
mov edx,eax |
mov al,[operand_size] |
or al,al |
jz jmp_mem_size_not_specified |
cmp al,2 |
je jmp_mem_16bit |
cmp al,4 |
je jmp_mem_32bit |
cmp al,6 |
je jmp_mem_48bit |
cmp al,8 |
je jmp_mem_64bit |
cmp al,10 |
je jmp_mem_80bit |
jmp invalid_operand_size |
jmp_mem_size_not_specified: |
cmp [jump_type],2 |
je jmp_mem_far |
cmp [jump_type],1 |
je jmp_mem_near |
cmp [error_line],0 |
jne jmp_mem_near |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
jmp_mem_near: |
cmp [code_type],16 |
je jmp_mem_16bit |
cmp [code_type],32 |
je jmp_mem_near_32bit |
jmp_mem_64bit: |
cmp [jump_type],2 |
je invalid_operand_size |
cmp [code_type],64 |
jne illegal_instruction |
call store_instruction |
jmp instruction_assembled |
jmp_mem_far: |
cmp [code_type],16 |
je jmp_mem_far_32bit |
jmp_mem_48bit: |
call operand_32bit |
jmp_mem_far_store: |
cmp [jump_type],1 |
je invalid_operand_size |
inc [postbyte_register] |
call store_instruction |
jmp instruction_assembled |
jmp_mem_80bit: |
call operand_64bit |
jmp jmp_mem_far_store |
jmp_mem_far_32bit: |
call operand_16bit |
jmp jmp_mem_far_store |
jmp_mem_32bit: |
cmp [jump_type],2 |
je jmp_mem_far_32bit |
cmp [jump_type],1 |
je jmp_mem_near_32bit |
cmp [code_type],16 |
je jmp_mem_far_32bit |
jmp_mem_near_32bit: |
cmp [code_type],64 |
je illegal_instruction |
call operand_32bit |
call store_instruction |
jmp instruction_assembled |
jmp_mem_16bit: |
cmp [jump_type],2 |
je invalid_operand_size |
call operand_16bit |
call store_instruction |
jmp instruction_assembled |
jmp_reg: |
cmp [jump_type],2 |
je invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
cmp al,2 |
je jmp_reg_16bit |
cmp al,4 |
je jmp_reg_32bit |
cmp al,8 |
jne invalid_operand_size |
jmp_reg_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
call store_nomem_instruction |
jmp instruction_assembled |
jmp_reg_32bit: |
cmp [code_type],64 |
je illegal_instruction |
call store_nomem_instruction |
jmp instruction_assembled |
jmp_reg_16bit: |
call operand_16bit |
call store_nomem_instruction |
jmp instruction_assembled |
jmp_imm: |
cmp byte [esi],'.' |
je invalid_value |
mov ebx,esi |
dec esi |
call skip_symbol |
xchg esi,ebx |
cmp byte [ebx],':' |
je jmp_far |
call get_relative_offset |
cmp [jump_type],2 |
je invalid_operand |
sub eax,2 |
jo jump_out_of_range |
cmp [next_pass_needed],0 |
jne jmp_value_ok |
cmp [value_type],1 |
je invalid_use_of_symbol |
ja jmp_32bit |
jmp_value_ok: |
mov bl,[operand_size] |
cmp bl,1 |
je jmp_8bit |
cmp bl,2 |
je jmp_16bit |
cmp bl,4 |
je jmp_32bit |
or bl,bl |
jnz invalid_operand_size |
cmp [base_code],0E9h |
jne jmp_no8bit |
cmp eax,80h |
jb jmp_8bit |
cmp eax,-80h |
jae jmp_8bit |
jmp_no8bit: |
cmp [code_type],16 |
je jmp_16bit |
jmp_32bit: |
test [operand_size],not 4 |
jnz invalid_operand_size |
sub eax,2 |
jo jump_out_of_range |
mov edx,eax |
mov ecx,edi |
call operand_32bit |
call store_instruction_code |
mov eax,edi |
sub eax,ecx |
sub edx,eax |
jo jump_out_of_range |
mov eax,edx |
call mark_relocation |
stos dword [edi] |
jmp instruction_assembled |
jmp_16bit: |
mov edx,eax |
mov ecx,edi |
call operand_16bit |
call store_instruction_code |
mov eax,edi |
sub eax,ecx |
sub edx,eax |
jo jump_out_of_range |
mov eax,edx |
stos word [edi] |
cmp eax,10000h |
jge jump_out_of_range |
cmp eax,-10000h |
jl jump_out_of_range |
jmp instruction_assembled |
jmp_8bit: |
cmp [base_code],0E9h |
jne invalid_operand_size |
mov edx,eax |
mov ah,al |
mov al,0EBh |
stos word [edi] |
cmp edx,80h |
jge jump_out_of_range |
cmp edx,-80h |
jl jump_out_of_range |
jmp instruction_assembled |
jmp_far: |
cmp [jump_type],1 |
je invalid_operand |
cmp [code_type],64 |
je illegal_instruction |
mov al,[extended_code] |
mov [base_code],al |
call get_word_value |
push eax |
inc esi |
lods byte [esi] |
cmp al,'(' |
jne invalid_operand |
mov al,[value_type] |
push eax [symbol_identifier] |
cmp byte [esi],'.' |
je invalid_value |
mov al,[operand_size] |
cmp al,4 |
je jmp_far_16bit |
cmp al,6 |
je jmp_far_32bit |
or al,al |
jnz invalid_operand_size |
cmp [code_type],16 |
jne jmp_far_32bit |
jmp_far_16bit: |
call get_word_value |
mov ebx,eax |
call operand_16bit |
call store_instruction_code |
mov ax,bx |
call mark_relocation |
stos word [edi] |
jmp_far_segment: |
pop [symbol_identifier] eax |
mov [value_type],al |
pop eax |
call mark_relocation |
stos word [edi] |
jmp instruction_assembled |
jmp_far_32bit: |
call get_dword_value |
mov ebx,eax |
call operand_32bit |
call store_instruction_code |
mov eax,ebx |
call mark_relocation |
stos dword [edi] |
jmp jmp_far_segment |
|
movs_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp [segment_register],1 |
ja invalid_address |
push ebx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
pop edx |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
mov al,dh |
mov ah,bh |
shr al,4 |
shr ah,4 |
cmp al,ah |
jne address_sizes_do_not_agree |
and bh,111b |
and dh,111b |
cmp bh,6 |
jne invalid_address |
cmp dh,7 |
jne invalid_address |
cmp al,2 |
je movs_address_16bit |
cmp al,4 |
je movs_address_32bit |
cmp [code_type],64 |
jne invalid_address_size |
jmp movs_store |
movs_address_32bit: |
call address_32bit_prefix |
jmp movs_store |
movs_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
movs_store: |
cmp [segment_register],4 |
je movs_segment_ok |
call store_segment_prefix |
movs_segment_ok: |
mov al,0A4h |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
cmp bl,8 |
je simple_instruction_64bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
lods_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp bh,26h |
je lods_address_16bit |
cmp bh,46h |
je lods_address_32bit |
cmp bh,86h |
jne invalid_address |
cmp [code_type],64 |
jne invalid_address_size |
jmp lods_store |
lods_address_32bit: |
call address_32bit_prefix |
jmp lods_store |
lods_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
lods_store: |
cmp [segment_register],4 |
je lods_segment_ok |
call store_segment_prefix |
lods_segment_ok: |
mov al,0ACh |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
cmp bl,8 |
je simple_instruction_64bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
stos_instruction: |
mov [base_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp bh,27h |
je stos_address_16bit |
cmp bh,47h |
je stos_address_32bit |
cmp bh,87h |
jne invalid_address |
cmp [code_type],64 |
jne invalid_address_size |
jmp stos_store |
stos_address_32bit: |
call address_32bit_prefix |
jmp stos_store |
stos_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
stos_store: |
cmp [segment_register],1 |
ja invalid_address |
mov al,[base_code] |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
cmp bl,8 |
je simple_instruction_64bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
cmps_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
mov al,[segment_register] |
push ax bx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
pop dx ax |
cmp [segment_register],1 |
ja invalid_address |
mov [segment_register],al |
mov al,dh |
mov ah,bh |
shr al,4 |
shr ah,4 |
cmp al,ah |
jne address_sizes_do_not_agree |
and bh,111b |
and dh,111b |
cmp bh,7 |
jne invalid_address |
cmp dh,6 |
jne invalid_address |
cmp al,2 |
je cmps_address_16bit |
cmp al,4 |
je cmps_address_32bit |
cmp [code_type],64 |
jne invalid_address_size |
jmp cmps_store |
cmps_address_32bit: |
call address_32bit_prefix |
jmp cmps_store |
cmps_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
cmps_store: |
cmp [segment_register],4 |
je cmps_segment_ok |
call store_segment_prefix |
cmps_segment_ok: |
mov al,0A6h |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
cmp bl,8 |
je simple_instruction_64bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
ins_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp bh,27h |
je ins_address_16bit |
cmp bh,47h |
je ins_address_32bit |
cmp bh,87h |
jne invalid_address |
cmp [code_type],64 |
jne invalid_address_size |
jmp ins_store |
ins_address_32bit: |
call address_32bit_prefix |
jmp ins_store |
ins_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
ins_store: |
cmp [segment_register],1 |
ja invalid_address |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
cmp al,22h |
jne invalid_operand |
mov al,6Ch |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
outs_instruction: |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
cmp al,22h |
jne invalid_operand |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp bh,26h |
je outs_address_16bit |
cmp bh,46h |
je outs_address_32bit |
cmp bh,86h |
jne invalid_address |
cmp [code_type],64 |
jne invalid_address_size |
jmp outs_store |
outs_address_32bit: |
call address_32bit_prefix |
jmp outs_store |
outs_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
outs_store: |
cmp [segment_register],4 |
je outs_segment_ok |
call store_segment_prefix |
outs_segment_ok: |
mov al,6Eh |
mov bl,[operand_size] |
cmp bl,1 |
je simple_instruction |
inc al |
cmp bl,2 |
je simple_instruction_16bit |
cmp bl,4 |
je simple_instruction_32bit |
or bl,bl |
jz operand_size_not_specified |
jmp invalid_operand_size |
xlat_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
or eax,eax |
jnz invalid_address |
or bl,ch |
jnz invalid_address |
cmp bh,23h |
je xlat_address_16bit |
cmp bh,43h |
je xlat_address_32bit |
cmp bh,83h |
jne invalid_address |
cmp [code_type],64 |
jne invalid_address_size |
jmp xlat_store |
xlat_address_32bit: |
call address_32bit_prefix |
jmp xlat_store |
xlat_address_16bit: |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
xlat_store: |
call store_segment_prefix_if_necessary |
mov al,0D7h |
cmp [operand_size],1 |
jbe simple_instruction |
jmp invalid_operand_size |
|
pm_word_instruction: |
mov ah,al |
shr ah,4 |
and al,111b |
mov [base_code],0Fh |
mov [extended_code],ah |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je pm_reg |
pm_mem: |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,2 |
je pm_mem_store |
or al,al |
jnz invalid_operand_size |
pm_mem_store: |
call store_instruction |
jmp instruction_assembled |
pm_reg: |
lods byte [esi] |
call convert_register |
mov bl,al |
cmp ah,2 |
jne invalid_operand_size |
call store_nomem_instruction |
jmp instruction_assembled |
pm_store_word_instruction: |
mov ah,al |
shr ah,4 |
and al,111b |
mov [base_code],0Fh |
mov [extended_code],ah |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne pm_mem |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
call operand_autodetect |
call store_nomem_instruction |
jmp instruction_assembled |
lgdt_instruction: |
mov [base_code],0Fh |
mov [extended_code],1 |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,6 |
je lgdt_mem_48bit |
cmp al,10 |
je lgdt_mem_80bit |
or al,al |
jnz invalid_operand_size |
cmp [code_type],64 |
je lgdt_mem_80bit |
lgdt_mem_48bit: |
cmp [code_type],64 |
je illegal_instruction |
call store_instruction |
jmp instruction_assembled |
lgdt_mem_80bit: |
cmp [code_type],64 |
jne illegal_instruction |
call store_instruction |
jmp instruction_assembled |
lar_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
xor al,al |
xchg al,[operand_size] |
call operand_autodetect |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je lar_reg_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz lar_reg_mem |
cmp al,2 |
jne invalid_operand_size |
lar_reg_mem: |
call store_instruction |
jmp instruction_assembled |
lar_reg_reg: |
lods byte [esi] |
call convert_register |
cmp ah,2 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
invlpg_instruction: |
mov [base_code],0Fh |
mov [extended_code],1 |
mov [postbyte_register],7 |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
call store_instruction |
jmp instruction_assembled |
swapgs_instruction: |
mov [base_code],0Fh |
mov [extended_code],1 |
mov [postbyte_register],7 |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
|
basic_486_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je basic_486_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
push edx bx cx |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
pop cx bx edx |
mov al,ah |
cmp al,1 |
je basic_486_mem_reg_8bit |
call operand_autodetect |
inc [extended_code] |
basic_486_mem_reg_8bit: |
call store_instruction |
jmp instruction_assembled |
basic_486_reg: |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,[postbyte_register] |
mov [postbyte_register],al |
mov al,ah |
cmp al,1 |
je basic_486_reg_reg_8bit |
call operand_autodetect |
inc [extended_code] |
basic_486_reg_reg_8bit: |
call store_nomem_instruction |
jmp instruction_assembled |
bswap_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
add al,0C8h |
mov [extended_code],al |
mov [base_code],0Fh |
cmp ah,8 |
je bswap_reg64 |
cmp ah,4 |
jne invalid_operand_size |
call operand_32bit |
call store_instruction_code |
jmp instruction_assembled |
bswap_reg64: |
call operand_64bit |
call store_instruction_code |
jmp instruction_assembled |
cmpxchgx_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C7h |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov ah,1 |
xchg [postbyte_register],ah |
mov al,[operand_size] |
or al,al |
jz cmpxchgx_size_ok |
cmp al,ah |
jne invalid_operand_size |
cmpxchgx_size_ok: |
cmp ah,16 |
jne cmpxchgx_store |
call operand_64bit |
cmpxchgx_store: |
call store_instruction |
jmp instruction_assembled |
|
basic_fpu_instruction: |
mov [postbyte_register],al |
mov [base_code],0D8h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je basic_fpu_streg |
cmp al,'[' |
je basic_fpu_mem |
dec esi |
mov ah,[postbyte_register] |
cmp ah,2 |
jb invalid_operand |
cmp ah,3 |
ja invalid_operand |
mov bl,1 |
call store_nomem_instruction |
jmp instruction_assembled |
basic_fpu_mem: |
call get_address |
mov al,[operand_size] |
cmp al,4 |
je basic_fpu_mem_32bit |
cmp al,8 |
je basic_fpu_mem_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne basic_fpu_mem_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
basic_fpu_mem_32bit: |
call store_instruction |
jmp instruction_assembled |
basic_fpu_mem_64bit: |
mov [base_code],0DCh |
call store_instruction |
jmp instruction_assembled |
basic_fpu_streg: |
lods byte [esi] |
call convert_fpu_register |
mov bl,al |
mov ah,[postbyte_register] |
cmp ah,2 |
je basic_fpu_single_streg |
cmp ah,3 |
je basic_fpu_single_streg |
or al,al |
jz basic_fpu_st0 |
test ah,110b |
jz basic_fpu_streg_st0 |
xor [postbyte_register],1 |
basic_fpu_streg_st0: |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_fpu_register |
or al,al |
jnz invalid_operand |
mov [base_code],0DCh |
call store_nomem_instruction |
jmp instruction_assembled |
basic_fpu_st0: |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_fpu_register |
mov bl,al |
basic_fpu_single_streg: |
mov [base_code],0D8h |
call store_nomem_instruction |
jmp instruction_assembled |
simple_fpu_instruction: |
mov ah,al |
or ah,11000000b |
mov al,0D9h |
stos word [edi] |
jmp instruction_assembled |
fi_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,2 |
je fi_mem_16bit |
cmp al,4 |
je fi_mem_32bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne fi_mem_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
fi_mem_32bit: |
mov [base_code],0DAh |
call store_instruction |
jmp instruction_assembled |
fi_mem_16bit: |
mov [base_code],0DEh |
call store_instruction |
jmp instruction_assembled |
fld_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je fld_streg |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,4 |
je fld_mem_32bit |
cmp al,8 |
je fld_mem_64bit |
cmp al,10 |
je fld_mem_80bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne fld_mem_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
fld_mem_32bit: |
mov [base_code],0D9h |
call store_instruction |
jmp instruction_assembled |
fld_mem_64bit: |
mov [base_code],0DDh |
call store_instruction |
jmp instruction_assembled |
fld_mem_80bit: |
mov al,[postbyte_register] |
cmp al,0 |
je fld_mem_80bit_store |
dec [postbyte_register] |
cmp al,3 |
je fld_mem_80bit_store |
jmp invalid_operand_size |
fld_mem_80bit_store: |
add [postbyte_register],5 |
mov [base_code],0DBh |
call store_instruction |
jmp instruction_assembled |
fld_streg: |
lods byte [esi] |
call convert_fpu_register |
mov bl,al |
cmp [postbyte_register],2 |
jae fst_streg |
mov [base_code],0D9h |
call store_nomem_instruction |
jmp instruction_assembled |
fst_streg: |
mov [base_code],0DDh |
call store_nomem_instruction |
jmp instruction_assembled |
fild_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
cmp al,2 |
je fild_mem_16bit |
cmp al,4 |
je fild_mem_32bit |
cmp al,8 |
je fild_mem_64bit |
or al,al |
jnz invalid_operand_size |
cmp [error_line],0 |
jne fild_mem_32bit |
mov eax,[current_line] |
mov [error_line],eax |
mov [error],operand_size_not_specified |
fild_mem_32bit: |
mov [base_code],0DBh |
call store_instruction |
jmp instruction_assembled |
fild_mem_16bit: |
mov [base_code],0DFh |
call store_instruction |
jmp instruction_assembled |
fild_mem_64bit: |
mov al,[postbyte_register] |
cmp al,1 |
je fisttp_64bit_store |
jb fild_mem_64bit_store |
dec [postbyte_register] |
cmp al,3 |
je fild_mem_64bit_store |
jmp invalid_operand_size |
fild_mem_64bit_store: |
add [postbyte_register],5 |
mov [base_code],0DFh |
call store_instruction |
jmp instruction_assembled |
fisttp_64bit_store: |
mov [base_code],0DDh |
call store_instruction |
jmp instruction_assembled |
fbld_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz fbld_mem_80bit |
cmp al,10 |
je fbld_mem_80bit |
jmp invalid_operand_size |
fbld_mem_80bit: |
mov [base_code],0DFh |
call store_instruction |
jmp instruction_assembled |
faddp_instruction: |
mov [postbyte_register],al |
mov [base_code],0DEh |
mov edx,esi |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je faddp_streg |
mov esi,edx |
mov bl,1 |
call store_nomem_instruction |
jmp instruction_assembled |
faddp_streg: |
lods byte [esi] |
call convert_fpu_register |
mov bl,al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_fpu_register |
or al,al |
jnz invalid_operand |
call store_nomem_instruction |
jmp instruction_assembled |
fcompp_instruction: |
mov ax,0D9DEh |
stos word [edi] |
jmp instruction_assembled |
fucompp_instruction: |
mov ax,0E9DAh |
stos word [edi] |
jmp instruction_assembled |
fxch_instruction: |
mov dx,01D9h |
jmp fpu_single_operand |
ffreep_instruction: |
mov dx,00DFh |
jmp fpu_single_operand |
ffree_instruction: |
mov dl,0DDh |
mov dh,al |
fpu_single_operand: |
mov ebx,esi |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je fpu_streg |
or dh,dh |
jz invalid_operand |
mov esi,ebx |
shl dh,3 |
or dh,11000001b |
mov ax,dx |
stos word [edi] |
jmp instruction_assembled |
fpu_streg: |
lods byte [esi] |
call convert_fpu_register |
shl dh,3 |
or dh,al |
or dh,11000000b |
mov ax,dx |
stos word [edi] |
jmp instruction_assembled |
fstenv_instruction: |
mov byte [edi],9Bh |
inc edi |
fldenv_instruction: |
mov [base_code],0D9h |
jmp fpu_mem |
fsave_instruction: |
mov byte [edi],9Bh |
inc edi |
fnsave_instruction: |
mov [base_code],0DDh |
fpu_mem: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],0 |
jne invalid_operand_size |
call store_instruction |
jmp instruction_assembled |
fstcw_instruction: |
mov byte [edi],9Bh |
inc edi |
fldcw_instruction: |
mov [postbyte_register],al |
mov [base_code],0D9h |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz fldcw_mem_16bit |
cmp al,2 |
je fldcw_mem_16bit |
jmp invalid_operand_size |
fldcw_mem_16bit: |
call store_instruction |
jmp instruction_assembled |
fstsw_instruction: |
mov al,9Bh |
stos byte [edi] |
fnstsw_instruction: |
mov [base_code],0DDh |
mov [postbyte_register],7 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je fstsw_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz fstsw_mem_16bit |
cmp al,2 |
je fstsw_mem_16bit |
jmp invalid_operand_size |
fstsw_mem_16bit: |
call store_instruction |
jmp instruction_assembled |
fstsw_reg: |
lods byte [esi] |
call convert_register |
cmp ax,0200h |
jne invalid_operand |
mov ax,0E0DFh |
stos word [edi] |
jmp instruction_assembled |
finit_instruction: |
mov byte [edi],9Bh |
inc edi |
fninit_instruction: |
mov ah,al |
mov al,0DBh |
stos word [edi] |
jmp instruction_assembled |
fcmov_instruction: |
mov dh,0DAh |
jmp fcomi_streg |
fcomi_instruction: |
mov dh,0DBh |
jmp fcomi_streg |
fcomip_instruction: |
mov dh,0DFh |
fcomi_streg: |
mov dl,al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_fpu_register |
mov ah,al |
cmp byte [esi],',' |
je fcomi_st0_streg |
add ah,dl |
mov al,dh |
stos word [edi] |
jmp instruction_assembled |
fcomi_st0_streg: |
or ah,ah |
jnz invalid_operand |
inc esi |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_fpu_register |
mov ah,al |
add ah,dl |
mov al,dh |
stos word [edi] |
jmp instruction_assembled |
|
mmx_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
call make_mmx_prefix |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je mmx_mmreg_mmreg |
cmp al,'[' |
jne invalid_operand |
mmx_mmreg_mem: |
call get_address |
call store_instruction |
jmp instruction_assembled |
mmx_mmreg_mmreg: |
lods byte [esi] |
call convert_mmx_register |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
mmx_ps_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
call make_mmx_prefix |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je mmx_mmreg_mmreg |
cmp al,'(' |
je mmx_ps_mmreg_imm8 |
cmp al,'[' |
je mmx_mmreg_mem |
jmp invalid_operand |
mmx_ps_mmreg_imm8: |
call get_byte_value |
mov byte [value],al |
test [operand_size],not 1 |
jnz invalid_value |
mov bl,[extended_code] |
mov al,bl |
shr bl,4 |
and al,1111b |
add al,70h |
mov [extended_code],al |
sub bl,0Ch |
shl bl,1 |
xchg bl,[postbyte_register] |
call store_nomem_instruction |
mov al,byte [value] |
stos byte [edi] |
jmp instruction_assembled |
pextrw_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ah,4 |
jnz invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
mov bl,al |
call make_mmx_prefix |
cmp [extended_code],0C5h |
je mmx_nomem_imm8 |
call store_nomem_instruction |
jmp instruction_assembled |
mmx_imm8: |
push bx cx edx |
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 |
mov byte [value],al |
pop edx cx bx |
call store_instruction_with_imm8 |
jmp instruction_assembled |
mmx_nomem_imm8: |
call store_nomem_instruction |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
test ah,not 1 |
jnz invalid_operand_size |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
stosb |
jmp instruction_assembled |
pinsrw_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
call make_mmx_prefix |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je pinsrw_mmreg_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],0 |
je mmx_imm8 |
cmp [operand_size],2 |
jne invalid_operand_size |
jmp mmx_imm8 |
pinsrw_mmreg_reg: |
lods byte [esi] |
call convert_register |
cmp ah,4 |
jne invalid_operand_size |
mov bl,al |
jmp mmx_nomem_imm8 |
pshufw_instruction: |
mov [mmx_size],8 |
mov [operand_prefix],al |
jmp pshuf_instruction |
pshufd_instruction: |
mov [mmx_size],16 |
mov [operand_prefix],al |
pshuf_instruction: |
mov [base_code],0Fh |
mov [extended_code],70h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,[mmx_size] |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je pshuf_mmreg_mmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
jmp mmx_imm8 |
pshuf_mmreg_mmreg: |
lods byte [esi] |
call convert_mmx_register |
mov bl,al |
jmp mmx_nomem_imm8 |
movd_instruction: |
mov [base_code],0Fh |
mov [extended_code],7Eh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movd_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
test [operand_size],not 4 |
jnz invalid_operand_size |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
call make_mmx_prefix |
mov [postbyte_register],al |
call store_instruction |
jmp instruction_assembled |
movd_reg: |
lods byte [esi] |
cmp al,0B0h |
jae movd_mmreg |
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] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
mov [postbyte_register],al |
call make_mmx_prefix |
call store_nomem_instruction |
jmp instruction_assembled |
movd_mmreg: |
mov [extended_code],6Eh |
call convert_mmx_register |
call make_mmx_prefix |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movd_mmreg_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
test [operand_size],not 4 |
jnz invalid_operand_size |
call store_instruction |
jmp instruction_assembled |
movd_mmreg_reg: |
lods byte [esi] |
call convert_register |
cmp ah,4 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
make_mmx_prefix: |
cmp [operand_size],16 |
jne no_mmx_prefix |
mov [operand_prefix],66h |
no_mmx_prefix: |
ret |
movq_instruction: |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movq_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
test [operand_size],not 8 |
jnz invalid_operand_size |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
mov [postbyte_register],al |
cmp ah,16 |
je movq_mem_xmmreg |
mov [extended_code],7Fh |
call store_instruction |
jmp instruction_assembled |
movq_mem_xmmreg: |
mov [extended_code],0D6h |
mov [operand_prefix],66h |
call store_instruction |
jmp instruction_assembled |
movq_reg: |
lods byte [esi] |
cmp al,0B0h |
jae movq_mmreg |
call convert_register |
cmp ah,8 |
jne invalid_operand_size |
mov [operand_size],0 |
mov bl,al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
mov [postbyte_register],al |
call make_mmx_prefix |
mov [extended_code],7Eh |
call operand_64bit |
call store_nomem_instruction |
jmp instruction_assembled |
movq_mmreg: |
call convert_mmx_register |
mov [postbyte_register],al |
mov [extended_code],6Fh |
cmp ah,16 |
jne movq_mmreg_ |
mov [extended_code],7Eh |
mov [operand_prefix],0F3h |
movq_mmreg_: |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movq_mmreg_reg |
call get_address |
test [operand_size],not 8 |
jnz invalid_operand_size |
call store_instruction |
jmp instruction_assembled |
movq_mmreg_reg: |
lods byte [esi] |
cmp al,0B0h |
jae movq_mmreg_mmreg |
mov [operand_size],0 |
call convert_register |
cmp ah,8 |
jne invalid_operand_size |
mov [extended_code],6Eh |
mov [operand_prefix],0 |
mov bl,al |
call make_mmx_prefix |
call operand_64bit |
call store_nomem_instruction |
jmp instruction_assembled |
movq_mmreg_mmreg: |
call convert_mmx_register |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
movdq_instruction: |
mov [operand_prefix],al |
mov [base_code],0Fh |
mov [extended_code],6Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movdq_mmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [extended_code],7Fh |
call store_instruction |
jmp instruction_assembled |
movdq_mmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je movdq_mmreg_mmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
call store_instruction |
jmp instruction_assembled |
movdq_mmreg_mmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
lddqu_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
push eax |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
pop eax |
mov [postbyte_register],al |
mov [operand_prefix],0F2h |
mov [base_code],0Fh |
mov [extended_code],0F0h |
call store_instruction |
jmp instruction_assembled |
movq2dq_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov bl,al |
mov [operand_prefix],0F3h |
mov [base_code],0Fh |
mov [extended_code],0D6h |
call store_nomem_instruction |
jmp instruction_assembled |
movdq2q_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
mov [operand_prefix],0F2h |
mov [base_code],0Fh |
mov [extended_code],0D6h |
call store_nomem_instruction |
jmp instruction_assembled |
|
sse_ps_instruction: |
mov [mmx_size],16 |
jmp sse_instruction |
sse_pd_instruction: |
mov [mmx_size],16 |
mov [operand_prefix],66h |
jmp sse_instruction |
sse_ss_instruction: |
mov [mmx_size],4 |
mov [operand_prefix],0F3h |
jmp sse_instruction |
sse_sd_instruction: |
mov [mmx_size],8 |
mov [operand_prefix],0F2h |
jmp sse_instruction |
comiss_instruction: |
mov [mmx_size],4 |
jmp sse_instruction |
comisd_instruction: |
mov [mmx_size],8 |
mov [operand_prefix],66h |
jmp sse_instruction |
cvtps2pd_instruction: |
mov [mmx_size],8 |
jmp sse_instruction |
cvtpd2dq_instruction: |
mov [mmx_size],16 |
mov [operand_prefix],0F2h |
jmp sse_instruction |
cvtdq2pd_instruction: |
mov [mmx_size],16 |
mov [operand_prefix],0F3h |
sse_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
sse_xmmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
sse_reg: |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je sse_xmmreg_xmmreg |
sse_reg_mem: |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],0 |
je sse_mem_size_ok |
mov al,[mmx_size] |
cmp [operand_size],al |
jne invalid_operand_size |
sse_mem_size_ok: |
cmp [extended_code],0C6h |
je mmx_imm8 |
call store_instruction |
jmp instruction_assembled |
sse_xmmreg_xmmreg: |
cmp [operand_prefix],66h |
jne sse_xmmreg_xmmreg_ok |
cmp [extended_code],12h |
je invalid_operand |
cmp [extended_code],16h |
je invalid_operand |
sse_xmmreg_xmmreg_ok: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
cmp [extended_code],0C6h |
je mmx_nomem_imm8 |
call store_nomem_instruction |
jmp instruction_assembled |
ps_dq_instruction: |
mov [postbyte_register],al |
mov [operand_prefix],66h |
mov [base_code],0Fh |
mov [extended_code],73h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
jmp mmx_nomem_imm8 |
movpd_instruction: |
mov [operand_prefix],66h |
movps_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
mov [mmx_size],16 |
jmp sse_mov_instruction |
movss_instruction: |
mov [mmx_size],4 |
mov [operand_prefix],0F3h |
jmp sse_movs |
movsd_instruction: |
mov al,0A5h |
mov ah,[esi] |
or ah,ah |
jz simple_instruction_32bit |
cmp ah,0Fh |
je simple_instruction_32bit |
mov [mmx_size],8 |
mov [operand_prefix],0F2h |
sse_movs: |
mov [base_code],0Fh |
mov [extended_code],10h |
jmp sse_mov_instruction |
sse_mov_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je sse_xmmreg |
sse_mem: |
cmp al,'[' |
jne invalid_operand |
inc [extended_code] |
call get_address |
cmp [operand_size],0 |
je sse_mem_xmmreg |
mov al,[mmx_size] |
cmp [operand_size],al |
jne invalid_operand_size |
mov [operand_size],0 |
sse_mem_xmmreg: |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
call store_instruction |
jmp instruction_assembled |
movlpd_instruction: |
mov [operand_prefix],66h |
movlps_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
mov [mmx_size],8 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne sse_mem |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
jmp sse_reg_mem |
movhlps_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
mov [mmx_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je sse_xmmreg_xmmreg_ok |
jmp invalid_operand |
maskmovq_instruction: |
mov cl,8 |
jmp maskmov_instruction |
maskmovdqu_instruction: |
mov cl,16 |
mov [operand_prefix],66h |
maskmov_instruction: |
mov [base_code],0Fh |
mov [extended_code],0F7h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,cl |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
movmskpd_instruction: |
mov [operand_prefix],66h |
movmskps_instruction: |
mov [base_code],0Fh |
mov [extended_code],50h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ah,4 |
jne invalid_operand_size |
mov [operand_size],0 |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
cmppd_instruction: |
mov [operand_prefix],66h |
cmpps_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C2h |
mov [mmx_size],16 |
mov byte [value],-1 |
jmp sse_cmp_instruction |
cmp_pd_instruction: |
mov [operand_prefix],66h |
cmp_ps_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C2h |
mov [mmx_size],16 |
mov byte [value],al |
jmp sse_cmp_instruction |
cmpss_instruction: |
mov [mmx_size],4 |
mov [operand_prefix],0F3h |
jmp cmpsx_instruction |
cmpsd_instruction: |
mov al,0A7h |
mov ah,[esi] |
or ah,ah |
jz simple_instruction_32bit |
cmp ah,0Fh |
je simple_instruction_32bit |
mov [mmx_size],8 |
mov [operand_prefix],0F2h |
cmpsx_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C2h |
mov byte [value],-1 |
jmp sse_cmp_instruction |
cmp_ss_instruction: |
mov [mmx_size],4 |
mov [operand_prefix],0F3h |
jmp cmp_sx_instruction |
cmp_sd_instruction: |
mov [mmx_size],8 |
mov [operand_prefix],0F2h |
cmp_sx_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C2h |
mov byte [value],al |
sse_cmp_instruction: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
mov [operand_size],0 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je sse_cmp_xmmreg_xmmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz sse_cmp_size_ok |
cmp al,[mmx_size] |
jne invalid_operand_size |
sse_cmp_size_ok: |
push bx cx edx |
call get_nextbyte |
pop edx cx bx |
call store_instruction_with_imm8 |
jmp instruction_assembled |
sse_cmp_xmmreg_xmmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
call get_nextbyte |
mov al,byte [value] |
stos byte [edi] |
jmp instruction_assembled |
get_nextbyte: |
cmp byte [value],-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 |
cmp al,7 |
ja invalid_value |
mov byte [value],al |
nextbyte_ok: |
ret |
cvtpi2pd_instruction: |
mov [operand_prefix],66h |
cvtpi2ps_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je cvtpi_xmmreg_xmmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],0 |
je cvtpi_size_ok |
cmp [operand_size],8 |
jne invalid_operand_size |
cvtpi_size_ok: |
call store_instruction |
jmp instruction_assembled |
cvtpi_xmmreg_xmmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
cvtsi2ss_instruction: |
mov [operand_prefix],0F3h |
jmp cvtsi_instruction |
cvtsi2sd_instruction: |
mov [operand_prefix],0F2h |
cvtsi_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je cvtsi_xmmreg_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
cmp [operand_size],0 |
je cvtsi_size_ok |
cmp [operand_size],4 |
jne invalid_operand_size |
cvtsi_size_ok: |
call store_instruction |
jmp instruction_assembled |
cvtsi_xmmreg_reg: |
lods byte [esi] |
call convert_register |
cmp ah,4 |
je cvtsi_xmmreg_reg_store |
cmp ah,8 |
jne invalid_operand_size |
call operand_64bit |
cvtsi_xmmreg_reg_store: |
mov bl,al |
call store_nomem_instruction |
jmp instruction_assembled |
cvtps2pi_instruction: |
mov [mmx_size],8 |
jmp cvtpd_instruction |
cvtpd2pi_instruction: |
mov [operand_prefix],66h |
mov [mmx_size],16 |
cvtpd_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov [operand_size],0 |
jmp sse_reg |
cvtss2si_instruction: |
mov [operand_prefix],0F3h |
mov [mmx_size],4 |
jmp cvt2si_instruction |
cvtsd2si_instruction: |
mov [operand_prefix],0F2h |
mov [mmx_size],8 |
cvt2si_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [operand_size],0 |
cmp ah,4 |
je sse_reg |
cmp ah,8 |
jne invalid_operand_size |
call operand_64bit |
jmp sse_reg |
amd3dnow_instruction: |
mov [base_code],0Fh |
mov [extended_code],0Fh |
mov byte [value],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je amd3dnow_mmreg_mmreg |
cmp al,'[' |
jne invalid_operand |
call get_address |
call store_instruction_with_imm8 |
jmp instruction_assembled |
amd3dnow_mmreg_mmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
jne invalid_operand_size |
mov bl,al |
call store_nomem_instruction |
mov al,byte [value] |
stos byte [edi] |
jmp instruction_assembled |
|
fxsave_instruction: |
mov [extended_code],0AEh |
mov [base_code],0Fh |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov ah,[operand_size] |
or ah,ah |
jz fxsave_size_ok |
mov al,[postbyte_register] |
cmp al,111b |
je clflush_size_check |
cmp al,10b |
jb invalid_operand_size |
cmp al,11b |
ja invalid_operand_size |
cmp ah,4 |
jne invalid_operand_size |
jmp fxsave_size_ok |
clflush_size_check: |
cmp ah,1 |
jne invalid_operand_size |
fxsave_size_ok: |
call store_instruction |
jmp instruction_assembled |
prefetch_instruction: |
mov [extended_code],18h |
prefetch_mem_8bit: |
mov [base_code],0Fh |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
or ah,ah |
jz prefetch_size_ok |
cmp ah,1 |
jne invalid_operand_size |
prefetch_size_ok: |
call get_address |
call store_instruction |
jmp instruction_assembled |
amd_prefetch_instruction: |
mov [extended_code],0Dh |
jmp prefetch_mem_8bit |
fence_instruction: |
mov bl,al |
mov ax,0AE0Fh |
stos word [edi] |
mov al,bl |
stos byte [edi] |
jmp instruction_assembled |
pause_instruction: |
mov ax,90F3h |
stos word [edi] |
jmp instruction_assembled |
movntq_instruction: |
mov [mmx_size],8 |
jmp movnt_instruction |
movntps_instruction: |
mov [mmx_size],16 |
jmp movnt_instruction |
movntdq_instruction: |
mov [operand_prefix],66h |
mov [mmx_size],16 |
movnt_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,[mmx_size] |
jne invalid_operand_size |
mov [postbyte_register],al |
call store_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] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ah,4 |
je movnti_store |
cmp ah,8 |
jne invalid_operand_size |
call operand_64bit |
movnti_store: |
mov [postbyte_register],al |
call store_instruction |
jmp instruction_assembled |
monitor_instruction: |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ax,0400h |
jne invalid_operand |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ax,0401h |
jne invalid_operand |
cmp [postbyte_register],0C8h |
jne monitor_instruction_store |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
cmp ax,0402h |
jne invalid_operand |
monitor_instruction_store: |
mov ax,010Fh |
stos word [edi] |
mov al,[postbyte_register] |
stos byte [edi] |
jmp instruction_assembled |
|
simple_vmx_instruction: |
mov ah,al |
mov al,0Fh |
stos byte [edi] |
mov al,1 |
stos word [edi] |
jmp instruction_assembled |
vmclear_instruction: |
mov [operand_prefix],66h |
jmp vmx_instruction |
vmxon_instruction: |
mov [operand_prefix],0F3h |
vmx_instruction: |
mov [postbyte_register],al |
mov [extended_code],0C7h |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
mov al,[operand_size] |
or al,al |
jz vmx_size_ok |
cmp al,8 |
jne invalid_operand_size |
vmx_size_ok: |
mov [base_code],0Fh |
call store_instruction |
jmp instruction_assembled |
vmread_instruction: |
mov [extended_code],78h |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
vmread_check_size: |
cmp [code_type],64 |
je vmread_long |
cmp [operand_size],4 |
je vmx_size_ok |
jmp invalid_operand_size |
vmread_long: |
cmp [operand_size],8 |
je vmx_size_ok |
jmp invalid_operand_size |
vmwrite_instruction: |
mov [extended_code],79h |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
cmp al,'[' |
jne invalid_operand |
call get_address |
jmp vmread_check_size |
|
convert_register: |
mov ah,al |
shr ah,4 |
and al,0Fh |
cmp ah,8 |
je match_register_size |
cmp ah,4 |
ja invalid_operand |
cmp ah,1 |
ja match_register_size |
cmp al,4 |
jb match_register_size |
or ah,ah |
jz high_byte_register |
or [rex_prefix],40h |
match_register_size: |
cmp ah,[operand_size] |
je register_size_ok |
cmp [operand_size],0 |
jne operand_sizes_do_not_match |
mov [operand_size],ah |
register_size_ok: |
ret |
high_byte_register: |
mov ah,1 |
or [rex_prefix],80h |
jmp match_register_size |
convert_fpu_register: |
mov ah,al |
shr ah,4 |
and al,111b |
cmp ah,10 |
jne invalid_operand |
jmp match_register_size |
convert_mmx_register: |
mov ah,al |
shr ah,4 |
cmp ah,0Ch |
je xmm_register |
ja invalid_operand |
and al,111b |
cmp ah,0Bh |
jne invalid_operand |
mov ah,8 |
jmp match_register_size |
xmm_register: |
and al,0Fh |
mov ah,16 |
cmp al,8 |
jb match_register_size |
cmp [code_type],64 |
jne invalid_operand |
jmp match_register_size |
get_size_operator: |
xor ah,ah |
cmp al,11h |
jne no_size_operator |
mov [size_declared],1 |
lods word [esi] |
xchg al,ah |
mov [size_override],1 |
cmp ah,[operand_size] |
je size_operator_ok |
cmp [operand_size],0 |
jne operand_sizes_do_not_match |
mov [operand_size],ah |
size_operator_ok: |
ret |
no_size_operator: |
mov [size_declared],0 |
cmp al,'[' |
jne size_operator_ok |
mov [size_override],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 |
get_address: |
mov [segment_register],0 |
mov [address_size],0 |
mov al,[code_type] |
shr al,3 |
mov [value_size],al |
mov al,[esi] |
and al,11110000b |
cmp al,60h |
jne get_size_prefix |
lods byte [esi] |
sub al,60h |
mov [segment_register],al |
mov al,[esi] |
and al,11110000b |
get_size_prefix: |
cmp al,70h |
jne address_size_prefix_ok |
lods byte [esi] |
sub al,70h |
cmp al,2 |
jb invalid_address_size |
cmp al,8 |
ja invalid_address_size |
mov [address_size],al |
mov [value_size],al |
address_size_prefix_ok: |
call calculate_address |
mov [address_high],edx |
mov edx,eax |
cmp [code_type],64 |
jne address_ok |
or bx,bx |
jnz address_ok |
test ch,0Fh |
jnz address_ok |
calculate_relative_address: |
call calculate_relative_offset |
mov [address_high],edx |
mov edx,[symbol_identifier] |
mov [address_symbol],edx |
mov edx,eax |
mov ch,[value_type] |
mov bx,0FF00h |
xor cl,cl |
address_ok: |
ret |
|
operand_16bit: |
cmp [code_type],16 |
je size_prefix_ok |
mov [operand_prefix],66h |
ret |
operand_32bit: |
cmp [code_type],16 |
jne size_prefix_ok |
mov [operand_prefix],66h |
size_prefix_ok: |
ret |
operand_64bit: |
cmp [code_type],64 |
jne invalid_operand_size |
or [rex_prefix],48h |
ret |
operand_autodetect: |
cmp al,2 |
je operand_16bit |
cmp al,4 |
je operand_32bit |
cmp al,8 |
je operand_64bit |
jmp invalid_operand_size |
store_segment_prefix_if_necessary: |
mov al,[segment_register] |
or al,al |
jz segment_prefix_ok |
cmp al,3 |
je ss_prefix |
cmp al,4 |
ja segment_prefix_386 |
jb segment_prefix_86 |
cmp bl,25h |
je segment_prefix_86 |
cmp bh,25h |
je segment_prefix_86 |
cmp bh,45h |
je segment_prefix_86 |
cmp bh,44h |
je segment_prefix_86 |
ret |
ss_prefix: |
cmp bl,25h |
je segment_prefix_ok |
cmp bh,25h |
je segment_prefix_ok |
cmp bh,45h |
je segment_prefix_ok |
cmp bh,44h |
je segment_prefix_ok |
jmp segment_prefix_86 |
store_segment_prefix: |
mov al,[segment_register] |
or al,al |
jz segment_prefix_ok |
cmp al,5 |
jae segment_prefix_386 |
segment_prefix_86: |
dec al |
shl al,3 |
add al,26h |
stos byte [edi] |
jmp segment_prefix_ok |
segment_prefix_386: |
add al,64h-5 |
stos byte [edi] |
segment_prefix_ok: |
ret |
store_instruction_code: |
mov al,[operand_prefix] |
or al,al |
jz operand_prefix_ok |
stos byte [edi] |
operand_prefix_ok: |
mov al,[rex_prefix] |
test al,40h |
jz rex_prefix_ok |
cmp [code_type],64 |
jne invalid_operand |
test al,0B0h |
jnz prefix_conflict |
stos byte [edi] |
rex_prefix_ok: |
mov al,[base_code] |
stos byte [edi] |
cmp al,0Fh |
jne instruction_code_ok |
store_extended_code: |
mov al,[extended_code] |
stos byte [edi] |
instruction_code_ok: |
ret |
store_nomem_instruction: |
test [postbyte_register],1000b |
jz nomem_reg_code_ok |
or [rex_prefix],44h |
and [postbyte_register],111b |
nomem_reg_code_ok: |
test bl,1000b |
jz nomem_rm_code_ok |
or [rex_prefix],41h |
and bl,111b |
nomem_rm_code_ok: |
call store_instruction_code |
mov al,[postbyte_register] |
shl al,3 |
or al,bl |
or al,11000000b |
stos byte [edi] |
ret |
store_instruction: |
mov [current_offset],edi |
test [postbyte_register],1000b |
jz reg_code_ok |
or [rex_prefix],44h |
and [postbyte_register],111b |
reg_code_ok: |
call store_segment_prefix_if_necessary |
or bx,bx |
jz address_immediate |
cmp bx,0F000h |
je address_rip_based |
cmp bx,0FF00h |
je address_relative |
mov al,bl |
or al,bh |
and al,11110000b |
cmp al,80h |
je postbyte_64bit |
cmp al,40h |
je postbyte_32bit |
cmp al,20h |
jne invalid_address |
cmp [code_type],64 |
je invalid_address_size |
call address_16bit_prefix |
call store_instruction_code |
cmp bx,2326h |
je address_bx_si |
cmp bx,2623h |
je address_bx_si |
cmp bx,2327h |
je address_bx_di |
cmp bx,2723h |
je address_bx_di |
cmp bx,2526h |
je address_bp_si |
cmp bx,2625h |
je address_bp_si |
cmp bx,2527h |
je address_bp_di |
cmp bx,2725h |
je address_bp_di |
cmp bx,2600h |
je address_si |
cmp bx,2700h |
je address_di |
cmp bx,2300h |
je address_bx |
cmp bx,2500h |
je address_bp |
jmp invalid_address |
address_bx_si: |
xor al,al |
jmp postbyte_16bit |
address_bx_di: |
mov al,1 |
jmp postbyte_16bit |
address_bp_si: |
mov al,10b |
jmp postbyte_16bit |
address_bp_di: |
mov al,11b |
jmp postbyte_16bit |
address_si: |
mov al,100b |
jmp postbyte_16bit |
address_di: |
mov al,101b |
jmp postbyte_16bit |
address_bx: |
mov al,111b |
jmp postbyte_16bit |
address_bp: |
mov al,110b |
postbyte_16bit: |
test ch,22h |
jnz address_16bit_value |
or ch,ch |
jnz address_sizes_do_not_agree |
cmp edx,10000h |
jge value_out_of_range |
cmp edx,-8000h |
jl value_out_of_range |
or dx,dx |
jz address |
cmp dx,80h |
jb address_8bit_value |
cmp dx,-80h |
jae address_8bit_value |
address_16bit_value: |
or al,10000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
mov eax,edx |
stos word [edi] |
ret |
address_8bit_value: |
or al,01000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
cmp dx,80h |
jge value_out_of_range |
cmp dx,-80h |
jl value_out_of_range |
ret |
address: |
cmp al,110b |
je address_8bit_value |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
ret |
postbyte_32bit: |
call address_32bit_prefix |
call store_instruction_code |
cmp bl,44h |
je invalid_address |
or cl,cl |
jz only_base_register |
jmp base_and_index |
postbyte_64bit: |
cmp [code_type],64 |
jne invalid_address_size |
test bh,1000b |
jz base_code_ok |
or [rex_prefix],41h |
base_code_ok: |
test bl,1000b |
jz index_code_ok |
or [rex_prefix],42h |
index_code_ok: |
call store_instruction_code |
or cl,cl |
jz only_base_register |
base_and_index: |
mov al,100b |
xor ah,ah |
cmp cl,1 |
je scale_ok |
cmp cl,2 |
je scale_1 |
cmp cl,4 |
je scale_2 |
or ah,11000000b |
jmp scale_ok |
scale_2: |
or ah,10000000b |
jmp scale_ok |
scale_1: |
or ah,01000000b |
scale_ok: |
or bh,bh |
jz only_index_register |
and bl,111b |
shl bl,3 |
or ah,bl |
and bh,111b |
or ah,bh |
test ch,44h |
jnz sib_address_32bit_value |
or ch,ch |
jnz address_sizes_do_not_agree |
cmp bh,5 |
je address_value |
or edx,edx |
jz sib_address |
address_value: |
cmp edx,80h |
jb sib_address_8bit_value |
cmp edx,-80h |
jae sib_address_8bit_value |
sib_address_32bit_value: |
or al,10000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos word [edi] |
jmp store_address_32bit_value |
sib_address_8bit_value: |
or al,01000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos word [edi] |
mov al,dl |
stos byte [edi] |
cmp edx,80h |
jge value_out_of_range |
cmp edx,-80h |
jl value_out_of_range |
ret |
sib_address: |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos word [edi] |
ret |
only_index_register: |
or ah,101b |
and bl,111b |
shl bl,3 |
or ah,bl |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos word [edi] |
test ch,44h |
jnz store_address_32bit_value |
or ch,ch |
jnz invalid_address_size |
jmp store_address_32bit_value |
zero_index_register: |
mov bl,4 |
mov cl,1 |
jmp base_and_index |
only_base_register: |
mov al,bh |
and al,111b |
cmp al,4 |
je zero_index_register |
test ch,44h |
jnz simple_address_32bit_value |
or ch,ch |
jnz address_sizes_do_not_agree |
or edx,edx |
jz simple_address |
cmp edx,80h |
jb simple_address_8bit_value |
cmp edx,-80h |
jae simple_address_8bit_value |
simple_address_32bit_value: |
or al,10000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
jmp store_address_32bit_value |
simple_address_8bit_value: |
or al,01000000b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
mov al,dl |
stos byte [edi] |
cmp edx,80h |
jge value_out_of_range |
cmp edx,-80h |
jl value_out_of_range |
ret |
simple_address: |
cmp al,5 |
je simple_address_8bit_value |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
ret |
address_immediate: |
cmp [code_type],64 |
je address_immediate_sib |
test ch,44h |
jnz address_immediate_32bit |
test ch,22h |
jnz address_immediate_16bit |
or ch,ch |
jnz invalid_address_size |
cmp [code_type],16 |
je addressing_16bit |
address_immediate_32bit: |
call address_32bit_prefix |
call store_instruction_code |
store_immediate_address: |
mov al,101b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
store_address_32bit_value: |
test ch,0F0h |
jz address_32bit_relocation_ok |
mov al,2 |
xchg [value_type],al |
mov ebx,[address_symbol] |
xchg ebx,[symbol_identifier] |
call mark_relocation |
mov [value_type],al |
mov [symbol_identifier],ebx |
address_32bit_relocation_ok: |
mov eax,edx |
stos dword [edi] |
ret |
store_address_64bit_value: |
test ch,0F0h |
jz address_64bit_relocation_ok |
mov al,4 |
xchg [value_type],al |
mov ebx,[address_symbol] |
xchg ebx,[symbol_identifier] |
call mark_relocation |
mov [value_type],al |
mov [symbol_identifier],ebx |
address_64bit_relocation_ok: |
mov eax,edx |
stos dword [edi] |
mov eax,[address_high] |
stos dword [edi] |
ret |
address_immediate_sib: |
test ch,not 44h |
jnz invalid_address_size |
call address_32bit_prefix |
call store_instruction_code |
mov al,100b |
mov ah,100101b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos word [edi] |
jmp store_address_32bit_value |
address_rip_based: |
cmp [code_type],64 |
jne invalid_address |
call store_instruction_code |
jmp store_immediate_address |
address_relative: |
call store_instruction_code |
movzx eax,[immediate_size] |
add eax,edi |
sub eax,[current_offset] |
add eax,5 |
sub edx,eax |
jo value_out_of_range |
mov al,101b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
xchg [value_type],ch |
mov ebx,[address_symbol] |
xchg ebx,[symbol_identifier] |
mov eax,edx |
call mark_relocation |
mov [value_type],ch |
mov [symbol_identifier],ebx |
stos dword [edi] |
ret |
addressing_16bit: |
cmp edx,10000h |
jge address_immediate_32bit |
cmp edx,-8000h |
jl address_immediate_32bit |
movzx edx,dx |
address_immediate_16bit: |
call address_16bit_prefix |
call store_instruction_code |
mov al,110b |
mov cl,[postbyte_register] |
shl cl,3 |
or al,cl |
stos byte [edi] |
mov eax,edx |
stos word [edi] |
cmp edx,10000h |
jge value_out_of_range |
cmp edx,-8000h |
jl value_out_of_range |
ret |
address_16bit_prefix: |
cmp [code_type],16 |
je instruction_prefix_ok |
mov al,67h |
stos byte [edi] |
ret |
address_32bit_prefix: |
cmp [code_type],32 |
je instruction_prefix_ok |
mov al,67h |
stos byte [edi] |
instruction_prefix_ok: |
ret |
store_instruction_with_imm8: |
mov [immediate_size],1 |
call store_instruction |
mov al,byte [value] |
stos byte [edi] |
ret |
store_instruction_with_imm16: |
mov [immediate_size],2 |
call store_instruction |
mov ax,word [value] |
call mark_relocation |
stos word [edi] |
ret |
store_instruction_with_imm32: |
mov [immediate_size],4 |
call store_instruction |
mov eax,dword [value] |
call mark_relocation |
stos dword [edi] |
ret |
|
address_registers: |
db 2,'bp',0,25h |
db 2,'bx',0,23h |
db 2,'di',0,27h |
db 3,'eax',0,40h |
db 3,'ebp',0,45h |
db 3,'ebx',0,43h |
db 3,'ecx',0,41h |
db 3,'edi',0,47h |
db 3,'edx',0,42h |
db 3,'esi',0,46h |
db 3,'esp',0,44h |
db 3,'r10',10h,8Ah |
db 3,'r11',10h,8Bh |
db 3,'r12',10h,8Ch |
db 3,'r13',10h,8Dh |
db 3,'r14',10h,8Eh |
db 3,'r15',10h,8Fh |
db 2,'r8',10h,88h |
db 2,'r9',10h,89h |
db 3,'rax',0,80h |
db 3,'rbp',0,85h |
db 3,'rbx',0,83h |
db 3,'rcx',0,81h |
db 3,'rdi',0,87h |
db 3,'rdx',0,82h |
db 3,'rip',0,0F0h |
db 3,'rsi',0,86h |
db 3,'rsp',0,84h |
db 2,'si',0,26h |
db 0 |
|
address_sizes: |
db 4,'byte',0,1 |
db 5,'dword',0,4 |
db 5,'qword',0,8 |
db 4,'word',0,2 |
db 0 |
|
symbols: |
db 2,'ah',10h,04h |
db 2,'al',10h,10h |
db 2,'ax',10h,20h |
db 2,'bh',10h,07h |
db 2,'bl',10h,13h |
db 2,'bp',10h,25h |
db 3,'bpl',10h,15h |
db 2,'bx',10h,23h |
db 4,'byte',11h,1 |
db 2,'ch',10h,05h |
db 2,'cl',10h,11h |
db 3,'cr0',10h,50h |
db 3,'cr1',10h,51h |
db 3,'cr2',10h,52h |
db 3,'cr3',10h,53h |
db 3,'cr4',10h,54h |
db 3,'cr5',10h,55h |
db 3,'cr6',10h,56h |
db 3,'cr7',10h,57h |
db 3,'cr8',10h,58h |
db 3,'cr9',10h,59h |
db 4,'cr10',10h,5Ah |
db 4,'cr11',10h,5Bh |
db 4,'cr12',10h,5Ch |
db 4,'cr13',10h,5Dh |
db 4,'cr14',10h,5Eh |
db 4,'cr15',10h,5Fh |
db 2,'cs',10h,62h |
db 2,'cx',10h,21h |
db 2,'dh',10h,06h |
db 2,'di',10h,27h |
db 3,'dil',10h,17h |
db 2,'dl',10h,12h |
db 6,'dqword',11h,16 |
db 3,'dr0',10h,70h |
db 3,'dr1',10h,71h |
db 3,'dr2',10h,72h |
db 3,'dr3',10h,73h |
db 3,'dr4',10h,74h |
db 3,'dr5',10h,75h |
db 3,'dr6',10h,76h |
db 3,'dr7',10h,77h |
db 3,'dr8',10h,78h |
db 3,'dr9',10h,79h |
db 4,'dr10',10h,7Ah |
db 4,'dr11',10h,7Bh |
db 4,'dr12',10h,7Ch |
db 4,'dr13',10h,7Dh |
db 4,'dr14',10h,7Eh |
db 4,'dr15',10h,7Fh |
db 2,'ds',10h,64h |
db 5,'dword',11h,4 |
db 2,'dx',10h,22h |
db 3,'eax',10h,40h |
db 3,'ebp',10h,45h |
db 3,'ebx',10h,43h |
db 3,'ecx',10h,41h |
db 3,'edi',10h,47h |
db 3,'edx',10h,42h |
db 2,'es',10h,61h |
db 3,'esi',10h,46h |
db 3,'esp',10h,44h |
db 3,'far',12h,2 |
db 2,'fs',10h,65h |
db 5,'fword',11h,6 |
db 2,'gs',10h,66h |
db 3,'mm0',10h,0B0h |
db 3,'mm1',10h,0B1h |
db 3,'mm2',10h,0B2h |
db 3,'mm3',10h,0B3h |
db 3,'mm4',10h,0B4h |
db 3,'mm5',10h,0B5h |
db 3,'mm6',10h,0B6h |
db 3,'mm7',10h,0B7h |
db 4,'near',12h,1 |
db 5,'pword',11h,6 |
db 5,'qword',11h,8 |
db 3,'r10',10h,8Ah |
db 4,'r10b',10h,1Ah |
db 4,'r10d',10h,4Ah |
db 4,'r10w',10h,2Ah |
db 3,'r11',10h,8Bh |
db 4,'r11b',10h,1Bh |
db 4,'r11d',10h,4Bh |
db 4,'r11w',10h,2Bh |
db 3,'r12',10h,8Ch |
db 4,'r12b',10h,1Ch |
db 4,'r12d',10h,4Ch |
db 4,'r12w',10h,2Ch |
db 3,'r13',10h,8Dh |
db 4,'r13b',10h,1Dh |
db 4,'r13d',10h,4Dh |
db 4,'r13w',10h,2Dh |
db 3,'r14',10h,8Eh |
db 4,'r14b',10h,1Eh |
db 4,'r14d',10h,4Eh |
db 4,'r14w',10h,2Eh |
db 3,'r15',10h,8Fh |
db 4,'r15b',10h,1Fh |
db 4,'r15d',10h,4Fh |
db 4,'r15w',10h,2Fh |
db 2,'r8',10h,88h |
db 3,'r8b',10h,18h |
db 3,'r8d',10h,48h |
db 3,'r8w',10h,28h |
db 2,'r9',10h,89h |
db 3,'r9b',10h,19h |
db 3,'r9d',10h,49h |
db 3,'r9w',10h,29h |
db 3,'rax',10h,80h |
db 3,'rbp',10h,85h |
db 3,'rbx',10h,83h |
db 3,'rcx',10h,81h |
db 3,'rdi',10h,87h |
db 3,'rdx',10h,82h |
db 3,'rsi',10h,86h |
db 3,'rsp',10h,84h |
db 2,'si',10h,26h |
db 3,'sil',10h,16h |
db 2,'sp',10h,24h |
db 3,'spl',10h,14h |
db 2,'ss',10h,63h |
db 2,'st',10h,0A0h |
db 3,'st0',10h,0A0h |
db 3,'st1',10h,0A1h |
db 3,'st2',10h,0A2h |
db 3,'st3',10h,0A3h |
db 3,'st4',10h,0A4h |
db 3,'st5',10h,0A5h |
db 3,'st6',10h,0A6h |
db 3,'st7',10h,0A7h |
db 5,'tbyte',11h,0Ah |
db 3,'tr0',10h,90h |
db 3,'tr1',10h,91h |
db 3,'tr2',10h,92h |
db 3,'tr3',10h,93h |
db 3,'tr4',10h,94h |
db 3,'tr5',10h,95h |
db 3,'tr6',10h,96h |
db 3,'tr7',10h,97h |
db 5,'tword',11h,0Ah |
db 5,'use16',13h,16 |
db 5,'use32',13h,32 |
db 5,'use64',13h,64 |
db 4,'word',11h,2 |
db 4,'xmm0',10h,0C0h |
db 4,'xmm1',10h,0C1h |
db 5,'xmm10',10h,0CAh |
db 5,'xmm11',10h,0CBh |
db 5,'xmm12',10h,0CCh |
db 5,'xmm13',10h,0CDh |
db 5,'xmm14',10h,0CEh |
db 5,'xmm15',10h,0CFh |
db 4,'xmm2',10h,0C2h |
db 4,'xmm3',10h,0C3h |
db 4,'xmm4',10h,0C4h |
db 4,'xmm5',10h,0C5h |
db 4,'xmm6',10h,0C6h |
db 4,'xmm7',10h,0C7h |
db 4,'xmm8',10h,0C8h |
db 4,'xmm9',10h,0C9h |
db 0 |
|
data_handlers: |
dw data_bytes-assembler |
dw data_file-assembler |
dw reserve_bytes-assembler |
dw data_words-assembler |
dw data_unicode-assembler |
dw reserve_words-assembler |
dw data_dwords-assembler |
dw reserve_dwords-assembler |
dw data_pwords-assembler |
dw reserve_pwords-assembler |
dw data_qwords-assembler |
dw reserve_qwords-assembler |
dw data_twords-assembler |
dw reserve_twords-assembler |
|
data_directives: |
db 2,'db',1,0 |
db 2,'dd',4,6 |
db 2,'df',6,8 |
db 2,'dp',6,8 |
db 2,'dq',8,10 |
db 2,'dt',10,12 |
db 2,'du',2,4 |
db 2,'dw',2,3 |
db 4,'file',1,1 |
db 2,'rb',1,2 |
db 2,'rd',4,7 |
db 2,'rf',6,9 |
db 2,'rp',6,9 |
db 2,'rq',8,11 |
db 2,'rt',10,13 |
db 2,'rw',2,5 |
db 0 |
|
instructions: |
dw instructions_2-instructions |
dw instructions_3-instructions |
dw instructions_4-instructions |
dw instructions_5-instructions |
dw instructions_6-instructions |
dw instructions_7-instructions |
dw instructions_8-instructions |
dw instructions_9-instructions |
dw instructions_10-instructions |
dw instructions_11-instructions |
|
instructions_2: |
db 'bt',4 |
dw bt_instruction-assembler |
db 'if',0 |
dw if_directive-assembler |
db 'in',0 |
dw in_instruction-assembler |
db 'ja',77h |
dw conditional_jump-assembler |
db 'jb',72h |
dw conditional_jump-assembler |
db 'jc',72h |
dw conditional_jump-assembler |
db 'je',74h |
dw conditional_jump-assembler |
db 'jg',7Fh |
dw conditional_jump-assembler |
db 'jl',7Ch |
dw conditional_jump-assembler |
db 'jo',70h |
dw conditional_jump-assembler |
db 'jp',7Ah |
dw conditional_jump-assembler |
db 'js',78h |
dw conditional_jump-assembler |
db 'jz',74h |
dw conditional_jump-assembler |
db 'or',08h |
dw basic_instruction-assembler |
db 0 |
instructions_3: |
db 'aaa',37h |
dw simple_instruction_except64-assembler |
db 'aad',0D5h |
dw aa_instruction-assembler |
db 'aam',0D4h |
dw aa_instruction-assembler |
db 'aas',3Fh |
dw simple_instruction_except64-assembler |
db 'adc',10h |
dw basic_instruction-assembler |
db 'add',00h |
dw basic_instruction-assembler |
db 'and',20h |
dw basic_instruction-assembler |
db 'bsf',0BCh |
dw bs_instruction-assembler |
db 'bsr',0BDh |
dw bs_instruction-assembler |
db 'btc',7 |
dw bt_instruction-assembler |
db 'btr',6 |
dw bt_instruction-assembler |
db 'bts',5 |
dw bt_instruction-assembler |
db 'cbw',98h |
dw simple_instruction_16bit-assembler |
db 'cdq',99h |
dw simple_instruction_32bit-assembler |
db 'clc',0F8h |
dw simple_instruction-assembler |
db 'cld',0FCh |
dw simple_instruction-assembler |
db 'cli',0FAh |
dw simple_instruction-assembler |
db 'cmc',0F5h |
dw simple_instruction-assembler |
db 'cmp',38h |
dw basic_instruction-assembler |
db 'cqo',99h |
dw simple_instruction_64bit-assembler |
db 'cwd',99h |
dw simple_instruction_16bit-assembler |
db 'daa',27h |
dw simple_instruction_except64-assembler |
db 'das',2Fh |
dw simple_instruction_except64-assembler |
db 'dec',1 |
dw inc_instruction-assembler |
db 'div',6 |
dw single_operand_instruction-assembler |
db 'end',0 |
dw end_directive-assembler |
db 'fld',0 |
dw fld_instruction-assembler |
db 'fst',2 |
dw fld_instruction-assembler |
db 'hlt',0F4h |
dw simple_instruction-assembler |
db 'inc',0 |
dw inc_instruction-assembler |
db 'ins',6Ch |
dw ins_instruction-assembler |
db 'int',0CDh |
dw int_instruction-assembler |
db 'jae',73h |
dw conditional_jump-assembler |
db 'jbe',76h |
dw conditional_jump-assembler |
db 'jge',7Dh |
dw conditional_jump-assembler |
db 'jle',7Eh |
dw conditional_jump-assembler |
db 'jmp',0 |
dw jmp_instruction-assembler |
db 'jna',76h |
dw conditional_jump-assembler |
db 'jnb',73h |
dw conditional_jump-assembler |
db 'jnc',73h |
dw conditional_jump-assembler |
db 'jne',75h |
dw conditional_jump-assembler |
db 'jng',7Eh |
dw conditional_jump-assembler |
db 'jnl',7Dh |
dw conditional_jump-assembler |
db 'jno',71h |
dw conditional_jump-assembler |
db 'jnp',7Bh |
dw conditional_jump-assembler |
db 'jns',79h |
dw conditional_jump-assembler |
db 'jnz',75h |
dw conditional_jump-assembler |
db 'jpe',7Ah |
dw conditional_jump-assembler |
db 'jpo',7Bh |
dw conditional_jump-assembler |
db 'lar',2 |
dw lar_instruction-assembler |
db 'lds',3 |
dw ls_instruction-assembler |
db 'lea',0 |
dw lea_instruction-assembler |
db 'les',0 |
dw ls_instruction-assembler |
db 'lfs',4 |
dw ls_instruction-assembler |
db 'lgs',5 |
dw ls_instruction-assembler |
db 'lsl',3 |
dw lar_instruction-assembler |
db 'lss',2 |
dw ls_instruction-assembler |
db 'ltr',3 |
dw pm_word_instruction-assembler |
db 'mov',0 |
dw mov_instruction-assembler |
db 'mul',4 |
dw single_operand_instruction-assembler |
db 'neg',3 |
dw single_operand_instruction-assembler |
db 'nop',90h |
dw simple_instruction-assembler |
db 'not',2 |
dw single_operand_instruction-assembler |
db 'org',0 |
dw org_directive-assembler |
db 'out',0 |
dw out_instruction-assembler |
db 'pop',0 |
dw pop_instruction-assembler |
db 'por',0EBh |
dw mmx_instruction-assembler |
db 'rcl',2 |
dw sh_instruction-assembler |
db 'rcr',3 |
dw sh_instruction-assembler |
db 'rep',0F3h |
dw prefix_instruction-assembler |
db 'ret',0C2h |
dw ret_instruction-assembler |
db 'rol',0 |
dw sh_instruction-assembler |
db 'ror',1 |
dw sh_instruction-assembler |
db 'rsm',0AAh |
dw simple_extended_instruction-assembler |
db 'sal',4 |
dw sh_instruction-assembler |
db 'sar',7 |
dw sh_instruction-assembler |
db 'sbb',18h |
dw basic_instruction-assembler |
db 'shl',4 |
dw sh_instruction-assembler |
db 'shr',5 |
dw sh_instruction-assembler |
db 'stc',0F9h |
dw simple_instruction-assembler |
db 'std',0FDh |
dw simple_instruction-assembler |
db 'sti',0FBh |
dw simple_instruction-assembler |
db 'str',1 |
dw pm_store_word_instruction-assembler |
db 'sub',28h |
dw basic_instruction-assembler |
db 'ud2',0Bh |
dw simple_extended_instruction-assembler |
db 'xor',30h |
dw basic_instruction-assembler |
db 0 |
instructions_4: |
db 'arpl',0 |
dw arpl_instruction-assembler |
db 'call',0 |
dw call_instruction-assembler |
db 'cdqe',98h |
dw simple_instruction_64bit-assembler |
db 'clts',6 |
dw simple_extended_instruction-assembler |
db 'cmps',0A6h |
dw cmps_instruction-assembler |
db 'cwde',98h |
dw simple_instruction_32bit-assembler |
db 'data',0 |
dw data_directive-assembler |
db 'else',0 |
dw else_directive-assembler |
db 'emms',77h |
dw simple_extended_instruction-assembler |
db 'fabs',100001b |
dw simple_fpu_instruction-assembler |
db 'fadd',0 |
dw basic_fpu_instruction-assembler |
db 'fbld',4 |
dw fbld_instruction-assembler |
db 'fchs',100000b |
dw simple_fpu_instruction-assembler |
db 'fcom',2 |
dw basic_fpu_instruction-assembler |
db 'fcos',111111b |
dw simple_fpu_instruction-assembler |
db 'fdiv',6 |
dw basic_fpu_instruction-assembler |
db 'feni',0E0h |
dw finit_instruction-assembler |
db 'fild',0 |
dw fild_instruction-assembler |
db 'fist',2 |
dw fild_instruction-assembler |
db 'fld1',101000b |
dw simple_fpu_instruction-assembler |
db 'fldz',101110b |
dw simple_fpu_instruction-assembler |
db 'fmul',1 |
dw basic_fpu_instruction-assembler |
db 'fnop',010000b |
dw simple_fpu_instruction-assembler |
db 'fsin',111110b |
dw simple_fpu_instruction-assembler |
db 'fstp',3 |
dw fld_instruction-assembler |
db 'fsub',4 |
dw basic_fpu_instruction-assembler |
db 'ftst',100100b |
dw simple_fpu_instruction-assembler |
db 'fxam',100101b |
dw simple_fpu_instruction-assembler |
db 'fxch',0 |
dw fxch_instruction-assembler |
db 'heap',0 |
dw heap_directive-assembler |
db 'idiv',7 |
dw single_operand_instruction-assembler |
db 'imul',0 |
dw imul_instruction-assembler |
db 'insb',6Ch |
dw simple_instruction-assembler |
db 'insd',6Dh |
dw simple_instruction_32bit-assembler |
db 'insw',6Dh |
dw simple_instruction_16bit-assembler |
db 'int1',0F1h |
dw simple_instruction-assembler |
db 'int3',0CCh |
dw simple_instruction-assembler |
db 'into',0CEh |
dw simple_instruction_except64-assembler |
db 'invd',8 |
dw simple_extended_instruction-assembler |
db 'iret',0CFh |
dw iret_instruction-assembler |
db 'jcxz',0E3h |
dw loop_instruction_16bit-assembler |
db 'jnae',72h |
dw conditional_jump-assembler |
db 'jnbe',77h |
dw conditional_jump-assembler |
db 'jnge',7Ch |
dw conditional_jump-assembler |
db 'jnle',7Fh |
dw conditional_jump-assembler |
db 'lahf',9Fh |
dw simple_instruction_except64-assembler |
db 'lgdt',2 |
dw lgdt_instruction-assembler |
db 'lidt',3 |
dw lgdt_instruction-assembler |
db 'lldt',2 |
dw pm_word_instruction-assembler |
db 'lmsw',16h |
dw pm_word_instruction-assembler |
db 'load',0 |
dw load_directive-assembler |
db 'lock',0F0h |
dw prefix_instruction-assembler |
db 'lods',0ACh |
dw lods_instruction-assembler |
db 'loop',0E2h |
dw loop_instruction-assembler |
db 'movd',0 |
dw movd_instruction-assembler |
db 'movq',0 |
dw movq_instruction-assembler |
db 'movs',0A4h |
dw movs_instruction-assembler |
db 'orpd',56h |
dw sse_pd_instruction-assembler |
db 'orps',56h |
dw sse_ps_instruction-assembler |
db 'outs',6Eh |
dw outs_instruction-assembler |
db 'pand',0DBh |
dw mmx_instruction-assembler |
db 'popa',61h |
dw simple_instruction_except64-assembler |
db 'popd',4 |
dw pop_instruction-assembler |
db 'popf',9Dh |
dw simple_instruction-assembler |
db 'popq',8 |
dw pop_instruction-assembler |
db 'popw',2 |
dw pop_instruction-assembler |
db 'push',0 |
dw push_instruction-assembler |
db 'pxor',0EFh |
dw mmx_instruction-assembler |
db 'repe',0F3h |
dw prefix_instruction-assembler |
db 'repz',0F3h |
dw prefix_instruction-assembler |
db 'retd',0C2h |
dw ret_instruction_32bit_except64-assembler |
db 'retf',0CAh |
dw retf_instruction-assembler |
db 'retn',0C2h |
dw ret_instruction-assembler |
db 'retq',0C2h |
dw ret_instruction_only64-assembler |
db 'retw',0C2h |
dw ret_instruction_16bit-assembler |
db 'sahf',9Eh |
dw simple_instruction_except64-assembler |
db 'salc',0D6h |
dw simple_instruction_except64-assembler |
db 'scas',0AEh |
dw stos_instruction-assembler |
db 'seta',97h |
dw set_instruction-assembler |
db 'setb',92h |
dw set_instruction-assembler |
db 'setc',92h |
dw set_instruction-assembler |
db 'sete',94h |
dw set_instruction-assembler |
db 'setg',9Fh |
dw set_instruction-assembler |
db 'setl',9Ch |
dw set_instruction-assembler |
db 'seto',90h |
dw set_instruction-assembler |
db 'setp',9Ah |
dw set_instruction-assembler |
db 'sets',98h |
dw set_instruction-assembler |
db 'setz',94h |
dw set_instruction-assembler |
db 'sgdt',0 |
dw lgdt_instruction-assembler |
db 'shld',0A4h |
dw shd_instruction-assembler |
db 'shrd',0ACh |
dw shd_instruction-assembler |
db 'sidt',1 |
dw lgdt_instruction-assembler |
db 'sldt',0 |
dw pm_store_word_instruction-assembler |
db 'smsw',14h |
dw pm_store_word_instruction-assembler |
db 'stos',0AAh |
dw stos_instruction-assembler |
db 'test',0 |
dw test_instruction-assembler |
db 'verr',4 |
dw pm_word_instruction-assembler |
db 'verw',5 |
dw pm_word_instruction-assembler |
db 'wait',9Bh |
dw simple_instruction-assembler |
db 'xadd',0C0h |
dw basic_486_instruction-assembler |
db 'xchg',0 |
dw xchg_instruction-assembler |
db 'xlat',0D7h |
dw xlat_instruction-assembler |
db 0 |
instructions_5: |
db 'addpd',58h |
dw sse_pd_instruction-assembler |
db 'addps',58h |
dw sse_ps_instruction-assembler |
db 'addsd',58h |
dw sse_sd_instruction-assembler |
db 'addss',58h |
dw sse_ss_instruction-assembler |
db 'align',0 |
dw align_directive-assembler |
db 'andpd',54h |
dw sse_pd_instruction-assembler |
db 'andps',54h |
dw sse_ps_instruction-assembler |
db 'bound',0 |
dw bound_instruction-assembler |
db 'break',0 |
dw break_directive-assembler |
db 'bswap',0 |
dw bswap_instruction-assembler |
db 'cmova',47h |
dw cmov_instruction-assembler |
db 'cmovb',42h |
dw cmov_instruction-assembler |
db 'cmovc',42h |
dw cmov_instruction-assembler |
db 'cmove',44h |
dw cmov_instruction-assembler |
db 'cmovg',4Fh |
dw cmov_instruction-assembler |
db 'cmovl',4Ch |
dw cmov_instruction-assembler |
db 'cmovo',40h |
dw cmov_instruction-assembler |
db 'cmovp',4Ah |
dw cmov_instruction-assembler |
db 'cmovs',48h |
dw cmov_instruction-assembler |
db 'cmovz',44h |
dw cmov_instruction-assembler |
db 'cmppd',0 |
dw cmppd_instruction-assembler |
db 'cmpps',0 |
dw cmpps_instruction-assembler |
db 'cmpsb',0A6h |
dw simple_instruction-assembler |
db 'cmpsd',0 |
dw cmpsd_instruction-assembler |
db 'cmpsq',0 |
dw simple_instruction_64bit-assembler |
db 'cmpss',0 |
dw cmpss_instruction-assembler |
db 'cmpsw',0A7h |
dw simple_instruction_16bit-assembler |
db 'cpuid',0A2h |
dw simple_extended_instruction-assembler |
db 'divpd',5Eh |
dw sse_pd_instruction-assembler |
db 'divps',5Eh |
dw sse_ps_instruction-assembler |
db 'divsd',5Eh |
dw sse_sd_instruction-assembler |
db 'divss',5Eh |
dw sse_ss_instruction-assembler |
db 'enter',0 |
dw enter_instruction-assembler |
db 'entry',0 |
dw entry_directive-assembler |
db 'extrn',0 |
dw extrn_directive-assembler |
db 'f2xm1',110000b |
dw simple_fpu_instruction-assembler |
db 'faddp',0 |
dw faddp_instruction-assembler |
db 'fbstp',6 |
dw fbld_instruction-assembler |
db 'fclex',0E2h |
dw finit_instruction-assembler |
db 'fcomi',0F0h |
dw fcomi_instruction-assembler |
db 'fcomp',3 |
dw basic_fpu_instruction-assembler |
db 'fdisi',0E1h |
dw finit_instruction-assembler |
db 'fdivp',7 |
dw faddp_instruction-assembler |
db 'fdivr',7 |
dw basic_fpu_instruction-assembler |
db 'femms',0Eh |
dw simple_extended_instruction-assembler |
db 'ffree',0 |
dw ffree_instruction-assembler |
db 'fiadd',0 |
dw fi_instruction-assembler |
db 'ficom',2 |
dw fi_instruction-assembler |
db 'fidiv',6 |
dw fi_instruction-assembler |
db 'fimul',1 |
dw fi_instruction-assembler |
db 'finit',0E3h |
dw finit_instruction-assembler |
db 'fistp',3 |
dw fild_instruction-assembler |
db 'fisub',4 |
dw fi_instruction-assembler |
db 'fldcw',5 |
dw fldcw_instruction-assembler |
db 'fldpi',101011b |
dw simple_fpu_instruction-assembler |
db 'fmulp',1 |
dw faddp_instruction-assembler |
db 'fneni',0E0h |
dw fninit_instruction-assembler |
db 'fprem',111000b |
dw simple_fpu_instruction-assembler |
db 'fptan',110010b |
dw simple_fpu_instruction-assembler |
db 'fsave',6 |
dw fsave_instruction-assembler |
db 'fsqrt',111010b |
dw simple_fpu_instruction-assembler |
db 'fstcw',7 |
dw fstcw_instruction-assembler |
db 'fstsw',0 |
dw fstsw_instruction-assembler |
db 'fsubp',5 |
dw faddp_instruction-assembler |
db 'fsubr',5 |
dw basic_fpu_instruction-assembler |
db 'fucom',4 |
dw ffree_instruction-assembler |
db 'fwait',9Bh |
dw simple_instruction-assembler |
db 'fyl2x',110001b |
dw simple_fpu_instruction-assembler |
db 'iretd',0CFh |
dw simple_instruction_32bit-assembler |
db 'iretq',0CFh |
dw simple_instruction_64bit-assembler |
db 'iretw',0CFh |
dw simple_instruction_16bit-assembler |
db 'jecxz',0E3h |
dw loop_instruction_32bit-assembler |
db 'jrcxz',0E3h |
dw loop_instruction_64bit-assembler |
db 'label',0 |
dw label_directive-assembler |
db 'lddqu',0 |
dw lddqu_instruction-assembler |
db 'leave',0C9h |
dw simple_instruction-assembler |
db 'lodsb',0ACh |
dw simple_instruction-assembler |
db 'lodsd',0ADh |
dw simple_instruction_32bit-assembler |
db 'lodsq',0ADh |
dw simple_instruction_64bit-assembler |
db 'lodsw',0ADh |
dw simple_instruction_16bit-assembler |
db 'loopd',0E2h |
dw loop_instruction_32bit-assembler |
db 'loope',0E1h |
dw loop_instruction-assembler |
db 'loopq',0E2h |
dw loop_instruction_64bit-assembler |
db 'loopw',0E2h |
dw loop_instruction_16bit-assembler |
db 'loopz',0E1h |
dw loop_instruction-assembler |
db 'maxpd',5Fh |
dw sse_pd_instruction-assembler |
db 'maxps',5Fh |
dw sse_ps_instruction-assembler |
db 'maxsd',5Fh |
dw sse_sd_instruction-assembler |
db 'maxss',5Fh |
dw sse_ss_instruction-assembler |
db 'minpd',5Dh |
dw sse_pd_instruction-assembler |
db 'minps',5Dh |
dw sse_ps_instruction-assembler |
db 'minsd',5Dh |
dw sse_sd_instruction-assembler |
db 'minss',5Dh |
dw sse_ss_instruction-assembler |
db 'movsb',0A4h |
dw simple_instruction-assembler |
db 'movsd',0 |
dw movsd_instruction-assembler |
db 'movsq',0A5h |
dw simple_instruction_64bit-assembler |
db 'movss',0 |
dw movss_instruction-assembler |
db 'movsw',0A5h |
dw simple_instruction_16bit-assembler |
db 'movsx',0BEh |
dw movx_instruction-assembler |
db 'movzx',0B6h |
dw movx_instruction-assembler |
db 'mulpd',59h |
dw sse_pd_instruction-assembler |
db 'mulps',59h |
dw sse_ps_instruction-assembler |
db 'mulsd',59h |
dw sse_sd_instruction-assembler |
db 'mulss',59h |
dw sse_ss_instruction-assembler |
db 'mwait',0C9h |
dw monitor_instruction-assembler |
db 'outsb',6Eh |
dw simple_instruction-assembler |
db 'outsd',6Fh |
dw simple_instruction_32bit-assembler |
db 'outsw',6Fh |
dw simple_instruction_16bit-assembler |
db 'paddb',0FCh |
dw mmx_instruction-assembler |
db 'paddd',0FEh |
dw mmx_instruction-assembler |
db 'paddq',0D4h |
dw mmx_instruction-assembler |
db 'paddw',0FDh |
dw mmx_instruction-assembler |
db 'pandn',0DFh |
dw mmx_instruction-assembler |
db 'pause',0 |
dw pause_instruction-assembler |
db 'pavgb',0E0h |
dw mmx_instruction-assembler |
db 'pavgw',0E3h |
dw mmx_instruction-assembler |
db 'pf2id',1Dh |
dw amd3dnow_instruction-assembler |
db 'pf2iw',1Ch |
dw amd3dnow_instruction-assembler |
db 'pfacc',0AEh |
dw amd3dnow_instruction-assembler |
db 'pfadd',9Eh |
dw amd3dnow_instruction-assembler |
db 'pfmax',0A4h |
dw amd3dnow_instruction-assembler |
db 'pfmin',94h |
dw amd3dnow_instruction-assembler |
db 'pfmul',0B4h |
dw amd3dnow_instruction-assembler |
db 'pfrcp',96h |
dw amd3dnow_instruction-assembler |
db 'pfsub',9Ah |
dw amd3dnow_instruction-assembler |
db 'pi2fd',0Dh |
dw amd3dnow_instruction-assembler |
db 'pi2fw',0Ch |
dw amd3dnow_instruction-assembler |
db 'popad',61h |
dw simple_instruction_32bit_except64-assembler |
db 'popaw',61h |
dw simple_instruction_16bit_except64-assembler |
db 'popfd',9Dh |
dw simple_instruction_32bit_except64-assembler |
db 'popfw',9Dh |
dw simple_instruction_16bit-assembler |
db 'popfq',9Dh |
dw simple_instruction_only64-assembler |
db 'pslld',0F2h |
dw mmx_ps_instruction-assembler |
db 'psllq',0F3h |
dw mmx_ps_instruction-assembler |
db 'psllw',0F1h |
dw mmx_ps_instruction-assembler |
db 'psrad',0E2h |
dw mmx_ps_instruction-assembler |
db 'psraw',0E1h |
dw mmx_ps_instruction-assembler |
db 'psrld',0D2h |
dw mmx_ps_instruction-assembler |
db 'psrlq',0D3h |
dw mmx_ps_instruction-assembler |
db 'psrlw',0D1h |
dw mmx_ps_instruction-assembler |
db 'psubb',0F8h |
dw mmx_instruction-assembler |
db 'psubd',0FAh |
dw mmx_instruction-assembler |
db 'psubq',0FBh |
dw mmx_instruction-assembler |
db 'psubw',0F9h |
dw mmx_instruction-assembler |
db 'pusha',60h |
dw simple_instruction_except64-assembler |
db 'pushd',4 |
dw push_instruction-assembler |
db 'pushf',9Ch |
dw simple_instruction-assembler |
db 'pushq',8 |
dw push_instruction-assembler |
db 'pushw',2 |
dw push_instruction-assembler |
db 'rcpps',53h |
dw sse_ps_instruction-assembler |
db 'rcpss',53h |
dw sse_ss_instruction-assembler |
db 'rdmsr',32h |
dw simple_extended_instruction-assembler |
db 'rdpmc',33h |
dw simple_extended_instruction-assembler |
db 'rdtsc',31h |
dw simple_extended_instruction-assembler |
db 'repne',0F2h |
dw prefix_instruction-assembler |
db 'repnz',0F2h |
dw prefix_instruction-assembler |
db 'retfd',0CAh |
dw ret_instruction_32bit-assembler |
db 'retfq',0CAh |
dw ret_instruction_64bit-assembler |
db 'retfw',0CAh |
dw ret_instruction_16bit-assembler |
db 'retnd',0C2h |
dw ret_instruction_32bit_except64-assembler |
db 'retnq',0C2h |
dw ret_instruction_only64-assembler |
db 'retnw',0C2h |
dw ret_instruction_16bit-assembler |
db 'scasb',0AEh |
dw simple_instruction-assembler |
db 'scasd',0AFh |
dw simple_instruction_32bit-assembler |
db 'scasq',0AFh |
dw simple_instruction_64bit-assembler |
db 'scasw',0AFh |
dw simple_instruction_16bit-assembler |
db 'setae',93h |
dw set_instruction-assembler |
db 'setbe',96h |
dw set_instruction-assembler |
db 'setge',9Dh |
dw set_instruction-assembler |
db 'setle',9Eh |
dw set_instruction-assembler |
db 'setna',96h |
dw set_instruction-assembler |
db 'setnb',93h |
dw set_instruction-assembler |
db 'setnc',93h |
dw set_instruction-assembler |
db 'setne',95h |
dw set_instruction-assembler |
db 'setng',9Eh |
dw set_instruction-assembler |
db 'setnl',9Dh |
dw set_instruction-assembler |
db 'setno',91h |
dw set_instruction-assembler |
db 'setnp',9Bh |
dw set_instruction-assembler |
db 'setns',99h |
dw set_instruction-assembler |
db 'setnz',95h |
dw set_instruction-assembler |
db 'setpe',9Ah |
dw set_instruction-assembler |
db 'setpo',9Bh |
dw set_instruction-assembler |
db 'stack',0 |
dw stack_directive-assembler |
db 'store',0 |
dw store_directive-assembler |
db 'stosb',0AAh |
dw simple_instruction-assembler |
db 'stosd',0ABh |
dw simple_instruction_32bit-assembler |
db 'stosq',0ABh |
dw simple_instruction_64bit-assembler |
db 'stosw',0ABh |
dw simple_instruction_16bit-assembler |
db 'subpd',5Ch |
dw sse_pd_instruction-assembler |
db 'subps',5Ch |
dw sse_ps_instruction-assembler |
db 'subsd',5Ch |
dw sse_sd_instruction-assembler |
db 'subss',5Ch |
dw sse_ss_instruction-assembler |
db 'times',0 |
dw times_directive-assembler |
db 'vmxon',6 |
dw vmxon_instruction-assembler |
db 'while',0 |
dw while_directive-assembler |
db 'wrmsr',30h |
dw simple_extended_instruction-assembler |
db 'xlatb',0D7h |
dw simple_instruction-assembler |
db 'xorpd',57h |
dw sse_pd_instruction-assembler |
db 'xorps',57h |
dw sse_ps_instruction-assembler |
db 0 |
instructions_6: |
db 'andnpd',55h |
dw sse_pd_instruction-assembler |
db 'andnps',55h |
dw sse_ps_instruction-assembler |
db 'cmovae',43h |
dw cmov_instruction-assembler |
db 'cmovbe',46h |
dw cmov_instruction-assembler |
db 'cmovge',4Dh |
dw cmov_instruction-assembler |
db 'cmovle',4Eh |
dw cmov_instruction-assembler |
db 'cmovna',46h |
dw cmov_instruction-assembler |
db 'cmovnb',43h |
dw cmov_instruction-assembler |
db 'cmovnc',43h |
dw cmov_instruction-assembler |
db 'cmovne',45h |
dw cmov_instruction-assembler |
db 'cmovng',4Eh |
dw cmov_instruction-assembler |
db 'cmovnl',4Dh |
dw cmov_instruction-assembler |
db 'cmovno',41h |
dw cmov_instruction-assembler |
db 'cmovnp',4Bh |
dw cmov_instruction-assembler |
db 'cmovns',49h |
dw cmov_instruction-assembler |
db 'cmovnz',45h |
dw cmov_instruction-assembler |
db 'cmovpe',4Ah |
dw cmov_instruction-assembler |
db 'cmovpo',4Bh |
dw cmov_instruction-assembler |
db 'comisd',2Fh |
dw comisd_instruction-assembler |
db 'comiss',2Fh |
dw comiss_instruction-assembler |
db 'fcmovb',0C0h |
dw fcmov_instruction-assembler |
db 'fcmove',0C8h |
dw fcmov_instruction-assembler |
db 'fcmovu',0D8h |
dw fcmov_instruction-assembler |
db 'fcomip',0F0h |
dw fcomip_instruction-assembler |
db 'fcompp',0 |
dw fcompp_instruction-assembler |
db 'fdivrp',6 |
dw faddp_instruction-assembler |
db 'ffreep',0 |
dw ffreep_instruction-assembler |
db 'ficomp',3 |
dw fi_instruction-assembler |
db 'fidivr',7 |
dw fi_instruction-assembler |
db 'fisttp',1 |
dw fild_instruction-assembler |
db 'fisubr',5 |
dw fi_instruction-assembler |
db 'fldenv',4 |
dw fldenv_instruction-assembler |
db 'fldl2e',101010b |
dw simple_fpu_instruction-assembler |
db 'fldl2t',101001b |
dw simple_fpu_instruction-assembler |
db 'fldlg2',101100b |
dw simple_fpu_instruction-assembler |
db 'fldln2',101101b |
dw simple_fpu_instruction-assembler |
db 'fnclex',0E2h |
dw fninit_instruction-assembler |
db 'fndisi',0E1h |
dw fninit_instruction-assembler |
db 'fninit',0E3h |
dw fninit_instruction-assembler |
db 'fnsave',6 |
dw fnsave_instruction-assembler |
db 'fnstcw',7 |
dw fldcw_instruction-assembler |
db 'fnstsw',0 |
dw fnstsw_instruction-assembler |
db 'format',0 |
dw format_directive-assembler |
db 'fpatan',110011b |
dw simple_fpu_instruction-assembler |
db 'fprem1',110101b |
dw simple_fpu_instruction-assembler |
db 'frstor',4 |
dw fnsave_instruction-assembler |
db 'frstpm',0E5h |
dw fninit_instruction-assembler |
db 'fscale',111101b |
dw simple_fpu_instruction-assembler |
db 'fsetpm',0E4h |
dw fninit_instruction-assembler |
db 'fstenv',6 |
dw fstenv_instruction-assembler |
db 'fsubrp',4 |
dw faddp_instruction-assembler |
db 'fucomi',0E8h |
dw fcomi_instruction-assembler |
db 'fucomp',5 |
dw ffree_instruction-assembler |
db 'fxsave',0 |
dw fxsave_instruction-assembler |
db 'haddpd',07Ch |
dw sse_pd_instruction-assembler |
db 'haddps',07Ch |
dw cvtpd2dq_instruction-assembler |
db 'hsubpd',07Dh |
dw sse_pd_instruction-assembler |
db 'hsubps',07Dh |
dw cvtpd2dq_instruction-assembler |
db 'invlpg',0 |
dw invlpg_instruction-assembler |
db 'lfence',0E8h |
dw fence_instruction-assembler |
db 'looped',0E1h |
dw loop_instruction_32bit-assembler |
db 'loopeq',0E1h |
dw loop_instruction_64bit-assembler |
db 'loopew',0E1h |
dw loop_instruction_16bit-assembler |
db 'loopne',0E0h |
dw loop_instruction-assembler |
db 'loopnz',0E0h |
dw loop_instruction-assembler |
db 'loopzd',0E1h |
dw loop_instruction_32bit-assembler |
db 'loopzq',0E1h |
dw loop_instruction_64bit-assembler |
db 'loopzw',0E1h |
dw loop_instruction_16bit-assembler |
db 'mfence',0F0h |
dw fence_instruction-assembler |
db 'movapd',28h |
dw movpd_instruction-assembler |
db 'movaps',28h |
dw movps_instruction-assembler |
db 'movdqa',66h |
dw movdq_instruction-assembler |
db 'movdqu',0F3h |
dw movdq_instruction-assembler |
db 'movhpd',16h |
dw movlpd_instruction-assembler |
db 'movhps',16h |
dw movlps_instruction-assembler |
db 'movlpd',12h |
dw movlpd_instruction-assembler |
db 'movlps',12h |
dw movlps_instruction-assembler |
db 'movnti',0C3h |
dw movnti_instruction-assembler |
db 'movntq',0E7h |
dw movntq_instruction-assembler |
db 'movsxd',63h |
dw movsxd_instruction-assembler |
db 'movupd',10h |
dw movpd_instruction-assembler |
db 'movups',10h |
dw movps_instruction-assembler |
db 'paddsb',0ECh |
dw mmx_instruction-assembler |
db 'paddsw',0EDh |
dw mmx_instruction-assembler |
db 'pextrw',0C5h |
dw pextrw_instruction-assembler |
db 'pfnacc',8Ah |
dw amd3dnow_instruction-assembler |
db 'pfsubr',0AAh |
dw amd3dnow_instruction-assembler |
db 'pinsrw',0C4h |
dw pinsrw_instruction-assembler |
db 'pmaxsw',0EEh |
dw mmx_instruction-assembler |
db 'pmaxub',0DEh |
dw mmx_instruction-assembler |
db 'pminsw',0EAh |
dw mmx_instruction-assembler |
db 'pminub',0DAh |
dw mmx_instruction-assembler |
db 'pmulhw',0E5h |
dw mmx_instruction-assembler |
db 'pmullw',0D5h |
dw mmx_instruction-assembler |
db 'psadbw',0F6h |
dw mmx_instruction-assembler |
db 'pshufd',66h |
dw pshufd_instruction-assembler |
db 'pshufw',0 |
dw pshufw_instruction-assembler |
db 'pslldq',111b |
dw ps_dq_instruction-assembler |
db 'psrldq',011b |
dw ps_dq_instruction-assembler |
db 'psubsb',0E8h |
dw mmx_instruction-assembler |
db 'psubsw',0E9h |
dw mmx_instruction-assembler |
db 'pswapd',0BBh |
dw amd3dnow_instruction-assembler |
db 'public',0 |
dw public_directive-assembler |
db 'pushad',60h |
dw simple_instruction_32bit_except64-assembler |
db 'pushaw',60h |
dw simple_instruction_16bit_except64-assembler |
db 'pushfd',9Ch |
dw simple_instruction_32bit_except64-assembler |
db 'pushfq',9Ch |
dw simple_instruction_only64-assembler |
db 'pushfw',9Ch |
dw simple_instruction_16bit-assembler |
db 'rdtscp',1 |
dw swapgs_instruction-assembler |
db 'repeat',0 |
dw repeat_directive-assembler |
db 'setalc',0D6h |
dw simple_instruction_except64-assembler |
db 'setnae',92h |
dw set_instruction-assembler |
db 'setnbe',97h |
dw set_instruction-assembler |
db 'setnge',9Ch |
dw set_instruction-assembler |
db 'setnle',9Fh |
dw set_instruction-assembler |
db 'sfence',0F8h |
dw fence_instruction-assembler |
db 'shufpd',0C6h |
dw sse_pd_instruction-assembler |
db 'shufps',0C6h |
dw sse_ps_instruction-assembler |
db 'sqrtpd',51h |
dw sse_pd_instruction-assembler |
db 'sqrtps',51h |
dw sse_ps_instruction-assembler |
db 'sqrtsd',51h |
dw sse_sd_instruction-assembler |
db 'sqrtss',51h |
dw sse_ss_instruction-assembler |
db 'sysret',07h |
dw simple_extended_instruction-assembler |
db 'swapgs',0 |
dw swapgs_instruction-assembler |
db 'vmcall',0C1h |
dw simple_vmx_instruction-assembler |
db 'vmread',0 |
dw vmread_instruction-assembler |
db 'vmxoff',0C4h |
dw simple_vmx_instruction-assembler |
db 'wbinvd',9 |
dw simple_extended_instruction-assembler |
db 0 |
instructions_7: |
db 'clflush',111b |
dw fxsave_instruction-assembler |
db 'cmovnae',42h |
dw cmov_instruction-assembler |
db 'cmovnbe',47h |
dw cmov_instruction-assembler |
db 'cmovnge',4Ch |
dw cmov_instruction-assembler |
db 'cmovnle',4Fh |
dw cmov_instruction-assembler |
db 'cmpeqpd',0 |
dw cmp_pd_instruction-assembler |
db 'cmpeqps',0 |
dw cmp_ps_instruction-assembler |
db 'cmpeqsd',0 |
dw cmp_sd_instruction-assembler |
db 'cmpeqss',0 |
dw cmp_ss_instruction-assembler |
db 'cmplepd',2 |
dw cmp_pd_instruction-assembler |
db 'cmpleps',2 |
dw cmp_ps_instruction-assembler |
db 'cmplesd',2 |
dw cmp_sd_instruction-assembler |
db 'cmpless',2 |
dw cmp_ss_instruction-assembler |
db 'cmpltpd',1 |
dw cmp_pd_instruction-assembler |
db 'cmpltps',1 |
dw cmp_ps_instruction-assembler |
db 'cmpltsd',1 |
dw cmp_sd_instruction-assembler |
db 'cmpltss',1 |
dw cmp_ss_instruction-assembler |
db 'cmpxchg',0B0h |
dw basic_486_instruction-assembler |
db 'display',0 |
dw display_directive-assembler |
db 'fcmovbe',0D0h |
dw fcmov_instruction-assembler |
db 'fcmovnb',0C0h |
dw fcomi_instruction-assembler |
db 'fcmovne',0C8h |
dw fcomi_instruction-assembler |
db 'fcmovnu',0D8h |
dw fcomi_instruction-assembler |
db 'fdecstp',110110b |
dw simple_fpu_instruction-assembler |
db 'fincstp',110111b |
dw simple_fpu_instruction-assembler |
db 'fnstenv',6 |
dw fldenv_instruction-assembler |
db 'frndint',111100b |
dw simple_fpu_instruction-assembler |
db 'fsincos',111011b |
dw simple_fpu_instruction-assembler |
db 'fucomip',0E8h |
dw fcomip_instruction-assembler |
db 'fucompp',0 |
dw fucompp_instruction-assembler |
db 'fxrstor',1 |
dw fxsave_instruction-assembler |
db 'fxtract',110100b |
dw simple_fpu_instruction-assembler |
db 'fyl2xp1',111001b |
dw simple_fpu_instruction-assembler |
db 'ldmxcsr',10b |
dw fxsave_instruction-assembler |
db 'loopned',0E0h |
dw loop_instruction_32bit-assembler |
db 'loopneq',0E0h |
dw loop_instruction_64bit-assembler |
db 'loopnew',0E0h |
dw loop_instruction_16bit-assembler |
db 'loopnzd',0E0h |
dw loop_instruction_32bit-assembler |
db 'loopnzq',0E0h |
dw loop_instruction_64bit-assembler |
db 'loopnzw',0E0h |
dw loop_instruction_16bit-assembler |
db 'monitor',0C8h |
dw monitor_instruction-assembler |
db 'movddup',12h |
dw sse_sd_instruction-assembler |
db 'movdq2q',0 |
dw movdq2q_instruction-assembler |
db 'movhlps',12h |
dw movhlps_instruction-assembler |
db 'movlhps',16h |
dw movhlps_instruction-assembler |
db 'movntdq',0E7h |
dw movntdq_instruction-assembler |
db 'movntpd',2Bh |
dw movntdq_instruction-assembler |
db 'movntps',2Bh |
dw movntps_instruction-assembler |
db 'movq2dq',0 |
dw movq2dq_instruction-assembler |
db 'paddusb',0DCh |
dw mmx_instruction-assembler |
db 'paddusw',0DDh |
dw mmx_instruction-assembler |
db 'pavgusb',0BFh |
dw amd3dnow_instruction-assembler |
db 'pcmpeqb',74h |
dw mmx_instruction-assembler |
db 'pcmpeqd',76h |
dw mmx_instruction-assembler |
db 'pcmpeqw',75h |
dw mmx_instruction-assembler |
db 'pcmpgtb',64h |
dw mmx_instruction-assembler |
db 'pcmpgtd',66h |
dw mmx_instruction-assembler |
db 'pcmpgtw',65h |
dw mmx_instruction-assembler |
db 'pfcmpeq',0B0h |
dw amd3dnow_instruction-assembler |
db 'pfcmpge',90h |
dw amd3dnow_instruction-assembler |
db 'pfcmpgt',0A0h |
dw amd3dnow_instruction-assembler |
db 'pfpnacc',8Eh |
dw amd3dnow_instruction-assembler |
db 'pfrsqrt',97h |
dw amd3dnow_instruction-assembler |
db 'pmaddwd',0F5h |
dw mmx_instruction-assembler |
db 'pmulhrw',0B7h |
dw amd3dnow_instruction-assembler |
db 'pmulhuw',0E4h |
dw mmx_instruction-assembler |
db 'pmuludq',0F4h |
dw mmx_instruction-assembler |
db 'pshufhw',0F3h |
dw pshufd_instruction-assembler |
db 'pshuflw',0F2h |
dw pshufd_instruction-assembler |
db 'psubusb',0D8h |
dw mmx_instruction-assembler |
db 'psubusw',0D9h |
dw mmx_instruction-assembler |
db 'rsqrtps',52h |
dw sse_ps_instruction-assembler |
db 'rsqrtss',52h |
dw sse_ss_instruction-assembler |
db 'section',0 |
dw section_directive-assembler |
db 'segment',0 |
dw segment_directive-assembler |
db 'stmxcsr',11b |
dw fxsave_instruction-assembler |
db 'syscall',05h |
dw simple_extended_instruction-assembler |
db 'sysexit',35h |
dw simple_extended_instruction-assembler |
db 'ucomisd',2Eh |
dw comisd_instruction-assembler |
db 'ucomiss',2Eh |
dw comiss_instruction-assembler |
db 'virtual',0 |
dw virtual_directive-assembler |
db 'vmclear',6 |
dw vmclear_instruction-assembler |
db 'vmptrld',6 |
dw vmx_instruction-assembler |
db 'vmptrst',7 |
dw vmx_instruction-assembler |
db 'vmwrite',0 |
dw vmwrite_instruction-assembler |
db 0 |
instructions_8: |
db 'addsubpd',0D0h |
dw sse_pd_instruction-assembler |
db 'addsubps',0D0h |
dw cvtpd2dq_instruction-assembler |
db 'cmpneqpd',4 |
dw cmp_pd_instruction-assembler |
db 'cmpneqps',4 |
dw cmp_ps_instruction-assembler |
db 'cmpneqsd',4 |
dw cmp_sd_instruction-assembler |
db 'cmpneqss',4 |
dw cmp_ss_instruction-assembler |
db 'cmpnlepd',6 |
dw cmp_pd_instruction-assembler |
db 'cmpnleps',6 |
dw cmp_ps_instruction-assembler |
db 'cmpnlesd',6 |
dw cmp_sd_instruction-assembler |
db 'cmpnless',6 |
dw cmp_ss_instruction-assembler |
db 'cmpnltpd',5 |
dw cmp_pd_instruction-assembler |
db 'cmpnltps',5 |
dw cmp_ps_instruction-assembler |
db 'cmpnltsd',5 |
dw cmp_sd_instruction-assembler |
db 'cmpnltss',5 |
dw cmp_ss_instruction-assembler |
db 'cmpordpd',7 |
dw cmp_pd_instruction-assembler |
db 'cmpordps',7 |
dw cmp_ps_instruction-assembler |
db 'cmpordsd',7 |
dw cmp_sd_instruction-assembler |
db 'cmpordss',7 |
dw cmp_ss_instruction-assembler |
db 'cvtdq2pd',0E6h |
dw cvtdq2pd_instruction-assembler |
db 'cvtdq2ps',5Bh |
dw sse_ps_instruction-assembler |
db 'cvtpd2dq',0E6h |
dw cvtpd2dq_instruction-assembler |
db 'cvtpd2pi',2Dh |
dw cvtpd2pi_instruction-assembler |
db 'cvtpd2ps',5Ah |
dw sse_pd_instruction-assembler |
db 'cvtpi2pd',2Ah |
dw cvtpi2pd_instruction-assembler |
db 'cvtpi2ps',2Ah |
dw cvtpi2ps_instruction-assembler |
db 'cvtps2dq',5Bh |
dw sse_pd_instruction-assembler |
db 'cvtps2pd',5Ah |
dw cvtps2pd_instruction-assembler |
db 'cvtps2pi',2Dh |
dw cvtps2pi_instruction-assembler |
db 'cvtsd2si',2Dh |
dw cvtsd2si_instruction-assembler |
db 'cvtsd2ss',5Ah |
dw sse_sd_instruction-assembler |
db 'cvtsi2sd',2Ah |
dw cvtsi2sd_instruction-assembler |
db 'cvtsi2ss',2Ah |
dw cvtsi2ss_instruction-assembler |
db 'cvtss2sd',5Ah |
dw sse_ss_instruction-assembler |
db 'cvtss2si',2Dh |
dw cvtss2si_instruction-assembler |
db 'fcmovnbe',0D0h |
dw fcomi_instruction-assembler |
db 'maskmovq',0 |
dw maskmovq_instruction-assembler |
db 'movmskpd',0 |
dw movmskpd_instruction-assembler |
db 'movmskps',0 |
dw movmskps_instruction-assembler |
db 'movshdup',16h |
dw cvtdq2pd_instruction-assembler |
db 'movsldup',12h |
dw cvtdq2pd_instruction-assembler |
db 'packssdw',6Bh |
dw mmx_instruction-assembler |
db 'packsswb',63h |
dw mmx_instruction-assembler |
db 'packuswb',67h |
dw mmx_instruction-assembler |
db 'pfrcpit1',0A6h |
dw amd3dnow_instruction-assembler |
db 'pfrcpit2',0B6h |
dw amd3dnow_instruction-assembler |
db 'pfrsqit1',0A7h |
dw amd3dnow_instruction-assembler |
db 'pmovmskb',0D7h |
dw pextrw_instruction-assembler |
db 'prefetch',0 |
dw amd_prefetch_instruction-assembler |
db 'sysenter',34h |
dw simple_extended_instruction-assembler |
db 'unpckhpd',15h |
dw sse_pd_instruction-assembler |
db 'unpckhps',15h |
dw sse_ps_instruction-assembler |
db 'unpcklpd',14h |
dw sse_pd_instruction-assembler |
db 'unpcklps',14h |
dw sse_ps_instruction-assembler |
db 'vmlaunch',0C2h |
dw simple_vmx_instruction-assembler |
db 'vmresume',0C3h |
dw simple_vmx_instruction-assembler |
db 0 |
instructions_9: |
db 'cmpxchg8b',8 |
dw cmpxchgx_instruction-assembler |
db 'cvttpd2dq',0E6h |
dw sse_pd_instruction-assembler |
db 'cvttpd2pi',2Ch |
dw cvtpd2pi_instruction-assembler |
db 'cvttps2dq',5Bh |
dw cvtdq2pd_instruction-assembler |
db 'cvttps2pi',2Ch |
dw cvtps2pi_instruction-assembler |
db 'cvttsd2si',2Ch |
dw cvtsd2si_instruction-assembler |
db 'cvttss2si',2Ch |
dw cvtss2si_instruction-assembler |
db 'prefetchw',1 |
dw amd_prefetch_instruction-assembler |
db 'punpckhbw',68h |
dw mmx_instruction-assembler |
db 'punpckhdq',6Ah |
dw mmx_instruction-assembler |
db 'punpckhwd',69h |
dw mmx_instruction-assembler |
db 'punpcklbw',60h |
dw mmx_instruction-assembler |
db 'punpckldq',62h |
dw mmx_instruction-assembler |
db 'punpcklwd',61h |
dw mmx_instruction-assembler |
db 0 |
instructions_10: |
db 'cmpunordpd',3 |
dw cmp_pd_instruction-assembler |
db 'cmpunordps',3 |
dw cmp_ps_instruction-assembler |
db 'cmpunordsd',3 |
dw cmp_sd_instruction-assembler |
db 'cmpunordss',3 |
dw cmp_ss_instruction-assembler |
db 'cmpxchg16b',16 |
dw cmpxchgx_instruction-assembler |
db 'loadall286',5 |
dw simple_extended_instruction-assembler |
db 'loadall386',7 |
dw simple_extended_instruction-assembler |
db 'maskmovdqu',0 |
dw maskmovdqu_instruction-assembler |
db 'prefetcht0',1 |
dw prefetch_instruction-assembler |
db 'prefetcht1',2 |
dw prefetch_instruction-assembler |
db 'prefetcht2',3 |
dw prefetch_instruction-assembler |
db 'punpckhqdq',6Dh |
dw sse_pd_instruction-assembler |
db 'punpcklqdq',6Ch |
dw sse_pd_instruction-assembler |
db 0 |
instructions_11: |
db 'prefetchnta',0 |
dw prefetch_instruction-assembler |
db 0 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |