Frage

Sie schreiben eine Funktion und an der resultierenden Anordnung suchen, können Sie sehen, es verbessert werden.

Sie möchten die Funktion halten Sie geschrieben, um Lesbarkeit zu verbessern, aber Sie möchten Ihre eigene Baugruppe für den Compiler ersetzen. Gibt es eine Möglichkeit, eine Beziehung zwischen dem Hoch livel Sprachfunktion und die neuen Montag?

zu etablieren
War es hilfreich?

Lösung

Wenn Sie bei der Montage suchen, dann wird sie anzunehmen, dass Sie ein gutes Verständnis darüber, wie Code kompiliert wird nach unten. Wenn Sie dieses Wissen haben, dann ist es manchmal möglich, ‚reverse enginer‘ bis die Änderungen wieder in der Originalsprache, aber seine oft besser nicht zu stören.

Die Optimierungen, die Sie wahrscheinlich machen sehr klein in ersten diese Änderungen erforderlich, um die Zeit und Mühe im Vergleich zu sein. Ich würde vorschlagen, dass Sie diese Art von Arbeit an den Compiler verlassen und eine Tasse Tee gehen. Wenn die Änderungen von Bedeutung sind, und die Leistung ist entscheidend, (wie in der Embedded-Welt sagen), dann könnten Sie den normalen Code mit dem assemblar in irgendeiner Art und Weise mischen mögen, aber auf den meisten Computern und Chips die Leistung in der Regel ausreichend ist, zu vermeiden, diese Kopfschmerzen.

Wenn Sie wirklich brauchen mehr Leistung, dann den Code optimieren nicht die Montage.

Andere Tipps

Keine, nehme ich an. Sie haben die Compiler der Arbeit zugunsten der eigenen abgelehnt. Genauso gut könnte man die Funktion, die Sie in der kompilierten Sprache geschrieben werfen, weil jetzt alles, was Sie haben Ihre Assembler in dieser Plattform ist.

Ich würde gegen die sich in dieser Art der Optimierung sehr raten, weil, wenn Sie sicher sind, über Profilerstellung und Analyse, dass Sie wirklich einen Unterschied machen.

Es hängt von der Sprache, die Sie Ihre Funktion in geschrieben. Einige Sprachen wie C sind sehr niedriges Niveau, jeden Funktionsaufruf oder eine Erklärung zu bestimmten Assembler-Anweisungen zu übersetzen. Wenn Sie C haben, können Sie Ihre Funktion mit Inline-Assembler ersetzen, um die Leistung zu verbessern.

Andere Hochsprachen können jede Anweisung in Makro-Routinen oder andere komplexere Anrufe auf der Montageseite konvertieren. Bestimmte Optimierungen (wie Endrekursion, Schleifenentrollen, etc.) leicht auf der Quellenseite durchgeführt werden, aber andere (wie eine effizientere Nutzung der Registerdatei) kann unmöglich sein (wiederum abhängig von der Sprache und dem Compiler du bist verwendet wird).

Sein schwer zu sagen, es ist eine Beziehung zwischen modifizierten Anordnung und der Quelle, die die unveränderte Version erzeugt. Es wird sicherlich Debugging-Tools verwirren: Registerinhalte nicht mehr werden die Quellvariablen entsprechen sie angeblich entsprechen

.

Es gibt eine Reihe von Orten in der Paketverarbeitung Code, wo ich die generierte Assembly untersucht habe und wieder den Code ursprüngliche Quelle, um das Ergebnis zu verbessern gegangen zu ändern. Re-Arrangieren Quelle kann die Anzahl der Zweige, __attribute__ und Compiler Argumente reduzieren können Verzweigungspunkte und Funktionen ausrichten I Misses $ zu reduzieren. In verzweifelten Fällen kann eine wenig Inline-Montag verwendet werden, so dass die binären noch aus den Quellen kompiliert werden kann.

Etwas, das man versuchen könnte, ist Ihre ursprüngliche Funktion in eine eigene Datei zu trennen, und eine Make-Regel bieten die Assembler von dort zu bauen. Dann aktualisieren Sie die Assembler-Datei mit Ihrer verbesserten Version und bietet eine make Regel eine Objektdatei aus der Assembler-Datei zu erstellen. Dann wird Ihr Link Regeln ändern, dass die Objektdatei aufzunehmen.

Wenn Sie immer nur die Assembler-Datei ändern, wird diese behalten verwendet wird. Wenn Sie jemals die ursprüngliche übergeordnete Sprachdatei ändern, wird die Assembler-Datei neu erstellt und die Objektdatei aus der neuen (unimproved) Version gebaut.

Dies gibt Ihnen eine Beziehung zwischen den beiden; Sie wollen wahrscheinlich eine Warnung Kommentar am Anfang der übergeordneten Sprachdatei zu warnen, über das Verhalten hinzuzufügen. irgendeine Form von VCS geben Ihnen die Möglichkeit, die verbesserte Assembler-Datei wiederherzustellen, wenn Sie hier einen Fehler zu machen.

Wenn Sie eine native kompilierte App in Visual C ++ zu schreiben, gibt es zwei Methoden:

  1. Verwenden Sie den __asm { } Block und schreiben Sie Ihre Assembler drin.
  2. Teilen Sie Ihre Funktionen in MASM Assembler, montieren, in.OBJ und es als eine statische Bibliothek verknüpfen. In Ihrem C / C ++ Code, erklärt die Funktion mit einer extern "C" Erklärung an.

Andere C / C ++ Compiler haben ähnliche Ansätze.

In dieser Situation Sie haben in der Regel zwei Möglichkeiten: den Code optimieren oder die Compiler neu schreiben. Ich kann nicht sehen, wo die Verbindung zwischen Quelle und op brechen wird immer die richtige Lösung sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top