我在研究MIPS時對此部分感到困惑。加載32位常量以在MIPS中註冊
教授John L. Hennessy編寫的教科書說,如果我們得到了一些大不斷加載,我們應該
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是,爲什麼我們不只是做
addi $s0, $zero, big
由於寄存器32位,這更加簡單,不是嗎?
我在研究MIPS時對此部分感到困惑。加載32位常量以在MIPS中註冊
教授John L. Hennessy編寫的教科書說,如果我們得到了一些大不斷加載,我們應該
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是,爲什麼我們不只是做
addi $s0, $zero, big
由於寄存器32位,這更加簡單,不是嗎?
傳遞給addi
的直接理由是隻有16位。要加載一個16位值範圍之外的32位立即數,你需要兩次去做,就像你的教科書中的例子。由於MIPS ISA使用固定大小的32位指令,因此總有3238位可用於任何32位立即值,因此,無需立即加載或添加立即指令即可獲得32位立即值的原因(預計還有一個問題)指令參數 - 這在RISC體系結構中非常常見)。
是寄存器是32位,但是如何在32位指令中指定32位數?一條指令由操作碼和數據組成。所以,你不能在一個addi中擠壓一個操作碼+ 32位數據。
謝謝!由於固定長度,即時格式僅保留16位用於常量,其餘16位用於操作和寄存器代碼。 – lucasKoTW