我必须转换以下内容,将所有非零值复制到数组中:
#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
答案 0 :(得分:1)
应该已经复制了6个值
不。
首先,你要从一个单词数组中加载字节:
lbu $v1, 0($a0)
单词3
等于字节3,0,0,0
。
请改用lw
。并将地址增加4而不是1。
其次,你永远不会在循环之前将$v0
初始化为零。