为了能够理解您必须在汇编级别实现什么,您应该做的第一件事是理解高级算法。为什么?
- 您可以更轻松地及时查看所有案例和边缘案例!
- 回顾一下我一直在尝试做什么?正在编写程序集版本。
- 快速查看您(肯定)需要哪些变量。
我写了以下程序(原谅我,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、$ra 和jr 调用来转到“函数”或subroutines。 (搜索)
- 合二为一,可以调用其他函数using the stack。 (搜索)