Ich verbringe etwas Zeit mit der Montageprogrammierung (insbesondere mit Gas) und kürzlich habe ich von der align-Richtlinie erfahren. Ich denke, ich habe die Grundlagen verstanden, aber ich würde gerne ein tieferes Verständnis seiner Natur und wann man Ausrichtung verwenden.
Ich habe mich zum Beispiel über den Assembler-Code einer einfachen C ++ - Switch-Anweisung gewundert. Ich weiß, dass switch-Anweisungen unter Umständen auf Sprungtabellen basieren, wie in den folgenden Codezeilen:
%Vor%.align 4 richtet die folgenden Daten auf die nächste 4-Byte-Grenze aus, die sicherstellt, dass das Abrufen dieser Speicherstellen effizient ist, oder? Ich denke, dass dies getan wird, weil vor der switch-Anweisung Dinge passieren könnten, die eine Fehlausrichtung verursachten. Aber warum gibt es eigentlich zwei Anrufe bei .align? Gibt es Faustregeln beim Aufruf von .align oder sollte es einfach immer dann ausgeführt werden, wenn ein neuer Datenblock im Speicher abgelegt wird und etwas davor Fehlausrichtungen verursacht haben könnte?
Bei Arrays scheint die Ausrichtung an 32-Byte-Grenzen zu erfolgen, sobald das Array mindestens 32 Byte belegt. Ist es effizienter, dies zu tun oder gibt es einen anderen Grund für die 32-Byte-Grenze?
Ich würde mich über jede Erklärung oder einen Hinweis auf Literatur freuen.
Es gibt mehrere .align
-Direktiven, nur weil der Compiler intern arbeitet; man wäre ausreichend gewesen und das Ausstrahlen von nur einem braucht zusätzliche Arbeit.
Was die Ausrichtung im Allgemeinen angeht, ist es ein komplexes Thema, aber hier ist ein Artikel für Intel x64, der einige der Probleme behandelt, an denen Sie interessiert sind:
Andere Architektur kann sehr unterschiedlich sein.