2011-11-29 673 views
0

我运行在MARS仿真以下MIPS代码:解码BNE 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。我在这里错过了什么?

谢谢

+0

即时签署因此fff9是-7 – user786653

+0

这是一个偏移量,而不是新PC的值 – harold

回答

1

有两件事情,这里要注意:

  1. 眼前的是2的补;因为符号位是1,所以这是一个负值
  2. 在MIPS上,分支的目标被表示为一个偏移量(由于循环出现在该区域之前,所以该区域的值为负数)。该值乘以4 b/c指令都是4字节的大小