MIPS: удаление не-буквенно-цифровых символов из строки - PullRequest
3 голосов
/ 20 марта 2010

Я нахожусь в процессе написания программы на MIPS, которая определит, является ли введенная пользователем строка палиндромом. Он имеет три подпрограммы, которые находятся в стадии разработки.
Вот основной блок кода, подпрограммы с соответствующей информацией:

.data
Buffer: .asciiz "                                                                                "  # 80 bytes in Buffer
intro:  .asciiz "Hello, please enter a string of up to 80 characters.  I will then tell you if that string was a palindrome!"
        .text
main:
    li  $v0, 4      # print_string call number
    la  $a0, intro  # pointer to string in memory
    syscall
    li  $v0, 8      #syscall code for reading string
    la  $a0, Buffer #save read string into buffer
    li  $a1, 80     #string is 80 bytes long
    syscall
    li  $s0, 0      #i = 0
    li  $t0, 80     #max for i to reach
    la  $a0, Buffer
    jal stripNonAlpha
    li  $v0, 4      # print_string call number
    la  $a0, Buffer # pointer to string in memory
    syscall
    li  $s0, 0
    jal findEnd
    jal toUpperCase
    li  $v0, 4      # print_string call number
    la  $a0, Buffer # pointer to string in memory
    syscall 

Во-первых, предполагается удалить все не алфавитно-цифровые символы из строки перед рукой, но когда встречается символ, предназначенный для удаления, все символы после этого удаляются.

stripNonAlpha:
    beq $s0, $t0, stripEnd  #if i = 80 end
    add $t4, $s0, $a0       #address of Buffer[i] in $t4
    lb  $s1, 0($t4)     #load value of Buffer[i]
    addi    $s0, $s0, 1     #i = i + 1
    slti    $t1, $s1, 48        #if ascii code is less than 48
    bne $t1, $zero, strip   #remove ascii character
    slti    $t1, $s1, 58        #if ascii code is greater than 57
                    #and
    slti    $t2, $s1, 65        #if ascii code is less than 65
    slt $t3, $t1, $t2       
    bne $t3, $zero, strip   #remove ascii character
    slti    $t1, $s1, 91        #if ascii code is greater than 90
                    #and
    slti    $t2, $s1, 97        #if ascii code is less than 97
    slt $t3, $t1, $t2
    bne $t3, $zero, strip   #remove ascii character
    slti    $t1, $s1, 123       #if ascii character is greater than 122
    beq $t1, $zero, strip   #remove ascii character
    j   stripNonAlpha       #go to stripNonAlpha
strip:
    #add    $t5, $s0, $a0       #address of Buffer[i] in $t5
    sb  $0, 0($t4)      #Buffer[i] = 0
    #addi   $s0, $s0, 1     #i = i + 1
    j   stripNonAlpha       #go to stripNonAlpha
stripEnd:
    la  $a0, Buffer     #save modified string into buffer
    jr  $ra         #return

Во-вторых, предполагается преобразовать все строчные буквы в прописные.

toUpperCase:
    beq     $s0, $s2, upperEnd
    add $t4, $s0, $a0
    lb  $s1, 0($t4)
    addi    $s1, $s1, 1
    slti    $t1, $s1, 97
    #beq    $t1, $zero, upper
    slti    $t2, $s1, 123
    slt $t3, $t1, $t2
    bne $t1, $zero, upper
    j   toUpperCase
upper:
    add $t5, $s0, $a0
    addi    $t6, $t6, -32
    sb  $t6, 0($t5)
    j   toUpperCase
upperEnd:
    la  $a0, Buffer
    jr  $ra

Последняя подпрограмма, которая проверяет, является ли строка палиндромом. У меня проблемы с поиском конца строки, потому что я не уверен, что PC-SPIM использует в качестве символа возврата каретки.

Любая помощь приветствуется, у меня такое чувство, что большинство моих проблем проистекает из чего-то глупого и глупого, поэтому не стесняйтесь указывать на что-либо, независимо от того, насколько оно маленькое.

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Э-э, это действительно старый вопрос, но проблема в том, что вы заменяете не алфавитно-цифровые символы нулевым символом, который завершает строку в этой точке.

0 голосов
/ 20 марта 2010

Вы можете узнать значение, выполнив что-то вроде этого:

syscall to reading a string
mov first value to $2
check the value of $2 with PC-SPIM or a debugger
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...