匯編語言

匯編語言

匯編語言(assembly language)是一種用于電子電腦、微處理器微控製器或其他可程式器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機器指令操作碼,用地址符號(Symbol)或標號(Label)代替指令或運算元的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的不同平台之間不可直接移植。

許多匯編程式為程式開發、匯編控製、輔助調試提供了額外的支持機製。有的匯編語言編程工具經常會提供宏,它們也被稱為宏匯編器。

匯編語言不像其他大多數的程式語言一樣被廣泛用于程式設計。在今天的實際套用中,它通常被套用在底層,硬體操作和高要求的程式最佳化的場合。驅動程式、嵌入式作業系統和即時運行程式都需要匯編語言。

  • 中文名稱
    匯編語言
  • 外文名稱
    Assembly Language
  • 編譯方式
    匯編
  • 學    科
    軟體工程
  • 產生年代
    20世紀50年代

基本簡介

匯編語言(AssemblyLanguage)是面向機器的程式設計語言。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言二進位碼,就把機器語言變成了匯編語言。于是匯編語言亦稱為符號語言。

匯編語言

使用匯編語言編寫的程式,機器不能直接識別,要由一種程式將匯編語言翻譯成機器語言,這種起翻譯作用的程式叫匯編程式,匯編程式是系統軟體語言處理系統軟體。匯編程式把匯編語言翻譯成機器語言的過程稱為匯編。

主要特點

1.面向機器的低級語言,通常是為特定的電腦或系列電腦專門設計的。

匯編語言

2.保持了機器語言的優點,具有直接和簡捷的特點。

3.可有效地訪問、控製電腦的各種硬體設備,如磁碟存儲器、CPU、I/O連線埠等。

4.目標代碼簡短,佔用記憶體少,執行速度快,是高效的程式語言。

5.經常與高級語言配合使用,套用十分廣泛。

簡捷性 

匯編語言由于採用了助記符號來編寫程式,比用機器語言的二進位代碼編程要方便些,在一定程度上簡化了編程過程。匯編語言的特點是用符號代替了機器指令代碼,而且助記符與指令代碼一一對應,基本保留了機器語言的彈性。使用匯編語言能面向機器並較好地發揮機器的特徵,得到質量較高的程式。

匯編語言 匯編語言

執行過程

用匯編語言編製的程式輸入電腦,電腦不能象用機器語言編寫的程式一樣直接識別和執行,必須通過預先放入電腦的"匯編程式"中進行加工和翻譯,才能變成能夠被電腦直接識別和處理的二進位代碼程式。用匯編語言等非機器語言書寫好的符號程式稱為源程式,運行時匯編程式要將源程式翻譯成目標程式。目標程式是機器語言程式,當它被安置在記憶體的預定位置上,就能被電腦的CPU處理和執行。

獨特徵

匯編語言是面向具體機型的,它離不開具體電腦的指令系統,因此,對于不同型號的電腦,有著不同的結構的匯編語言,而且,對于同一問題所編製的匯編語言程式在不同種類的電腦間是互不相通的。

優點

1.面向機器的低級語言,通常是為特定的電腦或系列電腦專門設計的。

匯編語言

2.保持了機器語言的優點,具有直接和簡捷的特點。

3.可有效地訪問、控製電腦的各種硬體設備,如磁碟、存儲器、CPU、I/O連線埠等。

4.目標代碼簡短,佔用記憶體少,執行速度快,是高效的程式語言。

5.經常與高級語言配合使用,套用十分廣泛。

缺點

同時還應該認識到,匯編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進位的機器指令碼,因此不可避免地存在一些缺點:

匯編語言

(1)編寫的代碼非常難懂,不好維護;

(2)很容易產生bug,難于調試;

(3)隻能針對特定的體系結構和處理器進行最佳化;

(4)開發效率很低,時間長且單調。

基本術語

資料傳輸指令

它們在存貯器和暫存器、暫存器和輸入輸出連線埠之間傳送資料。

1. 通用資料傳送指令

MOV 傳送字或位元組.

MOVSX 先符號擴展,再傳送.

MOVZX 先零擴展,再傳送.

