format: Handle offset operands properly

This commit is contained in:
Alexis Engelke
2020-06-14 13:55:59 +02:00
parent 9454f5f746
commit 8716bd1991
3 changed files with 14 additions and 7 deletions

View File

@@ -55,7 +55,7 @@ fd_format(const FdInstr* instr, char* buffer, size_t len)
if (op_type == FD_OT_NONE)
break;
const char* op_type_name = &"reg\0imm\0mem"[op_type * 4] - 4;
const char* op_type_name = &"reg\0imm\0mem\0off"[op_type * 4] - 4;
FMT_CONCAT(buf, end, " %s%u:", op_type_name, FD_OP_SIZE(instr, i));
switch (op_type)
@@ -70,6 +70,14 @@ fd_format(const FdInstr* instr, char* buffer, size_t len)
else
FMT_CONCAT(buf, end, "r%u", FD_OP_REG(instr, i));
break;
case FD_OT_OFF:
if (FD_OP_SIZE(instr, i) == 2)
FMT_CONCAT(buf, end, "ip+");
else if (FD_OP_SIZE(instr, i) == 4)
FMT_CONCAT(buf, end, "eip+");
else if (FD_OP_SIZE(instr, i) == 8)
FMT_CONCAT(buf, end, "rip+");
// fallthrough
case FD_OT_IMM:
immediate = FD_OP_IMM(instr, i);
if (FD_OP_SIZE(instr, i) == 1)

View File

@@ -1,4 +1,4 @@
decode32 e900000000 [JMP imm4:0x1234005]
decode32 66e90100 [JMP imm2:0x4005]
decode64 e900000000 [JMP imm8:0x1234005]
decode64 66e900000000 [JMP imm8:0x1234006]
decode32 e900000000 [JMP off4:eip+0x0]
decode32 66e90100 [JMP off2:ip+0x1]
decode64 e900000000 [JMP off8:rip+0x0]
decode64 66e900000000 [JMP off8:rip+0x0]

View File

@@ -58,8 +58,7 @@ main(int argc, char** argv)
while (current_off != length)
{
size_t remaining = length - current_off;
int retval = fd_decode(code + current_off, remaining, mode,
0x1234000, &instr);
int retval = fd_decode(code + current_off, remaining, mode, 0, &instr);
if (retval < 0)
goto fail;
current_off += retval;