1. 程式人生 > >組建一臺計算機5_硬體5 多位儲存器&累加器&初始彙編(1)

組建一臺計算機5_硬體5 多位儲存器&累加器&初始彙編(1)

閱讀此文,你需要擁有以下基礎:

1.能理解本系列第2節和第4節;2.已經閱讀了第4節。

=========================================================================

(為什麼mac總是配圖失敗呢,,)

  很久沒有更新本系列了誒。。。有一個月了吧。但是經過這接近一個月來對code的重新閱讀以及對其他一些書的草草翻翻,更加進一步的對計算機領域本身,計算機的數學發展以及計算機的哲學發展這三個方面進行了瞭解和深入理解與思考。作為一個數學系的計算機系學生,加上這些理解,自然會有自己一些會對或錯的想法。或許這些將會在以後的文章中隱隱約約地顯現出來。

  一直在糾結到底應該先寫彙編還是先寫自動操作。csapp一書是直接從暫存器開始講彙編,剛開始開的時候還真有些不好理解,有些東西沒有聽說過(畢竟是數學系的),而計算機組成與設計(以後簡稱COD H/S)一書卻索性放到了附錄,唯獨code一書是從最簡單慢慢在不知不覺中讓讀者發現:哇,我現在看的原來就是彙編啊!那麼我決定走code路線~

       那麼進入正題吧~

       之前我們已經做出了最簡易的加減器,單位儲存器。其中加減器可以認為是一個非常不完善的cpu,而儲存器可以認為是最簡陋的RAM。面對上一次提出的三個問題,今天開始的接下來三節一共要搞明白以下幾件事:

  1. 多位儲存器;
  2. 怎樣自動就能不停地進行累加;
  3. ‘累加’該怎麼停止;
  4. 怎麼讓‘硬體’通過‘程式碼’自動化。

  首先是多位儲存器。上一次已經做出了一個單位儲存器,在本文中我用下面這個整合小塊兒來代表它(具體電路見第四節):

  根據之前我們製作多位運算器的經驗,多位儲存器應該也是多個單位儲存器的某種形式的連結,唯獨不同的一點就是需要增加一些排程電路——它必須知道匯流排發過來的訊號應該給多位儲存器中的哪一‘位’,它也應該知道怎麼進行‘讀’‘寫’操作。

  首先要解決的問題是‘排程’電路怎麼設計。現在以8位儲存器為例,想要確定某一時刻資料應該往8個子位的哪一位存,應該消耗多少輸入埠來確定呢?或者說,假設這八個單位儲存器的地址分別是1,2,3,。。。,8,需要多少個輸入埠來把他們區分開呢?這裡要引入一個新的東西——3-8譯碼器。我們知道,想要表達8種不同的狀態最少需要3個二進位制位(還記得小白鼠的實驗那個遊戲嗎?8杯水只有一杯有毒,只喂一次的情況下最小需要3只小白鼠才能知道哪杯有水)。所以輸入地址位應該是3個。下面就是3-8譯碼器(顧名思義)的電路:

  左下角的DI代表的意思是資料輸入,這個輸入的資料應該給右邊8個埠中的哪一個呢?由左下角的S0,S1,S2確定。仔細看看電路就不難發現這個電路的精妙所在。S0,S1,S2三個埠的原本訊號和取反訊號分別構成了1,0,三個1,0位的全部結合構成了這8個輸出口的‘地址’——000,001,010,。。。,111.

  解決了資料輸入排程,現在該解決資料輸出排程了,輸出和輸入是兩個相反的過程,所以輸出排程就是把輸入排程元件反著畫一下就好了,他有一個新名字——8-1選擇器:

  左邊的輸入口自上向下分別是8個單位儲存器的輸出,三個S地址排程器代表特定的某個輸出口被開啟。右邊的輸出埠就代表被選中的那一‘位’儲存器的輸出值。

  現在準備工作都完成了,分別把3-8譯碼器,8個單位鎖存器,8-1選擇器進行連線,變成下面這個樣子:

  藍色,紅色和綠色本別是3-8譯碼器,單位鎖存器和8-1選擇器。

  大功告成之後,該做測試了:現在這個8位儲存器初期的狀態是:EEEE EEEE(未知狀態)

  現在我想寫入0001 0111怎麼辦呢?只需要兩步:1.全部復位成0:0000 0000

                          2.將0,1,2,4位寫入1

  具體來說,只需要先將D(data)位一直輸入0,開啟W位(輸入1),再依次在A(address)0,A1,A2位輸入000,001一直到111即可完成歸零操作,再將D輸入1,開啟W,地址依次輸入000,001,010,100即可完成寫入工作。最後的狀態如下圖:

  畫紅圈代表該位儲存值為1,不畫代表為0.各位儲存器的編號已經標出,很容易讀出:0001 0111 和我們的預期相同。

  我們知道,8bit=1byte,也就是說一個8位儲存器的儲存能力是1byte。我們可以並聯很多個這樣的8位儲存器,比如如果把1073741824個這樣的8位儲存器並連到一塊兒,就變成了一個容量為1GByte的大儲存器,而那時候我們的地址位就不僅僅是3個就能存下這麼簡單的了。思考一個問題:現在主流的32/64位作業系統分別最大支援4G和16EB,(1EB=1024PB=1048576TB=......)(實際也到不了那麼大,這和匯流排定址,作業系統有關),這是為什麼呢?再想想剛才3-8譯碼器的原理,不難得出以下公式:

