Заменить в каждом слове первую букву на прописную - 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

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

  1. Объявляется модель памяти и размер стека.
  2. Объявляются переменные данных:
    • str1 - строка для обработки, содержащая vtr1 ztr4 Str5 ktr6 ytr7 atr8,
    • len - длина строки str1,
    • res - строка для хранения результата длиной 255 символов.
  3. Начинается исполняемый код:
    • Загружается адрес сегмента данных в регистр ax и также устанавливается сегмент данных в регистр ds.
    • Регистр es также устанавливается в сегмент данных для дальнейшего использования.
    • Адрес строки str1 загружается в регистр si (источник).
    • Адрес строки res загружается в регистр di (приемник).
    • В регистр cx загружается длина строки len плюс единица (т.к. первый символ будет обработан отдельно).
    • Байт из памяти, адресуемый регистром si, загружается в регистр al и инкрементируется счетчик si.
    • Происходит переход к метке c (т.е. начало цикла обработки).
  4. В цикле происходит следующее:
    • Байт из памяти, адресуемый регистром 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.
  5. После цикла:
    • В память, адресуемую регистром si, записывается символ '$' для завершения строки.
    • Адрес строки res загружается в регистр dx.
    • Выполняется вывод строки с помощью прерывания int 21h, ah=9.
    • Программа завершается с использованием прерывания int 21h и функции завершения 4c00h.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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