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

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

第一类 :直观型 这一类的特点是一看名字就知道是干嘛的,不需要多讲,如下: 名称 说明 Add 将两个值相加并将结果推送到计算堆栈上。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。...Ret 从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。 Jmp 退出当前方法并跳至指定方法。...Throw 引发当前位于计算堆栈上的异常对象。 Call 调用由传递的方法说明符指示的方法。 Calli 通过调用约定描述的参数调用在计算堆栈上指示的方法(作为指向入口点的指针)。...Callvirt 对对象调用后期绑定方法,并且将返回值推送到计算堆栈上。...所以把值加载到计算栈上,算完后再把计算栈上的值存到线程栈上去,这类指令专门干这些活。

84470
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# 循环的判断会进来几次

    } } 通过 Main 调用 BirmeruLerrayjairbay ,这个函数里面的 for 判断是 DaydrearNenawerlai 拿到一个值,我尝试在 release 运行,结果每个判断都需要进入....method public hidebysig instance void BirmeruLerrayjairbay() cil managed { .maxstack 3...System.Console::WriteLine(string) // 下面是 i++ 代码 // [23 55 - 23 58] // 将指定索引处的局部变量加载到计算堆栈上...,这里的索引是 0 ,在代码的变量是 i 所以把 i 加载到计算堆栈 IL_001f: ldloc.0 // i // 将整数值 1 作为 int32 推送到计算堆栈上...IL_0020: ldc.i4.1 // 从堆栈出栈两个数值进行相加,返回的值放在栈 IL_0021: add // 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中

    68430

    C# 循环的判断会进来几次

    } } 通过 Main 调用 BirmeruLerrayjairbay ,这个函数里面的 for 判断是 DaydrearNenawerlai 拿到一个值,我尝试在 release 运行,结果每个判断都需要进入....method public hidebysig instance void BirmeruLerrayjairbay() cil managed { .maxstack 3...System.Console::WriteLine(string) // 下面是 i++ 代码 // [23 55 - 23 58] // 将指定索引处的局部变量加载到计算堆栈上...,这里的索引是 0 ,在代码的变量是 i 所以把 i 加载到计算堆栈 IL_001f: ldloc.0 // i // 将整数值 1 作为 int32 推送到计算堆栈上...IL_0020: ldc.i4.1 // 从堆栈出栈两个数值进行相加,返回的值放在栈 IL_0021: add // 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中

    34510

    .NET基础面试题整理

    堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 2). 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。...基于值类型的泛型实例化:CLR会讲指定的类型参数放到CIL中合适的位置,从而创建一个具体化的泛型类型。...以后,每次用一个引用类型参数来说实例化一个构造好的类型时,并在CIL中用Object引用替换类型参数,CLR都会重用以前生成好的泛型版本 09 9..NET BCL中有哪些泛型类型?...为什么说它很重要? 相同点:都不能被直接实例化,都通过继承实现其抽象方法 不同点: (1) 接口支持多继承;抽象类不能实现多继承。...委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 匿名方法:就是没有实际方法声明的委托实例。或者说,它们的定义是直接内嵌在代码中的。

    1.6K21

    .Net 框架

    表1列出了几个典型的,不同语言关键字与CIL类型的对应关系。笔者觉得理解重于记忆,所以这里只列出了几个。要了解其他基础类型时,只要将光标移动到类型上,然后再按下F12键就可以了。...方法的返回类型和参数类型必须是CLS兼容的,uint和sbyte类型并非CLS兼容,因此GetValue()和SetValue()方法不符合CLS。...它会从GAC、配置文件、程序集元数据中寻找这个类型,然后将它的类型信息加载到内存中的数据结构中。...在加载这个类以后,还会为它的每个方法插入一个存根(stub)。 验证。在CLR中,还存在一个验证程序(verifier),该验证程序的工作是在运行时确保代码是类型安全的。...这一步就是将托管的CIL代码编译为可以执行的机器代码的过程,由CLR的即时编译器(JIT Complier)完成。即时编译只有在方法的第一次调用时发生。回想一下,类型加载程序会为每个方法插入一个存根。

    1.9K21

    原 Introduction to the

    ,托管代码将所有托管栈帧连接起来,代码栈帧,至少可以始终可以找到与托管代码对应的堆栈块, 并枚举这些块中的托管帧。...每个看到创建文件和创建进程方法参数的人都会不会觉得这是个简单的方法。...).再这样一个不受控的环境中,通过静态代码来判断显式删除语句是否正确几乎是不可能,实际上, 确定删除是否正确的唯一方法是在运行时检查它。...在CLR中,开发人员有更多出错的可能,该方法的参数是一个列表,字符串,数值,还是别的什么。无法从方法的签名上面明确的区分,更糟的是,当一个方法返回一个对象,还能作为哪些方法的对象?...这些好处不会因为类型被放入列表或字典中而消失, 因此, 参数化类型是有用的。 唯一真正的问题是, 参数化类型是由 cil 生成时 "已编译" 的语言特定功能, 还是应在运行时具有第一个类支持。

    80990

    MSIL学习------从HelloWorld开始

    /instance  static 声明这个函数时静态函数     instance:声明这个函数时实例函数 cil managed  声明这个函数时CIL代码   了解了IL代码整体结构后接下来来看下方法...,方法体中通常包含三项:指令,标注了指令的标号和伪指令(在方法体外只有伪指令),在方法中像.entrypoint和.maxstack这类是伪指令,nop,ldstr这属于指定,而IL_0000属于指令标号...,指令标号作用是跳转时使用,所以自己写代码时没必要每行都加,只有在需要时加入即可,另外标号不会对伪指令进行标注   在上面C#代码中只定义了一个Main方法,但是在IL文件中却存在两个方法,其中一个方法就是定义的...  代表加载一个字符串到栈顶     call   方法调用指令,还有另一个方法调用指令为callvirl,在IL中调用方法使用是“::” 而不是C#中的“.”...,并且调用前要先声明其返回值类型和参数并不是C#的那种实参变量而是参数的类型,因为IL是一种严格基于栈的语言,方法时会按照参数列表去栈顶进行获取数据,调用完成后如果有返回值也会将返回值放入栈顶

    56930

    Unity引擎与C#脚本简介

    [ 图三:一个金属球体在场景中的效果图 ] 材质的另一个重要参数是法向图(Normal Map)。 法向就是物体表面的方向。...[ 图四:法向图示例 ] 一个3D模型的表面纹理被分割成一个个小三角形,而法向图就表示此表面的每个像素点位置的光照反射方向。...C#脚本语言 2.1 为什么需要脚本? 长久以来,游戏引擎开发都采用底层语言如C++来进行,这对于游戏上层开发来说,并不友好。...[ 图六:.NET CIL和CLR ] 2.2 IL是什么?...IL的所有指令都是基于虚拟堆栈的:调用函数前,先将参数push到虚拟堆栈里面;函数执行的时候,从虚拟堆栈里面取出参数,然后将结果压入虚拟堆栈。由于调用方式简单,IL语言的指令集也比较精简。

    4.7K90

    C# IL DASM 使用

    VS中增加IL DASM工具 我们在安装VS同时都会自动安装ildasm工具,无需另行安装。ildasm工具打开方法如下图: ?...已上信息填写完成后,在“工具”选择卡中能找到我们刚增加的外部工具名称(IL_DASM)。增加完成后可以小试一把。 国际惯例来段"Hello World"。...代码编写完后直接F6生成exe文件,然后工具-->IL_DASM-->确认(无需修改任何参数,默认目标文件路径)。系统会弹出IL工具,我们双击Main方法。 ?...这时可以看到Main方法在IL中编译的代码。感觉有点陌生不易看懂。 还有IL编译出现的三角型,正方型都是啥! IL DASM 基础 1.图标含义 ? 使用IL反编译出项目代码 ?...; 4)ldarg.0:表示转载第一个成员参数,在实例方法中指的是当前实例的引用; 5)call:call一般用于调用静态方法,因为静态方法是在编译期就确定的。

    1.1K31

    IL DASM反编译工具使用c# https:www.cnblogs.comcaokai520p4921706.html

    VS中增加IL DASM工具 我们在安装VS同时都会自动安装ildasm工具,无需另行安装。ildasm工具打开方法如下图: ?...(3)参数:点击右边三角形选择,这里选目标路径。 (4)初始目录:同上。 ? 已上信息填写完成后,在“工具”选择卡中能找到我们刚增加的外部工具名称(IL_DASM)。增加完成后可以小试一把。...代码编写完后直接F6生成exe文件,然后工具-->IL_DASM-->确认(无需修改任何参数,默认目标文件路径)。系统会弹出IL工具,我们双击Main方法。 ?...这时可以看到Main方法在IL中编译的代码。感觉有点陌生不易看懂。 还有IL编译出现的三角型,正方型都是啥! IL DASM 基础 1.图标含义 ? 使用IL反编译出项目代码 ?...; 4)ldarg.0:表示转载第一个成员参数,在实例方法中指的是当前实例的引用; 5)call:call一般用于调用静态方法,因为静态方法是在编译期就确定的。

    2.4K31

    【.Net底层剖析】2.stfld指令-给对象的字段赋值

    .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size...对象存放在堆上面 IL_0006:  stloc.0//将引用弹栈,存放到中的第一个变量中 IL_0007:  ldloc.0//将中第一个变量的值压入堆栈 IL...堆栈中存放12,test1的地址,第一个变量中存放的是test1的地址,堆中存放的是test1指向的一个对象,其中test1.i=100 在指令stfld 执行之后的内存图 ?...堆栈中的12,test1的地址弹出,第一个变量中存放的是test1的地址不变,堆中存放的是test1.i=12 六、总结 本篇主要讲的就是对象的字段如何在内存中是如何赋值的,以及从每一行...下篇我会从.net底层剖析参数的传递,有兴趣的可以关注我哦!

    1.3K60

    Blockly脚本执行

    积木代码编写 Blockly应用程序需要将积木转换为代码来执行。...在未卡合输入的情况下,此函数返回null,这就是为什么通常在函数后加上布尔值“或”和默认值的原因。...因此,在上面的示例中,如果没有积木附加到名为“ FROM”的输入,则此输入的默认代码将为字符串“ 0”。 第三个参数指定嵌入所需的操作信息的顺序。每种语言生成器都有一个优先顺序列表。...工作空间中的每个(非禁用)积木都将构成程序的一部分。如果有多个堆栈积木,则首先执行较高的堆栈。 工作空间可以随时导出为可执行代码。...这不是Blockly的默认外观,但可以通过设置Blockly.BlockSvg.START_HAT = true;或添加主题并在block style上设置hat选项来添加。

    1.5K20

    .NET Framework 框架的一些简单介绍

    【面向异构网络、硬件平台和操作系统,可以在多种多样的系统上运行,从服务器、桌面机到PDA和移动电话。】 2)行业标准。...【说明了.NET兼容编程语言的规则、属性和行为,其主题包括数据类型、类结构和参数传递】 3)CIL(Common Intermediate Language,公共中间语言)。...【GC自动从内存中删除程序不在访问的对象】 4)互操作性。...【集合、链表、队列、堆栈等数据类型】 3)Windows和Web等界面要素。【主要是按钮、标签、文本框、菜单等可视化控件】 4)Web Service要素。...源代码文件编译成CIL的编译过程: ? 程序运行时CIL编译成本机代码: ? .NET 框架编译和执行: ?

    1.3K40

    【小白学C#】浅谈.NET中的IL代码

    一、前言   前几天群里有位水友提问:”C#中,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是从复制的函数栈中拿数据“。...其实很明显,这和方法参数的传递方式有关,如果是引用传递的话,肯定是会去静态字段直接拿值的;如果方法是以传值的方式使用参数的话,一定是从复制的栈中拿值的。   ...;如果方法是以传值的方式使用参数的话,一定是从复制的栈中拿值的。...Ldarg 将参数(由指定索引值引用)加载到堆栈上。 Ldarg.0 将索引为 0 的参数加载到计算堆栈上。 Ldarg.1 将索引为 1 的参数加载到计算堆栈上。...Ldarg.2 将索引为 2 的参数加载到计算堆栈上。 Ldarg.3 将索引为 3 的参数加载到计算堆栈上。 Ldarg.S 将参数(由指定的短格式索引引用)加载到计算堆栈上。

    3K20

    忆芯科技:Flash2DRAM 动态数据加载

    数据被加载到系统内存,然后再传输到 GPU 的内存中,过程涉及多次数据拷贝,增加延迟和资源消耗。 2....核心技术 绕过 CPU 内存的直接数据传输 传统的数据路径需要将数据从存储设备加载到系统内存(通过 CPU),然后从系统内存拷贝到 GPU 显存。这种方式增加了延迟和资源消耗。...推理优化方法(Inference Optimization) Fig-5 计算型存储(CSD)在推理中的作用 左图示意基于计算型存储耦合的加速计算系统(尤其在边缘受限场景)。...CSD 提供硬件加速器和计算 CPU,能够在存储设备中完成部分计算任务,减少 GPU 的计算负担。 推理优化方法 QKV 优化 减少无效注意力头的计算,并分块处理注意力矩阵。...高频权重直接存储在 GPU/NPU 的 DRAM 中,低频权重则通过动态加载机制从 NAND 加载到 CSD 的 DRAM,再传输到 GPU,显著降低了 DRAM 占用和整体成本。

    9400

    1-泛型

    >,这是CIL开始支持泛型 //后引入的新特性,它指出为类指定的第一个类型参数的存在,表明这是 //一个类型参数 .method public hidebysig instance void Add(...但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数]; 泛型方法可以包含在泛型类型中,也可以包含在非泛型类型中[即普通的类型]。...泛型方法: public class GenericsMehod { //非泛型类中的泛型方法,参数约束为引用类型 //参数将引起编译错误> public int FindItem...泛型约束 为什么要有约束呢?...泛型约束支持四种形式的约束【接口约束,基类约束,构造器约束,值类型/引用类型约束】; 约束并不是必须的,如果没有指定约束,那么类型参数将只能访问System.Object类型中的公有方法。

    933100

    为将傅恒与魏璎珞的爱情上链,作为技术小白的我读了EVM上百行代码,终于搞定了

    以太坊中的不同数据类型 堆栈 以太坊虚拟机是一个基于堆栈的机器,这意味着它不在寄存器上运行,而是在虚拟堆栈上运行。堆栈的深度上限为1024,堆栈项的大小为256位。...事实上,以太坊虚拟机是一个256位的机器(这有利于Keccak256哈希计算和椭圆曲线计算)。堆栈是大多数操作码存储其参数的地方。...CALLDATALOAD 将32个字节的交易数据加载到堆栈中。 CALLDATACOPY 将多个字节的交易数据复制到内存中。...由于delegatecall操作码与内存中的数据一起操作,你需要将calldata复制到内存中。...以太坊虚拟机提供三个操作码用于与内存区域的交互: MLOAD 将一个字从内存加载到堆栈中。 MSTORE 将一个字保存到内存中。 MSTORE8 将一个字节保存到内存中。

    88830

    为什么2007年的图灵奖选择了模型检测技术

    为什么2007年的图灵奖选择了模型检测技术 像树一样成长,刚听完俞敏洪的在赢在中国的演讲----------题记 2007年图灵奖授予了在模型检测技术领域的奠基性贡献的科学家:Edmund...简单的说:是一套用于判断硬件和软件设计的理论模型是否满足规范的方法。...用来自动侦查 CIL 字节码错误的程序。目前的版本支持CIL的死锁 deadlocks 和 断言冲突 assertion violation 。...举个例子吧,在开发中,利用测试库junit 和 dotunit 写测试代码已经逐渐普及开了,比如下面这段: 注意上面加黑的这句: assert( (toppings.size()==0) );...当然,我也相信在更高级的人工智能技术中,模型检测技术会大展拳脚。 又是个遥远的事情,洗洗睡吧。

    89220
    领券