2015-12-18 2 views
2

Извините, может кто-нибудь мне помочь? Мне нужно преобразовать все строчные буквы, такие как «Привет, как дела?» к «Привет, как?»,Как преобразовать все буквы нижнего регистра в верхние буквы в MIPS Assembly Языковая программа

Вот то, что я до сих пор:

.data 
firsttyped: .asciiz "" 
newline: .asciiz "\n" 

.text 
main: 
    li $v0, 8 
    li $a1, 20 
    la $a0, firsttyped 
    syscall 

    li $v0, 4 
    li $t0, 0 

loop: 
    lb $t1, firsttyped($t0) 
    beq $t1, 0, exit 
    sub $t1, $t1, 32 
    sb $t1, firsttyped($t0) 
    addi $t0, $t0, 1 
    j loop 


exit: 
    li $v0, 4 
    la $a0, firsttyped 
    syscall 

    li $v0, 10 
    syscall 

Может кто-то помочь мне в этом, пожалуйста? Мне нужно предотвратить эту ошибку, чтобы подчеркнуть e.

Кстати, я не понимаю коды psuedo.

+0

Спасибо флюгером, но как я не получаю строчные буквы подчеркнуты е, идущий от конца предложения после того, как он будет напечатан? –

+0

См. Ответ: Я не программист MIPS, но я заметил отсутствие распределения памяти для 'firsttyped'. –

ответ

3

Вы должны:

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

Для этого вы должны: заменить .asciiz "" из firsttyped с:

firsttyped: .space 20 

Добавьте следующие строки после beq $t1, 0, exit

blt $t1, 'a', not_lower 
bgt $t1, 'z', not_lower 

и добавить метку not_lower перед тем addi $t0, $t0, 1:

not_lower:  
+0

gusbro, я все еще получаю сообщение об ошибке после того, как я ввел следующее. –

+0

@APS: какая ошибка и что вы набрали? – gusbro

+0

В комментариях blt и bgt, указывающих, что линия слишком большая. –

1

В качестве альтернативы можно использовать predfined перевод таблица из 256 символов, индексированная по входному значению символа, содержащая переведенное значение символа, большая часть которого будет то же, что и индекс входных символов, за исключением преобразования нижнего регистра в верхний регистр.

Например, xlat_table ['A'] = 'A' (без изменений), в то время как у вас также будет xlat_tbl ['a'] = 'A' (конвертировать в верхний регистр).

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

Используя пример C для частей фактической таблице:

unsigned char xlat_table[256] = { 
    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, // index 0x00 
    0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, // index 0x08 
    ... 
    0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47  // index 0x40 
    ... 
    0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47  // index 0x60 
    ... 
    0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; // index 0xf8 

Так xlat_table [ 'А'] == xlat_table [0x41] == 'А', а xlat_table [ 'а'] == xlat_table [0x61] == 'A'. Все значения == индексы, за исключением [0x61] - [0x7A] == 0x41 - 0x5A, переводятся в нижнем регистре в верхний регистр и не влияют на другие значения.

Моя догадка для трудоемкости

xlattbl .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 
     .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f 
     ... 

     la  %t3,xlatbl 
     ;  $t0 has next byte to translate 
     add  $t0,$t0,$t3 
     lb  $t0,($t0) 
+0

Можете ли вы ввести его в более точный код? Я не люблю коды psuedo. –

2

Вы попробуйте добавить каждую букву в число 32? В таблице Ascii буква «a» - это число 65, а буква «A» - номер 97, поэтому «a» + 32 = «A».

Если вам нужен код, просто спросите, и я напишу его для вас.

Сердечные приветы

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