Klassen in ASM?



  • mir geht es ja darum die Funktion/Methode ISpVoice::Speak() in Asm zu verwenden nur wie komme ich die Funktion bzw. an die anderen verwendeten(ISpVoice::Release(), ...) ran 😕 Die müssen ja auch iwo in einer dll oder so sein!?



  • So wie das aussieht, wird ISpVoic wahrscheinlich letztendlich nicht mehr als eine Datenstruktur mit ein paar Pointern und Flags sein, die durch CoCreateInstance initialisiert wird. Die Adressen der Funktionen Speak und Release, etc stehen dann wahrscheinlich also an bestimmten Offsets in dieser Datenstruktur - darueber kannst du sie dann also aufrufen.
    Aber wie gesagt: Um Konkreteres darueber zu erfahren, schau dich weiter in den Referenzen um!



  • nooooooob schrieb:

    Das würde ich ja gerne aber dazu braucht man die ATL und die is in der Express Edition nicht dabei.

    im debugger alt+8 und du solltest theoretisch den assembler unterm c++ code sehen. mit alt+tab bist du zurueck im c++ source.



  • Lern High Level ASM, hat zwar nicht mehr wirklich was mit ASM zu tun, jedoch hat das auch Klassen 😃



  • Alternativ: schreib dir einen kleinen C-Wrapper um diese Methoden und benutze, dann diese C-Methoden im ASM-Code.



  • Mach das doch mit Q-Basic !



  • Nur wie kann ich den Teil mit den Klassen umsetzen. Des muss C++ doch auch iwie in Assembler umwandeln!?
    Code:
    ISpVoice * pVoice = NULL;
    pVoice->Release();
    pVoice = NULL;

    Das muss man nicht nach Assembler umwandeln, der Code, so wie er da steht, hantiert mit Null-Pointern und das Programm macht garantiert einen Seg-Fault o.ä. Oder sehe ich es wieder falsch?



  • dieses Programm schon, aber dazwischen passiert, wie man in dem Link sieht (erster Post), auch noch etwas mit pVoice.



  • Hallo nooooooob,

    ich war ein wenig neugierig und da ich grade ein Paar c++ Sachen kompiliert habe, mit g++ übrigens, wollte ich mal Assembler-Code generieren lassen mit Option -S. Hier ein kurzer Ausschnitt:

    movl	$-1, -9784(%ebp)
    	call	__ZN10CAppDev12mGetInstanceEv
    	movl	%eax, -9796(%ebp)
    	call	__ZN9CDrv12mGetInstanceEv
    	movl	-9796(%ebp), %edx
    	movl	%edx, 8(%esp)
    	movl	%eax, 4(%esp)
    	leal	-9736(%ebp), %eax
    	movl	%eax, (%esp)
    	call	__ZN13CToolC1EP15ICommDrvP9IDev
    

    Guck mal wie es aussieht, total kryptisch, und es sind bloss ein Paar Aufrufe wie:

    pDev = CAppDev::mGetInstance();
    pDrv = CDrv::mGetInstance();
    

    Und was die untere Zeile "CToolC1EP15ICommDrvP9IDev" ist, weiss ich jetzt auf die Schnelle nicht - vermutlich irgendein Konstruktor.
    Schlussfolgerung aus dem Ganzen: Lass es sein, dein Vorhaben ist total sinnlos...



  • Ich schrieb es zwar bereits, aber moechte nochmal betonen, dass oop sehr abstrakt ist. Deshalb denke ich schon, dass man die Programmierung dieser API in Assembler bei Weitem nicht so kompliziert wie dein C++-Compiler anzugehen braucht.
    Aber ansonsten stimme ich dir natuerlich zu: Die Herangehensweise allein ueber diesen Code ist ziemlich sinnlos.



  • Hab's jetzt auch gemerkt ➡ Nur übersetzen ist Schwachsinn.

    Hab jetzt mit C++ auch ohne AtlBase & Co zum laufen gebracht und das DisAssembly sieht folgendermaßen aus:

    SUB_L00401000:
      		push	ecx
      		push	00000000h
      		mov	dword ptr [esp+04h],00000000h
      		call	[ole32.dll!CoInitialize]
      		test	eax,eax
      		jge	L0040102F
      		push	00000040h
      		push	L00402D04
      		push	SSZ00402D08_False
      		push	00000000h
      		call	[USER32.dll!MessageBoxA]
      		xor	eax,eax
      		pop	ecx
      		retn	0010h
    ;------------------------------------------------------------------------------
     L0040102F:
      		lea	eax,[esp]
      		push	eax
      		push	L0040229C
      		push	00000017h
      		push	00000000h
      		push	L0040279C
      		call	[ole32.dll!CoCreateInstance]
      		test	eax,eax
      		jl 	L00401071
      		mov	eax,[esp]
      		mov	ecx,[eax]
      		mov	edx,[ecx+50h]
      		push	00000000h
      		push	00000000h
      		push	SWC00402D10_Hallo_Welt
      		push	eax
      		call	edx
      		mov	eax,[esp]
      		mov	ecx,[eax]
      		mov	edx,[ecx+08h]
      		push	eax
      		call	edx
      		mov	dword ptr [esp],00000000h
     L00401071:
      		call	[ole32.dll!CoUninitialize]
      		mov	eax,00000001h
      		pop	ecx
      		retn	0010h
    

    Der Code geht ja noch aber die zig-KB-großen Strukturen die da an CoCreateInstance übergeben werden 😮 . Ich schreibs besser in C++.

    Ach was ich noch fragen wollte wie kann ich mit C++ eine OBJ-Datei erzeugen, die ich dann in Asm einbinden kann?

    Und danke noch für die ganzen hilfreichen Antworten! 🙂



  • nooooooooob schrieb:

    Ach was ich noch fragen wollte wie kann ich mit C++ eine OBJ-Datei erzeugen, die ich dann in Asm einbinden kann?
    Und danke noch für die ganzen hilfreichen Antworten! 🙂

    Das hängt ganz von deinem Compiler ab...beim g++ müsste es - hau mich, wenn ich falsch liege und guck selbst in die man-page - mit g++ -c filename.cpp funktionieren.



  • Sry, dass hab ich vergessen zu schreiben. Ich habe VC++ (2008 Express)


Anmelden zum Antworten