﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Evily的Blog </title><link>http://www.cnblogs.com/zoujiaxue/</link><description>天行有常，不为尧存，不为桀亡。天地之行无知无觉，溶溶泄泄，和谐自然，何论什么善恶？</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 08:22:01 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 08:22:01 GMT</pubDate><ttl>60</ttl><item><title>找工作喽!</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/07/03/1235061.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Thu, 03 Jul 2008 12:51:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/07/03/1235061.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1235061.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/07/03/1235061.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1235061.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1235061.html</trackback:ping><description><![CDATA[&nbsp;
<div align="center">
<table style="border-right: medium none; border-top: medium none; border-left: medium none; width: 426.75pt; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="569" border="1">
    <tbody>
        <tr style="height: 1cm; page-break-inside: avoid">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; width: 50.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="68">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">姓名</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 88.25pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="118">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">邹加学</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 35.9pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="48">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">性别</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 35.35pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="47">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">男</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 64.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="86">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">出生年月</span></p>
            </td>
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: windowtext 2.25pt double; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 151.3pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="202" colspan="2">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">1985.12.12</span></strong></p>
            </td>
            <td style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: windowtext 1pt solid" width="1"></td>
        </tr>
        <tr style="height: 1cm; page-break-inside: avoid">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; width: 50.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="68">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">民族</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 88.25pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="118">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">汉</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 35.9pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="48">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">政治面貌</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 35.35pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="47">
            <p><strong><span style="font-family: 宋体">中共党员</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 64.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="86">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">身高</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 135.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" width="181">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">172cm</span></strong></p>
            </td>
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 16.2pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="22" colspan="2" rowspan="3"></td>
        </tr>
        <tr style="height: 23.85pt; page-break-inside: avoid">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; width: 50.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 23.85pt" width="68">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">学历</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 159.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 23.85pt" width="213" colspan="3">
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体">本科</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 64.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 23.85pt" width="86">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">户籍</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 135.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 23.85pt" width="181">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">湖北黄冈</span></strong></p>
            </td>
        </tr>
        <tr style="height: 1cm; page-break-inside: avoid">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; width: 50.75pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="68">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">专业</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 88.25pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="118">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">信息与计算科学</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 71.25pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="95" colspan="2">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">毕业学校</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 200.3pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="267" colspan="2">
            <p style="text-indent: 31.6pt"><strong><span style="font-family: 宋体">武汉科技大学</span></strong></p>
            </td>
        </tr>
        <tr style="height: 1cm; page-break-inside: avoid">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; width: 50.75pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="68">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">联系电话</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 88.25pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="118">
            <p style="text-align: center" align="center"><strong><span style="font-family: 宋体">13477031014</span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 71.25pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="95" colspan="2">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">电子邮箱</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 200.3pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="267" colspan="2">
            <p style="text-indent: 31.6pt"><strong><span style="font-family: 宋体">zoujiaxue00@126.com</span></strong></p>
            </td>
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 16.2pt; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 1cm" width="22" colspan="2"></td>
        </tr>
        <tr style="height: 27.5pt">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 27.5pt" colspan="7">
            <p style="text-align: center" align="center"><strong><span style="font-size: 14pt; font-family: 宋体">IT</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">技能</span></strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
        <tr style="height: 1cm; page-break-inside: avoid">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 1cm" colspan="7">
            <p><strong><span style="color: #333333; font-family: 宋体">精通C# ,ASP.NET开发,熟悉.NET2.0 ,了解.NET 3.0 和Silverlight,了解asp.net mvc 框架 ，2年C#编程经验. <br />
            掌握SQL语言,熟悉数据库编程，熟悉SQL server 2000和2005的配置和使用. <br />
            熟悉B/S三层架构.<br />
            熟悉Ajax技术,了解各种脚本库文件并能熟练使用，如prototype等<br />
            熟悉javascript,css ,有很好的js编程基础，熟悉面向对象脚本编程.</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">熟悉Ruby on Rails编程.</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">熟悉C/C++开发，熟悉MFC开发，了解COM,STL</span></strong></p>
            <p style="text-align: left" align="left"><strong><span style="color: #333333; font-family: 宋体">了解Linux下常用命令和Gcc简单命令，Makefile使用。<br />
            具备较强的阅读英文技术文档的能力，经常看 www.codeproject.com www.asp.net的文章</span></strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
        <tr style="height: 28.5pt">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 28.5pt" colspan="7">
            <p style="text-align: center" align="center"><strong><span style="font-size: 14pt; font-family: 宋体">项 目 经 验</span></strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
        <tr style="height: 99.25pt">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 99.25pt" colspan="7">
            <p><strong><span style="color: #333333; font-family: 宋体">在校期间在学校的一个工作室担任主力程序员,负责学校的门户网站(www.cnwust.com)的开发与维护,以及各学院的网站和相关的实验室的网站的开发与维护.</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">在工作室的两年的时间里，我学习了ASP.NET开发，Ajax,SQL语言等等，在<a href="http://www.cnwust.com/">http://www.cnwust.com/</a>这个项目里面，我和另外一位同学共同做系统分析，数据库分析与设计，采用VSS来控制项目。该项目主要是采用了典型的三层架构，我在这个项目里面主要是负责数据层的编写工作，包括存储过程，代码的优化等等。从这个项目里面我学到了系统分析对一个项目的成功与否起到了很大的作用。另外我还自学了Ajax,主要是做一些比较小的例子，分析过一些开源库文件，比如prototype,对这些库文件的使用也是比较熟悉，有较强的能力编写js脚本文件</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">在2007.7-2007.8月份在武汉创讯网络科技有限公司做web开发，主要负责前台页面的代码编写和维护,包括flash小游戏与flash程序的通讯!</span></strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
        <tr style="height: 36.85pt">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 36.85pt" colspan="7">
            <p style="text-indent: 165.05pt"><strong><span style="font-size: 15pt; color: #333333; font-family: 宋体">自 我 评 价</span></strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
        <tr style="height: 36.85pt">
            <td style="border-right: windowtext 2.25pt double; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 2.25pt double; padding-top: 0cm; border-bottom: windowtext 2.25pt double; height: 36.85pt" colspan="7">
            <p><strong><span style="color: #333333; font-family: 宋体">我的专业是信息与计算科学，主要学习数学分析，高等代数等等比较重要的数学基础课程，</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">计算机方面对数据结构比较熟悉，对算法有一定的研究，并上机实现过一些算法，例如栈,队列的实现，排序算法的各种实现，归并，插入，希尔等排序算法，对树的检索算法有一定的了解，数据库有比较深入的了解，对SQL语言编程比较熟练，学习过算法分析与优化。</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">学习比较多的数学理论知识,以及相关的计算机相关方面的软件程序设计和软件工程理论.</span></strong></p>
            <p><strong><span style="color: #333333; font-family: 宋体">有很好的理解问题与分析问题的能力，有比较强的解决各种问题的能力，思维开阔。</span></strong></p>
            <p><strong>&nbsp;</strong></p>
            </td>
            <td style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: medium none" width="1"></td>
        </tr>
    </tbody>
</table>
</div>
 <img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1235061.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43607/" target="_blank">[新闻]后“开放”平台时代</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title> Linux 汇编语言开发指南</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213478.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Wed, 04 Jun 2008 06:32:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213478.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1213478.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1213478.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1213478.html</trackback:ping><description><![CDATA[<blockquote>汇编语言的优点是速度快，可以直接对硬件进行操作，这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C
