请问我想在linux下用汇编, 下载nasm和gcc,
不知道有没有这方面的书呢,针对linux下的,因为windows下的书我看过啦一点啦,
大家推荐点书!
thanx!
我这有个资料,是个网页,挺好的,以前载的,还没看呢。
rar压缩的附件发不上来呀,怎么办?
能给我一份吗?它有多大。
能给我一分吗?我现在也在研究这方面的东东。
aere:可以考虑搞个系列,贴上来,让大家都学习学习,先谢了
我也不会发,我下面把那个网页的源代码发上来,大家自己做个html看吧,呵呵,真是可怜。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">;<!-- saved from url=(0069)http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml -->;<HTML xmlns:fo = "http://www.w3.org/1999/XSL/Format">;<HEAD>;<TITLE>;Linux 汇编语言开发指南</TITLE>;<META content="Linux 汇编语言开发指南" name=TITLE>;<META content=Linux name=zone>;<!-- Linux-->;<META content="Linux, 汇编, 汇编语言开发" name=KEYWORDS>;<METAcontent=汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux是一个用C语言开发的操作系统,这使得很多程序员开始忘记在Linux中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux平台上编写汇编代码的程序员提供指南,介绍Linux汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux汇编程序。name=ABSTRACT>;<METAcontent=汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux是一个用C语言开发的操作系统,这使得很多程序员开始忘记在Linux中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux平台上编写汇编代码的程序员提供指南,介绍Linux汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux汇编程序。name=DESCRIPTION>;<META content=2003-7-4 name=DC.DATE scheme="iso8601">;<META content=2003-7-4 name=LASTUPDATE>;<!--- common meta part for all zones -->;<META content="text/html; charset=gb2312" http-equiv=Content-Type>;<META content=papers_html name=dWCategory>;<META content=/developerWorks/cn/cncontent.nsf/cn_dW_feedback name=OWNER>;<META content=V11 name=source>;<META content=GB2312 name=charset>;<META content=zh-cn name=DC.LANGUAGE scheme="rfc1766">;<META content=cn name=IBM.COUNTRY>;<META content=Public name=SECURITY>;<META content=text/xhtml name=FORMAT>;<META content="Copyright (c) 2002 by IBM Corporation" name=COPYRIGHT>;<META content=index,follow name=ROBOTS>;<META name=DOCUMENTCOUNTRYCODE value="cn">;<META name=DOCUMENTLANGUAGECODE value="zh">;<METAcontent='(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" by "webmaster@mail.software.ibm.com" for "http://www.ibm.com/software" on "1997.08.13T17:59-0800" r (n 0 s 0 v 0 l 0))'http-equiv=PICS-Label>;<META content=0 http-equiv=Expires>;<SCRIPT language=JavaScript src="Linux 汇编语言开发指南_files/style.js"type=text/javascript>;</SCRIPT>;
<SCRIPT language=JavaScript src="Linux 汇编语言开发指南_files/spinbox.js"type=text/javascript>;</SCRIPT>;
<META content="MSHTML 5.00.2920.0" name=GENERATOR>;</HEAD>;<BODY bgColor=#ffffff leftMargin=2 topMargin=2 marginwidth="2" marginheight="2">;<!-- MASTHEAD-->;<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR>; <TD class=tbgc width=160>;<A href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www.ibm.com/cn/&origin=dwheader">;<IMG alt=IBM border=0 height=47 src="Linux 汇编语言开发指南_files/ibm-logo.gif" width=160>;</A>;</TD>; <TD class=tbg width=195>;<FONT color=#99ccff size=2>;<B>;China</B>;</FONT>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#main">;<IMG alt="Skip to main content" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=195>;</A>;</TD>; <TD align=right class=tbgc vAlign=top width="100%">; <TABLE border=0 cellPadding=0 cellSpacing=0>; <FORM action=http://210.82.67.149/cgi-bin/dWsearch.pl id=form1 method=get name=form1>; <TBODY>; <TR>; <TD colSpan=6>;<IMG alt="" border=0 height=2 src="Linux 汇编语言开发指南_files/c.gif" width=390>;</TD>;</TR>; <TR vAlign=center>; <TD class=dwsearch>;<SELECT class=dwsearch name=selScope>; <OPTION selected value=dW>;dW 中国所有内容<OPTION value=dW>;.................<OPTION value=dW>;dW 中国技术专区:<OPTION value=javaZ>; Java 技术<OPTION value=linuxZ>; Linux<OPTION value=xmlZ>; XML & Web services<OPTION value=securityZ>; 安全技术<OPTION>;.................<OPTION value=all>;IBM 全部内容</OPTION>;</SELECT>;</TD>; <TD>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>; <TD>;<INPUT class=dwsearch maxLength=100 name=UserRestriction size=15 height="15">;</TD>; <TD>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>; <TD>;<INPUT alt="Search button" border=0 cache height=23 name=Search src="Linux 汇编语言开发指南_files/search.gif" type=image value=Search width=64>;</TD>; <TD vAlign=top>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=30>;</TD>;</TR>; <TR vAlign=top>; <TD class=dwsmall colSpan=6>;<A href="http://210.82.67.149/help.htm" style="COLOR: #ffffff" target=_blank>;搜索帮助</A>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=1>;</TD>;</TR>; <TR>; <TD colSpan=6>;<IMG alt="" border=0 height=4 src="Linux 汇编语言开发指南_files/c.gif" width=390>;</TD>;</TR>;</FORM>;</TBODY>;</TABLE>;</TD>;</TR>;<A id=main name=main>; <TR>; <TD class=hbg height=21 width=160>;&</TD>; <TD class=bbg colSpan=2 height=21 vAlign=top>;&&& <A class=mainlink href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/&origin=dwhead">;IBM 主页</A>; <SPAN class=divider>;&&|&&</SPAN>; <A class=mainlink href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/products/index.shtml&origin=dwhead">;产品与服务</A>; <SPAN class=divider>;&&|&&</SPAN>; <A class=mainlink href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/support/index.shtml&origin=dwhead">;支持与下载</A>; <SPAN class=divider>;&&|&&</SPAN>; <A class=mainlink href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/account/index.shtml&origin=dwhead">;个性化服务</A>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- Color Bar -->;<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR class=hil>; <TD height=1 width="100%">;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>; <TR class=dwr1>; <TD height=2 width="100%">;<IMG alt="" height=2 src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>; <TR class=dwg3>; <TD height=1 width="100%">;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>; <TR class=bbg>; <TD height=1 width="100%">;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>; <TR class=hil>; <TD height=1 width="100%">;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- Breadcrumb Trail -->;<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR vAlign=top>;<!-- RIGHT GUTTER -->; <TD width=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>; <TD width="100%">; <TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR vAlign=top>; <TD width="100%">;<IMG alt="" border=0 height=4 src="Linux 汇编语言开发指南_files/c.gif" width=2>;;<B>;<A href="http://www.ibm.com/cn">;IBM</A>; : <A href="http://www-900.ibm.com/developerWorks/cn/index.shtml">;developerWorks 中国网站</A>; : <A href="http://www-900.ibm.com/developerWorks/cn/linux/index.shtml">;Linux 专区</A>; : <A href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?OpenView&Count=500">;所有的文章 </A>;</B>;</TD>; <TD align=right width=136>;<A href="http://www-900.ibm.com/developerWorks/cn/index.shtml">;<IMG alt="developerWorks 中国网站" border=0 height=24 src="Linux 汇编语言开发指南_files/dwlogo-small.gif" width=136>;</A>;</TD>; <TD width=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End Breadcrumb Trail -->;<!-- Title Area-->;<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR vAlign=top>; <TD colSpan=5>;<IMG alt="" border=0 height=15 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>;</TR>; <TR vAlign=top>;<!-- Title-->; <TD width=2>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=2>;</TD>; <TD>;<!-- <span class="astitle">;[Series title]:&</span>;-->;<SPAN class=atitle>;Linux 汇编语言开发指南</SPAN>;</TD>; <TD width=8>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=8>;</TD>; <TD align=right vAlign=bottom width=180>;</TD>; <TD width=6>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=6>;</TD>;</TR>;<!-- Black line separator-->; <TR vAlign=top>; <TD bgColor=#000000 colSpan=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=100>;</TD>;</TR>; <TR vAlign=top>; <TD bgColor=#ffffff colSpan=5>;<IMG alt="" border=0 height=8 src="Linux 汇编语言开发指南_files/c.gif" width=100>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- END HEADER AREA and START BODY AREA-->;<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">; <TBODY>; <TR vAlign=top>;<!-- LEFT GUTTER-->; <TD width=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>;<!-- START CENTER COLUMN-->; <TD width="100%">; <TABLE align=right border=0 cellPadding=0 cellSpacing=0 width=168>; <TBODY>; <TR>;<!-- Sidebar Gutter-->; <TD width=8>;<IMG alt="" height=21 src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>; <TD width=160>;<!-- Start TOC-->; <TABLE border=0 cellPadding=0 cellSpacing=0 width=160>; <TBODY>; <TR>; <TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif" height=5>;<B>;内容:</B>;</TD>;</TR>; <TR>; <TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=right>; <TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">; <TBODY>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#0">;一、简介</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;二、Linux 汇编语法格式</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#2">;三、Hello World!</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#3">;四、Linux 汇编工具</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#4">;五、系统调用</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#5">;六、命令行参数</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#6">;七、GCC 内联汇编</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#7">;八、小结</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#8">;九、参考资料</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#author1">;关于作者</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End TOC-->;<!-- Start Related Content Area-->; <TABLE border=0 cellPadding=0 cellSpacing=0 width=160>; <TBODY>; <TR>; <TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif" height=5>;<B>;相关内容:</B>;</TD>;</TR>; <TR>; <TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=right>; <TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">; <TBODY>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;介绍</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;介绍</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End TOC-->;<!-- Start Related Content Area-->; <TABLE border=0 cellPadding=0 cellSpacing=0 width=160>; <TBODY>; <TR>; <TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif" height=5>;<A class=nav href="http://www-900.ibm.com/developerWorks/cn/linux/index.shtml">;<B>;在 Linux 专区还有:</B>;</A>;</TD>;</TR>; <TR>; <TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD align=right>; <TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">; <TBODY>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/linux-onlinecourse-bytitle?OpenView&Count=500">;教程</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/tools.jsp&origin=l">;工具与产品</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/code.jsp&origin=l">;代码与组件</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/projects.jsp&origin=l">;项目</A>;</TD>;</TR>; <TR>; <TD>;<A href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?OpenView&Count=500">;文章</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End Related dW Content Area-->; <TABLE border=0 cellPadding=0 cellSpacing=0 width=160>; <TBODY>; <TR>; <TD bgColor=#000000 colSpan=2 height=2 width=150>;<IMG alt="" height=2 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>; <TR>; <TD bgColor=#ffffff colSpan=2 height=2 width=150>;<IMG alt="" height=2 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- END STANDARD SIDEBAR AREA-->;</TD>;</TR>;</TBODY>;</TABLE>;<SPAN class=atitle2>;</SPAN>;<!-- author info begin-->; <>;<A href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#author1">;肖文鹏</A>;(<A href="mailtoiaowp@263.net">;xiaowp@263.net</A>;北京理工大学计算机系硕士研究生;2003 年 7 月</P>;<!-- author inof end-->; <BLOCKQUOTE>;汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux 平台上编写汇编代码的程序员提供指南,介绍 Linux 汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux 汇编程序。</BLOCKQUOTE>; <>;<A name=0>;<SPAN class=atitle2>;一、简介</SPAN>;</A>;</P>; <>;作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。</P>; <>;大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux 程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。</P>; <>;汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:; <UL>; <LI>;能够直接访问与硬件相关的存储器或 I/O 端口; <LI>;能够不受编译器的限制,对生成的二进制代码进行完全的控制; <LI>;能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁; <LI>;能够根据特定的应用对代码做最佳的优化,提高运行速度; <LI>;能够最大限度地发挥硬件的功能。 </LI>;</UL>; <>;</P>; <>;同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:; <UL>; <LI>;编写的代码非常难懂,不好维护; <LI>;很容易产生 bug,难于调试; <LI>;只能针对特定的体系结构和处理器进行优化; <LI>;开发效率很低,时间长且单调。 </LI>;</UL>; <>;</P>; <>;Linux 下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux 平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include、#ifdef 等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C 语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的 C 编译器都做了这方面的扩充,这其中当然就包括 Linux 平台下的 GCC。</P>; <>;<A name=1>;<SPAN class=atitle2>;二、Linux 汇编语法格式</SPAN>;</A>;</P>; <P>;绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:; <OL>; <LI>; <P>;在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;pushl %eax</TD>; <TD width=200>;push eax</TD>;</TR>;</TBODY>;</TABLE>;</P>; <LI>; <P>;在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;pushl $1</TD>; <TD width=200>;push 1</TD>;</TR>;</TBODY>;</TABLE>;</P>; <LI>; <P>;AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;addl $1, %eax</TD>; <TD width=200>;add eax, 1</TD>;</TR>;</TBODY>;</TABLE>;</P>; <LI>; <P>;在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来表示的。例如:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;movb val, %al</TD>; <TD width=200>;mov al, byte ptr val</TD>;</TR>;</TBODY>;</TABLE>;</P>; <LI>;在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。 <LI>; <P>;远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;ljump $section, $offset</TD>; <TD width=200>;jmp far sectionffset</TD>;</TR>; <TR>; <TD>;lcall $section, $offset</TD>; <TD width=200>;call far sectionffset</TD>;</TR>;</TBODY>;</TABLE>;</P>; <P>;与之相应的远程返回指令则为:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>; <TR>; <TD>;lret $stack_adjust</TD>; <TD width=200>;ret far stack_adjust</TD>;</TR>;</TBODY>;</TABLE>;</P>; <LI>; <P>;在 AT&T 汇编格式中,内存操作数的寻址方式是</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0width="100%">; <TBODY>; <TR>; <TD>;<PRE>;<CODE>;section:disp(base, index, scale)</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;而在 Intel 汇编格式中,内存操作数的寻址方式为:</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0width="100%">; <TBODY>; <TR>; <TD>;<PRE>;<CODE>;section:[base + index*scale + disp]</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0width="100%">; <TBODY>; <TR>; <TD>;<PRE>;<CODE>;disp + base + index * scale</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;下面是一些内存操作数的例子:</P>; <P align=center>; <TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000 cellPadding=2 cellSpacing=0>; <TBODY>; <TR>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>; <TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</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>;</P>;</LI>;</OL>; <P>;</P>; <P>;<A name=2>;<SPAN class=atitle2>;三、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&T 汇编语言格式:</P>; <P>;例1. AT&T 格式</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">;<TBODY>; <TR>; <TD>;<PRE>;<CODE>;#hello.s.data # 数据段声明 msg : .string "Hello, world!\\n" # 要输出的字符串 len = . - msg # 字串长度
.text # 代码段声明.global _start # 指定入口函数 _start: # 在屏幕上显示一个字符串 movl $len, %edx # 参数三:字符串长度 movl $msg, %ecx # 参数二:要显示的字符串 movl $1, %ebx # 参数一:文件描述符(stdout) movl $4, %eax # 系统调用号(sys_write) int $0x80 # 调用内核功能 # 退出程序 movl $0,%ebx # 参数一:退出代码 movl $1,%eax # 系统调用号(sys_exit) int $0x80 # 调用内核功能</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;初次接触到 AT&T 格式的汇编代码时,很多程序员都认为太晦涩难懂了,没有关系,在 Linux 平台上你同样可以使用 Intel 格式来编写汇编程序:</P>; <P>;例2. Intel 格式</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">;<TBODY>; <TR>; <TD>;<PRE>;<CODE>;
; hello.asmsection .data ; 数据段声明 msg db "Hello, world!", 0xA ; 要输出的字符串 len equ $ - msg ; 字串长度
section .text ; 代码段声明global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串 mov edx, len ; 参数三:字符串长度 mov ecx, msg ; 参数二:要显示的字符串 mov ebx, 1 ; 参数一:文件描述符(stdout) mov eax, 4 ; 系统调用号(sys_write) int 0x80 ; 调用内核功能
; 退出程序 mov ebx, 0 ; 参数一:退出代码 mov eax, 1 ; 系统调用号(sys_exit) int 0x80 ; 调用内核功能</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;上面两个汇编程序采用的语法虽然完全不同,但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出程序。在 Linux 内核源文件 include/asm-i386/unistd.h 中,可以找到所有系统调用的定义。</P>; <P>;<A name=3>;<SPAN class=atitle2>;四、Linux 汇编工具</SPAN>;</A>;</P>; <P>;Linux 平台下的汇编工具虽然种类很多,但同 DOS/Windows 一样,最基本的仍然是汇编器、连接器和调试器。</P>; <P>;<B>;1.汇编器</B>;</P>; <P>;汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序:</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">;<TBODY>; <TR>; <TD>;<PRE>;<CODE>;[xiaowp@gary code]$ as -o hello.o hello.s</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;Linux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是 Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序:</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">;<TBODY>; <TR>; <TD>;<PRE>;<CODE>;[xiaowp@gary code]$ nasm -f elf hello.asm</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;<B>;2.链接器</B>;</P>; <P>;由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:</P>; <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">;<TBODY>; <TR>; <TD>;<PRE>;<CODE>;[xiaowp@gary code]$ ld -s -o hello hello.o</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>; <P>;<B>;3.调试器</B>;</P>; <P>;有人说程序不是编出
原帖由 "aero" 发表:我也不会发,我下面把那个网页的源代码发上来,大家自己做个html看吧,呵呵,真是可怜。
上传到本版的ftp不就得了:)
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(7)
我这有个资料,是个网页,挺好的,以前载的,还没看呢。
rar压缩的附件发不上来呀,怎么办?
能给我一份吗?它有多大。
能给我一分吗?我现在也在研究这方面的东东。
aere:
可以考虑搞个系列,贴上来,让大家都学习学习,先谢了
我也不会发,我下面把那个网页的源代码发上来,大家自己做个html看吧,
呵呵,真是可怜。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">;
<!-- saved from url=(0069)http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml -->;
<HTML xmlns:fo = "http://www.w3.org/1999/XSL/Format">;<HEAD>;<TITLE>;Linux 汇编语言开发指南</TITLE>;
<META content="Linux 汇编语言开发指南" name=TITLE>;
<META content=Linux name=zone>;<!-- Linux-->;
<META content="Linux, 汇编, 汇编语言开发" name=KEYWORDS>;
<META
content=汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux是一个用C语言开发的操作系统,这使得很多程序员开始忘记在Linux中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux平台上编写汇编代码的程序员提供指南,介绍Linux汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux汇编程序。
name=ABSTRACT>;
<META
content=汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux是一个用C语言开发的操作系统,这使得很多程序员开始忘记在Linux中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux平台上编写汇编代码的程序员提供指南,介绍Linux汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux汇编程序。
name=DESCRIPTION>;
<META content=2003-7-4 name=DC.DATE scheme="iso8601">;
<META content=2003-7-4 name=LASTUPDATE>;<!--- common meta part for all zones -->;
<META content="text/html; charset=gb2312" http-equiv=Content-Type>;
<META content=papers_html name=dWCategory>;
<META content=/developerWorks/cn/cncontent.nsf/cn_dW_feedback name=OWNER>;
<META content=V11 name=source>;
<META content=GB2312 name=charset>;
<META content=zh-cn name=DC.LANGUAGE scheme="rfc1766">;
<META content=cn name=IBM.COUNTRY>;
<META content=Public name=SECURITY>;
<META content=text/xhtml name=FORMAT>;
<META content="Copyright (c) 2002 by IBM Corporation" name=COPYRIGHT>;
<META content=index,follow name=ROBOTS>;
<META name=DOCUMENTCOUNTRYCODE value="cn">;
<META name=DOCUMENTLANGUAGECODE value="zh">;
<META
content='(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" by "webmaster@mail.software.ibm.com" for "http://www.ibm.com/software" on "1997.08.13T17:59-0800" r (n 0 s 0 v 0 l 0))'
http-equiv=PICS-Label>;
<META content=0 http-equiv=Expires>;
<SCRIPT language=JavaScript src="Linux 汇编语言开发指南_files/style.js"
type=text/javascript>;</SCRIPT>;
<SCRIPT language=JavaScript src="Linux 汇编语言开发指南_files/spinbox.js"
type=text/javascript>;</SCRIPT>;
<META content="MSHTML 5.00.2920.0" name=GENERATOR>;</HEAD>;
<BODY bgColor=#ffffff leftMargin=2 topMargin=2 marginwidth="2" marginheight="2">;<!-- MASTHEAD-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR>;
<TD class=tbgc width=160>;<A
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www.ibm.com/cn/&origin=dwheader">;<IMG
alt=IBM border=0 height=47 src="Linux 汇编语言开发指南_files/ibm-logo.gif"
width=160>;</A>;</TD>;
<TD class=tbg width=195>;<FONT color=#99ccff size=2>;<B>;China</B>;</FONT>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#main">;<IMG
alt="Skip to main content" border=0 height=1
src="Linux 汇编语言开发指南_files/c.gif" width=195>;</A>;</TD>;
<TD align=right class=tbgc vAlign=top width="100%">;
<TABLE border=0 cellPadding=0 cellSpacing=0>;
<FORM action=http://210.82.67.149/cgi-bin/dWsearch.pl id=form1
method=get name=form1>;
<TBODY>;
<TR>;
<TD colSpan=6>;<IMG alt="" border=0 height=2
src="Linux 汇编语言开发指南_files/c.gif" width=390>;</TD>;</TR>;
<TR vAlign=center>;
<TD class=dwsearch>;<SELECT class=dwsearch name=selScope>; <OPTION
selected value=dW>;dW 中国所有内容<OPTION
value=dW>;.................<OPTION value=dW>;dW 中国技术专区:<OPTION
value=javaZ>; Java 技术<OPTION value=linuxZ>; Linux<OPTION
value=xmlZ>; XML & Web services<OPTION
value=securityZ>; 安全技术<OPTION>;.................<OPTION
value=all>;IBM 全部内容</OPTION>;</SELECT>;</TD>;
<TD>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;
<TD>;<INPUT class=dwsearch maxLength=100 name=UserRestriction size=15
height="15">;</TD>;
<TD>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;
<TD>;<INPUT alt="Search button" border=0 cache height=23 name=Search
src="Linux 汇编语言开发指南_files/search.gif" type=image value=Search
width=64>;</TD>;
<TD vAlign=top>;<IMG alt="" border=0 height=1
src="Linux 汇编语言开发指南_files/c.gif" width=30>;</TD>;</TR>;
<TR vAlign=top>;
<TD class=dwsmall colSpan=6>;<A href="http://210.82.67.149/help.htm"
style="COLOR: #ffffff" target=_blank>;搜索帮助</A>;<IMG alt="" border=0
height=1 src="Linux 汇编语言开发指南_files/c.gif" width=1>;</TD>;</TR>;
<TR>;
<TD colSpan=6>;<IMG alt="" border=0 height=4
src="Linux 汇编语言开发指南_files/c.gif"
width=390>;</TD>;</TR>;</FORM>;</TBODY>;</TABLE>;</TD>;</TR>;<A id=main name=main>;
<TR>;
<TD class=hbg height=21 width=160>;&</TD>;
<TD class=bbg colSpan=2 height=21 vAlign=top>;&&& <A
class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/&origin=dwhead">;IBM
主页</A>; <SPAN class=divider>;&&|&&</SPAN>; <A
class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/products/index.shtml&origin=dwhead">;产品与服务</A>;
<SPAN class=divider>;&&|&&</SPAN>; <A class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/support/index.shtml&origin=dwhead">;支持与下载</A>;
<SPAN class=divider>;&&|&&</SPAN>; <A class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/account/index.shtml&origin=dwhead">;个性化服务</A>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- Color Bar -->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR class=hil>;
<TD height=1 width="100%">;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;
<TR class=dwr1>;
<TD height=2 width="100%">;<IMG alt="" height=2
src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;
<TR class=dwg3>;
<TD height=1 width="100%">;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;
<TR class=bbg>;
<TD height=1 width="100%">;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;
<TR class=hil>;
<TD height=1 width="100%">;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=592>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- Breadcrumb Trail -->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR vAlign=top>;<!-- RIGHT GUTTER -->;
<TD width=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;
<TD width="100%">;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR vAlign=top>;
<TD width="100%">;<IMG alt="" border=0 height=4
src="Linux 汇编语言开发指南_files/c.gif" width=2>;
;<B>;<A
href="http://www.ibm.com/cn">;IBM</A>; : <A
href="http://www-900.ibm.com/developerWorks/cn/index.shtml">;developerWorks
中国网站</A>; : <A
href="http://www-900.ibm.com/developerWorks/cn/linux/index.shtml">;Linux
专区</A>; : <A
href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?OpenView&Count=500">;所有的文章
</A>;</B>;</TD>;
<TD align=right width=136>;<A
href="http://www-900.ibm.com/developerWorks/cn/index.shtml">;<IMG
alt="developerWorks 中国网站" border=0 height=24
src="Linux 汇编语言开发指南_files/dwlogo-small.gif" width=136>;</A>;</TD>;
<TD width=5>;<IMG alt="" border=0 height=1
src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End Breadcrumb Trail -->;<!-- Title Area-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR vAlign=top>;
<TD colSpan=5>;<IMG alt="" border=0 height=15
src="Linux 汇编语言开发指南_files/c.gif" width=5>;</TD>;</TR>;
<TR vAlign=top>;<!-- Title-->;
<TD width=2>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=2>;</TD>;
<TD>;<!-- <span class="astitle">;[Series title]:&</span>;-->;<SPAN
class=atitle>;Linux 汇编语言开发指南</SPAN>;</TD>;
<TD width=8>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=8>;</TD>;
<TD align=right vAlign=bottom width=180>;</TD>;
<TD width=6>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=6>;</TD>;</TR>;<!-- Black line separator-->;
<TR vAlign=top>;
<TD bgColor=#000000 colSpan=5>;<IMG alt="" border=0 height=1
src="Linux 汇编语言开发指南_files/c.gif" width=100>;</TD>;</TR>;
<TR vAlign=top>;
<TD bgColor=#ffffff colSpan=5>;<IMG alt="" border=0 height=8
src="Linux 汇编语言开发指南_files/c.gif" width=100>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- END HEADER AREA and START BODY AREA-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">;
<TBODY>;
<TR vAlign=top>;<!-- LEFT GUTTER-->;
<TD width=5>;<IMG alt="" border=0 height=1 src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;<!-- START CENTER COLUMN-->;
<TD width="100%">;
<TABLE align=right border=0 cellPadding=0 cellSpacing=0 width=168>;
<TBODY>;
<TR>;<!-- Sidebar Gutter-->;
<TD width=8>;<IMG alt="" height=21 src="Linux 汇编语言开发指南_files/c.gif"
width=5>;</TD>;
<TD width=160>;<!-- Start TOC-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>;
<TBODY>;
<TR>;
<TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif"
height=5>;<B>;内容:</B>;</TD>;</TR>;
<TR>;
<TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=right>;
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">;
<TBODY>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#0">;一、简介</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;二、Linux
汇编语法格式</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#2">;三、Hello
World!</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#3">;四、Linux
汇编工具</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#4">;五、系统调用</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#5">;六、命令行参数</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#6">;七、GCC
内联汇编</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#7">;八、小结</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#8">;九、参考资料</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#author1">;关于作者</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End TOC-->;<!-- Start Related Content Area-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>;
<TBODY>;
<TR>;
<TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif"
height=5>;<B>;相关内容:</B>;</TD>;</TR>;
<TR>;
<TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=right>;
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">;
<TBODY>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;介绍</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#1">;介绍</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End TOC-->;<!-- Start Related Content Area-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>;
<TBODY>;
<TR>;
<TD bgColor=#000000 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=middle background="Linux 汇编语言开发指南_files/bg-gold.gif"
height=5>;<A class=nav
href="http://www-900.ibm.com/developerWorks/cn/linux/index.shtml">;<B>;在
Linux 专区还有:</B>;</A>;</TD>;</TR>;
<TR>;
<TD bgColor=#666666 height=1 width=160>;<IMG alt="" height=1
src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD align=right>;
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">;
<TBODY>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/linux-onlinecourse-bytitle?OpenView&Count=500">;教程</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/tools.jsp&origin=l">;工具与产品</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/code.jsp&origin=l">;代码与组件</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=http://www-106.ibm.com/developerworks/views/linux/projects.jsp&origin=l">;项目</A>;</TD>;</TR>;
<TR>;
<TD>;<A
href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?OpenView&Count=500">;文章</A>;</TD>;</TR>;</TBODY>;</TABLE>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- End Related dW Content Area-->;
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>;
<TBODY>;
<TR>;
<TD bgColor=#000000 colSpan=2 height=2 width=150>;<IMG alt=""
height=2 src="Linux 汇编语言开发指南_files/c.gif" width=160>;</TD>;</TR>;
<TR>;
<TD bgColor=#ffffff colSpan=2 height=2 width=150>;<IMG alt=""
height=2 src="Linux 汇编语言开发指南_files/c.gif"
width=160>;</TD>;</TR>;</TBODY>;</TABLE>;<!-- END STANDARD SIDEBAR AREA-->;</TD>;</TR>;</TBODY>;</TABLE>;<SPAN
class=atitle2>;</SPAN>;<!-- author info begin-->;
<>;<A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#author1">;肖文鹏</A>;(<A
href="mailtoiaowp@263.net">;xiaowp@263.net</A>
;北京理工大学计算机系硕士研究生
;2003
年 7 月</P>;<!-- author inof end-->;
<BLOCKQUOTE>;汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C
语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux
平台上编写汇编代码的程序员提供指南,介绍 Linux 汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux
汇编程序。</BLOCKQUOTE>;
<>;<A name=0>;<SPAN class=atitle2>;一、简介</SPAN>;</A>;</P>;
<>;作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux
内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux
的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。</P>;
<>;大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C
语言来实现,再加上 GCC
这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux
程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux
到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。</P>;
<>;汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:
;
<UL>;
<LI>;能够直接访问与硬件相关的存储器或 I/O 端口;
<LI>;能够不受编译器的限制,对生成的二进制代码进行完全的控制;
<LI>;能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
<LI>;能够根据特定的应用对代码做最佳的优化,提高运行速度;
<LI>;能够最大限度地发挥硬件的功能。 </LI>;</UL>;
<>;</P>;
<>;同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
;
<UL>;
<LI>;编写的代码非常难懂,不好维护;
<LI>;很容易产生 bug,难于调试;
<LI>;只能针对特定的体系结构和处理器进行优化;
<LI>;开发效率很低,时间长且单调。 </LI>;</UL>;
<>;</P>;
<>;Linux
下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux
平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include、#ifdef
等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C
语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的 C 编译器都做了这方面的扩充,这其中当然就包括 Linux 平台下的 GCC。</P>;
<>;<A name=1>;<SPAN class=atitle2>;二、Linux 汇编语法格式</SPAN>;</A>;</P>;
<P>;绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和
Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:
;
<OL>;
<LI>;
<P>;在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;pushl %eax</TD>;
<TD width=200>;push eax</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<LI>;
<P>;在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel
汇编格式中,立即数的表示不用带任何前缀。例如:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;pushl $1</TD>;
<TD width=200>;push 1</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<LI>;
<P>;AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在
AT&T 汇编格式中,目标操作数在源操作数的右边。例如:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;addl $1, %eax</TD>;
<TD width=200>;add eax, 1</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<LI>;
<P>;在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8
比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和
"word ptr" 等前缀来表示的。例如:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;movb val, %al</TD>;
<TD width=200>;mov al, byte ptr val</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<LI>;在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel
格式中则不需要。
<LI>;
<P>;远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel
汇编格式中则为 "jmp far" 和 "call far",即:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;ljump $section, $offset</TD>;
<TD width=200>;jmp far sectionffset</TD>;</TR>;
<TR>;
<TD>;lcall $section, $offset</TD>;
<TD width=200>;call far sectionffset</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<P>;与之相应的远程返回指令则为:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</TD>;</TR>;
<TR>;
<TD>;lret $stack_adjust</TD>;
<TD width=200>;ret far stack_adjust</TD>;</TR>;</TBODY>;</TABLE>;</P>;
<LI>;
<P>;在 AT&T 汇编格式中,内存操作数的寻址方式是</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;
<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
section:disp(base, index, scale)
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;而在 Intel 汇编格式中,内存操作数的寻址方式为:</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;
<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
section:[base + index*scale + disp]
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;
<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
disp + base + index * scale
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;下面是一些内存操作数的例子:</P>;
<P align=center>;
<TABLE border=1 borderColorDark=#d9d9d9 borderColorLight=#000000
cellPadding=2 cellSpacing=0>;
<TBODY>;
<TR>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;AT&T 格式</B>;</TD>;
<TD align=middle bgColor=#d9d9d9 width=200>;<B>;Intel 格式</B>;</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>;</P>;</LI>;</OL>;
<P>;</P>;
<P>;<A name=2>;<SPAN class=atitle2>;三、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&T 汇编语言格式:</P>;
<P>;例1. AT&T 格式</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
#hello.s
.data # 数据段声明
msg : .string "Hello, world!\\n" # 要输出的字符串
len = . - msg # 字串长度
.text # 代码段声明
.global _start # 指定入口函数
_start: # 在屏幕上显示一个字符串
movl $len, %edx # 参数三:字符串长度
movl $msg, %ecx # 参数二:要显示的字符串
movl $1, %ebx # 参数一:文件描述符(stdout)
movl $4, %eax # 系统调用号(sys_write)
int $0x80 # 调用内核功能
# 退出程序
movl $0,%ebx # 参数一:退出代码
movl $1,%eax # 系统调用号(sys_exit)
int $0x80 # 调用内核功能
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;初次接触到 AT&T 格式的汇编代码时,很多程序员都认为太晦涩难懂了,没有关系,在 Linux 平台上你同样可以使用 Intel
格式来编写汇编程序:</P>;
<P>;例2. Intel 格式</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
; hello.asm
section .data ; 数据段声明
msg db "Hello, world!", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
section .text ; 代码段声明
global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串
mov edx, len ; 参数三:字符串长度
mov ecx, msg ; 参数二:要显示的字符串
mov ebx, 1 ; 参数一:文件描述符(stdout)
mov eax, 4 ; 系统调用号(sys_write)
int 0x80 ; 调用内核功能
; 退出程序
mov ebx, 0 ; 参数一:退出代码
mov eax, 1 ; 系统调用号(sys_exit)
int 0x80 ; 调用内核功能
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;上面两个汇编程序采用的语法虽然完全不同,但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用
sys_exit 退出程序。在 Linux 内核源文件 include/asm-i386/unistd.h 中,可以找到所有系统调用的定义。</P>;
<P>;<A name=3>;<SPAN class=atitle2>;四、Linux 汇编工具</SPAN>;</A>;</P>;
<P>;Linux 平台下的汇编工具虽然种类很多,但同 DOS/Windows 一样,最基本的仍然是汇编器、连接器和调试器。</P>;
<P>;<B>;1.汇编器</B>;</P>;
<P>;汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC
所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T
格式编写的程序:</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
[xiaowp@gary code]$ as -o hello.o hello.s
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;Linux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括
bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是
Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序:</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
[xiaowp@gary code]$ nasm -f elf hello.asm
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;<B>;2.链接器</B>;</P>;
<P>;由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。
Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM
的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:</P>;
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%">;<TBODY>;
<TR>;
<TD>;<PRE>;<CODE>;
[xiaowp@gary code]$ ld -s -o hello hello.o
</CODE>;</PRE>;</TD>;</TR>;</TBODY>;</TABLE>;
<P>;<B>;3.调试器</B>;</P>;
<P>;有人说程序不是编出
上传到本版的ftp不就得了:)