Assembler-Code in C# einfügen





  • Sorry, dass ich mich jetzt erst melde.

    Ich wollte das mal ausprobieren mit dem unmanaged code in C, hat aber nicht so wirklich geklappt.

    Hier mal der Codeausschnitt

    Die cpuid.cpp-Datei

    // Dies ist die Haupt-DLL.
    
    #include "stdafx.h"
    
    #include "cpuid.h"
    

    Die cpuid.h-Datei

    // cpuid.h
    
    #pragma once
    
    using namespace System;
    
    namespace cpuid
    {
    	// TODO: Die Methoden für diese Klasse hier hinzufügen.
    	public ref class Class1
    	{
    		static char pszCPUType[13];
    
    		_asm {
    			mov eax, 0
    			cpuid
    
    			 getting information from EBX
    			mov pszCPUType[0], bl
    			mov pszCPUType[1], bh
    
    			ror  ebx, 16
    			mov	pszCPUType[2], bl
    			mov pszCPUType[3], bh
    
    			 getting information from EDX
    			mov pszCPUType[4], dl
    			mov pszCPUType[5], dh
    
    			ror  edx, 16
    			mov pszCPUType[6], dl
    			mov pszCPUType[7], dh
    
    			 getting information from ECX
    			mov pszCPUType[8], cl
    			mov pszCPUType[9], ch
    
    			ror  ecx, 16
    			mov pszCPUType[10], cl
    			mov pszCPUType[11], ch
    		}
    
    		pszCPUType[12] = '0';
    
    		return pszCPUType;
    	};
    }
    

    da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.

    Kompilieren...
    cpuid.cpp
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : error C2061: Syntaxfehler: Bezeichner 'pszCPUType'
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : warning C4183: 'memset': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(15) : error C2059: Syntaxfehler: '__asm'
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(15) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(44) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(44) : error C3845: "cpuid::Class1::pszCPUType": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(46) : error C2059: Syntaxfehler: 'return'
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(46) : error C2238: Unerwartete(s) Token vor ';'
    c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(12) : error C4368: "pszCPUType" kann nicht als Member von "cpuid::Class1" (verwaltet) definiert werden: Gemischte Typen werden nicht unterstützt.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Ringostarr\Eigene Dateien\Visual Studio 2005\Projects\cpuid\cpuid\Debug\BuildLog.htm" gespeichert.
    cpuid - 9 Fehler, 1 Warnung(en)

    Wäre schön, wenn mir da jemand weiterhelfen könnte.



  • Ist dir aufgefallen, dass du gar keine funktionen definiert hast?
    Du tust den assembler code einfach in die klasse reinschreiben.



  • Hmm ich kenn mich in Assembler nicht aus, aber Dir ist schon bewusst dass

    char
    

    ein UTF16 char und somit 2 Byte lang ist?
    Dafür gibt es Byte als Datentyp.



  • Entweder ich steh auf dem Schlauch, oder das sieht sowas von gar nicht nach C# aus, scheint wohl C++ zu sein...

    Edit:

    Ringostarr schrieb:

    da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.

    Da haben wirs 😃



  • Badestrand schrieb:

    Entweder ich steh auf dem Schlauch, oder das sieht sowas von gar nicht nach C# aus, scheint wohl C++ zu sein...

    Edit:

    Ringostarr schrieb:

    da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.

    Da haben wirs 😃

    Jo, dann lies mal die Überschrift.



  • @Ringostarr:
    Bitte definiere doch zunächst mal, mit welcher Sprache Du arbeitest.



  • SeboStone schrieb:

    Jo, dann lies mal die Überschrift.

    Lies doch selber die Überschrift 🙄

    Wenn es C++ sein soll, dann kompiliert deine Lösung bei mir, nur dass der Code natürlich in eine Funktion gehört und nicht in eine Klasse (wie Dennis123 schon meinte).



  • @Dennis123: Ja, tut mir leid, ist mir gar nicht aufgefallen, ich hatte den Code einfach so kopiert und mir nichts weiter dabei gedacht 😉

    @pub00515: Ähm, Das mit dem char ist auch nur aus dem Codebeispiel von http://www.codeproject.com/csharp/unmanage.asp (Program 7) übernommen.

    @Badestrand: Dass das C++ Code ist, weiß ich ja, ich will aber Assembler-Code ausführen und das geht meines wissens nach nicht in C#, deshalb der Umweg über C++ und dann mit der DLL-Datei verlinken.

    @LordJaxom: eigentlich arbeite ich mit der Sprache C#, aber wie oben schon beschrieben, der Umweg über C++.

    Ich hab mal noch ein bisschen rumgedoktort und bin jetzt bei folgendem C++ Code, der zu einer DLL-Datei kompiliert wird

    #pragma once
    
    using namespace System;
    
    namespace cpuid
    {
    	public class Class1
    	{
    		Class1();
    		char* cpuid2();
    	}
    
    	Class1();
    
    	char* Class1::cpuid2()
    	{
    		static char pszCPUType[13];
    		memset(pszCPUType, 0, 13);
    
    		_asm {
    			mov eax, 0
    			cpuid
    
    			// getting information from EBX
    			mov pszCPUType[0], bl
    			mov pszCPUType[1], bh
    .........
    .........
    		}
    
    		pszCPUType[12] = '0';
    
    		//return pszCPUType;
    	};
    }
    

    Die DLL binde ich dann in mein C# Programm ein, aber ich kann die Funktion nicht aufrufen. Was mache ich noch falsch?



  • Hast du angegeben, dass die Klasse/Funktion exportiert werden soll? Und eine Lib-Datei musst du glaubich auch erstellen.
    Du kannst die DLL auch mit nem Editor öffnen und gucken, ob du (mit Strg+F) den String "cpuid" findest (ohne "@+'äöamsd" oder so danach). Wenn nicht, ist die Funktion in den DLL nicht drin.



  • Kompiliere die DLL als COM-DLL (ATL Projekt) und setze in C# einen Verweis darauf, dann wird die lib Datei automatisch erstellt und Du kannst sehr einfach auf Deine Funktionen zugreifen.



  • Hat beides leider auch nicht funktioniert, aber er meckert jetzt, dass er den Einstiegspunkt in der DLL nicht finden kann.


Anmelden zum Antworten