# 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未初始化的原因,我试图通过注解解释大部分代码行。有人能帮助我理解代码错误的地方吗?谢谢
1条答案
按热度按时间holgip5t1#
这个错误是非常友好的。没有真实的的计算机会告诉你什么时候内存未初始化。而且,即使检测到这种情况也只适用于小程序,因为较大的程序会重用已经使用过的内存,这可能会使模拟器对未初始化内存的检测失败。尽管如此,(一些环境将检测已释放的内存,以便还可以检测到已释放并随后重新使用的未初始化内存。)
主循环正在初始化数组元素0到9,而程序的其余部分使用数组元素1到10。在索引10上,它将访问未初始化的内存。
第二个循环的退出条件是〉,而不是第一个循环的〉=。在单步调试过程中,你应该已经能够看到这一点,特别是当你正在查看正在计算的内存地址和那里的内容时(这是详细调试的正常部分)。