[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
Объяснение кода листинга программы
- Создание сегмента
SegStack
с резервированием 100h байт в стэке. - Создание сегмента
data
для хранения данных, включая сообщениеPress key F7 to exit...
и константуkbF7
, которая равна 041h. - Создание сегмента
code
для исполняемого кода в 16-битной среде. - Загрузка адреса сегмента
data
в регистрax
и перемещение его в регистрds
. - Вывод сообщения
Press key F7 to exit...
в стандартный вывод. - Повторение:
- Чтение символа с клавиатуры без отображения на экран.
- Проверка нажатия на символьную или функциональную клавишу.
- Обработка символьной клавиши - перевод символа в верхний регистр и вывод символа на экран.
- Повтор цикла если не нажата клавиша F7.
- Завершение программы при нажатии F7.
- Определение процедуры
UpCase
, которая переводит символ в верхний регистр. - Внутри процедуры
UpCase
происходит проверка текущего символа и перевод в верхний регистр.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д