如果寄存器等于0则

时间:2016-01-24 20:37:54

标签: assembly mips

尝试为学校作业制作简单的if语句。

first-slug

据我了解。 beqz检查$ s0是否为零。从那以后它应该转到我的标签。

这是令我困惑的部分。这个标签在哪里?它是如何决定我们何时不在标签中并想要回到原始代码的?

基本上如果我的x输入为0,我希望它打印出我的“测试”字符串

1 个答案:

答案 0 :(得分:0)

汇编中的分支与子例程不同。分支到行号后,您现在处于该行号,并继续从那里增加程序计数器。所以,一旦你BEQZ到Endif:,你现在在Endif,你将打印那个字符串并运行到未初始化的内存区域。没有机制可以返回。

请考虑以下事项:

.data
IF_STRING: .asciiz "IF\n"
ELSE_STRING: .asciiz "ELSE\n"
END_STRING: .asciiz "END\n"

.text
main:
  li $s0,2
  bnez $s0,ELSE

  la $a0,IF_STRING
  li $v0,4
  syscall

  b END

ELSE:
  la $a0,ELSE_STRING
  li $v0,4
  syscall

  #b END is implicit here -- you simply fall straight through

END:
  la $a0,END_STRING
  li $v0,4
  syscall

  li $v0,10
  syscall

如果将$ s0设置为0,您将通过代码的“IF”部分 - 如果它不为零,它将跳转到代码的“ELSE”部分。没有返回,所以要进入程序的下一部分,您可以直接分支到END标签。在ELSE部分,没有必要进行分支,因为它只会分支到下一行(并浪费了大量时间)。