Assembler in C einbinden



  • Hallo,
    Ich hab ein kleines Programm in Turbo C++ geschrieben das auf eine Routine die in Assembler geschrieben wurde von C aus aufruft. Das Problem ist, das ich die beiden nicht zu einer EXE Datei linken kann.

    #################### C Programm - "prog02c.cpp" #############
    
    extern void Ausgabe();
    
    void main () {
     Ausgabe();
    }
    ############################### ENDE ###################
    
    #################### ASM  - "prog02.asm" ###################
    DATA SEGMENT BYTE PUBLIC
    str1 DB '1.erste Ausgabe!',13,10,'$'
    DATA ENDS
    
    CODE SEGMENT WORD PUBLIC
    ASSUME CS:CODE, DS:DATA
    
    PUBLIC _Ausgabe
    _Ausgabe PROC FAR
     mov dx, OFFSET str1
     mov ah, 09h
     int 021h
     ret
    _Ausgabe ENDP
    CODE ENDS
    END
    ###################################################
    

    Dann Compiliere ich prog02c.cpp -> prog02c.obj
    Dann Compiliere ich prog02.asm -> prog02.obj
    ... und jetzt
    versuche ich mit TLINK prog02c.obj prog02.obj
    ... die beiden zu einer EXE Datei zu linken jedoch kommt dann die
    Fehlermeldung

    E:\TC\BIN>tlink prog02.obj prog02c.obj
    Turbo Link Version 5.0 Copyright (c) 1992 Borland International
    Error: Undefined symbol ausgabe() in module PROG02C.CPP
    Error: Undefined symbol N_OVERFLOW@ in module PROG02C.CPP
    Error: Undefined symbol ___BRKLVL in module PROG02C.CPP
    Warning: No stack

    Kann mir jemand helfen???
    Danke im voraus! 🙂

    mfg
    Radek

    EditBySideWinder: Nächstes Mal bitte selbständig Code-Tags einfügen!

    [ Dieser Beitrag wurde am 27.01.2003 um 15:42 Uhr von SideWinder editiert. ]



  • Hallo,

    die Deklaration solltest Du schon mal anders definieren, da sie sich in einer CPP-Datei befindet:

    extern "C" void Ausgabe();
    

    Dann musst Du sicherstellen, dass die CPP-Datei auch im Modell LARGE übersetzt wird (Deine ASM-Funktion ist FAR). Für alle Fälle schreibe ich Dir nochmal den ganzen Quelltext mit meinen Änderungen auf, für die Annahme, es wird das Speichermodell LARGE verwendet (ich habe den TASM 5.0, mit dem funktionierts):

    #################### C Programm - "prog02c.cpp" #############
    
    extern "C" void Ausgabe();
    
    void main () {
     Ausgabe();
    }
    ############################### ENDE ###################
    
    #################### ASM  - "prog02.asm" ###################
    P386
    MODEL LARGE
    
    ; Borland-C kompatibles Datensegment:
    DATASEG
    str1 DB '1.erste Ausgabe!',13,10,'$'
    @curseg ENDS
    
    ; Borland-C kompatibles Codesegment:
    CODESEG
    
    PUBLIC _Ausgabe
    
    LOCALS
    
    _Ausgabe PROC
     mov dx, OFFSET str1
     mov ah, 09h
     int 021h
     ret
    ENDP
    
    END
    ###################################################
    

Anmelden zum Antworten