qt spim syntax parser error MIPS
I have run the code below on QT SPIM and got this error: spim: (parser) syntax error on line 4 of file /Users/emily/Documents/p2.s .word this is the code in MIPS and it compiled and was able to run it on Mars. I am not sure why it is doing this in QT SPIM simulator and it has to work on the QT SPIM simulator. It is supposed to recursively do fast modular exponentiation. I have tried reinitializing and loading it and I am pretty sure that this is how you would properly declare the data types.
.data x: .word k: .word n: word result: .word 1 temp: .word zero: .word 0 #for the if statement Prompt1 : .asciiz "Enter the first integer x: " Prompt2: .asciiz "Enter the second integer k: " Prompt3: .asciiz "Enter the third integer n: " Prompt4 .asciiz "The result of x^k mod n = %d/n " # the rest of it will be after this .main li, $v0, 4 la, $a0, Prompt1 syscall # Tell the syscall that you want to read in integer li $v0, 5 # make the syscall syscall sw, $v0, x li, $v0, 4 la, $a0, Prompt2 syscall li $v0, 5 syscall sw $v0, k li $v0, 4 la $a0, Prompt3 syscall li $v0, 5 syscall sw $v0, n lw $a0, x lw $a1, k lw $a2, n jal fme move $t0, $v0 #Value is now saved in $t0. #prints the prompt li $v0, 4 la $a0, Prompt4 syscall #prints the int li $v0,1 la $a0,$t0 syscall #TODO: print the prompt and then the result (in $v0) fme: # Move the stack pointer by 1 word addi $sp, $sp, -32 # Store the return address sw $ra, ($sp) sw $s0, 4($sp) sw $s1, 8($sp) sw $s2, 12($sp) sw $s3, 16($sp) sw $s4, 20($sp) sw $s5, 24($sp) sw $s6, 28($sp) move $s0, $a0 # x move $s1, $a2 # k move $s2, $a3 # n lw $s3, result # result in v0 lw $s4, $zero # temp # if! k > 0; skip if block ble $s1, 0, toReturn # if block # set temp = fme(x, k/2, n); # k = k/2 div $a1, $a1, 2 # call fme jal fme # set temp = fme move $s4, $s3 # if k%2 == 1 # calculating k%2 by anding with 1 addi $s5, $s1, 1 bneq $s5, 1, skip # result = x%n div $s0, $s2 # move x%n into result mfhi $s3 skip: #result = (result * temp * temp) % n; # calculate temp*temp mul $ss6, $ss4, $ss4 # result*temp*temp mul $s6, $s3, $s6 # (result*temp*temp)%n div $t6, $s2 # result = (result*temp*temp)%n mfhi $s3 toReturn: move $v0, $s3 # Retore the ra from stack lw $ra, ($sp) lw $s0, 4($sp) lw $s1, 8($sp) lw $s2, 12($sp) lw $s3, 16($sp) lw $s4, 20($sp) lw $s5, 24($sp) lw $s6, 28($sp) addi $sp, $sp, 32 # return result jr $ra
You can't just say
.wordwithout specifying an initial value.
.spacedirective that reserves N bytes of space without you having to specify a value, e.g.
.space 4to reserve 4 bytes of space. But that will implicitly inititialize those bytes with the value 0, so you could've just said
.word 0instead and it would've been one less character to type.
Also, you've placed your code in the
.datasection which you shouldn't do, and you've failed to make your
So right before your
mainlabel you should add:
.text .globl main