Корпус переключателя Mips Assembly

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

     .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

person pyfs    schedule 26.11.2018    source источник
comment
так что он сейчас делает/не делает?   -  person lostbard    schedule 26.11.2018
comment
Это не с большой буквы, потому что это не реализовано в программе. Мой вопрос в том, что нужно написать, чтобы добавить эту функциональность на основе того, что уже закодировано.   -  person pyfs    schedule 26.11.2018
comment
xor с 0x20 — это обычный способ перевернуть регистр. Вам нужна только одна подпрограмма и одна условная ветвь без знака, чтобы проверить, является ли байт буквенным, а затем XOR. Или сделайте его безветвящимся с помощью sub+sltu / shl / xor, чтобы вы использовали xor с 0x20 или 0 для неалфавитного. См. Как получить доступ к массиву символов и изменить строчные буквы на прописные и наоборот для версии x86 с большим количеством текста, который объясняет алгоритм проверки/исключения.   -  person Peter Cordes    schedule 26.11.2018
comment
или, если вы хотите, чтобы это было действительно просто, нижний регистр в верхнем регистре просто добавляет 32 вместо вычитания - так что почти дубликат уже существующего раздела кода   -  person lostbard    schedule 26.11.2018


Ответы (1)


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

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

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

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

person lostbard    schedule 26.11.2018
comment
Только $at (Assembler Temporary) используется псевдоинструкциями в качестве временной регистрации. $t0 затираются вызовы в соглашении о вызовах, но они не затираются асинхронно или какими-либо псевдоинструкциями. Плюс sb с режимом адресации symbol(register) в MARS или SPIM может собираться в одну инструкцию; Я думаю, что они по умолчанию связываются со статическими адресами в младших 16 битах виртуального адресного пространства, в пределах диапазона режима адресации imm16(reg) MIPS. В противном случае да, sb и lb могут разбить $at. - person Peter Cordes; 26.11.2018
comment
Что вы предлагаете тогда? Я использую только то, чему научился у своего инструктора... Спасибо! - person pyfs; 26.11.2018
comment
@lostbard: Я думаю, вы сами это заметили и удалили этот абзац, пока я печатал свой комментарий. - person Peter Cordes; 26.11.2018
comment
да, я сам затер регистр, когда запускал код - person lostbard; 26.11.2018
comment
@lostbard: я ломал голову, пытаясь сделать это, хотя вы сделали это очень простым. Я очень новичок. Определенно нужно больше практиковаться. Спасибо! - person pyfs; 26.11.2018