Sprungadressen in anderer Klasse
-
Hallo,
ich habe mehrere abgeleitete Klassen, mit jeweils einigen Assembler-Routinen (BCB5):
class a { void fa() {................... asm__ { safa: mov eax,0 ........... ret } ........... asm__ { ............ call safa [i]das geht[/i] }}}
Nun möchte ich aber:
class b : public class a{ void fb() {................... asm__ { ............ call safa [i]das geht nun nicht mehr ???[/i] }}}
oder geht es doch, und ich weiß nur nicht, wie man es adressiert.
MfG
Rudi
-
Hi
erst mal was spuckt den dein compiler für nen fehler aus? oder passiert das erst zur laufzeit?
ich tip momentan auf ersteres. ist ja auch logisch der compiler übersetzt ja datei für datei. wie soll der von dem Sprunglabel in einer anderen datei was wissen? auser man du hast ihm das bekantgemacht. So das der linker das dann zu verbinden hat.
gruss
-
Hallo,
Klar, ist alles noch nicht eindeutig beschrieben.
Also, ich habe das Problem, daß zur Kompilierzeit die Sprungadresse des Calls nicht bekannt ist. Dabei ist mein obiges Beispiel nicht vollständig. Es scheint so, daß Sprungadressen nur innerhalb einer Funktion ( auch bei mehreren asm__{} Teilen bekannt sind. Selbst bei einer 2.Funktion innerhalb der selben Klasse sind alle Sprungadressen aus anderen Funktionen unbekannt.
Gibt es einen Weg, anderen Funktionen, oder gar Klassen, eine Sprungadresse bekanntzumachen ?
Euer guter Rat würde mir das Leben leichter machen.....
Rudi
-
Hallo Ihr da drausen,
seit Ihr alle im Urlaub?
Mir würde es auch schon helfen, wenn jemand sagte: es geht überhaupt nicht. Dann könnte ich mir was neues ausdenkenGruß Rudi
-
bin mir nicht ganz sicher, aber ich glaube gelesen zu haben, das nicht alle Compiler im inline Assembler MFP - calls unterstützen.
Mal davon abgesehn, das Variante zwei so auch nicht gehen sollte, da du this zumindest vorher in ecx packen solltest. Du kannst ja einfach mal normalen C++ Code schreiben und dann beim disasm rausfinden, wie dein Compiler den MFP call umsetzt.
[EDIT]
besser geasgt: du kannst beim Inline asm vermutlich nur zu labels springen, die im gleichen Stackframe liegen. Bei Bsp(1) springst zu einem Label, was in der gleichen Funktion liegt. Bei Bsp. zwei wäre es ein Sprung in ein label, das in einer anderen Klasse (anderer Scope) liegt. Ein globales label sollte aber gehen.
-
Hallo Leute,
ich denk nun sind wieder die meisten vom Urlaub zurück. Vielleicht hat doch noch jemand einen guten Tipp für mich?
Ich hätte auch nichts gegen globale Labels. Aber wie kann ist sowas deklarieren? Über die tieferen Assembler-Features schweigt sich die BCB5-Hilfe ja vollkommen aus.
please,please help me. Rudi
-
versuche mal mit einem :: hinter den Labels. Zumindest bei MASM bedeutet es dass der/das(?) Label "global" ist. Das sollte dann innerhalb einer Quelltextdatei klappen.
Um die Labels zwischen verschiedenen Quelltexten "auszutauschen" benutze am besten das, was ich sonst von C kenne (extern deklarierung von Proceduren). AFAIK geht es auch auf dieselbe Weise mit Variablen und eben Labels.
Wenn man die Quelltextdatei jeweils included, sollte es nur mit den globalen Labels klappen. Du könntest auch einen anderen Weg gehen und die Adressen mittels Variablen austauschen (variable zeigertyp blabla &label). Für mehr reichen leider meine bescheidenen C/C++ Kenntnisse nicht aus