将C ++ Palindrome函数转换为MIPS

时间:2016-02-19 13:42:54

标签: c++ assembly mips

我正在尝试将我在C++中编写的函数转换为MIPS。该函数测试char数组是否为回文结构,字符串中的字符串是对称的(例如:“heeh”和“gtrertg”是回文,“嘿”不是)。在MIPS中,字符串将通过$a0传递,返回值应在$v0中传递。这是我的C++代码:

 #include <iostream>
  using namespace std;

    int palindrome(char s[])
    {
            int j;
            j = 0;
            int i;
            i = -1;
            //finding length of string...
            while(s[i+1] != '\0')
            {
                    i++;
            }
            //while the two opposite chars are equal...
            while(s[j] == s[i])
            {
                    //if the chars are at the same index...
                    if(i == j)
                    {
                            //palindrome
                            return 1;
                    }
                    //if the left index passes the right index...
                    if(j > i)
                    {
                            //palindrome
                            return 1;
                    }
                    //increment left index
                    j++;
                    //decrement right index
                    i--;
            }
            //not palindrome
            return 0;
    }

我已经测试了我的C++代码,它运行得很好。这是我的MIPS代码:

#$a0 contains the address of the string
.data

.text

.globl palindrome

palindrome:
    li        $t0, 0            #j = 0
    li        $t1, -1           #i = -1
    addi      $t2, $a0, 0       #a[0]
L1:     
    addi      $t2, $t2, 1       #a[i + 1]
    addi      $t1, $t1, 1       #i++
    bne       $t2, $zero, L1        #exit loop when '\0' is found
    add       $t2, $a0, $t0     #a[j]
    add       $t3, $a0, $t1     #a[i]
L2A:
    bne       $t1, $t0, If2     #if i does not equal j jump to next if
    j         Return1           #jump to Return1 label                  
If2:        
    ble       $t1, $t0, L2B     #if j<= i, skip if statement
    j         Return1           #jump to Return1 label  
L2B:
    addi      $t0, $t0, 1       #j++
    addi      $t1, $t1, -1      #i--
    beq       $t2, $t3, L2A     #exit loop when a[j] != a[i]
Return1:
    addi      $v0, $zero, 1     #return 1
    j         Exit
Return0:
    addi      $v0, $zero, 0     #return 0
    j         Exit
Exit:
    jr        $ra           #return 

在检查\0字符时确定字符串的大小时,我的第一个循环中出现错误。有人可以帮忙吗?另外,我必须将字符串的字符转换为相同的大小写。我是否需要在开始时使用另一个循环来检查它们的int ASCII表示并根据具体情况将其递增或递减一定数量?如果您发现任何其他错误,包括常规错误,请指出它们。测试palindrome文件的文件已经过错误检查并按预期工作。

0 个答案:

没有答案