MIPS打印奇怪的空方块

MIPS printing strange empty square

我正在编写代码以在 MIPS 中使用宏读取 NxN 数组,读取没有问题,但是在使用几次后调用函数 printString 时,它开始打印一个奇怪的正方形。我发现在 readArray 中注释行 sw $v0, ($t9) 将使函数按预期打印,但是读取的内容将不再保存(并且函数将无用)。

我的代码如下:

.data

.macro printString(%string)
    .data
        string: .asciiz %string
    .text
        li $a0, 0
        li $v0, 0
        la $a0, string
        li $v0, 4
        syscall
.end_macro

.macro printInt(%int)
    .text
        li $a0, 0
        li $v0, 0
        add $a0, $zero, %int
        li $v0, 1
        syscall
.end_macro

.macro alloc(%size)
    .text
        li $a0, 0
        li $v0, 0
        add $a0, $zero, %size
        li $v0, 9
        syscall
.end_macro

.macro end()
    .text
        li $v0, 10
        syscall
.end_macro

.macro readInt()
    .text
        li $v0, 5
        syscall
.end_macro

.macro readArray(%array, %size)
    .data
        array: %array
    .text
        rAMain:
            la $t4, array
            add $t5, $zero, %size
            li $t6, 0
            li $t7, 0
        rALoop:
            arrayIndex($t4, $t5, $t6, $t7)
            move $t9, $v0
            printString("Write a value:[")
            printInt($t6)
            printString("][")
            printInt($t7)
            printString("]: ")
            readInt()
            sw $v0, ($t9)
            addi $t7, $t7, 1
            blt $t7, $t5, rALoop
            li $t7, 0
            addi $t6, $t6, 1
            blt $t6, $t5, rALoop    
.end_macro

.macro arrayIndex(%array, %columnNumber, %i, %j)
    .data
        array: %array
    .text
        la $t0, array
        add $t1, $zero, %i
        add $t2, $zero, %j
        add $t3, $zero, %columnNumber
        mul $v0, $t1, $t3
        add $v0, $v0, $t2
        sll $v0, $v0, 2 
        add $v0, $t0, $v0       
.end_macro

.text
    main:
        jal readN
        alloc($s1)
        move $s0, $v0
        readArray($s0, $s1)
        end()
        
    readN:   ###### 
        printString("Write the value of N: ")
        readInt()
        move $s1, $v0
        jr $ra

错误图片:

用法:

.data
    array: %array

在你的 readArray 宏中,当相应的参数是一个寄存器时,它不会分配任何存储空间——事实上,array: $t0 对我来说没有任何意义,但不知何故 MARS 分配了零字节的存储在数组标签之后而不抱怨语法错误。

数据声明.data ... array: 是全局声明,在compile/assemble时执行,而不是在运行时执行的动态分配。这是我对 MARS 在这里接受寄存器名称作为参数感到惊讶的原因之一,但是 none-the-less,它肯定没有按照您的意愿进行。