公司网站如何注册四川网站建设价格

web/2025/10/3 7:49:23/文章来源:
公司网站如何注册,四川网站建设价格,产品宣传册设计与制作,常州武进网站建设首先说说为什么要写这个系列#xff0c;大概有两点原因。这种文章阅读量确实高...对 IL 和 汇编代码 的学习巩固所以就决定写一下这个系列#xff0c;如果大家能从中有所收获#xff0c;那就更好啦#xff01;一#xff1a;params 应用层玩法 首先上一段 测试代码。class … 首先说说为什么要写这个系列大概有两点原因。这种文章阅读量确实高...对 IL 和 汇编代码 的学习巩固所以就决定写一下这个系列如果大家能从中有所收获那就更好啦一params 应用层玩法 首先上一段 测试代码。class Program{static void Main(string[] args){Test(100, 200, 300);Test();}static void Test(params int[] list){Console.WriteLine($list.length{list.Length});}}输出结果如下可以看出如果给 方法形参 加上 params 前缀在传递 方法实参 上就特别灵活点赞。接下来我们来看看这么灵活的 实参传递 底层到底是怎么玩的我们先从 IL 层面探究下。二IL 层面解读 用 ILSpy 打开我们的 exe 看看 IL 代码.method private hidebysig static void Main (string[] args) cil managed  {// Method begins at RVA 0x2050// Code size 37 (0x25).maxstack 8.entrypointIL_0000: nopIL_0001: ldc.i4.3IL_0002: newarr [mscorlib]System.Int32IL_0007: dupIL_0008: ldtoken field valuetype PrivateImplementationDetails/__StaticArrayInitTypeSize12 PrivateImplementationDetails::9AC9CF706FBD14D039E0436219C5D852927E5F69295F2EF423AE897345197B2AIL_000d: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)IL_0012: call void ConsoleApp2.Program::Test(int32[])IL_0017: nopIL_0018: ldc.i4.0IL_0019: newarr [mscorlib]System.Int32IL_001e: call void ConsoleApp2.Program::Test(int32[])IL_0023: nopIL_0024: ret } // end of method Program::Main.method private hidebysig static void Test (int32[] list) cil managed  {.param [1].custom instance void [mscorlib]System.ParamArrayAttribute::.ctor()  (01 00 00 00)// Method begins at RVA 0x2076// Code size 26 (0x1a).maxstack 8IL_0000: nopIL_0001: ldstr list.length{0}IL_0006: ldarg.0IL_0007: ldlenIL_0008: conv.i4IL_0009: box [mscorlib]System.Int32IL_000e: call string [mscorlib]System.String::Format(string, object)IL_0013: call void [mscorlib]System.Console::WriteLine(string)IL_0018: nopIL_0019: ret } // end of method Program::Test上面是 Main 和 Test 方法的IL代码我们逐一看一下。1. Test 方法从 int32[] list 参数看并没有所谓的 params这也就说明它是 C#编译器 玩的一个手段而已在方法调用前就已经构建好了。2. Main方法可以看到 IL 层面的 Test(100, 200, 300) 已经变成了下面五行代码。IL_0002: newarr [mscorlib]System.Int32IL_0007: dupIL_0008: ldtoken field valuetype PrivateImplementationDetails/__StaticArrayInitTypeSize12 PrivateImplementationDetails::9AC9CF706FBD14D039E0436219C5D852927E5F69295F2EF423AE897345197B2AIL_000d: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)IL_0012: call void ConsoleApp2.Program::Test(int32[])逻辑大概就是:用 newarr 构建初始化 int[] 数组。用 ldtoken 从程序元数据中提取 1,2,3。用 InitializeArray 来将 123 构建到数组中。有了这些指令我相信 JIT 就知道怎么做了。再看 Test() 的 IL 指令只有一行 newarr [mscorlib]System.Int32 初始化。所以本质上来说就是提前构建好 array然后进行参数传递仅此而已。。。三汇编层面解读 有了 newarr ldtoken call 三条指令接下来我们读一下汇编层做了什么使用 windbg 打开 exe简化后的汇编代码如下0:000 !U /d 009b0848 Normal JIT generated code ConsoleApp2.Program.Main(System.String[]) Begin 009b0848, size 77D:\net5\ConsoleApp4\ConsoleApp2\Program.cs  14:009b0848 55              push    ebp 009b0849 8bec            mov     ebp,esp 009b084b 83ec10          sub     esp,10h 009b084e 33c0            xor     eax,eax 009b0850 8945f4          mov     dword ptr [ebp-0Ch],eax 009b0853 8945f8          mov     dword ptr [ebp-8],eax 009b0856 8945f0          mov     dword ptr [ebp-10h],eax 009b0859 894dfc          mov     dword ptr [ebp-4],ecx 009b085c 833df042710000  cmp     dword ptr ds:[7142F0h],0 009b0863 7405            je      009b086a 009b0865 e816f55264      call    clr!JIT_DbgIsJustMyCode (64edfd80) 009b086a 90              nopD:\net5\ConsoleApp4\ConsoleApp2\Program.cs  15: 009b086b b95e186763      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 PERF (mscorlib_ni0x185e) (6367185e) 009b0870 ba03000000      mov     edx,3 009b0875 e8b229d5ff      call    0070322c (JitHelp: CORINFO_HELP_NEWARR_1_VC) 009b087a 8945f4          mov     dword ptr [ebp-0Ch],eax 009b087d b9e04d7100      mov     ecx,714DE0h 009b0882 e819c91f64      call    clr!JIT_GetRuntimeFieldStub (64bad1a0) 009b0887 8945f8          mov     dword ptr [ebp-8],eax 009b088a 8d45f8          lea     eax,[ebp-8] 009b088d ff30            push    dword ptr [eax] 009b088f 8b4df4          mov     ecx,dword ptr [ebp-0Ch] 009b0892 e8f9c61f64      call    clr!ArrayNative::InitializeArray (64bacf90) 009b0897 8b4df4          mov     ecx,dword ptr [ebp-0Ch] 009b089a ff15904d7100    call    dword ptr ds:[714D90h] (ConsoleApp2.Program.Test(Int32[]), mdToken: 06000002) 009b08a0 90              nopD:\net5\ConsoleApp4\ConsoleApp2\Program.cs  16: 009b08a1 b95e186763      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 PERF (mscorlib_ni0x185e) (6367185e) 009b08a6 33d2            xor     edx,edx 009b08a8 e87f29d5ff      call    0070322c (JitHelp: CORINFO_HELP_NEWARR_1_VC) 009b08ad 8945f0          mov     dword ptr [ebp-10h],eax 009b08b0 8b4df0          mov     ecx,dword ptr [ebp-10h] 009b08b3 ff15904d7100    call    dword ptr ds:[714D90h] (ConsoleApp2.Program.Test(Int32[]), mdToken: 06000002) 009b08b9 90              nopD:\net5\ConsoleApp4\ConsoleApp2\Program.cs  17: 009b08ba 90              nop 009b08bb 8be5            mov     esp,ebp 009b08bd 5d              pop     ebp 009b08be c3              ret1. newarr可以很清楚的看到newarr 调用了 CLR 中的jithelper函数 CORINFO_HELP_NEWARR_1_VC 下的  JIT_NewArr1 方法大家有兴趣可以看下 jitheapler.cpp调用完之后初始化数组就出来了。从dp看数组只申明了 length3,还并没有数组元素也就说所谓的初始化。2. ldtoken InitializeArray刚才也说到了, ldtoken 是在运行时提取元数据那就必须要解析 PE 头在 clr 层面有一个 PEDecoder::GetRvaData 方法就是用来解析运行时数据它是发生在 ArrayNative::InitializeArray 方法中所以我们下两个 bu 命令拦截。0:000 bu clr!ArrayNative::InitializeArray 0:000 bu clr!PEDecoder::GetRvaData 0:000 g Breakpoint 3 hit eax0019f500 ebx0019f5ac ecx024c2338 edx006fb930 esi00000000 edi0019f520 eip64bacf90 esp0019f4f0 ebp0019f508 iopl0         nv up ei pl zr na pe nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000246 clr!ArrayNative::InitializeArray: 64bacf90 6a78            push    78h 0:000 g Breakpoint 0 hit eax00713448 ebx00624044 ecx0071344c edx0071dc28 esi00624044 edi00624de0 eip64befcfc esp0019f400 ebp0019f410 iopl0         nv up ei pl zr na pe nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000246 clr!PEDecoder::GetRvaData: 64befcfc 55              push    ebp 0:000 k # ChildEBP RetAddr       00 0019f410 64b63be5     clr!PEDecoder::GetRvaData 01 0019f410 64b63bb3     clr!Module::GetRvaField0x40 02 0019f44c 64bad0a7     clr!FieldDesc::GetStaticAddressHandle0xdd 03 0019f4ec 00680897     clr!ArrayNative::InitializeArray0x11a 0:000 bp 64b63be5 0:000 g eax00402928 ebx00624044 ecx0071344c edx0071dc28 esi00624044 edi00624de0 eip64b63be5 esp0019f40c ebp0019f410 iopl0         nv up ei pl nz na pe nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000206 clr!Module::GetRvaField0x40: 64b63be5 5e              pop     esi从输出看上面的 GetRvaField 方法的返回值会送到 eax 上接下来我们验证下 eax 上的值是不是参数 100200300 。0:000 dp eax L3 00402928  00000064 000000c8 0000012c上面三个就是 16进制的表示接下来我们再验证下这三个值是怎么赋到初始化数组中的可以用 ba 命令对 内存地址 进行拦截。0:000 ba r4 023e2338  0x8 0:000 ba r4 023e2338  0x8  0x4 0:000 ba r4 023e2338  0x8  0x4  0x4 0:000 g Breakpoint 3 hit eax0000000c ebx00000000 ecx00000003 edx00000064 esi00402928 edi023e2340 eip6a91d68b esp0019f440 ebp0019f4ec iopl0         nv up ei pl nz na pe nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000206 VCRUNTIME140_CLR0400!memcpy0x50b: 6a91d68b 83c704          add     edi,4 0:000 g Breakpoint 4 hit eax0000000c ebx00000000 ecx00000002 edx000000c8 esi0040292c edi023e2344 eip6a91d68b esp0019f440 ebp0019f4ec iopl0         nv up ei pl nz na po nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000202 VCRUNTIME140_CLR0400!memcpy0x50b: 6a91d68b 83c704          add     edi,4 0:000 g Breakpoint 5 hit eax0000000c ebx00000000 ecx00000001 edx0000012c esi00402930 edi023e2348 eip6a91d68b esp0019f440 ebp0019f4ec iopl0         nv up ei pl nz na po nc cs0023  ss002b  ds002b  es002b  fs0053  gs002b             efl00000202 VCRUNTIME140_CLR0400!memcpy0x50b: 6a91d68b 83c704          add     edi,40:000 dp 023e2338 L5 023e2338  6368426c 00000003 00000064 000000c8 023e2348  0000012c接下来稍微解释下 ba r4 023e2338 0x8 命令。023e2338 是初始化数组的首地址。023e23380x8 初始化数组第一个元素的地址。023e2338 0x8 0x4  初始化数组第二个元素的地址。r4  按4byte对地址块读写进行监控。当三个断点命中后可以看到初始化数组 023e2338 上的三个元素值都已经填上了就说这么多吧相信大家对 params 机制有一定的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

