---
# System prepended metadata

title: Assembly Language / Ch01 - x86 Processor Architecture
tags: [Assembly Language]

---

# Assembly Language / Ch01 - x86 Processor Architecture

## 0. 前言

As the saying goes，資工系優良傳統：「上課擰螺絲，作業造火箭。」所以如果我心有餘力的話組語的筆記都會盡量詳盡，不過話越多出錯的可能性越高，如果我有寫得不太嚴謹或根本是錯的地方，請在第一時間通知呱呱。

阿對ㄌ，什麼進位置轉換跟補數那是數位系統的內容喔，大家自己加油哩。

## 1. General Concepts

### 1.1 基本微型電腦設計

<img src= "https://hackmd.io/_uploads/Sk0hABR6A.png" style="border: 1.5px solid;">

微型電腦是現代計算技術的基礎，其核心組件包括中央處理器（CPU）、內存存儲單元和輸入/輸出設備。這些組件通過複雜的電路和匯流排系統相互連接，共同工作以執行各種計算任務。

中央處理器（CPU）是微型電腦的大腦，負責執行指令和處理數據。CPU內部包含幾個關鍵元件：時鐘（Clock）、控制單元（CU）、算術邏輯單元（ALU）和暫存器。時鐘（Clock）負責同步所有CPU和匯流排操作、測量單個操作的時間和觸發事件。控制單元（CU）協調執行步驟的順序，管理指令的流程。算術邏輯單元（ALU）執行算術和位元運算，是數學和邏輯操作的核心。暫存器是CPU內部的高速存儲單元，用於快速數據存取，大大提高了處理速度。

內存存儲單元用於存儲程序和數據，分為易失性（如RAM）和非易失性（如ROM）兩種。

輸入/輸出設備則負責與外部世界進行交互，包括鍵盤、顯示器、硬盤等。

| CPU內部組件            | 說明                                          |
|-----------------------|---------------------------------------------|
| 時鐘（Clock）                   | 同步所有CPU和匯流排操作、測量單位操作時間、觸發事件                      |
| 控制單元（CU）         | 協調執行步驟的順序                          |
| 算術邏輯單元（ALU）    | 執行算術和位元運算                          |
| 暫存器                 | 用於快速數據存取                            |


### 1.2 指令執行週期

指令執行週期是CPU運行程序的基本過程，包括四個主要步驟：
1. 從內存中獲取指令
2. 解碼指令
3. 執行指令
4. 存儲結果

<img src= "https://hackmd.io/_uploads/Sy3HbIA6R.png" style="border: 1.5px solid;">

首先，CPU從內存中讀取下一條要執行的指令。這個過程涉及使用程序計數器（PC）來確定指令的位置。接著，CPU對獲取的指令進行解碼，確定需要執行的具體操作和涉及的操作數。解碼後，CPU執行指令，可能涉及算術運算、邏輯運算、數據傳輸或控制流程變更等操作。最後，執行的結果被存儲到指定的位置，可能是暫存器或內存。

這個週期不斷重複，使得CPU能夠連續執行程序中的指令序列，實現複雜的計算和控制功能。

### 1.3 緩存記憶體（Cache Memory）

緩存記憶體是一種高速小容量的記憶體，用於存儲最近使用的指令和數據，以提高系統性能。它的工作原理基於程序局部性原理，即程序在執行過程中往往會重複訪問同一塊內存區域。

緩存記憶體通常分為多個層級：
- L1緩存：位於CPU內部，容量最小但速度最快，通常分為指令緩存和數據緩存。
- L2緩存：通常整合在晶片上但在CPU核心外部，容量較L1大，速度稍慢。
- L3緩存：在某些高端處理器中存在，容量更大，被多個CPU核心共享。

緩存的工作過程涉及兩個重要概念：緩存命中（Cache hit）和緩存未命中（Cache miss）。當CPU請求的數據在緩存中找到時，稱為緩存命中，可以快速訪問數據。如果數據不在緩存中，稱為緩存未命中，此時需要從較慢的主內存中獲取數據。

