跳轉到內容

SPARC 彙編/SPARC 細節

來自華夏公益教科書,開放的書籍,開放的世界

RISC 計算機

[編輯 | 編輯原始碼]

暫存器

[編輯 | 編輯原始碼]

SPARC 處理器有 32 個整數暫存器。這些暫存器被分成 4 個基本類別:全域性區域性輸入輸出。下表顯示了總體細分

編號 目的 特定名稱
%r0–%r7 全域性:可在程式中的任何位置訪問 %g0–%g7
%r8–%r15 輸出:用於向子程式傳遞值/從子程式獲取值 %o0–%o7
%r16–%r23 區域性:在子程式中用於操作資料 %l0–%l7
%r24–%r31 輸入:包含傳遞給子程式的資料 %i0–%i7

在這些類別中分散著幾個特殊用途暫存器

名稱 編號 目的 假名
堆疊指標 14 指向堆疊頭的指標。 %sp/ %o6
幀指標 30 指向當前堆疊幀的指標。 %fp/ %i6
返回地址 31 子程式的返回地址。 %i7
被呼叫返回地址 15 被呼叫子程式的返回地址。 %o7

從上表可以看出,每個暫存器至少有兩個名稱,其中一些特殊用途暫存器有三個名稱。對於給定暫存器,任何可用的名稱在任何使用上下文中都是完全可以接受的,由程式設計師決定在任何特定時間使用哪些名稱。此外,不建議以與預期目的不同的方式使用堆疊和幀指標暫存器,這會導致程式中的嚴重功能問題。

SPARC 處理器還包含一組浮點暫存器和少量特殊用途暫存器。(此處需要進一步說明)

取指和執行指令週期

[編輯 | 編輯原始碼]

延遲分支

[編輯 | 編輯原始碼]

SPARC 處理器是流水線的,分支是透過一種稱為延遲分支執行的技術實現的。控制轉移指令(CTI)是任何更改當前程式計數器的指令。例如,jmp 或 call 指令是 CTI 指令。

在 SPARC 中,當執行 CTI 指令時,跳轉不會立即處理。相反,在執行分支之前會延遲一個週期。這意味著跳轉指令後的第一條指令實際上是在分支發生之前處理的。以下是一個例子

add %r3, %r2, %r5
jmp SetR5ToZero
add %r4, %r5, %r2

請注意,最後一條指令是在跳轉發生之前執行的,而不是在子程式返回之後執行的。跳轉後的第一條指令稱為延遲槽。通常的做法是在延遲槽中填充一個不執行任何任務的特殊操作,稱為無操作,或nop

指令
nop

此指令不執行任何操作,因此我們不必擔心它執行的順序。但是,如果我們在每個分支指令之後都放置一個 nop,我們將浪費大量的處理器週期。因此,如果可以,始終最好嘗試將額外的指令擠入延遲槽,這樣我們就不會浪費任何處理器週期。

華夏公益教科書