2009-11-10 23 views
1

我正在做一个家庭作业任务,用于翻译我们写给MIPS的C程序。我的问题是关于通用MIPS编码,而不是项目特定的问题。我遇到了打印输出的问题。我有一个数组和输出字符串宣布为:高效的打印MIPS Int数组的方法

array: .word 7, 2, 5, -3, 3, 6, -4, 1 
output1: .asciiz "Array: \0" 

我想输出的数据,所以我有以下格式:

Array: 7 2 5 -3 3 6 -4 1 

我们的阵列是硬编码的,而我们的数组长度是预定的。我试图想出一个循环来有效地打印出来,但使用寄存器处理lw偏移量是一个问题。
我想出了下面的代码来硬编码我的输出,但我仍然有另一个我需要打印的数组,而这看起来好像正在占用很多空间。我的代码功能齐全,但它只是一团糟!任何人都可以给我提示清理/重构它吗?
数组存储在$a0/$s0,数组的大小存储在$a1/$s1

la $a0, output1 # print the "Array: " string 
li $v0, 4 
syscall 

# Huge Oversized Print Statement to print out the original Array: 
li $v0, 1 # print the array 
lw $a0, 0($s0) 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
li $v0, 1 
lw $a0, 4($s0) 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 8($s0) 
li $v0, 1 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 12($s0) 
li $v0, 1 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 16($s0) 
li $v0, 1 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 20($s0) 
li $v0, 1 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 24($s0) 
li $v0, 1 
syscall 
la $a0, space #print the space between elements 
li $v0, 4 
syscall 
lw $a0, 28($s0) 
li $v0, 1 
syscall 

这是一门功课的项目,我真的要充分认识到打印出数组一个干净的方式,我不是在寻找抄袭。编写循环的提示非常感谢,我不想找人给我代码。

回答

3

这可能有助于增加$s0addi,而不是手动改变偏移 - 你总是使用lw 0($s0)的方式。

编辑:我想我应该补充说你正在循环中增加$s0(使用j作为循环)。

+0

如果您不想覆盖$ s0,只需使用另一个通用寄存器来遍历数组。 – 2009-11-10 19:11:00

+0

好主意!我一直试图使用寄存器来存储偏移量,但根据我的理解,这不是有效的MIPS。总是使用0偏移量,而是增加寄存器本身似乎是要走的路。 我会试试看! – Aaron 2009-11-10 19:15:32

+0

像魅力一样工作,将整个混乱转化为大约10-12行,可以为我的其他输出重用,在我完成程序功能后将继续重构。 – Aaron 2009-11-11 03:07:01