gpt4 book ai didi

c# - IL 短格式指令不短?

转载 作者:太空狗 更新时间:2023-10-29 21:52:16 25 4
gpt4 key购买 nike

我正在使用 Reflector 查看一个有效方法的 IL 代码,我遇到了这个:

L_00a5: leave.s L_0103

后缀为.s的指令应该接受一个int8操作数,果然this should be the case with Leave_S as well .但是0x0103是259,超出了一个int8的容量。该方法以某种方式起作用,但是当我使用方法 Mono.Reflection.Disassembler.GetInstructions 阅读说明时,它会检索

L_00a5: leave.s L_0003

也就是说,3 而不是 259,因为它应该是一个 int8。那么,我的问题是:原始指令 (leave.s L_0103) 是如何实现的?我看过 ECMA documentation for that (第三部分: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;
...
}

如您所见,它添加了 il.position,这是下一条指令的偏移量(从 0 开始)。此外,它转换为 sbyte,这就是我得到 3 而不是 259 的原因。这似乎是一个错误(从 0 开始的偏移量可能大于 sbyte)。我会询问 Jb Evain(作者)并报告。


编辑 #3: 他还没有回答,但我已经将其更改为:

switch (instruction.OpCode.OperandType) {
...
case OperandType.ShortInlineBrTarget:
instruction.Operand = ((sbyte) il.ReadByte ()) + il.position;
break;
...
}

它似乎解决了我的问题。我转换为 sbyte 以获得正确的符号,以防它向后跳转(负偏移),然后当我添加 il.position (这是一个 int) 结果是 int

不管怎样,我会让你知道他说了什么。


编辑 #4:我忘记报告了。作者确认这是一个错误。

最佳答案

target instruction, represented as a 1-byte signed offset from the beginning of the instruction following the current instruction

0xA5 在 0x103 的 127 字节以内。但是,leave.s 无法从 0xA5 到达 0x03。

关于c# - IL 短格式指令不短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com