c und asm mischen?



  • Warum nicht gcc und nasm und dann linken?



  • Ich hatte das Problem auch mal, aber der Thread scheint schon gelöscht wurden zu sein.



  • @BlockBuster: Falls du noch keine Lösung gefunden hast hab hier hier noch mal ein kleines Beispiel.

    // datei: kernel.c ////////////////////
    extern void print(char *Text);
    extern char warten_key();
    int main()
    {
    char taste[1]
    print("Druecken Sie eine Taste!\n\r");
    taste[1] = warten_key();
    print("Die Taste war:");
    print(taste);
    }
    
    // datei: startup.asm /////////////////
    BITS 16
    jmp start
    GLOABAL _print
    GLOBAL _warten_key
    EXTERN _main
    
    start:
    jmp _main
    
    _print:
    push bp
    push si
    mov bp,sp
    mov si,[bp+6]
    
    ;;;;;;;;;;;;;;;;;;;;;
    ;Parameter:
    ;Die Werte werden beim Aufruf in den Stack kopiert.
    ;Diese müssen jetzt RÜCKWERTS wieder aufgelöst werden!
    ;Ein Beispiel für RealMode:
    :fumktion(para1,para2,para3,para4);
    ;mov para1,[bp+6]
    ;mov para2,[bp+8]
    ;mov para3,[bp+10]
    ;mov para4,[bp+12]
    ;
    ;Im PM [glaub ich jedenfalls]:
    ;mov para1,[bp+8]
    ;mov para2,[bp+12]
    ;mov para3,[bp+16]
    ;mov para4,[bp+20]
    ;
    ;Musst du mal ausprobieren.
    ;;;;;;;;;;;;;;;;;;;;
    
    print@1: 
    lodsb                   ; load byte at ds:si into al
    or al,al                ; test if character is 0 (end)
    jz print@ende
    mov ah,0eh              ; put character
    mov bx,0007             ; attribute
    int 0x10                ; call BIOS
    jmp print@1
    print@ende:
    ret
    
    _warten_key:
    push bp
    mov bp,sp
    
    mov ah,0
    int 16h
    ;;;;;;;;;;;;;;;;;;;;;
    ;Rückgabe:
    ;char Werte werden über al zurückgegeben
    ;mov taste,al
    ;;;;;;;;;;;;;;;;;;;;
    pop bp
    ret
    

    Ich hoffe ma das dir das weitergeholfen hat.



  • @SP ok danke 🙂



  • Hallo
    Ich mache meinem Namen wieder alle Ehre, ich krieg´s einfach nicht hin eine *.asm und eine *.c zu was Verwetbaren zu verwurschteln.
    Ich benutze Turbo C 2.01, TASM 2.01 und Tlink 3.01.
    Vom Kombinieren C und ASM hatte ich bis jetzt ehrlich gesagt nicht viel Ahnung, also hab ich meinen Code grossteils von hier abgekupfert.
    Test.c
    ------

    extern void Tuwas();
    int main()
    {
        Tuwas();
        return(0);
    }
    

    Test2.asm
    ---------

    EXTRN _main
    GLOBAL _Tuwas
    CODE SEGMENT
    ASSUME CS:CODE
    
    Start:
        jmp _main
    
        _Tuwas:
        mov ax,02H ;irgendwas halt
        xor ax,ax
    
    CODE ENDS
        End Start
    

    Beim Assemblieren der Test2.asm erhalte ich die Warnung: Global tyüe doesn´t match symbol type: _Tuwas

    Linke ich die beiden *.obj Dateien mit tlink und führe die *.exe Datei aus, kommt nur ein "Die Anwendung wird aufgrund eines ungültigen Zugriffes beendet". Ich arbeite unter Win98.
    Geht das mit TASM überhaupt so, oder muss ich den Code dafür umschreiben(PROC _Tuwas FAR statt _Tuwas: z.B)?

    mfg und thx im Voraus
    Noob



  • Ich habe TASM5 und da funktioniert Folgendes:

    /* C-Datei */
    
    int main()
    {
       func ();
       return 0;
    }
    

    -----------

    ;  ASM-Datei     
         .MODEL    SMALL
         .DATA
         .CODE
         PUBLIC    _func
    _func     PROC
         mov  ah, 0eh
         mov  al, '*'
         int  10h
         ret
    _func     ENDP
         END
    

    Allerdings könnte es sein, daß TASM2 diese moderne Schreibwiese noch nicht unterstützt. Dann guck doch mal in den TASM-Ordner mit den Beispielen (bei mir heißt er USRGUIDE). Dort müßten auch ein oder zwei C- oder C++ - Dateien sein. Da müßte dann ein Beispielprogramm dabei sein, wie man C- und ASM-Code zusammenlinkt.



  • Version 2.01 ist ja schon eine etwas ältere Version, ich habe keinen solchen Ordner. Wo gibts ein Update auf die Version 5 und was kostet die, denke nicht, dass das gratis sein wird.
    Könnte man auch alle ASM Befehle in C Funktion in einer Headerdatei schreiben und die Includieren? Müsste doch genauso schnell sein und funktionieren.

    mfg
    Noob



  • Ich habe mal Turbo Assembler 2.0 (deine Version) mit TASM5 emuliert, und er übersetzt die Assemblerdatei einwandfrei. Damit kannst du zufrieden sein - einfacher gehts nämlich nicht. Die ältere, viel kompliziertere Methode kannst du also vergessen. 🙂

    Die nächste Schwierigkeit, auf die du stoßen wirst, ist es, Daten von main aus an die aufgerufene Funktion zu übergeben (über den stack). Aber da kannst du ja hier wieder fragen, wenn es so weit ist. 😉

    Was den TASM 5 angeht, so ist der Turbo Assembler eingestellt und wird von Borland nicht mehr vertrieben, soviel ich weiß. Und als freie Version (so wie Turbo C) gibts den auch nicht. Aber außer wenn du für Windows programmieren willst, reicht TASM 2 vollkommen. Und für Windows-Programmierung nimmt man vielleicht besser den kostenlosen MASM. Aber für Dos-Programmierung halte ich TC + TASM für am besten.

    Falls ich demnächst mal wieder in ASM proggen sollte, werde ich wohl auf NASM umsteigen. TASM ist auf Dauer halt doch ne Leiche.



  • Ich werd´s nochmal versuchen, vielleicht hab ich irgendwo einen kleinen Fehler übersehen. Wenns nicht gehen solle werde ich mir mal NASM ansehen, wie weit ist er den TASM ähnlich? Ich weiss nur er achtet auf gross und klein Schreibung. Womit müsste ich dann linken?
    Variablenübergabe über Stack sthet oben schon ein bisschen, aber mehr als 1 Parameter werd ich am Anfang nicht übergeben, das wir ein Pointer auf ein char[] sein.

    thx und mfg
    Noob



  • @Noo:
    Warum nimmst du den ASM-CODE nicht in dein C-Programm mit rein ?
    Mit ASM{
    // Assembler-Befehle
    }

    kannst du die Befehle übernemen und soger Variablen von C in den Assembler-Befehlen benutzen.


Anmelden zum Antworten