2010-10-28 147 views
0

看來我對MIPS的理解讓我失望了。MIPS調試幫助

我需要做的是創建一個程序,從終端反轉字符串輸入,使用堆棧,但不使用$ sp。有沒有人知道MIPS?

註冊使用

T0 - theString地址開始
T1 - 堆棧地址開始
T2 - 溫度爲檢索出的
T3 - 計數器T0
T4 - 計數器堆棧
T5 - 換行
T6 - 長度

.data 

theString: .space 42 
newLine: .asciiz "\n" 
stack:  .space 42 

.globl main 

.text 

主要:

li  $v0, 8  # Set to read string 
la $a0, theString 
li  $a1, 42  # Set size of string 
syscall   # Read string from terminal 

la  $t0, theString # Prepare t0 with theString 
la  $t1, stack # Prepare t1 with stack 
la $t5, newLine 

addi $t3, $t0, 0 
addi $t4, $t1, 42 

j push 

推:

addi $t3, $t3, 1 
addi $t4, $t4, -1 

lb $t2, ($t3) 
beq $t2, $t5, epush 
sb $t2, ($t4) 

j push 

epush:

sub $t6, $t3, $t0 
addi $t6, $t6, -1 

addi $t3, $t0, 0 
addi $t4, $t1, 0 

j pop 

流行:

addi $t3, $t3, 1 
addi $t4, $t4, 1 

lb $t2, ($t4) 
beq $t2, $t5, epop 
sb $t2, ($t3) 

j pop 

EPOP:

addi $t3, $t3, 1 
sb $t5, ($t3) 


li $v0, 4  # Set to print string 
la $a0, theString # Set var to syscall output register 
syscall   # Print string 

li $v0, 10  # Set to end program 
syscall   # End Program 

例如,這只是一個無限循環。 (對不起評論,我只是把我的頭髮撕在這裏)

現在,我認爲問題是與換行符相關的某個地方,但我不知道在哪裏?

回答

0

是不是有原因使用j而不是jal?看起來你正在使用SPIM,它有許多問題。

在你的pop循環中,你正在比較(在beq)換行符的地址(在$t5)和字符串中下一個字符的地址。即使它們可能包含包含"\n"的位置的地址,但地址可能並不相同,因爲"\n"可能位於多個位置。事實上,我可以保證它們永遠不會是一樣的,因爲我們會引用捕獲到的字符串的地址,並且$t5中的地址將是程序開始處的地址。

+0

啊,那我該如何比較實際換行值和$ t5的值呢? – 2010-10-28 17:48:16

+0

我不知道這是否會起作用,但可以從'$ t5'和'$ t2'嘗試'lb'到另外兩個臨時寄存器中並對它們進行比較。 – xxpor 2010-10-28 17:52:38

+0

謝謝。它現在出現在循環中,但只是打印原始字符串? – 2010-10-28 18:10:07