Замена каждой второй буквы символом(*) - 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
на символ '*'. Вот список шагов:
- .model small - устанавливает модель памяти 8086, необходимую для работы с регистром seg
- .386 - указывает, что код будет работать в реальном режиме процессора 80386+
- .stack 100h - устанавливает стек размером 100 байт
- .data - указывает, что следующие переменные будут размещены в данных сегменте
- var db 'ABCDEFGIJKLMNOPQRST' - объявляет переменную var типа byte, содержащую строку
ABCDEFGIJKLMNOPQRST
- len equ $-var - вычисляет длину строки и сохраняет её в переменную len
- .code - указывает, что следующий код будет машинным кодом
- start: - определяет точку входа в программу
- mov ax,@data - перемещает сегмент данных в регистр ax
- mov ds,ax - делает сегмент данных текущим сегментом
- xor si,si - инициализирует счётчик итераций в 0
- mov cx,len - перемещает длину строки в регистр cx
- change: - определяет точку входа в цикл
- test si,1 - проверяет, является ли текущий символ '*'
- jz skip - если символ '*', то переходит к следующей итерации
- mov byte ptr var[si],'' - заменяет символ на ''
- skip: - определяет точку входа в следующую итерацию
- inc si - увеличивает счётчик итераций на 1
- loop change - переходит к следующей итерации цикла
- lea si,var - делает счётчик итераций смещением от начала строки
- mov cx,len - перемещает длину строки в регистр cx
- show: - определяет точку входа в цикл вывода
- lodsb - загружает следующий символ из строки в регистр al
- int 29h - выводит символ на экран
- loop show - переходит к следующей итерации цикла вывода
- mov ah,4Ch - подготавливает команду на завершение работы программы
- mov al,00h - указывает на успешный исход
- int 21h - вызывает функцию завершения работы программы
- end start - определяет конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д