summaryrefslogtreecommitdiff
path: root/src/arch/operand.h
blob: e08366898c05b3862c411ced8df66c25c0cf37be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

/* OpenIDA - Outil d'analyse de fichiers binaires
 * operand.h - prototypes pour la gestion générique des opérandes
 *
 * Copyright (C) 2008 Cyrille Bagard
 *
 *  This file is part of OpenIDA.
 *
 *  OpenIDA is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  OpenIDA is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _ARCH_OPERAND_H
#define _ARCH_OPERAND_H


#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>



/* Taille des données intégrées */
typedef enum _AsmOperandSize
{
    AOS_UNDEFINED,                          /* Taille non définie          */

    AOS_8_BITS_UNSIGNED,                    /* Opérande sur 8 bits n.-s.   */
    AOS_16_BITS_UNSIGNED,                   /* Opérande sur 16 bits n.-s.  */
    AOS_32_BITS_UNSIGNED,                   /* Opérande sur 32 bits n.-s.  */
    AOS_64_BITS_UNSIGNED,                   /* Opérande sur 64 bits n.-s.  */

    AOS_8_BITS_SIGNED,                      /* Opérande sur 8 bits  signés */
    AOS_16_BITS_SIGNED,                     /* Opérande sur 16 bits signés */
    AOS_32_BITS_SIGNED,                     /* Opérande sur 32 bits signés */
    AOS_64_BITS_SIGNED                      /* Opérande sur 64 bits signés */

} AsmOperandSize;


#define AOS_8_BITS  AOS_8_BITS_UNSIGNED
#define AOS_16_BITS AOS_16_BITS_UNSIGNED
#define AOS_32_BITS AOS_32_BITS_UNSIGNED
#define AOS_64_BITS AOS_64_BITS_UNSIGNED


/* Définition générique d'une opérande */
typedef struct _asm_operand asm_operand;


/* Différentes formes de représentation humaine */
typedef enum _AsmSyntax
{
    ASX_INTEL,                              /* Syntaxe Intel               */
    ASX_ATT                                 /* Syntaxte AT&T               */

} AsmSyntax;



/* Crée une opérande pour l'instruction 'db'. */
bool fill_db_operand(asm_operand *, uint8_t);

/* Traduit une opérande de type 'db' en texte. */
void print_db_operand(const asm_operand *, char *, size_t, AsmSyntax);

/* Lit une valeur (signée ou non) sur x bits. */
bool read_imm_value(AsmOperandSize, const uint8_t *, off_t *, off_t, ...);

/* Indique le signe d'une valeur immédiate. */
bool is_imm_operand_negative(const asm_operand *);

/* Crée une opérande contenant une valeur sur x bits. */
bool fill_imm_operand(asm_operand *, AsmOperandSize, const uint8_t *, off_t *, off_t);

/* Crée une opérande contenant une valeur sur x bits. */
bool fill_imm_operand_with_value(asm_operand *, AsmOperandSize, ...);

/* Crée une opérande contenant une valeur relative sur x bits. */
bool fill_relimm_operand(asm_operand *, AsmOperandSize, const uint8_t *, off_t *, off_t, uint64_t);

/* Récupère la valeur d'une opérande sur x bits. */
bool get_imm_operand_value(asm_operand *, AsmOperandSize, ...);

/* Traduit une opérande de valeur immédiate en texte. */
void print_imm_operand(const asm_operand *, char *, size_t, AsmSyntax);




#include <glib-object.h>


#include "../format/exe_format.h"



#define G_TYPE_ARCH_OPERAND                 g_arch_operand_get_type()
#define G_ARCH_OPERAND(obj)                 (G_TYPE_CHECK_INSTANCE_CAST((obj), g_arch_operand_get_type(), GArchOperand))
#define G_IS_ARCH_OPERAND(obj)              (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_arch_operand_get_type()))
#define G_ARCH_OPERAND_GET_IFACE(inst)      (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_arch_operand_get_type(), GArchOperandIface))


/* Définition générique d'un opérande d'architecture (instance) */
typedef struct _GArchOperand GArchOperand;

/* Définition générique d'un opérande d'architecture (classe) */
typedef struct _GArchOperandClass GArchOperandClass;


/* Indique le type défini pour un opérande d'architecture. */
GType g_arch_operand_get_type(void);

/* Traduit un opérande en version humainement lisible. */
char *g_arch_operand_get_text(const GArchOperand *, const exe_format *, AsmSyntax);



#endif  /* _ARCH_OPERAND_H */