【问题标题】:How does SPIM deal with incorrect types when reading from console?从控制台读取时,SPIM 如何处理不正确的类型?
【发布时间】:2014-07-19 04:15:58
【问题描述】:

我正在创建一个 MIPS 模拟器,并且遇到了一个我认为有多种解决方案的点。 SPIM 使用系统调用操作模拟从控制台读取。我以前使用过 SPIM,但目前无法访问它。从控制台读取时如何处理不正确的类型?例如,如果您对 read_int 进行系统调用,然后输入“asdf”然后按 Enter,会发生什么?应该发生什么? SPIM 参考表明它从行中读取一个整数,并忽略该整数之后的任何内容,这只是第一个数字序列的正则表达式匹配。当首先有非数字,然后是数字,然后是更多的非数字时会发生什么?没有数字怎么办?

我不希望重新创建 SPIM,我想我会得到社区的建议,说明他们希望 MIPS 模拟器在输入错误类型时如何执行。

需要考虑的一些可能的输入:
1234(正确)
a1234(这应该怎么做?)
a1234b(这应该怎么做?)
ab(这应该怎么做?)
(按 Enter 应该做什么?)

谢谢!

【问题讨论】:

    标签: assembly mips simulator system-calls spim


    【解决方案1】:

    为了回答这个问题,我查看了spimsourcecode。它不是那么大,所以很容易找到syscall.c,它说READ_INT_SYSCALL 是使用atol 实现的。

    atol 上的文档可以在 anywhere on the internet 或您的系统手册中找到,但为了完整起见:

    说明

    atoi() 函数将 nptr 指向的字符串的初始部分转换为 int。行为与

    相同

    strtol(nptr, NULL, 10); 除了 atoi() 没有检测到错误。

    atol() 和 atoll() 函数的行为与 atoi() 相同,只是它们将字符串的初始部分转换为其返回类型 long 或 long long。 atoq() 是 atoll() 的过时名称。

    返回值

    转换后的值。

    我意识到这并不能真正回答您的问题,因为事实证明 atoi 的行为或多或少是未定义的。您可以查看 POSIX 标准 here,其中说“如果无法表示值,则行为未定义”或查看 SO answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2011-05-15
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      相关资源
      最近更新 更多