I am of course primarily writing this post for myself so that future me will have a reference if he (I?) decides to do something with it again.
Hello World
.assembly helloworld {}
.assembly extern mscorlib {}
.method public static void Main () {
.entrypoint
ldstr "Hello World!"
call void [mscorlib]System.Console::WriteLine(string)
ret
}Including external assemblies
.assembly extern mscorlib {}
Pushing a 32 bit integer constant to the stack
ldc.i4 42
Pushing a 64 bit integer constant to the stack
ldc.i8 829190
Pushing a string constant to the stack
ldstr "Andreas"
Declaring and loading unnamed variables (popping elements off the stack)
.locals init (int32, string) // init specifies that the variables must be initialized to the default types ldc.i4 42 stloc.0 // storing the 32 bit integer at position 0 by popping it off the stack ldstr "CIL" stloc.1
Defining a class
.class MathHelpers extends [mscorlib]System.Object {
.method void .ctor() { // Constructor
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
}
.method public instance int32 Inc(int32) { // Instance method; the instance keyword can be omitted
ldarg.0
ldc.i4.1
add
ret
}
.method public static int32 Add(int32 n, int32 m) { // Static method
ldarg n
ldarg m
add
ret
}
}Invoking methods from external assemblies
.assembly extern mscorlib {}
// ...
ldstr "Writelining"
call void [mscorlib]System.Console::WriteLine(string)Invoking an instance method
.locals init (class MathHelpers mh) newobj instance void MathHelpers::.ctor() stloc mh call instance void MathHelpers::Show()
Invoking a static method
call void MyNamespace.MyClass::StaticMethod()
Using an array
.locals init (string[] names); .ldc.i4.4 // the int32 constant that's used for the size of the array: new string[4] newarr string stloc names // Add element 0 ldloc names ldc.i4.0 // array index ldstr "Dreas" stelem.ref // Add element 1 ldloc names ldc.i4.1 // array index ldstr "John" stelem.ref