Frage

Ich erinnere mich an einige Regeln aus einer Zeit vor (pre-32-Bit-Intel-Prozessoren), wenn recht häufig war (zumindest für mich) mit der Montage Ausgabe von C / C ++ Compiler (in meinem Fall, Borland / Turbo erzeugt analysieren bei dass die Zeit) Performance-Engpässe zu finden und Montag Routinen mit C / C ++ Code sicher zu mischen. Dinge wie die SI registrieren Sie sich für die Verwendung von das Zeiger, AX für Rückgabewerte verwendet werden, die es zu erhalten registriert sollte, wenn ein Montage Routine kehrt, etc.

Jetzt wurde ich gefragt, ob es einige Referenz für die populäreren C / C ++ Compiler (Visual C ++, GCC, Intel ...) und Prozessoren (Intel, ARM, ...), und wenn nicht, wo die finden Stücke zu erstellen. Ideen?

War es hilfreich?

Lösung

Sie fragen über "Application Binary Interface" (ABI) und Aufrufkonventionen. Diese werden typischerweise durch Betriebssysteme und Bibliotheken gesetzt und durch Compiler und Linker erzwungen. Google für „ABI“ oder „Aufrufkonvention.“ Einige Ausgangspunkte von Wikipedia und Debian für ARM .

Andere Tipps

Agner Fog "Aufrufkonventionen" Dokument zusammenfasst, unter anderem die Windows und Linux 64 und 32-Bit-ABIs: http://www.agner.org/optimize/calling_conventions.pdf . Siehe Tabelle 4 auf S. 10 für eine Zusammenfassung der Registernutzung.

Eine Warnung aus eigener Erfahrung: keine Annahmen über das ABI in Inline-Assembly einbetten. Wenn Sie eine Funktion in Inline-Assembler schreiben, die Rückkehr und / oder Parameterübertragung insbesondere Register übernimmt (z eax, rdi, rsi), wird es, wenn / brechen, wenn die Funktion vom Compiler inlined wird.

Open Watcom C / C ++ Compiler unterstützt zwei Aufrufkonventionen, registerbasierte (Standard) und Stack-basierte (ganz in der Nähe zu dem, was andere Compiler verwenden). Benutzerhandbuch für diesen Compiler beschreibt sie beide und ist kostenlos Online zusammen mit dem Compiler selbst . Sie können diese Themen in der Bedienungsanleitung besonders hilfreich:

  • 10.4.1 Passing Argumente Verwendung von Registern-basierte Aufrufkonventionen
  • 10.4.6 Verwenden von Stack-basierten Aufrufkonventionen
  • 10.5 Aufrufkonventionen für 80x87-basierte Anwendungen

Nun, heute, wenn Optimierung aktiviert ist, gibt arn't vorhanden. Aber GCC ermöglicht es Ihnen zu erklären, dass Ihre Montageanleitung unabhängig bestimmte Variable verwendet werden soll, wenn sie im Register ist oder nicht, oder sogar GCC tuen zu zwingen, setzte diese Variable in ein Register verwendbar mit Ihrer Anweisung. Sie können auch erklären, welche für sich Ihre Inline-Montageblock Reserven Register (so sollte Compiler generieren apropriate Speichern / Wiederherstellen Code um den Inline-Stück, wenn erforderlich)

Ich glaube, aber ich bin keineswegs sicher, dass GCC das Itanium verwendet ABI für die meisten seiner Funktion; die Inkompatibilitäten zwischen ihm und dem ABI verwendet es sind dokumentiert .

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