Klassen in ASM?
-
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 __ZN13CToolC1EP15ICommDrvP9IDevGuck 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 0010hDer 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.cppfunktionieren.
-
Sry, dass hab ich vergessen zu schreiben. Ich habe VC++ (2008 Express)