尝试为学校作业制作简单的if语句。
first-slug
据我了解。 beqz检查$ s0是否为零。从那以后它应该转到我的标签。
这是令我困惑的部分。这个标签在哪里?它是如何决定我们何时不在标签中并想要回到原始代码的?
基本上如果我的x输入为0,我希望它打印出我的“测试”字符串
答案 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部分,没有必要进行分支,因为它只会分支到下一行(并浪费了大量时间)。