НЭТ БИЛЭТ
Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР
Репутация: нет Всего: 41
|
Адаптировал под Delphi Код | function lde_opcode_length(opcode_ptr:pointer):cardinal; const MOR =$80;// 10000000b ADR =$40;// 01000000b IMM =$20;// 00100000b SPE =$10;// 00010000b PREFIX_COUNT =11; begin asm pushad // bh - prefix_count // bl - instr_length // dh - imm_size // dl - adr_size
xor eax, eax mov edx, 00000404h xor ebx, ebx mov esi, [opcode_ptr]
// cld ; should work without it
@lde_prefix_loop: mov al, [esi] inc bl inc esi
cmp bh, 4 jz @lde_not_prefix
mov ecx, PREFIX_COUNT lea edi, @d_lde_prefix_table repnz scasb jnz @lde_not_prefix
inc bh
cmp al, 066h jnz @F0 mov dh, 2 // immediate is word jmp @lde_prefix_loop
@F0: cmp al, 067h jnz @lde_prefix_loop mov dl, 2 // address is word jmp @lde_prefix_loop
@lde_not_prefix: cmp al, 0Fh jz @lde_two_byte_opcode
test byte [esi], 00111000b jnz @F1
cmp al, 0F6h jnz @check_f7 inc bl jmp @F1
@check_f7: cmp al, 0F7h jnz @F1 add bl, dh
@F1: lea ecx, @d_lde_opcode_table1 jmp @lde_check_length_table
@lde_two_byte_opcode: mov al, [esi] inc bl inc esi lea ecx, @d_lde_opcode_table2
@lde_check_length_table: mov al, [ecx + eax] mov ah, al and al, 0Fh add bl, al
test ah, MOR // modr/m byte jz @lde_no_modrm_byte
@lde_check_modrm_byte: mov al, [esi] mov cl, al and cl, 00000111b inc bl
// if mod = 00b test al, 11000000b jnz @lde_mod_not_zero cmp cl, 00000100b jz @lde_check_sib cmp cl, 00000101b jnz @lde_no_modrm_byte add bl, 4 jmp @lde_no_modrm_byte
// if mod = 01b
@lde_mod_not_zero: test al, 01000000b jz @lde_mod_not_four test al, 10000000b jnz @lde_no_modrm_byte inc bl cmp cl, 00000100b jz @lde_check_sib jmp @lde_no_modrm_byte
@lde_mod_not_four: test al, 10000000b jz @lde_no_modrm_byte add bl, dl cmp cl, 00000100b jz @lde_check_sib jmp @lde_no_modrm_byte
@lde_check_sib: inc bl mov cl, [esi + 1] and cl, 00000111b
cmp cl, 00000101b jnz @lde_no_modrm_byte test al, 01000000b jz @F2
inc bl jmp @lde_no_modrm_byte
@F2: add bl, dl
@lde_no_modrm_byte: test ah, ADR // address hardcoded jz @F3 add bl, dl
@F3: test ah, IMM // immediate value jz @F4 add bl, dh
@F4: test ah, SPE // special jz @lde_processed
@lde_check_special_opcode: mov al, [esi] inc bl
cmp al, 0C0h jnb @lde_processed
mov ah, al shr ah, 4 and ah, 00001100b and al, 00000111b
test ah, ah jnz @lde_spe_mod_not_zero
cmp al, 4 jnz @F5 inc bl jmp @lde_processed
@F5: cmp al, 5 jnz @lde_spe_mod_not_zero add bl, 4 jmp @lde_processed
@lde_spe_mod_not_zero: cmp ah, 4 jnz @lde_spe_mod_not_four inc bl cmp al, 4 jnz @lde_processed inc bl jmp @lde_processed
@lde_spe_mod_not_four: cmp ah, 8 jnz @lde_processed add bl, 4 cmp al, 4 jnz @lde_processed inc bl
@lde_processed: jmp @end ///////////////////////// @d_lde_prefix_table: db 064h, 065h, 066h, 067h, 026h, 02Eh, 036h, 03Eh, 0F0h, 0F2h, 0F3h // 0 1 2 3 4 5 6 7 8 9 A B C D E F @d_lde_opcode_table1: db MOR, MOR, MOR, MOR, 001, IMM, 000, 000, MOR, MOR, MOR, MOR, 001, IMM, 000, 000 db MOR, MOR, MOR, MOR, 001, IMM, 000, 000, MOR, MOR, MOR, MOR, 001, IMM, 000, 000 db MOR, MOR, MOR, MOR, 001, IMM, 000, 000, MOR, MOR, MOR, MOR, 001, IMM, 000, 000 db MOR, MOR, MOR, MOR, 001, IMM, 000, 000, MOR, MOR, MOR, MOR, 001, IMM, 000, 000 db 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000 db 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000 db 000, 000, MOR, MOR, 000, 000, 000, 000, IMM, MOR+IMM, 001, MOR+001, 000, 000, 000, 000 db 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001 db MOR+001, MOR+IMM, MOR+001, MOR+001, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 006, 000, 000, 000, 000, 000 db ADR, ADR, ADR, ADR, 000, 000, 000, 000, 001, IMM, 000, 000, 000, 000, 000, 000 db 001, 001, 001, 001, 001, 001, 001, 001, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM db MOR+001, MOR+001, 002, 000, MOR, MOR, MOR+001,MOR+IMM, 003, 000, 002, 000, 000, 001, 000, 000 db MOR, MOR, MOR, MOR, 001, 001, 000, 000, SPE, SPE, SPE, SPE, SPE, SPE, SPE, SPE db 001, 001, 001, 001, 001, 001, 001, 001, IMM, IMM, 006, 001, 000, 000, 000, 000 db 000, 000, 000, 000, 000, 000, MOR, MOR, 000, 000, 000, 000, 000, 000, MOR, MOR // 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0 1 2 3 4 5 6 7 8 9 A B C D E F @d_lde_opcode_table2:db MOR, MOR, MOR, MOR, 000, 000, 000, 000, 000, 000, 000, 000, 000, MOR, 000, 000 db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, 000, 000, 000, 000, 000, 000, 000 db 001, 001, 001, 001, 001, 000, 001, 000, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000 db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db MOR+001, 002, 002, 002, MOR, MOR, MOR, 000, 000, 000, 000, 000, MOR, MOR, MOR, MOR db IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM, IMM db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db 000, 000, 000, MOR, MOR+001, MOR, 000, 000, 000, 000, 000, MOR, MOR+001, MOR, MOR, MOR db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, 000, 000, MOR+001, MOR, MOR, MOR, MOR, MOR db MOR, MOR, MOR+001, MOR, MOR+001, MOR+001, MOR+001,MOR, 000, 000, 000, 000, 000, 000, 000, 000 db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR db MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, MOR, 000 // 0 1 2 3 4 5 6 7 8 9 A B C D E F ///////////////////////// @end: movzx eax, bl mov result,eax popad end; end;
|
500mhz, еще раз спасибо. Это сообщение отредактировал(а) Чучмек - 30.3.2011, 21:44
--------------------
умную мысль держи при себе, а дурной - поделись с другими
|