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 倍します)、そのプログラム カウンターをその数値にします。ただし、0xFFF94 倍は0x3FFE4です。そんなことがあるものか?のプログラム カウンターはSLL0x18 であり、 ではありません0x3FFE4。ここで何が欠けていますか?

ありがとうございました、

4

1 に答える 1

1

ここで注意すべき点が 2 つあります。

  1. 即値は 2 の補数です。符号ビットが 1 であるため、これは NEGATIVE 値です。
  2. MIPS では、分岐のターゲットはオフセットとして表されます (ループは bne の前にあるため、負の値で 2 乗します)。値は 4 b/c で乗算されます。命令のサイズはすべて 4 バイトです。
于 2011-11-29T20:15:58.123 に答える