为什么这个SPIM / MIPS程序用于求和数组中的偶数整数不起作用?

问题描述 投票:0回答:2

我是MIPS的新手,所以如果你看到任何没有意义的东西,那就是原因。

我试图在我的代码中只计算数组的偶数值,然后将结果保持在10美元。我已经包括了我到目前为止所写的内容。当程序执行时,它挂起并给我一些错误:“PC = 0x0040001c发生异常”和“数据/堆栈中的错误地址读取0x10040000”和“尝试在0x80000180执行非指令”。

.text

.globl main


main:

lui $16,0x1000
lw  $17,0($16)
addiu $16, $16, 4
addiu $18, $0, 2
addiu $19, $0, 32

loop:

beq $16, $19, exit
sll $0, $0, 0
lw  $17,0($16)
sll $0, $0, 0
div $17, $18
mfhi $13
beq $13, $0, even
sll $0, $0, 0
addiu $16, $16, 4
j loop
sll $0, $0, 0

even:

add $10, $10, $17
addiu $16, $16, 4

j loop
sll $0, $0, 0

exit:

sll $0, $0, 0

.data
size: .word 8
array: .word 23, -12, 45, -32, 52, -72, 8, 13   

我得到-56美元10美元,但结果应该是25美元10美元。

assembly mips mips32 spim qtspim
2个回答
1
投票

首要问题:

我假设lui $16,0x1000,意味着获得用户内存的开始获得大小,数组等,并且lw $17,0($16)获得17美元的大小

用它

$ 16 = 0x10000000 $ 17 = 0

显然,16美元的所有其他读数都是错误的。

如果我使用la $16, size,我得到:

$ 16 = 0x10010000 $ 17 = 8

而阵列的其他读数应该更好。

下一期:

beq $16, $19, exit是'goto退出,如果$ 16(当前你在阵列中的地址)== $ 19你已经设置为32,所以它不会很快退出,并尝试访问内存它不应该是

其他说明:sll $0, $0, 0什么都不做$ 0 = 0 << 0 - 不确定你在想它做什么


1
投票

您的代码存在许多问题。 1.您没有读取数组或大小来获取数据的参数 2.你的循环控制不正确。你使用16美元(应该是@array并在1k初始化),添加4并在它达到32时进行测试...我真的建议你有单独的独立寄存器来计算循环迭代和计算数组地址 4.您应该在结尾调用exit()(系统调用10),否则您的模拟器将尝试执行您的数据并将发出“尝试在...处执行非指令”。 5.组织具有多个分支的程序是复杂且容易出错的。最后进行循环测试并反转测试通常会使代码更清晰。 6.为什么要插入所有这些nops(sll $0, $0, 0)?大多数都不是必需的,我建议你不要使用延迟负载来学习mips。一旦你掌握了它,这是另一个故事。 7.测试一个数字是奇数还是不需要除法。只需测试其LSB的值。

这是一个有效的代码:

.text
.globl main
main:
        la $16,array   # $16==@array
        la $19,size    # $19 =@size
        lw $19,0($19)  # $19=size of array(in words)
        addi $20, $0,0 # i=0
loop:
        lw  $17,0($16)    # $17=*array
        andi $13,$17,1    # get lsb to know is $17 is odd or even
        bne $13, $0, odd  # skip accumulation if $17 is odd
        add $10, $10, $17 # accumulate sum of evens
odd:    
        addiu $16, $16, 4 # array++
        addiu $20,$20,1   # i++
        bne $20, $19, loop# goto loop if i!= size

exit:
        addi $2,$0,10    # write 10 in $v0 ($2) to call
        syscall          # syscall 10 (exit)

.data
size:  .word 8
array: .word 23, -12, 45, -32, 52, -72, 8, 13
© www.soinside.com 2019 - 2024. All rights reserved.