跳转到内容

通用中间语言/堆栈

来自维基教科书,开放的世界中的开放书籍
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()
华夏公益教科书