summaryrefslogtreecommitdiff
path: root/src/arch/x86/operand.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/operand.c')
-rw-r--r--src/arch/x86/operand.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/arch/x86/operand.c b/src/arch/x86/operand.c
index 375b0a5..e13c793 100644
--- a/src/arch/x86/operand.c
+++ b/src/arch/x86/operand.c
@@ -1300,7 +1300,8 @@ asm_x86_operand *x86_create_rel1632_operand_in_32b(uint64_t base, const uint8_t
{
asm_x86_operand *result; /* Emplacement à retourner */
off_t init_pos; /* Position avant lecture */
- int8_t offset; /* Décallage à appliquer */
+ int32_t offset32; /* Décallage 32b à appliquer */
+ int16_t offset16; /* Décallage 16b à appliquer */
uint32_t address; /* Adresse finale visée */
result = create_new_x86_operand();
@@ -1308,13 +1309,28 @@ asm_x86_operand *x86_create_rel1632_operand_in_32b(uint64_t base, const uint8_t
init_pos = *pos;
address = base;
- if (!read_imm_value(is_reg32 ? AOS_32_BITS : AOS_16_BITS, data, pos, len, &offset))
+ if (is_reg32)
{
- free(result);
- return NULL;
+ if (!read_imm_value(AOS_32_BITS, data, pos, len, &offset32))
+ {
+ free(result);
+ return NULL;
+ }
+
+ address = base + (*pos - init_pos) + offset32;
+
}
+ else
+ {
+ if (!read_imm_value(AOS_16_BITS, data, pos, len, &offset16))
+ {
+ free(result);
+ return NULL;
+ }
- address = base + (*pos - init_pos) + offset;
+ address = base + (*pos - init_pos) + offset16;
+
+ }
if (!fill_imm_operand_with_value(ASM_OPERAND(result), AOS_32_BITS, &address))
{