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.