Mips Сборка переключателя - PullRequest
       19

Mips Сборка переключателя

0 голосов
/ 26 ноября 2018

Я пытаюсь переключить простой пользовательский текст из нижнего регистра в верхний и наоборот.Пример: «Привет» после запуска становится «Привет», по сути, переключая случаи.В настоящее время программа конвертирует только строчные буквы в верхние.Мой вопрос заключается в том, как осуществить переход от прописных букв к строчным на основе того, что уже написано.Прости меня, если я делаю что-то не так.Я довольно новичок в этом.Вот что у меня сейчас:

     .data
     promp:           .asciiz "Enter string: "
     str:             .space 81
     toogle_msg:      .asciiz "The result is "


     .text
     .globl main 

      main:
                 li $v0,4                   # syscall code to print
                 la $a0,promp               # promp message tag
                 syscall                    # print promp
                 li $v0, 8                  #syscall code to read string
                 li $a1, 81             # space for string          
                 la $a0, str                # str message tag
                 syscall                    # print

                 li $v0, 4
                 li $t0, 0

      loop:
                 lb $t1, str($t0)       
                 beq $t1, 0, exit           # go to exit if $t1=0
                 blt $t1, 'a', case     # go to case if $t1>a 
                 bgt $t1, 'z', case     # go to case if $t1<z
                 sub $t1, $t1, 32           # subtract 32 and save in $t1
                 sb $t1, str($t0)

      case: 
                 addi $t0, $t0, 1
                 j loop                 # go to loop

      exit:     
                 li $v0,4                   # syscall code to print
                 la $a0,toogle_msg          # toogle message tag
                 syscall                    # print toggle_msg
                 li $v0, 4                  # syscall code to print
                 la $a0, str                # str message tag
                 syscall                    # print str

                 li $v0, 10             # syscall code to exit
                 syscall                    # exit

1 Ответ

0 голосов
/ 26 ноября 2018

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

Использование существующих и добавление минимальных изменений:

loop:
      lb $t1, str($t0)      
      beq $t1, 0, exit      # go to exit if $t1=0
      blt $t1, 'a', not_l_case      # go to case if $t1>a 
      bgt $t1, 'z', not_l_case      # go to case if $t1<z
      sub $t1, $t1, 32      # subtract 32 and save in $t1
      sb $t1, str($t0)
      j next_char
not_l_case: 
      blt $t1, 'A', not_u_case      # go to case if $t1>A 
      bgt $t1, 'Z', not_u_case      # go to case if $t1<Z
      add $t1, $t1, 32      # add32 and save in $t1
      sb $t1, str($t0)
not_u_case:
next_char:
      addi $t0, $t0, 1
      j loop

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

...