前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET9运行模型-IL-IR-MC

.NET9运行模型-IL-IR-MC

作者头像
江湖评谈
发布2024-03-14 15:45:39
780
发布2024-03-14 15:45:39
举报
文章被收录于专栏:天下风云天下风云

前言

本篇看下.NET9下面的C#源码到机器码的全过程运行模型--顶级技术展示。CLR/JIT干预了全过程。

源码

简单的例子:

代码语言:javascript
复制
static void Main(string[] args)
{
   Console.WriteLine("Call Main");
}

IL

以上C#源码的IL如下:

代码语言:javascript
复制
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) 
  // 代码大小       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Call Main"
  IL_0006:  call       void [System.Console]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

导入到JIT的IL二进制机器码

代码语言:javascript
复制
IL to import:
IL_0000  00                nop         
IL_0001  72 01 00 00 70    ldstr        0x70000001
IL_0006  28 0e 00 00 0a    call         0xA00000E
IL_000b  00                nop         
IL_000c  2a                ret

IR

IL在JIT的中间表象IR:

代码语言:javascript
复制
fgMorphTree BB02, STMT00001 (before)
               [000001] -----------                         *  NO_OP     void  

fgMorphTree BB02, STMT00002 (before)
               [000003] --C-G------                         *  CALL      void   System.Console:WriteLine(System.String)
               [000002] ----------- arg0                    \--*  CNS_STR   ref   <string constant>
Initializing arg info for 3.CALL:
Args for call [000003] CALL after AddFinalArgsAndDetermineABIInfo:
CallArg[[000002].CNS_STR ref (By value), 1 reg: rdi, byteAlignment=8]

Morphing args for 3.CALL:

Sorting the arguments:
Deferred argument ('rdi'):
               [000014] H----+-----                         *  CNS_INT(h) ref     'Call Main'

Moved to late list

Register placement order:    rdi 
Args for [000003].CALL after fgMorphArgs:
CallArg[[000014].CNS_INT ref (By value), 1 reg: rdi, byteAlignment=8, isLate, processed]
OutgoingArgsStackSize is 0


fgMorphTree BB02, STMT00002 (after)
               [000003] --CXG+-----                         *  CALL      void   System.Console:WriteLine(System.String)
               [000014] H----+----- arg0 in rdi             \--*  CNS_INT(h) ref     'Call Main'


fgMorphTree BB02, STMT00003 (before)
               [000004] -----------                         *  NO_OP     void  

fgMorphTree BB02, STMT00004 (before)
               [000005] -----------                         *  RETURN    void

MC

中间表象最后生成的Machine(机器码)如下:

代码语言:javascript
复制
IN0009: 000000 push     rbp
IN000a: 000001 sub      rsp, 16
IN000b: 000005 lea      rbp, [rsp+0x10]
IN000c: 00000A mov      gword ptr [V00 rbp-0x08], rdi

G_M27759_IG02:        ; offs=0x00000E, size=0x0009, bbWeight=1, PerfScore 4.00, gcrefRegs=0000 {}, byrefRegs=0000 {}, BB02 [0003], byref, isz

IN0001: 00000E cmp      dword ptr [(reloc 0x7fff79253d38)], 0
IN0002: 000015 je       SHORT G_M27759_IG04

G_M27759_IG03:        ; offs=0x000017, size=0x0005, bbWeight=0.50, PerfScore 0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, BB03 [0004], byref

IN0003: 000017 call     CORINFO_HELP_DBG_IS_JUST_MY_CODE

G_M27759_IG04:        ; offs=0x00001C, size=0x0013, bbWeight=1, PerfScore 4.00, gcrefRegs=0000 {}, byrefRegs=0000 {}, BB05 [0001], byref

IN0004: 00001C nop      
IN0005: 00001D mov      rdi, 0x7FFFE6BFF818      ; 'Call Main'

IN0006: 000027 call     [System.Console:WriteLine(System.String)]
IN0007: 00002D nop      
IN0008: 00002E nop      

G_M27759_IG05:        ; offs=0x00002F, size=0x0006, bbWeight=1, PerfScore 1.75, epilog, nogc, extend

IN000d: 00002F add      rsp, 16
IN000e: 000033 pop      rbp
IN000f: 000034 ret

结尾

以上就是一个最简单的Hello World在CLR/JIT的作用下一步步变成机器码的全过程。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-07,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 源码
  • IL
  • IR
  • MC
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com