000
12.08.2005, 14:14 Uhr
~EinCppProgrammierer
Gast
|
Hallo,
ich möchte in einem C++ Builder 3.0 Projekt eine Asm-Datei einbinden, und deren Unterprogramme aus meinem C++ Programm aus aufrufen.
Ich habe bis jetzt nur eine einzige Kombinationen der Aufrufkonventionen gefunden gefunden, bei der die Assemblerfunkion vom Linker überhaupt gefunden wird, und die ist seltsamerweise wenn ich in der .asm Datei als Speichermodell
.model flat, STDCALL
benutze, aber die Prozedur in der .asm Datei mit
PROC C, EXPORT, Parameter1WORD
definiere, also das zuvor festgelegte stdcall explizit umgehe, oder täusche ich mich da???
Ändere ich in der .cpp-Datei die Aufrufkonventionen am Prototypen so, dass er keinen nach "Test" anstatt "_Test" sucht, dann findet er diesen auf keinen Fall, egel welche mir erdenklichen Aufrufkonventionen ich in der .asm Datei einstelle (natürlich nach vorherigem umbenennen von _Test in Test in der .asm-Datei)
Ich wäre ja zufrieden mit dieser meiner Ansicht nach seltsamen Kombination, aber sobald ich den (im unten aufgelisteten Quellcode auskommentierten) zweiten Parameter übergebe liest er mir diese falsch.
die quellcodes meines Projektes sehen so aus:
Die C++ Datei:
C++: |
#pragma hdrstop #include <condefs.h> #include <iostream.h>
//--------------------------------------------------------------------------- USEASM("Unit1.asm"); //--------------------------------------------------------------------------- extern "C" int Test (unsigned long*,/*unsigned long**/); // bewirkt ein weiteres __cdecl überhaupt etwas
#pragma argsused int main(int argc, char **argv) { unsigned long testvar = 654; cout << Test(&testvar/*,&testvar*/); return 0; }
|
Die .ASM Datei:
Code: |
.386 .model flat, STDCALL .data .code
_Test PROC C, EXPORT, Parameter1:DWORD;, Parameter2:DWORD mov eax, [Parameter1] inc eax ret _Test ENDP
PUBLIC _Test end
|
Falls irgend jemand mir helfen kann wäre ich sehr froh.
Vielen, vielen Dank schon mal im Voraus,
EinCppProgrammierer |