跳轉到內容

通用中間語言/堆疊

來自華夏公益教科書,開放的世界中的開放書籍
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()
華夏公益教科書