Ich habe eine Menge von Assembly-Funktionen, die ich in C-Programmen verwenden möchte, indem ich eine Header-Datei erstelle. Zum Beispiel, wenn ich asm_functions.s habe, was die eigentlichen Assembly-Routinen und asm_functions.h definiert, die Prototypen für die Funktionen haben, sowie einige Standard # define's, die ich brauche. Mein Ziel ist es, ein C-Programm zu verwenden, sagen Sie test_asm.c, um die Assembly-Funktionen aufzurufen.
asm__functions.h:
%Vor%asm__functions.s:
%Vor%test__asm.c:
%Vor%In so einer Situation wäre der richtige Weg, um das Programm zu verlinken? Ich habe so etwas versucht:
%Vor%
Aber ich bekomme immer noch einen Linker-Fehler von GCC, der sagt, dass meine Assembly-Routine undefiniert ist. Ich hoffe, dieses erfundene Beispiel ist gut genug, um die Situation zu erklären.
Danke!
BEARBEITEN:
Hier ist ein Ausschnitt der Ausgabe, wenn ich mit einem einzigen Befehl kompiliere:
%Vor%Alle, wie PCI_FUNCTION_ID, sind in meiner Header-Datei definiert, die im C-Programm enthalten ist. Wenn ich den Assembler-Code selbst kompiliere, gibt es keine Fehler.
Basierend auf den Dateien in Ihrer Frage, habe ich es geschafft, es zu kompilieren. Ich habe sowohl die Dateinamen als auch den Dateiinhalt geändert.
asm_const.h:
%Vor%asm_functions.h:
%Vor%asm_functions.S (das nachfolgende S muss groß sein! #include benötigt es):
%Vor%test_asm.c:
%Vor%Bitte beachten Sie, dass Sie die Assembly-Dateierweiterung .S mit Großbuchstaben S benötigen. Mit .s würde die .s-Datei nicht durch den Präprozessor laufen, also würde #include nicht funktionieren, und Sie wären es nicht kann ASM_CONST_1 in der .s-Datei verwenden.
Kompilieren Sie mit einem einzigen Befehl:
%Vor%Alternativ können Sie mit mehreren Befehlen kompilieren und .o-Dateien erstellen:
%Vor%Der Single-Befehl gcc kümmert sich um das Kompilieren der .S-Datei mit Gas, die .c-Datei mit dem C-Compiler von GCC und das Verknüpfen der resultierenden temporären .o-Dateien mit ld. gcc führt alle diese Befehle standardmäßig mit den entsprechenden Flags aus.
Auf einigen Systemen (aber nicht auf Linux mit der Standard-GCC-Installation) müssen Sie den Namen der exportierten Funktionen in der .S-Datei (aber nicht in den .c- oder .h-Dateien) mit einem Unterstrich versehen. So werden alle Instanzen von asm_foo
nur in der .S-Datei _asm_foo
.
Haben Sie die Inline-Montage in Erwägung gezogen? Es wäre viel einfacher als die Verwendung einer Assembler-Datei.
Bearbeiten: Der Grund, warum Sie Linkfehler erhalten, liegt wahrscheinlich auch daran, dass der C-Compiler einen führenden Unterstrich für die Bezeichner der tatsächlichen Symbole hinzufügt. Fügen Sie in Ihrer Assemblydatei einen Unterstrich hinzu.
Tags und Links compilation assembly x86 linker