緩存系統的效能對整個計算機系統的性能有顯著影響，良好的緩存管理可以大幅提升程序執行速度。

### 1.4 程序運行過程

<img src= "https://hackmd.io/_uploads/SkejzURp0.png" style="border: 1.5px solid;">


程序運行是一個複雜的過程，涉及作業系統、文件系統和硬體的多個層面的交互。當用戶啟動一個程序時，作業系統首先在當前目錄或系統路徑中搜索可執行文件。找到文件後，作業系統會讀取文件的目錄項，獲取程序在硬碟上的起始位置。

接下來，作業系統將程序加載到內存中。這個過程包括分配必要的內存空間，將程序代碼和數據從硬碟複製到內存，並設置程序的執行環境，如初始化堆疊和設置程序計數器。

加載完成後，作業系統將控制權轉交給程序，程序開始執行。在執行過程中，程序可能會請求作業系統提供的服務，如文件操作或網絡通信。當程序執行完畢或被用戶終止時，控制權返回作業系統，作業系統會清理程序使用的資源，如釋放內存和關閉打開的文件。

這個過程展示了作業系統在程序管理中的核心角色，以及硬體、作業系統和應用程序之間的緊密協作關係。

## 2. IA-32 Processor Architecture

### 2.1 操作模式

IA-32處理器支持多種操作模式，每種模式都有其特定的用途和特性：

| 操作模式       | 特性與用途                                                                                       |
| -------------- | ------------------------------------------------------------------------------------------------ |
| 保護模式       | 現代作業系統如Windows和Linux的原生模式，支持虛擬內存、分頁和多任務處理，保護程序間不互相干擾。       |
| 實地址模式     | MS-DOS的原生模式，僅能訪問1MB內存，處理器行為類似早期8086，主要用於向後兼容與系統啟動。              |
| 系統管理模式   | 用於電源管理、系統安全和診斷，暫停正常程序執行，處理特定的系統管理任務，實現高級系統功能。           |
| 虛擬8086模式   | 保護模式的一個變種，在保護模式下模擬8086環境，允許運行實地址模式設計的16位程序。                     |

**保護模式：** 是現代作業系統如Windows和Linux的原生模式。在這種模式下，每個程序都在自己的內存空間中運行，受到硬體級別的保護，防止互相干擾。保護模式支持虛擬內存、分頁和多任務處理，為現代作業系統提供了必要的基礎。

