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

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

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

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

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

textual
Листинг программы
  1. ;---------------------------------------------------------------------------
  2. segment SegStack        stack
  3.         resb    100h
  4. ;---------------------------------------------------------------------------
  5. segment data    public  class=data
  6.  
  7. msgExitKey:     db      'Press key F7 to exit...', 0Dh, 0Ah, '$'
  8.  
  9. kbF7            equ     041h
  10. ;---------------------------------------------------------------------------
  11. segment code    public  class=code      use16
  12. ..start:                        ;метка для компоновщика, указывающая на точку входа
  13. main:
  14.         mov     ax,     data    ; get segment address of data
  15.         mov     ds,     ax      ; and move it into DS
  16.  
  17.         ;вывод сообщения о способе завершения программы
  18.         mov     ah,     09h
  19.         lea     dx,     [msgExitKey]
  20.         int     21h
  21.  
  22. @@Repeat:
  23.         ;чтение символа с клавиатуры без "эха" на экран
  24.         mov     ah,     08h
  25.         int     21h
  26.         ;нажата клавиша символа или функциональная?
  27.         cmp     al,     0
  28.         jne     .ProcessChar    ;символьная - перейти к обработке символа
  29.         ;обработать функциональную клавишу
  30.         mov     ah,     08h     ;чтение расширенного кода функциональной клавиши
  31.         int     21h
  32.         cmp     al,     kbF7    ;нажата клавиша F7?
  33.         jne     @@Repeat        ;нет - перейти к началу цикла
  34.         jmp     .break          ;да  - завершить цикл
  35. .ProcessChar:
  36.         ;обработать символьную клавишу
  37.         call    UpCase          ;перевод в верхний регистр
  38.         mov     ah,     02h     ;вывод символа на экран
  39.         mov     dl,     al
  40.         int     21h
  41.         ;переход на начало цикла
  42.         jmp     @@Repeat
  43. .break:
  44.         ;завершение программы
  45.         mov     ax,     4C00h
  46.         int     21h
  47. ;---------------------------------------------------------------------------
  48. ; Процедуры
  49. ;---------------------------------------------------------------------------
  50.  
  51. ;перевод символа в верхний регистр
  52. ;на входе:
  53. ;  al - символ
  54. ;на выходе:
  55. ;  al - символ в веохнем регистре
  56.         global  UpCase
  57. UpCase:
  58.         cmp     al,     'a'
  59.         jb      .cp866
  60.         cmp     al,     'z'
  61.         ja      .cp866
  62.         add     al,     'A'-'a'
  63.         ret
  64. .cp866:
  65.         кодировке CP866 малые буквы русского алфавита
  66.         ;разделены на несколько диапазонов
  67.         ;'а'...'п' - 0A0h...0AFh
  68.         ;'р'...'я' - 0E0h...0EFh
  69.         ;'ё'       - 0F1h
  70. .cp866_1:
  71.         cmp     al,     0A0h    ;код малой буквы 'a'
  72.         jb      .exit
  73.         cmp     al,     0AFh    ;код малой буквы 'п'
  74.         ja      .cp866_2
  75.         add     al,     080h-0A0h
  76.         ret
  77. .cp866_2:
  78.         cmp     al,     0E0h    ;код малой буквы 'р'
  79.         jb      .exit
  80.         cmp     al,     0EFh    ;код малой буквы 'я'
  81.         ja      .cp866_2
  82.         add     al,     090h-0E0h
  83.         ret
  84. .cp866_3:
  85.         cmp     al,     0F1h    ;код малой буквы 'ё'
  86.         jne     .exit
  87.         mov     al,     0F0h    ;код большой буквы 'Ё'
  88. .exit:
  89.         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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы