gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:49:33 26 4
gpt4 key购买 nike

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

#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 初始化为零。

关于c++ - 无法在 MIPS 中获得正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com