【问题标题】:Substring question on mips assembly language关于 mips 汇编语言的子字符串问题
【发布时间】:2020-10-07 04:40:27
【问题描述】:

请尽快帮助... 编写一个 MIPS 汇编语言程序,提示用户输入两个字符串(每个字符串不应超过 50 个字符,包括空终止符)。您的程序应该确定第二个字符串是否是第一个字符串的子字符串。如果是,那么您的程序应该打印出第一个索引,其中第二个字符串出现在第一个索引中。例如,如果第一个字符串是“Hello World”,第二个字符串是“lo”,那么程序应该打印出 3,即“lo”在“Hello World”中的起始索引。如果第二个字符串不包含在第一个字符串中,那么您的程序应该打印出 -1。

【问题讨论】:

  • 到目前为止您尝试过什么?如果您不知道从哪里开始,请逐步简化程序并使用函数和跳转语句将其递增;因为现在它对你来说似乎过于复杂。例如,您可以从打印 -1 开始,添加更多内容,然后在遇到实际代码时返回。我们不只是为您提供解决方案,因为您不会从中学习。
  • 此外,对于任何算法,例如在字符串中查找子字符串,您都应该使用 C 或 python(或您目前所见的任何语言)来编写它们。将算法转换为 C 代码然后转换为 MIPS 要容易得多。如果您将其留在 cmets 中,它甚至会对您有所帮助,因此您可以快速了解程序应该做什么。
  • 我开始接受输入.. 然后读取两个字符串,之后我需要一点线索
  • 你能用C或其他非汇编语言做吗?
  • 然后您可以继续测试子字符串的第一个字符是否出现在主字符串中。如果您真的无法重现该算法,您可以查看下面的答案,但请先尝试自己,因为在测试中,您也无法寻求我们的帮助。如果你没见过python或C,恐怕我们帮不了你。

标签: mips mips32 mips64


【解决方案1】:

为了能够理解您必须在汇编级别实现什么,您应该做的第一件事是理解高级算法。为什么?

  • 您可以更轻松地及时查看所有案例和边缘案例!
  • 回顾一下我一直在尝试做什么?正在编写程序集版本。
  • 快速查看您(肯定)需要哪些变量。

我写了以下程序(原谅我,python 对我来说已经有一段时间了):

def is_in_string_1(string, substring):
    """
        aaba: a, b, ab, ba, aba (last one will fail)
    """
    length = len(string)
    sublength = len(substring)

    if (sublength == 0):
        return True

    j = 0
    for i in range(0, length):
        if string[i] != substring[j]:
            j = 0
        else:
            j += 1
            if j == sublength:
                return True
    return False

def is_in_string_2(string, substring):
    """
        aaba: a, b, ab, ba, aba
    """
    length = len(string)
    sublength = len(substring)
    for i in range(0, length + 1 - sublength):  # string: aabc; substring: c; length: 4; sublength: 1; indexes: 0,1,2,3;
        is_substring = True
        for j in range(0, sublength):           # for the sake of the algorithm, no slicing here
            if string[i+j] != substring[j]:
                is_substring = False
                break
        if is_substring:
            return True
    return False
 
stringTuples = [
    ("aaa", "aa"),
    ("aaa", "aaa"),
    ("aaa", "aab"),
    ("abc", "bc"),
    ("abc", "a"),
    ("abc", "abc"),
    ("aaa", ""),
    ("aaa", "b")
]

for stringTuple in stringTuples:
    print(
        stringTuple[0],
        stringTuple[1],
        ':',
        is_in_string_1(stringTuple[0], stringTuple[1]),
        is_in_string_2(stringTuple[0], stringTuple[1]),
        sep='\t'
    )

我首先认为我可以优化标准解决方案 (is_in_string_2),省略第二个 for 循环 (is_in_string_1),但经过一番思考后我发现它会失败(边缘情况不是即使在我的任何测试数据中!) - 所以我把它作为一个例子来说明你使用正确的算法是多么重要。

程序产生以下输出:

aaa     aa      :       True    True
aaa     aaa     :       True    True
aaa     aab     :       False   False
abc     bc      :       True    True
abc     a       :       True    True
abc     abc     :       True    True
aaa             :       True    True
aaa     b       :       False   False
aaba    aba     :       False   True

注意所有输出都是正确的,除了最后一行,第一个算法是错误的。

在您继续之前:

  • 你必须在 MIPS 中创建自己的len() 函数;请注意,所有字符串(如果我没记错的话)都是空终止的,因此您必须计算字符串的所有非空字符,或者换句话说,计算空终止符之前的字符数。
  • 您应该使用j$rajr 调用来转到“函数”或subroutines。 (搜索)
  • 合二为一,可以调用其他函数using the stack。 (搜索)

【讨论】:

  • 在 python 中我可以做到,但玩寄存器很难
  • 当然这需要更多的代码,因为你在低级别工作,但你应该能够这样做。您需要将 python 算法转换为 mips 代码,所以正如我所说,您必须先创建自己的函数来查找字符串的长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多