2011-03-09 54 views
5

我想问一下内存访问。当我执行load word命令时,存在什么内存限制?这意味着我可以用作偏移量或基址寄存器的最大数量是多少?MIPS内存限制?

寄存器是32位,据我所知“立即”是16位。 因此,我敢肯定,我不能这样做

array: .word 0:20000 
~ 

la  $s0, array 
lw  $s1, 15000($s0) 
... 

所以,如果我想访问15000,我可能需要la更小的东西,并从那里向右走呢? 但是,为了保持良好状态,我需要访问哪些较小的值?为什么?

回答

2

lw的直接字段是16位,是的;并且它是二进制补码,因此立即偏移的可能范围是-32768..32767 - 所以lw $s1, 15000($s0)应该没问题。

认识到la不是真正的MIPS指令。相反,它指示汇编程序生成最优化的指令序列,以便将您指定的立即值放入指定的寄存器中。因此,可以使用la来设置全32位值的范围,但是通常可以通过使用la一次将合适的值放入某个寄存器来产生更优化的代码,使得几个后续指令能够使用来自该值的立即偏移每次需要立即值时使用la

所以,假如你需要加载从偏移量40000和您的阵列的50000值,你可以这样做:

array: .word 0:20000 
~ 
la  $s0, array   # get address of array 
la  $s1, 40000   # get offset into a register 
add $s0, $s0, $s1  # add offset to address, i.e. calculate (array+40000) 
lw  $s1, 0($s0)   # fetch data from (array+40000) 
lw  $s2, 10000($s0)  # fetch data from (array+40000+10000) 
+0

所以,如果我想和偏移大于32767访问值,那么我就需要到'la'在32767并使用另一个偏移量?因为在我的例子中,我确实使用了一个合适的值(数组的第一个字),但在这种情况下,我说我必须使用另一个'la'或有另一种方式? – Elias 2011-03-09 09:20:03

+0

如果要访问偏移量不适合直接偏移量字段的值,那么您需要将偏移量存入寄存器并将其添加到地址中。 'la'会给你一个获得随机值的最优方法。如果你一次完成这个操作,只需使用'la'作为你想要的偏移量,并在'lw'的偏移量字段中使用'0'。如果您访问多个附近的事物,则执行'la'并添加一次,然后使用相应的立即偏移进行访问。 – moonshadow 2011-03-09 09:28:11