I have the following C# code.
public void HelloWorld()
{
Add(2, 2);
}
public void Add(int a, int b)
{
//Do something
}
It produces the following CIL
.method public hidebysig instance void HelloWorld() cil managed
{
// Code size 11 (0xb)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.2
IL_0003: ldc.i4.2
IL_0004: call instance void ConsoleApplication3.Program::Add(int32,
int32)
IL_0009: nop
IL_000a: ret
} // end of method Program::HelloWorld
Now, what I don't understand is the line at offset 0001:
ldarg.0
I know what that opcode is for, but I don't really understand why it's being used in this method, as there are no arguments, right?
Does someone know why? :)
I think that the ldarg.0
is loading this
onto the stack. See this answer
MSIL Question (Basic)
The line at offset 0001: Loads the argument at index 0 onto the evaluation stack.
See more in: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldarg_0.aspx
The argument at index 0 is the
instance
of theclass
that contains the methodsHelloWorld
andAdd
, as this (or self in other languajes)
IL_0001: ldarg.0 //Loads the argument at index 0 onto the evaluation stack.
IL_0002: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack.
IL_0003: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack.
IL_0004: call instance void ConsoleApplication3.Program::Add(int32, int32)
...this last line is as call: this.Add(2,2);
in C#.
In instance methods there is an implicit argument with index 0, representing the instance on which the method is invoked. It can be loaded on the IL evaluation stack using ldarg.0
opcode.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With