diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/arm/v7/post.c | 8 | ||||
-rw-r--r-- | src/arch/raw.c | 132 | ||||
-rw-r--r-- | src/arch/raw.h | 6 |
3 files changed, 140 insertions, 6 deletions
diff --git a/src/arch/arm/v7/post.c b/src/arch/arm/v7/post.c index 084fc84..c7b0f64 100644 --- a/src/arch/arm/v7/post.c +++ b/src/arch/arm/v7/post.c @@ -51,7 +51,7 @@ void post_process_branch_instructions(GArchInstruction *instr, GProcContext *con uint32_t addr; /* Adresse visée par le saut */ GArchOperand *new; /* Instruction de ciblage */ vmpa2t target; - mrange_t trange; + mrange_t trange; /* Etendue du symbole à créer */ VMPA_BUFFER(loc); char name[5 + VMPA_MAX_LEN]; GBinRoutine *routine; /* Nouvelle routine trouvée */ @@ -114,7 +114,7 @@ void post_process_branch_and_link_instructions(GArchInstruction *instr, GProcCon uint32_t addr; /* Adresse visée par le saut */ GArchOperand *new; /* Instruction de ciblage */ vmpa2t target; - mrange_t trange; + mrange_t trange; /* Etendue du symbole à créer */ VMPA_BUFFER(loc); char name[5 + VMPA_MAX_LEN]; GBinRoutine *routine; /* Nouvelle routine trouvée */ @@ -177,7 +177,7 @@ void post_process_comp_and_branch_instructions(GArchInstruction *instr, GProcCon uint32_t addr; /* Adresse visée par le saut */ GArchOperand *new; /* Instruction de ciblage */ vmpa2t target; - mrange_t trange; + mrange_t trange; /* Etendue du symbole à créer */ VMPA_BUFFER(loc); char name[5 + VMPA_MAX_LEN]; GBinRoutine *routine; /* Nouvelle routine trouvée */ @@ -240,7 +240,7 @@ void post_process_ldr_instructions(GArchInstruction *instr, GProcContext *contex uint32_t addr; /* Adresse visée par le saut */ GArchOperand *new; /* Instruction de ciblage */ vmpa2t target; - mrange_t trange; + mrange_t trange; /* Etendue du symbole à créer */ VMPA_BUFFER(loc); char name[5 + VMPA_MAX_LEN]; GBinRoutine *routine; /* Nouvelle routine trouvée */ diff --git a/src/arch/raw.c b/src/arch/raw.c index 808d973..3338613 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -24,6 +24,8 @@ #include "raw.h" +#include <assert.h> +#include <ctype.h> #include <string.h> @@ -41,6 +43,7 @@ struct _GRawInstruction GArchInstruction parent; /* A laisser en premier */ bool is_padding; /* Bourrage à représenter ? */ + bool is_string; /* Chaîne de caractères ? */ }; @@ -370,16 +373,24 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB GArchInstruction *base; /* Autre version de l'instance */ const char *key; /* Mot clef principal */ size_t klen; /* Taille de ce mot clef */ + char *string; /* Chaîne reconstituée */ + size_t iter; /* Tête d'écriture */ + bool first; /* Mémorise une énumération */ + size_t i; /* Boucle de parcours */ + char byte; /* Octet à afficher (ou pas) */ + bool status; /* Bilan d'une récupération */ base = G_ARCH_INSTRUCTION(instr); - if (!instr->is_padding) + if (!instr->is_padding && !instr->is_string) result = G_ARCH_INSTRUCTION_CLASS(g_raw_instruction_parent_class)->print(base, buffer, msize, content, syntax); else { result = g_code_buffer_append_new_line(buffer, &base->range); + g_buffer_line_add_flag(result, BLF_HAS_CODE); + g_buffer_line_fill_for_instr(result, msize/* TODO ! */, msize, content, base->length, true); /* Instruction proprement dite */ @@ -389,7 +400,84 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION); - g_buffer_line_insert_text(result, BLC_ASSEMBLY, "...", 3, RTT_RAW); + if (instr->is_padding) + g_buffer_line_insert_text(result, BLC_ASSEMBLY, "...", 3, RTT_RAW); + + else /*if (instr->is_string)*/ + { + string = (char *)calloc(base->operands_count + 3, sizeof(char)); + + strcpy(string, "\""); + iter = 1; + + first = true; + + for (i = 0; i < base->operands_count; i++) + { + status = g_imm_operand_get_value(G_IMM_OPERAND(base->operands[i]), MDS_8_BITS, &byte); + assert(status); + + /* Si le caractère doit apparaître en hexadécimal... */ + if (!isprint(byte)) + { + /* Si une chaîne précède */ + if (iter > 1) + { + if (!first) + { + g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT); + g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW); + } + else + first = false; + + string[iter++] = '"'; + + g_buffer_line_insert_text(result, BLC_ASSEMBLY, string, iter, RTT_STRING); + + iter = 1; + + } + + /* Impression de l'octet */ + + if (!first) + { + g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT); + g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW); + } + else + first = false; + + g_arch_operand_print(base->operands[i], result, syntax); + + } + + else + string[iter++] = byte; + + } + + /* Si une chaîne reste encore */ + if (iter > 1) + { + if (!first) + { + g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT); + g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW); + } + else + first = false; + + string[iter++] = '"'; + + g_buffer_line_insert_text(result, BLC_ASSEMBLY, string, iter, RTT_STRING); + + } + + free(string); + + } } @@ -465,3 +553,43 @@ bool g_raw_instruction_is_padding(const GRawInstruction *instr) return instr->is_padding; } + + +/****************************************************************************** +* * +* Paramètres : instr = instruction à traiter. * +* is_string = nouveau statut à associer au contenu. * +* * +* Description : Marque l'instruction comme contenant une chaîne de texte. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_raw_instruction_mark_as_string(GRawInstruction *instr, bool is_string) +{ + instr->is_string = is_string; + +} + + +/****************************************************************************** +* * +* Paramètres : instr = instruction à traiter. * +* is_string = nouveau statut à associer au contenu. * +* * +* Description : Indique si le contenu de l'instruction est un texte. * +* * +* Retour : Statut du contenu de l'instruction. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_raw_instruction_is_string(const GRawInstruction *instr) +{ + return instr->is_string; + +} diff --git a/src/arch/raw.h b/src/arch/raw.h index f7e1715..6712b81 100644 --- a/src/arch/raw.h +++ b/src/arch/raw.h @@ -67,6 +67,12 @@ void g_raw_instruction_mark_as_padding(GRawInstruction *, bool); /* Indique si le contenu de l'instruction est du bourrage. */ bool g_raw_instruction_is_padding(const GRawInstruction *); +/* Marque l'instruction comme contenant une chaîne de texte. */ +void g_raw_instruction_mark_as_string(GRawInstruction *, bool); + +/* Indique si le contenu de l'instruction est un texte. */ +bool g_raw_instruction_is_string(const GRawInstruction *); + #endif /* _ARCH_RAW_H */ |