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”块。