string - MIPS 问题 : Returning ($v0), 参数、jal 和 jr $ra(包含代码)

标签 string assembly mips infinite-loop mars-simulator

所以我一直在各个网站之间跳来跳去(像这样的网站确实帮助了我:http://www.cs.uiuc.edu/class/fa05/cs232/html/L4.pdf),但我似乎无法以最简单的方式找到我的答案。 (奇怪的是,我在 MARS 中使用 MIPS 进行编码并不太差劲,我只是不太了解这个概念。我实际上对语言本身非常了解,或者我想是这样。在意识到自己陷入这样的困境后,我想说我没那么自信。哈哈。)

我想了解 MIPS 中的返回。我知道有两个返回寄存器($v0、$v1),但大多数时候它们最终会在结束时被“破坏”/覆盖做一个系统调用什么的。为什么这有帮助呢?

另一个问题,参数存储在$a0-$a3寄存器中。然而,它们也经常在打印和此类系统调用中被覆盖。为什么会这样呢? 如何将原始参数存储在一个寄存器中(例如 $a0),但当我想打印出来时,我必须覆盖它?

所以,我的困难在于:我正在为我的 CptS 260 类(class)做一些家庭作业,而且我正在做一个非常简单的项目。 我正在创建一个计算字符串长度的函数。 这是:

.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

我已经看过这个:( string length for mips assembly ) 并从中得到了一些想法。 然而,我的决定在我标记为无限循环的片段上无限循环。为什么会这样呢?我需要为此使用堆栈吗?

此外,我的老师通过绕过我的主要 block 并创建他自己的 block 来对这些项目进行评分。大致来说,他通过插入不同的参数来执行一堆不同的测试用例。他还希望我们返回 $v0 作为长度的答案。我会做一个简单的事情吗:将 $v0, $t0 (我将字符串的长度移动到返回寄存器的位置)移动到我的一个 block 的末尾?它必须位于“main:”之外的代码中,因为他绕过了我的。

编辑:这只是我整个项目中多项任务中的一项。稍后,我必须包含这个项目并将其合并到我正在编写的另一个项目中。 (具体来说,是一个回文检查器。)那么现在开始使用 $sp 和堆栈会更好吗?

如有任何帮助,我们将不胜感激!即使只是一个知识简报。如果我说得不够具体,欢迎提问!

非常感谢您抽出时间!

-CozmoNaught

最佳答案

首先记住,对于函数调用,您正在处理堆栈(例如在 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 行不需要的行,它们创建了一个无限循环(您无限地调用并返回同一地址)。

关于string - MIPS 问题 : Returning ($v0), 参数、jal 和 jr $ra(包含代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22311689/

相关文章:

c# - string.Concat 11 次重载的原因

python 密码检查器 : numbers and symbols

c - `atomic_compare_exchange_strong_explicit()` -- 当不相等时,`success` 和 `failure` 参数的各种组合会做什么?

c# - 从 C# 中的 BinaryReader 读取字符串不读取第一个字节

Linux Shell 脚本 - 带通配符的字符串比较

programming-languages - 世嘉 MD/Genesis 游戏最初是用什么语言和工具开发的?

assembly - iretq 抛出 GP 错误

mips - 使用多个 mips 参数 >4

go - 在mips64le下使用cgo构建静态库

c - MIPS 汇编 - 字符串 (ASCII) 指令