# MIPS Addressing
## MIPS Addressing Mode
MIPS addressing 指的是MIPS用來指定address 的方法。
* Immediate Addressing Mode
* operand 直接包含在指令中
* 例如 `addi $t0, $t1`, 5,其中 5 是一個Immediate
* Register Addressing Mode
* operand 存儲在 register 中,指令使用 register 的名稱
* 例如 `add $t0, $t1, $t2`。
* Base or Displacement Addressing Mode
* 透過一個 Base 加上一個 offset 的方式來定位記憶體位置
* 例如 `lw $t0, 100($t1)`,其中 $t1 是基址,100 是 offset 。
* PC-relative Addressing Mode
* Address 是相對於program counter(PC)的相對位置,用於支持 branch 指令
* 例如 `beq $t0, $t1, Label`,其中 Label 是相對於當前指令的標籤。
* Pseudodirect Addressing Mode
* 用於跳躍指令(j 和 jal),其中目標 address 由指令本身的高位和程序計數器(PC)的高位拼接而成。
* 例如:`j Label`(跳轉到Label)。
## Branch Addressing

* 在 MIPS 指令集中,使用 I-format 進行 branch ,`opcode` 指定是 `beq`或者是 `bne`。
* `rs` 和 `rt` 分別指定要比較的兩個 register。
* `immediate` 是16位立即數,它指定了 branch 目標的 relative address 。
* 由於 `immediate` 只有16位,而 PC 是32位,因此無法完整指定整個 address,所以使用PC-relative Addressing。
* 將 `immediate` 視為有符號的二進制整數,並在 branch 被採取時加到 PC。
* 在 MIPS 中,一條指令是 4 bytes = 32 bits ,即每個指令的 address 都是4的倍數。
* 如果 branch 被採取,則 PC = (PC + 4) + (`immediate` * 4);如果 branch 未被採取,則 PC = PC + 4。
```
Loop: beq $9, $0, End
add $8, $8, $10
addi $9, $9, -1
j Loop
End:
```
* opcode = 4
* rs = 9
* rt = 0
* immediate = 3
二進制表示為:000100 01001 00000 0000000000000011,
* 其中前六位是 opcode,
* 接著的五位是 rs
* 接著的五位是 rt
* 最後的16位是 immediate。
# Translation and Startup
以下是C code 的創建和執行過程中涉及的步驟

## Pseudoinstructions
在assembly language 中,有時會使用Pseudoinstructions(偽指令)
Pseudoinstructions 用於提高程式碼的可讀性和簡化編寫,但實際上它們會被轉換成對應的機器碼指令。
以下是一些 MIPS assembly language 中常見的Pseudoinstructions例子:
* `move $t0, $t1`: 它的作用是將register $t1 的值複製到 $t0。
* 在實際的機器碼中,這通常被轉換成 `add $t0, $zero, $t1`
* `blt $t0, $t1, L`: 它的作用是當 $t0 < $t1 時跳轉到標記 L。
* 在實際的機器碼中,這通常被轉換成 `slt $at, $t0, $t1` 和 `bne $at, $zero, L`。
* `$at` 是一個temporary register。
## Producing an Object Module
以下是生成目標模塊(Object Module)的過程
* Header:
* 包含有關 Module 內容的描述性信息。
* Text Segment:
* 包含被轉譯為機器指令的程序代碼。
* Static Data Segment:
* 包含程序運行期間分配的靜態數據。
* Relocation Info:
* 包含相對於加載程序的 absolute location(絕對位置) 而言需要進行重定位的內容信息。
* Symbol Table:
* 包含程序中使用的全局符號的定義和外部引用。
* Debug Info:
* 包含用於將 Object Module 與 source code關聯起來的信息。
## Linking Object Modules
以下是連接目標模塊的過程
* Merges segments:
* 連接過程將不同目標模塊中的段(例如Text Segment、Static Data Segment等)合併為單個可執行映像。
* Resolve labels:
* 連接器需要確定程序中的標籤(labels)的具體地址。
* Patch location-dependent and external refs:
* 在連接過程中,需要對那些依賴於特定位置的內容以及外部引用進行修補。
在傳統的系統中,一些程序部分可能包含對特定位置的依賴,這些依賴需要在載入時進行修復。這種修復的工作通常由可重定位載入器負責,它能夠動態地調整程序的地址,使其適應實際的 memory 配置。
但在在擁有virtutal memory的現代計算環境中,程序不再需要對實際的physical memory地址進行嚴格的依賴。
virtutal memory允許 OS 將程序的各個部分映射到虛擬地址空間中,而不受實際physical memory的約束。提供了更大的靈活性和可移植性,因為程序可以在不同的計算環境中運行而無需進行大規模修改。