返回首页

简介
要真正能够编程。NET,一个好的程序员会发现自己使用ILDASM中,MSIL反汇编程序,定期。这就需要在最低限度的能力,在阅读的MSIL的主管。不幸的是,最好的方式来学习阅读的MSIL是花一些时间来写它!因此,我思考的东西,我可以写,这将不会太大,但涵盖的概念,足以给我的能力,阅读的MSIL。
我记得有一个上大学的朋友,当他正在学习一门新的语言,将永远作为他的第一段代码生成曼德勃罗集(一个Mandelbrot集后记书面很有趣)。这似乎能够做的,所以我选择写在MSIL Mandelbrot集发电机。
代码使用Windows窗体显示一个新的窗口,然后绘制到这个图形表面像素。编译
编译的代码,只需通过ILASM / EXE mandelbrot.il。请记住,在您的路径ILASM - NET框架SDK的bin文件夹中的批处理文件corvars.bat会为您添加。
这应该产生在同一文件夹mandelbrot.exe。
{S0}该代码
代码继承System.Windows.Form和管理自己的画。


.class public auto ansi MandelBrotIL extends [System.Windows.Forms]System.Windows.Forms.Form {


这个类重写的OnPaint()System.Windows.Forms.Form中的方法(它继承)。 OnPaint中简单设置上绘制的图形,然后调用DrawMandelbrot()做实际的绘制:{C}
DrawMandelbrot()简单地实现的基本曼德尔布罗算法,其中的细节,可以发现在互联网上的许多地方。

.method private hidebysig instance 

           void DrawMandelbrot(class [System.Drawing]System.Drawing.Graphics g,

                               float32 fpMandelWidth, int32 ipIterations) cil managed {



    .locals (

    [0] float32 x, // Complex Real portion

    [1] float32 y, // Complex Imaginary portion

    [2] float32 fpGranularity, // Resolution of image on screen

    [3] int32 ipPixelX, // X position on screen

    [4] int32 ipPixelY, // Y position on screen

    // Escape Velocity locals

    [5] float32 fpX,

    [6] float32 fpY,

    [7] float32 fpXTemp,

    [8] float32 fpYTemp,

    [9] float32 fpX2, // X Squared

    [10] float32 fpY2, // Y Squared

    [11] int32 i // Loop variable used to calc escape velocity

    )

    // Calculate Granularity

    ldc.r4 4

    ldarg fpMandelWidth

    div

    stloc fpGranularity





    // Initialise point on screen

    ldc.i4.0

    dup

    stloc ipPixelX

    stloc ipPixelY





    // Start the real portion off

    ldc.r4 -2.5

    stloc x



NextReal:



    // Start the imaginary portion off

    ldc.r4 -1.5

    stloc y



NextImaginary:



    // Calculate Escape Velocity



    // Initialise locals

    ldloc x

    stloc fpX



    ldloc y

    stloc fpY



    ldloc x

    dup

    mul

    stloc fpX2



    ldloc y

    dup

    mul

    stloc fpY2





    // Initialise i

    ldc.i4.0

    stloc i

NextIteration:





    ldloc x

    ldloc fpX2

    ldloc fpY2

    sub

    add

    stloc fpXTemp



    ldloc y

    ldloc fpY

    ldloc fpX

    ldc.r4 2

    mul

    mul

    add

    stloc fpYTemp



    // Calculate X squared

    ldloc fpXTemp

    dup

    mul

    stloc fpX2



    // Calculate Y squared

    ldloc fpYTemp

    dup

    mul

    stloc fpY2



    // If X Squared plus Y Squared is greater than 4, then we are guaranteed 

    // divergence to Infinity

    ldloc fpX2

    ldloc fpY2

    add

    ldc.r4 4

    bge Divergence



    // The previous values in the sequence become the current values in the sequence

    ldloc fpXTemp

    stloc fpX

    ldloc fpYTemp

    stloc fpY





    // Incrememt i

    ldc.i4.1

    ldloc i

    add

    stloc i



    ldloc i

    ldarg ipIterations

    blt NextIteration // Assume convergence to zero if we reach our iteration limit



Divergence:



    // Draw Pixel. i is now the escape velocity



    // Load the Graphics context

    ldarg g



    // Calculate the color based on the escape velocity





    ldarg ipIterations

    ldloc i

    sub

    stloc i



    // Red

    ldloc i

    ldc.i4 12

    mul

    ldc.i4 256

    rem



    // Green

    ldloc i

    ldc.i4 16

    mul

    ldc.i4 256

    rem



    // Blue

    ldloc i

    ldc.i4 5

    mul

    ldc.i4 256

    rem



    call value class [System.Drawing]System.Drawing.Color 



                           [System.Drawing]System.Drawing.Color::FromArgb(int32,

                                                                          int32,

                                                                          int32)





    // Create a new Pen on the stack

    ldc.r4 1

    newobj instance void [System.Drawing]System.Drawing.Pen::.ctor(value class 

                                              [System.Drawing]System.Drawing.Color,

                                                float32)



    // Load the coords of the point to draw

    ldloc ipPixelX

    ldloc ipPixelY



    // Width and Height

    ldc.i4.2

    dup



    call instance void [System.Drawing]System.Drawing.Graphics::DrawRectangle(class 

                                               [System.Drawing]System.Drawing.Pen,

                                                int32,

                                                int32,

                                                int32,

                                                int32)



    // Next PixelY

    ldc.i4.1

    ldloc ipPixelY

    add

    stloc ipPixelY



    // Advance through the imaginary portion

    ldloc y

    ldloc fpGranularity

    add

    stloc y



    ldloc y

    ldc.r4 1.5

    blt NextImaginary



    // Advance through ipPixelX

    ldc.i4.1

    ldloc ipPixelX

    add

    stloc ipPixelX



    // Start at the top of the screen for the next column

    ldc.i4.0

    stloc ipPixelY



    // Advance through the real portion

    ldloc x

    ldloc fpGranularity

    add

    stloc x



    ldloc x

    ldc.r4 1.5

    blt NextReal



    ret

} // method

回答

评论会员:德鲁Noakes 时间:2011/11/28
...比较你的手反对,旋转的MSIL的C#编译器产生的

我好奇地想知道是否直接编写良好的MSIL提供了一个以上的生产质量好的编译器,假设的基本算法的性能优势是等价的。

据我所知,JIT提供另一层优化,所以它可能不会按照较少的IL指令等同于更快的操作。

此外,有没有白细胞介素"成本"提供的图表?我想类似解释对于一个给定的指令所需的时钟周期。
的CPU制造商公布的
酷文章。感谢。

德鲁Noakes
{A}
评论会员:TanoFaye 时间:2011/11/28

我想知道,如果存在任何工具转换为十六进制的MSIL语言。
感谢
评论会员:背后的场景 时间:2011/11/28
??这使得毫无意义的。

ROFLOLMFAO
评论会员:马克克利夫顿 时间:2011/11/28
!很高兴地看到贵国的实施

你可能会喜欢:



马克



灵敏度和民族的多样性意味着庆祝差异,而不是隐藏它。 - 基督教Graus
每行代码是一种责任 - 塔卡村冈
评论会员:。Barrett808 时间:2011/11/28
我要学习MSIL,但知道小
如果你知道,我可以学习MSIL或以任何方式任何网站,请帮助我。
我会很欣赏它。

评论会员:sultan_of_6string 时间:2011/11/28
获取"。微软内部NET IL汇编",由Serge Lidin

吉姆
评论会员:理查德Birkby 时间:2011/11/28
System.IO.FileNotFoundException
评论会员:理查德Birkby 时间:2011/11/28
代码是净承保β1和在2001年中期升级到Beta2的。我怀疑您所看到的错误是在功能上的Beta2和1.0版本之间的差异。。NET

我已经提交更新后的代码编译和运行上净V1 RTM。应该很快上市。
评论会员:克里斯Losinger 时间:2011/11/28
您尝试您最难的,但不能请大家...
收稿日期codeproject.com([207.219.70.3])与微软SMTPSVC(5.0.2195.4905)hotmail.com;周四,2002年5月30日5时47分06秒-0700
收稿日期:从relay.psi.ca [207.219.70.147]
在周四5月30日8点30分四十秒2002年codeproject.com
Codepro邮件服务器(R2hhemkgVyBOb3YgMDYA);
本站由登打士TCP / IP 4.0企业版(www.dundas.com)
:fdf@df.cm
为:"理查德Birkby"
主题:[在CodeProject] Mandelbrot集在MSIL
日期:周四,2002年5月30日八点50分十九秒-0400
X -梅勒:登打士梅勒控制1.0
组织:代码项目 - http://www.codeproject.com
消息ID:
返回路径:fdf@df.cm
X - OriginalArrivalTime:2002年5月30日12:47:06.0314(UTC)FILETIME = [1AC36AA0:01C207D8]

你吸

评论会员:乔尔马蒂亚斯 时间:2011/11/28
anonomous人Braindead消息应被视为一种恭维理查德

评论会员:基督教Graus 时间:2011/11/28
,这是一种方式做