口碑好的高密网站建设怀仁网站建设

记录访问日志可以起到非常重要的作用,它不仅记录了API的使用情况,更可以反映API各种相关数据;通过分析日志可以得到API不同时间的负载情况,访问效率和流量分布,更进一步还能分析出用户的操作历史和行为这是非常有价值的…

j永久网站厦门建设局地址

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

泉州市网站建设重生北京上大学开网吧做网站的小说

1. 概述1.1 什么是Java语言Java语言:面向对象的程序设计语言与机器无关的二进制格式的类文件Java虚拟机(用来执行类文件)完整的软件程序包(跨平台的API和库)1.1.1 Java语言特点语法简单,功能强大分布式与安全性与平台无关解释、编译两种运行方式多线程动…

专业手机网站建设推荐下载2345浏览器并安装

和2.x不同的是,要用 action 来配置后端上传图片的接口地址; 再来一些配置项的命名有所不同,一般1.x的命名用 -,2.x的命名使用小驼峰; 1.x 的上传会自带删除时的提示框,2.x 没有; 重要的几个配置…

网站做一样没有侵权吧做快递网站难吗

文章目录 一、引言二、应用启动优化2.1 懒加载概念1. **懒加载的应用场景:**2. **Qt中的懒加载方式:**3. **示例 - C++中的懒加载:**4. **示例 - QML中的懒加载:**2.2 异步加载1. **异步加载的应用场景:**2. **实现异步加载的方式:**3. **示例 - 使用Qt的异步网络请求:*…

连云港东海县做网站微信公众号推广软文案例

SOCKS:防火墙安全会话转换协议 (Socks: Protocol for sessions traversal across firewall securely) SOCKS协议提供一个框架,为在 TCP和UDP域中的客户机/服务器应用程序能更方便安全地使用网络防火墙所提供的服务。协议工作在OSI…

电商网站开发需要什么语言岳阳君山

C语言中的char是用于声明单个字符的关键字。char关键字具有一些很奇怪的特点,但是想要了解这些奇怪的特点为什么会存在,我们就要先了解char关键字的原理。char关键字会在内存中找到一字节的空闲空间,并且在里面写入一个从0到255的整型&#x…

租房网站建设怎么做蛋糕店的网站

Java 9发布至今已经有半年之久,Spring Boot对其的支持进度也快接近完成,本文就来整理一下在Java 9上运行Spring Boot的一些要点。 必须使用Spring Boot2.0 在Spring Boot的版本计划中明确说明了2.0版本开始才对Java 9进行支持,而1.x版本暂时…

淄博网络公司全网推广百度seo网站优化服务

1、windows安装SD卡格式化软件:SDFormatter.exe 2、windows安装系统烧录软件Win32DiskImager.exe 3、下载镜像:https://www.raspberrypi.org/downloads/raspbian/ 并解压缩 4、用Win32DiskImager将下载的镜像文件烧录进SD卡。 5、插上SD到树莓派&…

