使用1维数组在MIPS中打印5by5矩阵

时间:2014-11-07 22:48:29

标签: arrays mips

.data

spaceChar: .asciiz  " " 

#array of 26 elements 1,0,0,0,0  elements = 5*5
array: .word 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9
size: .word 25
endl: .asciiz "\n"

.text

main:

lw $t3, size

la $t1, array # get array address

li $t2, 0 # set loop counter

print_loop:

beq $t2, $t3, print_loop_end # check for array end

li $t5,4 #at 4th element I want next line
beq $t5,$t2,newline #checking..

lw $a0, ($t1) # print value at the array pointer

li $v0, 1

syscall

la $a0, spaceChar   # Display a space character between elements
li $v0, 4
syscall


addi $t2, $t2, 1 # advance loop counter

addi $t1, $t1, 4 # advance array pointer

j print_loop # repeat the loop


print_loop_end: 
li $v0,10
syscall

newline:
la $a0,endl
li $v0,4
syscall
j print_loop

我试图在MIPS中打印一个5 * 5矩阵这是一个包含25个元素的mips的1维数组,我遍历print_loop中的元素,当它到达第4个元素时我想做下一行但是当我运行时这个(MARS 4.5)很冷,我不知道我在做什么,请帮忙

1 个答案:

答案 0 :(得分:0)

简答:

你在换行符上无限循环。

答案很长:

问题是

beq $t5, $t2, newline          #checking

一旦你的计数器得到4,它就会继续使用换行符

newline:
la  $a0, endl
li  $v0, 4
syscall
j   print_loop

然后它回到print_loop

print_loop:
beq $t2, $t3, print_loop_end   #check for array end
li  $t5, 4                     #at 4th element I want next line
beq $t5, $t2, newline          #checking

糟糕,我们又回到了我们的beq!如果您使用逐步调试器(运行绿色箭头旁边的绿色箭头为1),您将看到您打印第一行然后无限打印换行符。在我看来,你可以在那之后添加另一个标签。

将来,我建议对每一行进行评论,并将代码划分为完成目标的块。例如:

# print value at the array pointer
lw  $a0, ($t1)    # print array[index]
li  $v0, 1        # syscall: print integer
syscall

# print space
la  $a0, spaceChar  # print character " "
li  $v0, 4          # syscall: print string
syscall

它很乏味,但是当所有内容都以伪代码编写时,它会帮助你嗅出错误。 (另外,当有人在stackoverflow上询问你想要在几年内回答的MIPS问题时,它会帮助你记住命令的作用!:P)

哦,你可以做到

beq $t2, 4, newline

而不是

li  $t5, 4
beq $t5, $t2

MIPS可能很棘手。慢慢来,记录一切。祝你好运!