Question

I am running the following MIPS code in MARS simulator:

add $t0, $zero, $zero        # i = 0
        add $t4, $zero, $zero        # initialize the sum to zero
        add $t5, $zero, $zero        # initialize temporary register to zero

        la $a0, array                 # load address of array
        la $a1, array_size            # load address of array_size
        lw $a1, 0($a1)                # load value of array_size variable

loop:
        sll  $t1, $t0, 2              # t1 = (i * 4)
        add $t2, $a0, $t1             # t2 contains address of array[i]
        sw $t0, 0($t2)                # array[i] = i

        addi $t0, $t0, 1              # i = i+1
        add $t4, $t4, $t0             # sum($t4) = ($t4 + array[i])

        slt $t3, $t0, $a1             # $t3 = ( i < array_size)
        bne $t3, $zero, loop          # if ( i < array_size ) then loop

        add $t5, $a0, $zero           # save contents of $a0 in temporary reg $t5
        nop                           # done.

In machine code, the bne instruction is the following: 00010101011000001111111111111001. In this case, the immediate is: 1111111111111001 which equals to: 0xFFF9. MIPS will take that, bit shift it to the left by 2 (multiplies it by 4) and takes its program counter to that number. However, 0xFFF9 multiplied by 4 is 0x3FFE4. How is that possible? The program counter at SLL should be 0x18 and not 0x3FFE4. What am I missing here?

Thank you,

Was it helpful?

Solution

There are 2 things to note here:

  1. The immediate is in 2's complement; since the sign bit is 1, this is a NEGATIVE value
  2. On the MIPS, the target of the branch is expressed as an offset (which squares w/ the value being negative, since loop comes before the bne). The value gets multiplied by 4 b/c the instructions are all 4-bytes in size
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top