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,它肯定没有按照您的意愿进行。
我正在编写代码以在 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,它肯定没有按照您的意愿进行。