編碼:隱匿在計算機軟硬件背後的語言

    最近讀了本好書,特別推薦下《編碼:隱匿在計算機軟硬件背後的語言》。

    作者Charles Ptezold很牛  世界上七位Mricosoft  Pointeer之一。介紹了計算機編碼的原理,結合生活中例子詳盡描述了編碼在日常生活中的應用(電報機、盲文凹凸字、膠片相機、UPC條形碼)等,整體上用通俗易懂的語言描述了複雜的計算原理。同時該書也介紹了整個計算機發展的歷史,一本很好的計算機歷史書,知道了計算機發展的先驅人物。他們是:摩爾斯(電報機摩爾斯碼)、布萊葉(盲文二元編碼)、布爾、巴貝芝(差分機解析機,計算機雛形)、摩爾(定律)、香農(信息論)、迪摩根(定律 -A*-B=-(A+B)  P94)、布萊尼茨、圖靈、馮諾曼伊、赫茲(無線電波 週期)。

以下是部分摘錄和總結:

      結合布爾表達式 、電路原理介紹了繼電器(線圈纏繞鐵棒通電具有電磁感應,用來放大信號、自動控制開關)、邏輯門(繼電器的組合、與門(用於加法器的進位)、與非門、或門、
或非門(只有兩個輸入都爲0時,才輸出1)
異或門(其輸出1,其兩個輸入不能同時爲1,用於加法器的相加)、反向器、緩衝器(什麼都不做)、
半加器:求A、B的和 從而得到一個和輸出 一個進位輸出P99
全加器:在半加器的基礎上處理進位
加法機需要144個繼電器,這個數目如何得到呢?每個與門、或門、與非門都需要2個繼電器,所以,一個異或門需要6個繼電器。一個半加器由一個異或門和一個與門構成,所以它需要8個繼電器。一個全加器需要兩個半加器和一個或們,所以它要18個繼電器。對於8位二進制加法機而言,共需要8個全加器,即18×8=144個繼電器。

當兩個開關都斷開時,電路有兩個穩定狀態,這樣的一個電路稱爲觸發器。
觸發器電路可以保持信息,換句話說,它有記憶性。它可以“記住”最近一次是哪個開
關先閉合的。如果你遇到這樣一個觸發器,它的燈泡亮着時,你可以確定最近閉合的是上面
的開關;而燈泡滅着時則是下面的開關。

電平觸發式
意思是說只有在時鐘端輸入從0變到1後(即高電平時),數據端
輸入的值才能保存在鎖存器中。注意,在時鐘端輸入爲1期間,數據端輸入的任何改變都將反
應在Q或-Q端的輸出值上。
這個電路就是所謂的電平觸發的D型鎖存器,它表示電路鎖存住一位數據並保持至將來使
用。它也可以稱爲1位存儲器

邊沿觸發:
對於邊沿觸發器而言,只有當時鍾從0變到1的瞬間,輸出纔會改變。在
電平觸發器中,當時鍾輸入爲0時,數據端輸入的任何改變都不會影響輸出;而在邊沿觸發器
中,當時鍾輸入爲1時,數據端輸入的改變也不會影響輸出。只有在時鐘輸入從0變到1的瞬間,
數據端的輸入纔會影響邊沿觸發器的輸出。

如何實現加法?
如何實現減法?
避免借位,採用加上一串1中在減去一串1(加1減100000000)的方法。
減數從一串1中減去,差稱爲1的補數),組成求補器、8位加法器及一個異或門的組合。
把減法轉換爲加法。P110
你可以用某一位代替負號,當該位爲1時就表示負數,爲0時表示正數,這似乎也是可行
的。但還有一種方法,它不僅能表示負數,而且還很適於把正數和負數相加到一起。這種方
法的不足之處是你必須提前決定數字需要多少位.
二進制數可以有兩種不同的使用方法。二進制數可以是無符號的或有符號的,無
符號的二進制8位數的表示範圍從0~2 5 5,有符號的二進制8位數的表示範圍從- 1 2 8~1 2 7。
這些數本身不會告訴你它們是否帶有符號。

二進制中對應的系統稱爲2的補數。
要計算2的補數得先求出1的補數再加上1,這等同於先求反再加1

要計算2的補數得先求出1的補數再加上1,這等同於先求反再加1。例如,十進制數1 2 5是
0 11111 0 1,要用2的補數來表示-1 2 5,可先取反得1 0 0 0 0 0 1 0,再加1就得到1 0 0 0 0 0 11。可用上
表來驗證這個結果。要回到原來的數只需同樣的操作:取反後加1。
這個系統使不用負號就能表示正、負數,它也使我們只用加法規則就可以隨意進行正、
負數運算。例如,計算- 1 2 7 + 1 2 4,利用上表即得
    1 0 0 0 0 0 0 1
+  0 1 1 1 1 1 0 0
=  1 1 1 1 1 1 0 1
和是十進制的-3。注意上溢或下溢的情況 會忽略最高位而得到錯誤的結果。
總結:在數字表示正負系統裏,可以採用補數的處理方式把減法轉換成加法。減法不過是負數的加法。
減去某個數可以看作加上該負數的補數(要把3位負數轉換成1 0的補數,需從9 9 9中減去它再加1,同理
要計算2的補數得先求出1的補數再加上1,這等同於先求反再加1

自動操作:
jump 指令
在一開始進行加法運算時,我們把數據和指令碼分別存儲到兩個不同的RAM上,爲了使兩者在同一個RAM並存
需要使用jump指令
條件指令
在進行乘法運算(即理解爲多個加法運算 幾個幾加幾遍)時,但我們不要重複指令及浪費空間。
在用jump指令循環求和時需要在一定條件下停止運算,需採用條件指令 指定停止條件。
需要添加零鎖存器及控制信號來模擬條件控制。

以下是對一個問題的思考及解答:
++++++++++++++++++++++摘自P168++++++++++++++++++++++++++++++++++++++++++++
我們想讓轉移指令做的是使循環過程只重複所需的次數,這就是條件轉移,它實施起來
並不困難。我們要做的第一件事情就是增加一個與進位鎖存器類似的1位鎖存器。因爲只有8
位加法器的輸出全爲0時它才鎖存1,所以叫它零鎖存器:
只有當或非門的8個輸入全爲0時,其輸出才爲1。同進位鎖存器的時鐘輸入一樣,只有當
加法、減法、進位加法或借位減法指令運行時,零鎖存器的時鐘輸入才鎖存一個數,這個被
鎖存的數值叫作零標誌位。注意它,是因爲它似乎行爲相反:如果加法器輸出全爲0,則零標
志位爲1;若加法器輸出不全爲0,則零標誌位爲0。
利用進位鎖存器和零鎖存器,可以在指令表中再添加四條指令:
操作碼                               代碼
L o a d                              1 0 h
S t o r e                            11 h
A d d                                2 0 h
S u b t r a c t                     2 1 h
Add with Carry(進加位,使用進位鎖存器保存低位相加的進位值)            2 2 h
Subtract with Borrow(借減位)   2 3 h
J u m p                                       3 0 h
Jump If Zero (零轉移)         3 1 h
Jump If Carry (進位轉移)     3 2 h
Jump If Not Zero (非零轉移) 3 3 h
Jump If Not Carry (無進位轉移) 3 4 h
H a l t                                 F F h
每個操作碼在存儲器中佔1個字節。
例如,只有當零鎖存器輸出爲0時,非零轉移指令才轉移到指定地址。換句話說,如果上
一次加法、減法、進位加法和進位減法指令計算結果爲0,則沒有轉移發生。實現這個設計只
需在實現常規轉移命令的控制信號上再加上一個控制信號:如果爲非零轉移指令,則只有當
零標誌位爲0時,1 6位計數器的置位信號才被觸發。
利用上述代碼實現兩個數的乘法所需的操作可由如下開始於地址0 0 1 2 h處的指令完成:

正如我們所設計的,循環一次後,位於1 0 0 4 h和1 0 0 5 h處的1 6位數等於A 7 h乘以1。上圖中
的這些指令把字節從1 0 0 3 h處裝載到加法器中,此字節爲1 C h。再把這個字節與0 0 1 E h處的數
據相加,此處數據正好是停止指令,但當然也是有效數字。把F F h同1 C h相加與從1 C h減去1的
結果相同,都等於1 B h。這個值不爲0,所以零標誌位爲0,字節1 B h存回到地址1 0 0 3 h處。接
下來是一條非零轉移指令,零標誌位沒有置爲1,所以轉移發生。下一條指令位於地址0 0 0 0 h
處。
記住,存儲指令不會影響零標誌位。零標誌位只能被加法、減法、進位加法、借位減法
指令所影響,因此它同這些指令中最近一個執行時所設置的值相同。
循環兩次後,位於1 0 0 4 h和1 0 0 5 h處的1 6位數將等於A 7 h乘以2。而1 B h加上F F h等於1 A h,
不是0,因此又返回到存儲器頂部。
循環到第2 8次時,位於1004h 和1 0 0 5 h處的1 6位數等於A 7 h乘以1 C h。位於1 0 0 3 h處的值等
於1,它將加上F F h結果等於0,因此零標誌位被置位。非零轉移指令不再轉移到存儲器地址
0 0 0 0 h處,相反,下一條指令爲停止指令。至此,我們完成了全部工作。
============================摘抄結束===============================
解釋:第一遍讀並沒有理解該機制,多讀幾遍後貌似理解了。最大的疑問就是標紅的部分,爲什麼此時1003h處爲1呢?可以多讀幾遍藍色字體。在第一次加載1003h時值爲乘數,以後在地址存的是1003h與停止符(FFh)的和 相當於乘數1Ch減1,直到進行第1Ch(即十進制28)次循環, 相當於減1進行了27次 故此時值爲1了,之後就明瞭了,零標誌位被置位,進行停止指令,而不再跳轉到0000h處了。
=================================================================

發佈了51 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章