# Reads 10 numbers into an array
# printing 0 if they are in non-decreasing order
# or 1 otherwise.
# Constants
ARRAY_LEN = 10
main:
scan_loop__init:
li $t0, 0 # i = 0;
scan_loop__cond:
bge $t0, ARRAY_LEN, scan_loop__end # while (i < ARRAY_LEN) {
scan_loop__body:
mul $t1, $t0, 4 # calculate &numbers[i] == numbers 4 * i
la $t2, numbers #
add $t2, $t2, $t1 #
li $v0, 5 # syscall 5: read_int
syscall #
sw $v0, ($t2) # scanf("%d", &numbers[i]);
addi $t0, $t0, 1 # i ;
j scan_loop__cond # loops whole thing
scan_loop__end:
li $t3, 0 # int swapped = 0;
li $t0, 1 # i = 1;
check_condition:
bgt $t0, ARRAY_LEN, print_finish
mul $t1, $t0, 4 # multiplying
la $t2, numbers # loading first address of numbers
add $t2, $t2, $t1
lw $t4, ($t2) # load numbers[i]
sub $t2, $t2, 4
lw $t5, ($t2) # load numbers[i - 1]
add $t0, $t0, 1 # i
blt $t4, $t5, change # changes value when x < y
j check_condition
change: # loop
li $t3, 1
j check_condition
print_finish:
move $a0, $t3 # printf("%d", $t3)
li $v0, 1 # syscall 1: print_int
syscall
li $v0, 11 # syscall 11: print_char
li $a0, '\n' # printf("%c", '\n');
syscall
li $v0, 0
jr $ra # return 0;
.data
numbers:
.word 0:ARRAY_LEN # int numbers[ARRAY_LEN] = {0};
我收到一條錯誤訊息,指出 $t4 和 $t5 未初始化,因此無法比較這兩個值 ( blt $t4, $t5, change)。我查看了我過去的講座示例和練習,但找不到 $t4 和 $t5 未初始化的原因,我試圖通過注釋解釋大部分行。任何人都可以幫助我在哪里弄錯我的代碼?謝謝
uj5u.com熱心網友回復:
這個錯誤非常友好。沒有真正的計算機會告訴您記憶體何時未初始化。此外,即使檢測到這種情況也僅適用于小程式,因為較大的程式將重用和重新利用已使用的記憶體,這可能會破壞模擬器正在執行的未初始化記憶體的檢測。盡管如此,模擬器的榮譽。(某些環境會檢測已釋放的記憶體,以便還可以檢測到已釋放并隨后重新使用的未初始化記憶體。)
您的主回圈正在初始化陣列元素 0 到 9,但程式的其余部分使用陣列元素 1 到 10。在索引 10 上,它將訪問未初始化的記憶體。
第二個回圈的退出條件是 > 而不是 >= 與第一個回圈一樣。您應該能夠在單步除錯期間看到這一點,特別是如果您正在查看正在計算的記憶體地址和那里的內容(這是詳細除錯的正常部分)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/509970.html
標籤:部件mips
