首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在调用MSIL中的字段之前必须执行ldarg.0,是因为MSIL(Microsoft Intermediate Language)是一种低级的中间语言,它需要以一种特定的方式来处理方法和函数的参数和局部变量。在MSIL中,参数和局部变量是通过索引来访问的,而不是通过名称。

当在MSIL中调用一个方法或函数时,需要将当前对象的引用作为第一个参数传递给该方法或函数。因此,在调用该方法或函数之前,需要使用ldarg.0指令将当前对象的引用加载到堆栈上。这样,在调用该方法或函数时,该引用将作为第一个参数传递给该方法或函数。

ldarg.0指令的作用是将当前对象的引用加载到堆栈上。这个指令的操作数是一个索引,表示当前对象的引用在局部变量表中的位置。在MSIL中,局部变量表是一个数组,用于存储方法或函数的局部变量和参数。

总之,在调用MSIL中的字段之前必须执行ldarg.0,是因为MSIL需要将当前对象的引用作为第一个参数传递给方法或函数,并且需要使用ldarg.0指令将该引用加载到堆栈上。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

DNS在远程调用执行中的应用

Address一般是服务器本身配置的DNS的外网出口IP,证明的是下部分的命令成功的在icloud.com登录功能所在的服务器成功执行,这个是一个可以执行命令的演示,如果这里的exp是一个echo "...在自己的设备上执行,可以看到我设备本身的DNS的外网递归出口为27.40.22.150的IP地址; image.png image.png 二、实现原理 image.png     当我们在...的权威服务器就能知道,在什么时间,什么IP请求了什么域名,然后做日志回显即可完成该操作;(该网站提供的子域名TTL也是 190,所以在190s之内的请求就记录不了了,要等到下一个TTL周期进行请求。)...dnslog.cn提供的随机子域名的请求打印功能,可以很快的验证远程命令是否正常执行,以便给黑白帽子做判断是否进行下一步操作;  那么基于此原理,还能做什么?...,我还想知道是在什么角色之下,执行下whoami命令,显然是OK的,并且ceye提供的子域名TTL是1s,也就是大部分的请求日志都会记录在权威; image.png image.png    这样带来的可玩性就比较多了

6K240

Javascript中你必须理解的执行上下文和调用栈

这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚的了解到 JavaScript 解释器到底做了什么,为什么可以在一些函数和变量之前使用它,以及它们的值是如何确定的。...如果在全局代码中调用了一个函数,则代码的执行会进入函数中,此时会创建一个新的执行上下文,它会被推到执行上下文栈中。...在执行阶段之前,我们已经完成了创建阶段,此时变量/函数已经被创建,所以当函数执行的时候 foo 可以被访问到。...虽然 foo 被声明了两次,但是我们在创建阶段中说到,函数是在变量之前创建在变量对象中,当变量对象中名称已经存在时,变量声明什么也不做。...希望你已经理解了 JavaScript 解释器是如何执行你的代码的。理解执行上下文和 执行上下文栈能够让你清楚的知道你的代码为什么和预期的值不一样。 你认为了解,解释器的内部原理是多余还是必须的知识?

46510
  • Javascript中你必须理解的执行上下文和调用栈

    ——爱默生 执行上下文在 JavaScript 是非常重要的基础知识,想要理解 JavaScript 的执行过程,执行上下文 是你必须要掌握的知识。否则只能是知其然不知其所以然。...这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚的了解到 JavaScript 解释器到底做了什么,为什么可以在一些函数和变量之前使用它,以及它们的值是如何确定的。...如果在全局代码中调用了一个函数,则代码的执行会进入函数中,此时会创建一个新的执行上下文,它会被推到执行上下文栈中。...虽然 foo 被声明了两次,但是我们在创建阶段中说到,函数是在变量之前创建在变量对象中,当变量对象中名称已经存在时,变量声明什么也不做。...希望你已经理解了 JavaScript 解释器是如何执行你的代码的。理解执行上下文和 执行上下文栈能够让你清楚的知道你的代码为什么和预期的值不一样。 你认为了解,解释器的内部原理是多余还是必须的知识?

    57430

    NEO C# 合约编译器原理解析

    代码是在github上面找的,NEO-NEP5.1是NEP5的一个token,包含常用的元素,字段,事件与函数。具有常见的数据存储,合约调用及日志信息功能。...,其中字段还原没有问题,多了个类构造和构造函数,还有event对应出来的两个add/remove方法,后来在转换过程中都需要清除掉的.事实上在neo中event的更多的只是起到了标识的作用。...-> 合约字节码 MSIL转换合约字节码工具是在neo-compiler/neon中定义的,转换命令为 dotnet ....代码调用 合约代码入口就是文件的main函数,通常是根据传入的函数名称判断调用到对应的工作函数。下面会通过两个具体函数的执行过程,通过对比三种代码来说明这个编译执行的过程。...定义 在合约中自己定义的方法都符合这个类型,如例子中的转账及部署等。

    99620

    【.Net底层剖析】3.用IL来理解属性

    概述: 我们经常在code中用到属性,但是我们真的知道属性和字段的区别吗?为什么会有属性这个用法?...Beforefieldinit 属性为Student提供了一个附加信息,用于标记运行库可以在任何时候执行类型构造函数方法,只要该构造方法在第一次访问其静态字段之前执行即可。...Ldarg.0(load argument)装载第一个成员参数,在实例方法中指的是当前实例的引用,该实例引用将用于在基类构造函数中调用。  ...从调用执行构造函数初始化之前,首先初始化对象的附加成员: 指向该类型方法表的指针 SyncBlockIndex,用于进行线程同步。     所有的对象都包含这两个附加成员,用于管理对象。...但是调试时需要注意,如果对属性Name添加了监视,则可能会引入bug,比如在get访问器中递增一个字段count,那么每单步执行一行代码,监视器都会重新去调用get方法,从而造成字段的递增。

    84570

    CA1810:以内联方式初始化引用类型的静态字段

    规则说明 当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。...静态初始化可以保证在访问任何静态字段之前的某个时间发生,但不能在调用静态方法或实例构造函数之前发生。 请注意,在声明类型的变量后,可能会随时发生静态初始化。 静态构造函数检查会降低性能。...通常,静态构造函数仅用于初始化静态字段,在这种情况下,必须确保仅在首次访问静态字段之前发生静态初始化。 beforefieldinit 行为适用于这些类型和大多数其他类型。...仅当静态初始化影响全局状态并且满足以下任一条件时,它才是不适当的: 影响全局状态的成本非常昂贵,如果不使用该类型,则不需要这样做。 可以在不访问该类型的任何静态字段的情况下访问全局状态效果。...何时禁止显示警告 如果不考虑性能,或者,如果静态初始化导致的全局状态更改成本非常昂贵,或者必须保证在调用该类型的静态方法或创建该类型的实例之前进行静态初始化,则可以安全地禁止显示此规则发出的警告。

    62900

    5-自动属性增强

    在为属性赋值的时候,我们可以在任意地方为其赋值。但是并没有一种像是字段一样的声明且立即初始化的语法来简化默认值的设定。C#6为我们带来了这种新的语法,像是为字段赋值一样为属性赋值。...,第2行分别表示这个自动是编译器自动生成的,第3行表示该字段不显示在Debugger窗口中。...声明只读属性 10 public string Note { get; } 11 12 public Person(string note) 13 { 14 //在构造器中为只读属性初始化默认值...(readonly ),只允许在声明的时候设置初始值或者在构造器里面赋值。...string csharp6.Person::'k__BackingField' 19 IL_0021: ret 20 } // end of method Person::.ctor 和之前的语法生成的代码可以说是一致的

    61870

    30分钟?不需要,轻松读懂IL

    为什么取这个标题呢,记得很久之前看过一篇文章,叫"正则表达式30分钟入门教程",学正则最重要的就是记住各个符号的含义。个人觉得相比难以直接看出实际意义的正则符号如"\w","\d","*","?"...Dup 复制计算堆栈上当前最顶端的值,然后将副本推送到计算堆栈上。 Neg 对一个值执行求反并将结果推送到计算堆栈上。...Debug下的 Pop 移除当前位于计算堆栈顶部的值。 Initobj Init Object将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。...ldarg要特别注意一个问题:如果是实例方法的话ldarg.0加载的是本身,也就是this,ldarg.1加载的才是函数的第一个参数;如果是静态函数,ldarg.0就是第一个参数。...//调用基类People的构造函数,而People也会调用Object的构造函数 8 IL_0006: ldarg.0 //加载this 9 IL_0007: ldarg.1 //加载第二个参数也就是

    84470

    内存优化:Boxing

    本系列中描述的最佳实践使我们能够将 .NET 产品中某些算法的性能提高 20%-50%。 您需要什么工具 在我们进一步讨论之前,先看看我们需要的工具。...例如: int i = 5; object o = i; // 发生装箱 为什么这是个问题?值类型存储在栈中,而引用类型存储在托管堆中。...因此,要将整数值分配给对象,CLR 必须从栈中取出该值并将其复制到堆中。当然,这种移动会影响应用程序的性能。...如何修复 在解决装箱问题之前,请确保它确实会产生大量流量。如果是这样,你的任务就很明确:重写代码以消除装箱。当你引入某些值类型时,请确保不会在代码中的任何位置将值类型转换为引用类型。...var i = 5; var str = $"i = {i}"; // box 在.net6之前,上面的写法会发生装箱,生成的IL如下: IL_001a: ldarg.0 // this IL

    12110

    .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)

    名称混淆 Obfuscation 修改类型、字段、属性、方法等的名称。 流程混淆 Control Flow Obfuscation 修改方法内的执行逻辑,使其执行错综复杂。...字段名的混淆有三个不同级别: 等级 1 是源码中字段名称和混淆后字段名称一一对应 等级 2 是在一个类中的不同字段使用不同名称即可(这不废话吗,不过 SmartAssembly 应该是为了强调与等级 1...和等级 3 的不同,必须写一个描述) 等级 3 是允许不同类中的字段使用相同的名字(这样能够更加让人难以理解) 需要注意:对于部分程序集,字段名(FieldsNameMangling)的等级只能选为...而如果开启了这一选项,那么 Strings.Get 就不是全局调用的了,而是在类的内部调用一个委托字段。...,因为多执行的代码都是有编译期级别优化的,没有太多性能开销的代码 流程混淆仅影响实现,不修改 API,所以基本不会影响其他程序各种对此程序集的调用 名称混淆 尽量选择 任意选择类/方法名和字段名的级别

    2.8K10

    实例方法和静态方法有区别吗?

    对于很多人来说,这是一个愚蠢的问题。因为我们都知道它们的区别,实例方法作用于某个具体的上下文对象,该上下文对象可以利用this关键字获得;静态方法则是定义在某个类型中,不存在上下文对象的概念。...方法涉及三个IL指令:ldarg.0提取第1个参数压入栈中,具体入栈的是指向IntValue对象的地址;目标IntValue对象的_value字段通过ldfld指令被加载,最终通过ret指令作为结果返回...如下所示的就是上面C#针对这两个方法的调用转换生成的IL代码。...比如我们在IntValue类型(可以定义任意类型中)中定义了一个总是返回int.MaxValue的AlwaysMaxValue方法。...在演示程序中,我们通过调用Hijack方法将IntValue的实例方法AsInt32“替换”这个AlwaysMaxValue方法。

    22240

    C#基础知识系列六(静态类和静态类成员)

    例如,在 .NET Framework 类库中,静态类 System.Math 包含的方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。...但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。 静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。...如果非静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函数。 静态类成员   非静态类可以包含静态的方法、字段、属性或事件。 即使没有创建类的实例,也可以调用该类中的静态成员。...更常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。 静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。   ...对静态方法的调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法的调用生成 callvirt 指令,该指令还检查 null 对象引用。

    83520

    如何有效地检测和阻止SunBurst恶意软件?

    您可以观察到的第一件事是,这些规则是any/any,这意味着IDS必须调查每个连接,因为大多数IDS都不像ntop工具那样使用DPI,因此它们需要在到处搜索而不是精确定位字段:这意味着整体工具性能会降低...,因为即使是不相关的流量也必须进行分析,你可能会遇到假阳性。...请注意,由于这些规则是在使用加密流量之前设计的,因此不是最优的,因此它们非常原始,范围有限。...上搜索(甚至在非标准端口上),如果你发现了指向特定网站的连接(例如freescanonline.com),就会发出警报。...里面,你必须通过绑定(菜单设置->应用程序和类别)告诉它Sunburst是一个恶意软件,Sunburst属于恶意软件类别。

    87030

    C#扩展方法原理及其使用

    1、写在前面 今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答)。所以写了这边文章,力图从原理角度解释扩展方法及其使用。...先让我们来感受一下.NET中自带的扩展方法,其中OrderBy和Aggregate都是系统自带的扩展方法 ?...通过以上实例,我们可以知道自定义扩展方法需要做到: 必须是静态类,扩展方法也为静态方法 此方法的第一个参数指定方法所操作的类型;此参数前面必须加上 this 修饰符 在调用代码中,如何不再同一个命名空间...,这也解释了一个问题,就是当类型为空的时候,为什么调用扩展方法了 ?...一下是在使用扩展方法时需要注意的地方 扩展方法与该类型中定义的方法具有相同的签名,编译器总是绑定到该实例方法,也就是扩展方法永远不会被调用,这也就回答了题目刚开始所说的问题。

    1.6K20

    为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?

    进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量。 为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段呢?...翻译过来是:对具有此 Intrinsic 特性标记的字段的方法或引用的调用可以在某些具有 JIT 内部扩展的调用点处替换,标记有此属性的类型可能被运行时或编译器特殊处理。...string.Empty 字段在整个 String 类型中你都看不到初始化的代码,String 类的静态构造函数也不会执行。也就是说,String 类中的所有静态成员都不会被托管代码初始化。...从上文中 string.Empty 的注释描述中可以知道: 编译器会将 C# 语言编译成中间语言 MSIL; 如果这是一个常量,那么编译器在不做特殊处理的情况下,就会生成 ldstr "",而这种方式不会调用到...String 类的构造函数(注意不是静态构造函数,String 类的静态构造函数是特殊处理不会调用的); 而如果这是一个静态字段,那么编译器可以在不做特殊处理的情况下,生成 ldsfld string

    1.1K00

    C# 泛型的简单理解(安全、集合、方法、约束、继承)

    例如,如果你定义一个泛型类型MyList<T>,仅仅该类型的一个定义出现在MSIL中。当程序执行时,不同的类被动态地创建,每个类对应该参数化类型的一种类型。...在<>内的T代表了实际的当使用该类时要指定的类型。在MyList类中,定义了一个静态字段objCount。我在构造器中增加它的值。因此我能发现使用我的类的用户共创建了多少个那种类型的对象。...属性Count返回与被调用的实例同类型的实例的数目。...问题是:Count(上面的程序的输出)的值该是多少?在你继阅读之前,试一试回答这个问题。 ?...注意,虽然有4个MyList类,但仅有一个被存储在MSIL。怎么能证明这一点?请看下图显示出的使用工具ildasm.exe生成的MSIL代码。 ? 泛型方法 除了有泛型类,你也可以有泛型方法。

    1.1K10

    C# IL DASM 使用

    IL是微软平台上的一门中间语言,我们常写的C#代码在编译器中都会自动转换成IL,然后在由即时编译器(JIT Compiler)转化机器码,最后被CPU执行。...已上信息填写完成后,在“工具”选择卡中能找到我们刚增加的外部工具名称(IL_DASM)。增加完成后可以小试一把。 国际惯例来段"Hello World"。...这时可以看到Main方法在IL中编译的代码。感觉有点陌生不易看懂。 还有IL编译出现的三角型,正方型都是啥! IL DASM 基础 1.图标含义 ? 使用IL反编译出项目代码 ?...这里主要指C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以在静态字段方法生成后的任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public....otor期间的评估堆栈(Evaluation Stack) ; 3) IL_0000:标记代码行开头; 4)ldarg.0:表示转载第一个成员参数,在实例方法中指的是当前实例的引用; 5)call:

    1.1K31

    .NET6 平台系列3 .NET CLR 详解

    如果没有足够的内存来高速缓存编译后代码,就需要反复调用JIT,由于优化技术需要花时间,这样就大大降低了编译的速度。 2、EconoJIT -- 经济编译器。它不是执行优化技术的编译器。...当执行应用程序时,首先类加载器将应用程序的汇编(MSIL代码和元数据)加载到内存中,然后使用其中的元数据加载任何应用程序所需要的组件支持的汇编并进行类型安全和版本检查。...当然,如果开发人员希望在应用程序首次安装到计算机中时就全部从MSIL转变为本机代码,那么可以使用 PreJIT 编译器实现,PreJIT自动把MSIL转换本机代码。...(4)JIT编译器和其他大多数编译器是不用的。JIT编译器只执行编译这个过程,而在其他编译器(C和C++)中要经过编译和链接两个阶段。...也就是说,.NET下的源程序(C#等)并不被编译成目标文件(.obj),而是直接生成可执行文件(.exe)或动态链接库(.dll)。在.NET下,编译器不需要包含链接器。

    2.7K21

    背后的故事之 - 快乐的Lambda表达式(一)

    这样我们就可以跳过上面的第一步了,不过第2步还是必须的,只是用Action或者Func替换了。...在使用这个Lambda表达式的地方呢,实际上是new了这个类的一个实例进行调用。这样的话,我们表达式里面的外部变量,也就是上面代码中用到的local实际上是以一个全局变量的身份存在于这个实例中的。...在给这个属性附值,甚至执行过程中我们可以随时更改这个属性的指向,从而达到改变这个方法的目地。...自执行方法   JavaScript 中的自执行方法有以下几个优势: 不会污染全局环境 保证自执行里面的方法只会被执行一次 解释完立即执行   在C#中我们也可以有自执行的方法: (() => { /...}   可能有人会觉得这个没什么,但是仔细想想,你在外面只需要调用AutoSave就可以了,其它的都不用管。而这个AutoSave,也不用每次执行的时候都需要去检查配置文件了。

    64970
    领券