Chapter 2 Instruction
2.1 Instruction 設計哲學
- 簡單明瞭有助於一致性 (Simplicity favors regularity)
- Arithmetic Operations:add a,b,c #a <- b + c,所有的算術算子都是這個規格。
- 小就是快 (Smaller is faster)
- Register Operands:arithmetic operations拿register operands來操作,因為register小所以快,MIPS擁有32 × 32-bit register file,也就是8*8 byte register,32bit又稱做一個word,$t0~$t9是暫存用,$s0~$s9是儲存用。
- Memory Operands:但有時也需要使用較大的空間,因此有memory operands,需要load和store因此較慢,compiler會盡量使用register operands。以下是一些memory operands的特性:
- byte addressed:每1個位址代表1個byte (8 bit)
- Alignment:為了加快執行速度,在讀 memory的時候會以一個 word 為單位,因此 data 在儲存時,memory offset 便會是 word size 倍數,藉此增加效能。
- Big Endian and Small Endian:MIPS在一個word內的存放順序是Big Endian,most-significant byte在位址數目最小的位子
- ex:0x12345678 (word內的順序)
- 1. little indian:78 56 34 12
- 2. big indian:12 34 56 78
- 讓常出現的部分加快 (Make the common case fast)
- Immediate Operands:因為小的常數操作常出現,因此有immediate operands避免掉一個load,例如addi $s3,$s3, 4。
- The Zero Constants:MIPS register 0 ($zero) 裡面只裝常數「0」,不能被覆寫,常用來移動值,例如 add $t2, $s1, $zero。
- 好的設計需要好的折衷辦法 (Good design demands good compromises)
- R-format、I-format、J-format:根據需求有不同的format,但都是32bit且各個format盡量相似,以下是各種format。
2.2 MIPS Quick Look
- 重要暫存器一覽
- 指令格式一覽
- 重要的指令碼一覽
- add : op =0 ,funct=32
- sub : op =0 ,funct=34
- lw : op =35 #讀檔
- sw : op =43 #存檔
- beq : op =4 #比較是否相等
- bne : op =5 #比較是否不相等
- sll : op =0 ,funct=0 #左移
- slt : op =0 ,funct=42 #比較大小
- addi: op= 8 #加法(立即值用)
- j : op= 2
- 重要範例程式:procedure call以階乘為例,對照著activation record練習
- 進入procedure:下一行指令的位址放入$ra並跳到目標位址
- 離開procedure:把$ra裡的位址取出回到母函式
- Addressing and Memory Accesses
- Jump指令 (Pseudo-direct addressing)
- 有限的32位指令長度對於大型程序的分支跳轉支持確實是個難題。MIPS指令中最小的操作碼域占6位,剩下的26位用於跳轉目標的編址。由於所有指令在記憶體中都是4 word對齊的,因此最低的2個地址位是無需存儲的,這样可供尋址範圍为2^(26+2)=256 MB。分支跳轉地址被當做一個256 MB的段內絕對地址,而非PC相對尋址。這對於地址範圍超過256 MB的跳轉程序而言是無能为力的,所幸目前很少遇到這麼大的遠程跳轉需求。
- Branches out of segment
- 段外分支跳轉可以使用暫存器跳轉指令實現,它可以跳轉到任一32位地址。
- Conditional branches
- 條件分支跳轉指令opcode的後16位branch offset是相對PC的有號偏移量,由於指令是4 word對齊的,因此可支持的跳轉範圍實際上是2^(16+2)=256KB(相對PC的-128 KB~+128 KB)。如果確定跳轉目標地址在分支指令前後的128KB範圍內,編譯器就可以編碼只生成一條簡單的條件分支指令。
沒有留言:
張貼留言