From 37edc4e721e4d7a13837b68c6f896b24cf1bb227 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 25 Apr 2011 01:37:10 +0000 Subject: [PATCH] Disassembling some more i386 --- src/arch/i386.h | 24 ++++++++++++----------- src/arch/i386.ins | 50 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/src/arch/i386.h b/src/arch/i386.h index 949a8c4..49c9a0d 100644 --- a/src/arch/i386.h +++ b/src/arch/i386.h @@ -35,9 +35,9 @@ static int _decode_dregister(ArchPlugin * plugin, ArchInstructionCall * call, static int _decode_immediate(ArchPlugin * plugin, ArchInstructionCall * call, size_t i); static int _decode_modrm(ArchPlugin * plugin, ArchInstructionCall * call, - size_t i); + size_t * i); static int _decode_operand(ArchPlugin * plugin, ArchInstructionCall * call, - size_t i); + size_t * i); static int _decode_register(ArchPlugin * plugin, ArchInstructionCall * call, size_t i); @@ -85,7 +85,7 @@ static int _i386_decode(ArchPlugin * plugin, ArchInstructionCall * call) call->operands[1].type = ai->op2; call->operands[2].type = ai->op3; for(i = 0; i < 3 && AO_GET_TYPE(call->operands[i].type) != 0; i++) - if(_decode_operand(plugin, call, i) != 0) + if(_decode_operand(plugin, call, &i) != 0) return -1; call->operands_cnt = i; return 0; @@ -154,10 +154,10 @@ static int _decode_immediate(ArchPlugin * plugin, ArchInstructionCall * call, } static int _decode_modrm(ArchPlugin * plugin, ArchInstructionCall * call, - size_t i) + size_t * i) { ArchPluginHelper * helper = plugin->helper; - ArchOperand * ao = &call->operands[i]; + ArchOperand * ao = &call->operands[*i]; uint8_t u8; uint32_t uW; /* XXX should be uintW_t */ ArchRegister * ar; @@ -202,23 +202,25 @@ static int _decode_modrm(ArchPlugin * plugin, ArchInstructionCall * call, ao->type = AO_DREGISTER(0, 0, W, 0); ao->value.dregister.name = ar->name; } + /* FIXME really implement the next operand */ + (*i)++; return 0; } static int _decode_operand(ArchPlugin * plugin, ArchInstructionCall * call, - size_t i) + size_t * i) { - if(AO_GET_FLAGS(call->operands[i].type) & AOF_I386_MODRM) + if(AO_GET_FLAGS(call->operands[*i].type) & AOF_I386_MODRM) return _decode_modrm(plugin, call, i); - switch(AO_GET_TYPE(call->operands[i].type)) + switch(AO_GET_TYPE(call->operands[*i].type)) { /* FIXME implement the rest */ case AOT_DREGISTER: - return _decode_dregister(plugin, call, i); + return _decode_dregister(plugin, call, *i); case AOT_IMMEDIATE: - return _decode_immediate(plugin, call, i); + return _decode_immediate(plugin, call, *i); case AOT_REGISTER: - return _decode_register(plugin, call, i); + return _decode_register(plugin, call, *i); } return -error_set_code(1, "%s", strerror(ENOSYS)); } diff --git a/src/arch/i386.ins b/src/arch/i386.ins index 9e9f0df..4dfedbe 100644 --- a/src/arch/i386.ins +++ b/src/arch/i386.ins @@ -51,6 +51,12 @@ #define OP_RW AO_REGISTER(0, W, 0) #define OP_al AO_REGISTER(AOF_IMPLICIT, REG_al_size, REG_al_id) #define OP_cl AO_REGISTER(AOF_IMPLICIT, REG_cl_size, REG_cl_id) +#define OP_dl AO_REGISTER(AOF_IMPLICIT, REG_dl_size, REG_dl_id) +#define OP_bl AO_REGISTER(AOF_IMPLICIT, REG_bl_size, REG_bl_id) +#define OP_ah AO_REGISTER(AOF_IMPLICIT, REG_ah_size, REG_ah_id) +#define OP_ch AO_REGISTER(AOF_IMPLICIT, REG_ch_size, REG_ch_id) +#define OP_dh AO_REGISTER(AOF_IMPLICIT, REG_dh_size, REG_dh_id) +#define OP_bh AO_REGISTER(AOF_IMPLICIT, REG_bh_size, REG_bh_id) #define OP_cs AO_REGISTER(AOF_IMPLICIT, REG_cs_size, REG_cs_id) #define OP_ds AO_REGISTER(AOF_IMPLICIT, REG_ds_size, REG_ds_id) #define OP_es AO_REGISTER(AOF_IMPLICIT, REG_es_size, REG_es_id) @@ -692,15 +698,43 @@ /* LOOPZ 0xe1 1 rel8 */ { "loopz", 0xe1, OP1F, OP_S8, AOT_NONE, AOT_NONE }, /* MOV 0x88 1 r/m8 r8 */ -{ "mov", 0x88, OP1F, OP_RM8_D0_R,OP_R8, AOT_NONE }, -{ "mov", 0x88, OP1F, OP_RM8_D8_R,OP_R8, AOT_NONE }, -{ "mov", 0x88, OP1F, OP_RM8_DW_R,OP_R8, AOT_NONE }, -{ "mov", 0x88, OP1F, OP_RM8_R8_R,OP_R8, AOT_NONE }, +{ "mov", 0x88, OP1F, OP_RM8_D0, OP_R8, AOT_NONE }, +{ "mov", 0x88, OP1F, OP_RM8_D8, OP_R8, AOT_NONE }, +{ "mov", 0x88, OP1F, OP_RM8_DW, OP_R8, AOT_NONE }, +{ "mov", 0x88, OP1F, OP_RM8_R8, OP_R8, AOT_NONE }, /* MOV 0x89 1 r/mW rW */ -{ "mov", 0x89, OP1F, OP_RMW_D0_R,OP_RW, AOT_NONE }, -{ "mov", 0x89, OP1F, OP_RMW_D8_R,OP_RW, AOT_NONE }, -{ "mov", 0x89, OP1F, OP_RMW_DW_R,OP_RW, AOT_NONE }, -{ "mov", 0x89, OP1F, OP_RMW_RW_R,OP_RW, AOT_NONE }, +{ "mov", 0x89, OP1F, OP_RMW_D0, OP_RW, AOT_NONE }, +{ "mov", 0x89, OP1F, OP_RMW_D8, OP_RW, AOT_NONE }, +{ "mov", 0x89, OP1F, OP_RMW_DW, OP_RW, AOT_NONE }, +{ "mov", 0x89, OP1F, OP_RMW_RW, OP_RW, AOT_NONE }, +/* MOV 0xb0 +rb 1 r8 imm8 */ +{ "mov", 0xb0, OP1F, OP_al, OP_S8, AOT_NONE }, +{ "mov", 0xb1, OP1F, OP_cl, OP_S8, AOT_NONE }, +{ "mov", 0xb2, OP1F, OP_dl, OP_S8, AOT_NONE }, +{ "mov", 0xb3, OP1F, OP_bl, OP_S8, AOT_NONE }, +{ "mov", 0xb4, OP1F, OP_ah, OP_S8, AOT_NONE }, +{ "mov", 0xb5, OP1F, OP_ch, OP_S8, AOT_NONE }, +{ "mov", 0xb6, OP1F, OP_dh, OP_S8, AOT_NONE }, +{ "mov", 0xb7, OP1F, OP_bh, OP_S8, AOT_NONE }, +/* MOV 0xb8 +rw 1 rW immW */ +{ "mov", 0xb8, OP1F, OP_AX, OP_SW, AOT_NONE }, +{ "mov", 0xb9, OP1F, OP_CX, OP_SW, AOT_NONE }, +{ "mov", 0xba, OP1F, OP_DX, OP_SW, AOT_NONE }, +{ "mov", 0xbb, OP1F, OP_BX, OP_SW, AOT_NONE }, +{ "mov", 0xbc, OP1F, OP_SP, OP_SW, AOT_NONE }, +{ "mov", 0xbd, OP1F, OP_BP, OP_SW, AOT_NONE }, +{ "mov", 0xbe, OP1F, OP_SI, OP_SW, AOT_NONE }, +{ "mov", 0xbf, OP1F, OP_DI, OP_SW, AOT_NONE }, +/* MOV 0xc6 /0 1 r/m8 imm8 */ +{ "mov", 0xc6, OP1F, OP_RM8_D0+0,OP_S8, AOT_NONE }, +{ "mov", 0xc6, OP1F, OP_RM8_D8+0,OP_S8, AOT_NONE }, +{ "mov", 0xc6, OP1F, OP_RM8_DW+0,OP_S8, AOT_NONE }, +{ "mov", 0xc6, OP1F, OP_RM8_R8+0,OP_S8, AOT_NONE }, +/* MOV 0xc7 /0 1 r/mW immW */ +{ "mov", 0xc7, OP1F, OP_RMW_D0+0,OP_SW, AOT_NONE }, +{ "mov", 0xc7, OP1F, OP_RMW_D8+0,OP_SW, AOT_NONE }, +{ "mov", 0xc7, OP1F, OP_RMW_DW+0,OP_SW, AOT_NONE }, +{ "mov", 0xc7, OP1F, OP_RMW_RW+0,OP_SW, AOT_NONE }, /* MOV 0x0f20 /r 2 r32 cr0-cr4 */ /* FIXME implement */ /* MOV 0x0f22 /r 2 cr0-cr4 r32 */