PUSH 把字壓入堆疊.

POP 把字彈出堆疊.

PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆疊.

POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆疊.

PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆疊.

POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆疊.

BSWAP 交換32位暫存器裏位元組的順序

XCHG 交換字或位元組.( 至少有一個運算元為暫存器,段暫存器不可作為運算元)

CMPXCHG 比較並交換運算元.( 第二個運算元必須為累加器AL/AX/EAX )

XADD 先交換再累加.( 結果在第一個運算元裏 )

XLAT 位元組查表轉換.

── BX 指向一張 256 位元組的表的起點, AL 為表的索引值 (0-255,即0-FFH); 返回 AL 為查表結果. ( [BX+AL]->AL )

2. 輸入輸出連線埠傳送指令.

IN I/O連線埠輸入. ( 文法: IN 累加器, {連線埠號│DX} )

OUT I/O連線埠輸出. ( 文法: OUT {連線埠號│DX},累加器 )

輸入輸出連線埠由立即方式指定時, 其範圍是 0-255; 由暫存器 DX 指定時, 其範圍是 0-65535.

3. 目的地址傳送指令.

LEA 裝入有效地址. 例: LEA DX,string ;把偏移地址存到DX.

LDS 傳送目標指針,把指針內容裝入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.

LES 傳送目標指針,把指針內容裝入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI.

LFS 傳送目標指針,把指針內容裝入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI.

LGS 傳送目標指針,把指針內容裝入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI.

LSS 傳送目標指針,把指針內容裝入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

4. 標志傳送指令.

LAHF 標志暫存器傳送,把標志裝入AH.

SAHF 標志暫存器傳送,把AH內容裝入標志暫存器.

PUSHF 標志入堆.

POPF 標志出堆.

PUSHD 32位標志入堆.

POPD 32位標志出堆.

算術運算指令

ADD 加法.

ADC 帶進位加法.

INC 加 1.

AAA 加法的ASCII碼調整.

DAA 加法的十進位調整.

SUB 減法.

SBB 帶借位減法.

DEC 減 1.

NEC 求反(以 0 減之).

CMP 比較.(兩運算元作減法,僅修改標志位,不回送結果).

AAS 減法的ASCII碼調整.

DAS 減法的十進位調整.

MUL 無符號乘法.

IMUL 整數乘法.

以上兩條,結果回送AH和AL(位元組運算),或DX和AX(字運算),

AAM 乘法的ASCII碼調整.

DIV 無符號除法.

IDIV 整數除法.

以上兩條,結果回送:

商回送AL,餘數回送AH, (位元組運算);

或 商回送AX,餘數回送DX, (字運算).

AAD 除法的ASCII碼調整.

CBW 位元組轉換為字. (把AL中位元組的符號擴展到AH中去)

CWD 字轉換為雙字. (把AX中的字的符號擴展到DX中去)

CWDE 字轉換為雙字. (把AX中的字元號擴展到EAX中去)

CDQ 雙字擴展. (把EAX中的字的符號擴展到EDX中去)

邏輯運算指令

AND 與運算.

or 或運算.

XOR 異或運算.

NOT 取反.

TEST 測試.(兩運算元作與運算,僅修改標志位,不回送結果).

SHL 邏輯左移.

SAL 算術左移.(=SHL)

SHR 邏輯右移.

SAR 算術右移.(=SHR)

ROL 迴圈左移.

ROR 迴圈右移.

RCL 通過進位的迴圈左移.

RCR 通過進位的迴圈右移.

以上八種移位指令,其移位次數可達255次.

移位一次時, 可直接用操作碼. 如 SHL AX,1.

移位>1次時, 則由暫存器CL給出移位次數.

如 MOV CL,04

SHL AX,CL

串指令

DS:SI 源串段暫存器 :源串變址.

ES:DI 目標串段暫存器:目標串變址.

CX 重復次數計數器.

AL/AX 掃描值.

D標志 0表示重復操作中SI和DI應自動增量; 1表示應自動減量.

Z標志 用來控製掃描或比較操作的結束.

MOVS 串傳送.

