2017-10-08 6 views
1

Ich versuche, die MIPS-Assemblersprache für meine CS-Klasse zu lernen. Ich kämpfe syntaktisch mit dem Versuch, dieses Programm zu schreiben. Ich habe mir das andere Beispiel angesehen, das mein Professor uns gegeben hat, und ich habe es genau verfolgt. Ich erhalte einen Fehler bei meinem Zweig, der nicht gleich ist. Der Code ist wie folgt.MIPS bne Parser Syntaxfehler

# 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 

Ich weiß, dass dieser Code jetzt nicht richtig funktioniert. Ich bitte jedoch nicht um Hilfe bei der Programmierung dieser Funktion, ich möchte sie einfach ausführen können, damit ich sehen kann, was vor sich geht. Bevor ich die Datei sogar laden kann, erhalte ich einen Syntaxfehler in der folgenden Zeile.

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

Der Fehler lautet wie folgt.

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

Jede und alle Hilfe würde sehr geschätzt werden mit diesem! Ich danke dir sehr!

+0

sein, die ich gerade getestet habe Ich bekomme immer noch denselben Fehler wie zuvor. –

Antwort

0

bne wird auf ein Etikett verzweigen, die durch das dritte Argument angegeben wird, wenn das erste Argument nicht gleich dem zweiten Argument ist, in Ihrem Fall, können Sie es sagen verzweigen, wenn $a0 nicht gleich $0 ist, aber Sie sind Gibt es nicht die Bezeichnung zu springen, das letzte Argument zu bne ist ein Label definiert überall in der Quelldatei, was Sie haben, ist bne $t0, $0, 1, was ist 1? 1 ist kein gültiger Label-Name, Labels dürfen nur Buchstaben, Zahlen und Unterstriche enthalten, sie müssen mit einem Buchstaben beginnen, und sie dürfen keine der speziellen Anweisungen in der MIPS-Anweisung

+0

Ich weiß, dass ich ein Label verwenden kann, um bne zu sagen, dass ich springen soll, aber ich hatte den Eindruck, dass ich dieses letzte Argument auch als Verschiebung von Zeilen verwenden könnte. Da in MIPS die aktuelle Zeile gelesen wird, befindet sich der PC bereits in der nächsten Zeile und danach möchte ich noch einen weiteren Platz eingeben. Funktioniert das nicht? Lassen Sie mich wissen, ob dies tatsächlich möglich ist. –

+0

Sie sind richtig, aber das letzte Argument ist versetzt von 'PC + 4', das ist der Befehl direkt unter Ihrem' bne', das letzte Argument ist ** nicht ** relativ in Bezug auf die Byte-Adresse des 'bne', Wenn in diesem Fall "bne" wahr ist, wird diese Zeile "addi $ t0, $ 0,1" ausgeführt. Außerdem ist MIPS manchmal seltsam, ich habe einen Fehler bekommen, als ich versucht habe, 'sw $ t0, 0 ($ ra)' zu machen, aber es funktionierte, als ich zu 'move $ ra, $ t0' wechselte. Versuchen Sie also, die '1' in Ihrer' bne' auf ein Label zu ändern und sehen Sie, ob es funktioniert – Dummy

+0

Okay, ursprünglich wollte ich diese Zeile ausführen. Ich habe jedoch angefangen, es anders zu implementieren, und jetzt, da ich die Etiketten verwende, funktioniert es wie ein Zauber. Ich bin mir immer noch nicht ganz sicher warum, aber zumindest funktioniert es. Danke für deine Hilfe! –