SPARC 彙編/控制結構
外觀
< SPARC 彙編
如果您熟悉任何高階程式語言(C、C++、Java 等),那麼您可能知道控制結構為計算機程式設計師提供了巨大的能力。控制結構允許我們的程式對要執行哪個程式碼塊以及可能執行該程式碼塊多少次做出決定。雖然有點更隱晦,但 SPARC 中的控制結構為我們提供了相同的能力。我們將在下面討論一些更常見的結構。
正如您可能從分支部分猜到的那樣,if-then 結構僅僅包含一個分支語句,該語句會跳過“if”塊中的程式碼並分支到一個標記“if”塊後要執行的程式碼開始處的標籤。例如,如果在虛擬碼中我們的目標是建立一個類似於以下內容的程式
if register %l0 is less than zero{
::then 'and' it with register %g0 and store the result in %l0
::then and add one to %l0
}
'or' the code with the base two version of 42 and store the result back in %l0
|
那麼 SPARC 版本將是
cmp %l0, 0 bge next nop and %l0, %g0, %l0 add %l0, 1, %l0 next: or %l0, 42, %l0 |
請注意,我們將 if 語句的邏輯從“如果 %l0 小於零,那麼執行此操作”更改為“如果 %l0 不大於零,那麼不要執行此操作”。這是必要的,因為我們建立控制結構的能力來自我們跳過程式碼部分的能力。所以我們告訴計算機,如果這個條件不成立,那麼跳過這裡的所有程式碼,並繼續執行下一組標記的指令。
這類似於 if-then 結構,但需要更多分支。if-else 的基本要點是執行以下操作
If some condition is true{
then preform this set of instructions
}
If the condition is false (the else part){
then execute this set of instructions
}
|
因此,如果我們想在 SPARC 中做到這一點,我們會像在 if-then 程式碼中分支到“next”標籤一樣分支到“else”部分。但是,我們還需要確保如果執行了“if”塊,那麼在“if”塊執行完後會跳過“else”塊。所以為了舉例說明,假設在前面的例子中,我們想在條件不滿足的情況下將 %l0 設定為零。程式碼如下
cmp %l0, 0 bge else nop and %l0, %g0, %l0 add %l0, 1, %l0 ba next nop else: mov 0, %l0 next: or %l0, 42, %l0 |
現在注意,當“if”條件為假時,我們現在會移動到“else”語句而不是“next”。還要注意,我們現在在 if 塊的末尾有一個“始終分支”指令,這使我們能夠在 if 塊執行後跳過“else”塊。