[Nasm] Программа, меняющая заглавные буквы на строчные - Assembler

Формулировка задачи:

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

Код к задаче: «[Nasm] Программа, меняющая заглавные буквы на строчные - Assembler»

textual
;---------------------------------------------------------------------------
segment SegStack        stack
        resb    100h
;---------------------------------------------------------------------------
segment data    public  class=data
 
msgExitKey:     db      'Press key F7 to exit...', 0Dh, 0Ah, '$'
 
kbF7            equ     041h
;---------------------------------------------------------------------------
segment code    public  class=code      use16
..start:                        ;метка для компоновщика, указывающая на точку входа
main:
        mov     ax,     data    ; get segment address of data
        mov     ds,     ax      ; and move it into DS
 
        ;вывод сообщения о способе завершения программы
        mov     ah,     09h
        lea     dx,     [msgExitKey]
        int     21h
 
@@Repeat:
        ;чтение символа с клавиатуры без "эха" на экран
        mov     ah,     08h
        int     21h
        ;нажата клавиша символа или функциональная?
        cmp     al,     0
        jne     .ProcessChar    ;символьная - перейти к обработке символа
        ;обработать функциональную клавишу
        mov     ah,     08h     ;чтение расширенного кода функциональной клавиши
        int     21h
        cmp     al,     kbF7    ;нажата клавиша F7?
        jne     @@Repeat        ;нет - перейти к началу цикла
        jmp     .break          ;да  - завершить цикл
.ProcessChar:
        ;обработать символьную клавишу
        call    UpCase          ;перевод в верхний регистр
        mov     ah,     02h     ;вывод символа на экран
        mov     dl,     al
        int     21h
        ;переход на начало цикла
        jmp     @@Repeat
.break:
        ;завершение программы
        mov     ax,     4C00h
        int     21h
;---------------------------------------------------------------------------
; Процедуры
;---------------------------------------------------------------------------
 
;перевод символа в верхний регистр
;на входе:
;  al - символ
;на выходе:
;  al - символ в веохнем регистре
        global  UpCase
UpCase:
        cmp     al,     'a'
        jb      .cp866
        cmp     al,     'z'
        ja      .cp866
        add     al,     'A'-'a'
        ret
.cp866:
        ;в кодировке CP866 малые буквы русского алфавита
        ;разделены на несколько диапазонов
        ;'а'...'п' - 0A0h...0AFh
        ;'р'...'я' - 0E0h...0EFh
        ;'ё'       - 0F1h
.cp866_1:
        cmp     al,     0A0h    ;код малой буквы 'a'
        jb      .exit
        cmp     al,     0AFh    ;код малой буквы 'п'
        ja      .cp866_2
        add     al,     080h-0A0h
        ret
.cp866_2:
        cmp     al,     0E0h    ;код малой буквы 'р'
        jb      .exit
        cmp     al,     0EFh    ;код малой буквы 'я'
        ja      .cp866_2
        add     al,     090h-0E0h
        ret
.cp866_3:
        cmp     al,     0F1h    ;код малой буквы 'ё'
        jne     .exit
        mov     al,     0F0h    ;код большой буквы 'Ё'
.exit:
        ret

12   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