为什么在调用 MSIL 中的字段之前必须执行 ldarg.0?

发布于 2024-08-12 08:20:02 字数 636 浏览 3 评论 0原文

我想调用一个函数,以 stringInt32 作为参数。 string 只是一个文字,Int32 应该是一个field。所以我认为它应该是这样的:

.method public hidebysig instance string TestVoid() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr "myString"
    L_0006: ldfld int32 FirstNamespace.FirstClass::ByteField
    L_000b: call string [Class1]Class1.TestClass::Functie<int32>(string, int32)
    L_0010: ret 
}

但这会引发错误,表明这不是有效的代码。 添加时,

ldarg.0 

在ldfld 之前 它运行得很好。为什么会这样?当有更多字段时,这会给我带来麻烦吗?

I want to call a function, with as parameters a string and an Int32. The string is just a literal, the Int32 should be a field. So I thought it should be something like:

.method public hidebysig instance string TestVoid() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr "myString"
    L_0006: ldfld int32 FirstNamespace.FirstClass::ByteField
    L_000b: call string [Class1]Class1.TestClass::Functie<int32>(string, int32)
    L_0010: ret 
}

But this throws the error that this is not valid code. When adding

ldarg.0 

before ldfld it runs just fine. Why is this, and is this going to get me into trouble when having more fields?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明月夜 2024-08-19 08:20:02

实例方法有一个名为“this”的隐式参数。它作为第一个参数加载到堆栈中,因此“this”有 ldarg.0。

Instance methods have an implicit parameter called "this". It is loaded as the first argument to the stack, thus you have ldarg.0 for "this".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文