簡體   English   中英

為什么此SPIM / MIPS程序用於對數組中的偶數整數求和不起作用?

[英]Why is this SPIM/MIPS program for summing the even integers in an array not working?

我是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   

我在$ 10中得到-56,但結果應該是$ 10中有25。

首要問題:

我假設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 exit,如果$ 16(您當前位於數組中的當前地址)== $ 19,而您已將其設置為32,則它不會很快退出,並且嘗試訪問內存應該不會是

其他說明: sll $0, $0, 0沒什么大作用$ 0 = 0 << 0-不知道您在想什么

您的代碼有很多問題。
1.您不讀取數組或大小來獲取數據參數
2.您的循環控制不正確。 您使用$ 16(假定為@array並以1k初始化),加4並在達到32時進行測試...我真的建議您確實有單獨的單獨寄存器來計算循環迭代並計算數組地址
4.您應該在最后調用exit()(syscall 10),否則模擬器將嘗試執行數據並發出“試圖在...處執行非指令”。
5.具有許多分支的程序組織很復雜並且容易出錯。 將循環測試放在最后,將測試倒置通常可以使代碼更清晰。
6.為什么要插入所有這些nops( sll $0, $0, 0 )? 大多數不是必需的,我不建議您使用延遲加載來學習技巧。 一旦掌握了它,那就是另一回事了。
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM