2009-11-10 22 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