簡體   English   中英

為什么 I 型立即數從 16 位擴展到 32 位?

[英]Why does the I-type immediate get extended from 16 bit to 32 bit?

我正在准備大學考試,我不明白為什么 I 類型中的直接字段從 16 位擴展到 32 位,我需要知道什么解釋,還是只是您必須知道發生的事情在不知道為什么的架構中?

也在計算分支地址時

PC <– PC + 4 + (sign_ext(Imm16) << 2)

為什么立即數會移位 2?

正如許多評論中已經回答的那樣......

盡管 MIPS 確實有 16 位指令格式,但每個人都熟悉的指令集是 32 位固定長度指令集,在對齊的邊界上。

各種操作使用 32 位操作數。

在固定為 32 位的指令集中不能有 32 位立即數; 沒有位留給操作碼。 因此,MIPS 具有不同的指令格式和不同的立即數大小,以平衡豐富的指令數組,而不會像使用立即數或強制從附近的池中加載所有立即數那樣痛苦。 在最壞的情況下,您可以依靠它,但是對於很多事情,您可以按照設計使用說明。

所以立即數字段遠小於32位,但它們所代表的操作數一般都是32位,因此需要以某種方式進行擴展,要么移位16位並在底部填充零,要么從頂部擴展無符號或不(一般而言,不僅僅是針對這種類型的 mips)來生成 32 位值。

應根據文檔中的說明查找立即數的使用方式。

為什么分支將立即數移動 2?

指令在對齊的 32 位邊界上,這意味着低 2 位始終為零。 如果您將這些零編碼到立即數中,您將始終必須將它們設為零,並且基本上會丟失 pc 相對分支的可能范圍的四倍。 在這種情況下,將立即數視為我想要分支的指令數,而不是地址的字節數。

簽名允許向前或向后分支。

nextPC <– PC + 4 + (sign_ext(Imm16) << 2)

+ 4 是管道錯覺的一部分,不同的內核有自己的管道設計,所以必須有一個標准來讓 ISA 不會瘋狂使用(在許多 ISA 中非常典型的設計選擇讓 PC 在執行時間點在下一條指令)。 所以 nextPC 是下一條指令的 PC 加上立即數中指令的有符號偏移量(通過左移兩位使低兩位為零)。 如果滿足條件或無條件(我不知道所有的 I 格式指令,我不需要為了回答這個問題)那么邏輯使用 nextPC 否則 PC + 4 用於下一條指令.

編輯

是的,你是對的; 符號擴展已經使它成為一個 32 位值。 額外的移位是最大化分支可以采用的范圍,使我們可以使用這種指令格式向前或向后四倍地進行分支。 高符號擴展位都是 0 或 1,並且擴展位超過 2 位,因此將臨時 32 位值再移動兩位不會對該值造成損害。

使用 16 位帶符號立即數,如果我不想進行兩次移位,那么 0x00007FFC 是我可以向前分支的最大距離,並且要成為有效指令,低兩位必須為零。 通過移位,我現在可以向前分支 0x1FFFC,並且可以使用所有立即數位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM