3 Stimmen

Wie rufe ich C-Bibliotheksfunktionen aus Assemblersprache in MSVC 2008 auf?

Das Microsoft Visual Studio Pro 2008 C++ ist eine großartige IDE zum Schreiben, Zusammenstellen und Verlinken von reinen Assemblersprachprogrammen. Während ich Assemblerprogramme erstellen kann, die mit der Win32-API verknüpft sind (für die Konsoleneingabe und -ausgabe), kann ich keine Verbindung zur C Laufzeitbibliothek herstellen. Es wird zwar verlinkt, aber es tritt ein r6032-Fehler zur Laufzeit auf - Fehler bei der Initialisierung/Laden der Bibliothek. Kann mir jemand bitte sagen, wie ich die IDE (und den Code) einrichten kann, um C Bibliotheksfunktionen aufzurufen? Im Folgenden finden Sie ein Beispiel zum Aufrufen von printf. Übrigens, ich habe die msvcrt.lib verwendet. Ich habe auch die libcmt.lib ausprobiert.

Vielen Dank im Voraus.

        .586
        .model flat                             

        extern printf:near

        .data

msgTestClib db 'Hallo von der C-Bibliothek.', 0

        .code

main PROC

        push    ebp

        mov ebp, esp

        push offset msgTestClib

        call printf

        add esp, 4

        pop ebp

        ret

main ENDP

        END

4voto

jiangshi Punkte 71

Okay, ich habe die Antwort gefunden. Tatsächlich existieren zwei Lösungen. Aber zuerst, der Grund für den Fehler ist, dass Änderungen an VS 2005 und später vorgenommen wurden, die ändern, wie Assemblys zusammengesetzt werden, und das führt zu technischen Informationen, die sich mit den Grundlagen von VS befassen. Das "wie" ist hier viel wichtiger. Zuerst werde ich den Beispielcode hochladen, und es ist im Grunde der gleiche Code, unabhängig von der verwendeten Methode.

Der Code:

;sh3.asm - Test mit c-Laufzeitbibliotheksfunktionen

.586
.model flat

EXTRN   _printf:PROC

        .data

msgHello DB 'Hallo von der C-Bibliothek!', 0ah, 00h

.code

_main PROC

push OFFSET msgHello

call _printf

add esp, 4

ret 0

_main ENDP

END

Okay, Methode 1:

  1. Beginnen Sie mit einem leeren Projekt; fügen Sie eine Quelldatei mit der Erweiterung .asm hinzu und geben Sie den Code ein. Stellen Sie sicher, dass Sie den Einstiegspunkt Ihres Codes mit _main benennen. Methode zwei wird sich mit der Verwendung eines anderen Namens befassen.

  2. Gehen Sie als nächstes zum Projekt und setzen Sie es für die Verwendung von MASM, indem Sie mit der rechten Maustaste auf den Projektnamen im Lösungsexplorer klicken und benutzerdefinierte Erstellungsregeln auswählen; aktivieren Sie das Kästchen für den Microsoft Macro Assembler.

  3. Gehen Sie als nächstes zum Projekt -> Eigenschaften -> Linker -> zusätzliche Abhängigkeiten und geben Sie den Namen der C-Laufzeitbibliothek ein. Zum Beispiel msvcrt.lib für den Release-Code oder msvcrtd.lib für die Debugphase. Wichtiger Hinweis: Machen Sie keine Einträge für Einstiegspunkt oder Subsystem.

  4. Assemblieren Sie Ihren Code und führen Sie ihn aus.

Methode 2:

  1. Beginnen Sie mit einem leeren Projekt; fügen Sie eine Quelldatei mit der Erweiterung .asm hinzu und geben Sie den Code ein. Benennen Sie den Einstiegspunkt Ihres Codes mit einem Label Ihrer Wahl. Zum Beispiel start.

  2. Gehen Sie als nächstes zum Projekt und setzen Sie es für die Verwendung von MASM, indem Sie mit der rechten Maustaste auf den Projektnamen im Lösungsexplorer klicken und benutzerdefinierte Erstellungsregeln auswählen; aktivieren Sie das Kästchen für den Microsoft Macro Assembler.

  3. Gehen Sie als nächstes zum Projekt -> Eigenschaften -> Linker -> zusätzliche Abhängigkeiten und geben Sie den Namen der C-Laufzeitbibliothek ein. Zum Beispiel msvcrt.lib für den Release-Code oder msvcrtd.lib für die Debugphase.

  4. Gehen Sie als nächstes zu den Linker-Seiten, wählen Sie System und ändern Sie auf Konsole, gehen Sie dann zu Erweitert und geben Sie im Einstiegspunktfeld Ihr Einstiegslabel ein, wie z.B. start.

  5. Gehen Sie als nächstes zu den Linker-Seiten, wählen Sie Manifestdateien -> zusätzliche Manifestabhängigkeiten und geben Sie dies ein: type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' alles in einer Zeile.

  6. Assemblieren Sie und führen Sie Ihren Code aus.

Sie fragen sich vielleicht, woher man die Informationen für die zusätzlichen Abhängigkeiten bekommt, da diese Informationen höchstwahrscheinlich von der VS- und Windows-Version abhängig sind. Erstellen Sie ein einfaches Projekt mit Methode 1, suchen Sie dann die Manifestdatei und lesen Sie sie in einem Texteditor. Dort werden Sie die Abhängigkeitszeile mit den Informationen sehen.

Persönlich finde ich Methode 1 als den einfachsten Weg, um die Aufgabe zu erledigen. Gezwungen zu sein, meinen Einstiegspunkt als _main zu benennen, ist ein sehr kleiner Preis dafür, die Flexibilität bei der Verwendung von C-Laufzeitbibliothekscode zu haben. Es hat auch den Vorteil, dass man das Subsystem nicht einstellen muss. Nun, als besondere Anmerkung - Wenn Sie keine C-Laufzeitbibliotheken verwenden, verwenden Sie Methode 2 und lassen Sie den Schritt zum Hinzufügen zusätzlicher Manifestabhängigkeiten aus; das ist nicht nötig!

Übrigens habe ich auch Methode 1 getestet, indem ich Aufrufe an die Win32-API und die C-Laufzeitbibliothek gemacht habe, und der Code hat einwandfrei funktioniert. Mit anderen Worten, Sie können sowohl Windows-API-Aufrufe als auch C-Laufzeitbibliothek-Aufrufe im selben Code verwenden.

Ich hoffe, Sie finden diese Informationen hilfreich bei der Erstellung von Assemblercode in Windows mit Visual Studio. Viel Glück und viel Spaß!

~jiangshi

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X