Was bedeutet das “.richten Sie" x86-Assembler-Richtlinie genau?
Werde ich eine Liste genau das, was ich nicht verstehe, und zeigen Sie die Teile, die ich nicht verstehen kann, wie gut.
First off,
Die .Richten Sie Die Richtlinie
- .richten integer, pad.
Die .align-Direktive bewirkt, dass die nächsten Daten generiert werden ausgerichtet modulo integer Byte
1.~ ? : Was ist impliziert, mit "bewirkt, dass die nächsten Daten generiert werden ausgerichtet modulo integer Byte?" Ich kann vermuten, dass die nächsten Daten erzeugt, ist eine Speicher-zu-register-transfer, keine? Modulo würde bedeuten, dass der Rest einer division. Ich verstehe nicht, "ausgerichtet werden modulo integer Byte".......
Was wäre ein Rest von einer einfachen Daten-Erklärung und wie würden die nächsten Daten generiert wird ausgerichtet vom Rest nützlich sein? Wenn die nächsten Daten ausgerichtet ist modulo, das ist nämlich der nächste generierte Daten, was bedeutet, dass genau ist der Rest einer integer? Das macht absolut keinen Sinn.
Was konkret würde die .ausrichten, sagen, .align 8
Richtlinie ausgestellt x86 für eine Daten-byte-kompiliert von einem C -char
, d.h., char CHARACTER = 0;
werden für? Oder speziell codiert, die direkt mit dieser Richtlinie nicht vorläufige Assembler-code nach dem kompilieren C? Ich habe ausgetestet in der Montage und bemerkt, dass jede C/C++ - Deklarationen, wie chars
, ints
, floats
usw. fügen Sie die Richtlinie .align 8
zu jedem von Ihnen, und fügen Sie andere Richtlinien, wie .bss
, .zero
, .globl
, .text
, .Letext0
, .Ltext0
.
Was sind all diese Richtlinien für, oder zumindest meine Haupt-Frage? Ich habe gelernt, eine Menge von der Haupt-x86-Assembly-Anweisungen, aber nie eingeführt wurde, oder wies auf all diese seltsamen Richtlinien. Wie beeinflussen Sie die opcodes, und Sie alle sind notwendig?
- Es bedeutet nur, dass der assembler wird das nächste byte an eine Adresse teilbar durch integer, also wenn z.B. das Letzte byte wurde an
0x0eda
dann normalerweise die nächste byte-Position im0x0edb
, aber mit einem.align 8
Richtlinie im Ort, das nächste byte-Position im0x0ec0
, die nächste Adresse, die teilbar ist durch 8 - Beachten Sie, dass .align ist für alles, was die assembler-Ausgänge, wie Maschinen-code, nicht nur für das, was Sie in C nennen würde, "Daten"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits erwähnt in den Kommentaren, es bedeutet, dass der compiler fügen Sie genug padding bytes, so dass die nächsten Daten landet auf einer "noch" - position (teilbar durch die Ausrichtung Wert). Dies ist wichtig, weil ausgerichtet, Zugang zum Speicher ist viel schneller als unaligned memory access). (Laden eines doubleword von 0x10000 ist besser als das laden eines doubleword von 0x10001). Es kann auch hilfreich sein, falls Sie die Schnittstellen zu anderen Komponenten und müssen zum senden/empfangen von Strukturen von Daten mit einer bestimmten Polsterung/Ausrichtung.
Beachten Sie zunächst, dass
.align
es ist keine x86-spezifischen Konzept, sondern eine GAS Richtlinie dokumentiert hier. Es kann auch verwendet werden, für andere Architekturen. x86 nicht angeben, Richtlinien, nur Anweisungen.Jetzt spielen wir es mit, um es zu verstehen:
a.S
:Kompilieren und dekompilieren:
Ausgabe:
So
sym
wurde verschoben auf 16 byte, das erste Vielfache von 16 nach dem ersten.byte 1
wir gesetzt haben, zu richten es mit 16 bytes.Bytes verwendet, um die Füllung zwischen
01
und02
Mülleimer gewählt von GAS (TODO-wie?)Nicht mal versuchen, einen anderen Eingang:
Gibt:
Also dieses mal
sym
verschoben wurde, um8
, das ist der erste von mehreren4
kommt nach5
.Der Hauptgrund für die
align
Richtlinie ist die Beschleunigung der Ausführung. Wenn eincall
oderjmp
Ziel ist auf eine ungerade Adresse es können zusätzliche bus-transfers und/oder ein Vorschuss, um die genaue byte. Das gleiche gilt für Daten. In der alten 80386-Handbuch gab es Strafen für bestimmte opcodes, wenn das Ziel war falsch.Fand ich es in der Anleitung (von http://css.csail.mit.edu/6.858/2011/readings/i386.pdf) auf Seite 24:
Modulo bezieht sich auf die modulo-operation in der Arithmetik, D. H. die
%
symbol in c, oder der "Rest" in anderen Worten."modulo n" in der Regel impliziert, dass das E-Modul der Ausdruck von
n
gleich 0 ist. Wenn Sie möchten, um eine Adresse "modulo 4", das bedeutet, dass (Adresse % 4) == 0, das gilt auch für die folgenden Beispiele: 0,4,8,0 xC,0x10, etc.Hardware-Einschränkungen erfordern, dass einige Datentypen ausgerichtet, die von einer großen Ganzzahlen. Zum Beispiel, einige DMA-engines erfordern möglicherweise modulo 64.