SPARC 彙編/SPARC 細節
外觀
< SPARC 彙編
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,我們將浪費大量的處理器週期。因此,如果可以,始終最好嘗試將額外的指令擠入延遲槽,這樣我們就不會浪費任何處理器週期。