Symbolname steht in neuen NASM-Versionen in Konflikt mit neuen Registernamen?

8

Stellen Sie sich vor, Sie hätten dies vor 10 Jahren geschrieben (vor Intel MPX und den bnd0 .. bnd3 Registern) sogar auf einer Roadmap):

%Vor%

Wie können Sie dies mit einer aktuellen Version von NASM zusammenstellen? . Ist NASM (oder YASM) vorwärtskompatibel mit neuen Versionen, die neue Registernamen unterstützen?

Offensichtlich ist dies leicht mit Suchen / Ersetzen innerhalb einer einzelnen Datei oder eines Projekts zu lösen. Aber theoretisch könnten Sie einen globalen Variablennamen als Teil eines ABI einer Bibliothek haben, den Sie entweder von NASM exportieren oder importieren in NASM mit extern ymm0 . (Externe Symbole müssen deklariert werden, so dass unerkannte Registernamen niemals zu Symbolreferenzen zusammengefügt werden.)

Die NASM-Syntax ist bereits als Format für die C-Compiler-Ausgabe auf Plattformen ungeeignet, die keine Symbolnamen mit einem _ voranstellen oder irgendeine andere Art von Namensfehlern (z. B. Linux ELF) ausführen. Sie können kein globales int eax = 1; kompilieren. Deshalb AT & amp; ; T-Syntax verwendet %eax für Registernamen . Die Diskussion in Kommentaren zu dieser Antwort hat diese Frage inspiriert. Beachten Sie, dass GAS keine externen Symbole benötigt, um deklariert zu werden; Nicht erkannte Namen werden als Symbole behandelt (sogar im .intel_syntax noprefix -Modus, der eine MASM-ähnliche Syntax verwendet).

Related: Wie verarbeitet MASM die Quellkompatibilität für neue Erweiterungen?

Können Sie die MPX-Unterstützung irgendwie deaktivieren?

YASM unterstützt eine CPU -Direktive , mit dem Sie die Unterstützung für einige Mnemotechniken deaktivieren können. Wenn Sie jedoch die AVX-Unterstützung deaktivieren, können Sie ymm0 nicht als Symbolnamen verwenden. (YASM 1.3.0 unterstützt AVX512 oder MPX nicht, sodass es Code zusammenstellen kann, der diese Registernamen als Symbole verwendet, aber AVX2 unterstützt.)

%Vor%

Ich bekomme yasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter . Oder mit ymm0: dd 123 ist der Fehler yasm-CPU.asm:2: error: label or instruction expected at start of line

Aber die AVX-Unterstützung ist definitiv deaktiviert: assembling CPU Conroe / vmovaps xmm0, [edi] gibt:

%Vor%

(Er sagt CPU 686 oder ähnlich für ältere deaktivierte Erweiterungen. IDK warum es nicht in CPU Sandybridge AVX sagt. Es scheint, dass Yasm nicht mehr gut gepflegt wird. YASM 1.3.0 unterstützt CPU Haswell und AVX2 , aber die Docs erwähnen es nicht.)

Mit dieser Funktion soll verhindert werden, dass Sie versehentlich SSE4-Anweisungen in einer Funktion für SSSE3-oder-niedrigere CPUs verwenden, aber anscheinend hilft es nicht bei diesem Problem.

NASMs CPU -Direktive scheint ähnlich zu sein und hilft auch nicht:

%Vor%

%Vor%

Beachten Sie, dass es extern ymm0 einfach zusammenfügt, mit oder ohne eine CPU -Direktive, aber sobald Sie es als Operand verwenden, haben Sie ein Problem.

    
Peter Cordes 25.08.2017, 23:42
quelle

1 Antwort

10

Mit NASM können Sie einem Symbol ein Dollarzeichen $ voranstellen, so dass es als Symbol und nicht als Register oder anderes reserviertes Wort interpretiert wird. Aus der NASM-Dokumentation :

  

3.1 Layout einer NASM Source Line

     

[...] Einem Bezeichner kann auch ein $ vorangestellt werden, um anzuzeigen, dass es als Bezeichner und nicht als reserviertes Wort gelesen werden soll; Wenn also ein anderes Modul, mit dem Sie verlinken, ein Symbol namens eax definiert, können Sie im NASM-Code auf $eax verweisen, um das Symbol vom Register zu unterscheiden. [...]

MASM wird normalerweise nur in Umgebungen verwendet, in denen C-Compiler Präfix-IDs mit Unterstrichen _ vorgeben, daher ist dies bei diesem Assembler nicht so problematisch. Es hat jedoch eine Lösung dieses Problem, aber es ist im Grunde das Gegenteil von NASM. Sie können die Option OPTION NOKEYWORD verwenden, um reservierte Wörter Ihrer Wahl zu deaktivieren. Zum Beispiel können Sie OPTION NOKEYWORD:<eax> verwenden, damit Sie ein Symbol namens eax verwenden können. Natürlich verhindert das, dass Sie das Register namens EAX verwenden, also ist es nicht so allgemein wie NASM.

    
Ross Ridge 26.08.2017, 01:04
quelle