2009-04-04 8 views
4

J'écris un assembleur pour un micro-contrôleur personnalisé sur lequel je travaille. J'ai l'assembleur à un point où il va assembler les instructions jusqu'à binaire.Utilisation de yyparse() pour créer un assembleur à deux passes?

Cependant, j'ai maintenant des problèmes avec le fonctionnement des étiquettes. Actuellement, lorsque mon assembleur rencontre une nouvelle étiquette, il stocke le nom de l'étiquette et l'emplacement de mémoire auquel il se réfère. Lorsqu'une instruction référence une étiquette, l'assembleur recherche l'étiquette et remplace l'étiquette par la valeur appropriée.

Ceci est bien et dandy, mais que se passe-t-il si l'étiquette est définie après l'instruction référençant? Pour cette raison, j'ai besoin que mon parser exécute deux fois le code.

Voici ce que j'ai actuellement ma fonction principale:

303 int main(int argc, char* argv[]) 
304 { 
305 
306  if(argc < 1 || strcmp(argv[1],"-h")==0 || 0==strcmp(argv[1],"--help")) 
307  { 
308   //printf("%s\n", usage); 
309   return 1; 
310  } 
311  // redirect stdin to the file pointer 
312  int stdin = dup(0); 
313  close(0); 
314 
315  // pass 1 on the file 
316  int fp = open(argv[1], O_RDONLY, "r"); 
317  dup2(fp, 0); 
318 
319  yyparse(); 
320 
321  lseek(fp, SEEK_SET, 0); 
322 
323  // pass 2 on the file 
324  if(secondPassNeeded) 
325  { 
326   fp = open(argv[1], O_RDONLY, "r"); 
327   dup2(fp, 0); 
328   yyparse(); 
329  } 
330  close(fp); 
331 
332  // restore stdin 
333  dup2(0, stdin); 
334 
335  for(int i = 0; i < labels.size(); i++) 
336  { 
337   printf("Label: %s, Loc: %d\n", labels[i].name.c_str(), labels[i].memoryLoc); 
338  } 
339  return 0; 
340 } 

J'utilise cette configuration dans un flex/bison.

+0

Demandez-vous si vous avez besoin de deux passages, ou si votre code est correct? – grieve

Répondre

8

Si c'est tout ce dont vous avez besoin, vous n'avez pas besoin d'un assembleur complet à deux passages. Si l'étiquette n'est pas définie lorsque vous la référencez, vous affichez simplement une adresse de stand-in (disons 0x0000) et vous disposez d'une structure de données qui répertorie tous les lieux avec références avant et le symbole auquel ils se réfèrent. À la fin du fichier (ou bloquer si vous avez des symboles locaux), il vous suffit de parcourir cette liste et de patcher les adresses.

Questions connexes