Memory 内存限制?

Memory 内存限制?,memory,mips,assembly,restrictions,Memory,Mips,Assembly,Restrictions,我想问一下关于内存访问的问题。当我执行load word命令时,存在哪些内存限制?意思是我可以用作偏移量或基址寄存器的最大数字是多少 寄存器是32位,据我所知,“立即数”是16位。 因此,我很确定我不能做像这样的事情 array: .word 0:20000 ~ la $s0, array lw $s1, 15000($s0) ... 因此,如果我想访问15000,我可能需要la一些更小的东西,然后从那里继续,对吗? 但是我需要访问哪个较小的值才能正常?为什么?lw中的立即

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

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

array:  .word 0:20000
~

la     $s0, array
lw     $s1, 15000($s0)
...
因此,如果我想访问15000,我可能需要
la
一些更小的东西,然后从那里继续,对吗?
但是我需要访问哪个较小的值才能正常?为什么?

lw中的立即数字段是16位,是的;它是有符号的2的补码,所以即时偏移量的可能范围是-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)

因此,如果我想访问偏移量大于32767的值,那么我需要在32767处使用另一个偏移量,因为在我的示例中,我使用了一个合适的值(数组的第一个字)但在这种情况下,我说我必须使用另一个“la”,或者有其他方法吗?如果你想访问一个偏移量不适合立即偏移量字段的值,是的,你需要将该偏移量放入寄存器,然后自己将其添加到地址中
la
将为您提供将任意立即数值输入寄存器的最佳方式。如果单独执行此操作一次,只需对所需的偏移量使用
la
,并在
lw
的偏移量字段中使用
0
。如果要访问附近的多个对象,请执行一次
la
和加法,然后使用适当的即时偏移量进行访问。