Laden...

Assemblercode in C# einbinden

Erstellt von Vellas vor 20 Jahren Letzter Beitrag vor 20 Jahren 12.547 Views
V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren
Assemblercode in C# einbinden

Hallo!
Weiß jemand wie ich Assemblercode in C# einbinden kann? Also direkt in den C#-Code integrieren? Kennt jemand den/die Befehl/e dafür?

Code-Hacker

2.217 Beiträge seit 2003
vor 20 Jahren

mhh leider nein, aber ich schau mal ob ich was finde
(oder such doch mal bei msdn)

Viele Grüße
Alexander

V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Ich hatte ja die Library dabei, hatte da irgendwas gefunden, weiß aber nicht ob es das richtige ist. Sah mir nicht so danach aus. Da ich erst Donnerstag wieder zuhause bin weiß ich den Befehl leider nicht mehr.

Code-Hacker

2.217 Beiträge seit 2003
vor 20 Jahren

mhh hab bis jetzt noch nix gefunden, aber geb mir zeit 😁

Viele Grüße
Alexander

P
939 Beiträge seit 2003
vor 20 Jahren

Wie soll das denn gehen, nativen Assemblercode? Oder meinst du IL-Code? Selbst den kann man nicht direkt in eine C# Quellcode-Datei schreiben. Du kannst aber IL Quellcode mit ilasm.exe compilieren.

V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Also ich meinte so einbinden wie in C++. Was ist IL-Code???

Code-Hacker

P
939 Beiträge seit 2003
vor 20 Jahren

Es gibt kein Assembler in .Net, sondern nur Metadaten und IL - Intermediate Language - die Zwischensprache, in die alle .Net-Sprachen übersetzt werden. Das ist auch der Grund, warum es egal ist, in welcher Sprache man programmiert. Alles wird in IL übersetzt und zur Laufzeit in Maschinencode JIT compiliert.

Jede Assembly wird beim Laden auf ihre Standard-Konformität und Korrektheit überprüft. Wird nicht konformer IL Code gefunden, kann die Assembly nicht ausgeführt werden. Wenn die Assembly direkt Maschinencode enthalten würde, könnte diese Überprüfung nicht stattfinden.

U.a deshalb kannst du keinen Assemblercode in .Net benutzen. IL Quellcode kannst du auch nicht direkt in C# Code verwenden. Da bin ich mir aber nicht ganz sicher.

P
939 Beiträge seit 2003
vor 20 Jahren

Na eigentlich bin ich mir doch sicher. Es müsste ein Schlüsselwort zum Einfügen von IL existieren. Gibt es aber nicht.

V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Ich habe eben gesehen das man in C nur die Module einbinden kann über extern. Das hatte ich übersehen, also das extern. Die haben nämlich den Code direkt unter das Programm gepackt.
Oder soll ich das für C# (und .NET allgemein) jetzt so verstehen das das auch nicht geht? Wäre sehr schade, weil ich besonders Assemblercode immer gerne versuche zu optimieren und damit könnte man wesentlich schneller diverse Berechnungen oder so durchführen.

Code-Hacker

P
939 Beiträge seit 2003
vor 20 Jahren

Nur DLLs über P/Invoke soweit ich weiss, also keine Libs oder so. Du musst aufpassen, dass nicht oder wenig gemarshalt wird, sonst geht dir deine ganze Assembler-Optimierung da schon wieder flöten 😉

In der Hilfe steht ein bisschen was zu blit-fähigen Typen und >Fixieren statt Kopieren>.

Frag aber mal lieber jemanden, der C++.Net programmiert, ich glaube Maroi oder VizOne z.B., die wissen bestimmt genaueres.

V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Ich werde im 4. Sem. eh noch C++ lernen. Deswegen habe ich beschlossen mir einen neueren C++ Builder zu holen und werde erstmal meine Original Version vom einfachen C++ Builder benutzen. und C++ weiter zu lernen. Nebenbei weiß ich ja schon wie man Assembler einbindet, was wir dann ja auch machen. Ist zwar etwas Schade weil mir C# an sich wirklich gut gefällt, aber so bleibe bzw. gehe ich dann doch lieber wieder in Richtung C++. Was jetzt nicht heißt das ich C# nicht mehr programmieren werde, ganz im Gegenteil, das wird sich nicht ändern. Ist zwar etwas Schade drum doch was soll´s...

Code-Hacker

H
704 Beiträge seit 2003
vor 20 Jahren

_Original von Code-Hacker _
Ich werde im 4. Sem. eh noch C++ lernen. Deswegen habe ich beschlossen mir einen neueren C++ Builder zu holen und werde erstmal meine Original Version vom einfachen C++ Builder benutzen. und C++ weiter zu lernen. Nebenbei weiß ich ja schon wie man Assembler einbindet, was wir dann ja auch machen. Ist zwar etwas Schade weil mir C# an sich wirklich gut gefällt, aber so bleibe bzw. gehe ich dann doch lieber wieder in Richtung C++. Was jetzt nicht heißt das ich C# nicht mehr programmieren werde, ganz im Gegenteil, das wird sich nicht ändern. Ist zwar etwas Schade drum doch was soll´s...

