MIPS调试帮助

时间:2010-10-28 17:21:29

标签: mips

似乎我对MIPS的理解使我失望。

我需要做的是创建一个程序,使用堆栈反转来自终端的字符串输入,但不使用$ sp。这里有人知道MIPS吗?

注册用法

t0 - 字符串地址开始
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

例如,这只是一个无限循环。 (抱歉没有评论,我只是在这里撕扯我的头发)

现在,我认为这个问题与换行符相关,但我不知道在哪里?

1 个答案:

答案 0 :(得分:0)

您使用j而不是jal是否有理由?看来你正在使用SPIM,它有很多问题。

在你的pop循环中,你正在比较(在beq中)换行符的地址(在$t5中)和字符串中下一个字符的地址。即使它们可能包含包含"\n"的位置的地址,但地址可能也不相同,因为"\n"可能位于多个位置。事实上,我可以保证它们永远不会相同,因为一个将引用捕获的字符串的地址,而$t5中的一个将是程序开头的那个地址。 / p>