汇编语言初探
一、什么是匯編語言
匯編語言是(英語:Assembly Language)是一種用于電子計算機、微處理器、微控制器、或其他可編程器件的低級語言。
這是維基百科上對匯編語言的解釋。其實匯編語言與常見的 C、C++、Java 等語言一樣,都用來 “ 指揮 ” 計算機完成某項工作。只不過匯編語言是直接在硬件上運行的一種編程語言,像?C、C++、Java 等高級語言最終也會被 “ 翻譯 ” 成匯編語言。
二、為什么要學(xué)習(xí)匯編語言
匯編語言是人和計算機溝通最直接的方式,它描述了最終計算機所要執(zhí)行的指令序列的意義。當你和一個會說八國語言的人交流時,最有效的方式還是和他用母語交流。這個比喻好像有點牽強,但是中心思想就是:通過學(xué)習(xí)匯編語言我們可以更加深入的理解計算機的工作方式。
學(xué)習(xí)匯編還有一個好處,那就是能體驗到底層編程所帶來的樂趣。
我目前使用的是 Java 語言進行一些開發(fā),都知道 Java 語言是跨平臺的,一個 java 文件(源代碼)如下:
public class demo {public static void main(String[] args) {int a = 1;a = 6;for (int i = 0; i < a; i++) {a++;}} }該文件首先被編譯成 class 文件(字節(jié)碼),再將 class 文件送入 JVM 中執(zhí)行。JVM 再將 class 文件中的字節(jié)碼翻譯成對應(yīng)平臺的機器碼。下面貼出這個 class 文件反匯編后(使用 javap 命令)得到的匯編代碼。
雖然這些匯編指令是 JVM 中特有的,但是應(yīng)用起來和一般微處理器的匯編指令都是相通的。
都說深入 JVM 是一個 Java 高級工程師的必經(jīng)之路,在我看來知識都是一步一步積累起來的,任何跳躍式的學(xué)習(xí)都是不靠譜的,讓一個連匯編語言都不會的人直接去學(xué)習(xí) JVM 相關(guān)的知識,效果可想而知。
綜合這些因素,我開啟了匯編語言的學(xué)習(xí)之路。在我的學(xué)習(xí)過程中,主要的參考書籍是王爽教授的 匯編語言?這本書。
三、匯編語言基礎(chǔ)知識
(一)機器語言
裸機的概念都知道,指的是沒有裝配任何操作系統(tǒng)和其他軟件的電子計算機。裸機唯一能識別的就是機器語言,就像一個沒有接受過教育的人,他還是會用語言表達一件事一樣(貌似又是一個糟糕的比喻 - - ! )。
機器語言是機器指令的集合,一臺電子計算機的機器指令是一系列二進制序列。計算機將這些二進制轉(zhuǎn)換成相應(yīng)的高低電平,使計算機的電子器件收到驅(qū)動,從而進行一些計算。
(二)匯編語言與 CPU
在計算機中進行計算的功能由 CPU 來完成,每種 CPU 由于硬件設(shè)計和內(nèi)部結(jié)構(gòu)的不同,其機器指令也不相同,每種 CPU 都有屬于自己的機器指令集。
由于機器指令是一些二進制序列,所以對于程序的編寫和修改是十分不方便的。因此就誕生了匯編語言,學(xué)習(xí)一個新概念一定要知道他的來源,顯然匯編語言就是由機器語言直接發(fā)展而來,產(chǎn)生的原因就是機器語言二進制形式閱讀和書寫上的各種不便。
所以學(xué)習(xí)匯編語言就是在學(xué)習(xí)機器語言,學(xué)習(xí)機器語言就是在學(xué)習(xí)與一個特定 CPU 打交道的方式。只不過匯編語言更加的便于記憶和書寫罷了。
- 操作:寄存器 BX 的內(nèi)容送到 AX 中
- 機器指令:1000100111011000
- 匯編指令:mov ax,bx
既然 CPU 只能識別二進制序列,那么計算機中必然有一個程序能將匯編語言轉(zhuǎn)換成機器語言,這個程序就叫做匯編編譯器。針對不同的 CPU,有不同的匯編編譯器,那么問題來了,第一個匯編編譯器是用什么寫的呢?答案應(yīng)該是機器語言。
匯編語言由下列 3 中指令構(gòu)成:
- 匯編指令:機器指令的助記符,與機器指令一一對應(yīng)
- 偽指令:沒有對應(yīng)的機器指令,由編譯器執(zhí)行,計算機并不執(zhí)行(?)
- 其他符號:沒有對應(yīng)的機器指令,如+、-、*、/等符號
上面說到了 CPU,CPU 是計算機中的核心部件,它是一個強大的計算中心。就拿簡單的 1 + 2 這個操作來說,要讓 CPU 執(zhí)行這個操作,首先要讓 CPU 知道需要執(zhí)行的是加法操作(指令),然后需要讓 CPU 知道讓哪兩個數(shù)相加(數(shù)據(jù))。指令和數(shù)據(jù)在存儲器(存儲器的概念在下面說明)中存放。
其實程序和數(shù)據(jù)在存儲器中存放的形式都是一些二進制序列。CPU 既能將這些序列看成數(shù)據(jù),又能看成指令,就像 1000100111011000,如果 CPU 將其看作數(shù)據(jù),這個數(shù)的大小就是 89D8H,如果將其看作指令,這個指令就是 mov ax,bx。
(三)存儲器
存儲器分為:
- 隨機存儲器(RAM)
- 只讀存儲器(ROM)
其實這兩個概念我以前也知道,但也就僅限于概念上的了解。但是在看完匯編語言的第 1 章后,我才知道存儲器還有物理意義上的存儲器和邏輯意義上的存儲器的區(qū)別。
在介紹各種存儲器之前先了解一下主板的概念。
一臺計算機中的主板一般長這樣:
?
一眼就能看到 CPU 所在的位置和一些黃色的插槽,插槽上可以插各類接口卡(如顯卡、網(wǎng)卡、內(nèi)存卡等)。
具體說來,物理意義上的存儲器分為 RAM(讀寫) 和 ROM(只讀)。
其中內(nèi)存卡全是 RAM,網(wǎng)卡和顯卡中有 ROM,ROM 中一般裝有 BIOS,它利用對應(yīng)的硬件進行最基本的輸入輸出。而顯卡中也有 RAM,顯卡中的 RAM 就是指的?顯存。顯卡會隨時將顯存中的數(shù)據(jù)向顯示器輸出。
上面說的是物理意義上的存儲器,那什么是邏輯意義上的存儲器呢?
邏輯意義上的存儲器的概念是針對于 CPU 而言的,CPU 將各種 RAM 和 ROM 看成是一個同一的整體,通過?地址總線?進行尋址,CPU 把這些 RAM 和 ROM 統(tǒng)一的當做內(nèi)存對待。
(四)內(nèi)存地址空間
在計算機中,所有的物理存儲器被看作一個由若干存儲單元組成的邏輯存儲器。這個邏輯存儲器所在的空間被稱為內(nèi)存地址空間。
內(nèi)存地址空間的大小受 CPU 地址總線寬度的限制。 8086CPU 的地址總線寬度為 20,那么它就能尋址 220 個地址單元,即 1MB。所以當你使用 8086CPU 時,即使給它配上 1G 的內(nèi)存卡,它最多能使用到的內(nèi)存單元也只有 1MB。
下面是 8086CPU 內(nèi)存地址空間的分配情況:
?
從地址 0 ~ 9FFFF 的內(nèi)存單元讀取數(shù)據(jù),實際就是在讀取主隨機存儲器的數(shù)據(jù);向地址 A0000 ~ BFFFF 的內(nèi)存單元中寫數(shù)據(jù),就是想顯存中寫入數(shù)據(jù),這些數(shù)據(jù)會被顯示卡輸出到顯示器上;向 C0000 ~ FFFFF 的內(nèi)存單元中寫入數(shù)據(jù)是無效的,因為這一段地址空間是只讀的。
四、總結(jié)
《匯編語言》的第一章主要是介紹了一些計算機硬件基礎(chǔ)知識,為下面兩張對寄存器的學(xué)習(xí)做了很好的鋪墊。王爽教授的這本書真的挺不錯,短短的一章內(nèi)容就足以讓我有了很強的閱讀欲望,期待下面兩章對寄存器的閱讀。
(完)
轉(zhuǎn)載于:https://www.cnblogs.com/KKSJS/p/9901120.html
總結(jié)