以较大整数的格式中断打印数组
Printing array in format breaks for larger integers
我有一个包含斐波那契数列的数组。当我打印内容时,我的格式是:
array[0] = 1
...
array[4] = 5
...
所以除了打印数组的内容之外,我还为 "array[" 打印了一条消息,然后是索引
只是打印一个寄存器计数器,然后是最后一部分“] =”,然后我打印数组的值。对于大于 6 的大小,这不起作用,特别是后面的部分“] =”不打印并且数组的值被连接到索引。
这是打印值的代码:
.data
arrayF: .word # starting address of array
prompt: .asciiz "Enter value of N: "
stringPartTwo: .asciiz "] = "
stringPartOne: .asciiz "array["
.text
start:
# for printing the prompt
li $v0, 4
la $a0, prompt
syscall
# getting N from user
li $v0, 5
syscall
move $t0, $v0 # putting N's value in $t0
# Loading the beginning address of array into $a1 and $a2
la $a1, arrayF
addi $t1, $zero, 0 # A[i - 2]
addi $t2, $zero, 0 # A[i - 1]
addi $t3, $zero, 1 # A[i]
addi $t4, $t0, 0 # Saves size of array in another register for later subroutine
loop1:
beq $t0, 0, done # Checking if size reached to 0
subi $t0, $t0, 1 # Decrementing size for next iteration
sw $t3, ($a1) # Storing A[i] in the array
addi $a1, $a1, 4 # Accessing next element in array
addi $t1, $t2, 0 # Moving A[i - 1] to A[i - 2]
addi $t2, $t3, 0 # Moving A[i] to A[i - 1]
add $t3, $t2, $t1 # Calculating new A[i]
j loop1
done:
la $a1, arrayF # Loading base address
addi $t1, $zero, 0 # Counter for subroutine
loop2:
beq $t1, $t4, finish # done printing if reached array's length
lw $t2, ($a1) # loading the value in A[i] to $t2
# printing "array["
li $v0, 4
la $a0, stringPartOne
syscall
# print index
li $v0, 1
move $a0, $t1
syscall
# printing "] = "
li $v0, 4
la $a0, stringPartTwo
syscall
# print value of array
li $v0, 1
move $a0, $t2
syscall
# printing new line
addi $a0, [=10=], 10 #put newline in a0
addi $v0, [=10=], 11 #print character in a0
syscall
addi $t1, $t1, 1 # incrementing counter
addi $a1, $a1, 4 # accessing next element
j loop2
输出片段:
您只为数组分配了 space 的一个字(4 个字节)。尝试存储更多的内容将首先覆盖 prompt
,然后是 stringPartTwo
和 stringPartOne
,具体取决于您尝试存储的字数。
您需要为数组分配更多内存,例如:
arrayF: .space 64 # allocate 64 bytes (16 words)
我有一个包含斐波那契数列的数组。当我打印内容时,我的格式是:
array[0] = 1
...
array[4] = 5
...
所以除了打印数组的内容之外,我还为 "array[" 打印了一条消息,然后是索引 只是打印一个寄存器计数器,然后是最后一部分“] =”,然后我打印数组的值。对于大于 6 的大小,这不起作用,特别是后面的部分“] =”不打印并且数组的值被连接到索引。
这是打印值的代码:
.data
arrayF: .word # starting address of array
prompt: .asciiz "Enter value of N: "
stringPartTwo: .asciiz "] = "
stringPartOne: .asciiz "array["
.text
start:
# for printing the prompt
li $v0, 4
la $a0, prompt
syscall
# getting N from user
li $v0, 5
syscall
move $t0, $v0 # putting N's value in $t0
# Loading the beginning address of array into $a1 and $a2
la $a1, arrayF
addi $t1, $zero, 0 # A[i - 2]
addi $t2, $zero, 0 # A[i - 1]
addi $t3, $zero, 1 # A[i]
addi $t4, $t0, 0 # Saves size of array in another register for later subroutine
loop1:
beq $t0, 0, done # Checking if size reached to 0
subi $t0, $t0, 1 # Decrementing size for next iteration
sw $t3, ($a1) # Storing A[i] in the array
addi $a1, $a1, 4 # Accessing next element in array
addi $t1, $t2, 0 # Moving A[i - 1] to A[i - 2]
addi $t2, $t3, 0 # Moving A[i] to A[i - 1]
add $t3, $t2, $t1 # Calculating new A[i]
j loop1
done:
la $a1, arrayF # Loading base address
addi $t1, $zero, 0 # Counter for subroutine
loop2:
beq $t1, $t4, finish # done printing if reached array's length
lw $t2, ($a1) # loading the value in A[i] to $t2
# printing "array["
li $v0, 4
la $a0, stringPartOne
syscall
# print index
li $v0, 1
move $a0, $t1
syscall
# printing "] = "
li $v0, 4
la $a0, stringPartTwo
syscall
# print value of array
li $v0, 1
move $a0, $t2
syscall
# printing new line
addi $a0, [=10=], 10 #put newline in a0
addi $v0, [=10=], 11 #print character in a0
syscall
addi $t1, $t1, 1 # incrementing counter
addi $a1, $a1, 4 # accessing next element
j loop2
输出片段:
您只为数组分配了 space 的一个字(4 个字节)。尝试存储更多的内容将首先覆盖 prompt
,然后是 stringPartTwo
和 stringPartOne
,具体取决于您尝试存储的字数。
您需要为数组分配更多内存,例如:
arrayF: .space 64 # allocate 64 bytes (16 words)