- 程序是怎樣跑起來的(第3版)
- (日)矢澤久雄
- 1249字
- 2023-06-20 18:13:10
1.2 CPU是寄存器的集合體
前面介紹的CPU的四個組成部件中,需要程序員特別關注的只有寄存器,其余三個部件不需要關注。為什么我們必須關注寄存器呢?這是因為寄存器是程序的描述對象。
請看代碼清單1-1,這是用匯編語言編寫的程序的部分內容。機器語言
指令的本質是電子信號,我們用英語單詞或其縮寫(稱為助記符)表示每一種信號的功能,就構成了匯編語言。例如,mov和add分別代表傳送(move)數據和加法運算(addition)操作。匯編語言和機器語言基本上是一一對應的,這一點和C語言、Java等高級編程語言
有很大差別,因此要講解CPU的工作原理,用匯編語言是最合適的。將匯編語言程序轉換成機器語言的過程稱為匯編(assemble),反過來,將機器語言程序轉換成匯編語言的過程稱為反匯編(disassemble)。希望大家能夠記住這兩個名詞。
代碼清單1-1 匯編語言程序示例(其中帶顏色的地方表示寄存器)
movl -4(%ebp), %eax … 將內存中的值讀入 eax
addl -8(%ebp), %eax … 將內存中的值累加到 eax
movl %eax, -12(%ebp) … 將 eax的值(加法運算結果)存放到內存中
通過閱讀匯編語言程序,我們就能理解機器語言程序的工作原理。之所以給大家展示代碼清單1-1中的匯編語言程序,是想告訴大家,在機器語言層面上,程序的操作都是使用寄存器來完成的。也就是說,從程序員的視角來看,CPU就是寄存器的集合體。至于控制器、運算器和時鐘,我們只要知道它們的存在就足夠了。
在代碼清單1-1中,eax和ebp都表示寄存器,大家應該能大致看出,這段程序是在使用寄存器來存放數據和進行加法運算。這段程序所使用的是32位x86架構CPU的匯編語言,其中,eax和ebp都是CPU內部的寄存器的名稱。內存中存儲數據的位置是用地址來區分的,寄存器則是用名稱來區分的。
這些內容聽起來有點難,但是請大家放心,我們并不需要記住某種CPU中所有寄存器的名稱,也不需要掌握匯編語言,重要的是對CPU怎樣處理程序有一個大概的印象。也就是說,大家用高級編程語言編寫的程序,最終都會被編譯成機器語言,然后在CPU內部通過寄存器進行處理。例如,aa=1+2這樣的高級編程語言程序,在轉換成機器語言之后就是用寄存器來進行存儲處理和加法運算操作的,這一點大家需要知道。
CPU的類型不同,其內部的寄存器數量、類型及寄存器中能存儲的數據長度也有所不同,但如果按照功能進行大致分類,就是表1-1這樣。寄存器中存放的值可以是指令,也可以是數據,其中數據又分為“用于運算的數值”和“表示內存地址的數值”。不同類型的值會存放在不同類型的寄存器中。CPU中的每個寄存器都有不同的功能,例如用于運算的值存放在累加器中,表示內存地址的值存放在基址寄存器和變址寄存器中。代碼清單1-1中出現的eax是累加器,ebp是基址寄存器。
表1-1 寄存器的主要類型及其功能

對程序員來說,CPU就像圖1-3展示的那樣,是由具有不同功能的寄存器所構成的集合體。一般來說,程序計數器、累加器、標志寄存器、指令寄存器、棧寄存器各僅有一個,其他類型的寄存器可以有多個。其中,程序計數器和標志寄存器屬于比較特殊的寄存器,這一點會在后面的章節中詳細介紹。圖1-3中省略了程序員不需要關注的寄存器(如存放指令的指令寄存器等)。

圖1-3 從程序員的視角看CPU(CPU是寄存器的集合體)
- Clojure Programming Cookbook
- GAE編程指南
- JavaScript前端開發模塊化教程
- Machine Learning with R Cookbook(Second Edition)
- C語言程序設計(第2版)
- R Deep Learning Cookbook
- Hands-On Functional Programming with TypeScript
- Unreal Engine 4 Shaders and Effects Cookbook
- .NET 3.5編程
- Mastering openFrameworks:Creative Coding Demystified
- Extreme C
- C專家編程
- Mastering ArcGIS Enterprise Administration
- Red Hat Enterprise Linux Troubleshooting Guide
- 算法設計與分析:基于C++編程語言的描述