1 |
13 |
louismarie |
#include "dialogue.h"
|
2 |
|
|
|
3 |
|
|
#include <stdio.h>
|
4 |
|
|
#include <stdlib.h>
|
5 |
|
|
|
6 |
|
|
#include <debogueur.h>
|
7 |
|
|
|
8 |
|
|
int err_code=0;
|
9 |
|
|
|
10 |
|
|
int verbose=0;
|
11 |
|
|
|
12 |
|
|
/* Texte de l'aide en ligne. */
|
13 |
|
|
char help[]="\n\
|
14 |
|
|
Assembleur pour le microprocesseur miniMIPS version 1.0\n\
|
15 |
|
|
Utilisation : asmips [options] [fichier]\n\
|
16 |
|
|
\n\
|
17 |
|
|
Exemple : asmips -vo a.obj -l a.lst source.asm\n\
|
18 |
|
|
\n\
|
19 |
|
|
Options disponibles :\n\
|
20 |
|
|
\n\
|
21 |
|
|
-v active le mode verbeux\n\
|
22 |
|
|
\n\
|
23 |
|
|
-n désactive la liste d'assemblage\n\
|
24 |
|
|
\n\
|
25 |
|
|
-o nom_fichier nom du fichier de sortie, par défaut a.obj\n\
|
26 |
|
|
\n\
|
27 |
|
|
-p assemble vers la sortie standard\n\
|
28 |
|
|
\n\
|
29 |
|
|
-l nom_fichier nom du fichier pour la liste d'assemblage\n\
|
30 |
|
|
par défaut, a.lst est utilisé\n\
|
31 |
|
|
\n\
|
32 |
|
|
-s nom_fichier nom du fichier de syntaxe, par défaut \'Syntaxe\'\n\
|
33 |
|
|
\n\
|
34 |
|
|
-m nom_fichier nom du fichier de macros par défaut, contenant les\n\
|
35 |
|
|
pseudo-instructions de l'assembleur\n\
|
36 |
|
|
\n\
|
37 |
|
|
Notes d'utilisation :\n\
|
38 |
|
|
\n\
|
39 |
|
|
Si aucun fichier d'entrée n'est spécifié, asmips tente d'assembler\n\
|
40 |
|
|
l'entrée standard. Ce mode n'est pas encore compatible avec la liste\n\
|
41 |
|
|
d'assemblage qui sera donc automatiquement désactivée.\n\
|
42 |
|
|
\n\
|
43 |
|
|
La sélection du fichier de macro en ligne de commande est prioritaire\n\
|
44 |
|
|
par rapport au fichier spécifié par la syntaxe qui sera donc ignoré.\n\
|
45 |
|
|
\n\
|
46 |
|
|
Merci de signaler les éventuels bugs à :\n\
|
47 |
|
|
\n\
|
48 |
|
|
shangoue@enserg.fr\n\
|
49 |
|
|
lmouton@enserg.fr\n\
|
50 |
|
|
";
|
51 |
|
|
|
52 |
|
|
|
53 |
|
|
typedef struct
|
54 |
|
|
{
|
55 |
|
|
int code;
|
56 |
|
|
char * chaine;
|
57 |
|
|
} type_paire_msg;
|
58 |
|
|
|
59 |
|
|
static type_paire_msg message[] =
|
60 |
|
|
|
61 |
|
|
{{ NO_ERR, "Pas d'erreur trouvée" }
|
62 |
|
|
/* Erreurs génériques : */
|
63 |
|
|
,{ F_FLUX_NULL, "Tentative de lecture/écriture dans un flux NULL" }
|
64 |
|
|
,{ F_ERR_LECT, "Erreur de lecture imprévisible dans le flux" }
|
65 |
|
|
,{ F_ERR_OUV, "Erreur d'ouverture du fichier" }
|
66 |
|
|
,{ F_ERR_MEM, "Erreur d'allocation (mémoire insuffisante ?)" }
|
67 |
|
|
/* Erreurs du formateur : */
|
68 |
|
|
,{ S_ERR_FORMAT, "Mauvaise utilisation d'un caractère" }
|
69 |
|
|
,{ S_CAR_INVALID, "Caractère non reconnu" }
|
70 |
|
|
,{ S_ALPHA_LONG, "Lexème de type ALPHA trop long" }
|
71 |
|
|
,{ S_ALPHA_INVALID, "Caractère non valide dans l'identificateur" }
|
72 |
|
|
,{ S_INT_INVALID, "Caractère non valide dans l'entier" }
|
73 |
|
|
/* Erreurs du préprocesseur : */
|
74 |
|
|
,{ S_CIRCULAR_FILE, "Inclusion circulaire de fichier(s)" }
|
75 |
|
|
,{ S_CIRCULAR_MACRO, "Inclusion circulaire de macro" }
|
76 |
|
|
,{ S_FICH_NON_TROUVE, "Impossible d'ouvrir le fichier indiqué" }
|
77 |
|
|
,{ S_DEF_MACRO_EOF, "Fin du fichier inattendue lors de la définition de macro" }
|
78 |
|
|
,{ S_USE_MACRO_EOF, "Fin du fichier inattendue lors de l'utlisation d'une macro" }
|
79 |
|
|
,{ S_NOM_MAC_INVALID, "Nom de la macro dans sa déclaration invalide" }
|
80 |
|
|
,{ S_NOM_INCFICH_INVALID, "Nom du fichier à inclure invalide" }
|
81 |
|
|
,{ S_MAC_NO_MATCH , "L'utilisation de la macro est incompatible avec sa définition" }
|
82 |
|
|
,{ S_MAC_TROP_PARAM, "Paramètre(s) non utlisé(s) dans la macro" }
|
83 |
|
|
/* Erreurs du préparateur : */
|
84 |
|
|
,{ S_ERR_DCL, "Déclaration incorrecte" }
|
85 |
|
|
,{ S_DCL_VIDE, "Déclaration d'instruction vide" }
|
86 |
|
|
,{ S_DCL_NON_TERM, "Déclaration d'instruction non terminée '}' manquante" }
|
87 |
|
|
,{ S_REDEF_INS, "Instruction déjà existante, la nouvelle déclaration sera ignorée" }
|
88 |
|
|
,{ S_BAD_PROP, "Propriété incorrecte" }
|
89 |
|
|
,{ S_BAD_VAL, "Valeur de la propriété incorrecte" }
|
90 |
|
|
,{ S_BAD_FUN, "Fonction non définie" }
|
91 |
|
|
,{ S_BAD_ARG, "Mauvais argument pour la commande SET" }
|
92 |
|
|
,{ S_BAD_SST_DEC, "Déclaration du nombre de sous-types absente ou insuffisante" }
|
93 |
|
|
,{ S_DEP_FUNC_NB, "Dépassement de la capacité d'enregistrement des fonctions" }
|
94 |
|
|
,{ S_DEP_SST, "Dépassement de la capacité de codage des sous-types" }
|
95 |
|
|
,{ S_SEC_SST_DEC, "Répétition de la commande SSTNUM non autorisée" }
|
96 |
|
|
/* Erreurs de l'analyseur : */
|
97 |
|
|
,{ S_SYN_ERR, "Erreur de syntaxe" }
|
98 |
|
|
,{ S_FUN_ERR, "Masques incompatibles dans la définition d'une instruction" }
|
99 |
|
|
,{ S_ADAP_ERR, "Erreur dans la valeur de retour d'une fonction de l'adaptateur" }
|
100 |
|
|
/* Erreurs de l'adaptateur : */
|
101 |
|
|
,{ S_FUN_INAP, "Fonction génératrice de masque inapplicable" }
|
102 |
|
|
,{ S_ARG_INCOMP, "Inadéquation des arguments avec une fonction de l'adaptateur" }
|
103 |
|
|
,{ S_SIGNED_TL, "Entier trop long pour le codage signé sur les bits disponibles" }
|
104 |
|
|
,{ S_UNSIGNED_TL, "Entier trop long pour le codage non signé sur les bits disponibles" }
|
105 |
|
|
,{ S_UNSIGNED_EXPECTED, "Entier non signé attendu" }
|
106 |
|
|
,{ S_REDEF_ETIQ, "Redéfinition d'étiquette non prise en compte" }
|
107 |
|
|
,{ S_BAD_ETIQ, "Etiquette inexistante" }
|
108 |
|
|
,{ S_ADR_INCONNUE, "L'adresse d'implantation est indéterminée" }
|
109 |
|
|
,{ S_BAD_ALIGN, "Saut à une étiquette non alignée sur 32 bits" }
|
110 |
|
|
,{ S_TOO_FAR, "Saut à une adresse n'appartenant pas à la région courante de 256 Mo" }
|
111 |
|
|
/* Erreurs du synthetiseur. */
|
112 |
|
|
|
113 |
|
|
/* Warnings : */
|
114 |
|
|
,{ W_SEPLEX_INIT, "Valeur du séparateur d'instruction non initialisé dans fichier Syntaxe" }
|
115 |
|
|
,{ W_REGLE_TYPAGE, "Regle de sous-typage invalide dans le fichier Syntaxe; elle est ignorée" }
|
116 |
|
|
,{ W_ARG_INC, "Argument incorrect" }
|
117 |
|
|
,{ W_FICH_DEF_MACRO, "Le fichier des macros par défaut n'a pas été trouvé" }
|
118 |
|
|
,{ W_MACRO_MANQ, "Auncun fichier des macros par défaut chargé" }
|
119 |
|
|
,{ W_NO_LIST_INC, "L'utilisation des inclusions désactive la liste d'assemblage" }
|
120 |
|
|
,{ W_NO_LIST_STDIN, "La lecture dans le flux standard interdit la liste d'assemblage" }
|
121 |
|
|
,{ W_NO_SYNTAX, "Pas de fichier de syntaxe" }
|
122 |
|
|
,{ W_SRCE_MOD, "Flux source modifié. Echec de la création de la liste d'assemblage" }
|
123 |
|
|
,{ W_REDEF_MAC, "Redéfinition d'une macro" }
|
124 |
|
|
,{ W_UNDEF_NOMAC, "Tentative de suppression d'une macro non définie" }
|
125 |
|
|
,{ W_REDEF_CODE, "Réutilisation du code, les sous-types seront confondus" }
|
126 |
|
|
,{ W_REDEF_SST, "Nom de sous-type existant, seule la première définition sera accessible" }
|
127 |
|
|
|
128 |
|
|
/* Commentaires */
|
129 |
|
|
|
130 |
|
|
/* Main */
|
131 |
|
|
,{ B_INIT_SYNTAX, "Initialisation de la syntaxe de l'assembleur..." }
|
132 |
|
|
,{ B_INIT_MACRO, "Chargement des pseudo-instructions..." }
|
133 |
|
|
,{ B_LECT_SRC, "Lecture des sources..." }
|
134 |
|
|
,{ B_STR_OBJ, "Enregistrement du fichier objet..." }
|
135 |
|
|
,{ B_STR_LST, "Creation de la liste d'assemblage..." }
|
136 |
|
|
,{ B_ERR_REP, "Rapport d'erreurs :" }
|
137 |
|
|
,{ B_NBR_ERR_SYN, "\tErreurs détectées lors de la synthèse :" }
|
138 |
|
|
,{ B_NBR_ERR_ANA, "\tErreurs détectées lors de l'analyse :" }
|
139 |
|
|
,{ B_SYN, "Synthèse..." }
|
140 |
|
|
,{ B_ANA, "Analyse du code..." }
|
141 |
|
|
/* Preparateur */
|
142 |
|
|
,{ B_CASSE, "Basculement en mode sensible à la casse" }
|
143 |
|
|
,{ B_NOCASSE, "Basculement en mode insensible à la casse" }
|
144 |
|
|
,{ B_MAC_DEF, "Détection d'un fichier de pseudo-instructions par défaut dans la syntaxe" }
|
145 |
|
|
,{ B_INIT_D, "Activation du support des macros" }
|
146 |
|
|
,{ B_INIT_U, "Activation du support de la supression de macros" }
|
147 |
|
|
,{ B_INIT_I, "Activation du support de l'inclusion de fichiers" }
|
148 |
|
|
,{ B_INIT_SEP, "Initialisation du séparateur d'instructions" }
|
149 |
|
|
,{ B_PREP_SST, "Préparation pour l'ajout de sous-types" }
|
150 |
|
|
,{ B_ADD_SST, "Nouveau sous-type détecté" }
|
151 |
|
|
/* Preprocesseur */
|
152 |
|
|
,{ B_NO_MACRO, "Aucune macro définie." }
|
153 |
|
|
,{ B_MACRO_DISPO, "Macros disponibles :" }
|
154 |
|
|
/* Adaptateur */
|
155 |
|
|
,{ B_TABLAB, "Table des étiquettes :" }
|
156 |
|
|
|
157 |
|
|
/* Terminateur de la table, ne pas supprimer ! */
|
158 |
|
|
,{ 0, NULL }
|
159 |
|
|
};
|
160 |
|
|
|
161 |
|
|
char sep_fich_inclus[] = " inclus depuis ";
|
162 |
|
|
|
163 |
|
|
char * search_msg()
|
164 |
|
|
{
|
165 |
|
|
type_paire_msg * pmsg=message;
|
166 |
|
|
while(pmsg->chaine!=NULL)
|
167 |
|
|
{
|
168 |
|
|
if (pmsg->code==err_code) return pmsg->chaine;
|
169 |
|
|
pmsg++;
|
170 |
|
|
}
|
171 |
|
|
return message->chaine;
|
172 |
|
|
}
|
173 |
|
|
|
174 |
|
|
void affiche_message(char * origine, int ligne)
|
175 |
|
|
{
|
176 |
|
|
if (err_code>=1000) /* Warning */
|
177 |
|
|
{
|
178 |
|
|
if (origine && ligne)
|
179 |
|
|
fprintf(stderr, "Attention ! \'%s\' : %d : %s.\n"
|
180 |
|
|
, origine, ligne, search_msg());
|
181 |
|
|
else if (origine)
|
182 |
|
|
fprintf(stderr, "Attention ! \'%s\' : %s.\n", origine, search_msg());
|
183 |
|
|
else
|
184 |
|
|
fprintf(stderr, "Attention ! %s.\n", search_msg());
|
185 |
|
|
}
|
186 |
|
|
else if (err_code < 0) /* Commentaire */
|
187 |
|
|
{
|
188 |
|
|
if (verbose)
|
189 |
|
|
{
|
190 |
|
|
if (origine && ligne)
|
191 |
|
|
fprintf(stderr, "-- \'%s\' : %d : %s\n"
|
192 |
|
|
, origine, ligne, search_msg());
|
193 |
|
|
else if (origine)
|
194 |
|
|
fprintf(stderr, "-- %s %s\n", search_msg(), origine);
|
195 |
|
|
else
|
196 |
|
|
fprintf(stderr, "-- %s\n", search_msg());
|
197 |
|
|
}
|
198 |
|
|
}
|
199 |
|
|
else if (err_code<100) /* Fatal Error */
|
200 |
|
|
{
|
201 |
|
|
if (origine && ligne)
|
202 |
|
|
fprintf(stderr, "Erreur fatale ! \'%s\' : %d : %s.\n"
|
203 |
|
|
, origine, ligne, search_msg());
|
204 |
|
|
else if (origine)
|
205 |
|
|
fprintf(stderr, "Erreur fatale ! \'%s\' : %s.\n"
|
206 |
|
|
, origine, search_msg());
|
207 |
|
|
else
|
208 |
|
|
fprintf(stderr, "Erreur fatale ! %s.\n", search_msg());
|
209 |
|
|
exit(err_code);
|
210 |
|
|
}
|
211 |
|
|
else /* Erreur de Syntaxe */
|
212 |
|
|
{
|
213 |
|
|
if (origine && ligne)
|
214 |
|
|
fprintf(stderr, "\'%s\' : %d : %s.\n"
|
215 |
|
|
, origine, ligne, search_msg());
|
216 |
|
|
else if (origine)
|
217 |
|
|
fprintf(stderr, "\'%s\' : %s.\n", origine, search_msg());
|
218 |
|
|
else
|
219 |
|
|
fprintf(stderr, "%s.\n", search_msg());
|
220 |
|
|
}
|
221 |
|
|
}
|
222 |
|
|
|
223 |
|
|
void display_help()
|
224 |
|
|
{ /* fonction d'affichage de l'aide en ligne. */
|
225 |
|
|
fprintf(stderr, help);
|
226 |
|
|
}
|