---
# System prepended metadata

title: 計算機組織 - 戴碧如

---

# 計算機組織 - 戴碧如
> **維護者：呂思遠**


## 課程資訊
> 考試以課堂簡報為主

> **分數**
> Quizzes 30%
> Exams 70%


## Chapter 1

### 1.1 導論 (Introduction)
- **摩爾定律（Moore’s Law）**：IC（Integrated Circuit）上的電晶體數量每兩年（約18個月）翻倍，驅動計算技術進步。
- Classes of Computers：
    - 個人電腦（PC）：通用用途，具成本效能權衡
    - 伺服器（Server）：提供網路服務，高容量、高效能、高可靠性
    - 超級電腦（Supercomputer）：用於科學計算與工程模擬，市場占比小但效能最高。
    - 嵌入式系統（Embedded Computers）：內建於其他系統，受限於功耗、成本與效能需求。
- The Post-PC Era（後 PC 時代）
    - 個人行動裝置（PMD, Personal Mobile Device）
      - 智慧型手機、平板電腦、智慧眼鏡
      - 電池供電，具備網路連接能力
    - 雲端運算（Cloud Computing）
      - 倉儲級計算機（Warehouse-Scale Computers, WSC）
      - SaaS（Software as a Service）
---

### 1.2 電腦架構的七大核心概念 (Seven Great Ideas in Computer Architecture)
* 抽象化（Abstraction）
* 讓常見情境變快（Make the common case fast）
* 透過並行提升效能（Performance via parallelism）
* 透過管線化提高效能（Performance via pipelining）
* 透過預測提高效能（Performance via prediction）
* 記憶體階層設計（Hierarchy of memories）
* 透過冗餘提升可靠性（Dependability via redundancy）
---

### 1.3 程式底層運作 (Below Your Program)
- Application Software：以高階語言（High-Level Language, HLL）撰寫。
- System Software：
    - Compiler：將HLL轉換為機器碼（Machine Code）。
    - Operating System (OS)：管理I/O、記憶體、排程與資源共享。
- Hardware：
    - Processor、Memory、I/O Controllers。
---

### 1.4 電腦的內部組成 (Under the Covers)
- Instruction Set Architecture (ISA)：硬體與軟體的介面。
- Application Binary Interface (ABI)：ISA與系統軟體的接口。
- Implementation：ISA之下的硬體設計細節。
---

### 1.5 Performance (效能衡量)
- Response Time（Execution Time）：執行任務所需時間。

- Throughput（Bandwidth）：單位時間內處理的工作數量。
影響因素：

    - Algorithm：決定執行的運算數量。
    - Programming Language, Compiler, Architecture：決定每個運算所需的機器指令數量。
    - Processor and Memory System：影響指令執行速度。
    - I/O System (including OS)：影響I/O操作速度。
    - Performance 計算方式：
    
- Performance 計算方式：
$$Performance = \frac{1}{\text{Execution Time}}$$ 若程式在 $A$ 電腦執行 $10$ 秒，在 $B$ 電腦執行 $15$ 秒，則：
$$
\text{Performance}_A= \frac{\text{ExecutionTime}_B}{\text{ExecutionTime}_A} = \frac{15}{10} = 1.5
$$ 表示 $A$ 比 $B$ 快 $1.5$ 倍。
---

### 1.6 CPU 時脈機制 (CPU Clocking)
- Clock Cycle（時脈週期）：數位硬體運作以固定時脈為基準。
- Clock Frequency（時脈頻率）：
    - $\text{Clock Period} = 250 \text{ ps} = 0.25 \text{ ns} = 250 \times 10^{-12} \text{ s}$
    - $\text{Clock Frequency} = 4.0 \text{ GHz} = 4000\text{ MHz} = 4.0\times10^{9}\text{ Hz}$
- CPU Time 計算方式：
$$\text{CPU Time}= \text{CPU Clock Cycles}\times\text{Clock Cycle Time} = \frac{\text{Clock Cycles}}{\text{Clock Rate}}$$
---

### 1.7 指令數與每指令週期數 (Instruction Count and CPI)
- Instruction Count（IC）：執行程式所需的指令數量，由程式、ISA 和 Compiler 決定。
- Cycles Per Instruction (CPI)：指令的平均週期數，由 CPU 硬體決定。
- CPI 計算方式：
$$\text{CPU Time}=\text{Instruction Count}\times\text{CPI}\times\frac{1}{\text{Clock Rate}}$$
---

