版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux匯編語言開發(fā)指南級別:初級肖文鵬(xiaowp@)北京理工大學(xué)計算機(jī)系碩士研究生2003年7月03日匯編語言的優(yōu)點是速度快,可以直接對硬件進(jìn)行操作,這對諸如圖形處理等關(guān)鍵應(yīng)用是非常重要的。Linux是一個用C語言開發(fā)的操作系統(tǒng),這使得很多程序員開始忘記在Linux中還可以直接使用匯編這一底層語言來優(yōu)化程序的性能。本文為那些在Linux平臺上編寫匯編代碼的程序員提供指南,介紹Linux匯編語言的語法格式和開發(fā)工具,并輔以具體的例
2、子講述如何開發(fā)實用的Linux匯編程序。一、簡介一、簡介作為最基本的編程語言之一,匯編語言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿Linux內(nèi)核來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在Linux的啟動部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是C語言也會有些力不從心,而匯編語言則能夠很好揚(yáng)長避短,最大限度地發(fā)揮硬件的性能。大
3、多數(shù)情況下Linux程序員不需要使用匯編語言,因為即便是硬件驅(qū)動這樣的底層程序在Linux操作系統(tǒng)中也可以用完全用C語言來實現(xiàn),再加上GCC這一優(yōu)秀的編譯器目前已經(jīng)能夠?qū)ψ罱K生成的代碼進(jìn)行很好的優(yōu)化,的確有足夠的理由讓我們可以暫時將匯編語言拋在一邊了。但實現(xiàn)情況是Linux程序員有時還是需要使用匯編,或者不得不使用匯編,理由很簡單:精簡、高效和libc無關(guān)性。假設(shè)要移植Linux到某一特定的嵌入式硬件環(huán)境下,首先必然面臨如何減少系統(tǒng)大小
4、、提高執(zhí)行效率等問題,此時或許只有匯編語言能幫上忙了。匯編語言直接同計算機(jī)的底層軟件甚至硬件進(jìn)行交互,它具有如下一些優(yōu)點:?能夠直接訪問與硬件相關(guān)的存儲器或IO端口;?能夠不受編譯器的限制,對生成的二進(jìn)制代碼進(jìn)行完全的控制;?能夠?qū)﹃P(guān)鍵代碼進(jìn)行更準(zhǔn)確的控制,避免因線程共同訪問或者硬件設(shè)備共享引起的死鎖;?能夠根據(jù)特定的應(yīng)用對代碼做最佳的優(yōu)化,提高運(yùn)行速度;?能夠最大限度地發(fā)揮硬件的功能。同時還應(yīng)該認(rèn)識到,匯編語言是一種層次非常低的語言,
5、它僅僅高于直接手工編寫二進(jìn)制的機(jī)器指令碼,因此不可避免地存在一些缺點:?編寫的代碼非常難懂,不好維護(hù);?很容易產(chǎn)生bug,難于調(diào)試;?只能針對特定的體系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化;?開發(fā)效率很低,時間長且單調(diào)。Linux下用匯編語言編寫的代碼具有兩種不同的形式。第一種是完全的匯編代碼,指的是整個程序全部用匯編語言編寫。盡管是完全的匯編代碼,Linux平臺下的匯編工具也吸收了C語言的長處,使得程序員可以使用#include、#ifdef等預(yù)處理
6、指令,并能夠通過宏定義來簡化代碼。第二種是內(nèi)嵌的匯編代碼,指的是可以嵌入到C語言程序中的匯編代碼片段。雖然ANSI的C語言標(biāo)準(zhǔn)中沒有關(guān)于內(nèi)嵌匯編代碼的相應(yīng)規(guī)定,但各種實際使用的C編譯器都做了這方面的擴(kuò)充,這其中當(dāng)然就包括Linux平臺下的GCC。打印本頁打印本頁將此頁作為電子郵件將此頁作為電子郵件發(fā)送發(fā)送section:[baseindexscaledisp]由于Linux工作在保護(hù)模式下,用的是32位線性地址,所以在計算地址時不用考慮
7、段基址和偏移量,而是采用如下的地址計算方法:dispbaseindexscale下面是一些內(nèi)存操作數(shù)的例子:AT&T格式格式Intel格式格式movl4(%ebp)%eaxmoveax[ebp4]movlarray(%eax4)%eaxmoveax[eax4array]movwarray(%ebx%eax4)%cxmovcx[ebx4eaxarray]movb$4%fs:(%eax)movfs:eax4三、三、HelloWld!真不知道
8、打破這個傳統(tǒng)會帶來什么樣的后果,但既然所有程序設(shè)計語言的第一個例子都是在屏幕上打印一個字符串“HelloWld!“,那我們也以這種方式來開始介紹Linux下的匯編語言程序設(shè)計。在Linux操作系統(tǒng)中,你有很多辦法可以實現(xiàn)在屏幕上顯示一個字符串,但最簡潔的方式是使用Linux內(nèi)核提供的系統(tǒng)調(diào)用。使用這種方法最大的好處是可以直接和操作系統(tǒng)的內(nèi)核進(jìn)行通訊,不需要鏈接諸如libc這樣的函數(shù)庫,也不需要使用ELF解釋器,因而代碼尺寸小且執(zhí)行速度快
9、。Linux是一個運(yùn)行在保護(hù)模式下的32位操作系統(tǒng),采用flatmemy模式,目前最常用到的是ELF格式的二進(jìn)制代碼。一個ELF格式的可執(zhí)行程序通常劃分為如下幾個部分:.text、.data和.bss,其中.text是只讀的代碼區(qū),.data是可讀可寫的數(shù)據(jù)區(qū),而.bss則是可讀可寫且沒有初始化的數(shù)據(jù)區(qū)。代碼區(qū)和數(shù)據(jù)區(qū)在ELF中統(tǒng)稱為section,根據(jù)實際需要你可以使用其它標(biāo)準(zhǔn)的section,也可以添加自定義section,但一個E
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論