2

下面是我的代码:

.data
inputOne: .word 2 # Value 1
inputTwo: .word 3 # Value 2
counter: .word 0  # Adds the amount of times that we go through the loop
sum: .word 0      # Where the result of the addition goes
random: .word 0


.text
main:

    lw $t2, inputOne  # Load 2 into register t2
    lw $t3, inputTwo  # Load 3 into register t3
    lw $t4, counter   # Load 0 into register t4
    lw $t5, sum       # Load 0 into register t5
    lw $t7, random
    topOfLoop:        # Start of the loop
    beq $t4, $t2, bottomOfLoop  # Until t4 is equal to t2, the loop will continue
    addi $t5, $t5, 3  # Adds 3 to register t5 ( Sum) 
    addi $t4, $t4, 1  # Adds 1 to register t5 (Counter)
    j topOfLoop       # Jumps to the top of the loop
    bottomOfLoop:     # End of the loop 
    sw $t7, 0($t5)

当我在 MIPS 中运行它时,我得到了错误:

Exception occurred at PC=0x0040005c
Unaligned address in store: 0x00000006

谁能帮助我知道我做错了什么?

谢谢

4

2 回答 2

2

我不确定您要做什么,但sw $t7, 0($t5)读起来像是将值存储$t7在地址$t5 + 0。从您前面的代码来看,$t5不是内存地址,而是标量值(求和的结果)。

如果您想将求和的结果存储回由“sum”表示的内存位置,那么您应该执行sw $t5, sum.

于 2013-09-19T03:56:06.947 回答
1

与大多数其他架构一样,MIPS 不允许未对齐的访问。在您的情况下,在将sum地址加载到 $t5 之后,将其与 3 相加,这会导致地址未对齐(如果它之前是 4 的倍数,或者通常是任何不同于 4n + 1 的值)。因此将值存储到地址 $t5 会导致异常

lw $t5, sum       # Load 0 into register t5
...
addi $t5, $t5, 3  # Adds 3 to register t5 ( Sum) 
...
sw $t7, 0($t5)

如果要将新计算的值存储到 $t7 指向的地址,您应该这样做

sw $t5, 0($t7)

如果您想像标题所说的那样将 $t5 存储到 $t7 ,请使用 $zero 添加它

add $t7, $t5, $zero

或使用宏

move $t7, $t5

它完全扩展到上面的那个

于 2013-09-19T04:18:45.390 回答