0

我在 MARS 模拟器中运行以下 MIPS 代码:

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.

在机器代码中,bne指令如下:00010101011000001111111111111001. 在这种情况下,立即数是:1111111111111001等于:0xFFF9。MIPS 将采用该值,将其向左移动 2(将其乘以 4)并将其程序计数器设为该数字。但是,0xFFF9乘以 4 是0x3FFE4。这怎么可能?程序计数器SLL应该是 0x18 而不是0x3FFE4。我在这里想念什么?

谢谢,

4

1 回答 1

1

这里有两点需要注意:

  1. 立即数是 2 的补码;因为符号位是 1,所以这是一个负值
  2. 在 MIPS 上,分支的目标表示为偏移量(它与值为负的平方,因为循环位于 bne 之前)。该值乘以 4 b/c 指令的大小均为 4 字节
于 2011-11-29T20:15:58.123 回答