语言开发的操作系统，这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux
平台上编写汇编代码的程序员提供指南，介绍 Linux 汇编语言的语法格式和开发工具，并辅以具体的例子讲述如何开发实用的Linux 汇编程序。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N10043"><span class="atitle">一、简介</span></a></p>
<p>作为最基本的编程语言之一，汇编语言虽然应用的范围不算很广，但重要性却勿庸置疑，因为它能够完成许多其它语言所无法完成的功能。就拿
Linux 内核来讲，虽然绝大部分代码是用 C 语言编写的，但仍然不可避免地在某些关键地方使用了汇编代码，其中主要是在 Linux
的启动部分。由于这部分代码与硬件的关系非常密切，即使是 C 语言也会有些力不从心，而汇编语言则能够很好扬长避短，最大限度地发挥硬件的性能。</p>
<p>大多数情况下 Linux 程序员不需要使用汇编语言，因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C
语言来实现，再加上 GCC
这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化，的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux
程序员有时还是需要使用汇编，或者不得不使用汇编，理由很简单：精简、高效和 libc 无关性。假设要移植 Linux
到某一特定的嵌入式硬件环境下，首先必然面临如何减少系统大小、提高执行效率等问题，此时或许只有汇编语言能帮上忙了。</p>
<p>汇编语言直接同计算机的底层软件甚至硬件进行交互，它具有如下一些优点： <br />
</p>
<ul>
    <li>能够直接访问与硬件相关的存储器或 I/O 端口； </li>
    <li>能够不受编译器的限制，对生成的二进制代码进行完全的控制； </li>
    <li>能够对关键代码进行更准确的控制，避免因线程共同访问或者硬件设备共享引起的死锁； </li>
    <li>能够根据特定的应用对代码做最佳的优化，提高运行速度； </li>
    <li>能够最大限度地发挥硬件的功能。 </li>
</ul>
<p>&nbsp;</p>
<p>同时还应该认识到，汇编语言是一种层次非常低的语言，它仅仅高于直接手工编写二进制的机器指令码，因此不可避免地存在一些缺点： <br />
</p>
<ul>
    <li>编写的代码非常难懂，不好维护； </li>
    <li>很容易产生 bug，难于调试； </li>
    <li>只能针对特定的体系结构和处理器进行优化； </li>
    <li>开发效率很低，时间长且单调。 </li>
</ul>
<p>&nbsp;</p>
<p>Linux
下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码，指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码，Linux
平台下的汇编工具也吸收了 C 语言的长处，使得程序员可以使用 #include、#ifdef
等预处理指令，并能够通过宏定义来简化代码。第二种是内嵌的汇编代码，指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C
语言标准中没有关于内嵌汇编代码的相应规定，但各种实际使用的 C 编译器都做了这方面的扩充，这其中当然就包括 Linux 平台下的 GCC。</p>
<br />
<br />
<br />
<p><a name="N1007D"><span class="atitle">二、Linux 汇编语法格式</span></a></p>
<p>绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言，这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中，更多采用的还是 AT&amp;T 格式，两者在语法格式上有着很大的不同： <br />
</p>
<ol>
    <li>
    <p>在 AT&amp;T 汇编格式中，寄存器名要加上 '%' 作为前缀；而在 Intel 汇编格式中，寄存器名不需要加前缀。例如：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>pushl %eax</td>
                <td width="200">push eax</td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>
    <p>在 AT&amp;T 汇编格式中，用 '$' 前缀表示一个立即操作数；而在 Intel 汇编格式中，立即数的表示不用带任何前缀。例如：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>pushl $1</td>
                <td width="200">push 1</td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>
    <p>AT&amp;T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中，目标操作数在源操作数的左边；而在 AT&amp;T 汇编格式中，目标操作数在源操作数的右边。例如：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>addl $1, %eax</td>
                <td width="200">add eax, 1</td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>
    <p>在
    AT&amp;T 汇编格式中，操作数的字长由操作符的最后一个字母决定，后缀'b'、'w'、'l'分别表示操作数为字节（byte，8
    比特）、字（word，16 比特）和长字（long，32比特）；而在 Intel 汇编格式中，操作数的字长是用 "byte ptr" 和
    "word ptr" 等前缀来表示的。例如：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>movb val, %al</td>
                <td width="200">mov al, byte ptr val</td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>在 AT&amp;T 汇编格式中，绝对转移和调用指令（jump/call）的操作数前要加上'*'作为前缀，而在 Intel 格式中则不需要。 </li>
    <li>
    <p>远程转移指令和远程子调用指令的操作码，在 AT&amp;T 汇编格式中为 "ljump" 和 "lcall"，而在 Intel 汇编格式中则为 "jmp far" 和 "call far"，即：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>ljump $section, $offset</td>
                <td width="200">jmp far section:offset</td>
            </tr>
            <tr>
                <td>lcall $section, $offset</td>
                <td width="200">call far section:offset</td>
            </tr>
        </tbody>
    </table>
    <p>与之相应的远程返回指令则为：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>lret $stack_adjust</td>
                <td width="200">ret far stack_adjust</td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>
    <p>在 AT&amp;T 汇编格式中，内存操作数的寻址方式是</p>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">section:disp(base, index, scale)<br />
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>而在 Intel 汇编格式中，内存操作数的寻址方式为：</p>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">section:[base + index*scale + disp]<br />
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>由于 Linux 工作在保护模式下，用的是 32 位线性地址，所以在计算地址时不用考虑段基址和偏移量，而是采用如下的地址计算方法：</p>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">disp + base + index * scale<br />
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>下面是一些内存操作数的例子：</p>
    <p>
    </p>
    <table border="1" cellpadding="2" cellspacing="0">
        <tbody>
            <tr>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>AT&amp;T 格式</strong> </td>
                <td align="center" bgcolor="#d9d9d9" width="200"><strong>Intel 格式</strong> </td>
            </tr>
            <tr>
                <td>movl -4(%ebp), %eax</td>
                <td width="200">mov eax, [ebp - 4]</td>
            </tr>
            <tr>
                <td>movl array(, %eax, 4), %eax</td>
                <td width="200">mov eax, [eax*4 + array]</td>
            </tr>
            <tr>
                <td>movw array(%ebx, %eax, 4), %cx</td>
                <td width="200">mov cx, [ebx + 4*eax + array]</td>
            </tr>
            <tr>
                <td>movb $4, %fs:(%eax)</td>
                <td width="200">mov fs:eax, 4</td>
            </tr>
        </tbody>
    </table>
    </li>
