【问题标题】:MIPS memory restrictions?MIPS 内存限制?
【发布时间】:2011-07-11 17:10:38
【问题描述】:

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

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

array:  .word 0:20000
~

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

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

【问题讨论】:

    标签: memory mips assembly restrictions


    【解决方案1】:

    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)
    

    【讨论】:

    • 所以如果我想访问一个偏移量大于 32767 的值,那么我需要在 32767 处 la 并使用另一个偏移量?因为在我的示例中我确实使用了一个合适的值(数组的第一个单词)但如果我说我必须使用另一个'la'还是有其他方法?
    • 如果您想访问一个偏移量不适合立即偏移量字段的值,是的,您需要将该偏移量放入寄存器并将其添加到自己的地址中。 la 将为您提供将任意立即值放入寄存器的最佳方式。如果您单独执行此操作,只需使用la 作为您想要的偏移量,并在lw 的偏移量字段中使用0。如果您正在访问附近的多个事物,请执行一次 la 和加法,然后为访问使用适当的立即偏移量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2014-07-16
    • 2011-02-25
    • 2012-01-04
    • 2017-11-29
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多