### 1.8 CPI Example (CPI 計算範例)
- 若兩台電腦執行相同 ISA，且：
    - $\text{Computer A：Cycle Teme} =250 \text{ ps，CPI} = 2.0$
    - $\text{Computer B：Cycle Teme} =500 \text{ ps，CPI} = 1.2$
    - 計算CPU時間：
    $$\text{CPU Time}_A=\text{IC}\times2.0\times250\text{ ps} = \text{I}\times\text{500 ps}$$
    $$\text{CPU Time}_B=\text{IC}\times1.2\times500\text{ ps} = \text{I}\times\text{600 ps}$$
   $$\frac{\text{CPU Time}_B}{\text{CPU Time}_A} = \frac{\text{I}\times 600\text{ ps}}{\text{I}\times 500\text{ ps}} = 1.2$$
---

### 1.9 CPI in More Detail(多個CPI)
- 當不同類型的指令需要不同的時鐘週期（Clock Cycles）時，總時鐘週期可表示為：
$$\text{Clock Cycles}=\sum_{i=1}^{n}(\text{CPI}_i\times\text{Instruction Count}_i)$$
- Weighted average CPI
$$\text{CPI} = \frac{\text{Clock Cycles}}{\text{Instruction Count}}
  = \sum_{i=1}^{n} \left( \text{CPI}_i \times \frac{\text{Instruction Count}_i}{\text{Instruction Count}} \right)$$
  
- **CPI Example**
    - **不同的編譯方式可能導致不同的指令序列**
    - 以 **A、B、C 三類指令** 為例：
    
    | **Class**  | **A** | **B** | **C** |
    |------------|------|------|------|
    | **CPI for class** | 1 | 2 | 3 |
    | **IC in sequence 1** | 2 | 1 | 2 |
    | **IC in sequence 2** | 4 | 1 | 1 | 
    
    **Sequence 1 計算：** **Instruction Count (IC) = 5**
    - **Clock Cycles 計算**：
    $1 \times 2 + 2 \times 1 + 3 \times 2 = 10$
    - **平均 CPI**： $10/5 = 2.0$

    **Sequence 2 計算：** **Instruction Count (IC) = 6**
    - **Clock Cycles 計算**：
    $1 \times 4 + 2 \times 1 + 3 \times 1 = 9$
    - **平均 CPI**： $9/6 = 1.5$

---
### 1.10 Pitfall: Amdahl's Law
- 公式
$$ \text{T}_{\text{improved}} = \frac{\text{T}_{\text{affected}}}{\text{improvement factor}} + \text{T}_{\text{unaffected}} $$

- $\text{T}_{\text{affected}} + \text{T}_{\text{unaffected}} = 100\%$
---

### 1.11 Performance Summary (效能總結)
- Performance 受以下因素影響：
    - Algorithm：影響 Instruction Count (IC) 和 CPI。
    - Programming Language & Compiler：影響 IC 和 CPI。
    - Instruction Set Architecture (ISA)：影響 IC、CPI 和 Clock Cycle Time。
    $$\text{CPU Time = Instruction Count}\times\text{CPI}\times\text{Clock Cycle Time}$$

---
## Chapter 2

### [✨組合語言指令大禮包✨](https://hackmd.io/@Left-owo/HkhghCr3yg)
---

### 2.1 指令集（Instruction Set）
- 電腦能執行的所有「基本操作」的集合。
- 不同電腦架構有不同的指令集，但邏輯架構相似。
- MIPS 是本章範例架構，屬於簡潔的 RISC 架構，指令格式統一。
---

### 2.2 運算指令（Arithmetic Operations）
- 格式範例：`add $s0, $s1, $s2`(`$s0 = $s1 + $s2`)
- 三個暫存器為運算基礎：兩個來源、一個目的。

Example：
```
C code：f = (g + h) - (i + j)
$s0	f
$s1	g
$s2	h
$s3	i
$s4	j

MIPS：
add $t0, $s1, $s2   # $t0 = g + h
add $t1, $s3, $s4   # $t1 = i + j
sub $s0, $t0, $t1   # $s0 = $t0 - $t1
即 f = (g + h) - (i + j) 
```
---

### 2.3記憶體操作（Memory Operands）
- MIPS 使用 load/store 架構
    - `lw`：從記憶體載入 → 暫存器
    - `sw`：從暫存器存回 → 記憶體
- 記憶體是以 位元組（byte）為單位編址，32-bit 稱 word（4 位元組）。
- Big Endian：高位元組存在低位址
- 在 MIPS 架構中，MIPS 採用 Load/Store 架構，不允許直接對記憶體資料做運算。