</ol>
<p>&nbsp;</p>
<br />
<p><a name="N10211"><span class="atitle">三、Hello World!</span></a></p>
<p>真不知道打破这个传统会带来什么样的后果，但既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串 "Hello World!"，那我们也以这种方式来开始介绍 Linux 下的汇编语言程序设计。</p>
<p>在 Linux 操作系统中，你有很多办法可以实现在屏幕上显示一个字符串，但最简洁的方式是使用 Linux
内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯，不需要链接诸如 libc 这样的函数库，也不需要使用 ELF
解释器，因而代码尺寸小且执行速度快。</p>
<p>Linux 是一个运行在保护模式下的 32 位操作系统，采用 flat memory 模式，目前最常用到的是 ELF
格式的二进制代码。一个 ELF 格式的可执行程序通常划分为如下几个部分：.text、.data 和 .bss，其中 .text
是只读的代码区，.data 是可读可写的数据区，而 .bss 则是可读可写且没有初始化的数据区。代码区和数据区在 ELF 中统称为
section，根据实际需要你可以使用其它标准的 section，也可以添加自定义 section，但一个 ELF 可执行程序至少应该有一个
.text 部分。下面给出我们的第一个汇编程序，用的是 AT&amp;T 汇编语言格式：</p>
<p>例1. AT&amp;T 格式</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">#hello.s <br />
            .data                    # 数据段声明<br />
            msg : .string "Hello, world!\\n" # 要输出的字符串<br />
            len = . - msg                   # 字串长度<br />
            .text                    # 代码段声明<br />
            .global _start           # 指定入口函数<br />
            <br />
            _start:                  # 在屏幕上显示一个字符串<br />
            movl $len, %edx  # 参数三：字符串长度<br />
            movl $msg, %ecx  # 参数二：要显示的字符串<br />
            movl $1, %ebx    # 参数一：文件描述符(stdout) <br />
            movl $4, %eax    # 系统调用号(sys_write) <br />
            int  $0x80       # 调用内核功能<br />
            <br />
            # 退出程序<br />
            movl $0,%ebx     # 参数一：退出代码<br />
            movl $1,%eax     # 系统调用号(sys_exit) <br />
            int  $0x80       # 调用内核功能<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>初次接触到 AT&amp;T 格式的汇编代码时，很多程序员都认为太晦涩难懂了，没有关系，在 Linux 平台上你同样可以使用 Intel 格式来编写汇编程序：</p>
<p>例2. Intel 格式</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">; hello.asm <br />
            section .data            ; 数据段声明<br />
            msg db "Hello, world!", 0xA     ; 要输出的字符串<br />
            len equ $ - msg                 ; 字串长度<br />
            section .text            ; 代码段声明<br />
            global _start            ; 指定入口函数<br />
            _start:                  ; 在屏幕上显示一个字符串<br />
            mov edx, len     ; 参数三：字符串长度<br />
            mov ecx, msg     ; 参数二：要显示的字符串<br />
            mov ebx, 1       ; 参数一：文件描述符(stdout) <br />
            mov eax, 4       ; 系统调用号(sys_write) <br />
            int 0x80         ; 调用内核功能<br />
            ; 退出程序<br />
            mov ebx, 0       ; 参数一：退出代码<br />
            mov eax, 1       ; 系统调用号(sys_exit) <br />
            int 0x80         ; 调用内核功能<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>上面两个汇编程序采用的语法虽然完全不同，但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串，然后再调用
sys_exit 退出程序。在 Linux 内核源文件 include/asm-i386/unistd.h 中，可以找到所有系统调用的定义。</p>
<p><a name="N10234"><span class="atitle">四、Linux 汇编工具</span></a></p>
<p>Linux 平台下的汇编工具虽然种类很多，但同 DOS/Windows 一样，最基本的仍然是汇编器、连接器和调试器。</p>
<p><strong>1.汇编器</strong> </p>
<p>汇编器（assembler）的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS，它是
GCC 所依赖的后台汇编工具，通常包含在 binutils 软件包中。GAS 使用标准的 AT&amp;T 汇编语法，可以用来汇编用
AT&amp;T 格式编写的程序：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">[xiaowp@gary code]$ as -o hello.o hello.s<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>Linux 平台上另一个经常用到的汇编器是 NASM，它提供了很好的宏指令功能，并能够支持相当多的目标代码格式，包括
bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器，因而执行速度要比 GAS
快很多，更重要的是它使用的是 Intel 汇编语法，可以用来编译用 Intel 语法格式编写的汇编程序：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">[xiaowp@gary code]$ nasm -f elf hello.asm<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><strong>2.链接器</strong> </p>
<p>由汇编器产生的目标代码是不能直接在计算机上运行的，它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代
码，这样可以先将整个程序分成几个模块来单独开发，然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld
作为标准的链接程序，它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后，就可以使用
ld 将其链接成可执行程序了：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">[xiaowp@gary code]$ ld -s -o hello hello.o<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><strong>3.调试器</strong> </p>
<p>有人说程序不是编出来而是调出来的，足见调试在软件开发中的重要作用，在用汇编语言编写程序时尤其如此。Linux 下调试汇编代码既可以用
GDB、DDD 这类通用的调试器，也可以使用专门用来调试汇编代码的 ALD(Assembly Language Debugger)。</p>
<p>从调试的角度来看，使用 GAS 的好处是可以在生成的目标代码中包含符号表(symbol table)，这样就可以使用 GDB 和 DDD 来进行源码级的调试了。要在生成的可执行程序中包含符号表，可以采用下面的方式进行编译和链接：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">[xiaowp@gary code]$ as --gstabs -o hello.o hello.s<br />
            [xiaowp@gary code]$ ld -o hello hello.o<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>执行 as 命令时带上参数 --gstabs 可以告诉汇编器在生成的目标代码中加上符号表，同时需要注意的是，在用 ld 命令进行链接时不要加上 -s 参数，否则目标代码中的符号表在链接时将被删去。</p>
