Заменить в каждом слове первую букву на прописную - Assembler

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

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

Заменить в каждом слове первую букву на прописную

Решение задачи: «Заменить в каждом слове первую букву на прописную»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.     str1 db "vtr1 ztr4 Str5 ktr6 ytr7 atr8"
  5.     len dw $-str1
  6.     res db 255 dup (?)
  7. .code
  8. begin:
  9.     mov ax, @data
  10.     mov ds, ax
  11.     mov es, ax
  12.    
  13.     lea si, str1
  14.     lea di, res
  15.    
  16.     mov cx, len
  17.     inc cx ; добавляем 1, т.к. обработаем первый символ отдельно
  18.     lodsb
  19.     jmp c ; входим внутрь цикла
  20.    
  21. c1: lodsb
  22.     cmp al, ' '  ; сверяем с пробелом
  23.     jne skip   ; если не пробел - goto skip
  24.     stosb  ; иначе - загружаем пробел и работаем со след. символом
  25.     lodsb ; загружаем след. символ
  26. c:  cmp al, 97 ; проверяем диапазон 97..122 (прописные буквы)
  27.     jl c2    
  28.     cmp al, 122
  29.     jg c2    
  30.     sub al, 32 ; если попадает в диапазон прописных букв - вычитаем 32, так как диапазон строчных букв - 95..90
  31. c2: dec cx ; вычитаем СХ, так как мы в рамках одной итерации обработали два символа
  32. skip:
  33.     stosb ; очередной символ - в строку-приемник
  34.     loop c1  ; цикл
  35.    
  36.     mov res[si], '$' ; выводим строку результата
  37.     lea dx, res
  38.     mov ah, 9
  39.     int 21h              
  40.                
  41.     mov ax, 4c00h
  42.     int 21h    
  43. ends
  44.  
  45. 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

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

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

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