重新整理彙編—————彙編的基礎理論前置篇

敖毛毛發表於2022-05-21

前言

什麼是彙編呢? 就是說0 1 太難記了。

比如000100100101 到底是什麼呢? 很難去人類去理解。

但是呢,cpu 對0、1 理解的很透徹了。 這個時候呢,人和cpu 之間的交流就出現了障礙了。

然後呢,人是高等生物,有思想的,但是cpu沒有,那麼就只能人遷就cpu了,遷就的一方往往就有點不幸福了。

那麼人這個時候就很痛苦,但是又離不開cpu。那麼這個時候人就想啊,要是自己說的話要是有人翻譯,cpu 能夠理解就完事了。

好在cpu很簡單,會做的事情不多,要是能把其固定的套路用自己的語言翻譯成cpu語言就很好了。 這個搞翻譯的就是彙編,組合語言通過編譯器然後轉換成二進位制,然後cpu就懂了。

cpu 比較簡單,會的東西不多,那麼彙編如果單從語言上講非常簡單。 但是為什麼很多人對彙編不感冒呢?那個不是彙編難,是用匯編做工程難。

怎麼說呢? 比如說要搭建一個房子,彙編一個語句執行一條命令。先把15243514的磚放在第一塊,然後把15243614放在第二塊。

那這樣啥時候能搞定啊? 工程能力差啊。然後高階語言,比如s += 20, 這個就是要翻譯成很多組合語言的,如果去手敲估計得發脾氣的。

那麼高階語言幹了什麼事呢?高階語言,就是把人經常用到的東西,做成一個彙編包唄。比如上面的s+=20,那麼是加法有對應的彙編去轉換。

當然了,轉換沒有這麼簡單,這又是一門學問,如何開發一門語言。扯得很遠了,進入正文吧。

正文

組合語言由3類組成:

  1. 彙編指令(機器碼的助記符)

  2. 偽指令(由編譯器執行)

  3. 其他符號(有編譯器識別)

組合語言的核心是彙編指令,它決定了組合語言的特性。

一個一個舉例哈。

比如: mov ax bx,這還就是彙編指定,最終就是會轉換成機器碼

什麼是偽指令呢? 這個就是編譯器認識,但是機器不認識。這裡不直接說彙編,比如c 語言的include,這個就只有編譯器認識了,編譯器把include 的包引用進來,但是機器肯定不認識的。

第三個是其他符號哈, 我們指定cpu 只能做加法的,如果是其他減、乘、除怎麼處理呢? 得編譯器從加法的角度翻譯了。

然後這個彙編還得去了解一個東西,那就是儲存器,準確的來說就是記憶體。

因為cpu 做的事情從那麼來,到哪裡去,都存在記憶體中,所以這個還得去瞄一眼。

這裡就有一個問題,那就是cpu 只能從記憶體中讀取資料,然後將資料計算完畢又給了記憶體。

那麼有一個問題,那就是cpu 是如何從磁碟上讀取東西的呢? 這個真的不是cpu 去直接操作的,它哪有這麼聰明,只不過任何操作記憶體的都需要cpu,這個計算機原理篇會解釋。

指令和資料都是應用概念。

在記憶體或者磁碟上,指令和資料沒有任何區別,都是二進位制資訊,這是值得是對於記憶體來說,而不是對於cpu來說哈。

然後儲存有一個概念,那就是儲存單元。比如byte 位元組, kB 千位元組等。

那麼cpu是如何操作記憶體的呢?

cpu 要想進行資料的讀寫,必須和外部器件,進行3類資料的互動。

  1. 儲存單元的地址(地址資訊)

  2. 器件選擇,讀或寫命令(控制資訊)

  3. 讀或寫的資料(資料資訊)

那麼有個問題,cpu 如何對記憶體進行讀和寫哈。

上面就是說有3根線一個是地址線、一個是資料線、一個是控制線。

顯示地址線把地址傳給記憶體、然後控制線把數控制命令傳給記憶體,然後記憶體就把資料通過資料線傳給了cpu。

這裡的記憶體不只是包括記憶體條、還包括顯示卡記憶體、網路卡記憶體,這些硬體都是有記憶體的哈。

寫也是一樣,比如地址線發出寫的指令、然後地址線發出地址,然後資料線發出資料,然後就存到了記憶體中。

這裡有一個問題哈,那就是這些都是cpu 主動去執行的,那麼其他器件怎麼主動和cpu 進行互動呢?

這裡網路卡舉例,然後網路卡收到資料後,那麼會對cpu 傳送中斷指令, cpu 中斷指令收到中斷指令後,人家也不知道怎麼出區裡,說白了就是一個訊號。

然後cpu 會將這個傳送給作業系統,作業系統知道怎麼去處理,cpu 怎麼會去通知作業系統呢? 那是因為作業系統給cpu 啟動的時候注入了一些訊號的執行操作。

這就要從作業系統如何啟動的說起了,計算機原理篇整理下。這裡只是說明一下,cpu 只能去操作記憶體,單身不侷限與記憶體條的記憶體,其他硬體也有記憶體。

