SUMTEC -- There's a thing in my bloglet.

But it's not only one. It's many. It's the same as other things but it exactly likes nothing else...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  263 随笔 :: 19 文章 :: 3009 评论 :: 74万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

翻开书第176页,看第3道题……还记得中学的时候,老师就是这么说的吗?

现在我要说:
用ILDasm.EXE(VS2003在E:\VS.NET 2003\SDK\v1.1\bin里面,VS2002在E:\VS.NET\FrameworkSDK\bin 里面)打开mscorlib.dll(在C:\WINNT\Microsoft.NET\Framework\v1.x.xxxx 里面),找到System,打开,在里面找DateTime,打开,在里面找DateToTicks,双击。好了,现在开始跟我一步步来:

CIL
C#

.method private hidebysig static int64 DateToTicks(int32 year,
?int32 month,
?int32 day) cil managed
{
// 代码大小 126 (0x7e)
.maxstack 5
.locals (int32[] V_0,
int32 V_1,
int32 V_2)
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: blt.s IL_006e
IL_0004: ldarg.0
IL_0005: ldc.i4 0x270f
IL_000a: bgt.s IL_006e
IL_000c: ldarg.1
IL_000d: ldc.i4.1
IL_000e: blt.s IL_006e

IL_0010: ldarg.1

IL_0011: ldc.i4.s 12

IL_0013: bgt.s IL_006e

IL_0015: ldarg.0

IL_0016: call bool System.DateTime::IsLeapYear(int32)
IL_001b: brtrue.s IL_0024
IL_001d: ldsfld int32[] System.DateTime::DaysToMonth365
IL_0022: br.s IL_0029
IL_0024: ldsfld int32[] System.DateTime::DaysToMonth366
IL_0029: stloc.0
IL_002a: ldarg.2
IL_002b: ldc.i4.1





IL_002c: blt.s IL_006e





IL_002e: ldarg.2
IL_002f: ldloc.0
IL_0030: ldarg.1




IL_0031: ldelem.i4






IL_0032: ldloc.0
IL_0033: ldarg.1
IL_0034: ldc.i4.1
IL_0035: sub
IL_0036: ldelem.i4
IL_0037: sub

IL_0038: bgt.s IL_006e






IL_003a: ldarg.0
IL_003b: ldc.i4.1
IL_003c: sub
IL_003d: stloc.1
IL_003e: ldloc.1
IL_003f: ldc.i4 0x16d
IL_0044: mul


IL_0045: ldloc.1
IL_0046: ldc.i4.4
IL_0047: div
IL_0048: add
IL_0049: ldloc.1
IL_004a: ldc.i4.s 100
IL_004c: div


IL_004d: sub
IL_004e: ldloc.1
IL_004f: ldc.i4 0x190
IL_0054: div
IL_0055: add
IL_0056: ldloc.0
IL_0057: ldarg.1
IL_0058: ldc.i4.1


IL_0059: sub
IL_005a: ldelem.i4
IL_005b: add
IL_005c: ldarg.2
IL_005d: add
IL_005e: ldc.i4.1
IL_005f: sub
IL_0060: stloc.2


IL_0061: ldloc.2
IL_0062: conv.i8
IL_0063: ldc.i8 0xc92a69c000
IL_006c: mul
IL_006d: ret







IL_006e: ldstr "ArgumentOutOfRange_BadYearMonthDay"
IL_0073: call string System.Environment::GetResourceString(string)
IL_0078: newobj instance void System.ArgumentOutOfRangeException::.ctor(string)
IL_007d: throw
} // end of method DateTime::DateToTicks







>year
>year 1
>if (!(year < 1)) { }
>if (year >= 1) {year}
>if (year >= 1) {year 0x270f}
>if (year >= 1 && (!(year > 0x270f))) { }
>if (year >= 1 && year <= 0x270f) {month}
>if (year >= 1 && year <= 9999) {month 1}
>if (year >= 1 && year <= 9999 && (!(month<1))) { }
>if (year >= 1 && year <= 9999 && month >= 1) {month}
>if (year >= 1 && year <= 9999 && month >= 1) {month 12}
>if (year >= 1 && year <= 9999 && month >= 1 && (!(month > 12))) { }
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) {year}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) {IsLeapYear(year)}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
?{
?? V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
?}

>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
?{
?? V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
?? day 1
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && (!(day < 1)))
?{
?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
? }
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1)
?{
?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
?? day V_0 month
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1)
?{
?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
?? day V_0[month]
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1)
?{
?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366;
?? day V_0[month] - V_0[month - 1]
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && (!(day > (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])))
?{
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])
?{
?? V_1 = year - 1;
?? V_1 * 0x16d
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])
?{
?? V_1 = year - 1;
?? V_1 * 365 + V_1 / 4 V_1 / 100
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])
?{
?? V_1 = year - 1;
?? V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 0x190 V_0 month 1
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])
?{
?? V_1 = year - 1;
?? V_2 = V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 400 + V_0[month - 1] + day - 1;
?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1])
?{
?? V_1 = year - 1;
?? V_2 = V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 400 + V_0[month - 1] + day - 1;
?? return ((long) V_2) * 0xc92a69c000; // 864000000000 = 24 * 60 * 60 * 10000000
?}
else
?{
?? throw new ArgumentOutOfRangeException(Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay"));
?}

注意:这里C#一列中,某一个“>”(a)到下一个“>”(b)之间的C#代码,表示到(b)所对应的左边的IL为止,翻译出来的C#代码。

呵呵,希望不是很难阅读。


文章来源:http://dotnet.blogger.cn/sumtec/articles/211.aspx
posted on   Sumtec  阅读(1271)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示