Assembly 程序集MIPS:检查字符串是否为回文
回文是一个可以双向读取的字符串。比如“雷达”,“哇”等等 从C中我们知道,我们可以使用“for”循环和“if”表达式检查给定字符串:Assembly 程序集MIPS:检查字符串是否为回文,assembly,mips,Assembly,Mips,回文是一个可以双向读取的字符串。比如“雷达”,“哇”等等 从C中我们知道,我们可以使用“for”循环和“if”表达式检查给定字符串: for(i=0; i<length; i++) if(str[i] == str[length-i-1]) printf("Palindromic"); else print("Non Palindromic"); for(i=0;i正确有效的C版本: bool is_palindrome(const char * st
for(i=0; i<length; i++)
if(str[i] == str[length-i-1])
printf("Palindromic");
else
print("Non Palindromic");
for(i=0;i正确有效的C版本:
bool is_palindrome(const char * str, const size_t length) {
const char * frontptr = str; // front pointer: points at the very first character of string
const char * backptr = str + length-1; // back pointer: points at the very last character of string
while (frontptr < backptr) { // while front pointer points ahead of back pointer
if (*frontptr != *backptr) return false; // characters differ => not a palindrome
++frontptr; // move front pointer at next character in string
--backptr; // move back pointer at "next" character toward start of string
}
// front pointer points at/beyond back pointer
// all chars were compared (except middle one for odd length string, which is "palindromic" always)
// and all were equal, thus the input string is a palindrome, if this point is reached
return true;
}
如何在ASM中递增/递减指针:将指向的元素的大小添加到指针的当前值
对于ASCII字符串,元素是单个字节,因此要前后移动一个字符,必须在指针上添加+1/-1,如:
addi $a0,$a0,1 # ++byte_ptr
addi $a1,$a1,-1 # --byte_ptr
如果使用单词数组,则需要执行+-4将指针前后移动一个元素
并学习如何使用,这样您就可以创建一些通用的“获取字符串长度”代码,然后通过简单的复制/粘贴重新使用它(除非您最终创建了自己的库)
也可以将回文测试作为单独的程序来完成,如果你遵循C++的例子。
总的来说,您将有一个更简单的代码来维护+调试+原因:
# input string
# prepare arguments for get_length
# call get_length
# process result and prepare arguments for is_palindrome
# call is_palindrome
# set a0 to one of the two result strings based on return value
# display string
# exit
指令总数可能稍长一些,因为您将有额外的jal
和jr$ra
行,但它将允许您在编写/调试时专注于较短和较简单的代码部分。无需i
一直到length-1
。有两个指针,其中一个从开始de>str
和另一个位于str+length-1
。然后使用这两个指针读取一对字符,并比较字符。如果字符不相等,则字符串不是回文。如果字符相等,则递增第一个指针,递减第二个指针。如果第一个指针现在大于第二个指针,则返回字符串是回文,您完成了,否则继续。如果第一个指针大于或等于第二个指针,它是回文的-对于奇数长度字符串,这将提前退出1个字符,而不是测试(str[middle]==str[middle])
@Michael这听起来更复杂,我的大脑几乎要烤熟了。@Ped7g我怎样才能改变这一点?首先在抽象层清理算法步骤,检查一下你的length
计算,你有相同的值$t0和$t1,整个循环。一个用作索引,另一个用作长度计数器。如果你想先看一下它,请看一看在更高的层次上,你可能会意识到它们是相等的,并且只需要其中一个。通过类似的方式,你可以生成更短的asm程序。如果你只写下你得到的第一个想法,你可能会得到很多重复的代码,比如在代码末尾显示字符串。如果你将a0
设置为想要的字符串,你可以使用单个字符串显示并退出的代码路径
addi $a0,$a0,1 # ++byte_ptr
addi $a1,$a1,-1 # --byte_ptr
# input string
# prepare arguments for get_length
# call get_length
# process result and prepare arguments for is_palindrome
# call is_palindrome
# set a0 to one of the two result strings based on return value
# display string
# exit