匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器

      網友投稿 807 2025-04-01

      2.3 處理器

      CPU 或者說處理器可以視為計算機的大腦。在計算機系統中,主要的算術運算與邏輯運算都靠這個部件來處理。宏觀地來看,CPU 由 4 個主要的部分組成,它們是:算術邏輯單元(Arithmetic Logic Unit,ALU)、控制單元(Control Unit,CU)、CPU 時鐘(CPU clock)及存儲器(包括緩存和寄存器),參見圖2-6。

      ALU 是 CPU 中執行數學運算的子組件,它所執行的算術與邏輯運算針對的是整數型操作數(要注意操作數的類型是整數,浮點數由另一個組件處理)。CU 負責指揮 CPU 中的數據流,以確保 CPU 里的其他子組件能夠在適當的時機接收到正確的數據,并做出相應的處理。CU 還必須把指令執行周期(Instruction Execution Cycle)安排好,使得 CPU 指令能夠據此得以執行(此外,為了正確執行這些指令,計算機還需要完成其他一些子任務)。CPU 時鐘與系統時鐘不同,它是 CPU 本身的時鐘,用來為 CPU 的操作計時。

      有一個和 CPU 時鐘相關的術語叫作時鐘頻率,它的單位是赫茲(Hertz,Hz)。說得簡單一些:頻率為 1 Hz 的處理器其時鐘每秒震蕩 1 次。這里所說的震蕩一次,是指像圖 2-4 那樣完整地經歷高電平期與低電平期。當前的處理器都是以 MHz(megahertz,兆赫) 或 GHz(gigahertz,千兆赫)來描述頻率的,1 MHz 意味著每秒震蕩一百萬次,1 GHz 意味著每秒震蕩十億次。如果要用時鐘周期而不是頻率來描述處理器的快慢,就給頻率取倒數。例如, 1GHz 的 CPU其時鐘每秒鐘脈沖十億次,因此每個時鐘周期的長度就是十億分之一秒。有一個重要的現象要注意:CPU的時鐘頻率是系統時鐘頻率的倍數,具體是幾倍由倍頻系數(multiplier)決定。比方說,如果系統時鐘運行在 800 MHz 的頻率上,而倍頻系數是 4,CPU 的頻率就是 3.2 GHz。由于 CPU 的時鐘運行速度為系統時鐘的 4 倍,因此它在同樣長的時間內所能完成的操作數量也是后者的 4 倍。

      2.3.1 緩存與寄存器

      由于處理器要對數據執行操作,因此必須要有地方來保存這些用作操作數的數據,此外,操作結果以及操作所涉及的地址也得有地方保存。前面講解存儲器的層次結構時曾經說過,離 ALU 越遠,存儲器中的數據訪問起來越慢。于是,為了令 CPU 能夠盡快執行操作,必須想辦法把指令與數據放到它能夠迅速訪問的存儲器中,也就是說,存放這些指令與數據的存儲器離 ALU 及 CU 越近越好。這種緊鄰 CPU 的存儲器就叫作cache(高速緩存,簡稱緩存),實際上,它跟邏輯電路一起位于 CPU 芯片中。緩存在存儲器的層次結構中有其地位,然而它內部還有一套自己的層次結構。

      當前的處理器緩存通常分為三個級別,分別是 L1 緩存(一級緩存)、L2 緩存(二級緩存)與 L3 緩存(三級緩存)。緩存本身的層次結構與存儲器的層次結構都遵循同一條原則:距離 ALU 越遠容量越大,價格也越便宜。L1 與 L2 緩存都離 ALU 很近,不過 L2 要比 L1 稍遠一些,因此其容量也大一些。L3 緩存一般出現在多核處理器中,它為所有 CPU 核心所共享,而 L1 與 L2 緩存則每個 CPU 核心都配有一套,如圖2-7所示。L3 緩存是靜態存儲器中的最后一層,如果數據不保存在該層及其上方的各層中,那就只好放到它下方的 RAM 中了。

      現在以 Intel Core i7 系列的處理器為例來說明緩存的層級:i7 處理器的每個核心都配有 64KB的 L1 緩存,其中 32KB保存指令,32KB保存數據。此外,還配有 256KB的 L2緩存。L3 緩存的容量是4MB~24MB,具體要看你買的是便宜一些的型號還是貴一些的型號。

      CPU 提供了一些與緩存有關的指令,然而開發者一般都不用專門編寫代碼去訪問或操作緩存,因為緩存是由復雜的算法來控制的,以確保程序所需的數據能夠盡量出現在緩存中,所以開發者通常不需要干預這套機制。比方說,如果程序頻繁引用某個變量,那么處理器就有可能認為這份數據相當重要,從而將其預先獲取(prefetch,簡稱預取)出來并放入緩存,使得程序以后訪問該數據時能夠快一些。CPU 會在執行程序的過程中隨時根據情況來做出這種處理。

      除了緩存之外,CPU 中還有一種存儲器叫作寄存器(register),它的內容可以通過明確的地址來訪問,而且在此類存儲器中它是最快的一種。它位于整個存儲器層級的最頂端,其容量比緩存更小,速度也比緩存更快。寄存器是最貼近 ALU 的一小塊存儲區域,用來保存執行指令時所涉及的操作數、地址及結果。

      提示:處理器的每個核心都有自己的一套 L1 與 L2 緩存,與之類似,每個核心也都有自己的一套寄存器。然而,編寫匯編代碼的時候你不用指出當前操作的寄存器究竟處在哪個核心上,你只需要寫出寄存器的名字就可以了,至于這個寄存器到底指的是哪個核心上的寄存器則由 CPU決定。表 2-4 列出了這些名稱。

      表 2-4 x86 與 x86_64 的寄存器

      表 2-4 中的寄存器可以分成 4 類:通用目的寄存器(General Purpose Register)、段寄存器(Segment Register)、標志寄存器(Flags Register)及指令指針寄存器(Instruction Pointer Register)。匯編程序所操作的基本上都是通用目的寄存器,其中,32 位的通用寄存器有 8 個,64 位的有 16 個。通用寄存器用來執行計算或移動數據。由于 64 位處理器是在 32 位設計方案的基礎上構建的,而 32 位處理器又是在 16 位設計方案的基礎上構建的,因此新式處理器不僅可以通過寄存器本身的名字來使用該寄存器,而且還能通過舊式處理器所用的名字將其當成舊式的寄存器來使用。此外,如果你要使用的數據或是你要執行的運算只需占據 8 個二進制位,那么可以把 16 位的寄存器想象成兩個 8 位的寄存器,這樣就可以用它來保存兩份數據了。圖 2-8 以 64 位的rax寄存器為例來演示怎樣以 8 位、16 位、32 位及 64 位的方式使用它。

      圖 2-8 寄存器尋址

      由于上述寄存器之間有所重疊,因此會引發一個問題:以不同的名義來操作寄存器會不會使其中的數據受到影響?比方說,如果以 eax 的名義保存了一個 32 位的值,然后又以 ax 的名義保存了一個 16 位的值,那么 eax 的低 16 位是得以保留,還是遭到覆蓋?圖 2-9 給出了解答。由該圖可知,無論以什么名義來使用寄存器操作的都是同一套二進制位,具體到本例來說,這意味著無論你是用 rax 來操作,還是用 eax、ax、ah或 al 來操作,你所操作的二進制位其實都位于 rax 寄存器本身的那 64 個二進制位中,而不是說總共有 128 個二進制位可以使用,其中 64 個劃撥給 rax ,32 個劃撥給 eax,16 個劃撥給 ax,8 個劃撥給 ah,8 個劃撥給al。同樣的規律也適用于其他類似的情況:凡是以小寄存器的名義來操作大寄存器的,其實操作的都是大寄存器中與這個小寄存器相對應的那一部分二進制位。

      圖 2-9 以 ax 的名義操作 eax,會破壞 eax 中已有的一部分數據

      《匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器

      從圖 2-9 中可以看出,如果把值復制到 ax 中,那么實際上會把 eax 的低 16 位給覆蓋掉,導致 eax 中原有的值遭到破壞。之所以出現這種問題是因為 eax 與 ax 共用這 16 個二進制位。不過并非所有的寄存器都像 rax 這樣可以通過 rax、eax、ax、ah 及 al 等不同的名義來使用,即便可以這樣用,其二進制位的共享情況也未必和此處所舉的例子相同。表 2-5 列出了 rax、rbx、rcx 及 rdx 這 4 個 64 位寄存器與其 32 位、16 位、8 位子寄存器之間的共用情況。另外 4 個 64 位寄存器,也就是 rsi、rdi、rbp 及 rsp 與其 32 位及16 位子寄存器之間的共用情況參見表 2-6。

      表 2-5 rax、rbx、rcx 及 rdx 與其子寄存器之間的重疊情況

      表 2-6 rsi、rdi、rbp 及 rsp 與其子寄存器之間的重疊情況

      盡管剛才提到的那些寄存器都可以用在匯編程序里,但是必須注意,有些寄存器是有特殊用途的。如果不加注意,那么保存于某個寄存器(例如 rax/eax)中的數據就有可能在執行完下一項操作之后遭到修改,從而產生違背開發者意圖的效果。下面列出某些 64 位及 32 位寄存器的特殊用法,以提醒大家避免相關的編程錯誤。

      rax/eax 通常是默認的累加寄存器。乘法等操作會將其中一部分結果自動存放到 rax/eax 中,調用函數的時候也需要把返回值保存在 rax/eax 中。因此,執行這些操作時不要用 rax/eax 保存一般的數據。

      rcx/ecx 用來在執行循環的過程中記錄循環計數器的值。因此,在循環內部不要用 rcx/ecx 保存一般的數據。

      rbp/ebp 用作棧幀中的幀指針,這會在第 6 章講解。該寄存器用來指向棧中的數據,筆者建議只把它當作專門的寄存器來用。

      rsp/esp 是棧指針寄存器,這也是個與棧管理有關的寄存器,它一般指向活動棧幀的頂部。與前一個寄存器一樣,這個寄存器也只應該當成專門的寄存器來用。

      rsi/esi 與 rdi/edi 是索引寄存器(index register,也稱為變址寄存器),它和STOSB、MOVSB 與 SCASB 這樣的字符串操作結合起來使用,以便保存、加載或掃描大量的數據。這些操作實際上會把 CPU 置于一種自動循環模式中,這要比開發者手工編寫循環更有效率。

      rip/eip 是擴展版的指令指針寄存器。這個寄存器用來指向內存中的地址,以表示接下來應該獲取、解碼并執行的指令,它是在程序運行過程中自動調整的,不應該通過編程的手段修改。

      rflags/eflags 是狀態與控制寄存器,這會在接下來的內容里詳細講解。LAHF 與 SAHF 等特殊指令可以把 CPU 的一些狀態標志載入 ah 寄存器,或是將 ah 寄存器里的值保存到狀態寄存器中。除此以外,不應該用其他手段直接修改 rflags/eflags。該寄存器里的二進制位是在執行完算術運算之后根據一套布爾規則自動設置的。盡管 rflags 是 64 位,但其中能夠用到的只有低 32 位,因此,x86 與 x86_64 處理器用的是同一套狀態標志。

      CPU 標志(CPU flag)是一些二進制位的統稱,這些二進制位分別用來以某種方式控制 CPU 操作或反映 CPU 操作的狀態。表2-7列出了大多數開發環境中值得關注的 8 個標志位,其中某些標志可以由開發者通過 LAHF 及 SAHF 指令來操作。表 2-8 列出了可以由這些指令所編輯的標志位。對于標志位來說,set(設置)的意思是將其設為 1(也稱為置 1),clear(清除)的意思是將其設為 0(也稱為置 0)。

      表2-7 值得關注的標志位

      Overflow(溢出)?? OF? 11?? 如果運算結果以補碼的形式來表示時所需的二進制位個數超過了該運算所采取的個數,那么該標志就會設置。與 Carry 標志不同的是,此標志是針對帶符號的整數而言的,如果運算結果的符號與操作數的符號相反,那么它就會得到設置,比方說,在 8 位環境中,127 + 127 的結果用補碼表示需要 9 位(0 1111 1110),如果只看后 8 位(1111 1110),那么由于其中的最高有效位是1,因此這是個負值(相當于十進制的 -2),于是執行完這次加法之后OF標志就會得到設置

      編程知識:表 2-8 中,1、3、5 號二進制位是用 U 來表示的,意思是說,這些二進制位用不到(Unused)或是予以保留(reserved)。在通過 SAHF 指令把 ah 的內容保存到標志寄存器時,這些二進制位的值不應當受到影響,3、5 號二進制位始終應該是 0,1 號二進制位始終應該是 1。

      表 2-8 可以通過 LAHF/SAHF 指令編輯的標志位及其序號

      軟件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:bpm業務流程管理系統優化企業流程,提升效率的利器
      下一篇:Excel公式如何返回月末的日期
      相關文章
      噜噜综合亚洲AV中文无码| 亚洲狠狠ady亚洲精品大秀| 伊人久久亚洲综合影院首页| 亚洲第一成年人网站| 亚洲卡一卡2卡三卡4卡无卡三| 国产精品亚洲片在线观看不卡| 亚洲精品午夜无码专区| 国产AⅤ无码专区亚洲AV| 久久精品国产精品亚洲| 亚洲综合激情另类专区| 亚洲国产精品一区二区第四页| 国产成人亚洲综合无| 亚洲成人国产精品| 国产精品亚洲综合一区| 国产午夜亚洲不卡| 久久被窝电影亚洲爽爽爽| 亚洲国产精品无码专区影院| 亚洲AV无码一区二区三区系列| 亚洲Aⅴ无码专区在线观看q| 91亚洲国产在人线播放午夜| 亚洲国产午夜精品理论片| 国产成人精品亚洲日本在线| 亚洲综合一区国产精品| 亚洲AV永久无码天堂影院 | 亚洲AV无码成人精品区天堂| 亚洲国产精品无码久久久秋霞2| 亚洲国产成人一区二区精品区 | 亚洲欧美自偷自拍另类视| 亚洲国产精品无码第一区二区三区| 国产精品亚洲精品久久精品| 亚洲 无码 在线 专区| 久久精品国产精品亚洲艾草网美妙| 国产精品亚洲аv无码播放| 亚洲成a人片在线观看中文动漫 | 日产国产精品亚洲系列| AV在线亚洲男人的天堂| 亚洲AV综合色一区二区三区| 67pao强力打造67194在线午夜亚洲| 亚洲制服丝袜精品久久| 四虎必出精品亚洲高清| 老司机亚洲精品影院在线观看|