《程序是怎样跑起来的》(上)
學習筆記
此書前言
無論任何事情,了解其本質非常重要。只有了解了本質才能提高利用效率。這樣一來,即使有新技術出現,也能很容易的理解并掌握。
第1章 對程序員來說CPU是什么
本章提問
本章重點
重點要理解寄存器
1.1 CPU內部結構解析
一、先看程序運行的一般流程:
這個圖可能只是在說編譯型語言吧。
在程序運行過程中,CPU負責解釋和運行最終轉換成機器語言的程序內容。
二、CPU的組成
- CPU是由寄存器、控制器、運算器、時鐘組成的;
- 寄存器用來暫時存儲指令、數據等對象,一個CPU可能會有20~100個寄存器;
- 控制器負責把內存上的指令和數據讀入寄存器,并根據運算結果來控制計算機;
- 運算器負責運算被讀入寄存器的內容;
- 時鐘負責發出CPU開始計時的信號。
三、內存
通常說的內存指計算機的主存儲器,其中的數據會隨關機而清除。
1.2 CPU是寄存器的集合體
程序員需要重點關注寄存器,其它的了解即可,因為程序是把寄存器作為對象來描述的。
使用高級語言編譯后會轉化成機器語言,然后再通過CPU內部的寄存器來處理。
通過閱讀匯編語言的代碼,可以了解轉化成機器語言的程序運行情況。
匯編語言為每一個機器語言指令添加一個助記符,匯編語言與機器語言是一一對應的。將匯編語言轉化為機器語言稱為匯編,反之稱為反匯編。
下面是一個匯編語言示例:
其中,add(相加)與mov(存儲,move)都是助記符,eax和ebp都是寄存器。
從示例中可以看出,機器語言級別的程序是通過寄存器來處理的。
我們可以將寄存器大致分為8類,用于運算的數值放在累加寄存器中存儲,表示內存的數值放在基址寄存器和變址寄存器中存儲,上面的eax和ebp分別是累加寄存器和基址寄存器。
對程序員來說,CPU就是具有各種功能的寄存器的集合體。
1.3 決定程序流程的程序計數器
下圖中的流程計算123+456:
一個命令或一個數據通常被存儲在多個地址上,為了便于說明,圖中將其都分配到了一個地址中。
總而言之,程序計數器決定程序的流程。
1.4 條件分支和循環機制
程序的流程分為順序、條件分支、循環三種。
下面的圖很清楚的講述了條件分支時的程序計數器依靠跳轉指令(jump)運作:
關于標志寄存器:
標志寄存器負責保存運算結果的正、負、零,還有溢出、奇偶校驗的結果。正、負、零三種狀態保存寄存器的三個位,根據數據狀態把相應位置為1。
關于比較運算:
實際上是把要比較的兩個數相減后把結果的狀態保存到標志寄存器中。
1.5 函數的調用機制
依靠call、return指令和棧實現調用函數的下一行指令的返回。
1.6 通過地址和索引實現數組
實現數組要依靠基址寄存器和變址寄存器。基址寄存器不變,改變變址寄存器,變址寄存器的值就相當于數組的索引。
1.7 CPU的處理其實很簡單
雖然程序很復雜,但是CPU執行的機器語言指令種類是比較少的,下圖對指令進行了大體分類:
問題答案:
第2章 數據是用二進制數表示的
本章提問
本章重點
二進制及其運算
2.1 用二進制數表示計算機信息的原因
計算機內部的電子元件是由IC(Integrated Circuit,集成電路)構成的,CPU也不例外。IC的的旁邊有引腳,有電流通過時,表示1,反之表示0。
其中一個引腳表示一位(bit, 即binary digit),8位表示一個字節,內存和磁盤都是用字節單位儲存和讀寫數據,因此,字節是信息的基本單位。32位處理器,即表示一次可以處理32位(4字節)的二進制信息。
對于用二進制表示的信息,計算機不會區分它是數值、文字,還是某種圖片的模式等,而是根據編寫程序的各位對計算機發出的指示來進行信息的處理。
2.2 什么是二進制數
各種進制的轉換。
2.3 移位運算和乘除運算的關系
左移運算需要在空出來的低位補0,右移運算在后面說明。另外,移位導致溢出的數字,直接丟棄即可。
可以依靠移位運算來進行乘除運算,二進制左移后會變為原來的二倍、四倍等等,右移會變為二分之一、四分之一等等。
2.4 便于計算機處理的補數
將所有的位取反再加一就得到補數,數及其補數互為相反數。
為什么數與其補數互為相反數?
計算機用加法實現減法運算,減某數就等于加上某數的補數。
2.5 邏輯右移和算術右移的區別
什么是邏輯右移?
當二進制數的值表示圖形模式而非數值時,移位后需要在最高位補0.類似于霓虹燈往右滾動的效果。
什么是算術右移?
當二進制數作為帶符號的數值進行運算時,移位后要在最高位填充移位前符號位的值(0或1),這就叫算術右移。
只有在右移時才必須區分邏輯右移和算術右移的區別。左移時,只需要在空出來的低位補0即可。
符號填充:
2.6掌握邏輯運算的竅門
4種類型:邏輯非、邏輯或、邏輯與、邏輯異或。
答案:
第3章 計算機進行小數運算時出錯的原因
本章提問
本章重點
計算機進行小數處理的機制
3.1 將0.1累加100次也得不到10
3.2 用二進制數表示小數
就是用負數來表示相應位數的指數
3.3 計算機運算出錯的原因
如圖:
二進制小數無法連貫的表示十進制小數
3.4 什么是浮點數
浮點數的形式:
浮點數由符號、尾數、基數、指數四部分構成。
浮點數的構造(IEEE的規定):
其中,符號部分非0即1;尾數部分用的是“將小數點的前面的值固定為1的正則表達式”,指數部分用“EXCESS系統表現”。簡單的來說,小數就是尾數部分×2的指數部分次冪。
PS,正則表達式是按照特定的規則來表示數據的形式。
3.5 正則表達式和EXCESS系統
尾數部分是如何用正則表達式來表示的呢?
先看十進制。比如十進制數0.75,可以用很多種方法來表示它,正如下圖所示。由于方法太多,需要制定一個統一的規則方便計算機處理,比如可以規定十進制小數“小數點前面是0,小數點后面第一位不能是0”。
同樣的,我們也可以為二進制指定規則。在二進制中,我們使用的是“將小數點前面固定為1”的正則表達式(個人理解:由于二進制只由0、1組成,如此做就相當于在小數點前保留1位有效數字)。這樣的話,第一位中的1可以不去保存,因為怎么樣都是1,這樣就節省了一個數據位,也就可以表示更大范圍的數據。
如果第1位始終是1,那么0怎么表示呢?查了資料,當尾數和指數均為0時,表示0,那1又怎么表示呢...........暫時還沒有找到資料,知道的大佬可以告訴我下。
指數部分與EXCESS系統
就是把中間的數當成0來看。
3.6 在實際的程序中進行確認
說下我的理解,memcpy就相當于把data內存中由0、1組成的序列復制到buff中去,但是程序中buff的值是用十進制顯式表示的,所以需要不停對2取余獲得真實的二進制序列。
程序結果及解釋:
3.7 如何避免計算機計算出錯
采用BCD方法。(暫時不太懂)
3.8 二進制數和十六進制數
二進制的4位等于十六進制的1位。
問題答案:
《程序是怎樣跑起來的》 (中)
轉載于:https://www.cnblogs.com/xmusxy/p/10914343.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的《程序是怎样跑起来的》(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新年快乐,送一台新款华为笔记本!
- 下一篇: CentOS 7.6 64位安装dock