匯編語(yǔ)言是一種低層次的編程語(yǔ)言,一臺(tái)電腦,或其他具體到一個(gè)特定的計(jì)算機(jī)架構(gòu)中最高級(jí)編程語(yǔ)言,這是一般便攜式跨多個(gè)系統(tǒng)的可編程器件。匯編語(yǔ)言轉(zhuǎn)換成可執(zhí)行的機(jī)器代碼的一個(gè)實(shí)用程序稱為像NASM匯編MASM等
Assembly language(匯編語(yǔ)言)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符(Mnemonics)代替機(jī)器指令的操作碼,用地址符號(hào)(Symbol)或標(biāo)號(hào)(Label)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。普遍地說(shuō),特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植。
許多匯編程序?yàn)槌绦蜷_(kāi)發(fā)、匯編控制、輔助調(diào)試提供了額外的支持機(jī)制。有的匯編語(yǔ)言編程工具經(jīng)常會(huì)提供宏,它們也被稱為宏匯編器。匯編語(yǔ)言不像其他大多數(shù)的程序設(shè)計(jì)語(yǔ)言一樣被廣泛用于程序設(shè)計(jì)。在今天的實(shí)際應(yīng)用中,它通常被應(yīng)用在底層,硬件操作和高要求的程序優(yōu)化的場(chǎng)合。驅(qū)動(dòng)程序、嵌入式操作系統(tǒng)和實(shí)時(shí)運(yùn)行程序都需要匯編語(yǔ)言。
①說(shuō)明程序是如何與操作系統(tǒng)、處理器和BIOS接口的;
②說(shuō)明數(shù)據(jù)是如何表示并存儲(chǔ)在存儲(chǔ)器與外部設(shè)備上的;
③闡述處理器是如何訪問(wèn)與執(zhí)行指令的,以及指令是如何訪問(wèn)與處理數(shù)據(jù)的;
④闡述程序是如何訪問(wèn)外部設(shè)備的。
使用匯編語(yǔ)言的理由是:
能夠直接訪問(wèn)與硬件相關(guān)的存儲(chǔ)器或I/O端口;
能夠不受編譯器的限制,對(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ā)揮硬件的功能;
用匯編語(yǔ)言編寫的程序比用高級(jí)語(yǔ)言編寫的程序所要求的存儲(chǔ)空間與執(zhí)行時(shí)間將顯著減少;
匯編語(yǔ)言使程序員可以完成技術(shù)性非常強(qiáng)的任務(wù),而使用高級(jí)語(yǔ)言,即使可能做到,恐怕也會(huì)非常困難;
雖然大多數(shù)軟件專家是用高級(jí)語(yǔ)言開(kāi)發(fā)新的應(yīng)用軟件的(那樣做,程序會(huì)比較容易編寫的維護(hù)),但是對(duì)于執(zhí)行時(shí)間要求比較苛刻的部分,常常還要用匯編語(yǔ)言來(lái)重新編寫;
常駐程序(當(dāng)其他程序運(yùn)行的時(shí)候,常駐在存儲(chǔ)器中的程序)和中斷服務(wù)例行程序(處理輸入與輸出的程序)幾乎都是用匯編語(yǔ)言開(kāi)發(fā)的。
雖然匯編語(yǔ)言有諸多的優(yōu)點(diǎn),同時(shí)還應(yīng)該認(rèn)識(shí)到,匯編語(yǔ)言是一種層次非常低的語(yǔ)言,它僅僅高于直接手工編寫二進(jìn)制的機(jī)器指令碼,因此不可避免地存在一些缺點(diǎn):
編寫的代碼非常難懂,不好維護(hù); 很容易產(chǎn)生Bug,難于調(diào)試; 只能針對(duì)特定的體系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化; 開(kāi)發(fā)效率很低,時(shí)間長(zhǎng)且單調(diào)。
早期的程序設(shè)計(jì)均使用機(jī)器語(yǔ)言。程序員們將用0, 1數(shù)字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。這樣的機(jī)器語(yǔ)言由純粹的0和1構(gòu)成,十分復(fù)雜,不方便閱讀和修改,也容易產(chǎn)生錯(cuò)誤。程序員們很快就發(fā)現(xiàn)了使用機(jī)器語(yǔ)言帶來(lái)的麻煩,它們難于辨別和記憶,給整個(gè)產(chǎn)業(yè)的發(fā)展帶來(lái)了障礙,于是匯編語(yǔ)言產(chǎn)生了。
匯編語(yǔ)言的主體是匯編指令。匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書(shū)寫格式。
操作:寄存器BX的內(nèi)容送到AX中
1000100111011000 機(jī)器指令
mov ax,bx 匯編指令
此后,程序員們就用匯編指令編寫源程序??墒?,計(jì)算機(jī)能讀懂的只有機(jī)器指令,那么如何讓計(jì)算機(jī)執(zhí)行程序員用匯編指令編寫的程序呢?這時(shí),就需要有一個(gè)能夠?qū)R編指令轉(zhuǎn)換成機(jī)器指令的翻譯程序,這樣的程序我們稱其為編譯器。程序員用匯編語(yǔ)言寫出源程序,再用匯編編譯器將其編譯為機(jī)器碼,由計(jì)算機(jī)最終執(zhí)行。
21世紀(jì)以來(lái),學(xué)習(xí)匯編的人雖然也不少,但是真正能學(xué)到精通的卻不多,它相對(duì)于高級(jí)語(yǔ)言難學(xué),難用,適用范圍小,雖然簡(jiǎn)單,但是過(guò)于靈活,學(xué)習(xí)過(guò)高級(jí)語(yǔ)言的人去學(xué)習(xí)匯編比一開(kāi)始學(xué)匯編的人難得多,但是學(xué)過(guò)匯編的人學(xué)習(xí)高級(jí)語(yǔ)言卻很容易,簡(jiǎn)從繁易,繁從簡(jiǎn)難。對(duì)于一個(gè)全面了解微機(jī)原理的程序員,匯編語(yǔ)言是必修語(yǔ)言。
在您開(kāi)始學(xué)習(xí) Assembly Language 之前,您應(yīng)該對(duì)以下知識(shí)有基本的了解:
w3cschool《C語(yǔ)言教程》
本地環(huán)境設(shè)置:
匯編語(yǔ)言是依賴于指令集和架構(gòu)的處理器。在本教程中,我們使用英特爾32處理器,如奔騰。按照本教程中將需要:
1、一臺(tái)IBM PC兼容電腦或任何同等
2、Linux操作系統(tǒng)副本
3、NASM匯編程序的副本
有很多很好的匯編程序,如:
1、微軟匯編(MASM)
2、Borland公司的Turbo匯編(TASM)
3、GNU匯編器(GAS)
我們將使用NASM匯編,因?yàn)樗牵?/p>
1、免費(fèi)??梢詮木W(wǎng)絡(luò)下載。有據(jù)可查的,會(huì)得到大量網(wǎng)上的信息。
2、可以用在Linux和Windows
3、安裝NASM
如果選擇“開(kāi)發(fā)工具”,而安裝Linux,可以隨著Linux操作系統(tǒng)安裝NASM,不需要單獨(dú)下載并安裝。
檢查是否已經(jīng)安裝了NASM,采取以下步驟:
1、打開(kāi)一個(gè)Linux終端。
2、輸入whereis NASM,然后按ENTER鍵。
如果已經(jīng)安裝,則類似這樣一行,nasm: /usr/bin/nasm將出現(xiàn)。否則將看到的只是NASM,那么需要安裝NASM。
要安裝NASM采取以下步驟:
1、詳細(xì)訪問(wèn)NASM官網(wǎng)The netwide assembler (NASM) 查看最新版本。
2、下載Linux源歸檔文件nasm-X.XX. ta .gz。GZ,其中X.XX為NASM版本號(hào)到存檔。
3、解壓縮到一個(gè)目錄,創(chuàng)建一個(gè)子目錄 nasm-X. XX.
4、進(jìn)入目錄 nasm-X. XX 然后輸入 ./configure . 此shell腳本將找到最好的C編譯器的使用和設(shè)置相應(yīng)的Makefile。
5、輸入 make 來(lái)建立NASM和ndisasm的二進(jìn)制文件。
6、輸入make install NASM和ndisasm安裝在/usr/local/bin目錄和安裝手冊(cè)頁(yè)。
這應(yīng)該在系統(tǒng)上安裝NASM。另外在Linux系統(tǒng)中可以使用RPM分發(fā)。這個(gè)版本是簡(jiǎn)單安裝,只需雙擊該RPM文件。
本教程共由20個(gè)章節(jié)構(gòu)成,詳細(xì)講述了Assembly Language的基礎(chǔ)使用方法:
本教程包含:
1、Assembly 基礎(chǔ)介紹
2、Assembly 基本匯編語(yǔ)言
3、Assembly 位操作
4、Assembly 子程序
5、Assembly 數(shù)組
6、Assembly 浮點(diǎn)
7、結(jié)構(gòu)體與C++
8、80X86指令