diff options
-rw-r--r-- | doc/registres.txt | 16 | ||||
-rw-r--r-- | lib/simulator.c | 62 |
2 files changed, 76 insertions, 2 deletions
diff --git a/doc/registres.txt b/doc/registres.txt new file mode 100644 index 0000000..a0acb3d --- /dev/null +++ b/doc/registres.txt @@ -0,0 +1,16 @@ +R0 init a 0 +R1->R3 reservés +R4->R7 les 4 premiers arg des fonctions (reste dans pile) +R8-R9 pour retour de val de fonctions +R10->R19 Utilisés parl'appelant lors d'un appel de procédure pour sauvegarder des données + utiles à l'appelant +R20->R27 Utilisés par l'appelant lors d'un appel de procédure pour sauvegarder des données + utiles à l'appelé +R28 Pointe sur le bloc de données statique +R29 Pointeur de pile (le premier emplacement libre de la pile) +R30 libre +R31 @ de retour + + + +
\ No newline at end of file diff --git a/lib/simulator.c b/lib/simulator.c index 7dde434..633085f 100644 --- a/lib/simulator.c +++ b/lib/simulator.c @@ -13,7 +13,7 @@ #include "memoire.h" #include "fpu.h" #include "exceptions.h" - +#include "linker.h" /* initialisation de la MP avec un malloc @@ -24,6 +24,9 @@ int HasToRun = 1, HasToReset; +Uint32 base_addr = 0; + + Uint32 LireInstruction(void) { return (LD(LireRegistrePC())); @@ -65,7 +68,8 @@ void Initialisation(void) for (i = 0; i < TAILLE_MEMOIRE; i++) Reset(&memoire_principale[i]); - EcrireRegistreSP(ADD_SP); + InitRegistres(); /* initialisation des registres */ + EcrireRegistreSP(ADD_SP); /* initialisation du stack pointer */ } void DecodeExec(Uint32 instruction, Uint32 entrypoint) @@ -384,3 +388,57 @@ void Debogueur(void) { AfficheReg(); } + +void ChargeBinaire(char * filename) +{ +FILE * file; +char message[BUFSIZ]; +Uint32 entrypoint, nb, ns, nbss, nr; +Uint32 * relocation_table; +i int; + +file = openfilereading(filename); +if (readword(file)==0x58454e4e) { /*verification de la signature*/ +sprintf(message,_("Total Size Of The Binary File: %d"),readword(file)); +pushcontext(message); +nb=readword(file); /* taille du segment text */ +ns=readword(file); /* taille des donnes statiques */ +nbss=readword(file); /* taille des donnees non init */ +nr=readword(file); /* taille de la table de relogement */ + +relocation_table=Emalloc(nr); +for (i=0;i<nr;i++) { + relocation_table[i]=readword(file); +} + + +for(i=base_addr;i<(base_addr+nb+ns);i++) { /*chargement en ram de .text et .data */ + ST(i,readword(file)); +} + +for (i=0;i<nr;i++) { /* relogement */ + ST(base_addr+relocation_table[i],LD(base_addr+relocation_table[i])+base_addr); +} + +free(relocation_table); + +InitRegistres(); /* initialisation des registres */ +EcrireRegistreSP(ADD_SP); /* initialisation du stack pointer */ + +EcrireRegistrePC(LireRegistrePC()+base_addr); /* maj de PC */ + + +fclose(file); + + + + + + + +} + + + + +}
\ No newline at end of file |