通用中间语言/堆栈
外观
< 通用中间语言
- ldarg <uint16>
- 加载给定位置处的参数并将其推送到堆栈上。
.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>
- 加载给定位置处的参数并将其推送到堆栈上。与
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
- 加载给定位置处的参数并将其推送到堆栈上。
.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>
- 加载给定位置处的参数的地址并将其推送到堆栈上。
.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>
- 加载给定位置处的参数的地址并将其推送到堆栈上。与
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>
- 加载 32 位(4 字节)整数并将其推送到堆栈上。
.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>
- 加载 8 位(1 字节)整数并将其作为 32 位推送到堆栈上。与
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
- 加载 32 位(4 字节)整数并将其推送到堆栈上。
.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
- 加载 -1 并将其作为 32 位推送到堆栈上。
.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>
- 加载 64 位(8 字节)整数并将其推送到堆栈上。
.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>
- 加载 32 位(4 字节)浮点数并将其推送到堆栈上。
.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>
- 加载 64 位(8 字节)浮点数并将其推送到堆栈上。
.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>
- 加载数组中的元素并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem int32
- ldelem <type>
- 加载数组中的元素并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem int32
- ldelem.i
- 加载数组中的元素作为本机 int 并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.i
- ldelem.i1
- 加载数组中的元素作为 int8 并将其作为 int32 推送到堆栈上。
// (int32) MyClass.MyArray[5]
ldfld int8[] MyClass::MyArray
ldc.i4 5
ldelem.i1
- ldelem.i2
- 加载数组中的元素作为 int16 并将其作为 int32 推送到堆栈上。
// (int32) MyClass.MyArray[5]
ldfld int16[] MyClass::MyArray
ldc.i4 5
ldelem.i2
- ldelem.i4
- 加载数组中的元素作为 int32 并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.i4
- ldelem.i8
- 加载数组中的元素作为 int64 并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld int64[] MyClass::MyArray
ldc.i4 5
ldelem.i8
- ldelem.r4
- 加载数组中的元素作为 float32 并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld float32[] MyClass::MyArray
ldc.i4 5
ldelem.f4
- ldelem.r8
- 加载数组中的元素作为 float64 并将其推送到堆栈上。
// MyClass.MyArray[5]
ldfld float64[] MyClass::MyArray
ldc.i4 5
ldelem.f8
- ldelem.ref
- 加载数组中的元素并将其作为对象推送到堆栈上。
// (object) MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelem.ref
- ldelem.u1
- 加载数组中的元素作为 uint8 并将其作为 int32 推送到堆栈上。
// (int32) MyClass.MyArray[5]
ldfld unsigned int8[] MyClass::MyArray
ldc.i4 5
ldelem.u1
- ldelem.u2
- 加载数组中的元素作为 uint16 并将其作为 int32 推送到堆栈上。
// (int32) MyClass.MyArray[5]
ldfld unsigned int16[] MyClass::MyArray
ldc.i4 5
ldelem.u2
- ldelem.u4
- 加载数组中的元素作为 uint32 并将其作为 int32 推送到堆栈上。
// (int32) MyClass.MyArray[5]
ldfld unsigned int32[] MyClass::MyArray
ldc.i4 5
ldelem.u4
- ldelem.u8
- 加载数组中的元素作为 uint64 并将其作为 int64 推送到堆栈上。
// (int64) MyClass.MyArray[5]
ldfld unsigned int64[] MyClass::MyArray
ldc.i4 5
ldelem.u8
- ldelema <type>
- 加载数组中元素的地址作为 <type> 并将其推送到堆栈上。
// (managed pointer) MyClass.MyArray[5]
ldfld int32[] MyClass::MyArray
ldc.i4 5
ldelema int32
- ldfld <type> <field>
- 加载字段的值,这是一个 <type>,并将其推送到堆栈上。
ldfld int32 MyClass::MyField
- ldflda <type> <field>
- 加载字段的地址,这是一个 <type>,并将其推送到堆栈上。
ldflda int32 MyClass::MyField
- ldflda <type> <field>
- 加载字段的地址,这是一个 <type>,并将其推送到堆栈上。
ldflda int32 MyClass::MyField
- ldftn <type> <method>
- 加载指向方法的指针,该方法返回 <type>,由 <method> 引用,并将其推送到堆栈上。
ldftn int32 MyClass::MyMethod()
- ldind.i
- 加载地址处的本机 int 并将其推送到堆栈上。
ldarga 0
ldind.i
- ldind.i1
- 加载地址处的 int8 并将其作为 int32 推送到堆栈上。
ldarga 0
ldind.i1
- ldind.i2
- 加载地址处的 int16 并将其作为 int32 推送到堆栈上。
ldarga 0
ldind.i2
- ldind.i4
- 加载地址处的 int32 并将其推送到堆栈上。
ldarga 0
ldind.i4
- ldind.i8
- 加载地址处的 int64 并将其推送到堆栈上。
ldarga 0
ldind.i8
- ldind.r4
- 加载地址处的 float32 并将其推送到堆栈上。
ldarga 0
ldind.r4
- ldind.r8
- 加载地址处的 float64 并将其推送到堆栈上。
ldarga 0
ldind.r8
- ldind.u1
- 加载地址处的无符号 int8 并将其作为 int32 推送到堆栈上。
ldarga 0
ldind.u1
- ldind.u2
- 加载地址处的无符号 int16 并将其作为 int32 推送到堆栈上。
ldarga 0
ldind.u2
- ldind.u4
- 加载地址处的无符号 int32 并将其作为 int32 推送到堆栈上。
ldarga 0
ldind.u4
- ldind.u8
- 加载地址处的无符号 int64 并将其作为 int64 推送到堆栈上。
ldarga 0
ldind.u8
- ldind.ref
- 加载地址处的对象并将其推送到堆栈上。
ldarga 0
ldind.ref
- ldlen
- 加载数组的长度并将其推送到堆栈上。
ldfld int32[] MyClass:MyArray
ldlen
- ldloc <uint16>
- 加载给定位置处的局部变量的值并将其推送到堆栈上。
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc 0 // 2 (bar)
}
- ldloc.s <uint8>
- 加载给定位置处的局部变量的值并将其推送到堆栈上。与
ldloc
相比,在字节码中占用更少的空间。
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc.s 0 // 2 (bar)
}
- ldloc.0 - ldloc.3
- 加载给定位置处的局部变量的值并将其推送到堆栈上。
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloc.0 // 2 (bar)
}
- ldloca <uint16>
- 加载局部变量的地址并将其推送到堆栈上。
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloca 0 // bar
}
- ldloca.s <uint8>
- 加载局部变量的地址并将其推送到堆栈上。与
ldloca
相比,在字节码中占用更少的空间。
.method void Foo()
{
.locals init (
[0] int32 bar
)
ldc.i4.2
stloc.0
ldloca.s 0 // bar
}
- ldnull
- 加载 null 并将其推送到堆栈上。
ldnull
...
brnull MyBranch
- ldobj <type>
- 从堆栈中弹出地址,然后将存储在该地址中的值推送到堆栈。
ldflda int32 MyClass::MyInteger
...
ldobj int32
- ldsfld <type> <field>
- 加载静态字段的值,这是一个 <type>,并将其推送到堆栈上。
ldsfld int32 MyClass::MyStaticField
- ldsflda <type> <field>
- 加载静态字段的地址,这是一个 <type>,并将其推送到堆栈上。
ldsflda int32 MyClass::MyStaticField
- ldstr <string>
- 加载字符串并将其推送到堆栈上。
ldstr "Hello, World!"
- ldtoken <token>
- 加载元数据令牌并将其运行时表示推送到堆栈上。
ldtoken int32
- ldvirtftn <type> <method>
- 加载虚拟方法的地址,该方法返回 <type>,并将其推送到堆栈上。
ldvirtftn int32 MyClass::MyVirtualMethod()