所以我一直在从一个站点跳到另一个站点(像这样的站点真的帮助了我:http ://www.cs.uiuc.edu/class/fa05/cs232/html/L4.pdf )但我似乎不能以最简单的方式找到我的答案。(奇怪的是,我对在 MARS 中使用 MIPS 进行编码并不太习惯,我只是不太了解这个概念。我实际上对语言本身非常了解,或者我想这样想。在意识到我被困在这样的事情上之后,我想说我没有那么自信。哈哈。)
我想了解返回 MIPS。我知道有两个返回寄存器($v0,$v1),但大多数情况下,当您最终执行系统调用或其他操作时,它们最终会被“破坏”/覆盖。为什么这有帮助?
另一个问题,参数存储在 $a0-$a3 寄存器中。然而,它们也经常在打印和此类系统调用中被覆盖。为什么会这样?如何将原始参数保存在一个寄存器中(例如 $a0),但当我想打印它时,我必须覆盖它?
所以,我的困难在于:我正在为我的 CptS 260 课程做一些家庭作业,而且我正在做一个非常简单的项目。我正在创建一个计算字符串长度的函数。 这里是:
.data
string: .asciiz "hello"
message: .asciiz "The string length is: "
.text
main: # ** The test case! **
la $a0, string
jal strlen
li $v0, 4 # Prints the message for the string length
la $a0, message
syscall
li $v0, 1 # Moves the length of the string to $a0, to print.
move $a0, $t0
syscall
li $v0, 10 #Exit
syscall
strlen:
li $t0, 0 #Initializes counter for len
jal loop
jr $ra #Infinitely Loops here when compiled.
loop:
lbu $t1, 0($a0)
beqz $t1, done # Branches to "done" at the null character.
addi $a0, $a0, 1 #increment character
addi $t0, $t0, 1 #increment counter
j loop
done:
jr $ra
我已经看过这个:(mips 程序集的字符串长度)并从中获得了一些想法。然而,我的决定在我标记为无限循环的段上无限循环。为什么会这样?我需要为此使用堆栈吗?
此外,我的老师绕过我的主要模块并创建自己的项目来对这些项目进行评分。这大致是他通过插入不同的参数来做一堆不同的测试用例。他还希望我们返回 $v0 作为长度的答案。我会做一个简单的:在我的一个块的末尾移动 $v0, $t0 (我将字符串的长度移动到返回寄存器的位置)?它必须在“main:”之外的代码中,因为他绕过了我的。
编辑:这只是我整个项目中的多项任务。稍后,我将不得不包含这个项目并将其合并到我正在编写的另一个项目中。(特别是回文检查器。)那么现在开始使用 $sp 和堆栈会更好吗?
任何帮助,将不胜感激!甚至只是一个知识简报。如果我不够具体,请随时提出问题!
非常感谢您的宝贵时间!
-CozmoNaught