首页 > 解决方案 > 对这个 MIPS 作业的要求感到困惑

问题描述

我不是在寻求解决方案,但我对他们的要求完全迷失了。谁能向我解释他们在寻找什么?

在 MIPS/QTSPim 中,编写一个子程序 convert_number 将具有 C 样式整数文字的字符串转换为值。实现一个主程序,提示用户输入两个 C 风格的无符号数字,调用 convert_number 将字符串转换为其数值,并输出数字的总和。

转换数字(字符串,eos)

  • 字符串包含格式良好的 C 风格文字(数字)
  • eos是字符串结尾的字符返回值:

  1. C 风格的整数:
    • 一个。十进制数以数字 1 .. 9 开头,后跟数字 0 .. 9
    • 湾。八进制数以数字 0 开头,后跟数字 0 .. 7
    • C。十六进制数以 0x 开头,后跟数字 0 .. 9, a .. f,其中 a=10, ..., f=15
  2. 最大输入为 10。使用读取字符串syscall获取输入。
  3. 不需要错误处理,例如。基数的无效数字,而不是数字,x 和 a..f 不是小写字母
  4. 必须使用正确的子程序调用约定。

标签: mipsqtspimspim

解决方案


这个问题似乎很简单 - 将数字作为字符串读取并将它们转换为整数并将它们相加。您的 convert_number 函数需要处理十进制、八进制或十六进制数字。首先,您将阅读第一个字符 - 如果它是 1..9 之间的数字,则为十进制。否则,读取第二个字符并检查它是否是“x”或不是在八进制和十六进制之间做出决定。将数字的基数保存base在变量中。

要将字符串转换为十进制:

  1. 初始化number = 0
  2. 读其中一个digit数字。如果digit读取为\0,则退出。否则,将 ASCII 数字转换为0...9.
  3. number *= base
  4. number += digit
  5. 去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 中,编写函数的约定是将函数的参数放入寄存器$a0to $a3(我们$a0这里用来发送字符串地址)。通常使用$v0and返回值$v1(这里$v0返回转换后的数字)。有哪些函数保留哪些寄存器的约定,但这在这里并没有真正发挥作用,因为我们并没有真正使用嵌套函数。


推荐阅读