Captain Hook
Captain Hook

Reputation: 81

Using Nested For Loops and an Array in MIPS

This is a homework assignment, I've written the whole program myself, run through it in the debugger, and everything plays out the way I mean it to EXCEPT for this line:

sw $t1, counter($a3)

The assignment is to convert this snippet of C code to MIPS

    for(i = 0; i < a; i++) {
       for(j = 0; j < b; j++) {
          C[2 * i] = i – j; } }

All the registers change values the way they should in my program except for $a3 - It never changes.

Changes: An array needed to be declared and "pointed to" by a register and a label can't be used for an offset in the manner I started with

EDIT: Here's the finished, working code

Finished

Upvotes: 2

Views: 24923

Answers (1)

ElderBug
ElderBug

Reputation: 6145

Recap answer from the comments

Your $a3 register, is supposed to be loaded with the address of an array defined in the .data section.

One big problem with your code is how you constructed your loops. The best way is to translate your loops step by step, and one loop at a time. Also, remember that :

for( i = 0; i < a; i++ )
{
    loop_content;
}

Is equivalent to :

i = 0;
while( i < a )
{
    loop_content;
    i++;
}

Which is easier to translate in assembly. The condition just have to be negated, has you need an "exit" condition, and not a "continue" condition as in a while loop. Your code will be much clearer and easier to understand (and less error prone).

Your "out of range" error comes from here : sw $t1, counter($a3). Here counter is a label, and therefore an address. Thus counter($a3) is doing "$a3 (=0x10010008) + address of counter (=0x100100f8)", giving 0x20020100, which is clearly not what you want (and non-sense).

Oh, and in the sw $r, offset($a) MIPS instruction, offset MUST be a 16-bit CONSTANT. Here, you use a 32-bit address, but it's just that the assembler kindly translate sw $t1, counter($a3) to $x = $a3 + counter; sw $t1, 0($x), which is why you may see a sw with 0 as offset.

Upvotes: 3

Related Questions