首页
社区
课程
招聘
[旧帖] [求助]MSIL中的call何时调用才需要ldarg.0? 0.00雪花
发表于: 2009-4-12 15:56 5202

[旧帖] [求助]MSIL中的call何时调用才需要ldarg.0? 0.00雪花

2009-4-12 15:56
5202
call似乎有的时候需要先将arg.0(this/me)入栈,什么时候需要这样做呢?

谢谢!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
对于类的实例(instance)的方法,序列号为0的参数总是为.this,也就是ldarg.0
对于类的静态(static)的方法,没有.this指针,第一个参数也就是传进去的第一个参数.

举个简单的例子一看就清楚了,如下:
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Peopele.Eat(1,2);
            Peopele Jim = new Peopele();
            Jim.Sleep(1,2);
        }
    }

    class Peopele
    {
        public static void Eat(int a,int b)
        {
            Console.WriteLine("Eat");
        }

        public void Sleep(int a,int b)
        {
            Console.WriteLine("Sleep");
        }
    }
}

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       25 (0x19)
  .maxstack  3
  .locals init (class test.Peopele V_0)
  IL_0000:  nop
IL_0001:  ldc.i4.1
  IL_0002:  ldc.i4.2
  IL_0003:  call       void test.Peopele::Eat(int32,
                                              int32)
  IL_0008:  nop
  IL_0009:  newobj     instance void test.Peopele::.ctor()
  IL_000e:  stloc.0
  IL_000f:  ldloc.0
  IL_0010:  ldc.i4.1
  IL_0011:  ldc.i4.2
  IL_0012:  callvirt   instance void test.Peopele::Sleep(int32,
                                                         int32)
  IL_0017:  nop
  IL_0018:  ret
} // end of method Program::Main
2009-4-22 23:04
0
游客
登录 | 注册 方可回帖
返回
//