MASM für x64 (ml64.exe)

Visual Studio enthält sowohl 32-Bit- als auch 64-Bit-gehostete Versionen von MASM (microsoft Macro Assembler) für x64-Code. Als ml64.exe bezeichnet, ist es der Assembler, der x64-Assemblersprache akzeptiert. Die MASM-Befehlszeilentools werden installiert, wenn Sie während der Installation von Visual Studio eine C++-Workload auswählen. Die MASM-Tools sind nicht als separater Download verfügbar. Anweisungen zum Herunterladen und Installieren einer Kopie von Visual Studio finden Sie unter Installieren von Visual Studio. Wenn Sie nur die Befehlszeilentools und nicht die vollständige IDE benötigen, laden Sie die Buildtools für Visual Studio herunter.

Um ml64.exe in der Befehlszeile zu verwenden, starten Sie eine Entwickler-Eingabeaufforderung für x64-Ziele. Eine Eingabeaufforderung für Entwickler legt den erforderlichen Pfad und andere Umgebungsvariablen fest. Informationen zum Starten einer Entwickler-Eingabeaufforderung finden Sie unter Build C/C++-Code in der Befehlszeile.

Informationen zu ml64.exe Befehlszeilenoptionen finden Sie unter ML und ML64 Command-Line Reference.

Inlineassembler oder Die Verwendung des ASM Schlüsselwort (keyword) wird für x64- oder ARM64-Ziele nicht unterstützt. Um Ihren x86-Code zu portieren, der Inlineassembler zu x64 oder ARM64 verwendet, können Sie Ihren Code in C++ konvertieren, systeminterne Compiler verwenden oder Assemblersprachenquelldateien erstellen. Der Microsoft C++-Compiler unterstützt systeminterne Funktionen, damit Sie spezielle Funktionsanweisungen verwenden können, z. B. privilegierte Überprüfung, Bitscan oder Test, verriegelt usw., so nah wie möglich auf plattformübergreifende Weise. Informationen zu verfügbaren systeminternen Elementen finden Sie unter Compiler-Systeminterne.

Hinzufügen einer Assemblersprachendatei zu einem Visual Studio C++-Projekt

Das Visual Studio-Projektsystem unterstützt Assemblersprachendateien, die mithilfe von MASM in Ihren C++-Projekten erstellt wurden. MASM unterstützt vollständig x64-Assembler-Sprachquelldateien und erstellt sie in Objektdateien. Anschließend können Sie diese Objektdateien mit Ihrem C++-Code verknüpfen, der für x64-Ziele erstellt wurde. Es ist eine Möglichkeit, den Mangel an x64-Inlineassembler zu überwinden.

So fügen Sie einem vorhandenen Visual Studio C++-Projekt eine Assemblersprachedatei hinzu

  1. Wählen Sie das Projekt im Projektmappen-Explorer aus. Wählen Sie auf der Menüleiste "Projekt", "Anpassungen erstellen" aus.

  2. Aktivieren Sie im Dialogfeld "Visual C++-Buildanpassungsdateien " das Kontrollkästchen neben masm(.targets,.props). Wählen Sie 'OK ' aus, um Ihre Auswahl zu speichern und das Dialogfeld zu schließen.

  3. Wählen Sie auf der Menüleiste "Projekt", "Neues Element hinzufügen" aus.

  4. Wählen Sie im Dialogfeld "Neues Element hinzufügen" im mittleren Bereich die C++-Datei (CPP) aus. Geben Sie im Namensbearbeitungssteuerelement einen neuen Dateinamen ein, der eine .asm Erweiterung anstelle von .cpp. Wählen Sie "Hinzufügen" aus, um die Datei zu Ihrem Projekt hinzuzufügen und das Dialogfeld zu schließen.

Erstellen Sie Ihren Assemblersprachencode in der .asm hinzugefügten Datei. Wenn Sie Ihre Lösung erstellen, wird der MASM-Assembler aufgerufen, um die .asm Datei in einer Objektdatei zusammenzustellen, die dann mit Ihrem Projekt verknüpft ist. Um den Symbolzugriff zu vereinfachen, deklarieren Sie Ihre Assemblerfunktionen wie extern "C" im C++-Quellcode, anstatt die C++-Namensdekokonventionen in Ihren Assemblersprachenquelldateien zu verwenden.

ml64-spezifische Richtlinien

Sie können die folgenden ml64-spezifischen Direktiven in Ihrem Assembler-Sprach-Quellcode verwenden, der auf x64 ausgerichtet ist:

Die PROC Direktive wurde auch für die Verwendung mit ml64.exe aktualisiert.

32-Bit-Adressmodus (Außerkraftsetzung der Adressgröße)

MASM gibt die Außerkraftsetzung der 0x67 Adressgröße aus, wenn ein Speicheropernd 32-Bit-Register enthält. Die folgenden Beispiele führen beispielsweise dazu, dass die Außerkraftsetzung der Adressgröße ausgelassen wird:

mov rax, QWORD PTR [ecx]
mov eax, DWORD PTR [ecx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10d+0100h]
prefetch [eax]
movnti rax, QWORD PTR [r8d]

MASM geht von einer 64-Bit-Adressierung aus, wenn eine 32-Bit-Verschiebung allein als Speicheropernd angezeigt wird. Es gibt derzeit keine Unterstützung für die 32-Bit-Adressierung mit solchen Operanden.

Schließlich generiert das Mischen von Registergrößen innerhalb eines Speicheropernden, wie im folgenden Code gezeigt, einen Fehler.

mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]

Siehe auch

Referenz zum Microsoft-Makroassembler