Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 程序集MIPS:检查字符串是否为回文_Assembly_Mips - Fatal编程技术网

Assembly 程序集MIPS:检查字符串是否为回文

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

回文是一个可以双向读取的字符串。比如“雷达”,“哇”等等

从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 * 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