Example：
```
c code：A[12] = h + A[8]
$s2	h（來源之一）
$s3	A（陣列基底位址）
$t0	暫存計算結果

MIPS：
lw  $t0, 32($s3)    # $t0 = A[8]
add $t0, $s2, $t0   # $t0 = h + A[8]
sw  $t0, 48($s3)    # A[12] = $t0，12 × 4 = 48

位移量計算方式：MIPS 的 word 是 4 bytes，因此 A[n] 的實際偏移量為 n × 4。
```
---

### 2.4即時值（Immediate Operands）
- 指令中可以直接給常數：
`addi $s2, $s1, 1（$s2 = $s1 + 1）`
- 常數避免再去記憶體抓資料，效率更高。
- 減法運算: `addi $s2, $s1, -1`
- 零(constant zero)：$zero
---

### 2.5整數表示（Integer Representations）
* 無號整數（unsigned）：0 ~ 2ⁿ - 1
* 有號整數（2’s Complement）：-2ⁿ⁻¹ ~ 2ⁿ⁻¹ - 1
* 負數表示法：補數＋1
* 擴位（Sign Extension）：延伸時保留正負號
---

### 2.6指令格式（Instruction Formats）
* 所有指令用 32位元二進位 表示。
* 常見格式：
    * R-type：register-register（e.g., add, sub）
    * I-type：immediate / memory（e.g., addi, lw, sw）
* op (6 bits)、rs、rt、rd、shamt、funct、immediate … 等欄位固定長度。

Example：
```
op      rs    rt    rd   shamt  func
000000 10001 10010 01000 00000 100000
R-type  17    18    8      0    add

add $t0, $s1, $s2
```
---

### 2.7邏輯運算（Logical Operations）
* 位元操作：AND、OR、NOR、NOT、SHIFT
* sll(shift left logical) 可達到 x2 效果（僅限 unsigned）
* srl(shift right logical) 可達到 ÷2 效果（僅限 unsigned）
---
### 2.8條件與跳躍（Conditional & Branching）
* beq, bne：根據條件跳轉
* j L1：無條件跳轉
* slt, slti：比較小於 → 設為 1 or 0
* 使用組合語法模擬 if, while 等高階語法

Example:
```
C code:
if (a == b) {
    x = 1;
} else {
    x = 2;
}

MIPS：
    beq  $s0, $s1, L1   # 如果 a == b，跳轉到 L1
    li   $t0, 2         # x = 2
    j    L2             # 跳過 L1
L1:
    li   $t0, 1         # x = 1
L2:
```
---

### 2.9 程序呼叫（Procedure Calling）
* 使用：
* $a0-$a3：參數（最多 4 個）
* $v0-$v1：回傳值（最多 2 個）
* $ra：返回位址
* jal 跳到副程式，jr $ra 回主程式。
* 使用堆疊（stack）保存暫存器值，防止資料遺失。

Example：
```
C code:
int add(int x, int y) {
    return x + y;
}

int main() {
    int a = 5, b = 7;
    int result = add(a, b);
}

MIPS：
    li  $a0, 5       # 參數 a = 5
    li  $a1, 7       # 參數 b = 7
    jal add_function # 跳到副程式
    move $t0, $v0    # 把回傳值存入 $t0（result）
    # 主程式繼續執行...
add_function:
    add $v0, $a0, $a1  # v0 = a0 + a1
    jr  $ra            # 返回主程式
```
---

### 2.10 字元與字串操作（Character & String）
* 字元使用 ASCII 編碼。
* 支援 lb, lbu, lh, lhu, sb, sh 操作 byte 與 halfword。
* 以 null-terminated 字串為主（\0 表結尾）
---

### 2.11 Byte/Halfword Operation
| 指令  | 資料大小 | 操作類型     | 是否符號延伸       | 說明                                      |
|-------|-----------|--------------|----------------------|-------------------------------------------|
| `lb`  | 8 位元     | 載入（load） | 是（sign-extend）     | 將 byte 視為帶符號整數，延伸成 32-bit     |
| `lbu` | 8 位元     | 載入（load） | 否（zero-extend）    | 將 byte 視為無號整數，補 0 成 32-bit      |
| `lh`  | 16 位元    | 載入（load） | 是（sign-extend）     | 將 halfword 視為帶符號整數，延伸成 32-bit |
| `lhu` | 16 位元    | 載入（load） | 否（zero-extend）    | 將 halfword 視為無號整數，補 0 成 32-bit  |
| `sb`  | 8 位元     | 儲存（store）| 無                   | 僅將暫存器的最低 8 位元儲存到記憶體       |
| `sh`  | 16 位元    | 儲存（store）| 無                   | 僅將暫存器的最低 16 位元儲存到記憶體      |


---