一篇前言
這是一系列的匯編語言學(xué)習(xí)的讀書筆記,以及一些自己的理解系列文章。我想我會在循序漸進(jìn)的學(xué)習(xí)中,寫下對匯編的點點滴滴,一方面是給自己立一個短期的小目標(biāo),另一方面,如果您有緣看到了這一系列的文章,希望對您有所幫助。
機(jī)器語言和匯編語言
雖然我們在寫程序的時候使用的是諸如C,C++等高級語言,但最終會通過編譯器轉(zhuǎn)換成二進(jìn)制的機(jī)器語言,機(jī)器語言實際上是一堆二進(jìn)制指令的集合,計算機(jī)會將它轉(zhuǎn)換成高低電平驅(qū)動硬件工作,實際上計算機(jī)非常的笨蛋,只能認(rèn)識高低電平,所以,我們用二進(jìn)制來代替高低電平,例如我們要計算s = 768 + 12288 - 1280,機(jī)器碼如下:
101110000000000000000011
000001010000000000110000
001011010000000000000101
這種機(jī)器碼非常難以書寫,修改和記憶,早起的程序員很快就發(fā)現(xiàn)了這些問題,于是他們就發(fā)明了匯編語言。
??匯編語言實際上是機(jī)器語言的另一種書寫格式。
比如:機(jī)器指令:1000100111011000表示把寄存器 bx的內(nèi)容放到ax中去,而對應(yīng)的匯編指令可以寫成mov ax,bx。這樣的寫法更容易記憶和理解。
寄存器:簡單的理解就是一種cpu內(nèi)部用來存放數(shù)據(jù)的東西。
??可是計算機(jī)只認(rèn)識01這樣的機(jī)器代碼,那怎么讓計算機(jī)認(rèn)識更貼近人類語言的匯編語言呢?這時候就需要一個翻譯的中間程序,把匯編語言翻譯成01這樣的機(jī)器指令,我們把它叫做編譯器。下圖展示了這個翻譯過程,實際上我們今天使用的java,c等高級語言也會先翻譯成匯編,再由匯編翻譯成機(jī)器指令。

那么,匯編語言由哪些東西組成的呢?
- 匯編指令:和機(jī)器碼一一對應(yīng)的匯編指令。像mov
- 偽指令:沒有對應(yīng)的機(jī)器指令,由編譯器執(zhí)行,計算機(jī)不執(zhí)行。
- 其他符號:像+,-,*,/等,由編譯器識別,也沒有對應(yīng)的機(jī)器碼。
存儲器
??cpu是計算機(jī)的核心部件,cpu要想工作,就必須要給它指令和數(shù)據(jù),指令和數(shù)據(jù)在存儲器中存放,也就是我們平時所說的內(nèi)存。這里要注意,磁盤或者硬盤不同于內(nèi)存,我們平時的程序是放在硬盤上的,如果想要運行程序,必須將程序的指令和數(shù)據(jù)加載到內(nèi)存中。
指令和數(shù)據(jù)
??指令和數(shù)據(jù)在內(nèi)存和磁盤上是沒有區(qū)別的,都是一堆01的二進(jìn)制數(shù)據(jù)。
比如:1000100111011000
作為數(shù)據(jù)是:89D8H (H代表16進(jìn)制數(shù)據(jù))
作為指令是:mov ax,bx
存儲單元
存儲器(這里所說的存儲器,就是我們所說的內(nèi)存,但不單指內(nèi)存條,還有顯存等硬件的內(nèi)存)被劃分為N個,就是很多個存儲單元,你可以把它想象成一個個的小格子,每一個存儲單元的大小是1個字節(jié),也就是可以存放8個0101。它們從0開始編號,擁有自己的地址。
例如,下圖是一個擁有128個存儲單元的存儲器的內(nèi)存單元布局,0~127

