无法在MIPS中获得正确的输出

时间:2016-02-22 07:06:31

标签: c++ assembly mips

我必须转换以下内容,将所有非零值复制到数组中:

#include <stdio.h>

int source[] = {3, 1, 4, 1, 5, 9, 0};
int dest[10];

int main ( ) {
    int k;
    for (k=0; source[k]!=0; k++) {
    dest[k] = source[k];
    }
    printf ("%d values copied\n", k);
    return 0;
}

我已为此编码以下内容:

.data
source:   .word   3, 1, 4, 1, 5, 9, 8
dest:     .word   0, 0, 0, 0, 0, 0, 0
countmsg: .asciiz " values copied. "
          .text
main:

la $a0, source
la $a1, dest

loop:

lbu $v1, 0($a0)
addiu $v0, $v0, 1
sb $v1, 0($a1)
addiu   $a0, $a0, 1     # advance pointer to next source
addiu   $a1, $a1, 1     # advance pointer to next dest
bne     $v1, $zero, loop # loop if word copied not zero
loopend:

move $a0, $v0 
li $v0, 1 
syscall
la $a0,countmsg    # $a0 <- countmsg
li $v0, 4
syscall
li      $a0,0x0A  
li      $v0, 11         # specify Print Character service
syscall    
li $v0, 10 # Exit program
syscall

我得到的输出是“复制了2个值”,应该复制了6个值。

更新:修改代码以使用字词寻址:

.data
source:   .word   3, 1, 4, 1, 5, 9, 8
dest:     .word   0, 0, 0, 0, 0, 0, 0
countmsg: .asciiz " values copied. "
          .text
main:

la $a0, source
la $a1, dest
addiu $v0, $v0, 0
loop:
lw $v1, 0($a0)
addiu $v0, $v0, 1
sw $v1, 0($a1)
addiu   $a0, $a0, 4     # advance pointer to next source
addiu   $a1, $a1, 4     # advance pointer to next dest
bne     $v1, $zero, loop # loop if word copied not zero
loopend:

move $a0, $v0 
li $v0, 1 
syscall
la $a0,countmsg    # $a0 <- countmsg
li $v0, 4
syscall
li      $a0,0x0A  
li      $v0, 11         # specify Print Character service
syscall    
li $v0, 10 # Exit program
syscall

它给出了错误:第14行:0x0040001c处的运行时异常:地址超出范围0x10400000

1 个答案:

答案 0 :(得分:1)

  

应该已经复制了6个值

不。

首先,你要从一个单词数组中加载字节:

lbu $v1, 0($a0)

单词3等于字节3,0,0,0

请改用lw。并将地址增加4而不是1。

其次,你永远不会在循环之前将$v0初始化为零。