Заменить в каждом слове первую букву на прописную - Assembler
Формулировка задачи:
Заменить в каждом слове первую букву на прописную
Решение задачи: «Заменить в каждом слове первую букву на прописную»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- str1 db "vtr1 ztr4 Str5 ktr6 ytr7 atr8"
- len dw $-str1
- res db 255 dup (?)
- .code
- begin:
- mov ax, @data
- mov ds, ax
- mov es, ax
- lea si, str1
- lea di, res
- mov cx, len
- inc cx ; добавляем 1, т.к. обработаем первый символ отдельно
- lodsb
- jmp c ; входим внутрь цикла
- c1: lodsb
- cmp al, ' ' ; сверяем с пробелом
- jne skip ; если не пробел - goto skip
- stosb ; иначе - загружаем пробел и работаем со след. символом
- lodsb ; загружаем след. символ
- c: cmp al, 97 ; проверяем диапазон 97..122 (прописные буквы)
- jl c2
- cmp al, 122
- jg c2
- sub al, 32 ; если попадает в диапазон прописных букв - вычитаем 32, так как диапазон строчных букв - 95..90
- c2: dec cx ; вычитаем СХ, так как мы в рамках одной итерации обработали два символа
- skip:
- stosb ; очередной символ - в строку-приемник
- loop c1 ; цикл
- mov res[si], '$' ; выводим строку результата
- lea dx, res
- mov ah, 9
- int 21h
- mov ax, 4c00h
- int 21h
- ends
- end begin
Объяснение кода листинга программы
- Объявляется модель памяти и размер стека.
- Объявляются переменные данных:
str1
- строка для обработки, содержащаяvtr1 ztr4 Str5 ktr6 ytr7 atr8
,len
- длина строкиstr1
,res
- строка для хранения результата длиной 255 символов.
- Начинается исполняемый код:
- Загружается адрес сегмента данных в регистр
ax
и также устанавливается сегмент данных в регистрds
. - Регистр
es
также устанавливается в сегмент данных для дальнейшего использования. - Адрес строки
str1
загружается в регистрsi
(источник). - Адрес строки
res
загружается в регистрdi
(приемник). - В регистр
cx
загружается длина строкиlen
плюс единица (т.к. первый символ будет обработан отдельно). - Байт из памяти, адресуемый регистром
si
, загружается в регистрal
и инкрементируется счетчикsi
. - Происходит переход к метке
c
(т.е. начало цикла обработки).
- Загружается адрес сегмента данных в регистр
- В цикле происходит следующее:
- Байт из памяти, адресуемый регистром
si
, загружается в регистрal
. - Происходит сравнение содержимого
al
с символом пробела. - Если содержимое
al
не равно пробелу, происходит переход к меткеskip
. - Если содержимое
al
равно пробелу, то символ пробела записывается в память по адресуdi
, затем байт из памяти, адресуемый регистромsi
, загружается в регистрal
. - Сравнивается содержимое
al
с ASCII значением маленькой буквы 'a' (97). Если оно меньше, происходит переход к меткеc2
. - Если содержимое
al
больше ASCII значения маленькой буквы 'z' (122), также происходит переход к меткеc2
. - Иначе из содержимого
al
вычитается 32, переводя его в верхний регистр (прописную букву). - Уменьшается счетчик
cx
. - Записывается содержимое
al
в память, адресуемую регистромdi
. - Проверяется счетчик
cx
. Если он не равен 0, происходит переход на меткуc1
.
- Байт из памяти, адресуемый регистром
- После цикла:
- В память, адресуемую регистром
si
, записывается символ '$' для завершения строки. - Адрес строки
res
загружается в регистрdx
. - Выполняется вывод строки с помощью прерывания
int 21h, ah=9
. - Программа завершается с использованием прерывания
int 21h
и функции завершения4c00h
.
- В память, адресуемую регистром
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д