CIL和数组绑定检查

时间:2012-01-25 06:53:08

标签: cil

让我们假设以下CIL计划:

.assembly extern mscorlib {}
.assembly Program {}

.method private static void Main() cil managed
{
    .entrypoint
    .maxstack 4

    .locals init ( int32[] a,
               uint32   t )

    // Creates an array of int of size 10
    ldc.i4 10
    newarr int32
    stloc.0

    // Writes 0xaabbccdd at the index 2 of the array
    ldloc.0
    ldc.i4.2
    ldc.i4 0xaabbccdd
    stelem.i4

    // Loads
    ldloc.0
    ldc.i4 9 // <HERE>
    ldelem.i1

    stloc.1
    ldstr "Value: 0x{0:x8}"
    ldloc.1
    box [mscorlib]System.UInt32
    call void [mscorlib]System.Console::WriteLine(string, object)

    ret
}

这个程序:

  • 创建一个int size 10
  • 的数组
  • 将0xaabbccdd写入数组的索引2
  • 尝试使用ldelem.i1
  • 读取数组中的一个字节
  • 打印结果

诀窍是我使用“ldelem.i1”而不是更标准的“idelem.i4”来解决性能问题(我想避免做掩码)这个想法是以一种方式访问​​数组的数据用C中的指针。

但事情并不是那么好,因为程序崩溃(IndexOutOfRangeException)索引超过10作为ldelem.i1的参数。 由于我无法在第三个索引的整数的前半部分之后访问数据,因此这种技巧无用。

理想情况下,我想访问索引39的字节,这对应于索引9处整数的最后一个字节。

如果有人对这一点有所了解,我将非常感激。

0 个答案:

没有答案