📄 linux 汇编语言开发指南 - 21ic中国电子网.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0034)http://21ic.com/news/n5328c95.aspx -->
<HTML lang=gb2312 xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>Linux 汇编语言开发指南 - 21IC中国电子网</TITLE>
<META http-equiv=content-type content=text/html;charset=gb2312><LINK
href="favicon.ico" type=image/x-icon rel=icon><LINK href="favicon.ico"
type=image/x-icon rel="shortcut icon">
<META content="Linux 汇编语言开发指南" name=description>
<META content=21IC.com name=keywords><LINK
href="Linux 汇编语言开发指南 - 21IC中国电子网.files/style.css" type=text/css rel=stylesheet>
<SCRIPT src="Linux 汇编语言开发指南 - 21IC中国电子网.files/flash.js"
type=text/javascript></SCRIPT>
<SCRIPT type=text/javascript>
var thumbWidth=120;var thumbHeight=0;
var thumbHWidth=thumbWidth;var thumbHHeight=thumbHeight;
</SCRIPT>
<SCRIPT src="Linux 汇编语言开发指南 - 21IC中国电子网.files/thumbnail.js"
type=text/javascript></SCRIPT>
<SCRIPT language=javaScript src="Linux 汇编语言开发指南 - 21IC中国电子网.files/scroll.js"
type=text/javascript></SCRIPT>
<SCRIPT language=javaScript src="Linux 汇编语言开发指南 - 21IC中国电子网.files/imgResize.js"
type=text/javascript></SCRIPT>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY><SPAN id=printScript>
<SCRIPT language=javascript type=text/javascript>
<!--
function ContentSize(size)
{
var obj=document.all.BodyLabel;
obj.style.fontSize=size+"px";
}
-->
</SCRIPT>
</SPAN>
<SCRIPT language=javascript src="Linux 汇编语言开发指南 - 21IC中国电子网.files/print.js"
type=text/javascript></SCRIPT>
<TABLE id=navbar cellSpacing=0 cellPadding=0 align=center>
<TBODY>
<TR>
<TD class=l></TD>
<TD class=m>
<SCRIPT language=javascript1.2
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/popmenu.js"
type=text/javascript></SCRIPT>
<SPAN id=dlSortNav><SPAN><A href="http://21ic.com/">首页</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A
href="http://21ic.com/news/c8.aspx">新闻</A> </SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,29,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c29.aspx">应用</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,26,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c26.aspx">新品</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,27,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c27.aspx">市场</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,28,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c28.aspx">专访</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,5,1,false)
onmouseout=delayhidemenu() href="http://job.21ic.com/">人才</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,62,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c62.aspx">下载</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,2,1,false)
onmouseout=delayhidemenu() href="http://21icsearch.com/">资料(PDF)</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,31,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c31.aspx">活动</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,30,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c30.aspx">站内</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,7,1,false)
onmouseout=delayhidemenu() href="http://21ic.com/news/c7.aspx">厂商</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A href="http://kucun.21ic.com/">库存</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A onmouseover=showmenu(event,4,1,false)
onmouseout=delayhidemenu() href="http://shop.21ic.com/">商店</A>
</SPAN><SPAN><IMG alt=""
src="Linux 汇编语言开发指南 - 21IC中国电子网.files/navbar_separator.gif"
align=absMiddle> </SPAN><SPAN><A href="http://21icbbs.com/">社区</A>
</SPAN></SPAN></TD>
<TD class=r></TD></TR></TBODY></TABLE>
<TABLE id=navsub cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD class=l></TD>
<TD class=m> <A
href="http://21ic.com/news/default.aspx">21IC中国电子网</A> → <A
href="http://21ic.com/news/c62.aspx">下载</A> → <A
href="http://21ic.com/news/c95.aspx">学习/电子书</A> </TD>
<TD class=r></TD></TR></TBODY></TABLE>
<DIV class=mframe>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm><SPAN class=tt>详文</SPAN> </TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<DIV id=printBody>
<TABLE id=middle
style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left"
cellSpacing=0 cellPadding=0 align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm vAlign=top><BR>
<DIV align=center>
<H1 class=aTitle>Linux 汇编语言开发指南</H1></DIV>
<TABLE width="97%" align=center>
<TBODY>
<TR>
<TD width=120>[日期:<SPAN id=TimeLabel>2005-1-9</SPAN>]</TD>
<TD align=middle>来源:<SPAN id=SourceLabel>ibm china</SPAN>
作者:<SPAN id=AuthorLabel><A
href="mailto:xiaowp@263.net">肖文鹏</A></SPAN></TD>
<TD align=right width=100>[字体:<A
href="javascript:ContentSize(16)">大</A> <A
href="javascript:ContentSize(14)">中</A> <A
href="javascript:ContentSize(12)">小</A>] </TD></TR></TBODY></TABLE>
<DIV class=content id=BodyLabel
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<P><A
href="http://www-900.ibm.com/developerWorks/cn/linux/l-assembly/index.shtml#author1">肖文鹏</A>(<A
href="mailto:xiaowp@263.net">xiaowp@263.net</A>)<BR>北京理工大学计算机系硕士研究生</P>
<P><A name=0><SPAN class=atitle2>一、简介</SPAN></A></P>
<P>作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux
内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux
的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。</P>
<P>大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C
语言来实现,再加上 GCC
这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux
程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux
到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。</P>
<P>汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:<BR>
<UL>
<LI>能够直接访问与硬件相关的存储器或 I/O 端口;
<LI>能够不受编译器的限制,对生成的二进制代码进行完全的控制;
<LI>能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
<LI>能够根据特定的应用对代码做最佳的优化,提高运行速度;
<LI>能够最大限度地发挥硬件的功能。 </LI></UL>
<P></P>
<P>同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:<BR>
<UL>
<LI>编写的代码非常难懂,不好维护;
<LI>很容易产生 bug,难于调试;
<LI>只能针对特定的体系结构和处理器进行优化;
<LI>开发效率很低,时间长且单调。 </LI></UL>
<P></P>
<P>Linux
下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux
平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include、#ifdef
等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C
语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的 C 编译器都做了这方面的扩充,这其中当然就包括 Linux 平台下的 GCC。</P>
<P><A name=1><SPAN class=atitle2>二、Linux 汇编语法格式</SPAN></A></P>
<P>绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和
Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:<BR>
<OL>
<LI>
<P>在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:</P>
<P align=center>
<TABLE cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD align=middle width=200 bgColor=#d9d9d9><B>AT&T 格式</B></TD>
<TD align=middle width=200 bgColor=#d9d9d9><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 cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD align=middle width=200 bgColor=#d9d9d9><B>AT&T 格式</B></TD>
<TD align=middle width=200 bgColor=#d9d9d9><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 cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD align=middle width=200 bgColor=#d9d9d9><B>AT&T 格式</B></TD>
<TD align=middle width=200 bgColor=#d9d9d9><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 cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD align=middle width=200 bgColor=#d9d9d9><B>AT&T 格式</B></TD>
<TD align=middle width=200 bgColor=#d9d9d9><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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -