From 070649a6c2d434208a202d4f09a3256cd3bbfe78 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 4 Oct 2009 13:36:02 +0000 Subject: Fixed a bug in relative jump operands. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@124 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 5 +++++ src/arch/x86/operand.c | 24 +++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23f00e8..28d1fdf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 09-10-04 Cyrille Bagard + * src/arch/x86/operand.c: + Fix a bug in relative jump operands. + +09-10-04 Cyrille Bagard + * src/arch/x86/instruction.c: * src/arch/x86/instruction.h: * src/arch/x86/opcodes.h: diff --git a/src/arch/x86/operand.c b/src/arch/x86/operand.c index 3a37d0a..2c27176 100644 --- a/src/arch/x86/operand.c +++ b/src/arch/x86/operand.c @@ -789,36 +789,34 @@ GArchOperand *g_x86_relative_operand_new(const bin_t *data, off_t *pos, off_t le { GX86RelativeOperand *result; /* Structure à retourner */ off_t init_pos; /* Position avant lecture */ - uint8_t val8; /* Valeur sur 8 bits */ - uint16_t val16; /* Valeur sur 16 bits */ - uint32_t val32; /* Valeur sur 32 bits */ - uint32_t address32; /* Adresse finale visée */ + int8_t val8; /* Valeur sur 8 bits */ + int16_t val16; /* Valeur sur 16 bits */ + int32_t val32; /* Valeur sur 32 bits */ + vmpa_t address; /* Adresse finale visée */ init_pos = *pos; switch (size) { case AOS_8_BITS_UNSIGNED: - read_u8(&val8, data, pos, len, SRE_LITTLE); - address32 = val8; + read_s8(&val8, data, pos, len, SRE_LITTLE); + address = base + (*pos - init_pos) + val8; break; case AOS_16_BITS_UNSIGNED: - read_u16(&val16, data, pos, len, SRE_LITTLE); - address32 = val16; + read_s16(&val16, data, pos, len, SRE_LITTLE); + address = base + (*pos - init_pos) + val16; break; case AOS_32_BITS_UNSIGNED: - read_u32(&val32, data, pos, len, SRE_LITTLE); - address32 = val32; + read_s32(&val32, data, pos, len, SRE_LITTLE); + address = base + (*pos - init_pos) + val32; break; default: return NULL; break; } - address32 += base + (*pos - init_pos); - result = g_object_new(G_TYPE_X86_RELATIVE_OPERAND, NULL); - result->immediate = g_imm_operand_new_from_value(AOS_32_BITS/*FIXME*/, address32); + result->immediate = g_imm_operand_new_from_value(AOS_32_BITS/*FIXME*/, (uint32_t)address/* FIXME */); return G_ARCH_OPERAND(result); -- cgit v0.11.2-87-g4458