【问题标题】:Getting address out of range in MIPS assembly?在 MIPS 程序集中获取超出范围的地址?
【发布时间】:2017-03-07 16:17:44
【问题描述】:

我正在尝试仅使用一个数组来反转数组。当high的指标小于等于low的时候,我应该不断的切换high和low的内容。但是,我的地址超出范围,并且无法找到有关如何修复它的资源。

我应该在反转数组时只使用一个数组。我究竟做错了什么?星号是我得到错误的地方。

reverseArray:

        li $t6, 0 #head = first index of array
        la $s0, array
        li $t5, 4
        mult $s0, $t5
        mflo $t7 #tail = last index of array



swap:
    lw  $t6, 0($s0)
    **lw  $t4, 0($t7)**     

    sw  $t4, 0($s0)
    sw  $t6, 0($t7)

    add $t7, $t7, -4
    add $s0, $s0, 4

    sle $t1,$t7,$s0
    beq $t1,$0,swap

【问题讨论】:

  • 您正在使用索引作为指针。您需要添加基地址。
  • 我该怎么做?基地址是什么?对不起,我才刚刚开始。 @小丑
  • $s0 是基地址,您似乎将其乘以 4。这是错误的。您想将元素计数乘以元素大小并添加基地址。

标签: arrays assembly mips


【解决方案1】:

我假设您在$t7 中想要的是数组最后一个元素的地址。将基地址乘以 4 不会得到那个地址。你需要计算的是array + (length-1)*4
所以你需要知道数组的长度。您发布的代码并不表示您知道数组的长度,但假设您在寄存器$t6 中获得了长度。您需要执行的计算是:

addiu $t7,$t6,-1    # $t7 = length-1
sll   $t7,$t7,2     # $t7 = (length-1)<<2 == (length-1)*4
addu  $t7,$t7,$s0   # $t7 = (length-1)*4 + array

swap:
    lw  $t6, ($s0)
    lw  $t4, ($t7) 
    ... etc ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多