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

Узнай цену своей работы

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

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

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

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

Объяснение кода листинга программы

  1. Создание сегмента SegStack с резервированием 100h байт в стэке.
  2. Создание сегмента data для хранения данных, включая сообщение Press key F7 to exit... и константу kbF7, которая равна 041h.
  3. Создание сегмента code для исполняемого кода в 16-битной среде.
  4. Загрузка адреса сегмента data в регистр ax и перемещение его в регистр ds.
  5. Вывод сообщения Press key F7 to exit... в стандартный вывод.
  6. Повторение:
    1. Чтение символа с клавиатуры без отображения на экран.
    2. Проверка нажатия на символьную или функциональную клавишу.
    3. Обработка символьной клавиши - перевод символа в верхний регистр и вывод символа на экран.
    4. Повтор цикла если не нажата клавиша F7.
  7. Завершение программы при нажатии F7.
  8. Определение процедуры UpCase, которая переводит символ в верхний регистр.
  9. Внутри процедуры UpCase происходит проверка текущего символа и перевод в верхний регистр.

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы