assembly MIPS程序集中未初始化的地址(基本)

7ajki6be  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(130)
# 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未初始化的原因,我试图通过注解解释大部分代码行。有人能帮助我理解代码错误的地方吗?谢谢

holgip5t

holgip5t1#

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

相关问题