# 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 ![image](https://hackmd.io/_uploads/Skx0Ygbqp.png) * 在 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 的創建和執行過程中涉及的步驟 ![螢幕擷取畫面 2024-01-26 173841](https://hackmd.io/_uploads/SJLKuZWqp.png) ## 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的約束。提供了更大的靈活性和可移植性,因為程序可以在不同的計算環境中運行而無需進行大規模修改。