汇编语言是一种什么程序设计语言?
本教程主要介紹與運(yùn)行 Microsoft Windows 32 位和 64 位系統(tǒng)的 Intel 和 AMD 處理器相兼容的微處理器編程。
?
教程中使用了 Microsoft 宏匯編器(稱為 MASM)的最新版本。Microsoft Visual Studio 的大多數(shù)版本(專業(yè)版,旗艦版,精簡版……)都包含 MASM。
可以訪問(asmirvine.com),了解 Visual Studio 對 MASM 支持的最新詳細(xì)信息。同時(shí),網(wǎng)站中還包括很多關(guān)于如何設(shè)置軟件并開始使用的有用信息。
在運(yùn)行 Microsoft Windows 的 x86 系統(tǒng)中,其他一些有名的匯編器包括:TASM(Turbo 匯編器),NASM(Netwide 匯編器)和 MASM32(MASM 的一種變體)。GAS(GNU 匯編器)和 NASM 是兩種基于 Linux 的匯編器。在這些匯編器中,NASM 的語法與 MASM 的最相似。
匯編語言是最古老的編程語言,在所有的語言中,它與原生機(jī)器語言最為接近。它能直接訪問計(jì)算機(jī)硬件,要求用戶了解計(jì)算機(jī)架構(gòu)和操作系統(tǒng)。
如果小伙伴正在學(xué)的大學(xué)課程的名稱與下列課程之一相似,可以通過本教程學(xué)到更多的專業(yè)知識:
- 微計(jì)算機(jī)匯編語言
- 匯編語言編程
- 計(jì)算機(jī)體系結(jié)構(gòu)導(dǎo)論
- 計(jì)算機(jī)系統(tǒng)基礎(chǔ)
- 嵌入式系統(tǒng)編程
通過本教程有助于學(xué)習(xí)計(jì)算機(jī)體系結(jié)構(gòu)、機(jī)器語言和底層編程的基本原理。可以學(xué)到足夠的匯編語言,來測試其掌握的當(dāng)今使用最廣泛的微處理器系列的知識。不會學(xué)到用模擬匯編器來編寫一個(gè)“玩具”計(jì)算機(jī);MASM 是一個(gè)由業(yè)界專業(yè)人士使用的工業(yè)級匯編器。大家將從程序員的角度來了解 Intel 處理器系列的體系結(jié)構(gòu)。
如果小伙伴計(jì)劃成為 C 或 C++ 開發(fā)者,就需要理解內(nèi)存、地址和指令是如何在底層工作的。在高級語言層次上,很多編程錯(cuò)誤不容易被識別。因此,程序員經(jīng)常會發(fā)現(xiàn)需要“深入”到程序內(nèi)部,才能找出程序不工作的原因。
學(xué)習(xí)匯編可能會問的問題
需要怎樣的背景知識?
在學(xué)習(xí)本教程之前,至少使用過一種結(jié)構(gòu)化高級語言進(jìn)行編程,如 Java、C、Python 或 C++。需要了解如何使用 IF 語句、數(shù)組和函數(shù)來解決編程問題。
什么是匯編器和鏈接器?
匯編器(assembler)是一種工具程序,用于將匯編語言源程序轉(zhuǎn)換為機(jī)器語言。鏈接器(linker)也是一種工具程序,它把匯編器生成的單個(gè)文件組合為一個(gè)可執(zhí)行程序。還有一個(gè)相關(guān)的工具,稱為調(diào)試器(debugger),使程序員可以在程序運(yùn)行時(shí),單步執(zhí)行程序并檢查寄存器和內(nèi)存狀態(tài)。
需要哪些硬件和軟件?
一臺運(yùn)行 32 位或 64 位 Microsoft Windows 系統(tǒng)的計(jì)算機(jī),并已安裝了近期版本的 Microsoft Visual Studio。
MASM 能創(chuàng)建哪些類型的程序?
32 位保護(hù)模式(32-Bit Protected Mode):32 位保護(hù)模式程序運(yùn)行于所有的 32 位和 64 位版本的 Microsoft Windows 系統(tǒng)。它們通常比實(shí)模式程序更容易編寫和理解。從現(xiàn)在開始,將其簡稱為 32 位模式。
64 位模式(64-Bit Mode):64 位程序運(yùn)行于所有的 64 位版本 Microsoft Windows 系統(tǒng)。
16 位實(shí)地址模式(16-Bit Real-Address Mode):16 位程序運(yùn)行于 32 位版本 Windows 和嵌入式系統(tǒng)。 64 位 Windows 不支持這類程序。
匯編語言與機(jī)器語言有什么關(guān)系?
機(jī)器語言(machine language)是一種數(shù)字語言, 專門設(shè)計(jì)成能被計(jì)算機(jī)處理器(CPU)理解。所有 x86 處理器都理解共同的機(jī)器語言。
匯編語言(assembly language)包含用短助記符如 ADD、MOV、SUB 和 CALL 書寫的語句。匯編語言與機(jī)器語言是一對一(one-to-one)的關(guān)系:每一條匯編語言指令對應(yīng)一條機(jī)器語言指令。
C++ 和 Java 與匯編語言有什么關(guān)系?
高級語言如 Python、C++ 和 Java 與匯編語言和機(jī)器語言的關(guān)系是一對多(one-to-many)。比如,C++ 的一條語句就會擴(kuò)展為多條匯編指令或機(jī)器指令。
大多數(shù)人無法閱讀原始機(jī)器代碼,因此,這里探討的是與之最接近的匯編語言。例如,下面的 C++ 代碼進(jìn)行了兩個(gè)算術(shù)操作,并將結(jié)果賦給一個(gè)變量。假設(shè) X 和 Y 是 整數(shù):
int Y; int X = ( Y + 4 ) * 3;與之等價(jià)的匯編語言程序如下所示。這種轉(zhuǎn)換需要多條語句,因?yàn)槊織l匯編語句只對應(yīng)一條機(jī)器指令:
mov eax,Y ;Y 送入 EAX 寄存器 add eax,4 ;EAX 寄存器內(nèi)容加 4 mov ebx,3 ;3 送入 EBX 寄存器 imul ebx ;EAX 與 EBX 相乘 mov x,eax ;EAX 的值送入 X寄存器(register)是 CPU 中被命名的存儲位置,用于保存操作的中間結(jié)果。這個(gè)例子的重點(diǎn)不是說明 C++ 與匯編語言哪個(gè)更好,而是展示它們的關(guān)系。
匯編語言可移植嗎?
一種語言,如果它的源程序能夠在各種各樣的計(jì)算機(jī)系統(tǒng)中進(jìn)行編譯和運(yùn)行,那么這種語言被稱為是可移植的(portable)。
例如,一個(gè) C++ 程序,除非需要特別引用某種操作系統(tǒng)的庫函數(shù),否則它就幾乎可以在任何一臺計(jì)算機(jī)上編譯和運(yùn)行。Java 語言的一大特點(diǎn)就是,其編譯好的程序幾乎能在所有計(jì)算機(jī)系統(tǒng)中運(yùn)行。
匯編語言不是可移植的,因?yàn)樗菫樘囟ㄌ幚砥飨盗性O(shè)計(jì)的。目前廣泛使用的有多種不同的匯編語言,每一種都基于一個(gè)處理器系列。
對于一些廣為人知的處理器系列如 Motorola 68×00、x86、SUN Sparc、Vax 和 IBM-370,匯編語言指令會直接與該計(jì)算機(jī)體系結(jié)構(gòu)相匹配,或者在執(zhí)行時(shí)用一種被稱為微代碼解釋器(microcode interpreter)的處理器內(nèi)置程序來進(jìn)行轉(zhuǎn)換。
為什么要學(xué)習(xí)匯編語言?
如果對學(xué)習(xí)匯編語言還心存疑慮,考慮一下這些觀點(diǎn):
- 如果是學(xué)習(xí)計(jì)算機(jī)工程,那么很可能會被要求寫嵌入式(embedded)程序。嵌入式程序是指一些存放在專用設(shè)備中小容量存儲器內(nèi)的短程序,這些專用設(shè)備包括:電話、汽車燃油和點(diǎn)火系統(tǒng)、空調(diào)控制系統(tǒng)、安全系統(tǒng)、數(shù)據(jù)采集儀器、顯卡、聲卡、硬盤驅(qū)動器、調(diào)制解調(diào)器和打印機(jī)。由于匯編語言占用內(nèi)存少,因此它是編寫嵌入式程序的理想工具。
- 處理仿真和硬件監(jiān)控的實(shí)時(shí)應(yīng)用程序要求精確定時(shí)和響應(yīng)。高級語言不會讓程序員對編譯器生成的機(jī)器代碼進(jìn)行精確控制。匯編語言則允許程序員精確指定程序的可執(zhí)行代碼。
- 電腦游戲要求軟件在減少代碼大小和加快執(zhí)行速度方面進(jìn)行高度優(yōu)化。就針對一個(gè)目標(biāo)系統(tǒng)編寫能夠充分利用其硬件特性的代碼而言,游戲程序員都是專家。他們經(jīng)常選擇匯編語言作為工具,因?yàn)閰R編語言允許直接訪問計(jì)算機(jī)硬件,所以,為了提高速度可以對代碼進(jìn)行手工優(yōu)化。
- 匯編語言有助于形成對計(jì)算機(jī)硬件、操作系統(tǒng)和應(yīng)用程序之間交互的全面理解。使用匯編語言,可以運(yùn)用并檢驗(yàn)從計(jì)算機(jī)體系結(jié)構(gòu)和操作系統(tǒng)課程中獲得的理論知識。
- 一些高級語言對其數(shù)據(jù)表示進(jìn)行了抽象,這使得它們在執(zhí)行底層任務(wù)時(shí)顯得有些不方便,如位控制。在這種情況下,程序員常常會調(diào)用使用匯編語言編寫的子程序來完成他們的任務(wù)。
- 硬件制造商為其銷售的設(shè)備創(chuàng)建設(shè)備驅(qū)動程序。設(shè)備驅(qū)動程序(device driver)是一種程序,它把通用操作系統(tǒng)指令轉(zhuǎn)換為對硬件細(xì)節(jié)的具體引用。比如,打印機(jī)制造商就為他們銷售的每一種型號都創(chuàng)建了一種不同的 MS-Windows 設(shè)備驅(qū)動程序。通常,這些設(shè)備驅(qū)動程序包含了大量的匯編語言代碼。
匯編語言有規(guī)則嗎?
大多數(shù)匯編語言規(guī)則都是以目標(biāo)處理器及其機(jī)器語言的物理局限性為基礎(chǔ)的。比如,CPU 要求兩個(gè)指令操作數(shù)的大小相同。與C++ 或 Java 相比,匯編語言的規(guī)則較少,因?yàn)?#xff0c;前者是用語法規(guī)則來減少意外的邏輯錯(cuò)誤,而這是以限制底層數(shù)據(jù)訪問為代價(jià)的。
匯編語言程序員可以很容易地繞過高級語言的限制性特征。例如,Java 就不允許訪問特定的內(nèi)存地址。程序員可以使用 JNI(Java Native Interface)類來調(diào)用 C 函數(shù)繞過這個(gè)限制,可結(jié)果程序不容易維護(hù)。
反之,匯編語言可以訪問所有的內(nèi)存地址。但這種自由的代價(jià)也很高:匯編語言程序員需要花費(fèi)大量的時(shí)間進(jìn)行調(diào)試。
下一篇:匯編語言的應(yīng)用
總結(jié)
以上是生活随笔為你收集整理的汇编语言是一种什么程序设计语言?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用matlab解线性规划题目,用MATL
- 下一篇: 逻辑思维训练500题及答案