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