2009-04-08 77 views
0

我正在为我的计算机组织类工作一些MIPS代码,以及我似乎无法让MIPS正常工作,并且没有多少MIPS资源在线。我在PCSPIM上运行代码。代码应该为array2的内容添加10并将它们存储在array1中,然后再打印数组1.现在重新编写代码。MIPS代码坏

.text 
main: 
    la $t0, array1 
    la $t1, array2 
    la $s0, valuec 
    li $s2, 6 
    add $t6, $zero, 1 #i = 1 

Loop: 
    addi $t6, $t6, 1 #i++ 

    lw $t2, ($t0) 
    lw $t5, ($t1) 
    lw $s1, ($s0) 
    addu $t2, $t5, $s1 
    sw $t2, ($t0) 
    add $t0, $t0, 4 
    add $t1, $t1, 4 
    li $v0, 1 
    move $a0, $t2 
    syscall 
    blt $t6, $s2, Loop 

    li $v0, 10 
    syscall 
.data 
    array1: .space 20 
    array2: .word 1,2,3,5,9 
    valuec: .word 10 

PCSPIM打印0 5倍,并返回例外7中的错误数据地址]发生,而忽视

回答

2

这是家庭作业,所以我只会给你现在的线索,并随时添加。几件事:

1 /你需要告诉我们它是什么假设要做。这是最重要的事情。

2您可以将array1地址存储到t0中,然后在第一个循环中重新使用t0。

3 /您似乎对地址和这些地址的内容("la $s0, valuec""addu $t0, $t1, $s0")感到困惑。

UPDATE:

其实我有签过了一段时间,所以我会后我的解决方案,从而不会让你陷入困境。

我之前提到的困惑是,您将两个地址加载到$ t1和$ s0中,然后将它们加在一起得到另一个地址 - 这可能远远超出您的数据区域(您应该真的是增加一个地址和一个偏移量)。

这基本上是你的代码问题(包括打印的零和崩溃)。你最好的选择就是解决这个问题,并参考下面的代码,作为最后的手段,看看我会如何做到这一点。复制代码从长远来看不会对你有所帮助,你应该明智地假设你的教育工作者也在检查所有网站的抄袭行为。

这是我想出的代码(很快,所以你需要测试它 - 它可能有错误)。我建议你阅读很好的的意见,了解它在做什么。

我会在几个小时后回来看看你在做什么。干杯。

.text 
main: 

# Initialization of array pointers and loop 

    la  $t0, array1  # address of array 1 
    la  $t1, array2  # address of array 2 
    li  $t2, 1   # element number 
    li  $t3, 6   # upper limit of elements 

# Process each word in array 2, adding 10 and placing 
# into array 1. 

Loop: 
    lw  $t3, 0($t1)  # get word from array 2 
    addi $t3, $t3, 10  # add 10 to word 
    sw  $t3, 0($t0)  # store word into array 1 
    addi $t0, $t0, 4  # move to next entry in array 1 and 2 
    addi $t1, $t1, 4 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

# Initialize printing loop by going back to start of array 1 

    la  $t0, array1  # address of array 1 
    li  $t2, 1   # element number 

# Loop through array 1, printing each element. 

pLoop: 
    lw  $t2, 0($t0)  # get word from array 1 
    li  $v0, 1   # 'print' command code 
    move $a0, $t2   # needs value in $a0 
    syscall     # print it 
    addi $t0, $t0, 4  # move to next entry in array 1 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

    li  $v0, 10   # 'terminate' command code 
    syscall     # exit 

# Data arrays for array 1 and 2 

.data 
array1: .word 0,0,0,0,0 
array2: .word 1,2,3,4,5 
-1

有一些可能出现的问题,但最明显的/有可能的是,你是不是从main返回在数据部分开始之前。

jr ra 
+0

我认为这是由命令代码$ v0设置为10的最终系统调用处理的。 – paxdiablo 2009-04-08 03:34:47