Name: Box: Date:

HW8 solution

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

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

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

    $$ 3N$$

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

    $$ 5N + 2$$

    c. (6 points) If the registers $t1, $t2, and $t3 correspond to variables i, a, and t respectively, write the equivalent C code for the loop. Note: you probably won't end up with a t variable in your answer.

    a = 0;
    i = N;
    while(0 < i) { //same as i >= 0
        i--;
        a = a + 3;
    }

    or

    a = 0;
    for( i=N; 0<i; i-- )
        a += 3;
  1. (20 points) Below is a snippet from a Checkers game program in C.

    void setKing(int row, int col, int isKing)
    {
      int* rowAddr = getRowAddr(row); //returns the memory address of row
      rowAddr[col] = isKing;
    }

    Fill in the missing portions of the setKing function below, adhering to the MIPS procedure call conventions. You should assume setKing is called according to MIPS convention.

    setKing:   #entry point to setKing procedure
    
    addi $sp, $sp, -12   #allocate space on stack
    sw $a1, 0($sp)       #backup needed arg values, since they
    sw $a2, 4($sp)       # would be lost after jal
    sw $ra, 8($sp)       #backup return address, since we do jal
    
    jal     getRowAddr  #call to getRowAddr
    
    lw $ra, 8($sp)       #restore values from stack
    lw $a2, 4($sp)
    lw $a1, 0($sp)
    addi $sp, $sp, 12    #deallocate space on stack
    
    sll $a1, $a1, 2      #multiply col by 4 to get ready for address
    add $v0, $a1, $v0    #build address from base and col offset
    sw $a2, 0($v0)       #store king value at row+col location
    
    jr    $ra   #return form setKing