Name: Box: Date:

HW7 solution

  1. In the following assembly code fragment, registers $t1 and $t2 are initialized to N and zero respectively.

    LOOP: beq  $t1, $0, DONE
          addi $t2, $t2, 1
          addi $t1, $t1, -1
          j LOOP
    DONE:

    a. (2 points) What is the value in register $t2 for when the code reaches the label DONE:?

    \(N\)

    b. (2 points) How many MIPS instructions are executed?

    $$ 4N+1$$

    c. (6 points) If the registers $t1 and $t2 correspond to variables i and a respectively, write the equivalent C code for the loop.

    Code to initialize a and i is optional.

    while(i != 0) {
    a++;
    i--;
    }

    or

    for(i=n; i!=0; i--)
    a++;
  1. Consider the following C code fragment.

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

    a. (4 points) Assuming that the values of i, a, and b in registers $t0, $t1 and $t2, translate the C code to MIPS assembly. Use a minimum number of instructions.

       add $t0, $0, $0
    L: slt $t3, $t0, $t1
       beq $t3, $0,  done
       add $t1, $t1, $t2
       addi $t0, $t0, 1
       j L
    done:

    b. (4 points) If the variables a and b are initialized to 10 and 1, what is the total number of MIPS instructions executed?

    \(\infty\) since a grows as fast as i.

    BUT, not really! a will overflow after (2^31-1)-10 iterations of the loop because it starts at 10, then overflows when it tries to add 1 to 2^31-1: a becomes negative. The next time through the loop, the comparison will fail and the loop will end. So the real number is ((2^31-1)-10) * 5 + 1 + 2 (the plus two is for the final comparison that fails).