Wie kann ich kompilieren von assembly-Routinen für die Verwendung mit einem C-Programm (GNU-assembler)?

Habe ich eine Reihe von Montage-Funktion, die ich nutzen möchte in C-Programmen durch die Erstellung einer header-Datei. Zum Beispiel, wenn ich asm_functions.s definiert die aktuelle assembly-Routinen und asm_functions.h die Prototypen für die Funktionen sowie einige standard #define ' s, die ich brauchte. Mein Ziel ist es, ein C-Programm, sagen test_asm.c zum aufrufen der assembly-Funktionen.

asm__ - Funktionen.h:


 #define ASM_CONST_1    0x80
 #define ASM_CONST_2    0xaf

uint8_t asm_foo( int, int, int );

asm__ - Funktionen.s:


 /* dont need this: #include "asm_functions.h" */

.section .text .type asm_foo, @function asm__foo: /* asm code with proper stack manipulation for C calling conventions */ ret

testen Sie__asm.c:


 #include "asm_foo.h"

int main() { uint8_t res = asm_foo( 1, 2, 3); return 0; }

In einer situation wie dieser, was wäre die richtige Art und Weise zu kompilieren einen link auf dem Programm? Ich war versucht, so etwas wie dieses:


gas -o asm_foo.o asm_foo.s
gcc -o test_asm test_asm.c

Aber ich bekomme immer noch ein linker-Fehler von GCC sagen, dass meine assembly-routine ist nicht definiert. Ich hoffe, dass dieses erfundene Beispiel ist gut genug, um die situation zu erklären.

Dank!

EDIT:

Hier ist ein Ausschnitt der Ausgabe, wenn ich das kompilieren mit einem einzigen Befehl:


tja@tja-desktop:~/RIT/SP2/latest$ gcc -o test_pci pci_config.s test_pci.c
/tmp/ccY0SmMN.o: In function _pci_bios_read_byte':
(.text+0x8): undefined reference toPCI_FUNCTION_ID' 
/tmp/ccY0SmMN.o: In Funktion _pci_bios_read_byte':
(.text+0xa): undefined reference toREAD_CONFIG_BYTE' 
/tmp/ccY0SmMN.o: In Funktion _pci_bios_read_byte':
(.text+0x18): undefined reference toPCI_BIOS_FUNCTION_INT' 
/tmp/ccY0SmMN.o: In Funktion _pci_bios_read_byte':
(.text+0x1b): undefined reference toBAD_REGISTER_NUMBER' 
/tmp/ccY0SmMN.o: In Funktion _pci_bios_read_word':
(.text+0x30): undefined reference toPCI_FUNCTION_ID' 
... 

Alle diejenigen, die wie PCI_FUNCTION_ID, sind definiert in meine header-Datei, die enthalten ist, indem Sie das C-Programm. Wenn ich kompilieren der Assembler-code durch selbst gibt es keine Fehler.

Schreibe einen Kommentar