Ali*_*lix 6 .net c# reflection il reflection.emit
我正在使用Reflector查看有效方法的IL代码,我遇到了这个问题:
L_00a5: leave.s L_0103
Run Code Online (Sandbox Code Playgroud)
带后缀的指令.s应该采用int8操作数,当然这也应该是Leave_S的情况.但是,0x0103是259,超过了int8的容量.该方法以某种方式工作,但当我用方法读取指令时,Mono.Reflection.Disassembler.GetInstructions它检索
L_00a5: leave.s L_0003
Run Code Online (Sandbox Code Playgroud)
也就是说,3而不是259,因为它应该是一个int8.所以,我的问题是:原始指令(leave.s L_0103)可能如何?我查看了ECMA文档(Partition III:CIL指令集),我找不到任何解释它的东西.
有任何想法吗?谢谢.
编辑#1:好的,我是个白痴.在分支指令的情况下,必须从当前指令之后的指令开始计算偏移量.我发誓我阅读了文档,但不知怎的,我设法跳过了.在我的辩护中,我今天病得很重.叹.
谢谢.(并且感谢你没有称我为白痴,尽管这非常愚蠢:P)
编辑#2:顺便说一句,如果有人感兴趣,当Mono.Reflection.Disassembler.GetInstructions反汇编指令时,它会改变分支指令中操作数的含义.特别是,正如已经指出的那样,分支指令的操作数表示从下一条指令开始的偏移量,而不是从0 Mono.Reflection开始的偏移量.但是,从0 开始返回偏移量(这可能是我感到困惑的原因;虽然它没有解释我是如何设法跳过部分文档的.
提取物MethodBodyReader.ReadOperand(Instruction instruction):
switch (instruction.OpCode.OperandType) {
...
case OperandType.ShortInlineBrTarget:
instruction.Operand = (sbyte) (il.ReadByte () + il.position);
break;
...
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样il.position,它是下一条指令的偏移量(从0开始).此外,它投射到sbyte,这是我得到3而不是259的原因.这似乎是一个错误(从0开始的偏移可能大于a sbyte).我会问Jb Evain(作者)并报告.
编辑#3:他还没有回答,但我把它改为:
switch (instruction.OpCode.OperandType) {
...
case OperandType.ShortInlineBrTarget:
instruction.Operand = ((sbyte) il.ReadByte ()) + il.position;
break;
...
}
Run Code Online (Sandbox Code Playgroud)
它似乎解决了我的问题.我sbyte转向得到正确的符号,以防它是向后跳跃(负偏移),然后当我添加il.position(这是一个int)时,结果是一个int.
无论如何,我会告诉你他说的话.
编辑#4:我忘了回报.作者证实这是一个错误.
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |