Замена каждой второй буквы символом(*) - 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 - определяет конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д