implement analyze of ModRM
This commit is contained in:
parent
64f44d9a44
commit
35e6628ec7
1 changed files with 55 additions and 0 deletions
|
|
@ -133,6 +133,61 @@ static const instruction_t* find_instruction(const uint8_t* cur, unsigned type,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t mod;
|
||||||
|
uint8_t rm;
|
||||||
|
uint8_t has_sib;
|
||||||
|
uint8_t disp_len;
|
||||||
|
} modrm_encoding_t;
|
||||||
|
|
||||||
|
static const modrm_encoding_t modrm_encodings[] = {
|
||||||
|
{ .mod = 0b00, .rm = 0b100, .has_sib = 1, .disp_len = 0 },
|
||||||
|
{ .mod = 0b00, .rm = 0b101, .has_sib = 0, .disp_len = 4 },
|
||||||
|
|
||||||
|
{ .mod = 0b01, .rm = 0b000, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b001, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b010, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b011, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b100, .has_sib = 1, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b101, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b110, .has_sib = 0, .disp_len = 1 },
|
||||||
|
{ .mod = 0b01, .rm = 0b111, .has_sib = 0, .disp_len = 1 },
|
||||||
|
|
||||||
|
{ .mod = 0b10, .rm = 0b000, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b001, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b010, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b011, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b100, .has_sib = 1, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b101, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b110, .has_sib = 0, .disp_len = 4 },
|
||||||
|
{ .mod = 0b10, .rm = 0b111, .has_sib = 0, .disp_len = 4 },
|
||||||
|
};
|
||||||
|
static const unsigned modrm_encodings_len = sizeof(modrm_encodings) / sizeof(modrm_encoding_t);
|
||||||
|
|
||||||
|
// analyze ModRM and determine if it employs SIB byte,
|
||||||
|
// as well as any displacements
|
||||||
|
static void analyzy_modrm(const uint8_t modrm, uint8_t* has_sib, uint8_t* disp_len)
|
||||||
|
{
|
||||||
|
const uint8_t mod = modrm >> 6;
|
||||||
|
const uint8_t rm = modrm & 0b111;
|
||||||
|
|
||||||
|
// default values
|
||||||
|
*has_sib = 0;
|
||||||
|
*disp_len = 0;
|
||||||
|
|
||||||
|
// now lets look up in table and if matches
|
||||||
|
// set proper values
|
||||||
|
for (unsigned i = 0; i < modrm_encodings_len; i++)
|
||||||
|
{
|
||||||
|
modrm_encoding_t* encoding = &modrm_encodings[i];
|
||||||
|
if (encoding->mod == mod && encoding->rm == rm)
|
||||||
|
{
|
||||||
|
*has_sib = encoding->has_sib;
|
||||||
|
*disp_len = encoding->disp_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int rtdisasm_analyze_single(const uint8_t* code, uint8_t size)
|
int rtdisasm_analyze_single(const uint8_t* code, uint8_t size)
|
||||||
{
|
{
|
||||||
const uint8_t* cur = code;
|
const uint8_t* cur = code;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue