c und asm mischen?
-
hi,
also soviel weiß ich bis jetzt:
// datei: kernel.c //////////////////// extern void neustart(); int main() { neustart(); } // datei: startup.asm ///////////////// BITS 16 jmp start GLOABAL _neustart EXTERN _main start: jmp _main _neustart: db 0EAh dw 0000h dw 0FFFFh
aber wie kann ich der funktion etwas übergeben? bzw. wie bekomm ich diesen wert dann in asm?
MFG BlockBuster
-
Ist noch gar nicht so lange her... asm und c <mynona>
hoffe, das hilft dir ebenso
-
naja ebenso geholfen mhhh klingt gut aber ich hab nix verstanden
mein englisch is ebend zum kotzen+
-
Mich würde nur interessieren ob hier jemand einen Compiler kennt der unter Linux läuft, der als Assembler die Intel Syntax verwendet ?
Soweit ich weiss nutzt der gcc den assembler (as), aber ich kann mich nicht so richtig an die AT&T Syntax gewöhnen. Mir liegt die Intel Syntax da viel näher, deshalb auch die Frage nach einem C Compiler der die Intel Syntax für Assembler beherscht.
mfg
-
Original erstellt von ciever2k:
**Mich würde nur interessieren ob hier jemand einen Compiler kennt der unter Linux läuft, der als Assembler die Intel Syntax verwendet ?Soweit ich weiss nutzt der gcc den assembler (as), aber ich kann mich nicht so richtig an die AT&T Syntax gewöhnen. Mir liegt die Intel Syntax da viel näher, deshalb auch die Frage nach einem C Compiler der die Intel Syntax für Assembler beherscht.
mfg**
NASM!
Nachtrag: Mist. Achso, du willst einen C-Compiler, der die Intel-Syntax in seinem Inline-Assembler beherrt, verstehe ich das richtig?
[ Dieser Beitrag wurde am 11.07.2002 um 17:10 Uhr von chrizel editiert. ]
-
Genau, sorry ich sehe grad selber das ich das ein bisschen falsch formuliert hatte, sorry.
Aber deine Auffassung ist richtig.
Ein C-Compiler der als Inline Assembler halt die Intel Syntax verwendet, am besten unter Linux. Unter Dos oder so gibt es ja glaub ich djgpp oder borland etc.
mfg
-
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.