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