---
# System prepended metadata

title: '組合語言共筆 4 : 系統執行程式流程 & 記憶體架構'
tags: [組合語言]

---

###### tags: `組合語言`
# 組合語言共筆 4 : 系統執行程式流程 & 記憶體架構


## 程式執行流程

將 c++ 程式編譯為可執行檔
:::success

![](https://i.imgur.com/X9A7c2h.png =500x600)

:::

<br>


###  1. Compiler : 

- 用途 : 將程式語言編譯為組合語言


### 2. Assembler : 

- 用途 : 將組合語言<font color=red>組譯</font>成機器語言 ( **Object File  目的檔** )

### 3. Linker : 

- 用途 : 將組譯後的 Object File 與外部庫 ( Library ) 的其他 Object File 
連結為一個**可執行檔(exe)**

<br>

---




## Object File
Object File 是由二進位機器語言所組成的檔案
存放著程式的資訊，且可以被 Linker 與其他 Object File 連結為可執行檔

:::danger

![](https://i.imgur.com/ptmYfGc.png =500x470)
- **Header** : 放置了 Object File 的基本資訊 ( relocation info、長度、順序... )
- **stack** : 儲存區域變數、函數
- **heap** : 用於動態記憶體配置
- **.bss** : 放置沒有 initialize 變數
- **.data** : 放置以 initialize 變數
- **.text** : 放置 程式指令碼
- **.其他** segment : 其他資料
<br>
- Symbol Table : 存放函數、變數名稱與對應的記憶體位置
使 Object File 可以進行連結、Debug
:::

<br>

## ELF ( Executable and Linkable File )

當 Linker 將 Object File 連結後會變為 Executable Object File
現在最常使用的是名為 .ELF 的格式

<br>

## Linking
Linker 會將 Object File Linking 在一起成為執行檔 ( .elf )
:::info
**Linking 步驟**

1. 將 Object File 之間相同類型的 Segment 合為單一 Segment
2. 將相同的 Symbol reference 分配到同樣位置 address 

:::

<br>

## Loading
Loader 會將可執檔載入到記憶體當中
:::info
**Loading 步驟**

1. 讀取 Object File 的 Header 了解 segment 大小
2. 創建虛擬的記憶體位置空間
3. 複製 text 和 初始化資料到記憶體
4. 設定變數、函數、引數...到 Stack
5. 初始化 cpu 的 register
6. 跳到執行開頭，執行 main()
:::

<br>

## Reference

- [深入理解連結之Object file](https://ithelp.ithome.com.tw/articles/10262798)
- [連結器-維基百科](https://zh.wikipedia.org/zh-tw/%E9%93%BE%E6%8E%A5%E5%99%A8)
- [目的碼-維基百科](https://zh.wikipedia.org/zh-tw/%E7%9B%AE%E6%A0%87%E4%BB%A3%E7%A0%81)
- [gcc與Obj檔，動態連結與ELF檔](http://www.study-area.org/cyril/opentools/opentools/x909.html)
- [CS:APP Ch7 Linking 學習筆記](https://haogroot.com/2020/06/15/csapp-ch7-linking-note/)