2014-11-04 2 views
1

Я пытаюсь написать программу MIPS, которая проверяет, является ли входная строка палиндром. Я протестировал строку «HelllleH», и, пройдя через программу, я увидел, что во время первого цикла PAL_CHECK t0 = 0, но t1 = 104. Логически t0 = 0 и t1 = 0 также в первом цикле. Может кто-нибудь сказать, что случилось в этой программе?MIPS Palindrome Check

# a0 is input 
# a1 is current character we are looking at 
# a2 is length of string 
# t0 is character at beginning of string 
# t1 is character at end of string 
# v0 stores whether string is palindrome or not (0 for false, 1 for true) 

ispalindrome: 
    addi $a2, $0, 0 # length counter 

FIND_LEN: 
    lbu   $a1, 0($a0) # load character into $a1 
    beq   $a1, $0, PAL_CHECK # Break if string is at the end 
    addi $a2, $a2, 1 # increment counter 
    addi $a0, $a0, 1 # increment str address 
    j  FIND_LEN 

PAL_CHECK: 
    # Is palindrome if length is less than 2 
    slti $t0, $a2, 2 
    bne   $t0, $0, RETURN_TRUE 

    # Check first and last chars to see if they are the same 
    lbu   $t0, 0($a0) # first char is t0 
    add   $t1, $a2, $a0 # last char is t1 
    lbu   $t1, 0($t1) 
    bne   $t0, $t1, RETURN_FALSE # if they are not equal, return false 

    # continue recursion 
    addi $a2, $a2, -2 
    addi $a0, $a0, 1 
    j  PAL_CHECK 

RETURN_FALSE: 
    addi $v0, $0, 0 
    jr   $ra 

RETURN_TRUE: 
    addi $v0, $0, 1 
    jr   $ra 

ответ

3

Хотя найти длину строки, которую вы постоянно увеличиваем $a0, чтобы указать на следующий символ, пока вы не найдете терминатор NUL в конце строки. Вы никогда не перезагружаете $a0 перед циклом проверки палиндрома, поэтому он все же указывает на терминатор NUL, когда вы начинаете этот цикл. Таким образом, вы фактически будете сравнивать данные, которые находятся за вашей строкой.

Было бы больше смысла осуществлять проверку таким образом (я использую C, чтобы проиллюстрировать эту идею, я оставлю перевод MIPS к вам):

a0 = the_string; 
a1 = the_string + strlen(the_string) - 1; 
while (a1 > a0) { 
    if (*a0 != *a1) return false; 
    a0++; 
    a1--; 
} 
return true; 

Кстати , терминология nitpick: # continue recursion. Ваша реализация не рекурсивна, она итеративна.