【问题标题】:How to use CIL instruction conv.r4如何使用 CIL 指令 conv.r4
【发布时间】:2016-05-19 08:32:37
【问题描述】:

今天我开始学习 CIL 代码的工作原理。
我找到了List of CIL instructions

现在我正在尝试编辑一个函数。 我正在使用带有 Reflexil 的 .NET Reflector
我想编辑这个函数:

.method family hidebysig instance void SomeFunction(float32 var1, float32 var2, class SomeClassComponent component, class SomeInstanceClassComponent instance, float32 var3) cil managed
{
}

以代码开头:

IL_0000: ldarg.0
IL_0001: ldarg.3
IL_0002: ldarg.1
IL_0003: ldarg.2

我想用硬写的值替换 var1。
维基百科说:

conv.r4

转换为 float32,将 F 压入堆栈。

当我尝试编辑它时,我得到了这个:

我的错误在哪里?

【问题讨论】:

  • 在方法开始时评估堆栈为空。您正在尝试使用该操作码弹出一个空堆栈。

标签: .net cil


【解决方案1】:

正如 Lucas Trzesniewski 在他的评论中所说,您首先需要在堆栈上有一个 conv.r4 指令可以使用的值。

如需更深入的操作数说明,请参阅msdn link,这里是 conv.r4 操作数的 link,其中指出“conv.r4 操作码转换值在堆栈顶部到操作码中指定的类型” - 这意味着您必须确保堆栈上已经存在一个值,并且它是 conv.r4 指令可以使用的正确值。

作为最后的一些小自我广告 ;) 我写了一些关于 IL 编程的教程,你可以阅读 herehere。我尝试使用实践方法,以便您通过编程来理解 IL,而不仅仅是阅读。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 2014-06-20
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多