日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《程序是怎样跑起来的》(上)

發布時間:2025/3/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《程序是怎样跑起来的》(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記

此書前言

無論任何事情,了解其本質非常重要。只有了解了本質才能提高利用效率。這樣一來,即使有新技術出現,也能很容易的理解并掌握。

第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指令和棧實現調用函數的下一行指令的返回。

  • 調用函數時,call會把調用函數后要執行的指令存儲在名為棧的主存內;
  • 函數執行完畢后,再用return把棧中的地址設定到程序計數器中實現返回。


  • 1.6 通過地址和索引實現數組

    實現數組要依靠基址寄存器和變址寄存器。基址寄存器不變,改變變址寄存器,變址寄存器的值就相當于數組的索引。


    1.7 CPU的處理其實很簡單

    雖然程序很復雜,但是CPU執行的機器語言指令種類是比較少的,下圖對指令進行了大體分類:


    問題答案:

  • 一般所說的程序,指的是行事的先后順序,計算機程序與之類似,指的是指示計算機每一步動作的一組指令;
  • 指令和數據。程序是指令和數據的組合體。如print("Hello"),print是指令,Hello是數據。
  • CPU可以直接識別并使用的語言;
  • 內存,硬盤等媒介保存的程序需要復制到內存后才能運行;
  • 內存中,用來表示指令和數據存儲位置的數值;
  • CPU.

  • 第2章 數據是用二進制數表示的

    本章提問

  • 32位是幾個幾個字節?
  • 二進制數01011100轉換成十進制數是多少?
  • 二進制數00001111左移兩位后,會變成原數的幾倍?
  • 補碼形式表示的8位二進制數11111111,用十進制數表示的話是多少?
  • 補碼形式表示的8位二進制數10101010,用16位的二進制數表示的話是多少?
  • 反轉部分圖形模式時,使用的是什么邏輯運算?
  • 本章重點

    二進制及其運算


    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種類型:邏輯非、邏輯或、邏輯與、邏輯異或。


    答案:

  • 4
  • 92
  • 4倍
  • -1
  • 1111111110101010
  • 異或

  • 第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年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的《程序是怎样跑起来的》(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。