MSIL ist ja bekanntlich die Zwischensprache des .NET Frameworks, das durch die verschiedenen .NET Sprach Compiler erzeugt wird. Dieser Artikel richtet sich an alle "Gurus" die auf moderne Sprachen verzichten wollen und zeigt die Basic Instruktionen der MSIL Sprache auf.
Die Common Language Runtime ist die "CPU" für die MSIL Instruktionen. Dabei sollte erwähnt werden, dass die CLR im Gegensatz zu "normalen" CPU's, die mit Registern und Stacks arbeiten, lediglich nur mit Stacks arbeitet. Das bedeutet, das bei einer Addition von zwei Zahlen, diese in den Stack geladen werden und eine Instruktion aufgerufen wird, die z.B. die beiden Zahlen addiert. Die Instruktion entfernt die beiden Zahlen aus dem Stack und gibt das Ergebnis an die Spitze des Stacks zurück. Der CLR Evolution Stack kann jeglichen Value Typ aufnehmen. Werden Werte aus dem Speicher in den Stack kopiert nennt man das "loading", während das Kopieren von Werten aus dem Stack in den Speicher "storing" genannt wird. Anders als die INTEL-CPU hält der CLR-Stacks nicht die locals, sondern diese befinden sich im Speicher. Die Stacks sind zu den Methoden lokal, welche die Arbeit erledigen und die CLR sichert diese über Methodenaufrufe. Schließlich sind die Stacks auch die Orte, wohin Methoden Rückgabewerte plazieren.
Locals und Parameter
Im unten angezeigten Sample zeige ich wie man Werte in aus dem Speicher in den Stack legen kann. Da ich oben schon erwähnt habe, dass dieser Vorgang "loading" genannt wird, ergibt sich daraus, dass alle Instruktionen, die Werte vom Speicher in den Stack laden mit LD starten. Genauso umgekehrt("storing"): Alle Instruktionen, die Werte aus dem Stack in den Speicher zurückgeben beginnen mit ST. Kommentare werden mit den C++ Doppelslashes eingefügt. Das Keyword .locals und die darauf folgenden () beinhalten eine komplette Liste aller Paramter. Diese werden auch noch mit V_# bezeichnet, wobei # die Indexnummer des Paramters ist. Diese Nummern werden von verschiedenen Instruktionen benutzt. Natürlich werden damit auch Klassen geladen wobei die einzelnen DLL's angegeben werden wo diese Klassen definiert sind:
.locals (class [mscorlib]Microsoft.Win32.RegistryKey V_0, class System.Object V_1, int32 V_2, int32 V_3) |
Sample Hello World
//MSIL Sample1 .assembly Tobi_MSIL{} //Name des Assemblies. Wird benötigt um das Programm auszuführen .method static public void main() il managed //Erzeugen einer C ähnlichen main Methode { .entrypoint //Einstiegspunkt für die EE (Execution Engine). Pro Programm wird eine benötigt .maxstack 1 ldstr "Hallo Welt mit MSIL!" // Laden eines Strings in den Stack call void [mscorlib]System.Console::WriteLine(class System.String)//Aufrufen der System.Console.WriteLine Klasse ret //Zurückgabe an den Aufrufer } |