MIPS内存限制?

5

我想问一下关于内存访问的问题。当我执行一个load word命令时,存在哪些内存限制?也就是说,我可以使用的最大偏移量或基地址寄存器是多少?

寄存器大小为32位,据我所知,“immediate”是16位。因此,我很确定我不能像这样做:

array:  .word 0:20000
~

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

所以如果我想访问15000,我可能需要先访问一些更小的值,然后才能继续访问,对吗? 但是我需要访问多小的值才能保证正常访问呢?为什么?

1个回答

2
lw $t0, 40000($s0)
lw $t1, 10000($t0)
lw $t2, 10000($t0)

lw指令中的立即数字段是16位,它是带符号的二进制补码,因此立即数偏移量的可能范围为-32768..32767,所以lw $s1, 15000($s0)是可以的。

要注意的是,la不是真正的MIPS指令。相反,它指示汇编器生成最优指令序列,以便将您指定的立即值放置在指定的寄存器中。因此,使用la可以设置完整的32位值范围,但通常通过使用la一次将适当的值放入某个寄存器,以便几个后续指令能够使用该值的立即偏移量来生成更优化的代码。

因此,假设您需要从数组的偏移量40000和50000处加载值,则可以执行以下操作:

lw $t0, 40000($s0)
lw $t1, 10000($t0)
lw $t2, 10000($t0)
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)

所以,如果我想访问一个偏移量大于32767的值,那么我需要在32767处使用la并使用另一个偏移量吗?因为在我的例子中,我使用了一个合适的值(数组的第一个单词),但是如果我说我必须使用另一个'la',还是有其他方法吗? - Elias
如果您想访问一个偏移量的值,而该偏移量无法适应立即偏移字段,那么您需要将该偏移量放入寄存器中,并将其添加到地址中。la将为您提供将任意立即值放入寄存器的最佳方法。如果您只是孤立地执行一次此操作,请使用la获取所需的偏移量,并在lw的偏移字段中使用0。如果您要访问多个相邻的内容,请执行一次la和加法,然后对访问使用适当的立即偏移量。 - moonshadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接