在mscorlib中找到的Prefixref指令

时间:2016-10-09 21:26:21

标签: .net cil

TL; DR: 什么是Prefixref?可以用参数/指令长度来发挥作用吗?

我最近一直在研究.NET二进制解析工具,当我在mscorlib的位上测试我的库时,我开始得到一些奇怪的异常,其中IL没有表现(分支到参数!)。我已经调查并将我的问题跟踪到System.Random.InternalSample(一个没有出现在ildasm中的方法)。我已经对我的二进制分析器进行了gerryrigged以生成类似ILDASM的输出,以下是它为这个神秘函数生成的内容(注释是手动添加的)。

我无法弄清楚的是IL_0044发生的事情。这条指令似乎分支到另一个操作的中间!要么我正在阅读CIL非常错误,这里有一些非常奇怪的事情,或者那些令人讨厌的前缀指令令人困惑。有谁知道什么是prefixref?文档只是说它是保留的,并且“不打算直接在你的代码中使用。”

.maxstack 3
.locals init (  [0] System.Int32 V_0,
                [1] System.Int32 V_1,
                [2] System.Int32 V_2)
IL_0000:    ldarg_0 
IL_0001:    ldfld   0xB5 0x05 0x00 0x04 
IL_0006:    stloc_1 
IL_0007:    ldarg_0 
IL_0008:    ldfld   0xB6 0x05 0x00 0x04 
IL_000D:    stloc_2 
IL_000E:    ldloc_1 
IL_000F:    ldc_i4_1    
IL_0010:    add 
IL_0011:    dup 
IL_0012:    stloc_1 
IL_0013:    ldc_i4_s    0x38 
IL_0015:    blt_s   0x02 // IL_0019 
IL_0017:    ldc_i4_1    
IL_0018:    stloc_1 
IL_0019:    ldloc_2 
IL_001A:    ldc_i4_1    
IL_001B:    add 
IL_001C:    dup 
IL_001D:    stloc_2 
IL_001E:    ldc_i4_s    0x38 
IL_0020:    blt_s   0x02 // IL_0024
IL_0022:    ldc_i4_1    
IL_0023:    stloc_2 
IL_0024:    ldarg_0 
IL_0025:    ldfld   0xB7 0x05 0x00 0x04 
IL_002A:    ldloc_1 
IL_002B:    ldelem_i4   
IL_002C:    ldarg_0 
IL_002D:    ldfld   0xB7 0x05 0x00 0x04 
IL_0032:    ldloc_2 
IL_0033:    ldelem_i4   
IL_0034:    sub 
IL_0035:    stloc_0 
IL_0036:    ldloc_0 
IL_0037:    ldc_i4_m1   
IL_0038:    prefixref   
IL_0039:    prefixref   
IL_003A:    prefixref   
IL_003B:    ldsflda 0x33 0x04 0x06 0x17 
IL_0040:    sub 
IL_0041:    stloc_0 
IL_0042:    ldloc_0 
IL_0043:    ldc_i4_0    
IL_0044:    bge_s   0x08 // IL_004B + 0x03
IL_0046:    ldloc_0 
IL_0047:    ldc_i4_m1   
IL_0048:    prefixref   
IL_0049:    prefixref   
IL_004A:    prefixref   
IL_004B:    ldsflda 0x58 0x0A 0x02 0x7B 
IL_0050:    conv_ovf_i4 
IL_0051:    ldarg_3 
IL_0052:    nop 
IL_0053:    ldarg_2 
IL_0054:    ldloc_1 
IL_0055:    ldloc_0 
IL_0056:    stelem_i4   
IL_0057:    ldarg_0 
IL_0058:    ldloc_1 
IL_0059:    stfld   0xB5 0x05 0x00 0x04 
IL_005E:    ldarg_0 
IL_005F:    ldloc_2 
IL_0060:    stfld   0xB6 0x05 0x00 0x04 
IL_0065:    ldloc_0 
IL_0066:    ret 

0 个答案:

没有答案