( MOVSB 傳送字元. MOVSW 傳送字. MOVSD 傳送雙字. )

CMPS 串比較.

( CMPSB 比較字元. CMPSW 比較字. )

SCAS 串掃描.

把AL或AX的內容與目標串作比較,比較結果反映在標志位.

LODS 裝入串.

把源串中的元素(字或位元組)逐一裝入AL或AX中.

( LODSB 傳送字元. LODSW 傳送字. LODSD 傳送雙字. )

STOS 儲存串.

是LODS的逆過程.

REP 當CX/ECX<>0時重復.

REPE/REPZ 當ZF=1或比較結果相等,且CX/ECX<>0時重復.

REPNE/REPNZ 當ZF=0或比較結果不相等,且CX/ECX<>0時重復.

REPC 當CF=1且CX/ECX<>0時重復.

REPNC 當CF=0且CX/ECX<>0時重復.

程式轉移指令

1>無條件轉移指令 (長轉移)

JMP 無條件轉移指令

CALL 過程調用

RET/RETF過程返回.

2>條件轉移指令 (短轉移,-128到+127的距離內)

( 當且僅當(SF XOR OF)=1時,OP1<OP2 )

JA/JNBE 不小于或不等于時轉移.

JAE/JNB 大于或等于轉移.

JB/JNAE 小于轉移.

JBE/JNA 小于或等于轉移.

以上四條,測試無符號整數運算的結果(標志C和Z).

JG/JNLE 大于轉移.

JGE/JNL 大于或等于轉移.

JL/JNGE 小于轉移.

JLE/JNG 小于或等于轉移.

以上四條,測試帶符號整數運算的結果(標志S,O和Z).

JE/JZ 等于轉移.

JNE/JNZ 不等于時轉移.

JC 有進位時轉移.

JNC 無進位時轉移.

JNO 不溢出時轉移.

JNP/JPO 奇偶性為奇數時轉移.

JNS 符號位為 "0" 時轉移.

JO 溢出轉移.

JP/JPE 奇偶性為偶數時轉移.

JS 符號位為 "1" 時轉移.

3>迴圈控製指令(短轉移)

LOOP CX不為零時迴圈.

LOOPE/LOOPZ CX不為零且標志Z=1時迴圈.

LOOPNE/LOOPNZ CX不為零且標志Z=0時迴圈.

JCXZ CX為零時轉移.

JECXZ ECX為零時轉移.

4>中斷指令

INT 中斷指令

INTO 溢出中斷

IRET 中斷返回

5>處理器控製指令

HLT 處理器暫停, 直到出現中斷或復位信號才繼續.

WAIT 當晶片引線TEST為高電平時使CPU進入等待狀態.

ESC 轉換到外處理器.

LOCK 封鎖匯流排.

NOP 空操作.

STC 置進位標志位.

CLC 清進位標志位.

CMC 進位標志取反.

STD 置方向標志位.

CLD 清方向標志位.

STI 置中斷允許位.

CLI 清中斷允許位.

偽指令

DW 定義字(2位元組).

PROC 定義過程.

ENDP 過程結束.

SEGMENT 定義段.

ASSUME 建立段暫存器定址.

ENDS 段結束.

END 程式結束.

七、處理機控製指令:

標志處理指令 CLC(進位位置0指令)

CMC(進位位求反指令)

STC(進位位置為1指令)

CLD(方向標志置0指令)

STD(方向標志位置1指令)

CLI(中斷標志置0指令)

STI(中斷標志置1指令)

NOP(無操作)

HLT(停機)

WAIT(等待)

ESC(換碼)

LOCK(封鎖)

相關套用

匯編語言作為最基本的程式語言之一,匯編語言雖然套用的範圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿Linux核心來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在Linux的啓動部分。由于這部分代碼與硬體的關系非常密切,即使是C語言也會有些力不從心,而匯編語言則能夠很好揚長避短,最大限度地發揮硬體的性能。

匯編語言

1.70%以上的系統軟體是用匯編語言編寫的。

2.某些快速處理、位處理、訪問硬體設備等高效程式是用匯編語言編寫的。

