似乎我对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
例如,这只是一个无限循环。 (抱歉没有评论,我只是在这里撕扯我的头发)
现在,我认为这个问题与换行符相关,但我不知道在哪里?
答案 0 :(得分:0)
您使用j
而不是jal
是否有理由?看来你正在使用SPIM,它有很多问题。
在你的pop循环中,你正在比较(在beq
中)换行符的地址(在$t5
中)和字符串中下一个字符的地址。即使它们可能包含包含"\n"
的位置的地址,但地址可能也不相同,因为"\n"
可能位于多个位置。事实上,我可以保证它们永远不会相同,因为一个将引用捕获的字符串的地址,而$t5
中的一个将是程序开头的那个地址。 / p>