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

Unable to get correct output in 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

which should have been 6 values copied

没有。

首先,您要从单词数组中加载字节:

lbu $v1, 0($a0)

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

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

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