PDA

Visualizza la versione completa : [C] Convertitore da MIPS a X86


tirif4
03-12-2005, 17:41
Scusatemi per il disturbo, ma avrei un dusperato bisogno di aiuto dovrei fare un programma in linguaggio C che mi legga un programma in MIPS e che me lo converta in linguaggio x86.
Io dovrei fare questo solo per la funzione di Fibonacci.
Ho gia scritto la funzione sia in Mips che in x86 ed entrambe sono funzionanti.Io ho gia fatto un programma che riesce a fare tutto cio e il funzionamento base è questo:
faccio leggere il programma MIPS riga per riga e attraverso vari IF a seconda di quello che legge io gli faccio scrivere il corrispettivo in x86.
Ad esempio se legge
--beq $t1 $0 end
io gli faccio scrivere --CMP CX 0h
--JE end
attraverso
if ((d[0]>='a')&&(d[0]<='z')||(d[0]>='A')&&(d[0]<='Z'))
{
fputs("CMP ",fp2);
if (strcmp(b,t1)==0)
{
fputs("CX ",fp2);
if(strcmp(c,zero)==0)
{
fputs("0h\n",fp2);
fprintf(fp2,"JE %s\n",d);
}
}
}
Purtoppo al professore tutto questo non va bene perchè dice che è troppo poco generale e che tutto il mio programma puo essere riassunto cosi:
se leggi questo programma scrivi questo.
VI PREGO AIUTATEMI DATEMI QUALCHE DRITTA.
Grazie in anticipo

alka
03-12-2005, 17:56
Ho corretto il titolo aggiungendo il linguaggio di programmazione, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=862017).

Leggilo quando hai un attimo di tempo... :)

Ciao! :ciauz:

unomichisiada
03-12-2005, 20:08
Originariamente inviato da tirif4
Scusatemi per il disturbo, ma avrei un dusperato bisogno di aiuto dovrei fare un programma in linguaggio C che mi legga un programma in MIPS e che me lo converta in linguaggio x86.
Io dovrei fare questo solo per la funzione di Fibonacci.
Ho gia scritto la funzione sia in Mips che in x86 ed entrambe sono funzionanti.Io ho gia fatto un programma che riesce a fare tutto cio e il funzionamento base è questo:
faccio leggere il programma MIPS riga per riga e attraverso vari IF a seconda di quello che legge io gli faccio scrivere il corrispettivo in x86.
Ad esempio se legge
--beq $t1 $0 end
io gli faccio scrivere --CMP CX 0h
--JE end
attraverso
if ((d[0]>='a')&&(d[0]<='z')||(d[0]>='A')&&(d[0]<='Z'))
{
fputs("CMP ",fp2);
if (strcmp(b,t1)==0)
{
fputs("CX ",fp2);
if(strcmp(c,zero)==0)
{
fputs("0h\n",fp2);
fprintf(fp2,"JE %s\n",d);
}
}
}
Purtoppo al professore tutto questo non va bene perchè dice che è troppo poco generale e che tutto il mio programma puo essere riassunto cosi:
se leggi questo programma scrivi questo.
VI PREGO AIUTATEMI DATEMI QUALCHE DRITTA.
Grazie in anticipo
Ti ha detto che è poco generale perchè il tuo programma funziona SOLO per quel particolare caso mentre lui vuole che il tuo programma preso come input un qualsiasi programma MIPS restituisca un listato corrispondente x86.Un caso semplificato potrebbe essere quello in cui il tuo programma generalizzato comprenda solo il tipo di istruzioni che ci sono nella funzione fibonacci, in altre parole se gli passi come listato una funzione MIPS che fa un'altra cosa ma usa lo stesso set di istruzioni presente nella funzione fibonacci allora il prog deve essere in gardo di produrre l'equivalente x86.Questo secondo caso penso sia quello che intende il tuo prof.

tirif4
04-12-2005, 12:35
Penso che il professore voglia proprio questo ed infatti ho iniziato a fare un programma che riconosce solo quelle istruzioni che sono presenti in Fibonacci.in questo m
Io ho impostato il programma in questo modo:
1)leggo il file originale
2)elimino i vari commenti e gli spazi
3)leggo riga per riga il programma riscritto
4)a seconda di quello che legge gli faccio riscrivere le istruzioni in x86.

Adesso il mio problema sta nel fatto che per leggere riga per riga ho usato la funzione:

p=fgets(buf,100,fp1);
sscanf(buf,"%s %s %s %s %s ",e1,e2,e3,e4,e5);

in pratica io ho impostato 5 campi perche al max potrò avere:
Etichetta--Oerazione--reg1--reg2--reg3

Però con una istruzione come: sw $ra, 8($sp)
ho e1=sw e2=$ra e3=8($sp) e adesso come faccio a tirarmi fuori il numero 8 e il registro $sp??
Mi servono perchè l'implementazione dello stack tra MIPS e x86 è diversa.
Fatemi sapere

oregon
04-12-2005, 12:39
Il mio consiglio e' di leggere un carattere per volta ed esaminarlo, costruendo una sorta di "analizzatore sintattico" ...

Non e' per nulla semplice ...

tirif4
04-12-2005, 12:49
Potrei fare cosi:
1)gli faccio leggere fino al primo spazio
2)se mi riconosce l'operazione SW gli faccio leggere carattere per carattere i seguenti campi e cosi mi ricavo quello che mi serve.

Prima uso STRLEN per vedere la lunghezza del campo e poi li leggo uno ad uno.

tirif4
04-12-2005, 18:00
Nessuno ha altri suggerimenti?

Loading