externe asm funktionen in c einbinden
-
hallo
habe grad folgendes prob,
ich habe ne library komplett in asm geschrieben, nun moechte ich diese funktionen im c code verwenden (gcc).
allerdings habe ich festgestellt, dass er bei einem unterfunktionsaufruf, der im c code geschrieben wurde, nicht zurueckspringt..meine aufrufkonvention in der asm lib sieht so aus:
pushad
mov ebp, espmov eax, [ebp+36] ; zugriff auf ersten parameter
mov esp, ebp
ret 4 (bei 1 parameter)jetzt compilier ich den c-code, in dem funktionen aufgerufen werden mit obriger aufrufkonvention, mit gcc -c bla.c
weiss jemand inwiefern man bei den aufrufkonventionen sich verhalten muss ?
was ist standard ? also eigentlich sollte doch jeder c compiler den code gleich compilieren doer ? halte ich mich beim standart mit meiner asm lib ?also das problem is dass er scheinbar aus meiner in c geschriebenen unterfunktion nicht zurueckspringt, welche wiederum funktionen aus der asm lib aufruft..
ich denke da speziell an den stackpointer...hat jemand erfahrung mit gemischtem code aus c und asm ?
-
kann mir vielleicht noch jemand nen tipp geben , wie man schnell und effizient mehrere cylinder von diskette mit dem int 13h interrupt einladen kann ?
ich muss doch dann fuer jeden cylinder den int 13h erneut aufrufen oder ? und dabei die offset adresse um 18*512 bytes erhoehen, wobei die sector nummer immer auf 1 bleibt
es sind doch 18 sectoren pro track oder ?mfg
haMmer
-
ubs, da oben im beitrag fehlt natuerlich noch das popad... a
-
Moin, Moin...
C arbeitet mit einer eigener Aufrufkonvention. Die Parameter werden von rechts nach links auf den Stack geschrieben(der letzte Parameter zuerst und der erste Parameter zuletzt). Die Bereinigung des Stacks wird von der rufenden Routine besorgt. Dein Code nimmt die Parameter aber in der gerufenen Routine von Stack. Das ist die Übergabekonvention stdcall. Statt ret 4 nur ret.
Beim Aufruf Deiner Routine:
push Parameter
call DeineFunktion
add esp, 4 ; Beeinigen des StacksAußerdem solltest Du nicht alle Registerinhalte auf den Stack bringen, sondern nur die Register, die Du auch wirklich benötigst. Dazu mag es aber auch andere Meinungen geben.
Ciao...
-
hi...
also so wie ich das verstanden habe, bräuchte ich lediglich das ret 4 oder ret 12 zu ret machen, dann müsste es problemlos laufen (sofern es wirklich an der aufrufkonvention liegt).
ich mag aber das add esp, xxx nich.. kann man den c code nich mit meiner variante compilieren ?
ausserdem, als ich unter windows mit tasm im 32bit modus funktionen aus den dlls aufgerufen habe, musste ich auch nur call Funktion machen, ohne mich um den stack zu kümmern.. d.h. irgendwie muss es also doch so gehen..
ich hab mir gedacht dass man im c compiler vielleicht das einstellen kann ..mfg haMMer
-
Hallo Hammer,
Du hast Recht: die WIN-API-Funktionen arbeiten mit der stdcall-Konvention(die einzige Ausnahme ist wsprintf). Sie erwarten die Parameter von rechts nach links auf dem Stack und die Funktion bereinigt den Stack selber. Das kannst Du mit Deiner Funktion auch machen. Du musst nur darauf achten, dass die Konvention Deiner Assemblerroutine und die Deklaration Deiner Funktion im C-Quelltext übereinstimmen. Wenn Du die Parameter also in der Funktion selber vom Stack nehmen möchtest, dann musst Du dem C-Compiler das auch mitteilen, damit er nach dem Funktionsaufruf kein add esp, xx einfügt. Also deklarierst Du Deine Funktion als stdcall:
int _stdcall DeineFunktion(Parameter, Parameter);
Ciao...
-
geil.. !!
gleich mal testen..
hoert sich gut anjetzt werden mir erst so manche zusammenhaenge klar was die winapi betrifft
thx
@int 13h:
scheinbar muss man wirklich ne schleife machen, die den int 13h so oft aufruft, wieviel cylinder man einladen will..
kann man dann einfach hingehen und den offset immer um 18*512 bytes erhöhen ?
naja beim ersten durchang sinds ja nur 17, wegem bootsector..mfg
haMMer
-
folgender Link hat mir bei so Sachen enorm geholfen
http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
-
huhu..
jo ich weiss, der link is klasse. so weit ich weiss steht da aber nix über stdcall, zumindest nicht mit gcc.
da geht das nämlich so:
extern int Funktion(int bla) __attribute__((stdcall));haMMer