Замена каждой второй буквы символом(*) - Assembler

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

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

Имеется текстовая переменная ABCDEFGIJKLMNOPQRST нужно чтобы каждую вторую букву заменял символом звездочка(*) Заранее благодарен за помощь.
Может можно как-то переделать этот код?
Листинг программы
  1. .MODEL Tiny
  2. .286
  3. .CODE
  4. ORG 100h
  5. Start:
  6. cld
  7. mov si,offset String
  8. mov di,si
  9. mov dx,si ; нужно будет дальше (при выводе строки)
  10. xor bl,bl ; флаг чередования - первая буква будет заглавной (иначе пишем mov bl,20h)
  11. @@next:
  12. lodsb
  13. cmp al,'$'
  14. je @@end ; если '$', то выходим
  15. cmp al,'A'
  16. jb @@notlet ; не буква
  17. cmp al,'z'
  18. ja @@notlet ; не буква
  19. cmp al,'Z'
  20. jbe @@cap ; и так заглавная
  21. cmp al,'a'
  22. jb @@notlet ; не буква (нечто между 'Z' и 'a')
  23. ; строчная буква
  24. and al,not 20h ; делаем её заглавной
  25. @@cap:
  26. or al,bl ; осуществляем чередование
  27. xor bl,20h ; меняем флаг чередования
  28. @@notlet:
  29. stosb
  30. jmp @@next
  31. @@end:
  32. mov ah,9
  33. int 21h ; вывод на экран
  34. int 20h ; выход
  35. String db 'ABCDEFGDSGDSFDSF $'
  36. END Start

Решение задачи: «Замена каждой второй буквы символом(*)»

textual
Листинг программы
  1. .model small
  2. .386
  3.  
  4. .stack 100h
  5.  
  6. .data
  7. var db 'ABCDEFGIJKLMNOPQRST'
  8. len equ $-var
  9.  
  10. .code
  11. start:
  12. mov ax,@data
  13. mov ds,ax
  14.  
  15. xor si,si
  16. mov cx,len
  17. change:
  18. test si,1
  19. jz skip
  20.  
  21. mov byte ptr var[si],'*'
  22.  
  23. skip:
  24. inc si
  25. loop change
  26.  
  27. lea si,var
  28. mov cx,len
  29. show:
  30. lodsb
  31. int 29h
  32. loop show
  33.  
  34. mov ah,4Ch
  35. mov al,00h
  36. int 21h
  37. end start

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

В этом коде выполняется замена каждой второй буквы в строке ABCDEFGIJKLMNOPQRST на символ '*'. Вот список шагов:

  1. .model small - устанавливает модель памяти 8086, необходимую для работы с регистром seg
  2. .386 - указывает, что код будет работать в реальном режиме процессора 80386+
  3. .stack 100h - устанавливает стек размером 100 байт
  4. .data - указывает, что следующие переменные будут размещены в данных сегменте
  5. var db 'ABCDEFGIJKLMNOPQRST' - объявляет переменную var типа byte, содержащую строку ABCDEFGIJKLMNOPQRST
  6. len equ $-var - вычисляет длину строки и сохраняет её в переменную len
  7. .code - указывает, что следующий код будет машинным кодом
  8. start: - определяет точку входа в программу
  9. mov ax,@data - перемещает сегмент данных в регистр ax
  10. mov ds,ax - делает сегмент данных текущим сегментом
  11. xor si,si - инициализирует счётчик итераций в 0
  12. mov cx,len - перемещает длину строки в регистр cx
  13. change: - определяет точку входа в цикл
  14. test si,1 - проверяет, является ли текущий символ '*'
  15. jz skip - если символ '*', то переходит к следующей итерации
  16. mov byte ptr var[si],'' - заменяет символ на ''
  17. skip: - определяет точку входа в следующую итерацию
  18. inc si - увеличивает счётчик итераций на 1
  19. loop change - переходит к следующей итерации цикла
  20. lea si,var - делает счётчик итераций смещением от начала строки
  21. mov cx,len - перемещает длину строки в регистр cx
  22. show: - определяет точку входа в цикл вывода
  23. lodsb - загружает следующий символ из строки в регистр al
  24. int 29h - выводит символ на экран
  25. loop show - переходит к следующей итерации цикла вывода
  26. mov ah,4Ch - подготавливает команду на завершение работы программы
  27. mov al,00h - указывает на успешный исход
  28. int 21h - вызывает функцию завершения работы программы
  29. end start - определяет конец программы

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


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

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

10   голосов , оценка 4.3 из 5

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

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

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