2

所以我一直在从一个站点跳到另一个站点(像这样的站点真的帮助了我: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

4

2 回答 2

2

首先请记住,函数调用是在处理堆栈(如在 Java 或 C++ 或大多数 HLL 中),因此就像在任何递归调用中一样,a 和 v 寄存器的值取决于堆栈级别,如果您不想要,则必须保存它们使他们从一个层面失去到另一个层面。

在您的第一个(和第二个)代码中,您将事情复杂化了,您不需要那么多 jr

.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

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

您添加了 2 行不需要的行,它们创建了一个无限循环(您无限地调用并返回相同的地址)。

于 2014-03-11T11:33:20.203 回答
0

实际上,我可能刚刚使用堆栈解决了它。

现在它不会无限循环,它会打印正确的答案!

.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:
addi $sp, $sp, -8 #Storing two values ($v0, and $ra)
sw $ra, 0($sp)
sw $v0, -4($sp)
li $t0, 0       #Initializes counter for len
jal loop

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:
move $v0, $t0
sw $v0, -4($sp) #Replaces the original $v0
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra

我认为这现在是有效的!

于 2014-03-10T22:29:28.650 回答