1 BitNum = Log(2)(MaxMemBit)

  也就是說地址位數(比如3-8譯碼器的地址位為3,32位作業系統地址最大是32位)等於最大記憶體定址大小對2取對數。

  事實上,這裡所說的‘地址’只是一個我們想當然的某一個‘位’的地址,事實並非如此。人們把儲存器分為很多區,每個區分為很多儲存器板,每個儲存器板會有一定量的儲存體,每一個儲存體可以儲存很多位,每一個位在儲存體裡有特定的地址。這就相當於我們把100000個學生不僅僅從學號進行尋找,還給他們分配了班級,系別,年級等等巢狀式的整理,這使得管理起來非常明瞭,但是本質上和我們對他們直接進行‘學號定址’是一樣的。這些內容將在以後的匯流排設計中提到。

  綜上,我們對記憶體和地址的關係或許有了一定的瞭解,這樣一來我們就有了一些大膽的猜想——既然所有計算機操作在處理器上都可以歸結成‘加法’,‘移位’等非常少的基本邏輯運算,那麼實現自動‘累加’就是實現自動化的一大進步。累加的加數的儲存問題已經在本節被解決了,而怎麼讓處理器來處理‘累加’呢?每次‘累加’的結果怎麼儲存才有效率?這些將在不久以後解決。

  至此,一個多位儲存器也基本完成了。

相關推薦

組建計算機5_硬體5 儲存器&累加器&初始彙編1

閱讀此文,你需要擁有以下基礎: 1.能理解本系列第2節和第4節;2.已經閱讀了第4節。 ========================================================================= (為什麼mac總是配圖失敗呢,,)   很久沒有更新本系列了誒

組建計算機2_硬體2 加法器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機3_硬體3 運算器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機1_硬體1 單位加法器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機4_硬體4 單位儲存器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

給出一個不多於5的正整數,1 求出它是幾位數2 分別打印出每數字3 按逆序打印出各位數字,例如原數為321,應輸出123

1、         給出一個不多於5位的正整數,要求: (1)    求出它是幾位數; (2)    分別打印出每一位數字; (3)    按逆序打印出各位數字,例如原數為321,應輸出123.  #include <stdio.h> int main()

線程簡單實例1真的需要synchronized麽?

寫入 clas name rac pac bsp 得到 鎖定 lock 說道多線程的安全問題,很多人想到就就是加鎖。用到synchronized關鍵字。 那就要先說說synchronized問什麽能夠保證線程安全了。 首先要了解線程的工作方式:線程工作分為工作內存和主內存。

leetcode 5最長迴文子串1

第一種就是從中間開始判斷,分為兩種情況,長度為奇數還是偶數,但是時間複雜度為O(n^2),程式碼如下 char* longestPalindrome(char* s) { int low,length,high,j,k; printf("%s\n",s); length=str

第11章 拾遺5:IPv6和IPv4共存技術1_雙棧技術和6to4隧道技術

6. IPv6和IPv4共存技術 6.1 雙棧技術 (1)雙協議主機的協議結構 (2)雙協議棧示意圖   ①雙協議主機在通訊時首先通過支援雙協議的DNS伺服器查詢與目的主機名對應的IP地址。   ②再根據指定的IPv6或IPv4地址開始通訊。   ③Win2008

CNTK API文件翻譯(17)——神經網路處理文字資料1

(本期教程需要翻譯的內容實在是太多了,將其分割成兩期,本期主要講理論和模型建立,下期主要講訓練、測試、優化等) 背景和簡介 本教程將帶你過一遍多對多神經網路基礎,以及如何在CNTK中實現它。具體來說,我們將實現一個多對多模型用來實現字音轉換。我們首先會介

步步從後端渲染到前後端分離經驗分享1

概念普及 後端渲染 後端採用JSP,freemarker,jdea,babel等渲染框架對前端模板進行預編譯。 假設有這麼一組資料你想展示在介面上: name MrXu MrXu0 MrXu1 <

執行緒訪問共享資料1

多執行緒訪問共享資料解決方案: 一,什麼是多執行緒  執行緒是程式中一個單一的順序控制流程.在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒.  所有的執行緒雖然在微觀上是序列執行的,但是在巨集觀上你完全可以認為它們在並行執行 二,多執行緒訪問共享資料解決方

SilverLight 5 資料繫結的高階話題1

至此,您已經掌握如何將UI控制元件與物件進行繫結以使使用者可以檢視和編輯這些物件所暴露的資料。資料不是被推進控制元件的,而是通過XMAL提供的繫結將資料拉進控制元件裡。換言之,繫結是控制元件讀取資料的過程。在此前幾章裡已經介紹瞭如下資訊: l 將資料物件分配到控制元件的DataContext屬性; l 有三

我的android執行緒程式設計之路1之經驗詳解,原始碼分析

寫在伊始 android開發這麼久了,對於多執行緒這塊一直處於似懂非懂的神奇狀態,今天總結出來,分享一下,希望大家多多指正。共同交流,懇望得到您的建議。 本文簡介 本文會基於自己在開發中對於執行緒這塊的實際使用,大概從執行緒程序的概念,執行緒的建立(T

.NET執行緒技術詳解1

預設情況下,C# 程式具有一個執行緒。此執行緒執行程式中以Main方法開始和結束的程式碼。Main直接或間接執行的每一個命令都由預設執行緒(或主執行緒)執行,當Main返回時此執行緒也將終止。不過,可以建立輔助執行緒,以便與主執行緒一起並行執行程式碼。這些執行緒通常稱為“輔

層PCB via stub效應1

背景介紹 背景主要包括了 多層PCB的優勢,以及引出其中stub和帶狀線的問題;接下來解釋了via stub所帶來的問題,resonance effect;然後介紹了部分文獻所提供的一些模型和考慮的方面;最後介紹了本文的側重點,即通過時域模擬和測量來描述via

hdu題水題習題解1

hdu-1021- #include<stdio.h> int main() {    int n;    while(~scanf("%d",&n))    {       if(n%4==2)     puts("yes");    else   

電腦上單獨部署個獨立的tomcat 服務

1.首先下載tomcat (解壓版的); 2.配置環境變數 CATALINA_BASE 和  CATALINA_HOME     如圖 3.修改conf/server.xml 中的埠 <Server port

如何理解伺服器可以繫結個ip,一個ip可以繫結個域名

一個域名只能對應一個IP的意思是域名在DNS伺服器裡做解析的時候 一條記錄只能指向一個IP地址。這個是死規定,試想一下,如果一個子域名指向了2個ip ,當訪問者開啟這個域名的時候,瀏覽器是展示哪個IP上的網站呢?一個IP可以對於多個域名的意思是:一個IP繫結到一臺伺服器的時候,在伺服器上可以設定多個主機頭,每

Nginx機器上負載均衡個Tomcat

預設你的機器上安裝了Java環境,解壓了Tomcat,安裝了Nginx。預設這幾個tomcat都部署在一臺機器上。   對於Tomcat需要改三個地方【你部署的所有tomcat這三個地方都不能一樣,如果你部署在不同機器上就不用改了】 vi [你的tomcat路徑]/conf/