Verwendung von Adresskonstanten in GCC x86-Inline-Assembly

8

Die GCC-Toolchain verwendet standardmäßig die AT & amp; T Assembler-Syntax, aber die Unterstützung für die Intel-Syntax ist über die .intel_syntax -Direktive verfügbar.

Zusätzlich sind AT & amp; T und Intel-Syntax in einer prefix - und einer noprefix -Version verfügbar, die sich unterscheiden, ob sie Registernamen mit einem % sigil voranstellen müssen oder nicht.

Je nachdem, welche Direktiven vorhanden sind, ändert sich das Format für Adresskonstanten.

Betrachten wir den folgenden C-Code

%Vor%

Mit objdump -d finden wir, dass es in die folgende Assembler-Anweisung kompiliert wurde

%Vor%

Da keine Register beteiligt sind, ist dies die korrekte Syntax für .att_syntax prefix und .att_syntax noprefix , dh. in C-Code eingebettet, sehen sie so aus

%Vor%

Sie können die Adresskonstante optional mit Klammern umgeben, dh.

%Vor%

funktioniert auch.

Beim Hinzufügen eines Sigils zu einer einfachen Adressenkonstante kann der Code nicht kopieren

%Vor%

Wenn dieser Ausdruck mit einer Paranthese umgeben wird, gibt der Compiler falschen Code ohne Warnung aus, dh

%Vor%

Dies wird den Befehl falsch ausgeben

%Vor%

Im Intel-Modus muss einer Adresskonstante ein Segmentregister sowie die Operandengröße und das PTR -Flag vorangestellt werden, wenn Mehrdeutigkeit möglich ist. Auf meinem Computer (ein Intel Dual-Core-Laptop mit Windows XP und aktuellen Versionen von MinGW und Cygwin GCC) wird standardmäßig das Register ds verwendet.

Eckige Klammern um die Konstante sind optional. Die Adresskonstante wird auch korrekt erkannt, wenn das Segmentregister weggelassen wird, aber die Klammern vorhanden sind. Das Auslassen des Registers gibt jedoch eine Warnung an mein System aus.

Im prefix -Modus muss dem Segmentregister das Präfix % vorangestellt werden, aber nur Klammern werden weiterhin funktionieren. Dies sind die verschiedenen Möglichkeiten, um die richtige Anweisung zu generieren:

%Vor%

Das Auslassen sowohl des Segmentregisters als auch der Klammern kann nicht kompiliert werden

%Vor%

Ich werde diese Frage als Community-Wiki markieren. Wenn Sie etwas Nützliches hinzufügen möchten, können Sie dies tun.

    
Christoph 09.09.2010, 20:24
quelle

2 Antworten

4

Die noprefix / prefix Direktiven steuern nur, ob Register ein % Präfix (*) benötigen (zumindest scheint es so zu sein und das ist der einzige Unterschied, den die Dokumentation erwähnt). Wertliterale benötigen immer ein $ Präfix in der AT & amp; T Syntax und niemals in der Intel Syntax. So funktioniert das folgende:

%Vor%

Wenn Sie wirklich geneigt sind, Intel-Syntax-Inline-Assembly in C-Code zu verwenden, der mit GCC kompiliert und mit GAS kompiliert wurde, vergessen Sie nicht, auch folgendes hinzuzufügen, damit der Assembler den Rest des (AT & amp; T Syntax) Assembly generiert von GCC:

%Vor%

Die Argumentation, die ich für die Präfix- / Noprefix-Unterscheidung sehe, ist, dass für die AT & amp; T-Syntax das % -Präfix für Register in der Intel-Architektur nicht wirklich benötigt wird, weil Register benannt sind. Aber für die Einheitlichkeit kann es da sein, weil einige andere Architekturen (d. H. SPARC) registriert sind, in welchem ​​Fall das Spezifizieren einer niedrigen Zahl allein nicht eindeutig ist, ob eine Speicheradresse oder ein Register gemeint war.

    
Tom Alsberg 14.02.2009, 17:42
quelle
1

Hier sind meine eigenen Ergebnisse:

%Vor%     
Christoph 14.02.2009 18:09
quelle

Tags und Links