• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            Linux操作系統(tǒng)下的匯編程序設(shè)計(jì)簡介

            摘要:本文主要講述了Linux下使用匯編的利弊,以及常用匯編工具的使用和語法特點(diǎn)。重點(diǎn)講述了NASM。

            引言:匯編語言是低級(jí)語言,與硬件和操作系統(tǒng)緊密聯(lián)系。個(gè)人電腦以前都是用DOS,現(xiàn)在發(fā)展成了WINDOWS 98,而另一個(gè)操作系統(tǒng)Linux也正在崛起。下面比較一下這三個(gè)操作系統(tǒng):

            DOS較穩(wěn)定,速度快無法充分發(fā)揮計(jì)算機(jī)性能,沒有圖形界面較低。

            WINDOWS 98操作簡便,應(yīng)用軟件多,硬件兼容性好;不穩(wěn)定,經(jīng)常死機(jī),速度慢高。

            Linux性能優(yōu)秀,非常穩(wěn)定,界面美觀,操作簡便;缺乏軟件廠商支持,應(yīng)用軟件少免費(fèi)。

            由以上的比較可知,Linux操作系統(tǒng)本身具有較大優(yōu)勢(shì),它的普及應(yīng)該只是時(shí)間問題,所以如何在Linux下開發(fā)軟件是我們計(jì)算機(jī)系學(xué)生必須學(xué)習(xí)與研究的一個(gè)課題。

            Linux 下的主要編程語言是C,同時(shí)Linux還支持其他許多編程語言,匯編語言作為最重要的編程語言之一,當(dāng)然也包括在內(nèi)。它能夠完成許多其他語言所不能完成的功能。要學(xué)習(xí)Linux編程,就必須要學(xué)習(xí)Linux下的匯編程序設(shè)計(jì)。下面我就來介紹一下Linux下的匯編程序設(shè)計(jì)。

            Linux匯編簡介

            一、匯編語言的優(yōu)缺點(diǎn)

            由于Linux是用C寫的,所以C自然而然的就成為了Linux的標(biāo)準(zhǔn)編程語言。大部分人都把匯編給忽略了,甚至在因特網(wǎng)上找資料都是非常的困難,很多問題都需要靠自己來嘗試。我認(rèn)為這樣對(duì)待匯編語言是不公平的,不能只看到它的缺點(diǎn),當(dāng)然也不能只看到它的優(yōu)點(diǎn),下面把它的優(yōu)缺點(diǎn)作一個(gè)比較:

            優(yōu)點(diǎn):匯編語言可以表達(dá)非常底層的東西

            可以直接存取寄存器和I/O;

            編寫的代碼可以非常精確的被執(zhí)行;

            可以編寫出比一般編譯系統(tǒng)高效的代碼;

            可以作為不同語言或不同標(biāo)準(zhǔn)的接口。

            缺點(diǎn):匯編語言是一個(gè)非常低級(jí)的語言

            非常冗長單調(diào),在DOS下編程時(shí)就可以體會(huì)到;

            易出BUG,且調(diào)試?yán)щy;

            代碼不易維護(hù);

            兼容性不好,與硬件關(guān)系非常緊密。

            總的來說,匯編語言要用在必須的地方,盡量少用匯編編寫大型程序,多采用inline模式。

            二、匯編語言工具

            DOS 下常用的工具M(jìn)ASM和TASM到Linux下就用不起來了,Linux有自己的匯編工具,而且種類非常的多。其中Gas可以算是標(biāo)準(zhǔn)配置,每一種 Linux中都包括有Gas,但是GAS采用的不是我們通常在DOS下采用的匯編語法,它采用的是AT&T的語法格式,與intel語法格式有很大的不同。

            如果要采用與DOS接近的語法格式,就必須用另一種匯編工具NASM,NASM基本與MASM相同,但也有不少地方有較大區(qū)別,特別涉及到操作系統(tǒng)原理時(shí),與DOS可以說是截然不同。

            Linux匯編程序設(shè)計(jì)

            一、Hello,world!

            幾乎所有的語言入門篇都是以“Hello,world!”為例,那么我也以Hello,world!為例開始。

            																		NASM's standalone Hello-World.asm for Linux 
            section .text
            extern puts
            global main
            
            main: 
            push dword msg ;stash the *** of msg on the stack.
            call puts ;call the 'puts' routine (libc?) 
            add esp, byte 4 ;clean the stack?
            ret ;exit.
            
            msg:
            db "Hello World!",0 
            
            編譯:
            nasm –f elf hello.asm
            gcc –o hello hello.o
            																

            說明:這個(gè)程序?qū)嶋H上是調(diào)用了,Linux系統(tǒng)的puts函數(shù),原理與調(diào)用DOS下C語言的函數(shù)相同,先用Extern聲明puts是外部函數(shù),再把參數(shù)(即msg的地址)壓入堆棧,最后Call函數(shù)實(shí)現(xiàn)輸出。

            我們?cè)賮砜匆粋€(gè)程序:

            																		section .text
            global main
            
            main: 
            mov eax,4 ;4號(hào)調(diào)用
            mov ebx,1 ;ebx送1表示stdout
            mov ecx,msg ;字符串的首地址送入ecx
            mov edx,14 ;字符串的長度送入edx
            int 80h ;輸出字串
            mov eax,1 ;1號(hào)調(diào)用
            int 80h ;結(jié)束
            msg:
            db "Hello World!",0ah,0dh 
            (編譯同上一個(gè)程序)
            																

            這個(gè)程序與DOS程序十分相似,它用的是linux中的80h中斷,相當(dāng)于DOS下的21h中斷,只是因?yàn)長inux是32位操作系統(tǒng),所以采用了 EAX、EBX等寄存器。但是Linux作為一個(gè)多用戶的操作系統(tǒng)與DOS又是有著非常大的區(qū)別的。要寫出有特色的程序,不了解操作系統(tǒng)和硬件是不行的。下面我介紹一下Linux操作系統(tǒng)。

            二、Linux操作系統(tǒng)簡介

            操作系統(tǒng)實(shí)際是抽象資源操作到具體硬件操作細(xì)節(jié)之間的接口。對(duì)Linux這樣的多用戶操作系統(tǒng)來說,它需要避免用戶對(duì)硬件的直接訪問,并防止用戶之間的互相干擾。所以Linux接管了 BIOS調(diào)用和端口輸入輸出,關(guān)于端口輸入輸出方面請(qǐng)參閱Linux IO-Port-Programming HOWTO。而要通過Linux對(duì)硬件硬件進(jìn)行訪問就需要用到System Call,實(shí)際上是許多C的函數(shù),可以在匯編程序中調(diào)用,調(diào)用方法與DOS下的匯編完全相同,而且用ASM匯編時(shí)不用鏈接額外的庫函數(shù)。

            Linux與DOS的主要區(qū)別在于內(nèi)存管理、進(jìn)程(DOS下無進(jìn)程概念)、文件系統(tǒng),其中內(nèi)存管理和進(jìn)程與匯編編程的關(guān)系比較密切:

            1、內(nèi)存管理

            對(duì)任一臺(tái)計(jì)算機(jī)而言,其內(nèi)存以及其他資源都是有限的。為了讓有限的物理內(nèi)存滿足應(yīng)用程序?qū)?nèi)存的大需求量,Linux采用了稱為“虛擬內(nèi)存”的內(nèi)存管理方式。Linux將內(nèi)存劃分為容易處理的“內(nèi)存頁”,在系統(tǒng)運(yùn)行過程中,應(yīng)用程序?qū)?nèi)存的需求大于物理內(nèi)存時(shí),Linux可將暫時(shí)不用的內(nèi)存頁交換到硬盤上,這樣,空閑的內(nèi)存頁可以滿足應(yīng)用程序的內(nèi)存需求,而應(yīng)用程序卻不會(huì)注意到內(nèi)存交換的發(fā)生。

            進(jìn)程

            進(jìn)程實(shí)際是某特定應(yīng)用程序的一個(gè)運(yùn)行實(shí)體。在Linux系統(tǒng)中,能夠同時(shí)運(yùn)行多個(gè)進(jìn)程,Linux通過在短的時(shí)間間隔內(nèi)輪流運(yùn)行這些進(jìn)程而實(shí)現(xiàn)“多任務(wù)”。這一短的時(shí)間間隔稱為“時(shí)間片”,讓進(jìn)程輪流運(yùn)行的方法稱為“調(diào)度”,完成調(diào)度的程序稱為調(diào)度程序。通過多任務(wù)機(jī)制,每個(gè)迸程可認(rèn)為只有自己獨(dú)占計(jì)算機(jī),從而簡化程序的編寫,每個(gè)進(jìn)程有自己單獨(dú)的地址空間,并且只能由這一進(jìn)程訪問,這樣,操作系統(tǒng)避免了進(jìn)程之間的互相干擾以及“壞”程序?qū)ο到y(tǒng)可能造成的危害。

            為了完成某特定任務(wù),有時(shí)需要綜合兩個(gè)程序的功能,例如一個(gè)程序輸出文本,而另一個(gè)程序?qū)ξ谋具M(jìn)行排序。為此,操作系統(tǒng)還提供進(jìn)程間的通訊機(jī)制來幫助完成這樣的任務(wù)。Linux中常見的進(jìn)程間通訊機(jī)制有信號(hào)、管道、共享內(nèi)存、信號(hào)量和套接字等。

            三、Linux下的匯編工具

            Linux下的匯編工具可謂百家爭鳴,不像DOS下都要給MASM和TASM給控制了。但是Linux下每一種匯編工具都有很大的區(qū)別,要想全部掌握幾乎是不可能的,下面我介紹幾種常用的匯編工具,重點(diǎn)介紹NASM及其使用和語法。

            1、GCC

            GCC其實(shí)是GNU的C語言產(chǎn)品,但它支持Inline Assemble,在GCC中inline assemble使用就像宏一樣,但它比宏能更清楚更準(zhǔn)確的表達(dá)機(jī)器的工作狀態(tài)。

            C是匯編編程的一個(gè)高度概括,它可以減少許多匯編中的麻煩,特別是在GCC這個(gè)C編譯器中,assemble似乎起不了多大的作用。

            2、GAS

            GAS 是Linux各版本中基本的匯編工具,但它采用的是AT&T的語法標(biāo)準(zhǔn)與Intel的語法標(biāo)準(zhǔn)有很大的不同,對(duì)于DOS編程的我們來說,學(xué)習(xí)起來是非常困難的。當(dāng)然如果要精通Linux下的匯編編程,學(xué)習(xí)GAS也是非常必要的,具體的語法標(biāo)準(zhǔn)可以參看Using GNU Assembler。

            3、GASP

            GASP是GAS的擴(kuò)展,它增強(qiáng)了GAS對(duì)宏的支持。

            4、NASM

            NASM是linux中語法與DOS最為相像的一種匯編工具。雖說如此,它與MASM也是有著很大區(qū)別的。

            l NASM的使用格式如下:

            Nasm –f -o

            例如:

            Nasm -f elf hello.asm

            將把hello.asm匯編成ELF object文件,而Nasm -f bin hello.asm -o hello.com會(huì)把hello.asm匯編成二進(jìn)制可執(zhí)行文件hello.com.Nasm –h將會(huì)列出NASM命令行的完整說明。NASM不會(huì)有任何輸出,除非有錯(cuò)誤發(fā)生。-f 在Linux下主要有aout和ELF兩種,如果你不確定你的Linux系統(tǒng)應(yīng)該用AOUT還是ELF,可以在NASM目錄中輸入 File nasm ,如果輸出nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1表示是ELF,如果輸出nasm: Linux/i386 demand-paged executable (QMAGIC)表示是aout。

            NASM與MASM的主要不同:

            首先與linux系統(tǒng)一樣,nasm是區(qū)分大小寫的,Hello與hello將是不同的標(biāo)識(shí)符,如果要匯編到DOS或OS/2,需要加入U(xiǎn)PPERCASE參數(shù)。

            其次,nasm中內(nèi)存操作數(shù)都是以[ ]表示。

            在MASM中

            																		foo equ 1 
            bar dw 2
            mov ax,foo 
            mov ax,bar
            																

            ?

            將被匯編成完全不同的指令,雖然它們?cè)贛ASM中的表達(dá)方式完全一樣。而NASM完全避免了這種混亂,它使用的是這樣的規(guī)則:所有對(duì)內(nèi)存的操作都必須通過 [ ]來實(shí)現(xiàn)。例如上例中對(duì)bar的操作就要寫成如下形式 mov ax,[bar]。由此可見,nasm中對(duì)offset的使用也是沒有必要的(nasm中無offset)。Nasm對(duì)[ ]的使用與masm也有所不同,所有的表達(dá)式都必須寫在[ ]中,下面舉兩個(gè)例子來說明:

            																		Masm Nasm 
            Mov ax,table[di]
            Mov ax,[table+di]
            
            Mov ax,es:[di]
            Mov ax,[es:di]
            
            Mov ax,[di]+1
            Mov ax,[di+1]
            																

            Nasm 中不存儲(chǔ)變量類型,原因很簡單masm中通過[ ]尋址方式的變量也必須要指定類型。Nasm中不支持LODS, MOVS, STOS, SCAS, CMPS, INS, OUTS,只支持lodsb、lodsw等已經(jīng)指定類型的操作。Nasm中不再有assume操作,段地址完全取決于存入段寄存器的值。關(guān)于NASM的使用方法及語法還可以參閱NASM使用手冊(cè)。

            結(jié)論

            我認(rèn)為不論是在Windows/DOS下還是在Linux下完完全全用匯編編一個(gè)大型程序已經(jīng)是不可能了,也不會(huì)有人愿意去這樣做。在windows下我們可以用VC,在Linux/Xwindows下我們可以用C甚至C++ Builder,但是像VC、C++ Builder之類的工具盡量隱藏了底層的調(diào)用,同時(shí)也阻隔了成為高手的機(jī)會(huì),因?yàn)榫幊鰜淼某绦驘o法了解它的執(zhí)行過程也就使編程中最重要的“可預(yù)測(cè)”性變得很低。正因?yàn)槿绱藚R編才有它存在的必要性,同時(shí)還有一個(gè)更重要的原因,正如《超級(jí)解霸》的作者梁肇新所說:“編程序的重點(diǎn)不是“編”,而是調(diào)試程序,理論上的完美在實(shí)現(xiàn)的時(shí)候會(huì)遇到很多細(xì)節(jié)問題,這些問題必須調(diào)試才能解決。我的編程習(xí)慣是一天寫五天調(diào)試,《超級(jí)解霸》是調(diào)試出來的,而不是寫出來的。調(diào)試就涉及到匯編的問題,不進(jìn)行匯編級(jí)的調(diào)試是不徹底的,也不能讓人放心。

            posted on 2008-01-07 17:38 旅途 閱讀(611) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 一步一步操作系統(tǒng)

            日韩亚洲国产综合久久久| 久久久久亚洲av成人网人人软件| 无码伊人66久久大杳蕉网站谷歌| 中文字幕久久精品无码| 国产亚洲色婷婷久久99精品| 国产成人精品久久亚洲高清不卡 | 久久91精品国产91久久麻豆| 国产精品久久久久久影院| 精品国产91久久久久久久a| 久久噜噜久久久精品66| 久久精品无码专区免费青青| 久久国产一片免费观看| 久久综合噜噜激激的五月天| 久久久久国产精品三级网| 久久99精品久久久久久动态图| 久久精品国产亚洲av瑜伽| 精品久久久无码人妻中文字幕豆芽| 久久99精品久久久久久野外| 久久久噜噜噜www成人网| 午夜精品久久久久9999高清| 99久久国产亚洲高清观看2024| 伊人久久大香线蕉亚洲五月天| 精品欧美一区二区三区久久久| 国产亚洲综合久久系列| 久久这里只有精品18| 久久成人小视频| 亚洲Av无码国产情品久久| 伊人久久免费视频| 2020最新久久久视精品爱| 国产精品99久久免费观看| 久久夜色精品国产噜噜亚洲AV| 一级a性色生活片久久无| 久久久久无码精品| 国内精品伊人久久久久影院对白 | 欧美亚洲国产精品久久久久| 99久久精品免费看国产一区二区三区| 久久久免费精品re6| 99久久免费国产精精品| 免费国产99久久久香蕉| 色成年激情久久综合| 狠狠久久综合|