2017-10-08 94 views
1

我想了解我的CS类的MIPS汇编语言。我正努力在语法上试图编写这个程序。我看了我的教授给我们的另一个例子,我紧紧跟随它。我在我的分支上遇到了一个不对等的错误。代码如下。MIPS的解析器语法错误

# Main program that will call subroutine fib to calculate the fibonacci and 
# print the result 
.text 
.globl main 
sub $sp,$sp,4 
sw $ra,0($sp) 

li $a0,3 
jal fib 
la $a0,str 
syscall 

sw $a0,0($v0) 
syscall 

lw $ra,0($sp) 
add $sp,$sp,4 
jr $ra 

.data 
str: 
    .asciiz "fib = " 

.text 
fib: 

sw $a1,0($a0) 
bne $a0,$0,1 # Branch if the argument is not equal to zero 
add $v0,$0   # If it is equal to 0,add 0 to the return value. 
addi $t0,$0,1 # Create temporary equal to 1. 
bne $a0,$t0,1  # Branch if argument is not equal to 1. 
addi $v0,1    # If it is,add one to the return value. 
addi $sp,$sp,-4  # Create space on the stack for the return value. 
sw $ra,0($sp)   # Save old return address to the stack 
addi $a0,-1 
jal fib    #jump to fib and save address 
addi $a0,$a1,-2  #subtract 2 from the starting number. 
jal fib 
lw $ra,0($sp) 
add $sp,$sp,4 
jr $ra 

我知道这段代码现在不能正常工作。但是,我不是要求编程这个功能的帮助,我只是希望能够运行它,以便我可以看到发生了什么。在我甚至可以加载文件之前,我在下面一行中收到语法错误。

bne $a0,$0,1 # Branch if the argument is not equal to zero 

错误内容如下。

spim: (parser) syntax error on line 35 of file ... 
    bne $a0,$0,1 #Branch if the argument is not equal to zero 
     ^

任何和所有的帮助将不胜感激!非常感谢!

+0

我刚刚测试过这个,我仍然得到和以前一样的错误。 –

回答

0

bne将转移到由第三个参数指定一个标签,当第一个参数不等于第二个参数,你的情况,你告诉它的分支如果$a0不等于$0,但你没有给它的标签跳转,最后一个参数bne是一个标签定义任何地方在源文件中,你有什么是bne $t0, $0, 1,什么是1?另外,1不是有效的标签名称,标签只能包含字母,数字和下划线,它们必须以字母开头,并且它们不能是MIPS指令集中的任何特殊指令。

+0

我知道我可以使用标签来告诉我要跳到哪里,但我的印象是,我也可以使用最后一个参数作为线条的位移。由于在读完当前行之后,在MIPS中,PC已经在下一行,然后我想在此之后多走一个空格。这不行吗?让我知道这是否有可能。 –

+0

你是对的,但是最后一个参数偏离了你的'bne'之下的'PC + 4',最后一个参数是** not **相对于'bne'的字节地址,所以在这种情况下,如果'bne'为true,这行'addi $ t0,$ 0,1'将被执行。另外,MIPS有时候很奇怪,当我试图执行'sw $ t0,0($ ra)'的时候出错了,但是当我改变为'move $ ra,$ t0'时它就起作用了。因此,请尝试将'bne'中的'1'更改为标签并查看它是否有效 – Dummy

+0

好吧,原本我想让该行执行。但是,我开始以不同的方式实施它,现在我正在使用它起作用的标签,像一个魅力。我仍然不确定为什么,但至少它是有效的。感谢你的帮助! –