?? 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 + -