《编码的奥秘》---学习编程一年半的体会
本人在校大學生,從大一下學期開始自學編程(JAVA)。到現(xiàn)在2018年7月2號也過了一年半的時間了。期間做過很多應用程序(PS:大多數(shù)都是做著玩的),比如做一個GUI聊天室(JAVA)、Android應用、Unity3D游戲(C#)、SSH整合開發(fā)一個WEB系統(tǒng)(完整版)等…雖然我這些都做過,但是…其中原理我卻了解甚少,比如說JAVA的虛擬機的內存釋放(垃圾回收器)、socket的連接過程(TCP三次握手以及四次揮手)、HTTP協(xié)議,這些東西我都不是很了解。
看過一篇文章,具體內容忘記了。說的是遇到一個解決數(shù)據庫連接太慢的問題,有三種人去解決。我只記得2種人,因為太有比較意義了。第一種是通過網絡抓包工具分析得到瓶頸,然后把問題解決了。另一種人是對這種數(shù)據庫的經驗已經很豐富,然后改了配置文件把問題解決的。當然在這個問題中,后者可以迅速的把問題解決,但是如果換了一個數(shù)據庫,也許第二種人就不知道該怎么解決問題了。(PS:本人就屬于第二種人,應用知道很多,理論懂得甚少。)這其實是非常不利于自己以后的發(fā)展的,IT新技術出來的太快了。自己也學過很多什么聽上去吊吊的技術,也搭建起來了,手機上可以訪問,一切正常。但是在這個過程中遇到的BUG基本上都是通過百度查找“得來”的答案。所以自己想了挺多之后,也是拿起來底層理論開始進行系統(tǒng)性的學習。最后這本書的博客只作為隨筆,說給自己聽,若有“有緣人”看到且看且珍惜吧。
編碼的奧秘全書總結
這本書很通俗易懂,跟看故事書一樣。從手電筒到ASCII編碼,從十進制到二進制再十六進制,從組合電路到8080芯片,從開關到控制臺匯編程序。這一個歷經過程寫的算是淋漓盡致了。
加法器
- 加法器
- 半加器(結果是xor,進位是and)
- 全加器(考慮低位進位)
半加器邏輯圖如下:
全加器邏輯圖如下:
用加法器實現(xiàn)減法的方式是通過原碼、反碼、補碼實現(xiàn)。
步驟是:
(PS:以上步驟針對于被減數(shù)大于減數(shù)的情況下)
同步計數(shù)器
D型邊沿觸發(fā)器和時鐘實現(xiàn)同步計數(shù)器(CP)
D型邊沿觸發(fā)器特性表(PS:上升沿有效,也就是上升沿的時候輸出取反,現(xiàn)態(tài)為0,次態(tài)則為1)如下:
邏輯圖如下:
波形圖(PS:圖片順時針旋轉90°就會得到0000->0001-…->1111的序列)如下:
RAM存儲器
得到8位鎖存器后。這樣就得到擁有4根地址線的16x1的RAM存儲器了。
D型觸發(fā)器特性表:
D型觸發(fā)器和寫入信號實現(xiàn)8位鎖存器:
通過3-8譯碼器選擇寫入數(shù)據,通過8-1選擇器實現(xiàn)輸出數(shù)據,得到8x1存儲器:
再通過2-1譯碼器,得到16x1存儲器
通過前面的實現(xiàn)我們可以得到一個方程:RAM陣列的存儲容量=2的地址線的根數(shù)
通過這個我們就可以用16根地址線跟8個數(shù)據輸入得到一個64Kx8的RAM
至于為什么是易失的,是因為繼電器的電源來自于給這個RAM提供電源的設備(我們在這里稱這個設備為總電源吧)。讀到后面會知道,現(xiàn)在的計算機的RAM不用繼電器,而是采用別的技術來實現(xiàn),不過還是易失的就對了。
自動操作
接下來是自動操作。實現(xiàn)原理很簡單,我們用一個振蕩器來驅動一個16位計數(shù)器,計數(shù)器輸入到64Kx8的RAM從而讀取到RAM中的數(shù)據,最后再通過加法器跟鎖存器實現(xiàn)讀取RAM自動進行加法運算的操作。
不廢話。上圖:
發(fā)現(xiàn)燈泡亮的意義不大,改進這樣就可以將鎖存器的值通過在W=1時存入RAM中
到目前為止,我們一直“強調”著電路的實現(xiàn)?,F(xiàn)在我們把這些實現(xiàn)當做細節(jié)忽略。
這里,我們定義幾個指令:
通過這4個指令就可以這一項操作,并且停止。
現(xiàn)在,我們將抽象的實現(xiàn)這個電路:
這個時候,我們只要把我們需要的操作存放到代碼的RAM中即可實現(xiàn)自動操作。
我們理解完高字節(jié)與低字節(jié)以及加法減法的設計后,我們又抽象出一個電路:
第一個鎖存器保存指令代碼,第二個鎖存器保存地址的高字節(jié),第三個鎖存器保存地址的低字節(jié)。第二和第三個鎖存器的輸出組成了數(shù)據RAM 陣列的16位地址。
這個時候我們發(fā)現(xiàn),用2個RAM太浪費了??刹豢梢灾皇褂靡粋€RAM呢?
由于我們已經知道每條指令都占3個字節(jié),所以是可以的,只要在原來電路的基礎上做一點改進:
這樣,我們就可以通過控制面板向RAM寫入程序。此時PC計數(shù)器開始從程序入口地址開始計數(shù),通過代碼和地址鎖存器的共同作用執(zhí)行所編寫的程序。
到此為止,我們已經做出一個通過 計數(shù)器(PC) 就可以讓所編寫的程序自動執(zhí)行。不過我們發(fā)現(xiàn):我們該如何規(guī)定程序入口呢?再是當我們計算機開機的時候PC是從什么位置開始呢?所以,我們引入一個 jump指令,而PC從什么位置開始我們先不做回答(因為與本課程無關,答案是從BIOS的ROM開始執(zhí)行)。
因為我們增加了一個jump指令,所以需要改進的是PC計數(shù)器的一個取值。如下:
通過這種設計,我們就可以更改PC的值。讓程序自動執(zhí)行。(PC是一個振蕩器,這與RAM的W輸入不同)
到這里,我們的一個小型CPU已經被設計出來,而且這個CPU還與內存有著非常緊密的聯(lián)系。
從算盤到芯片
一個發(fā)展過程,不做闡述。
兩種典型的微處理器
8080和6800PC機。位數(shù)不同,一個8位,一個16位。我們知道8位可以通過轉換實現(xiàn)16位、32位、64位以及更高的的位數(shù)的處理。通過高低位字節(jié)實現(xiàn)。
8080是第三代微型處理器。8位。
6800是第三代微型處理器。16位。
由于每個不同的處理器都有對應不同的指令集,所以不做闡述。我們需要學習的是8086PC的指令集,一般匯編語言的教程都是用8086微型處理器,也是16位。
ASCII碼和字符映射
ASCII 碼是 7位 編碼。
Unicode 采用 16位 編碼,每一個字符需要 2個 字節(jié)。
這里是有歷史原因的。因為大多數(shù)國家用 7位 編碼都不足以存儲信息。所以每個國家都有自己的編碼集。
這樣會導致一個問題:在一個txt文本中既寫中文又寫阿拉伯文,而txt的編碼集設置為 GB2312 中國編碼集。保存后,讀取時會發(fā)現(xiàn)阿拉伯文變成亂碼。
于是Unicode出來了,將所有國家語言統(tǒng)一起來。此后又在Unicode的基礎上為了提高效率而提出 UTF-8 的標準。
總線連接
總線是提供給計算機中每塊電路板的數(shù)字信號的集合,這些信號可以分為 4類:
- 地址信號。這些信號由微處理器提供,常用來尋址RAM單元,也可用來尋址連接到計算機上的其他部件。
- 數(shù)據輸出信號。也由微處理器提供,用來寫入數(shù)據到RAM或其他設備。要仔細推敲輸入(input)和輸出(output)的含義。數(shù)據輸出信號是從微處理器輸出,變成RAM和其他設備的數(shù)據輸入信號。
- 數(shù)據輸入信號。是由計算機的其余部分提供,由微處理器讀入的信號。數(shù)據輸入信號通常來自于RAM的輸出,也即表示微處理器讀入存儲器內容。但是其他部件也提供數(shù)據輸入信號給處理器。
- 控制信號。由各種各樣的信號組成,通常與計算機的特定處理器的控制信號一致??刂菩盘柨蓙碜杂谖⑻幚砥骰驈钠渌考魉偷轿⑻幚砥鳌@?#xff0c;微處理器可用一個控制信號來指示它要寫一些數(shù)據到某一存儲器地址。
這里的總線,并不是指地址總線、數(shù)據總線、控制總線,從數(shù)據輸入輸出的作用就可以看出。因為數(shù)據輸入可以來自于其他設備(如鍵盤,而不是單一從的RAM獲取輸入),會響應中斷信號。
從操作系統(tǒng)開始到圖形革命的內容自行理解吧~
總結
以上是生活随笔為你收集整理的《编码的奥秘》---学习编程一年半的体会的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RIP学习---网络工程
- 下一篇: 基础知识---汇编学习笔记