【问题标题】:String in MIPS and XSPIM conversionMIPS 和 XSPIM 转换中的字符串
【发布时间】:2014-02-05 00:08:52
【问题描述】:

给定一个字符串,让我们说“长数字”,当我将它插入 ASCII 计算器时,我得到了这个

0x4c 0x6f 0x6e 0x67 0x4e 0x75 0x6d 0x62 0x65 0x72 0x73

1001100110111111011101100111 1001110111010111011011100010110010111100101110011

这是我第一次使用 MIPS,我找不到只教如何使用 MIPS 的指南。

所以,我得到了 32 位,但“长数字”似乎远超过 32 位? 所以让我们说“长数字”在内存中。

如果我想打印“Long Numbers”,该怎么做?

我对地址和数据总线、超过一个字节的数据传输以及由于不打印只占用内存中的一个地址而如何打印感到困惑?

如果数据只是一个字节,我知道如何传输数据。如果不止于此,我会感到困惑。

【问题讨论】:

  • "如果我想打印 "Long Numbers",那将如何工作?" 你可以在字符串中附加一个 NUL 终止符(一个值为 0 的字节),然后使用系统调用号 4 (print_string) 和 $a0 中的字符串地址。

标签: assembly mips mips32 spim


【解决方案1】:

我认为问题在于了解数据实际上是如何存储在内存中的,而不是在使用高级语言时如何抽象数据。从您对字符串如何存储在内存中的困惑来看,我认为您应该从这里开始。

在您在 MIPS 中操作的级别上,没有“字符串”(仅 Zuul)。您习惯于思考它们的方式也没有真正的“int”或“float”。只有位 (1/0) 以标准方式组合在一起,以组成您习惯使用的数据类型。由于您的教授将告诉您的原因,我们使用 8 位组,我们称之为“字节”。

字符串中的每个字符都可以用一个字节表示。查看http://www.asciitable.com/ 以了解如何完成此操作的标准。所以“L”由一串位表示,对应于十六进制值 0x4c,恰好是十进制值 76。

该值存储在 RAM 中的单个字节中。下一个字母('o',由十六进制值 0x6f 表示)存储在下一个连续字节中。下一个字母存储在下一个字节中,一直到最后一个。如果您必须为该连续字节链命名,您可以将其称为“字符串”字符。 :)

正如@Michael 所说,您需要知道以零结尾的 ASCII 字符串(也称为 ASCIIZ 字符串)末尾有一个附加字符。该字符由十六进制值 0x00(普通的旧零)表示,您会看到它被引用为 '\0'。

另一件事。您需要找到更好的 ASCII 到 Hex 转换工具。您使用的那个没有正确处理“空格”字符。一个空格对应于 ASCII 字符 0x20(十进制 32)。如果您忽略它,您的字符串就是“LongNumbers”。如果您尝试将 0x00 放在那里,您的字符串将在“Long”之后结束。

【讨论】:

  • "Long Numbers" 是我理解的 12 个字节?然后打印它查看每个字母“长数字”的内存,但是这些每个字母如何存储在注册表中?如果字符串是“Supercalifragilisticexpialidocious”会怎样
  • “存储在注册表中” - 在这种情况下没有任何意义。也许您的意思是“这串字母如何存储在 32 位寄存器中”?答案是它没有。那里。是。不,字符串!您可以将第一个字节地址存储在寄存器中。或者,您可以将其中一个字节的 存储在寄存器中。您不能将“字符串”存储在寄存器中,因为寄存器不是像您习惯的那样是变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多