組合語言
![本頁使用了標題或全文手工轉換](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組合教學 (頁面存檔備份,存於網際網路檔案館)
|
|