然後說一下這個地址匯流排,這個地址匯流排是怎麼樣的呢? 上面提及到這個地址匯流排是傳輸記憶體的地址的,這個地址匯流排不是單根線。

有些人可能接觸到網路,網路是定義比如說ip協議,前20個位元組幹什麼的,然後前20位元組裡面的前4個位元組幹什麼的,比如傳送地址就是前4個位元組。

實際的是這樣的。

我這上面畫了8個箭頭哈,也就是地址是8位的,假如這裡畫了32根箭頭那麼這個就是32位的,如果是64,那麼就是64位的。

現在大多數cpu 都是64位了,也就是說地址是一次性傳過去的,不是說傳過去然後記憶體儲存器做切割,然後判斷哈,沒有這麼聰明的,如果是這樣效率也很低。

然後就是這個資料匯流排,cpu 與記憶體或者其他器件之間的資料傳輸,是通過資料匯流排來進行的。

資料匯流排的寬度決定了cpu 和 外接的資料傳輸速度。

歷史: 8088cpu 的資料匯流排的線是8條,8086 cpu 的資料匯流排是16條。

為什麼都是8的倍數呢,是因為8位為一個位元組這個時候就很流行了,計算機儲存的基本單位就位。

控制匯流排: cpu對外部器件的控制是通過控制匯流排來進行的。在這裡控制匯流排是個總稱,控制匯流排是一些不同控制線的集合。

有多少根控制匯流排,就意味著cpu 提供了對外部器件的多少種控制。

所以控制匯流排的寬度決定了cpu 為外部器件的控制能力。

下面是控制匯流排的定義:

控制匯流排(ControlBus)簡稱CB。控制匯流排主要用來傳送控制訊號和時序訊號。

控制訊號中,有的是微處理器送往儲存器和輸入輸出裝置介面電路的,比如:讀/寫訊號、片選訊號、中斷響應訊號等;也有是其它部件反饋給CPU的,比如:中斷申請訊號、復位訊號、匯流排請求訊號、裝置就緒訊號等。

小結:

  1. 彙編指令是對機器指令的助記符,同機器指令一一對應。

  2. 每一種cpu 都有自己的彙編指令集。

  3. cpu 可以使用的資訊在儲存器中存放。

  4. 在儲存器中指令和資料沒有任何區別,都是二進位制。

  5. 儲存單元從0開始順序編號

  6. 每一個cpi晶片都有很多管腳,這些管腳和匯流排相連。也可以說,這些管腳引出了匯流排。

一個cpu可以引出三種匯流排的寬度標誌,這個cpu的不同方面的效能。

  1. 地址匯流排寬度決定了cpu的定址能力。

  2. 資料匯流排的寬度決定了cpu與其他器件進行資料傳送一次資料傳送量。

  3. 控制匯流排寬度決定了cpu對系統中其他器件的控制能力。

可能有人還是對控制匯流排不理解,這裡控制匯流排是什麼被?

微型計算機中控制匯流排提供的完整資訊是所有儲存器和I/O裝置的時序訊號和控制訊號、來自I/O裝置和儲存器的響應訊號。

控制匯流排,英文名稱:ControlBus,簡稱:CB。控制匯流排主要用來傳送控制訊號和時序訊號。控制訊號中,有的是微處理器送往儲存器和輸入輸出裝置介面電路的,比如:讀/寫訊號、片選訊號、中斷響應訊號等;也有是其它部件反饋給CPU的,比如:中斷申請訊號、復位訊號、匯流排請求訊號、裝置就緒訊號等。因此,控制匯流排的傳送方向由具體控制訊號而定,一般是雙向的,控制匯流排的位數要根據系統的實際控制需要而定。實際上控制匯流排的具體情況主要取決於CPU。

控制匯流排,連線在一起並完成和實現它們之間的通訊與資料傳送的,因此匯流排的概念是理解PC和主機板的組成結構、工作原理及部件之間相互關係統的基礎。是用來傳送控制資訊的訊號線,這些控制資訊包括CPU對記憶體和輸入輸出介面的讀寫訊號,輸入輸出介面對CPU提出的中斷請求或DMA請求訊號,CPU對這些輸入輸出介面回答與響應訊號,輸入輸出介面的各種工作狀態訊號以及其他各種功能控制訊號。控制匯流排來往於CPU、記憶體和輸入輸出裝置之間,其特點是:在單向、雙向、雙態等種形態,是匯流排中最複雜、最靈活、功能最強的,其數量、種類、定義隨機型不同而不同。

再硬體一點理解,要從ISA插槽插槽理解了。

cpu 不是有很多針腳嗎?

如下:

下面是插槽位置對應的匯流排關係:

