Язык ассемблера: печать строчных букв в верхний регистр - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть задание, которое описывается примерно так:

- Reads printable characters (20h-7Fh) from the keyboard without echoing
- Uppercase letters are printed to display
- Lowercase letters are converted to uppercase and then printed to display
- Blank spaces and periods are printed to display; everything else is trashed
- Program ends when period is printed

Моя программа до сих пор такова:

    .model      small
    .8086


    .data


    .code

start:
        mov     ax,@data
        mov     ds,ax

read:
        mov     ah,8
        int     21h
        cmp     al,61
        jl      write
        cmp     al,7fh
        jg      read
        sub     al,20h
        jmp     write

write:      cmp     al,20h
        jl      read
        mov     dl,al
        mov     ah,2
        int     21h
        cmp     dl,2eh
        jne     read

exit:
        mov     ax,4c00h
        int     21h
        end     start

Моя программа успешно преобразует строчные буквы и печатает соответствующие заглавные буквы, но у меня проблемы с уничтожением всего остального.Каков наилучший способ пропустить на дисплей только пробелы, точки и буквы?

Глядя на диаграмму ASCII,

21h - 2Dh can be trashed
2Fh - 40h can be trashed
5bh - 60h can be trashed
7bh - 7fh can be trashed

Может ли кто-нибудь помочь мне найти лучшеелогика для сравнения входных данных с этими значениями, а затем уничтожить те, которые попадают в диапазон выше?Мы оцениваем эффективность, с 0-20 написанными инструкциями награждены полным кредитом.У меня уже есть 20 инструкций, и я не включил сравнения, чтобы найти значения мусора.

РЕДАКТИРОВАТЬ
Вот что я сузил свой код до:

    .model      small
    .8086


    .data


    .code


read:
        mov     ah,8
        int     21h
        cmp     al,' '
        je      write
        cmp     al,'.'
        je      write
        cmp     al,'a'
        jl      read
        cmp     al,'Z'
        jg      convert

convert:    
        cmp     al,'a'
        jl      read
        sub     al,20h

write:      
        mov     dl,al
        mov     ah,2
        int     21h
        cmp     dl,'.'
        jne     read

exit:
        mov     ax, 4c00h
        int     21h
        end     read

В настоящее время 21 инструкция!Есть ли в моем коде избыточность, которую можно удалить, чтобы уменьшить ее до 20?

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

Я думаю, вы можете сохранить некоторые инструкции, выполнив что-то вроде этого:

read:
if lowercase then make uppercase
if uppercase then print
if space then goto print
if period then quit
goto read

print:
do the print
goto read
0 голосов
/ 06 февраля 2017

СТРУКТУРА КОДА ОБРАЗЦА ОБРАЗЦА НАЗВАНИЯ. МОДЕЛЬ МАЛЕНЬКАЯ .STACK. ДАННЫЕ

MSG1 DB "ВВЕДИТЕ БУКВУ: $" MSG2 DB 10, "ПИСЬМО В ВЕРХНЕМ МЕСТЕ: $" MSG3 DB 10, "[PRESSЛЮБОЙ КЛЮЧ ДЛЯ ПРОДОЛЖЕНИЯ] $ "

.CODE MOV AX, @ DATA MOV DS, AX MOV ES, AX balik: MOV AX, 3 INT 10H

; ---------------------- ВАШЕ ИСПОЛНЕНИЕ КОДА НАЧИНАЕТСЯ ЗДЕСЬ -------------------

MOV AH, 9LEA DX, MSG1 INT 21H

MOV AH, 1 INT 21H

И AL, 00DFH

MOV AH, 9 LEA DX, MSG2 INT 21H

MOV AH, 2 MOV DL, AL INT 21H

MOV AH, 9 LEA DX, MSG3 INT 21H

MOV AH, 1 INT 21H

MOV BL, AL

CMP BL, 27 JE TAPOS JMP balik

TAPOS:

; ------------------------------- КОНЕЦ КОДОВ ---------------------------------- MOV AH, 4CH INT21H END

0 голосов
/ 27 сентября 2011

Я бы настроил таблицу для соответствующих значений 20..7f, установил флаги для каждого диапазона и позже использовал каждый входной байт - 20h в качестве индекса в таблице.

0 голосов
/ 27 сентября 2011

Вы можете изменить свою логику, чтобы сделать что-то вроде:

  • если пробел или точка, перейти к write
  • Сложите строчные буквы на прописные
  • если не заглавная буква, вернитесь к read

Обратите внимание, что «заглавные буквы в верхний регистр» не должны проверять, была ли введенная буква первой. Просто and xx, где xx - подходящее значение, должно это сделать (я позволю вам разобраться со значением). Этот шаг также изменяет символы, отличные от букв, но поскольку следующий шаг - проверка на букву, это не имеет значения.

...