組合語言
![本頁使用了標題或全文手工轉換](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
此條目需要擴充。 (2016年2月12日) |
![]() | |
編程範型 | 指令式編程 |
---|---|
面市時間 | 1949年 |
文件擴展名 | .asm |
匯編語言(英語:assembly language)[註 1][1]是任何一種用於電子計算機、微處理器、微控制器,或其他可編程器件的低級語言。在不同的設備中,匯編語言對應着不同的機器語言指令集。一種匯編語言專用於某種計算機系統結構,而不像許多高級語言,可以在不同系統平台之間移植。
使用匯編語言編寫的源代碼,然後通過相應的匯編程序將它們轉換成可執行的機器代碼。這一過程被稱為匯編過程。
匯編語言使用助記符(Mnemonics)來代替和表示特定低級機器語言的操作。特定的匯編目標指令集可能會包括特定的操作數。許多匯編程序可以識別代表地址和常量的標籤(Label)和符號(Symbols),這樣就可以用字符來代表操作數而無需採取寫死的方式。普遍地說,每一種特定的匯編語言和其特定的機器語言指令集是一一對應的。
許多匯編程序為程序開發、匯編控制、輔助調試提供了額外的支持機制。有的匯編語言編寫工具經常會提供巨集,它們也被稱為巨匯編器。
現在匯編語言已不像其他大多數的程序設計語言一樣被廣泛用於程序設計,在今天的實際應用中,它通常被應用在底層硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序中都會需要匯編語言。
工具
[編輯]典型的現代組譯器(assembler)建造目的碼,由解譯組語指令集的易記碼(Mnemonics)到操作碼,並解析符號名稱(Symbolic names)成為記憶體位址以及其它的實體。使用符號參考(symbolic references)是組譯器的一個重要特徵,它可以節省修改程式後人工轉址(manual address updates)的乏味耗時計算。基本就是把機器碼變成一些字母而已,編譯的時候再把輸入的指令字母替換成為晦澀難懂的機器碼。
現狀
[編輯]隨着現代軟件系統越來越龐大複雜,大量經過了封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程序員在開發過程中能夠更簡單,更有效率,使軟件開發人員得以應付快速的軟件開發的要求。而匯編語言由於其複雜性使得其適用領域逐步減小。但這並不意味着匯編已無用武之地。由於匯編更接近機器語言,能夠直接對硬件進行操作,生成的程序與其他的語言相比具有更高的運行速度,占用更小的內存,因此在一些對於時效性(timeliness)要求很高的程序以及工業控制方面大量應用。
因此,雖然有眾多編程語言可供選擇,但匯編依然是各大學計算機科學類專業學生的必修課,以讓學生深入了解計算機的運行原理。
組譯風格
[編輯]![](http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Rechts-_und_Linksshift.svg/220px-Rechts-_und_Linksshift.svg.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Apple_II_Monitor.png/220px-Apple_II_Monitor.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/System_370_Reference_Summary.jpg/220px-System_370_Reference_Summary.jpg)
x86/amd64匯編指令的兩大風格分別是Intel匯編與AT&T匯編,分別被Microsoft Windows/Visual C++與GNU/Gas採用(Gas也可使用Intel匯編風格):
項目 | Intel風格 | AT&T風格 |
---|---|---|
操作數順序 | 目標操作數在前 | 源操作數在前 |
寄存器 | 原樣 | 加%前綴 |
立即數 | 原樣 | 加$前綴 |
16進制立即數 | 用後綴B與H分別表示二進制與十六進制 對於16進制字母開頭的要加前綴0 |
加前綴0x |
訪問內存長度的表示 | 前綴BYTE PTR, WORD PTR, DWORD PTR
和QWORD PTR表示字節,字,雙字和四字 |
後綴b,w,l,q表示字節,字,雙字和四字 |
引用全局或靜態變量var的值 | [var] | var |
引用全局或靜態變量var的地址 | var | $var |
引用局部變量 | 需要基於棧指針(rsp) | |
絕對尋址 | [imm] | imm |
間接尋址 | [reg] | (%reg) |
基址相對尋址 | [reg +imm] | imm(%reg) |
變址尋址 | [base+index] | (base,index) |
變址尋址 | [base+index+imm] | imm(base,index) |
比例變址尋址 | [base + index * scale + imm] | imm(base, index, scale) |
scale只能是1,2,4,8其中的一個數字(1省略不寫就是普通變址尋址) | ||
代碼注釋 | 單行注釋用;+注釋內容。例如:
mov rax, rdx ;這裡是注釋 | |
注意 | 這裡imm為立即數,base和index為寄存器,scale為伸縮量 |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/IBM_keypunch_deck_for_Assembly_language_student_program_at_New_York_University_1979.jpg/220px-IBM_keypunch_deck_for_Assembly_language_student_program_at_New_York_University_1979.jpg)
相關著作
[編輯]- 王爽的《匯編語言》一書為匯編語言的教程,已經被一些大學當作教程使用。[2]類似的教程還包括《Windows環境下32位匯編語言程序設計》等等。
- 美國Duntemann, Jeff於2000年著作《組合語言步步學》 Assembly Language Step-by-Step。
- 澳洲Jorgensen, Ed 《x86-64架構組合語言於Ubuntu系統》x86-64 Assembly Language Programming with Ubuntu。
- 美國Waldron, John 的1998年著作《RISC系統下組合語言概論》 Introduction to RISC Assembly Language Programming. (ISBN 0-201-39828-1)
注釋
[編輯]- ^ 組合語言,英語:assembly language,assembler language
參考文獻
[編輯]- ^ Assembler language (頁面存檔備份,存於網際網路檔案館), IBM Knowledge center
- ^ 王爽. 汇编语言. 汇编语言 第三版. 北京: 清華大學出版社. 2013. ISBN 978-7-302-33314-2. OCLC 910380574.
參閱
[編輯]外部連結
[編輯]- (英文)NASM編譯器
- (英文)Linux Assembly (頁面存檔備份,存於網際網路檔案館)
- (英文)MASM32 (頁面存檔備份,存於網際網路檔案館) 用MASM寫Win32程式的小型SDK
- Assembly組合教學 (頁面存檔備份,存於網際網路檔案館)
|
|