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:
-
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.
-
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.
-
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.
-
Assemblieren Sie Ihren Code und führen Sie ihn aus.
Methode 2:
-
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.
-
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.
-
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.
-
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.
-
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.
-
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