2016-09-28 1 views
0

Dies ist eine sehr allgemeine Frage von einem sehr neuen MIPS-Codierer, aber wenn Code von C in MIPS konvertiert wird, ändert sich die Instruktionszählung basierend auf der Implementierung oder ist sie immer dieselbe? Zum Beispiel habe ich eine Gleichung, die zu finden:Ändert sich die Anzahl der MIPS-Anweisungen mit der Implementierung?

for(i=0; i<a; i++) 
for(j=0; j<b; j++) 
D[4*j] = i+j; 

Meine Anweisung count (4 * a) + (8 * a * b) 4. Aber würde sich das ändern, je nachdem, wie ich den Code geschrieben habe? Vielen Dank!

+0

Was ist "der Code" hier, der C-Code (es ist wichtig, wie Sie es schreiben, aber es ist mehr wichtig, was der Compiler zu tun) oder die Assembly (offensichtlich anders schreiben, führt dazu, dass es anders ist)? – harold

+0

Mit dem Code meine ich die Assembly, aber ich beziehe mich insbesondere auf die Definition der Instruktionszählung, in der durch isa und Compiler bestimmt wird. Und im Grunde habe ich gefragt, ob es einen Weg gab, um die Anzahl der Anweisungen zu ändern IE schreiben Code verschiedene Möglichkeiten und damit weniger Anweisungen oder wenn es schließlich im Wesentlichen nur die gleiche Anzahl von Anweisungen in mehr Zeit tun würde – SN44

+0

Sogar auf Einzelunterricht Ebene können Sie manchmal erreichen das gleiche Ergebnis durch unterschiedliche Anweisungen. Das Teilen des Wertes um 2 kann entweder durch "DIV" oder durch Verschieben der Bits nach rechts erfolgen, das Werteergebnis ist das gleiche (aber die Verschiebung erzeugt nicht den Rest). In C ist der einfache Weg, um einen großen Unterschied zu sehen, nur Maschinencode von "Debug" Build gegen "optimierten" Build zu überprüfen. In der Assembly hat der Programmierer mehr Kontrolle und normalerweise können Sie anhand der Quelle feststellen, was der Maschinencode nach der Kompilierung genau sein wird, da die Assembly meistens 1: 1 Mapping von inst ist. Mnemotechniken zur Bearbeitung des Opcodes (außer Pseudo-Inst.). – Ped7g

Antwort

1

Natürlich gibt es fast nie nur einen Weg, etwas zu tun. Für die for Loops gibt es zum Beispiel den "langweiligen" Weg mit dem Test an der Spitze und einen unbedingten Sprung zurück, und die "etwas schlauere" Form mit dem Test unten und einem unbedingten Sprung von "vor der Schleife" direkt zum Test. Dies ist eine spezielle Form der Schleifeninversion, die keinen Code mehr kostet, aber dynamisch weniger Anweisungen ausführt (die ist nicht mehr in der Schleife, sondern nur einmal), es sei denn, die Schleife hat null Wiederholungen.

Allgemeiner könnten Sie entscheiden, die lokalen Variablen die ganze Zeit in Registern zu behalten oder sie unterschiedlich viel Zeit im Speicher zu verbringen (von den dümmsten "Laden bei jeder Verwendung und Speicherung bei jeder Zuweisung" bis zu vielen) sinnlose Ladungen und Speicher, die Sie möglicherweise entfernen möchten).

Das "Sie" in dieser Geschichte kann natürlich auch der Compiler sein. Und Sie (das wirkliche Sie dieses Mal) können normalerweise manipulieren, wie viele Anweisungen es ausgibt, indem Sie ihm bestimmte Flaggen geben. Gewöhnlich wird dem Compiler gesagt, er solle überhaupt keine Optimierung vornehmen, da er eine Last bei jeder Verwendung einer Variablen ausgibt und bei jeder Zuweisung speichert, während dies bei jeder Nicht-Null-Optimierung nicht der Fall sein sollte.

Verwandte Themen