无法在 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
初始化为零。
我必须转换以下内容,将所有非零值复制到数组中:
#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
初始化为零。