商城外贸网站设计重庆旗帜制作

这两天刚装好Windows 7,碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境,所以打算勤劳下,手动一步步搭建PHP环境,暂且不使用PHP环境搭建软件了,在此详细图解在Windows 7下安装配置PHPApacheMysql环境的教程&#…

集团企业网站建设方案策划书保定网站建设服务平台

在我国的国民经济发展中,石油化工产业是重要的能源基础工业,但是废气的治理问题一直困扰着许多企业。直到RTO蓄热式焚烧炉的面世,为石油化工行业的废气治理带来了新希望。如今,有机废气治理工作越来越受到广泛重视,传统…

网站建设目录手机写文章用wordpress

摘 要 网络的广泛应用给生活带来了十分的便利。所以把考研教室在线预约与现在网络相结合,利用java语言建设考研教室在线预约系统,实现考研教室在线预约的信息化。则对于进一步提高考研教室在线预约发展,丰富考研教室在线预约能起到不少的促进…

网站维护中是怎么回事福建省建设招投标网站

[软技能] 在前后端分离项目里,请说说前端传递的token的流程? (一):cookie前端 post 账号密码,后端 response header: set-cookie, 将 token 插入 cookie 内,之后每次针对该域名下的请求都会带上…

延吉最好的网站建设公司网络推广网站建设

7-1 数塔 数塔如图所示&#xff0c;若每一步只能走到相邻的结点&#xff08;图中有数字的方格&#xff09;&#xff0c;则从最顶层走到最底层所经过的所有结点的数字之和最大是多少&#xff1f;测试数据保证结果不大于231−1。 C #include <bits/stdc.h> using namespa…

装潢设计师培训班学费苏州seo外包

前面第1版写好后&#xff0c;很凌乱&#xff0c;主要的问题在于&#xff0c;Python不支持方法重载&#xff0c;想要灵活创建对象&#xff0c;当时的变通办法是&#xff0c;先链式地有选择地设置属性(方法重载的本质就是有选择地设置属性)&#xff0c;再做实例化&#xff0c;这样…

网站建设团队哪个最好移动互联网开发心得

第一章&#xff1a; 介绍软件工程和软件的关系&#xff0c;软件程序软件工程。 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。 计算机科学这一学术领域可以分为以下这些偏理论的领域&#xff1a; 1.计算机理论 2.信息和编码理论 3.算法和数…

学习网站后台维护中国空间站什么时候建成

作者推荐 视频算法专题 本文涉及知识点 数学 回溯 字符串 性能优化 LeetCode1307. 口算难题 给你一个方程&#xff0c;左边用 words 表示&#xff0c;右边用 result 表示。 你需要根据以下规则检查方程是否可解&#xff1a; 每个字符都会被解码成一位数字&#xff08;0 - …

云南省网站备案网站开发信息发布

Thread类中的yeild方法有什么作用 谦让机制&#xff1a;Thread.yield()方法主要用于实现线程间的礼让或谦让机制。当某个线程执行到yield()方法时&#xff0c;它会主动放弃当前已获得的CPU执行权&#xff0c;从运行状态&#xff08;Running&#xff09;转变为可运行状态&#…

中介网站模板长沙3合1网站建设公司

车辆工程计算机编程&#xff1a;深度探索与未来挑战 随着科技的不断进步&#xff0c;车辆工程领域与计算机编程的交融日益紧密&#xff0c;为行业发展注入了新的活力。然而&#xff0c;对于许多人来说&#xff0c;车辆工程计算机编程究竟学什么&#xff0c;仍是一个充满困惑和…

架设销售网站免费网站安全软件大全

Django模型入门 为了能够学会使用Django模型&#xff0c;本节通过构建一个实际的Django模型来帮助读者尽快入门。 3.2.1 定义模型 既然Django模型实现了ORM功能&#xff0c;那么它就是对数据库实例的描述和实现。下面&#xff0c;我们通过一个简单的实例进行讲解。 如果需…