1,6 → 1,6 |
|
; flat assembler core |
; Copyright (c) 1999-2009, Tomasz Grysztar. |
; Copyright (c) 1999-2011, Tomasz Grysztar. |
; All rights reserved. |
|
simple_instruction_except64: |
34,6 → 34,9 |
je size_prefix |
stos byte [edi] |
jmp instruction_assembled |
iret_instruction: |
cmp [code_type],64 |
jne simple_instruction |
simple_instruction_64bit: |
cmp [code_type],64 |
jne illegal_instruction |
73,15 → 76,15 |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
cmp [next_pass_needed],0 |
jne int_imm_ok |
test eax,eax |
js value_out_of_range |
int_imm_ok: |
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 |
1824,6 → 1827,8 |
jne enter_imm16_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
test eax,eax |
js value_out_of_range |
enter_imm16_ok: |
push eax |
mov [operand_size],0 |
1840,6 → 1845,11 |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
cmp [next_pass_needed],0 |
jne enter_imm8_ok |
test eax,eax |
js value_out_of_range |
enter_imm8_ok: |
mov dl,al |
pop ebx |
mov al,0C8h |
1890,6 → 1900,8 |
jne ret_imm_ok |
cmp [value_type],0 |
jne invalid_use_of_symbol |
test eax,eax |
js value_out_of_range |
ret_imm_ok: |
cmp [size_declared],0 |
jne ret_imm_store |
3170,6 → 3182,10 |
conditional_jump_32bit_store: |
mov edx,eax |
sub edx,4 |
jno conditional_jump_32bit_range_ok |
cmp [code_type],64 |
je relative_jump_out_of_range |
conditional_jump_32bit_range_ok: |
mov ah,[base_code] |
add ah,10h |
mov al,0Fh |
3209,7 → 3225,7 |
cmp [value_type],0 |
jne invalid_use_of_symbol |
mov edx,eax |
sub edx,2 |
sub dx,2 |
mov ah,[base_code] |
add ah,10h |
mov al,0Fh |
3271,6 → 3287,7 |
make_loop_jump: |
call check_for_short_jump |
jc conditional_jump_short |
scas word [edi] |
jmp jump_out_of_range |
loop_counter_size: |
cmp [operand_prefix],0 |
3749,6 → 3766,9 |
call get_address |
jmp instruction_ready |
swapgs_instruction: |
cmp [code_type],64 |
jne illegal_instruction |
rdtscp_instruction: |
mov [base_code],0Fh |
mov [extended_code],1 |
mov [postbyte_register],7 |
4346,7 → 4366,7 |
call convert_mmx_register |
mov bl,al |
jmp nomem_instruction_ready |
mmx_ps_instruction: |
mmx_bit_shift_instruction: |
mov [base_code],0Fh |
mov [extended_code],al |
lods byte [esi] |
4422,7 → 4442,8 |
jmp nomem_instruction_ready |
mmx_imm8: |
push ebx ecx edx |
mov [operand_size],0 |
xor cl,cl |
xchg cl,[operand_size] |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
4430,6 → 4451,7 |
call get_size_operator |
test ah,not 1 |
jnz invalid_operand_size |
mov [operand_size],cl |
cmp al,'(' |
jne invalid_operand |
call get_byte_value |
4597,11 → 4619,18 |
mov bl,al |
jmp nomem_instruction_ready |
make_mmx_prefix: |
cmp [vex_required],0 |
jne mmx_prefix_for_vex |
cmp [operand_size],16 |
jne no_mmx_prefix |
mov [operand_prefix],66h |
no_mmx_prefix: |
ret |
mmx_prefix_for_vex: |
cmp [operand_size],16 |
jne invalid_operand |
mov [opcode_prefix],66h |
ret |
movq_instruction: |
mov [base_code],0Fh |
lods byte [esi] |
4718,17 → 4747,13 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
mov [extended_code],7Fh |
jmp instruction_ready |
movdq_mmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
4743,9 → 4768,7 |
jmp instruction_ready |
movdq_mmreg_mmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
jmp nomem_instruction_ready |
lddqu_instruction: |
4754,9 → 4777,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
push eax |
lods byte [esi] |
cmp al,',' |
4772,34 → 4793,15 |
mov [base_code],0Fh |
mov [extended_code],0F0h |
jmp instruction_ready |
|
movdq2q_instruction: |
mov [opcode_prefix],0F2h |
mov [mmx_size],8 |
jmp movq2dq_ |
movq2dq_instruction: |
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 [opcode_prefix],0F3h |
mov [base_code],0Fh |
mov [extended_code],0D6h |
jmp nomem_instruction_ready |
movdq2q_instruction: |
mov [mmx_size],16 |
movq2dq_: |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
4806,7 → 4808,7 |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,8 |
cmp ah,[mmx_size] |
jne invalid_operand_size |
mov [postbyte_register],al |
mov [operand_size],0 |
4819,10 → 4821,10 |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
xor [mmx_size],8+16 |
cmp ah,[mmx_size] |
jne invalid_operand_size |
mov bl,al |
mov [opcode_prefix],0F2h |
mov [base_code],0Fh |
mov [extended_code],0D6h |
jmp nomem_instruction_ready |
4846,6 → 4848,32 |
mov [mmx_size],8 |
mov [opcode_prefix],0F2h |
jmp sse_instruction |
cmp_pd_instruction: |
mov [opcode_prefix],66h |
cmp_ps_instruction: |
mov [mmx_size],16 |
mov byte [value],al |
mov al,0C2h |
jmp sse_instruction |
cmp_ss_instruction: |
mov [mmx_size],4 |
mov [opcode_prefix],0F3h |
jmp cmp_sx_instruction |
cmpsd_instruction: |
mov al,0A7h |
mov ah,[esi] |
or ah,ah |
jz simple_instruction_32bit |
cmp ah,0Fh |
je simple_instruction_32bit |
mov al,-1 |
cmp_sd_instruction: |
mov [mmx_size],8 |
mov [opcode_prefix],0F2h |
cmp_sx_instruction: |
mov byte [value],al |
mov al,0C2h |
jmp sse_instruction |
comiss_instruction: |
mov [mmx_size],4 |
jmp sse_instruction |
4853,6 → 4881,8 |
mov [mmx_size],8 |
mov [opcode_prefix],66h |
jmp sse_instruction |
cvtdq2pd_instruction: |
mov [opcode_prefix],0F3h |
cvtps2pd_instruction: |
mov [mmx_size],8 |
jmp sse_instruction |
4860,7 → 4890,7 |
mov [mmx_size],16 |
mov [opcode_prefix],0F2h |
jmp sse_instruction |
cvtdq2pd_instruction: |
movshdup_instruction: |
mov [mmx_size],16 |
mov [opcode_prefix],0F3h |
sse_instruction: |
4872,9 → 4902,7 |
jne invalid_operand |
sse_xmmreg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
sse_reg: |
mov [postbyte_register],al |
mov [operand_size],0 |
4895,6 → 4923,12 |
cmp [operand_size],al |
jne invalid_operand_size |
sse_mem_size_ok: |
mov al,[extended_code] |
mov ah,[supplemental_code] |
cmp al,0C2h |
je sse_cmp_mem_ok |
cmp ax,443Ah |
je sse_cmp_mem_ok |
cmp [immediate_size],1 |
je mmx_imm8 |
cmp [immediate_size],-1 |
4903,6 → 4937,11 |
mov [immediate_size],0 |
sse_ok: |
jmp instruction_ready |
sse_cmp_mem_ok: |
cmp byte [value],-1 |
je mmx_imm8 |
call store_instruction_with_imm8 |
jmp instruction_assembled |
sse_xmmreg_xmmreg: |
cmp [operand_prefix],66h |
jne sse_xmmreg_xmmreg_ok |
4912,10 → 4951,14 |
je invalid_operand |
sse_xmmreg_xmmreg_ok: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
mov al,[extended_code] |
mov ah,[supplemental_code] |
cmp al,0C2h |
je sse_cmp_nomem_ok |
cmp ax,443Ah |
je sse_cmp_nomem_ok |
cmp [immediate_size],1 |
je mmx_nomem_imm8 |
cmp [immediate_size],-1 |
4924,6 → 4967,13 |
mov [immediate_size],0 |
sse_nomem_ok: |
jmp nomem_instruction_ready |
sse_cmp_nomem_ok: |
cmp byte [value],-1 |
je mmx_nomem_imm8 |
call store_nomem_instruction |
mov al,byte [value] |
stosb |
jmp instruction_assembled |
take_additional_xmm0: |
cmp byte [esi],',' |
jne additional_xmm0_ok |
4932,15 → 4982,13 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
test al,al |
jnz invalid_operand |
additional_xmm0_ok: |
ret |
|
ps_dq_instruction: |
pslldq_instruction: |
mov [postbyte_register],al |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
4950,9 → 4998,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
jmp mmx_nomem_imm8 |
movpd_instruction: |
5004,9 → 5050,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
jmp instruction_ready |
movlpd_instruction: |
5020,9 → 5064,7 |
cmp al,10h |
jne sse_mem |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
5040,9 → 5082,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
5092,10 → 5132,15 |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov [postbyte_register],al |
cmp ah,4 |
je movmskps_reg_ok |
cmp ah,8 |
jne invalid_operand_size |
cmp [code_type],64 |
jne invalid_operand |
movmskps_reg_ok: |
mov [operand_size],0 |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
jne invalid_operand |
5102,120 → 5147,9 |
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 nomem_instruction_ready |
cmppd_instruction: |
mov [opcode_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 [opcode_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 [opcode_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 [opcode_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 [opcode_prefix],0F3h |
jmp cmp_sx_instruction |
cmp_sd_instruction: |
mov [mmx_size],8 |
mov [opcode_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 ebx ecx edx |
call get_nextbyte |
pop edx ecx ebx |
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 |
je sse_xmmreg_xmmreg_ok |
jmp invalid_operand |
|
cvtpi2pd_instruction: |
mov [opcode_prefix],66h |
cvtpi2ps_instruction: |
5226,9 → 5160,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
5267,10 → 5199,9 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
cvtsi_xmmreg: |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
5285,7 → 5216,10 |
cmp [operand_size],0 |
je cvtsi_size_ok |
cmp [operand_size],4 |
je cvtsi_size_ok |
cmp [operand_size],8 |
jne invalid_operand_size |
call operand_64bit |
cvtsi_size_ok: |
jmp instruction_ready |
cvtsi_xmmreg_reg: |
5413,13 → 5347,9 |
|
sse4_instruction_38_xmm0: |
mov [immediate_size],-1 |
jmp sse4_instruction_38 |
sse4_instruction_38_imm8: |
mov [immediate_size],1 |
sse4_instruction_38: |
mov [mmx_size],16 |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
mov [supplemental_code],al |
mov al,38h |
jmp sse_instruction |
5433,14 → 5363,17 |
jmp sse4_instruction_3a_setup |
sse4_instruction_3a_imm8: |
mov [immediate_size],1 |
sse4_instruction_3a: |
mov [mmx_size],16 |
sse4_instruction_3a_setup: |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
mov [supplemental_code],al |
mov al,3Ah |
jmp sse_instruction |
pclmulqdq_instruction: |
mov byte [value],al |
mov [mmx_size],16 |
mov al,44h |
jmp sse4_instruction_3a_setup |
extractps_instruction: |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
5468,9 → 5401,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
pop ecx ebx edx |
jmp mmx_imm8 |
5487,9 → 5418,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
pop ebx |
mov al,bh |
5500,19 → 5429,18 |
call operand_64bit |
jmp mmx_nomem_imm8 |
insertps_instruction: |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
mov [extended_code],3Ah |
mov [supplemental_code],21h |
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 |
call convert_xmm_register |
mov [postbyte_register],al |
insertps_xmmreg: |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
mov [extended_code],3Ah |
mov [supplemental_code],21h |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
5520,7 → 5448,7 |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
je insertps_reg |
je insertps_xmmreg_reg |
cmp al,'[' |
jne invalid_operand |
call get_address |
5530,7 → 5458,7 |
jne invalid_operand_size |
insertps_size_ok: |
jmp mmx_imm8 |
insertps_reg: |
insertps_xmmreg_reg: |
lods byte [esi] |
call convert_mmx_register |
mov bl,al |
5564,6 → 5492,10 |
cmp [operand_size],0 |
jne invalid_operand_size |
pextr_size_ok: |
cmp al,8 |
jne pextr_prefix_ok |
call operand_64bit |
pextr_prefix_ok: |
push edx ebx ecx |
mov [operand_size],0 |
lods byte [esi] |
5574,9 → 5506,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
pop ecx ebx edx |
jmp mmx_imm8 |
5633,7 → 5563,7 |
jmp pinsr_instruction |
pinsrq_instruction: |
mov [mmx_size],8 |
jmp pinsr_instruction |
call operand_64bit |
pinsr_instruction: |
mov [opcode_prefix],66h |
mov [base_code],0Fh |
5644,10 → 5574,9 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
pinsr_xmmreg: |
mov [operand_size],0 |
lods byte [esi] |
cmp al,',' |
5705,9 → 5634,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
5728,12 → 5655,12 |
jmp instruction_ready |
pmovsx_xmmreg_reg: |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
jmp nomem_instruction_ready |
|
fxsave_instruction_64bit: |
call operand_64bit |
fxsave_instruction: |
mov [extended_code],0AEh |
mov [base_code],0Fh |
5794,12 → 5721,10 |
movntq_instruction: |
mov [mmx_size],8 |
jmp movnt_instruction |
movntpd_instruction: |
mov [opcode_prefix],66h |
movntps_instruction: |
mov [mmx_size],16 |
jmp movnt_instruction |
movntdq_instruction: |
mov [opcode_prefix],66h |
mov [mmx_size],16 |
movnt_instruction: |
mov [extended_code],al |
mov [base_code],0Fh |
5852,9 → 5777,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
jmp instruction_ready |
|
5937,9 → 5860,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
lods byte [esi] |
cmp al,',' |
5960,9 → 5881,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
5986,9 → 5905,7 |
extrq_xmmreg_xmmreg: |
inc [extended_code] |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
jmp nomem_instruction_ready |
insertq_instruction: |
6000,9 → 5917,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov [postbyte_register],al |
mov [operand_size],0 |
lods byte [esi] |
6013,9 → 5928,7 |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_mmx_register |
cmp ah,16 |
jne invalid_operand_size |
call convert_xmm_register |
mov bl,al |
cmp byte [esi],',' |
je insertq_with_imm |
6140,8 → 6053,6 |
jne invalid_operand |
lods byte [esi] |
call get_size_operator |
; cmp al,10h |
; je movbe_reg_reg |
cmp al,'[' |
jne invalid_argument |
call get_address |
6148,13 → 6059,6 |
mov al,[operand_size] |
call operand_autodetect |
jmp instruction_ready |
; movbe_reg_reg: |
; lods byte [esi] |
; call convert_register |
; mov bl,al |
; mov al,ah |
; call operand_autodetect |
; jmp nomem_instruction_ready |
movbe_mem: |
inc [supplemental_code] |
call get_address |
6382,6 → 6286,38 |
mov ah,bl |
jmp simple_svm_detect_size |
|
rdrand_instruction: |
mov [base_code],0Fh |
mov [extended_code],0C7h |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
call operand_autodetect |
jmp nomem_instruction_ready |
rdfsbase_instruction: |
mov [opcode_prefix],0F3h |
mov [base_code],0Fh |
mov [extended_code],0AEh |
mov [postbyte_register],al |
lods byte [esi] |
call get_size_operator |
cmp al,10h |
jne invalid_operand |
lods byte [esi] |
call convert_register |
mov bl,al |
mov al,ah |
cmp ah,2 |
je invalid_operand_size |
call operand_autodetect |
jmp nomem_instruction_ready |
|
convert_register: |
mov ah,al |
shr ah,4 |
6426,6 → 6362,8 |
cmp ah,0Bh |
jne invalid_operand |
mov ah,8 |
cmp [vex_required],0 |
jne invalid_operand |
jmp match_register_size |
xmm_register: |
and al,0Fh |
6435,6 → 6373,12 |
cmp [code_type],64 |
jne invalid_operand |
jmp match_register_size |
convert_xmm_register: |
mov ah,al |
shr ah,4 |
cmp ah,0Ch |
je xmm_register |
jmp invalid_operand |
get_size_operator: |
xor ah,ah |
cmp al,11h |
6553,10 → 6497,12 |
mov al,[segment_register] |
or al,al |
jz segment_prefix_ok |
cmp al,4 |
ja segment_prefix_386 |
cmp [code_type],64 |
je segment_prefix_ok |
cmp al,3 |
je ss_prefix |
cmp al,4 |
ja segment_prefix_386 |
jb segment_prefix_86 |
cmp bl,25h |
je segment_prefix_86 |
6595,6 → 6541,8 |
segment_prefix_ok: |
ret |
store_instruction_code: |
cmp [vex_required],0 |
jne store_vex_instruction_code |
mov al,[operand_prefix] |
or al,al |
jz operand_prefix_ok |
6656,6 → 6604,25 |
or [rex_prefix],44h |
and [postbyte_register],111b |
reg_code_ok: |
cmp [code_type],64 |
jne address_value_ok |
xor eax,eax |
bt edx,31 |
sbb eax,[address_high] |
jz address_value_ok |
cmp [address_high],0 |
jne address_value_out_of_range |
test ch,44h |
jnz address_value_ok |
test bx,8080h |
jz address_value_ok |
address_value_out_of_range: |
cmp [error_line],0 |
jne address_value_ok |
mov edx,[current_line] |
mov [error_line],edx |
mov [error],value_out_of_range |
address_value_ok: |
call store_segment_prefix_if_necessary |
or bx,bx |
jz address_immediate |
6774,18 → 6741,9 |
jne invalid_address_size |
address_prefix_ok: |
cmp bl,44h |
je swap_base_with_index |
cmp bl,84h |
jne base_register_ok |
swap_base_with_index: |
cmp cl,1 |
jne invalid_address |
xchg bl,bh |
cmp bl,44h |
je invalid_address |
cmp bl,84h |
je invalid_address |
base_register_ok: |
test bh,1000b |
jz base_code_ok |
or [rex_prefix],41h |
6842,20 → 6800,6 |
shl cl,3 |
or al,cl |
stos word [edi] |
address_32bit_value: |
cmp [code_type],64 |
jne store_address_32bit_value |
mov eax,edx |
cdq |
cmp edx,[address_high] |
je address_32bit_value_ok |
cmp [error_line],0 |
jne address_32bit_value_ok |
mov edx,[current_line] |
mov [error_line],edx |
mov [error],value_out_of_range |
address_32bit_value_ok: |
mov edx,eax |
jmp store_address_32bit_value |
sib_address_8bit_value: |
or al,01000000b |
6886,12 → 6830,12 |
or al,cl |
stos word [edi] |
test ch,44h |
jnz address_32bit_value |
jnz store_address_32bit_value |
test ch,88h |
jnz address_32bit_value |
jnz store_address_32bit_value |
or ch,ch |
jnz invalid_address_size |
jmp address_32bit_value |
jmp store_address_32bit_value |
zero_index_register: |
mov bl,4 |
mov cl,1 |
6919,7 → 6863,7 |
shl cl,3 |
or al,cl |
stos byte [edi] |
jmp address_32bit_value |
jmp store_address_32bit_value |
simple_address_8bit_value: |
or al,01000000b |
mov cl,[postbyte_register] |
7002,11 → 6946,6 |
jnz address_immediate_sib_32bit |
test ch,not 88h |
jnz invalid_address_size |
xor eax,eax |
bt edx,31 |
sbb eax,0 |
cmp eax,[address_high] |
jne value_out_of_range |
address_immediate_sib_store: |
call store_instruction_code |
mov al,100b |