1、地址匯流排:SA0~SA19(I/O)和LA17~LA23(I/O)
LⅪ測試匯流排技術
LⅪ測試匯流排技術
2、資料匯流排:SD0~SD7(I/O)和SD8~SD15(I/O)3、控制匯流排:BALE(0)---USAddresslatchenable:系統地址鎖存允許
4、SYSCLK(0)---SYSTEMCLOCK系統時鐘訊號
5、IR23~7,9~12,15(Z)---這是用於I/O裝置通過中斷控制器向CPU傳送的中斷請求(interruptrequest)訊號
6、SMEMR#和SMEMW#(0)---這是命令記憶體將資料送至資料匯流排的訊號
7、MEMR#和MEMW#(I/O)---記憶體讀(MEMR)或記憶體寫(MEMW#)訊號
8、DRQ0~3,5~7⑵---這是DMA請求(DMARequesc)訊號
9、DACK0#~3,5~7(0)---(DMAAcknowledge,DMA響應)這是對DRQ0~3,5~7的響應訊號
10、AEN(0)---地址允許(Addressenable)訊號
11、REFRESH#(I/O)---記憶體重新整理(DRAMrefresh)訊號
12、SBHE(I/O)---系統匯流排位元組允許(systembushighenable)訊號
13、MASTER⑵---主控訊號
14、MEMCS16#⑵---儲存器16位片選(Memory16bitchipselect)訊號
15、ZOCS16#⑵---I/O16位片選(I/O16bitchipselect)訊號
16、OWS⑵---零等待狀態(ZeroWaitState)訊號

這裡就可以發現不同的針腳對應著不同的功能了。之所以這麼設計,是因為cpu 能做的事情很簡單,不可能比如說幾個針腳不同組合就完成控制匯流排的功能。

cpu 不需要複雜組合的組合,特定的針腳不同的電訊號就是不同的不同的功能。

然後這裡就會發現一個問題哈,那就是cpu 怎麼知道把地址傳給誰?去哪裡取呢?

其實在cpu 的視角和軟體視角不一樣,cpu的視角是將整個記憶體看做一整塊的記憶體,而不是幾個不同硬體的記憶體,操作不同位置的記憶體,就是操控不同的硬體裝置。

這個就要從主機板說起。

在每一臺pc機中,都有一個主機板,主機板有核心器件和一些主要主要器件。

這些器件通過匯流排(地址匯流排、資料匯流排、控制匯流排)相連。

介面卡: 計算機系統中,所有可用程式控制其工作的裝置,必須收到cpu控制。

cpu 對外部不能直接控制,如顯示器、音響、印表機等。 直接控制這些裝置進行工作的是插在擴充套件插槽上的介面卡。

各類儲存器晶片: 從讀寫屬性上分為兩類。

隨機儲存器(RAM) 和只讀儲存器。

記憶體條這種就是隨機儲存器,特點就是斷電之後會沒掉。

只讀儲存器,比如裝有rom的bios。 這個rom 的全稱那就是read only memory。

bios:bisic input/output system,基本輸入輸出系統。

bios 是由主機板和各類介面卡(如:顯示卡、網路卡等)廠商提供的軟體系統,可以通過它利用該硬體裝置進行最基本的輸入輸出。

在主機板和某些介面卡上插有儲存相應的bios的rom。

這裡很多人都以為只有主機板有bios? 顯示卡、網路卡都有的。

為什麼顯示卡和網路卡會有bios?想這樣一個問題,那就是cpu將資料傳給顯示卡,顯示卡如果沒有bios,那麼怎麼處理?GPU沒有程式它能知道怎麼執行?對吧。

他們有自己的程式,去操作硬體的。cpu 擅長做的還是central processsing unit,重要處理器,相當於人類的大腦了。

其他部件相當於手腳,手腳裡面有自己的處理哈。

從功能和連線分類:

  1. 隨機儲存ram
  2. 裝有bios的rom
  3. 介面卡上的ram(視訊記憶體)

ram 全稱, random access memory。

什麼叫access哈,因為write 和 read,所以叫做access哈。

上述的那些儲存器在物理上是獨立的器件。

但是他們在以下兩點相同:

  1. 都和cpu的匯流排相接。
  2. cpu對它們進行讀或者寫的時候都通過控制匯流排發出記憶體讀寫命令。

對於cpu 來說並不知道那個記憶體是哪個的。

對於cpu來說他們是一個整體的概念。

他們在啟動的時候會告訴cpu他們的大小是多少,cpu也只是知道,但也不知道怎麼處理,知道發給哪個的是作業系統的事。

比如作業系統要重新整理顯示卡,那麼會傳送到顯示卡的地址。作業系統怎麼知道位置的? cpu 告訴的。

所以我們想加一個記憶體的時候,開機的時候插進去沒有反應,這個要重啟才會生效。

假設,上圖中的記憶體空間地址段分配如下:

地址0~7FFFH空間為主隨機儲存器的地址空間。

地址8000H_9FFFH的8kb 空間為視訊記憶體地址空間。

地址A000H~FFFFH 的24kb 空間為各個rom的空間地址值。

8086pc的記憶體地址空間分配:

以上為個人整理,如有錯誤望請指出。該系列為ce(遊戲輔助)的前置系列。

相關文章