惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
V
V2EX
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
F
Full Disclosure
Y
Y Combinator Blog
V
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
SecWiki News
SecWiki News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
量子位
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
K
Kaspersky official blog
B
Blog
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
D
Docker
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - 无心三立

zz蚂蚁算法概述zz zz遗传算法 Genetic Algorithm 简介zz 推荐一个网站:我爱自然语言处理http://www.52nlp.cn/ zz几本自然语言处理入门书zz 机器学习的开源工具<转载> 噪声信道模型zz 如何成为一名成功的博士生[转载] 为什么读博士以及有什么意义[转载] The first of my blog write in English 拍电影--真实和虚拟 前天去听讲座 乔家大院 家居风水大全[ZT:http://sssyyyccc.blog.hexun.com/2641355_d.html] 没事就到博客看看,随便写点,成习惯了 Applied Microsoft .net framework Programming---Chapter 1 我的时间该怎么分配 转贴--生活小技巧--感觉不错,就贴上来了 厕所对联(纯属搞笑) 女教师与学生的精彩对答(超级爆笑)
蔡學鏞 - .NET中间语言
无心三立 · 2006-03-16 · via 博客园 - 无心三立

.NET CLR 和 Java VM 都是堆栈式虚拟机(Stack-Based VM)。Java VM有约200个指令,每个指令都是1byte的opcode,后面接不等的参数;.NET CLR 有超过220条指令,但有些是使用相同的opcode,大部分是1byte,但也有2byte的。

下面是一個簡單的 C# 原始碼:

using System;

public class Test {
    public static void Main(String[] args) {
        int i=1;
        int j=2;
        int k=3;
        int answer = i+j+k;
        Console.WriteLine("i+j+k="+answer);
    }
}

將此原始碼編譯之後,可以得到一個 EXE 檔案。我們可以透過 ILDASM.EXE 來反組譯 EXE 以觀察 IL。我將 Main() 的 IL 反組譯條列如下,這裡共有十八道 IL 指令,有的指令(例如 ldstr 與 box)後面需要接參數,有的指令(例如 ldc.i4.1 與 add)後面不需要接參數。

ldc.i4.1
stloc.0
ldc.i4.2
stloc.1
ldc.i4.3
stloc.2
ldloc.0
ldloc.1
add
ldloc.2
add
stloc.3
ldstr      "i+j+k="
ldloc.3
box        [mscorlib]System.Int32
call       string [mscorlib]System.String::Concat(object, object)
call       void [mscorlib]System.Console::WriteLine(string)
ret

此程式執行時,關鍵的記憶體有三種,分別是:

  • Managed Heap:這是動態配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執行時自動管理,整個 Process 共用一個 Managed Heap。
  • Call Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Call Stack。每呼叫一次 method,就會使得 Call Stack 上多了一個 Record Frame;呼叫完畢之後,此 Record Frame 會被丟棄。一般來說,Record Frame 內紀錄著 method 參數(Parameter)、返回位址(Return Address)、以及區域變數(Local Variable)。Java VM 和 .NET CLR 都是使用 0, 1, 2… 編號的方式來識別區域變數。
  • Evaluation Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Evaluation Stack。前面所謂的堆疊式虛擬機器,指的就是這個堆疊。

指令ldc是将参数存储至堆栈Evaluation Stack;zhi

指令stloc是将变量存储至堆栈Call Stack;後面有一連串的示意圖,用來解說在執行時此三種記憶體的變化。首先,在進入 Main() 之後,尚未執行任何指令之前,記憶體的狀況如圖 1 所示:

圖 1
圖 1

接著要