[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
происходит проверка текущего символа и перевод в верхний регистр.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д