Kann ich die Intel-Syntax der x86-Assembly mit GCC verwenden?

Lesezeit: 2 Minuten

Benutzeravatar von Hlib
Hlib

Ich möchte ein kleines Low-Level-Programm schreiben. Für einige Teile davon werde ich Assemblersprache verwenden müssen, aber der Rest des Codes wird in C/C++ geschrieben.

Wenn ich also GCC verwende, um C/C++ mit Assemblercode zu mischen, muss ich dann die AT&T-Syntax verwenden oder kann ich die Intel-Syntax verwenden? Oder wie mischt man C/C++ und asm (Intel-Syntax) auf andere Weise?

Mir ist klar, dass ich vielleicht keine Wahl habe und die AT & T-Syntax verwenden muss, aber ich möchte sicher sein.

Und wenn sich herausstellt, dass es keine Wahl gibt, wo finde ich die vollständige/offizielle Dokumentation über die AT&T-Syntax?

Vielen Dank!

  • Wenn Sie einige ganze Funktionen in asm schreiben, können sie sich in einer separat kompilierten Datei befinden. Wenn Ihnen eine Build-Abhängigkeit von YASM oder NASM nichts ausmacht, ist es einfach, jede beliebige Syntax zu verwenden. (Aber dann muss Ihr Asm mit den unterschiedlichen ABIs für Windows und Linux umgehen, vielleicht mit Assembler-Makros.) Die GNU-Assembler-Handbuch ist online, und normalerweise auch mit gcc/binutils installiert. (info as).

    – Peter Cordes

    1. Dezember 2015 um 2:18 Uhr


  • Seien Sie vorsichtig mit der Intel-Syntax, da der integrierte Assembler von Clang daran erstickt. Siehe auch LLVM-Problem 24232: Inline-Assembly-Operanden funktionieren nicht mit .intel_syntax. Der Fehlerbericht zeigt, dass Clang Probleme mit einer einfachen Verneinung hat.

    – jww

    24. Juli 2016 um 13:30 Uhr


  • @ugoren: -masm=intel lässt den Compiler Intel-Syntax generieren. Sie brauchen es sonst wirklich für die Inline-Montage "m" Speicherbeschränkungen funktionieren nicht.

    – ninjalj

    19. Februar 2012 um 9:49 Uhr

  • .att_syntax noprefix wird zum Rückgängigmachen benötigt .intel_syntax noprefix. Ich bin mir ziemlich sicher, dass Sie verwenden können "m" auch mit AT&T-Syntax. Es ist nur eine Frage der Bequemlichkeit, AFAIK.

    – ugoren

    19. Februar 2012 um 11:55 Uhr

  • @ugoren: wenn du verwendest .intel_syntax ohne -masm=intel, "m" gibt Speicherreferenzen in AT&T-Syntax an. Wenn du benutzt -masm=intel Sie müssen (und sollten) nicht zu AT&T zurückkehren, da der Compiler Intel-Syntax ausgibt.

    – ninjalj

    19. Februar 2012 um 12:21 Uhr

  • Ich denke, sie zu mischen klingt nach einer schlechten Idee. Akzeptieren Sie entweder die AT&T-Syntax (was seltsam ist, aber etwas, mit dem Sie leben können) oder gehen Sie den ganzen Weg mit der Intel-Syntax.

    – Per Lundberg

    16. März 2015 um 20:52 Uhr

  • @ugoren bitte erwägen Sie, Ihre früheren Kommentare zu löschen. Verwenden intel_syntax noprefix oder .att_syntax innen ein in der Reihe asm-Anweisung ist normalerweise eine schlechte Idee. Verwenden Sie sie nur eigenständig .S Dateien. Verwenden -masm=intel auf der Befehlszeile ist viel besser und bringt GCC dazu, die asm-Vorlage richtig auszufüllen (mit RDI anstelle von %RDI zum Beispiel, oder, was noch wichtiger ist, mit [rdi+8] Anstatt von 8(%rdi) zum "m" Operanden). Wenn Sie möchten, dass Code unabhängig von Befehlszeilenoptionen funktioniert, verwenden Sie Dialektalternativen: "mov {%1, %0 | %0, %1}".

    – Peter Cordes

    22. Januar 2021 um 20:03 Uhr

  • Qualitätsheader verwenden Dialektalternativen, damit sie kompilieren können -masm=intel oder ohne.

    – Peter Cordes

    16. November 2019 um 23:47 Uhr

1417290cookie-checkKann ich die Intel-Syntax der x86-Assembly mit GCC verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy