Article View: de.comp.lang.c++
Article #1297Re: Frage zu Assembler in C++
From: Fitz Michael
Date: Mon, 15 Jan 1996 22:54
Date: Mon, 15 Jan 1996 22:54
74 lines
3171 bytes
3171 bytes
ILT-Benutzer <user@ilt.fhg.de> wrote:
>Nun muss ich aber auch das ganze umgekehrt haben, d.h. das Assemblermodul
>soll eine C++ Funktion aufrufen.
>Ich habe ausprobiert:
>Im C++ Modul:
>--------------------------------------
>..
>void CProzedur()
>{
> ...
>}
>..
>--------------------------------------
>und im Assemblermodul:
>--------------------------------------
>..
>extrn _CProzedur:far
>..
>..
>call _CProzedur ; die CRoutine aufrufen
>--------------------------------------
>Dieses funktioniert fuer einfache C Module ohne Probleme.
>Sobald ich aber diesen Schalter Options|Compiler|C++options auf
>CPP always stelle (was ich muss) geht's nicht mehr.
>Ich muss also dem Assembler irgendwie mitteilen, dass es sich
>um ein C++ Modul handelt. Hast jemand 'ne Ahnung wie das gemacht wird ?
Hmm, Dein Problem dürfte daran liegen, daß C++ sogenanntes
Name-Mangling macht. Das hat vor allem mit Typerkennung und über-
ladenen Funktionen zu tun. Wenn Du z.B. eine Funktion
int foo(int IntPar) {...}
und eine andere
int foo(char *StringPar) {...}
hast, was ja unter C++ möglich ist, muß der Compiler/Linker wissen, wie er diese
unterscheidet. Wie er das macht, ist in keinem Standard festgelegt - da kocht
jeder Compilerbauer sein eigenes Süppchen. In den meisten Fällern werden
irgendwelche kryptische Zeichen um den eigentlichen Namen herum gruppiert, so
könnte irgendein Compiler aus den beiden "foos" oben machen:
foo@i
sowie
foo@pc
oder sonstwie - wie gesagt, NICHT STANDARDISIERT und der Willkür des
Compilerbauers überlassen.
Wie löst das nun Dein Problem?
Du mußt herausbekommen, wie Dein spezieller Compiler sein Name-Mangling macht.
Die einfachste Möglichkeit ist die, daß Du Dir in C++ eine Dummy-Funktion mit
dem gewünschten Namen, Returntyp und allen gewünschten Parametern schreibst und
- die meisten Compiler können das - Dir daraus eine ASM-Source generieren läßt.
Dann hast Du nicht nur den korrekten gemangleten Namen, sondern quasi als
kostenlose Draufgabe auch alle Standard-Alllocations von Stack, Groups,
Segment-Namen, Prolog, Epilog und was dergleichen mehr ist. In diesen Rumpf
brauchst Du dann nur mehr den Code einbauen, wie Du ihn haben möchtest.
Funktioniert prächtig und vermeidet einige sonst sehr schwer entdeckbare Fehler
(wenn Dein Compiler z.B. return-Werte anders zurückerwartet als der normale
Verstand es annehmen sollte).
In Deinem konkreten Fall würde es allerdings reichen, den korrekten Namen zu
wissen. Dennoch würde ich Dir empfehlen. ASM-Funktionen auf die beschriebene Art
zu generieren und Dir das "extern "C" " zu ersparen. Es könnte umgekehrt auch
hilfreich sein, an Hand einer derartigen Dummy-Source festzustellen, wie Dein
C++ Deine gewünschte CProcedure aufrufen würde.
Technical Details
Message-ID:
<4dem0u$n7v@news.via.at>Path:
arc1-ca.pugleaf.net!news.via.at!usenetReferences:
<4d5mgp$8k0@news.rwth-aachen.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.via.at!usenet From: mfitz@via.at (Fitz Michael) Newsgroups: de.comp.lang.c++ Subject: Re: Frage zu Assembler in C++ Date: Mon, 15 Jan 1996 22:54:36 GMT Organization: Vianet Austria Message-ID: <4dem0u$n7v@news.via.at> References: <4d5mgp$8k0@news.rwth-aachen.de> NNTP-Posting-Host: mfitz.via.at X-Newsreader: Forte Free Agent 1.0.82