計算機(jī)對存儲器的讀寫
前面,我們講cpu要想工作,必須有存儲器提供指令和數(shù)據(jù),我們知道存儲器被劃分為一個個的存儲單元,數(shù)據(jù)在每一個存儲單元中,cpu要想對存儲器的內(nèi)容進(jìn)行訪問至少要滿足下面3個要求:
1、 存儲單元的地址:cpu要知道內(nèi)存單元的地址(也就是要知道我即將讀取哪一個內(nèi)存單元中的內(nèi)容)。
2、 控制器信息:cpu是要讀數(shù)據(jù)還是寫數(shù)據(jù)
3、 數(shù)據(jù)信息:我們要寫入或者讀取的數(shù)據(jù)信息。
那么cpu又是通過什么將地址,控制信息,數(shù)據(jù)信息傳遞給存儲器的呢?
我們知道cpu是通過高低電平驅(qū)動計算機(jī)硬件進(jìn)行工作的,而傳遞這些電信號,需要導(dǎo)線,在計算機(jī)中連接cpu和其他各種芯片的導(dǎo)線,我們稱為數(shù)據(jù)總線。
- 物理上數(shù)據(jù)總線是一根根導(dǎo)線的集合。
- 邏輯上分為
- 地址總線
- 控制總線
- 數(shù)據(jù)總線
下圖描述了cpu讀取一次數(shù)據(jù)的過程
1、cpu通過地址總線發(fā)送地址03到存儲器中
2、存儲器通過地址03鎖定3號內(nèi)存單元
3、cpu通過控制總線發(fā)出讀命令到存儲器中
4、存儲器將內(nèi)存單元03中的數(shù)據(jù)08通過數(shù)據(jù)總線送入cpu
由上圖可以了解到cpu是如何讀取內(nèi)存中的數(shù)據(jù)的,那么我們又怎么指揮cpu去讀這個數(shù)據(jù)呢?
要讓cpu干活,應(yīng)該向它輸入驅(qū)動它工作的電平信息,也就是機(jī)器碼。如下:
機(jī)器碼:1010000100000010000000
含義:從3號內(nèi)存單元讀取數(shù)據(jù)到寄存器ax中
機(jī)器碼難遇記憶和理解,我們也可以用匯編指令來表示:
mov ax,[03]
含義:從3號內(nèi)存單元讀取數(shù)據(jù)到寄存器ax中
地址總線
cpu是通過地址總線來指定要操作的內(nèi)存單元,那么地址總線上一次能傳送的多少個不同的信息,多少個0101,決定了cpu能夠?qū)Χ嗌賯€內(nèi)存單元進(jìn)行尋址。
- 我們平常說的16/32/64位計算機(jī)就是指計算機(jī)的尋址能力。
- 地址總線上發(fā)送的信息.png
數(shù)據(jù)總線
cpu和存儲器之間傳輸數(shù)據(jù)的總線,數(shù)據(jù)總線的的寬度,決定了一次能夠傳輸數(shù)據(jù)的大小,8根數(shù)據(jù)總線一次可傳輸8bit(位),即一個字節(jié)大小,16根數(shù)據(jù)總線一次可傳輸16bit的數(shù)據(jù),即2個字節(jié)大小。

????

由此可見:數(shù)據(jù)總線的寬度決定了cpu與外界傳輸數(shù)據(jù)的速度。
控制總線
cpu對外部芯片的控制,是通過控制總線來完成的,這里控制總線只是個總稱,控制總線是很多根不同控制線的集合。多少根控制總線,就決定了cpu能對多少個外部芯片的控制。
小結(jié)一下
以上呢都是一些枯燥的內(nèi)容,但對于理解匯編又尤為重要的基礎(chǔ),我們稍作總結(jié):
- 匯編指令只是為了我們便于書寫,理解,記憶機(jī)器指令的助記符,它和機(jī)器指令0101是一一對應(yīng)的。
- 每一種cpu有自己的匯編指令集。
- cpu能夠直接使用的數(shù)據(jù)或者指令呢,必須要加載到內(nèi)存中,也就是說cpu只能夠使用內(nèi)存中的數(shù)據(jù)。(內(nèi)存,高速緩存)
- 在存儲器中(內(nèi)存中)指令和數(shù)據(jù)是沒有區(qū)別的,其本質(zhì)都是0101的二進(jìn)制。
- 存儲器被劃分為一個個的內(nèi)存單元,內(nèi)存單元從0開始編號,即為內(nèi)存地址。
- 一個存儲單元可以存儲8個bit,即位1個字節(jié),8個0或1.
- cpu引出了3種總線,標(biāo)志著cpu不同方面的性能
- 地址總線:標(biāo)志著cpu的尋址能力
- 數(shù)據(jù)總線:標(biāo)志著cpu的傳輸速度的能力
- 控制總線:決定了對外部芯片的控制能力。