3.某些高級繪圖程式、影片遊戲程式是用匯編語言編寫的。

匯編語言是理解整個電腦系統的最佳起點和最有效途徑,人們經常認為匯編語言的套用範圍很小,而忽視它的重要性。其實匯編語言對每一個希望學習電腦科學與技術的人來說都是非常重要的,是不能不學習的語言。所有可程式電腦都向人們提供機器指令,通過機器指令人們能夠使用機器的邏輯功能。所有程式,不論用何種語言編製,都必須轉成機器指令,運用機器的邏輯功能,其功能才能得以實現。機器的邏輯功能,軟體系統功能構築其上,硬體系統功能運行于下。匯編語言直接描述機器指令,比機器指令容易記憶和理解。通過學習和使用匯編語言,能夠感知、體會、理解機器的邏輯功能,向上為理解各種軟體系統的原理,打下技術理論基礎;向下為掌握硬體系統的原理,打下實踐套用基礎。學習匯編語言,向上可以理解軟體,向下能夠感知硬體,是我們理解整個電腦系統的最佳起點。

發展前景

匯編語言是機器語言的助記符,相對于比枯燥的機器代碼易于讀寫、易于調試和修改,同時優秀的匯編語言設計者經過巧妙的設計,使得匯編語言匯編後的代碼比高級語言執行速度更快,佔記憶體空間少等優點,但匯編語言的運行速度和空間佔用是針對高級語言並且需要巧妙設計,而且目前部分高級語言在編譯後代碼執行效率同樣很高,目前此優點慢慢弱化。而且在編寫復雜程式時具有明顯的局限性,匯編語言依賴于具體的機型,不能通用,也不能在不同機型之間移植。常說匯編語言是低級語言,並不是說匯編語言要被棄之,相反,匯編語言仍然是電腦(或微機)底層設計程式員必須了解的語言,在某些行業與領域,匯編是必不可少的,非它不可適用。隻是,現在電腦最大的領域為IT軟體,也是我們常說的電腦套用軟體編程,在熟練的程式員手裏,使用匯編語言編寫的程式,運行效率與性能比其它語言寫的程式相對提高,但是代價是需要更長的時間來最佳化,如果對電腦原理及編程基礎不扎實,反而增加其開發難度,實在是得不償失,對比現在的軟體開發,已經是市場化的軟體行業,加上高級語言的優秀與跨平台,一個公司不可以讓一個團隊使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,隻要最終結果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。[7-8]

匯編語言

但是,迄今為止,還沒有程式員敢斷定匯編語言是不需要學的,同時,匯編語言(Assembly Language)是面向機器的程式語言,設計精湛的匯編程式員,部分已經脫離軟體開發,擠身于工業電子編程中。對于功能相對小巧但硬體對語言設計要求苛刻的行業,如4位單片機,由于其容量及運算,此行業的電子工程師一般負責從開發設計電路及軟體控製,主要開發語言就是匯編,c語言使用隻佔極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程式員的十倍以上。這種情況是因為現在學習匯編的人雖然也不少,但是真正能學到精通的卻不多,它相對于高級語言難學,難用,適用範圍小,雖然簡單,但是過于靈活,學習過高級語言的人去學習匯編比一開始學匯編的人難得多,但是學過匯編的人學習高級語言卻很容易,簡從繁易,繁從簡難。對于一個全面了解微機原理的程式員,匯編語言是必修語言。    

其他資料

經典教材

《80X86匯編語言基礎教程》,《匯編語言》,《新版匯編語言程式設計》,《匯編語言程式設計》。

編譯環境

匯編語言

匯編的調試環境總的來說比較少,也很少有非常好的編譯器。reallychenchi設計的輕松匯編是一款非常適合初學者的匯編編譯器。輕松匯編是一個匯編語言集成開發環境,主要面向匯編語言初學者,也可以用它進行開發。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、連結、調試匯編程式,非常方便實用。 輕松匯編的最大特點是可以格式整理,就像VC6.0一樣,可以設定斷點調試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運行,是一款很優秀的軟體。

相關詞條

相關搜尋

其它詞條