我想问一下内存访问。当我执行load word
命令时,存在哪些内存限制?这意味着我可以用作偏移量或基址寄存器的最大数量是什么?
寄存器是32位,据我所知,“立即数”是16位。 因此,我很确定我不能做像
这样的事情array: .word 0:20000
~
la $s0, array
lw $s1, 15000($s0)
...
所以,如果我想访问15000,我可能需要la
更小的东西,然后从那里开始吧?
但是为了没问题我需要访问的较小值是什么?为什么?
答案 0 :(得分: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)