2010-03-20 5 views
3

Я нахожусь в процессе написания программы в MIPS, которая определит, является ли пользователь введенной строкой палиндром. Он имеет три подпрограммы, которые находятся в стадии разработки.
Вот основной блок кода, подпрограммы следовать с соответствующей информацией: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 использует в качестве символа возврата каретки.

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

ответ

0

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

syscall to reading a string 
mov first value to $2 
check the value of $2 with PC-SPIM or a debugger 
3

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

 Смежные вопросы

  • Нет связанных вопросов^_^