<p>在 GDB 和 DDD 中调试汇编代码和调试 C 语言代码是一样的，你可以通过设置断点来中断程序的运行，查看变量和寄存器的当前值，并可以对代码进行单步跟踪。图1 是在 DDD 中调试汇编代码时的情景：</p>
<p><img alt="" src="http://www.ibm.com/developerworks/cn/linux/l-assembly/img01.jpg" /> <br />
图1 用 DDD 中调试汇编程序 </p>
<p>汇编程序员通常面对的都是一些比较苛刻的软硬件环境，短小精悍的ALD可能更能符合实际的需要，因此下面主要介绍一下如何用ALD来调试汇编程序。首先在命令行方式下执行ald命令来启动调试器，该命令的参数是将要被调试的可执行程序：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">[xiaowp@gary doc]$ ald hello<br />
            Assembly Language Debugger 0.1.3<br />
            Copyright (C) 2000-2002 Patrick Alken<br />
            hello: ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)<br />
            Loading debugging symbols...(15 symbols loaded)<br />
            ald&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>当 ALD 的提示符出现之后，用 disassemble 命令对代码段进行反汇编：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ald&gt; disassemble -s .text<br />
            Disassembling section .text (0x08048074 - 0x08048096)<br />
            08048074  BA0F000000                 mov edx, 0xf<br />
            08048079  B998900408                 mov ecx, 0x8049098<br />
            0804807E  BB01000000                 mov ebx, 0x1<br />
            08048083  B804000000                 mov eax, 0x4<br />
            08048088  CD80                       int 0x80<br />
            0804808A  BB00000000                 mov ebx, 0x0<br />
            0804808F  B801000000                 mov eax, 0x1<br />
            08048094  CD80                       int 0x80<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>上述输出信息的第一列是指令对应的地址码，利用它可以设置在程序执行时的断点：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ald&gt; break 0x08048088<br />
            Breakpoint 1 set for 0x08048088<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>断点设置好后，使用 run 命令开始执行程序。ALD 在遇到断点时将自动暂停程序的运行，同时会显示所有寄存器的当前值：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ald&gt; run<br />
            Starting program: hello<br />
            Breakpoint 1 encountered at 0x08048088<br />
            eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000F<br />
            esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000<br />
            ds  = 0x0000002B es  = 0x0000002B fs  = 0x00000000 gs  = 0x00000000<br />
            ss  = 0x0000002B cs  = 0x00000023 eip = 0x08048088 eflags = 0x00000246<br />
            Flags: PF ZF IF<br />
            08048088  CD80                       int 0x80<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如果需要对汇编代码进行单步调试，可以使用 next 命令：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ald&gt; next<br />
            Hello, world!<br />
            eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000F<br />
            esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000<br />
            ds  = 0x0000002B es  = 0x0000002B fs  = 0x00000000 gs  = 0x00000000<br />
            ss  = 0x0000002B cs  = 0x00000023 eip = 0x0804808F eflags = 0x00000346<br />
            Flags: PF ZF TF IF<br />
            0804808F  B801000000                 mov eax, 0x1<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>若想获得 ALD 支持的所有调试命令的详细列表，可以使用 help 命令：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ald&gt; help<br />
            Commands may be abbreviated.<br />
            If a blank command is entered, the last command is repeated.<br />
            Type `help &lt;command&gt;' for more specific information on &lt;command&gt;.<br />
            General commands<br />
            attach         clear          continue       detach         disassemble<br />
            enter          examine        file           help           load<br />
            next           quit           register       run            set<br />
            step           unload         window         write<br />
            Breakpoint related commands<br />
            break          delete         disable        enable         ignore<br />
            lbreak         tbreak<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<p><a name="N102A8"><span class="atitle">五、系统调用</span></a></p>
<p>即便是最简单的汇编程序，也难免要用到诸如输入、输出以及退出等操作，而要进行这些操作则需要调用操作系统所提供的服务，也就是系统调用。除非你的
程序只完成加减乘除等数学运算，否则将很难避免使用系统调用，事实上除了系统调用不同之外，各种操作系统的汇编编程往往都是很类似的。</p>
<p>在 Linux 平台下有两种方式来使用系统调用：利用封装后的 C 库（libc）或者通过汇编直接调用。其中通过汇编语言来直接调用系统调用，是最高效地使用 Linux 内核服务的方法，因为最终生成的程序不需要与任何库进行链接，而是直接和内核通信。</p>
<p>和 DOS 一样，Linux 下的系统调用也是通过中断（int 0x80）来实现的。在执行 int 80 指令时，寄存器 eax
中存放的是系统调用的功能号，而传给系统调用的参数则必须按顺序放到寄存器 ebx，ecx，edx，esi，edi
中，当系统调用完成之后，返回值可以在寄存器 eax 中获得。</p>
<p>所有的系统调用功能号都可以在文件 /usr/include/bits/syscall.h 中找到，为了便于使用，它们是用
SYS_&lt;name&gt; 这样的宏来定义的，如 SYS_write、SYS_exit 等。例如，经常用到的 write
函数是如下定义的：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">ssize_t write(int fd, const void *buf, size_t count);<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>该函数的功能最终是通过 SYS_write 这一系统调用来实现的。根据上面的约定，参数 fb、buf 和 count 分别存在寄存器
ebx、ecx 和 edx 中，而系统调用号 SYS_write 则放在寄存器 eax 中，当 int 0x80
指令执行完毕后，返回值可以从寄存器 eax 中获得。</p>
<p>或许你已经发现，在进行系统调用时至多只有 5 个寄存器能够用来保存参数，难道所有系统调用的参数个数都不超过 5 吗？当然不是，例如 mmap 函数就有 6 个参数，这些参数最后都需要传递给系统调用 SYS_mmap：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">void  *  mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>当一个系统调用所需的参数个数大于 5 时，执行int 0x80 指令时仍需将系统调用功能号保存在寄存器 eax
中，所不同的只是全部参数应该依次放在一块连续的内存区域里，同时在寄存器 ebx
中保存指向该内存区域的指针。系统调用完成之后，返回值仍将保存在寄存器 eax 中。</p>
<p>由于只是需要一块连续的内存区域来保存系统调用的参数，因此完全可以像普通的函数调用一样使用栈(stack)来传递系统调用所需的参数。但要注意
一点，Linux 采用的是 C
语言的调用模式，这就意味着所有参数必须以相反的顺序进栈，即最后一个参数先入栈，而第一个参数则最后入栈。如果采用栈来传递系统调用所需的参数，在执行
int 0x80 指令时还应该将栈指针的当前值复制到寄存器 ebx中。</p>
<br />
<br />
<p><a name="N102CE"><span class="atitle">六、命令行参数</span></a></p>
<p>在 Linux 操作系统中，当一个可执行程序通过命令行启动时，其所需的参数将被保存到栈中：首先是
argc，然后是指向各个命令行参数的指针数组 argv，最后是指向环境变量的指针数据
envp。在编写汇编语言程序时，很多时候需要对这些参数进行处理，下面的代码示范了如何在汇编代码中进行命令行参数的处理：</p>
<p>例3. 处理命令行参数</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode"># args.s<br />
            .text<br />
            .globl _start<br />
            <br />
            _start:<br />
            popl	%ecx		# argc<br />
            vnext:<br />
            popl	%ecx		# argv<br />
            test 	%ecx, %ecx      # 空指针表明结束<br />
            jz	exit<br />
            movl	%ecx, %ebx<br />
            xorl	%edx, %edx<br />
            strlen:<br />
            movb	(%ebx), %al<br />
            inc	%edx<br />
            inc	%ebx<br />
            test	%al, %al<br />
            jnz	strlen<br />
            movb	$10, -1(%ebx)<br />
            movl	$4, %eax        # 系统调用号(sys_write) <br />
            movl	$1, %ebx        # 文件描述符(stdout) <br />
            int	$0x80<br />
            jmp	vnext<br />
            exit:<br />
            movl	$1,%eax         # 系统调用号(sys_exit) <br />
            xorl	%ebx, %ebx      # 退出代码<br />
            int 	$0x80<br />
            <br />
            ret<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N102DE"><span class="atitle">七、GCC 内联汇编</span></a></p>
<p>用汇编编写的程序虽然运行速度快，但开发速度非常慢，效率也很低。如果只是想对关键代码段进行优化，或许更好的办法是将汇编指令嵌入到 C
语言程序中，从而充分利用高级语言和汇编语言各自的特点。但一般来讲，在 C
代码中嵌入汇编语句要比"纯粹"的汇编语言代码复杂得多，因为需要解决如何分配寄存器，以及如何与C代码中的变量相结合等问题。</p>
<p>GCC 提供了很好的内联汇编支持，最基本的格式是：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">__asm__("asm statements");<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>例如：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">__asm__("nop"); <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如果需要同时执行多条汇编语句，则应该用"\\n\\t"将各个语句分隔开，例如：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">__asm__( "pushl %%eax \\n\\t"<br />
            "movl $0, %%eax \\n\\t"<br />
            "popl %eax");<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>通常嵌入到 C 代码中的汇编语句很难做到与其它部分没有任何关系，因此更多时候需要用到完整的内联汇编格式：</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">__asm__("asm statements" : outputs : inputs : registers-modified);<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>插入到 C 代码中的汇编语句是以":"分隔的四个部分，其中第一部分就是汇编代码本身，通常称为指令部，其格式和在汇编语言中使用的格式基本相同。指令部分是必须的，而其它部分则可以根据实际情况而省略。</p>
<p>在将汇编语句嵌入到C代码中时，操作数如何与C代码中的变量相结合是个很大的问题。GCC采用如下方法来解决这个问题：程序员提供具体的指令，而对寄存器的使用则只需给出"样板"和约束条件就可以了，具体如何将寄存器与变量结合起来完全由GCC和GAS来负责。</p>
<p>在GCC内联汇编语句的指令部中，加上前缀'%'的数字(如%0，%1)表示的就是需要使用寄存器的"样板"操作数。指令部中使用了几个样板操作
数，就表明有几个变量需要与寄存器相结合，这样GCC和GAS在编译和汇编时会根据后面给定的约束条件进行恰当的处理。由于样板操作数也使用'%'作为前
缀，因此在涉及到具体的寄存器时，寄存器名前面应该加上两个'%'，以免产生混淆。</p>
<p>紧跟在指令部后面的是输出部，是规定输出变量如何与样板操作数进行结合的条件，每个条件称为一个"约束"，必要时可以包含多个约束，相互之间用逗号
分隔开就可以了。每个输出约束都以'='号开始，然后紧跟一个对操作数类型进行说明的字后，最后是如何与变量相结合的约束。凡是与输出部中说明的操作数相
结合的寄存器或操作数本身，在执行完嵌入的汇编代码后均不保留执行之前的内容，这是GCC在调度寄存器时所使用的依据。</p>
<p>输出部后面是输入部，输入约束的格式和输出约束相似，但不带'='号。如果一个输入约束要求使用寄存器，则GCC在预处理时就会为之分配一个寄存
器，并插入必要的指令将操作数装入该寄存器。与输入部中说明的操作数结合的寄存器或操作数本身，在执行完嵌入的汇编代码后也不保留执行之前的内容。</p>
<p>有时在进行某些操作时，除了要用到进行数据输入和输出的寄存器外，还要使用多个寄存器来保存中间计算结果，这样就难免会破坏原有寄存器的内容。在GCC内联汇编格式中的最后一个部分中，可以对将产生副作用的寄存器进行说明，以便GCC能够采用相应的措施。</p>
<p>下面是一个内联汇编的简单例子：</p>
<p>例4.内联汇编</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">/* inline.c */<br />
            int main()<br />
            {<br />
            int a = 10, b = 0;<br />
            __asm__ __volatile__("movl %1, %%eax;\\n\\r"<br />
            "movl %%eax, %0;"<br />
            :"=r"(b)      /* 输出 */    <br />
            :"r"(a)       /* 输入 */<br />
            :"%eax");     /* 不受影响的寄存器 */<br />
            <br />
            printf("Result: %d, %d\\n", a, b);<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>上面的程序完成将变量a的值赋予变量b，有几点需要说明：</p>
<ul>
    <li>变量b是输出操作数，通过%0来引用，而变量a是输入操作数，通过%1来引用。 </li>
    <li>输入操作数和输出操作数都使用r进行约束，表示将变量a和变量b存储在寄存器中。输入约束和输出约束的不同点在于输出约束多一个约束修饰符'='。 </li>
    <li>在内联汇编语句中使用寄存器eax时，寄存器名前应该加两个'%'，即%%eax。内联汇编中使用%0、%1等来标识变量，任何只带一个'%'的标识符都看成是操作数，而不是寄存器。 </li>
    <li>内联汇编语句的最后一个部分告诉GCC它将改变寄存器eax中的值，GCC在处理时不应使用该寄存器来存储任何其它的值。 </li>
    <li>由于变量b被指定成输出操作数，当内联汇编语句执行完毕后，它所保存的值将被更新。 </li>
</ul>
<p>在内联汇编中用到的操作数从输出部的第一个约束开始编号，序号从0开始，每个约束记数一次，指令部要引用这些操作数时，只需在序号前加上'%'作为
前缀就可以了。需要注意的是，内联汇编语句的指令部在引用一个操作数时总是将其作为32位的长字使用，但实际情况可能需要的是字或字节，因此应该在约束中
指明正确的限定符：</p>
<p>
</p>
<table border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td align="center" bgcolor="#d9d9d9" width="200"><strong>限定符</strong> </td>
            <td align="center" bgcolor="#d9d9d9" width="200"><strong>意义</strong> </td>
        </tr>
        <tr>
            <td>"m"、"v"、"o"</td>
            <td width="200">内存单元</td>
        </tr>
        <tr>
            <td>"r"</td>
            <td width="200">任何寄存器</td>
        </tr>
        <tr>
            <td>"q"</td>
            <td width="200">寄存器eax、ebx、ecx、edx之一</td>
        </tr>
        <tr>
            <td>"i"、"h"</td>
            <td width="200">直接操作数</td>
        </tr>
        <tr>
            <td>"E"和"F"</td>
            <td width="200">浮点数</td>
        </tr>
        <tr>
            <td>"g"</td>
            <td width="200">任意</td>
        </tr>
        <tr>
            <td>"a"、"b"、"c"、"d"</td>
            <td width="200">分别表示寄存器eax、ebx、ecx和edx</td>
        </tr>
        <tr>
            <td>"S"和"D"</td>
            <td width="200">寄存器esi、edi</td>
        </tr>
        <tr>
            <td>"I"</td>
            <td width="200">常数（0至31）</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<p><a name="N103B0"><span class="atitle">八、小结</span></a></p>
<p>Linux操作系统是用C语言编写的，汇编只在必要的时候才被人们想到，但它却是减少代码尺寸和优化代码性能的一种非常重要的手段，特别是在与硬件
直接交互的时候，汇编可以说是最佳的选择。Linux提供了非常优秀的工具来支持汇编程序的开发，使用GCC的内联汇编能够充分地发挥C语言和汇编语言各
自的优点。&nbsp;</p>
<img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1213478.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43606/" target="_blank">[新闻]李彦宏首次表态竞价排名问题:有错能改善莫大焉</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Linux2.6内核启动流程学习</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213472.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Wed, 04 Jun 2008 06:29:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213472.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1213472.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/06/04/1213472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1213472.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1213472.html</trackback:ping><description><![CDATA[<br />
<div style="text-align: justify;">计算机在启动时都是先加电,然后进行硬件检测并引导操作系统的初始化程序,然后操作系统的初始化程序程负责读入系统内核并建产系统的运行环境.一这过程相对来说比较复而且与CPU体系结构相关,这里我们通过<strong style="color: black; background-color: #ffff66;">linux</strong>并以i386的体系结构对这一过程进行较为详细的说明. <br />
一、硬件检测 <br />
当
机器加电后它首先执行BIOS(基本输入输出系统)中的代码，BIOS首先执行加电自检程序(POST)，当自检通过程便完成了硬件的启动。POST程序
通过对内存及其他硬件的设备的诊断检测确定硬件的存在并可正确操作。BIOS是固化在芯片里的程序，执行这一过程一般只需要几秒钟。当自检完成后
BIOS按照系统COMS中设置的启动顺序搜寻有效的启动驱动器(这里我们以硬盘为例)，并读入系统引导扇区，并将系统控制权交给引导程序。 <br />
二、加载和执行引导程序 <br />
系
统引导程序主要是把系统内核装载到内存，启动盘必须在第一个逻辑磁道上包含引导记录。这512个字节的扇区又被称作是引导扇区，在系统完成加电自检后，
BIOS从启动盘中将引导扇区读入到内存中。引导记录中包含了一些磁盘的物理特性的参数。在引导扇区被读入内存后，BIOS就能从这里读取到启动盘的物理
参数。一旦引导记录加载完毕，BIOS就交出系统的执行控制权，跳转到引导程序 <br />
的头部执行。引导记录开头是一条无条件转移指令，它将立即跳转到地址0x03e执行引导程序，在引导扇区中这个引导程序将从磁盘中读出其他几个更为复杂的程序并由它们加载系统内核。 <br />
<strong style="color: black; background-color: #ffff66;">Linux</strong>的
引导程序由汇编代码文件arch/i386/boot/bootsect.S生成，它利用对BIOS功能的调用将
arch/i386/boot/下的setup.S文件和内核映象加载到内存。i386的体系结构的CPU分保护模式和实模式两种，在实模式下只能使用低
端的640K内存。系统在加载引导程序时CPU是处在实模式下，而现在的内核映象文件一般都超过了640K的限制，即使是经过压缩过的内核映象，这个内核
映象文件通常是bzImage,我们在编译内核时通常要用到这个文件。由于bzImage超出了640K这一限制，所以<strong style="color: black; background-color: #ffff66;">linux</strong>设
计了一个
bootsect_helper子程序(定义在arch/i386/boot/setup.S中)，引导程序通过循环调用bootsect_helper
将内核映象一块一块的装入内存，当内核加载完毕，系统跳转到setup.S的开始位置开始执行，setup.S仍在实模式下运行，主要功能是设置系统参数
(如：内存、磁盘等),并为进入保护模式做准备,最后进入到保护模式并跳转到内核映象文件的头部开始执行内核。这里提一下有关<strong style="color: black; background-color: #ffff66;">linux</strong>的
引导程序
lilo和grub，lilo和grub可以引导多个系统，如果机器上要装多系统的话一般都会用到它们，这一引导程序也储存在引导扇区中或者存放在主引导
记录中(MBR)，lilo和grub都许允用户自己配置，它们在系统安装时建立了关于系统内核占用磁盘数据块的位置对照表。当用户选择启动<strong style="color: black; background-color: #ffff66;">linux</strong>系统后，同样也跳转到setup.S上运行。 <br />
三、内核初始化 <br />
当setup.S执行完后，CPU进行保护模式，并开始执行内核，如果内核是经过压缩的，那么首先执行 arch/i386/boot/compressed目录下的<strong style="color: black; background-color: #a0ffff;">head.S</strong>建立堆栈并<strong style="color: black; background-color: #ff9999;">解</strong>压内核映象文件，然后再转入arch/i386/kernel下的 <strong style="color: black; background-color: #a0ffff;">head.S</strong>。如果没有压缩则直接转到arch/i386/kernel下的<strong style="color: black; background-color: #a0ffff;">head.S</strong>开始执行。arch/i386/kernel/<strong style="color: black; background-color: #a0ffff;">head.S</strong>程序负责数据区(BBS)、中断描述表(IDT)、段描述表(GDT)、页表和寄存器的初始化。最后进入start_kernel()模块。 <br />
此时系统运行在内核模式(0级别)下，转入到init/main.c中的start_kernel()。start_kernel()继续其他方面的初始化工作，主要是初始化系统的核心数据结构，主要包括： <br />
setup_arch():执行与体系结构相关的设置。 <br />
trap_init():设置各种入口地址。 <br />
init_IRQ():初始化IRQ中断处理机制。 <br />
sched_init():设置并启动第一个进程init_task()。 <br />
softirq_init():对软中断子系统进行初始化。 <br />
console_init():初始化控制台、显示器. <br />
init_modules():初始化kernel_module。 <br />
fork_init():定义系统最大进程数. <br />
最后进入rest_init()函数并调用kernel_thread()创建init内核线程,进行系统配置。 <br />
init内核线程占用进程描述表的第一项，由它来创建其他完成系统初始他的进程。 <br />
init内核线程首先要销定内核，然后调用do_basic_setup()来初始化外部设备及加载驱动程序。主 <br />
要的初始化工作包括： <br />
PCI总线初始化。 <br />
网络初始化。 <br />
文件系统初始化。 <br />
加载文件系统。 <br />
在do_basic_setup()调用完成后，init()会释放初始化函数据占用的内存，并且打开/dev/console <br />
设备重新定向控制台,用系统调用execve来执行用户态程序/sbin/init。至此，<strong style="color: black; background-color: #ffff66;">linux</strong>的内核初始化工作完成。 <br />
下面的工作就由用户态的/sbin/init程序来完成。init程序程读取/etc/inittab文件来决定它具体的工作。在inittab中比较重要的几条是： <br />
id:5:initdefault 决定操作系统启动时缺省的执行级别(这里说讲的是系统的运行级别，而不同于CPU的级别) <br />
si:sysinit:/etc/rc.d/rc.sysinit 执行/etc/rc.d/rc.sysinit的脚本。rc.sysinit主要的工作是 激活交换分区、检查磁盘、加载硬件模块。 <br />
1:2345:respawn:/sbin/mingetty tty1 显示登录界面 <br />
至此，整个系统的引导过程就完成了。希望这篇文章对大家学习操作系统能有所帮助。&nbsp;
</div>
<img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1213472.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43606/" target="_blank">[新闻]李彦宏首次表态竞价排名问题:有错能改善莫大焉</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]C#强化系列文章七：序列化和反序列化</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121206.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Tue, 25 Mar 2008 05:43:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121206.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1121206.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1121206.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1121206.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 序列化和反序列化我们可能经常会听到，其实通俗一点的解释，序列化就是把一个对象保存到一个文件或数据库字段中去，反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
<br>我想最主要的作用有：
<br>1、在进程下次启动时读取上次保存的对象的信息
<br>2、在不同的AppDomain或进程之间传递数据
<br>3、在分布式应用系统中传递数据
<br>......
<br>在C#中常见的序列化的方法主要也有三个：BinaryFormatter、SoapFormatter、XML序列化
<br>本文就通过一个小例子主要说说这三种方法的具体使用和异同点&nbsp;&nbsp;<a href='http://www.cnblogs.com/firstyi/archive/2008/03/18/1111800.html'>阅读全文</a><img src ="http://www.cnblogs.com/firstyi/aggbug/1111800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://firstyi.cnblogs.com/" target="_blank">永春</a> 2008-03-18 17:39 <a href="http://www.cnblogs.com/firstyi/archive/2008/03/18/1111800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div><br>文章来源:<a href='http://www.cnblogs.com/firstyi/archive/2008/03/18/1111800.html'>http://www.cnblogs.com/firstyi/archive/2008/03/18/1111800.html</a> <img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1121206.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]C#强化系列文章六：应用程序域(AppDomain)浅析</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121207.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Tue, 25 Mar 2008 05:43:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121207.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1121207.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1121207.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1121207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在以前传统的开发中我们都知道，一个应用程序对应一个进程，并为该进程指定虚拟内存，由操作系统来映射实际的物理内存，有效的维护了进程之间的安全性。但另一方面，每一个进程都会消耗一定的系统资源，降低了性能，并且进程间的通信也比较麻烦。
<br>在.Net中推出了一个新的概念：应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中，可以降低系统消耗，同时不同的域之间互相隔离，在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。
<br>应用程序域涉及的内容很多，本文就简要描述以下两个方面：
<br>1、如何创建、卸载域
<br>2、如何实现域间的通信&nbsp;&nbsp;<a href='http://www.cnblogs.com/firstyi/archive/2008/03/14/1106068.html'>阅读全文</a><img src ="http://www.cnblogs.com/firstyi/aggbug/1106068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://firstyi.cnblogs.com/" target="_blank">永春</a> 2008-03-14 16:45 <a href="http://www.cnblogs.com/firstyi/archive/2008/03/14/1106068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div><br>文章来源:<a href='http://www.cnblogs.com/firstyi/archive/2008/03/14/1106068.html'>http://www.cnblogs.com/firstyi/archive/2008/03/14/1106068.html</a> <img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1121207.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]C#强化系列文章五：动态代码的使用(反射和动态生成类)</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121208.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Tue, 25 Mar 2008 05:43:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121208.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1121208.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/25/1121208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1121208.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1121208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在软件开发尤其是框架和底层开发时，为了更灵活的控制代码，常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类，然后再动态的调用类中的方法。当然使用这些方式时会对性能有一点影响，具体使用过程中可以根据实际情况来定，不过一般的 B/S开发中主要的瓶颈还是在数据库操作和网速方面，这点影响应该可以忽略的
<br>下面我就从这两个方面来说说动态代码的使用：&nbsp;&nbsp;<a href='http://www.cnblogs.com/firstyi/archive/2008/03/07/1094652.html'>阅读全文</a><img src ="http://www.cnblogs.com/firstyi/aggbug/1094652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://firstyi.cnblogs.com/" target="_blank">永春</a> 2008-03-07 10:41 <a href="http://www.cnblogs.com/firstyi/archive/2008/03/07/1094652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div><br>文章来源:<a href='http://www.cnblogs.com/firstyi/archive/2008/03/07/1094652.html'>http://www.cnblogs.com/firstyi/archive/2008/03/07/1094652.html</a> <img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1121208.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入][转]C#正则表达式小结</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/12/1101567.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Wed, 12 Mar 2008 01:37:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/12/1101567.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1101567.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/12/1101567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1101567.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1101567.html</trackback:ping><description><![CDATA[<p></p> <p>地址: <a href="http://www.cnblogs.com/maxianghui/archive/2006/05/11/397747.html">http://www.cnblogs.com/maxianghui/archive/2006/05/...</a> <p>确实不错，感谢这位朋友 <p>&nbsp; <p>只能输入数字："^[0-9]*$"。<br>只能输入n位的数字："^\d{n}$"。<br>只能输入至少n位的数字："^\d{n,}$"。<br>只能输入m~n位的数字：。"^\d{m,n}$"<br>只能输入零和非零开头的数字："^(0|[1-9][0-9]*)$"。<br>只能输入有两位小数的正实数："^[0-9]+(.[0-9]{2})?$"。<br>只能输入有1~3位小数的正实数："^[0-9]+(.[0-9]{1,3})?$"。<br>只能输入非零的正整数："^\+?[1-9][0-9]*$"。<br>只能输入非零的负整数："^\-[1-9][]0-9"*$。<br>只能输入长度为3的字符："^.{3}$"。<br>只能输入由26个英文字母组成的字符串："^[A-Za-z]+$"。<br>只能输入由26个大写英文字母组成的字符串："^[A-Z]+$"。<br>只能输入由26个小写英文字母组成的字符串："^[a-z]+$"。<br>只能输入由数字和26个英文字母组成的字符串："^[A-Za-z0-9]+$"。<br>只能输入由数字、26个英文字母或者下划线组成的字符串："^\w+$"。<br>验证用户密码："^[a-zA-Z]\w{5,17}$"正确格式为：以字母开头，长度在6~18之间，只能包含字符、数字和下划线。<br>验证是否含有^%&amp;',;=?$\"等字符："[^%&amp;',;=?$\x22]+"。<br>只能输入汉字："^[\u4e00-\u9fa5]{0,}$"<br>验证Email地址："^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。<br>验证InternetURL："^<a href="http://([/">http://([</a>\w-]+\.)+[\w-]+(/[\w-./?%&amp;=]*)?$"。<br>验证电话号码："^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为："XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。<br>验证身份证号（15位或18位数字）："^\d{15}|\d{18}$"。<br>验证一年的12个月："^(0?[1-9]|1[0-2])$"正确格式为："01"～"09"和"1"～"12"。<br>验证一个月的31天："^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为；"01"～"09"和"1"～"31"。 <br>利用正则表达式限制网页表单里的文本框输入内容： <p>用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" <p>用正则表达式限制只能输入全角字符：&nbsp;onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" <p>用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <p>用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <p>得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1 <p>s="http://www.9499.net/page1.htm"<br>s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br>alert(s) <p>匹配双字节字符(包括汉字在内)：[^\x00-\xff] <p>应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1） <p>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} <p>匹配空行的正则表达式：\n[\s| ]*\r <p>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <p>匹配首尾空格的正则表达式：(^\s*)|(\s*$) <p>String.prototype.trim = function()<br>{<br>&nbsp;&nbsp;&nbsp; return this.replace(/(^\s*)|(\s*$)/g, "");<br>} <p>利用正则表达式分解和转换IP地址： <p>下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序： <p>function IP2V(ip)<br>{<br>&nbsp;re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g&nbsp; //匹配IP地址的正则表达式<br>if(re.test(ip))<br>{<br>return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br>}<br>else<br>{<br>&nbsp;throw new Error("Not a valid IP address!")<br>}<br>} <p>不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下： <p>var ip="10.100.20.168"<br>ip=ip.split(".")<br>alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br>符号解释：  <p>字符 <br>描述 <p>\ <br>将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 <p>^ <br>匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。 <p>$ <br>匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。 <p>* <br>匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 <p>+ <br>匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。 <p>? <br>匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 <p>{n} <br>n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。 <p>{n,} <br>n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <p>{n,m} <br>m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 <p>? <br>当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。 <p>. <br>匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。 <p>(pattern) <br>匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。 <p>(?:pattern) <br>匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 <p>(?=pattern) <br>正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 <p>(?!pattern) <br>负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 <p>x|y <br>匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 <p>[xyz] <br>字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 <p>[^xyz] <br>负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 <p>[a-z] <br>字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 <p>[^a-z] <br>负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 <p>\b <br>匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 <p>\B <br>匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。 <p>\cx <br>匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 <p>\d <br>匹配一个数字字符。等价于 [0-9]。 <p>\D <br>匹配一个非数字字符。等价于 [^0-9]。 <p>\f <br>匹配一个换页符。等价于 \x0c 和 \cL。 <p>\n <br>匹配一个换行符。等价于 \x0a 和 \cJ。 <p>\r <br>匹配一个回车符。等价于 \x0d 和 \cM。 <p>\s <br>匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 <p>\S <br>匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 <p>\t <br>匹配一个制表符。等价于 \x09 和 \cI。 <p>\v <br>匹配一个垂直制表符。等价于 \x0b 和 \cK。 <p>\w <br>匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 <p>\W <br>匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 <p>\xn <br>匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。. <p>\num <br>匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 <p>\n <br>标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 <p>\nm <br>标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 <p>\nml <br>如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 <p>\un <br>匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</p><img src ="http://www.cnblogs.com/zhzkl/aggbug/519868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://zhzkl.cnblogs.com/" target="_blank">zhzkl</a> 2006-10-01 20:37 <a href="http://www.cnblogs.com/zhzkl/archive/2006/10/01/519868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div><br>文章来源:<a href='http://www.cnblogs.com/zhzkl/archive/2006/10/01/519868.html'>http://www.cnblogs.com/zhzkl/archive/2006/10/01/519868.html</a><img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1101567.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43604/" target="_blank">[新闻]微软公布免费安全软件计划</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]C#的OPC工控应用的B/S开发</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/10/1098440.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Mon, 10 Mar 2008 03:38:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/10/1098440.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1098440.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/10/1098440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1098440.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1098440.html</trackback:ping><description><![CDATA[C#的OPC工控应用的B/S开发,客户端0安装,比柏元工控的WEBAccess开发的显示速度快等特点.<img src ="http://blog.csdn.net/zerodj/aggbug/588289.aspx" width = "1" height = "1" /><br>文章来源:<a href='http://blog.csdn.net/zerodj/archive/2006/01/25/588289.aspx'>http://blog.csdn.net/zerodj/archive/2006/01/25/588289.aspx</a><img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1098440.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43603/" target="_blank">[新闻]《时代》：杨致远被Google玩弄于股掌之间？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]理解C#值类型与引用类型</title><link>http://www.cnblogs.com/zoujiaxue/archive/2008/03/05/1092168.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Wed, 05 Mar 2008 09:04:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2008/03/05/1092168.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/1092168.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2008/03/05/1092168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/1092168.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/1092168.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于值类型和引用类型，经常听到一些说法，比如“值类型在栈上分配，引用类型在堆上分配”等等，所以发了这篇文章。希望和大家一起讨论。<br>1. 通用类型系统<br>2. 值类型<br>3. 引用类型<br>4. 值类型和引用类型在内存中的部署<br>    4.1 数组在内存中的部署<br>    4.2 值类型和引用类型的嵌套<br>5. 正确使用值类型和引用类型<br>    5.1 辨明值类型和引用类型的使用场合<br>    5.2 将值类型尽可能实现为具有常量性和原子性的类型<br>    5.3 确保0为值类型的有效状态<br>    5.4 尽量减少装箱和拆箱<br>6. 总结<br>7. 参考&nbsp;&nbsp;<a href='http://www.cnblogs.com/yandixin/archive/2008/03/03/truly-understand-csharp-value-type-and-reference-type.html'>阅读全文</a><img src ="http://www.cnblogs.com/yandixin/aggbug/1088689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://yandixin.cnblogs.com/" target="_blank">笼民</a> 2008-03-03 13:34 <a href="http://www.cnblogs.com/yandixin/archive/2008/03/03/truly-understand-csharp-value-type-and-reference-type.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div><br>文章来源:<a href='http://www.cnblogs.com/yandixin/archive/2008/03/03/truly-understand-csharp-value-type-and-reference-type.html'>http://www.cnblogs.com/yandixin/archive/2008/03/03/truly-understand-csharp-value-type-and-reference-type.html</a><img src ="http://www.cnblogs.com/zoujiaxue/aggbug/1092168.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43602/" target="_blank">[新闻]Mozilla即将结束对FireFox 2的支持</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[导入]install rmagick on leopard</title><link>http://www.cnblogs.com/zoujiaxue/archive/2007/12/07/987052.html</link><dc:creator>Evily.Win</dc:creator><author>Evily.Win</author><pubDate>Fri, 07 Dec 2007 09:32:00 GMT</pubDate><guid>http://www.cnblogs.com/zoujiaxue/archive/2007/12/07/987052.html</guid><wfw:comment>http://www.cnblogs.com/zoujiaxue/comments/987052.html</wfw:comment><comments>http://www.cnblogs.com/zoujiaxue/archive/2007/12/07/987052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/zoujiaxue/comments/commentRss/987052.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/zoujiaxue/services/trackbacks/987052.html</trackback:ping><description><![CDATA[<code><br />#!/bin/sh<br />curl -O http://download.savannah.gnu.org/releases/freetype/freetype-2.3.5.tar.gz<br />tar xzvf freetype-2.3.5.tar.gz<br />cd freetype-2.3.5<br />./configure --prefix=/usr/local<br />make<br />sudo make install<br />cd ..<br /><br />curl -O http://superb-west.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.22.tar.bz2<br />tar jxvf libpng-1.2.22.tar.bz2<br />cd libpng-1.2.22<br />./configure --prefix=/usr/local<br />make<br />sudo make install<br />cd ..<br /><br />curl -O ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz<br />tar xzvf jpegsrc.v6b.tar.gz<br />cd jpeg-6b<br />ln -s `which glibtool` ./libtool<br />export MACOSX_DEPLOYMENT_TARGET=10.5<br />./configure --enable-shared --prefix=/usr/local<br />make<br />sudo make install<br />cd ..<br /><br />curl -O ftp://ftp.remotesensing.org/libtiff/tiff-3.8.2.tar.gz<br />tar xzvf tiff-3.8.2.tar.gz<br />cd tiff-3.8.2<br />./configure --prefix=/usr/local<br />make<br />sudo make install<br />cd ..<br /><br />curl -O http://jaist.dl.sourceforge.net/sourceforge/wvware/libwmf-0.2.8.4.tar.gz<br />tar xzvf libwmf-0.2.8.4.tar.gz<br />cd libwmf-0.2.8.4<br />make clean<br />./configure<br />make<br />sudo make install<br />cd ..<br /><br />curl -O http://www.littlecms.com/lcms-1.17.tar.gz<br />tar xzvf lcms-1.17.tar.gz<br />cd lcms-1.17<br />make clean<br />./configure<br />make<br />sudo make install<br />cd ..<br /><br />curl -O ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/gs860/ghostscript-8.60.tar.gz<br />tar zxvf ghostscript-8.60.tar.gz<br />cd ghostscript-8.60/<br />./configure  --prefix=/usr/local<br />make<br />sudo make install<br />cd ..<br /><br />curl -O ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/current/ghostscript-fonts-std-8.11.tar.gz<br />tar zxvf ghostscript-fonts-std-8.11.tar.gz<br />sudo mv fonts /usr/local/share/ghostscript<br /><br />curl -O http://imagemagick.site2nd.org/imagemagick/ImageMagick-6.3.5-9.tar.gz<br />tar xzvf ImageMagick-6.3.5-9.tar.gz<br />cd ImageMagick-6.3.5<br />export CPPFLAGS=-I/usr/local/include<br />export LDFLAGS=-L/usr/local/lib<br />./configure --prefix=/usr/local --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --with-gs-font-dir=/usr/local/share/ghostscript/fonts<br />make<br />sudo make install<br />cd ..<br /><br />sudo gem install RMagick<br /></code><br>文章来源:<a href='http://snippets.dzone.com/posts/show/4798'>http://snippets.dzone.com/posts/show/4798</a><img src ="http://www.cnblogs.com/zoujiaxue/aggbug/987052.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43601/" target="_blank">[新闻]IBM"走鹃"险胜"Cray Jaguar" 连任世界最快超级计算机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>