【问题标题】:Simple MIPS for loop not running循环未运行的简单 MIPS
【发布时间】:2018-10-11 01:19:00
【问题描述】:

我对 MIP 非常陌生,正在尝试为分配创建一个 for 循环。

for (int i=1; i < 16; i+=2) 
{
       A[i] = A[i] + B[3*i]   
} 

使用当前代码,当我尝试加载 A[i] 的值时,它显示获取地址未在字边界上对齐。

这是我的代码:

main:  
    li      $t0, 1              # Starting index of t0=i 
    lw      $s7, aSize          # Loop bound  
    la      $s0, A              # &A
    la      $s6, endA           # &endA
    la      $s1, B              # &B
loop:
    #TODO: Write the loop code
    addi    $t3, $zero, 3   # $t3 = 3
    mul     $t4, $t0,$t3    # $t4 = i * 3
    sll     $t4, $t4, 2     # $t4 into a byte offset

    add     $s1, $s1, $t4   # $s1 = &B[i*3]
    add     $s0, $s0, $t0   # $s0 = &A[i]

    lw      $t1, 0($s0)     # value of A[i]
    lw      $t2, 0($s1)     # value of B[i * 3]

    add     $t2, $t1, $t2   # A[i] + B[i]
    sw      $t2, 0($s0)     # A[i] = A[i] + B[i]
    addi    $s0, $s0, 2
    addi    $s1, $s1, 2
    addi    $t0, $t0, 1     #i++
    bne     $t0, $s7, loop

我对 MIP 很陌生,所以不知道发生了什么,甚至不知道该去哪里看。感谢您的帮助。

【问题讨论】:

    标签: loops assembly mips


    【解决方案1】:

    当你这样做时:

    mul     $t4, $t0,$t3    # $t4 = i * 3
    

    您正在计算数组 index [就像在 c 中一样]。

    但是,在将它添加到数组的基地址之前,您需要将此索引转换为 byte 偏移量。也就是说,你必须将它乘以 4。这可以 [如 c] 左移 2 来完成。

    所以,在mul 之后,执行:

    sll $t4,$t4,2
    

    在将所有索引值相加之前,您必须对它们进行乘法/移位。


    更新:

    好的,这是有道理的。我添加了它,但我仍然在“lw $t1, 0($s0)”这一行得到那个单词边界错误

    您没有显示AB 的定义,因此可能存在对齐问题。

    当你这样做时:

    add     $s1, $s1, $t4   # $s1 = &B[i*3]
    

    您正在修改&amp;B[0] 的原始/基本值。那不是你想要的。为最终地址值使用不同的寄存器(即在整个循环中保持$s1 不变)

    执行以下操作:

    add     $s3, $s1, $t4   # $s3 = &B[i*3]
    lw      $t2, 0($s3)     # value of B[i * 3]
    

    以类似的方式调整其他类似的寄存器使用(即您对A数组有类似的问题)

    我编写了一个清理后的版本。我没有组装也没有测试过它,但我认为它会让你更接近。这可能有一个错误[如果没有整个程序很难判断],因为我不确定aSize 是什么。

    main:
        li      $t0,1                   # Starting index of t0=i
        lw      $s7,aSize               # Loop bound
        la      $s0,A                   # &A
        la      $s6,endA                # &endA
        la      $s1,B                   # &B
        addi    $t3,$zero,3             # $t3 = 3
    
    loop:
        # TODO: Write the loop code
        mul     $t4,$t0,$t3             # $t4 = i * 3
        sll     $t4,$t4,2               # $t4 into a byte offset
        add     $s3,$s1,$t4             # $s3 = &B[i*3]
    
        sll     $t4,$t0,2               # $t4 into a byte offset
        add     $s2,$s0,$t4             # $s2 = &A[i]
    
        lw      $t1,0($s2)              # value of A[i]
        lw      $t2,0($s3)              # value of B[i * 3]
    
        add     $t2,$t1,$t2             # A[i] + B[i]
        sw      $t2,0($s2)              # A[i] = A[i] + B[i]
    
        addi    $t0,$t0,2               # i += 2
        bne     $t0,$s7,loop
    

    【讨论】:

    • 好吧,这是有道理的。我添加了它,但我仍然在“lw $t1, 0($s0)”这一行得到那个单词边界错误
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多