Speicheradressierung mit GNU Assembler Intel Syntax

8

Ich lese diese Seite mit einer guten Liste von Unterschieden zwischen Intel und AT & amp; T-Syntax für GAS aber es ging nicht um die Angabe einer Adresse mit nur einer Verschiebung.

Hier habe ich vier Zeilen mit AT & amp; T-Syntax zusammengestellt:

%Vor%

Die ersten beiden Zeilen sind wie erwartet unterschiedlich. Die erste verschiebt den unmittelbaren Wert 8 in rax und die zweite verschiebt den Inhalt von Adresse 8 in rax. Aber mit Intel-Syntax bekomme ich das folgende seltsame Verhalten:

%Vor%

Hier werden die erste und die zweite Zeile zum selben Maschinencode zusammengefügt! Zuerst dachte ich, die eckigen Klammern wären falsch, also habe ich die dritte und vierte Zeile zum Test hinzugefügt, und die eckigen Klammern funktionieren zumindest für die Speicheradressierung, wenn Register beteiligt sind.

Die gesamte Dokumentation, die ich gelesen habe, zeigt Speicheradressierungsbeispiele mit mindestens einem Basis- oder Indexregister und manchmal eine Skalierung und Verschiebung, aber niemals nur eine Verschiebung.

Ich habe Erfahrung mit der Intel-Syntax unter Verwendung des NASM-Assemblers, der <% em>% und% co <%> unterscheidet.

Ist das ein Fehler in GAS? Oder wenn nicht, wie gebe ich das Äquivalent von NASMs mov rax, 8 an?

Mir ist klar, dass es wahrscheinlich ungewöhnlich ist, eine reine Verschiebungsadresse anzugeben, aber ich möchte mit dieser Syntax ein vollständiges Verständnis aller Speicheradressierungsformen erhalten.

    
Ray Toal 18.04.2012, 17:48
quelle

2 Antworten

7

Es gab tatsächlich einen solchen Fehler in gas - siehe Ссылка .

Es scheint in (oder vielleicht vor) binutils 2.21.51 behoben zu sein.

    
Matthew Slattery 19.04.2012, 23:11
quelle
1

Sie sehen hier einen besonderen Fall der AT & amp; T-Syntax. Normalerweise haben Sie für Adressoperanden:

%Vor%

Jeder der Bestandteile eines Adressoperanden in der AT & amp; T-Syntax ist optional, so dass Sie mov (%rax, %rbx), ... oder mov 0(%rax, %rbx, 1), ... oder eine andere solche Kombination schreiben können.

Innerhalb die () Klammern die einzige Zahl, die Sie normalerweise haben können, ist der Skalierungsfaktor (falls vorhanden).

Aber der Assembler akzeptiert auch (und erzeugt den gleichen Code für):

%Vor%

Dies funktioniert nur, wenn der Operand innerhalb der () eine einfache Zahl / absolute Adresse ist, andernfalls beschwert sich der Assembler, dass das, was Sie angegeben haben, kein gültiger Skalierungsfaktor ist. Diese Äquivalenz ist ein Sonderfall in der AT & amp; T-Syntax - ich bin nicht sicher, warum es / ist erlaubt ist.

Die Verwendung von $ in der AT & amp; T-Syntax spezifiziert jedoch immer eine Konstante , keinen Adressoperanden, der mit einer nackten Zahl identisch ist Intel Syntax.

Im Folgenden werden die Äquivalenzen veranschaulicht:

%Vor%     
FrankH. 19.04.2012 10:33
quelle

Tags und Links