翻开书第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