5

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

寄存器是 32 位,据我所知“立即数”是 16 位。因此,我很确定我不能做类似的事情

array:  .word 0:20000
~

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

所以如果我想访问 15000,我可能需要la一些更小的东西,然后从那里继续,对吗?但是我需要访问的较小值是多少才能正常,为什么?

4

1 回答 1

2

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

意识到这la不是真正的 MIPS 指令。相反,它指示汇编器生成最佳指令序列,以便将您指定的立即值放在指定的寄存器中。因此,可以使用 设置完整的 32 位范围的值la,但是通常可以通过使用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)
于 2011-03-09T08:48:25.870 回答