Assembler-Code in C# einfügen



  • Hi Leute,

    weiß jemand, wie man Assembler-Code in C# einfügt und wie man damit dann auch arbeiten kann.
    Ich möchte mit "cpuid" die Features meines Prozessors abfragen. Wenn das auch ohne Assembler geht, dann könnt ihr mir das auch gerne schreiben.

    Als Entwicklungsumgebung habe ich MS Visual Studio Express 2005.

    Danke schonmal.



  • Vielleicht hilft dir das weiter: http://www.codeproject.com/csharp/unmanage.asp





  • 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