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

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

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

Имеется текстовая переменная ABCDEFGIJKLMNOPQRST нужно чтобы каждую вторую букву заменял символом звездочка(*) Заранее благодарен за помощь.
Может можно как-то переделать этот код?
.MODEL Tiny
.286
.CODE
ORG 100h
 
Start:
  
  cld
  mov si,offset String
  mov di,si
  mov dx,si  ; нужно будет дальше (при выводе строки)
  xor bl,bl  ; флаг чередования - первая буква будет заглавной (иначе пишем mov bl,20h)
 
@@next:
  lodsb
  cmp al,'$'
  je @@end  ; если '$', то выходим
  cmp al,'A'
  jb @@notlet  ; не буква
  cmp al,'z'
  ja @@notlet  ; не буква
  cmp al,'Z'
  jbe @@cap  ; и так заглавная
  cmp al,'a'
  jb @@notlet  ; не буква (нечто между 'Z' и 'a')
; строчная буква
  and al,not 20h  ; делаем её заглавной
@@cap:
  or al,bl  ; осуществляем чередование
  xor bl,20h  ; меняем флаг чередования
@@notlet:
  stosb
  jmp @@next
 
@@end:
  mov ah,9
  int 21h  ; вывод на экран
  int 20h  ; выход
 
String db 'ABCDEFGDSGDSFDSF $'
 
END Start

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

textual
Листинг программы
.model small
.386
 
.stack 100h
 
.data
var db 'ABCDEFGIJKLMNOPQRST'
len equ $-var
 
.code
start:
mov ax,@data
mov ds,ax
 
xor si,si
mov cx,len
change:
test si,1
jz skip
 
mov byte ptr var[si],'*'
 
skip:
inc si
loop change
 
lea si,var
mov cx,len
show:
lodsb
int 29h
loop show
 
mov ah,4Ch
mov al,00h
int 21h
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
Похожие ответы