Assemblerfunktion von C-Programm aufrufen

Folgendes Problem:

Ich habe eine Assemblerdatei, in der eine Funktion definiert ist, einen C-Quelltext, in dem die Funktion aufgerufen wird und eine Headerdatei, wo die Funktionsdeklaration rein soll.

Wenn ich die Funktionsdeklaration in die Headerdatei schreibe, bekomme ich ein "Error: no such instruction" mit Verweis auf die Funktion.

Wenn ich die Funktionsdeklaration über die Hauptfunktion im C-Quelltext schreibe, dann klappt alles.

Hat jemand eine Idee, wie ich die Deklaration in die Headerdatei bekomme, ohne eine Fehlermeldung zu erzeugen?

Danke für Antworten
 
Hast du die Funktion als 'extern' in der Header-Datei deklariert?
 
Und die Header-Datei hast du auch korrekt in der C-Datei inkludiert? Evtl. wäre es brauchbar, wenn du uns einfach mal die entsprechenden Code-Schnipsel zeigst.
 
Code:
#include "screen.h"

void start_kernel(void) {

    const char *msg = "Hallo Welt!";     // Nachricht zum Ausgeben

    register int i;                  // Schleifenvariable

    char *video = (char *)VIDEO;        // Startadresse des Grafikspeichers

    // Zeichen ausgeben, bis Nullbyte erreicht wird
    for(i = 0; msg[i] != '\0'; i++) {

        // Zeichen in den Videospeicher kopieren
        video[i*2] = msg[i];

        // zweites Byte legt Farbe fest: 0x07 -> hellgrau auf schwarz
        video[i*2+1] = 0x0C;
    }

    // Textfarbe: grün
    set_text_color(GRUEN);
}

Code:
#ifndef _SCREEN_H_
#define _SCREEN_H_

// Startadresse des Grafikspeichers (4 KB, 80 Spalten, 25 Zeilen, 2 Byte pro Zeichen)
#define VIDEO 0xb8000


// Anzahl der Spalten bzw. Zeilen des Bildschirms
#define ZEILEN    25
#define SPALTEN    80


// verfügbare Farben mit ihren Farbcodes;

#define SCHWARZ        0x0
#define BLAU        0x1
#define GRUEN        0x2
#define CYAN        0x3
#define ROT        0x4
#define MAGENTA        0x5
#define BRAUN        0x6
#define HELLGRAU    0x7
#define DUNKELGRAU    0x8
#define HELLBLAU    0x9
#define HELLGRUEN    0xA
#define HELLCYAN    0xB
#define HELLROT        0xC
#define HELLMAGENTA    0xD
#define GELB        0xE
#define WEISS        0xF


// Textfarbe festlegen
extern void set_text_color(int);

#endif

Code:
// Textfarbe festlegen

#include "screen.h"

.section .text

.global set_text_color
.type set_text_color, @function

set_text_color:

    pushl %ebp            // Rücksprungadresse sichern
    movl %esp, %ebp            // Basiszeiger einrichten
    movl $VIDEO, %eax        // Startadresse des Grafikspeichers
    incb %al            // erstes Attributbyte
    movl $(ZEILEN * SPALTEN), %ecx    // Zählregister einrichten
    movl 8(%ebp), %edx        // Textfarbe vom Stack holen
    jmp loop_body            // Sprung zum Schleifenanfang

loop_body:

    andb $0xf0, (%eax)        // Textbits löschen
    orb %dl, (%eax)            // neue Textfarbe anwenden
    addl $2, %eax            // zum nächsten Attributbyte
    loop loop_body            // ecx wird um 1 verringert
                    // Sprung zum Schleifenanfang, wenn ecx > 0
loop_end:

    movl %ebp, %esp            // Stackpointer zurücksetzen
    popl %ebp            // Rücksprungadresse vom Stack holen
    ret                // Ende
 
Die Deklaration ist ja auch nur für den C-Part "interessant" ;)
screen.h "fix"
Code:
#ifndef __ASSEMBLER__
extern __attribute__((stdcall)) void set_text_color(int);
#endif
gcc
Code:
CDW@highlander-jr:~/projects/habo/skernel % gcc49  -nostdlib -m32 start_kernel.c set_text_color.S
/usr/local/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008048094
clang 3.4
Code:
CDW@highlander-jr:~/projects/habo/skernel % cc -nostdlib -m32 start_kernel.c set_text_color.S
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html <- was ist __ASSEMLER__
x86 calling conventions - Wikipedia, the free encyclopedia <-- warum "stdcall"

wobei man auch einfach mehrere Include-Dateien nutzen könnte (was imho sauberer wäre).
 
Zurück
Oben