**實地址模式：** 主要用於向後兼容，是[MS-DOS](https://github.com/microsoft/MS-DOS)的原生模式。在這種模式下，處理器的行為類似於早期的8086處理器，只能訪問1MB的內存空間。雖然功能有限，但它在系統啟動和某些特殊應用中仍然重要。

**系統管理模式：** 是一種特殊的操作模式，用於電源管理、系統安全和診斷。當處理器進入這種模式時，正常的程序執行被暫停，處理器執行特定的系統管理代碼。這種模式對於實現高級系統功能非常重要。

**虛擬8086模式：** 是保護模式的一個變種，允許在保護模式環境中運行為實地址模式設計的程序。這種模式在保護模式下模擬多個8086環境，使得現代作業系統能夠運行舊的16位程序。

這些不同的操作模式使IA-32處理器能夠適應各種不同的使用場景，從運行現代多任務作業系統到支持遺留軟體和系統級功能。

### 2.2 基本執行環境

#### 2.2.1 可尋址內存

IA-32處理器的可尋址內存範圍取決於其操作模式：

| 操作模式           | 可尋址內存範圍                   | 地址位元      | 特點                                                                 |
| ------------------ | ------------------------------- | ------------- | -------------------------------------------------------------------- |
| 保護模式           | 高達4 GB                         | 32位          | 支持現代應用程序的大量內存需求，適用於複雜數據結構與大型程序。           |
| 實地址模式         | 1 MB                             | 20位          | 主要為保持與舊軟體的兼容性，反映早期x86處理器設計。                    |
| 虛擬8086模式       | 1 MB                             | 20位          | 保護模式下的變種，模擬8086環境，用於運行舊的16位程序。                  |


在保護模式下，處理器可以尋址高達4 GB的內存空間，使用32位的地址。這種大的地址空間為現代應用程序提供了充足的內存資源，支持複雜的數據結構和大型程序的運行。

相比之下，在實地址模式和虛擬8086模式下，處理器僅能尋址1 MB的內存空間，使用20位地址。這種限制反映了早期x86處理器的設計，主要用於保持與舊軟體的兼容性。

這種內存尋址能力的差異反映了處理器架構的演進，以及現代計算需求與遺留系統兼容性之間的平衡。

#### 2.2.2 通用暫存器

IA-32架構提供了一組豐富的暫存器，用於各種不同的目的：

**General-Purpose Registers（32位元）：** 通用暫存器包括EAX、EBX、ECX和EDX等。這些暫存器可用於各種用途，如存儲中間計算結果、保存內存地址或作為循環計數器。例如，EAX通常用作累加器，而ECX常用作循環計數器。

**Segment Registers（16位元）：** 段暫存器如CS（代碼段）、SS（堆疊段）、DS（數據段）和ES（額外段）用於內存分段。在保護模式下，這些暫存器包含段選擇子，用於訪問內存段描述符。

**特殊用途暫存器：** 包括EIP（指令指標，Instruction Pointer）和EFLAGS（狀態和控制標誌，Status and Control Flags）。EIP始終指向下一條要執行的指令，而EFLAGS包含了各種重要的處理器狀態信息。

這些暫存器的設計反映了x86架構的歷史和功能需求，提供了靈活而強大的工具來控制程序執行和管理數據。

#### 2.2.3 狀態標誌

EFLAGS暫存器中的狀態標誌提供了關於最近的算術或邏輯操作結果的重要信息：

| 標誌              | 作用與用途                                                                 |
| ----------------- | -------------------------------------------------------------------------- |
| 進位標誌（Carry）  | 在 **無符號（unsigned）** 算術運算結果超出範圍時設置，對大數運算和多精度算術非常重要。           |
| 溢出標誌（Overflow）| 在 **有符號（signed）** 算術運算結果超出範圍時設置，有助於檢測有符號整數運算中的錯誤。           |
| 符號標誌（Sign）   | 反映結果的符號，用於有符號數的比較和條件跳轉。                                |
| 零標誌（Zero）     | 在運算結果為零時設置，常用於相等性比較和循環控制。                            |
| 輔助進位標誌（Auxiliary Carry） | 反映從第3位向第4位的進位情況，主要用於BCD（二進制編碼十進制）算術。  |
| 奇偶標誌（Parity） | 反映結果中1位的奇偶性，在某些錯誤檢測算法中有用。                              |

這些標誌共同為工程師提供了豐富的信息，用於控制程序流程、實現複雜的算法和進行錯誤檢測。

#### 2.2.4 浮點、MMX和XMM暫存器

IA-32架構還包括專門用於高性能計算的特殊暫存器：

8個80位浮點數據暫存器組成一個暫存器堆疊，用於高精度浮點運算。這些暫存器支持複雜的數學運算和科學計算。

8個64位MMX暫存器用於SIMD（單指令多數據）操作，能夠同時處理多個較小的整數值，提高多媒體和圖形處理的效率。

8個128位XMM暫存器用於更高級的SIMD操作，支持並行處理更多或更大的數據元素。這些暫存器在現代多媒體應用、3D圖形和科學計算中發揮重要作用。

這些特殊暫存器的引入大大增強了IA-32處理器在特定應用領域的性能，使其能夠高效處理複雜的數值計算和數據密集型任務。

## 3. IA-32 Memory Management

### 3.1 保護模式

保護模式是IA-32處理器的主要操作模式，為現代作業系統提供了強大的內存管理功能：

在保護模式下，處理器可以尋址高達4 GB的物理RAM。這個巨大的地址空間為複雜的應用程序和大型數據集提供了充足的資源。

保護模式的一個關鍵特性是內存保護機制。每個運行的程序都被分配一個獨立的內存分區，這個分區受到硬體級別的保護，防止其他程序非法訪問或修改。這種隔離機制大大提高了系統的穩定性和安全性。

保護模式的設計特別適合多任務處理。作業系統可以同時運行多個程序，每個程序都在自己的受保護內存空間中運行，互不干擾。這為現代作業系統的多任務和多用戶功能提供了基礎。

Linux和Windows等現代作業系統充分利用了保護模式的這些特性。它們使用保護模式來實現虛擬內存、進程隔離和權限管理等高級功能，為用戶提供安全、穩定和高效的計算環境。

保護模式的這些特性使得IA-32處理器能夠支持複雜的作業系統和應用程序，同時保持系統的安全性和穩定性。這也是現代個人計算機和伺服器都能夠同時運行多個複雜應用程序的基礎。

## 4. 64-Bit Processors

64位處理器代表了x86架構的重大演進，引入了新的操作模式和擴展的執行環境，大大增強了處理能力：

64位處理器引入了兩種主要的操作模式：兼容模式和64位模式。

**兼容模式：** 允許處理器運行現有的16位和32位應用程序，這確保了與舊軟體的向後兼容性。值得注意的是，在Windows環境下，兼容模式主要支持32位應用程序。這種兼容性使得用戶和組織可以平穩過渡到64位計算環境，而無需立即更新所有軟體。

**64位模式：** 處理器架構的核心創新，在這種模式下，處理器可以充分利用64位架構的優勢。Windows 64位版本就是在這種模式下運行的。64位模式最顯著的特點是大幅擴展了可用的內存地址空間。理論上，64位處理器可以尋址高達 16 EB（艾字節）的內存，儘管實際實現通常限制在 48 位尋址，仍然提供了 256 TB 的巨大地址空間。這使得處理大型數據集和運行內存密集型應用變得更加容易。

64位架構還引入了擴展的暫存器集。處理器現在擁有16個64位通用暫存器，這些暫存器的名稱以 R 開頭，如 RAX、RBX、RCX、RDX 等，以及新增的 R8 到 R15。這些擴展暫存器不僅增加了可用於快速數據存取的空間，還提高了數據處理的效率，特別是在處理大型數據結構時。

指令指標也擴展為 64 位，命名為 RIP ~~（真的可以去死一死）~~ 。這允許程序跳轉到更大範圍的內存位置，支持更大、更複雜的程序結構。

此外，64位架構還引入了許多新的指令集擴展，如 SSE（流式 SIMD 擴展）的新版本，這進一步增強了處理器在多媒體、科學計算和加密等領域的性能。

總的來說，64位處理器的引入標誌著計算能力的重大飛躍，為更複雜、更強大的軟體應用鋪平了道路，同時通過兼容模式保持了與現有軟體生態系統的連續性。

## 5. Components of an IA-32 Microcomputer

IA-32 微型電腦是一個複雜的系統，由多個關鍵組件組成，每個組件都在計算機的整體功能中扮演著重要角色：

### 5.1 主機板

主機板是整個計算機系統的核心，它是一個複雜的印刷電路板，將所有其他組件連接在一起。主機板的設計直接影響了系統的性能、擴展性和兼容性。

**CPU 插槽（Socket）：** 主機板上最重要的組件之一，這個插槽決定了主機板可以支持哪些型號的處理器。現代主機板通常使用 LGA（陸地網格陣列）或 PGA（針網格陣列）插槽，這些插槽設計允許處理器可以輕鬆升級。

**外部緩存內存插槽：** 在早期的主機板設計中很常見，用於安裝額外的高速緩存。然而，在現代處理器中，高速緩存通常直接集成在 CPU 內部，減少了對外部緩存的需求。

**主內存插槽：** 用於安裝系統的 RAM。現代主機板通常提供多個 DIMM（雙列直插內存模組）插槽，支持高速 DDR（雙倍數據速率）內存。

**BIOS：** 基本輸入/輸出系統芯片包含了計算機啟動和硬體初始化所需的基本指令。現代系統已經開始採用 UEFI（統一可擴展固件接口）來替代傳統 BIOS，提供更多功能和更好的安全性。

主機板還包括各種連接器，如 IDE、SATA、USB、音頻和網絡接口等。這些連接器使得主機板可以與各種外部設備和存儲裝置進行通信。PCI（外圍組件互連）和 PCIe（PCI Express）插槽則用於安裝擴展卡，如顯卡、聲卡或網卡等。

### 5.2 視訊輸出

視訊輸出系統負責將計算機生成的圖像信息轉換為可顯示的視訊信號。這個系統的核心是視訊控制器，它可能直接集成在主機板上（集成顯卡），或者作為獨立的擴展卡（獨立顯卡）安裝。

視訊控制器包含專門的處理器和內存，用於處理圖形渲染、3D 加速和視訊解碼等任務。高端顯卡甚至包含數千個小型並行處理單元，能夠進行複雜的圖形計算。

視訊內存（VRAM）是視訊控制器的關鍵組成部分，用於存儲即將顯示的圖像數據。VRAM 通常採用雙端口設計，允許同時進行數據寫入和讀出操作，以實現流暢的視訊輸出。

在輸出端，視訊控制器需要支持不同類型的顯示設備。傳統的 CRT（陰極射線管）顯示器使用模擬信號，需要進行數模轉換。而現代的 LCD（液晶顯示器）和 LED 顯示器則使用數字信號，通過 DVI、HDMI 或 DisplayPort 等接口連接。

### 5.3 內存類型

計算機系統使用多種類型的內存，每種都有其特定的用途和特性：

**ROM（只讀內存）：** 存儲不易更改的固定數據和指令，如 BIOS 或設備固件。ROM 的內容在斷電後仍然保持，但通常不能（或很難）修改。

**EPROM（可擦除可編寫只讀內存）：** 一種可以重新編寫的 ROM，可以通過紫外線照射來擦除內容，然後重新編寫。這種靈活性使其適用於需要偶爾更新的固件存儲。

**動態 RAM（DRAM）：** 計算機主內存的主要形式，特點是高密度和相對低成本，但需要定期刷新以保持數據。DRAM 的訪問速度相對較慢，但容量大，適合存儲大量數據。

**靜態 RAM（SRAM）：** 比 DRAM 速度更快，不需要刷新，但成本較高且密度較低，因此SRAM 主要用於處理器內部的高速緩存。

**視訊 RAM（VRAM）：** SRAM製程的子集合，專門為圖形處理優化的內存，通常採用雙端口設計，允許同時進行讀寫操作，非常適合處理快速變化的圖像數據。

**CMOS RAM：** 一種低功耗的內存，通常由電池供電。它用於存儲系統配置信息，如日期、時間和 BIOS 設置，即使在計算機關機時也能保持這些信息。

### 5.4 輸入輸出端口

輸入輸出端口是計算機與外部設備通信的橋樑，不同類型的端口適用於不同的應用場景：

**USB（通用串行匯流排）：** 最常見和最通用的連接標準，支持熱插拔、可以連接各種設備，從鍵盤鼠標到外部硬盤和打印機。USB 的速度不斷提升，從 USB 1.1 的 12 Mbps 到 USB 3.0 的 5 Gbps，再到最新的 USB 4 可達 40 Gbps。

**並行端口：** 曾經是打印機的標準接口。它可以同時傳輸多個數據位，理論上速度更快，但實際上受到電纜長度和干擾的限制，如今並行端口已經基本被 USB 取代。

**串行端口（RS-232）：** 是一種古老但仍然有用的接口。它以較低的速度一次傳輸一個位，但具有抗干擾能力強、可用電纜長的優點。雖然在消費電子中已經不常見，但在工業和科學儀器中仍然廣泛使用。

### 5.5 設備接口

除了標準的輸入輸出端口，還有一些專門的設備接口用於特定用途：

**ATA（Advanced Technology Attachment）：** 主機適配器，也稱為 IDE（集成驅動電子設備），曾經是硬盤和光盤驅動器的標準接口。它使用並行數據傳輸，但已逐漸被更快的 SATA 接口取代。

**SATA（Serial ATA）：** ATA 的後繼者，採用串行數據傳輸。它提供更高的數據傳輸速率、更長的電纜和更簡單的連接器。最新的 SATA 3.0 標準可以達到 6 Gbps 的傳輸速度。

**FireWire（IEEE 1394）：** 一種高速串行匯流排標準，特別適用於數字音視訊傳輸。雖然在某些專業領域仍有使用，但在消費市場上已經基本被 USB 取代。

**藍牙（Bluetooth）：** 一種短距離無線通信技術，主要用於移動設備和配件之間的數據傳輸。它的特點是低功耗和易於使用，適合鍵盤、耳機等小型設備。

**Wi-Fi（無線乙太網）：** 基於 IEEE 802.11 標準，是目前最流行的無線網絡技術。它允許設備在較大範圍內進行高速數據傳輸，是家庭和辦公網絡的主要連接方式。

這些不同的接口和技術共同構成了現代計算機系統的輸入輸出生態系統，使計算機能夠與各種外部設備和網絡進行高效通信。

## 6. Input-Output System

計算機的輸入輸出（I/O）系統是硬體和軟體交互的關鍵接口，它允許計算機與外部世界進行通信。I/O 操作可以在不同的抽象級別上進行，每個級別都提供不同程度的控制和複雜性：

### 6.1 高級語言函數（Level 3）

這是最高層次的 I/O 抽象，通常由高級程式語言如 C++、Java 或 Python 提供。在這個級別，工程師使用簡單的函數調用來執行 I/O 操作，如 `printf()` 或 `readline()`。這種方法的優點是簡單、可移植性強，適合大多數應用程序開發。但缺點是對底層硬體的控制較少，某些特定硬體功能可能無法直接訪問。

### 6.2 作業系統 OS（Level 2）

作業系統提供的應用程序接口（API）允許程序更直接地與系統資源交互。這包括文件 I/O、網絡通信、設備驅動程序接口等。Windows API 和 POSIX 標準就是這種級別的例子。使用作業系統 API 可以獲得更多的控制權和效能，但需要更多的程式知識，且可能降低跨平台兼容性。

### 6.3 BIOS（Level 1）

BIOS（基本輸入輸出系統）提供了更低級別的硬體訪問。BIOS 函數直接與硬體通信，執行基本的 I/O 操作，如讀寫硬碟扇區或控制顯示器。在現代作業系統中，直接使用 BIOS 並不常見，主要在系統引導過程或某些特殊的底層程序中使用。UEFI（統一可擴展固件接口）正在逐漸取代傳統 BIOS，提供更強大和靈活的低級系統接口。

### 6.4 硬體直接操作（Level 0）

這是最低級別的 I/O 操作，涉及直接操作硬體端口和暫存器。在這個級別，程序可以直接讀寫 I/O 端口，控制中斷，甚至直接訪問內存映射的 I/O 設備。這種方法提供了最大的控制權和潛在的最高性能，但也最複雜、最不可移植，且可能導致系統不穩定。

---
*註: 部分內容截自於網路，此筆記非完全原創。*  
***Latest Updated On：2024.10.28,   
published with the of LICENSE of WTFPL  
Author：Qaron（呱呱）***