411 REFERENCE · Wikibooks
Common Intermediate Language/Stack
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
Load
ldarg <uint16> Load an argument at a given position and push it onto the stack.
.method int32 Add(int32, int32)
{
ldarg 0 // 2
ldarg 1 // 4
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldarg.s <uint8> Load an argument at a given position and push it onto the stack. This takes up less space in bytecode compared to ldarg.
.method int32 Add(int32, int32)
{
ldarg.s 0 // 2
ldarg.s 1 // 4
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldarg.0 - ldarg.3 Load an argument at a given position and push it onto the stack.
.method int32 Add(int32, int32)
{
ldarg.s.0 // 2
ldarg.s.1 // 4
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldarga <uint16> Load the address of an argument at a given position and push it onto the stack.
.method int32 Add(int32, int32)
{
ldarga 0
ldarga 1
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldarga.s <uint8> Load the address of an argument at a given position and push it onto the stack. This takes up less space in bytecode compared to ldarga.
.method int32 Add(int32, int32)
{
ldarga.s 0
ldarga.s 1
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldc.i4 <int32> Load a 32-bit (4-byte) integer and push it onto the stack.
.method int32 Add(int32, int32)
{
ldarg 0
ldarg 1
add
ret
}
ldc.i4 2
ldc.i4 4
call int32 Add(int32, int32)
ldc.i4.s <int8> Load an 8-bit (1-byte) integer and push it onto the stack as 32-bit. This takes up less space in bytecode compared to ldc.i4.
.method int32 Add(int32, int32)
{
ldarg 0
ldarg 1
add
ret
}
ldc.i4.s 2
ldc.i4.s 4
call int32 Add(int32, int32)
ldc.i4.0 - ldc.i4.8 Load a 32-bit (4-byte) integer and push it onto the stack.
.method int32 Add(int32, int32)
{
ldarg 0
ldarg 1
add
ret
}
ldc.i4.2
ldc.i4.4
call int32 Add(int32, int32)
ldc.i4.m1 / ldc.i4.M1 Load -1 and push it onto the stack as 32-bit.
.method int32 Add(int32, int32)
{
ldarg 0
ldarg 1
add
ret
}
ldc.i4.m1
ldc.i4.M1
call int32 Add(int32, int32)
ldc.i8 <int64> Load a 64-bit (8-byte) integer and push it onto the stack.
.method int64 Add(int64, int64)
{
ldarg 0
ldarg 1
add
ret
}
ldc.i8 2
ldc.i8 4
call int64 Add(int64, int64)
ldc.r4 <float32> Load a 32-bit (4-byte) float and push it onto the stack.
.method float32 Add(float32, float32)
{
ldarg 0
ldarg 1
add
ret
}
ldc.r4 2.5
ldc.r4 4.5
call float32 Add(float32, float32)
ldc.r8 <float64> Load a 64-bit (8-byte) float and push it onto the stack.
.method float64 Add(float64, float64)
{
ldarg 0
ldarg 1
add
ret
}
ldc.r8 2.5
ldc.r8 4.5
call float64 Add(float64, float64)
ldelem <type> Load an element in an array and push it onto the stack.
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem int32
ldelem <type> Load an element in an array and push it onto the stack.
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem int32
ldelem.i Load an element in an array as a native int and push it onto the stack.
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.i
ldelem.i1 Load an element in an array as an int8 and push it onto the stack as an int32.
// (int32) MyClass.MyArray[5]
ldfld int8[] MyClass::MyArray
ldc.i4 5
ldelem.i1
ldelem.i2 Load an element in an array as an int16 and push it onto the stack as an int32.
// (int32) MyClass.MyArray[5]
ldfld int16[] MyClass::MyArray
ldc.i4 5
ldelem.i2
ldelem.i4 Load an element in an array as an int32 and push it onto the stack.
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.i4
ldelem.i8 Load an element in an array as an int64 and push it onto the stack.
// MyClass.MyArray[5]
ldfld int64[] MyClass::MyArray
ldc.i4 5
ldelem.i8
ldelem.r4 Load an element in an array as a float32 and push it onto the stack.
// MyClass.MyArray[5]
ldfld float32[] MyClass::MyArray
ldc.i4 5
ldelem.f4
ldelem.r8 Load an element in an array as a float64 and push it onto the stack.
// MyClass.MyArray[5]
ldfld float64[] MyClass::MyArray
ldc.i4 5
ldelem.f8
ldelem.ref Load an element in an array and push it onto the stack as an object.
// (object) MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.ref
ldelem.u1 Load an element in an array as a uint8 and push it onto the stack as an int32.
// (int32) MyClass.MyArray[5]
ldfld unsigned int8[] MyClass::MyArray
ldc.i4 5
ldelem.u1
ldelem.u2 Load an element in an array as a uint16 and push it onto the stack as an int32.
// (int32) MyClass.MyArray[5]
ldfld unsigned int16[] MyClass::MyArray
ldc.i4 5
ldelem.u2
ldelem.u4 Load an element in an array as a uint32 and push it onto the stack as an int32.
// (int32) MyClass.MyArray[5]
ldfld unsigned int32[] MyClass::MyArray
ldc.i4 5
ldelem.u4
ldelem.u8 Load an element in an array as a uint64 and push it onto the stack as an int64.
// (int64) MyClass.MyArray[5]
ldfld unsigned int64[] MyClass::MyArray
ldc.i4 5
ldelem.u8
ldelema <type> Load the address of an element as a <type> in an array and push it onto the stack.
// (managed pointer) MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelema int32
ldfld <type> <field> Load a field's value, which is a <type>, and push it onto the stack.
ldfld int32 MyClass::MyField
ldflda <type> <field> Load the address of a field, which is a <type>, and push it onto the stack.
ldflda int32 MyClass::MyField
ldflda <type> <field> Load the address of a field, which is a <type>, and push it onto the stack.
ldflda int32 MyClass::MyField
ldftn <type> <method> Load a pointer to a method, which returns <type>, referenced by <method> and push it onto the stack.
ldftn int32 MyClass::MyMethod()
ldind.i Load a native int at an address and push it onto the stack.
ldarga 0
ldind.i
ldind.i1 Load an int8 at an address and push it onto the stack as an int32.
ldarga 0
ldind.i1
ldind.i2 Load an int16 at an address and push it onto the stack as an int32.
ldarga 0
ldind.i2
ldind.i4 Load an int32 at an address and push it onto the stack.
ldarga 0
ldind.i4
ldind.i8 Load an int64 at an address and push it onto the stack.
ldarga 0
ldind.i8
ldind.r4 Load an float32 at an address and push it onto the stack.
ldarga 0
ldind.r4
ldind.r8 Load an float64 at an address and push it onto the stack.
ldarga 0
ldind.r8
ldind.u1 Load an unsigned int8 at an address and push it onto the stack as an int32.
ldarga 0
ldind.u1
ldind.u2 Load an unsigned int16 at an address and push it onto the stack as an int32.
ldarga 0
ldind.u2
ldind.u4 Load an unsigned int32 at an address and push it onto the stack as an int32.
ldarga 0
ldind.u4
ldind.u8 Load an unsigned int64 at an address and push it onto the stack as an int64.
ldarga 0
ldind.u8
ldind.ref Load an object at an address and push it onto the stack.
ldarga 0
ldind.ref
ldlen Load the length of an array and push it onto the stack.
ldfld int32[] MyClass:MyArray
ldlen
ldloc <uint16> Load the value of a local variable at a given position and push it onto the stack.
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc 0 // 2 (bar)
}
ldloc.s <uint8> Load the value of a local variable at a given position and push it onto the stack. Takes up less space in bytecode compared to ldloc.
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc.s 0 // 2 (bar)
}
ldloc.0 - ldloc.3 Load the value of a local variable at a given position and push it onto the stack.
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc.0 // 2 (bar)
}
ldloca <uint16> Load the address of a local variable and push it onto the stack.
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloca 0 // bar
}
ldloca.s <uint8> Load the address of a local variable and push it onto the stack. Takes up less space in bytecode compared to ldloca
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloca.s 0 // bar
}
ldnull Load null and push it onto the stack.
ldnull
...
brnull MyBranch
ldobj <type> Pop an address off the stack, then push the value stored in that address.
ldflda int32 MyClass::MyInteger
...
ldobj int32
ldsfld <type> <field> Load a static field's value, which is a <type>, and push it onto the stack.
ldsfld int32 MyClass::MyStaticField
ldsflda <type> <field> Load the address of a static field, which is a <type>, and push it onto the stack.
ldsflda int32 MyClass::MyStaticField
ldstr <string> Load a string and push it onto the stack.
ldstr "Hello, World!"
ldtoken <token> Load a metadata token and push its runtime representation onto the stack.
ldtoken int32
ldvirtftn <type> <method> Load the address of a virtual method, which returns <type>, and push it onto the stack.
ldvirtftn int32 MyClass::MyVirtualMethod()