mips - 对这个 MIPS 作业的要求感到困惑
问题描述
我不是在寻求解决方案,但我对他们的要求完全迷失了。谁能向我解释他们在寻找什么?
在 MIPS/QTSPim 中,编写一个子程序 convert_number 将具有 C 样式整数文字的字符串转换为值。实现一个主程序,提示用户输入两个 C 风格的无符号数字,调用 convert_number 将字符串转换为其数值,并输出数字的总和。
转换数字(字符串,eos)
- 字符串包含格式良好的 C 风格文字(数字)
- eos是字符串结尾的字符返回值:
- C 风格的整数:
- 一个。十进制数以数字 1 .. 9 开头,后跟数字 0 .. 9
- 湾。八进制数以数字 0 开头,后跟数字 0 .. 7
- C。十六进制数以 0x 开头,后跟数字 0 .. 9, a .. f,其中 a=10, ..., f=15
- 最大输入为 10。使用读取字符串
syscall
获取输入。- 不需要错误处理,例如。基数的无效数字,而不是数字,x 和 a..f 不是小写字母
- 必须使用正确的子程序调用约定。
解决方案
这个问题似乎很简单 - 将数字作为字符串读取并将它们转换为整数并将它们相加。您的 convert_number 函数需要处理十进制、八进制或十六进制数字。首先,您将阅读第一个字符 - 如果它是 1..9 之间的数字,则为十进制。否则,读取第二个字符并检查它是否是“x”或不是在八进制和十六进制之间做出决定。将数字的基数保存base
在变量中。
要将字符串转换为十进制:
- 初始化
number = 0
。 - 读其中一个
digit
数字。如果digit
读取为\0
,则退出。否则,将 ASCII 数字转换为0...9
. number *= base
number += digit
- 去2
一旦你有了这个convert_number
函数,你需要做的就是使用它来按照这些思路编写程序。
.data
array: .space 1024
.text
main:
# input & convert string 1
li $v0, 8
la $a0, array
li $v0, 1024
syscall
jal convert_number
move $t0, $v0
# input & convert string 2
li $v0, 8
la $a0, array
li $v0, 20
syscall
jal convert_number
move $t1, $v0
# add numbers and print
addi $a0, $t0, $t1
li $v0, 1
syscall
# exit
li $v0, 10
syscall
在 MIPS 中,编写函数的约定是将函数的参数放入寄存器$a0
to $a3
(我们$a0
这里用来发送字符串地址)。通常使用$v0
and返回值$v1
(这里$v0
返回转换后的数字)。有哪些函数保留哪些寄存器的约定,但这在这里并没有真正发挥作用,因为我们并没有真正使用嵌套函数。
推荐阅读
- reactjs - 如何在材质 UI 中使用 withStyles 覆盖引导类
- excel - 索引匹配 与多个条件匹配
- html - 从 HTTP 迁移到 HTTPS
- ms-access - 通过复制现有表的结构创建 Access 表
- javascript - 连续加载localhost:3000
- reactjs - “错误:您试图在一个本应不可变且已被冻结的对象上设置键 `latitude` 的值为 `37.785834`。”
- node.js - 是否有任何功能可以为集合中的所有现有 mongodb 对象添加新属性
- javascript - 如何检查 Cloud Firestore 集合中的所有文档中是否存在字段值?
- java - Spring MVC 从 JSP 中的表单在 @Controller 中创建一个对象
- python - 使用 numpy 摆脱循环