heutige Compiler generieren schon von Haus aus, sehr guten Code
Was willst du da noch mit Assembler machen
Interruptsaufrufe funktionieren eh nicht; das einzige was ich mit vorstellen kölnnte wären Optimierungen, aber das machen die Compiler eh schon von selbst

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Naja, ich programmiere gerne Assembler. Solange ich damit keine Windowsanwendungen proggen kann mache ich Berechnungen, Stringverarbeitungen und solche Sachen. Nebenbei kann ich meine Funktionen so anpassen wie ich sie gerne hätte.
Das die Compiler gut oder sehr gut sind stelle ich damit ja auch gar nicht in Frage nur ich mag Assembler, bleibe in der Übung und habe noch mehr spass am proggen.
Ich werde mit Sicherheit auch nicht alle Programme mit Assembler schreiben, gerade deswegen werde ich C# ja weiter programmieren und auch weil ich damit ja ASP.NET progge bzw. proggen möchte.
Was die Interrupts angeht so ist das nicht richtig. Das geht sehr wohl. Ich habe in meinem Buch ein Beispiel in dem wird ein Assembler-Modul in ein C-Programm eingebunden. In dem Assemblercode befindet sich auch ein Interruptaufruf.

Code-Hacker

P
939 Beiträge seit 2003
vor 20 Jahren

Was studierst du denn? Ich habe Informatik studiert. Da werden keine konkreten Programmiersprachen gelehrt. Die muss man schon können oder sich nebenbei aneignen.

V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Ich bin Berufsfachschüler und mache meinen technischen Assistenten für Informatik, müsste auch im Profil stehen. Wir lernen in den Verschiedenen Semester auch Programmiersprachen. In den ersten beiden als Einführung TP. Hier kannst du dir den Lehrplan ansehen, dau musst du das PDF >Informatik-Assistenten (Vorlesungsplan)> anklicken.
Was hast du denn genau studiert? Ich kenne bei uns keinen Studiengang wo die nicht das Programmieren beigebracht bekommen anhand von konkreten Sprachen (sprich noch etwas ausfühlicher als ich es im Moment lerne). Kannst dir hier ja mal die Infos zu den Informatikstudiengängen ansehen. Natürlich kommt es bei Unis darauf an worauf man sich spezialisiert. Aber Programmieren in TP gehört bei uns zur Grundausbildung...

Code-Hacker

H
704 Beiträge seit 2003
vor 20 Jahren

_Original von Code-Hacker _

Was die Interrupts angeht so ist das nicht richtig. Das geht sehr wohl. Ich habe in meinem Buch ein Beispiel in dem wird ein Assembler-Modul in ein C-Programm eingebunden. In dem Assemblercode befindet sich auch ein Interruptaufruf.

das würde nur unter Windows 9x funktionieren
Windows NT/2k/XP gestatten keine direkten Interruptsaufrufe
probiers

dann kommt dann eine Fehlermeldung

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
2.217 Beiträge seit 2003
vor 20 Jahren

mhhhhhh @ hauptmann klappts jetzt bei dir?

Viele Grüße
Alexander

H
704 Beiträge seit 2003
vor 20 Jahren

_Original von alexander _
mhhhhhh @ hauptmann klappts jetzt bei dir?

was denn? Ç
ich habe Windows 2000, und habe das mit den Interrupts schon ausprobiert(in C++ )

die einzige Möglichkeit Interrupts auch in WinNT/2k/XP zu verwenden ist, das Programm mit einem DOS Assembler zu compilieren
dann funktioniert es

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Hallo!

Ich habe hier eine Seite gefunden in der Beschrieben ist wie Assembler in C# funktioniert.

Code-Hacker

P
939 Beiträge seit 2003
vor 20 Jahren

Genau das meinte ich mit PInvoke. Man definiert externe Methoden und gibt ihre DLL-Einsprungspunkte über DllImport-Attribute an.

Das Problem ist nur, dass dabei, wenn man nicht aufpasst, böse gemarshalt wird. Dadurch geht der Geschwindigkeitsvorteil durch die Assembleroptimierung gleich wieder verloren. Man muss darauf achten, dass man nur blit-fähige Typen verwendet und dass die Daten im Heap gepinnt werden.

Das steht auch alles in der .Net-Doku.

H
704 Beiträge seit 2003
vor 20 Jahren

_Original von Code-Hacker _
kann mache ich Berechnungen, Stringverarbeitungen und solche Sachen. Nebenbei kann ich meine Funktionen so anpassen wie ich sie gerne hätte.

Berechnungen: #include<math>
String: #include <string>
die Standardlib von C++ bietet dir eigentlich alles schon

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
V
Vellas Themenstarter:in
842 Beiträge seit 2003
vor 20 Jahren

Jo ist klar. Nur wie gesagt, ich mache es da mir Assembler spass macht. Ich habe gestern in Linux festgestellt das man bei Inline-assembler div nicht benutzen kann, nach mehreren versuchen ist dann Kylix abgestürzt. Gilt das für alle mathematischen Operationen?

EDIT: Hat sich erledigt. Hab gesehen das als einziger Rechenbefehl nur ADD geht. Ansonsten geht das von der Anzahl Befehle.

Code-Hacker