I see a few potential issues.
.text #instructions start below
While it's true that the executable instructions start after .text
, it would be a good idea to define a label called main:
there. The emulators see that and know unambiguously where to start (at least, I think that's how they're configured by default.)
lui $s0, 0x1001 # $s0 holds base address of the array
addi $s1, $zero, 0 # $s1 holds the index of the array
You're making a big, implementation-dependent assumption here. It's a better idea to add a label that points to your first data item:
.data # Maybe the "data segment" starts at address 0x10010000, maybe it doesn't
myData:
.word 1
.word 2
...
Now, you can load the address of the label into $s1. The code below is actually a pseudo-opcode that will be expanded into a lui
and an addi
by the compiler.
la $s0, myData
The compiler will probably come up with the exact code that you started out with, pointing to address 0x10010000... but you're better off letting the compiler make that decision.
Finally, there's the question of why you do a jal
here:
jal increment # call loop procedure
increment:
Unless you've omitted some code for clarity, you're jump-and-linking to the next address. That doesn't make a lot of sense. You only need to use jal
when you're calling a subroutine. The subroutine will return to the line after jal
by doing a j $ra
.
Oh yeah, and there's the infinite loop that your prof wants you to use. That's just strange. What's wrong with a syscall
10?
li $v0, 10 # terminate execution
syscall