Autor Thema: Asm Funktionen unter C  (Gelesen 7041 mal)

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« am: 10. April 2004, 21:34 »
Moin

Bis jetzt bin ich ja ganz gut mitgekommen, besonders bei TeeJays Tuts. Ich weiß bloß nicht so genau wie man Assemblerfunktionen in C einbindet (Ich versuched die Videospeicher Funktionen aus dem Ressource Center in den PMode Kernel aus TeeJay C Tut einzubauen und weiß jetzt nicht wie ich die Assembler Speicherfunktionen kompillieren muss bzw. wie ich sie über eine C-Headerdatei einbinde)

MfG
<- Verhasst, Verdammt, Vergöttert

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. April 2004, 21:35 »
Sorry ich meinte "versuche" und nicht "versuched"
<- Verhasst, Verdammt, Vergöttert

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #2 am: 10. April 2004, 23:28 »
Du musst die ASM-Datei in denen die ASM Funktionen stehen als Object-Datei compilieren lassen.

Und dann erstellst du einfach eine Headerdatei die einen Prototyp für die ASM Funktion enthält
Beispiel:

void memcpy(void *src,void *dest, unsigned int iBytecount);

Und dann bindest du einfach die Headerdatei in deinen C-Kernel ein und gibst beim Linken auch die Asm-Objekt-Datei mit an
----------------------
Redakteur bei LowLevel

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 11. April 2004, 12:42 »
Und wie soll das gehen?
<- Verhasst, Verdammt, Vergöttert

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. April 2004, 13:29 »
Bessergesagt, dass ich eine Objekt-Datei machen muss, soweit war ich auch schon. Ich weiß bloß nicht wie ich mit NASM Objekt-Dateien compiliere und wie ich die dann mit GCC (DJGPP) beim compilieren einbinden kann.

Ah ja, wie stehts eigentlich um den Floppy Emulator?

MfG
<- Verhasst, Verdammt, Vergöttert

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #5 am: 11. April 2004, 13:38 »
einfach mit nasm -f aout .......... wenn du aout benutzen willst.
die C-Datei natürlich auch ins aout format bringen und dann einfach mit ld linken.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. April 2004, 14:18 »
Ha, ich glaub es funzt
<- Verhasst, Verdammt, Vergöttert

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. April 2004, 10:38 »
So, ich hätte da auf ein Asm-Funktion-in-C Problem (ich hab so viele Probleme...) und zwar wie kann ich in Asm angeben welche Parameter die Funktion braucht und was sie zurückgibt?
kann mir da mal jemand eine
int add(int a, int b) - Funktion oder so als Prototyp schreiben?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #8 am: 13. April 2004, 11:25 »
Soweit ich weiss wird das ganze über den Stack erledigt aber so genau weiss ich das nich.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #9 am: 13. April 2004, 12:43 »
Hi.

Werte werden genrell über eax zurückgegeben. Ob das dann ein Byte, Pointer, int oder sonstwas ist, muss dein Programm dann entscheiden.

Wenn du mit der FPU arbeitest wird es int fp0? zurückgegeben.

Allerdings weiß ich jetzt nicht genau wie es ist wenn du eine ganze Struktur oder sogar eine Klasse zurückgibst.

Da in dieser Hinsicht wohl noch lernbedarf besteht (ich kenn da auch nicht alles) werd ich mir mal eine gute Seite raussuchen und daraus ein kleines Tut zusammenbauen.

Das kann dann ja im Rahmen der (hoffentlich bald entstehenden) ASM-TUT Reihe geschehen
----------------------
Redakteur bei LowLevel

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. April 2004, 16:10 »
Schau Dir mal den Artikel über Kernelprogrammierung in C an. Da stand glaub ich was über die Art und Weise wie C Parameter haben will. Ich glaub der letzte wird als erster auf den Stack geschrieben, dann der vorletzte usw.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #11 am: 13. April 2004, 16:27 »
Ja das hatte ich da im sehr kurzen beschrieben. Ich werde dazu im Rahmen der gerade laufenden ASM Tut Reihe nochmal ausführlicher berichten.
----------------------
Redakteur bei LowLevel

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #12 am: 25. April 2004, 19:37 »
Wie ist das eigentlich mit dem 32 BIT Stack
ist es völlig egal wie Gross der Wert ist denn ich auf den Stack pushe wird der Stackpointer immer um 4 Bytes bewegt
thx schon ma im vorraus
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #13 am: 25. April 2004, 19:44 »
Japp. Der Stackpointer wird immer um ein vielfaches von 32 Bit bewegt.
----------------------
Redakteur bei LowLevel

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #14 am: 25. April 2004, 21:55 »
Bei mir erhöht er sich auch um 2 Byte, wenn ich nur AX pushe! (Hab ich unter Delphi getestet)
Warum?????

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #15 am: 25. April 2004, 23:01 »
Ja das er sich immer um 32 Bit erhöht, damit hab ich gemeint das ein 32 Bit Compiler (soweit ich weiß) immer 32 Bit Werte auf den Stack pusht.

Wenn du natürlich von hand nur einen 16 Bit Wert pushst, dann erhöht sich der Stackpointer eben auch nur um 2 Bytes.

Siehe Funktion memset (MSDN).
Die funktion macht eigentlich nix anders als einen Bereich im Speicher mit einem bestimmten Wert zu beschreiben. Und obwohl der Wert byteweiße geschrieben wird, verlangt die Funktion das du ihr einen Int-Wert und nicht etwa einen Bytewert übergibst.
----------------------
Redakteur bei LowLevel

 

Einloggen