Удалить заданный элемент в строке - Assembler
Формулировка задачи:
Всем привет! Помогите с задачкой плиз:
"Удалить заданный элемент в строке"
вот заготовка, только удаляется первый найденный элемент, а нужно все элементы в строке, и если можно все это в процедуре
model small .stack 100h .data string db 'This is a story about a lucky man 03010', 0h, '$' simbol db 'a' .code main: mov ax, @data mov ds, ax mov es, ax cld mov cx,30h lea di, string mov al, simbol start: repne scasb jne exit mov si, di dec di rep movsb cmp di, 0 je start exit: mov ah, 4ch int 21h end main
Так есть у кого идеи?
Решение задачи: «Удалить заданный элемент в строке»
textual
Листинг программы
model small .stack 100h .data string db 'about abba', 0ah, '$' simbol db 'a' .code main: mov ax, @data mov ds, ax mov es, ax cld mov cx,15h lea dx, string mov di, dx xor ax, ax mov al, simbol mov BP, SP push ax call procedura procedura proc near pop [BP+2] start: repne scasb jne exit mov si, di push di push cx dec di rep movsb pop cx pop di jmp start ret endp procedura exit: mov ah, 4ch int 21h end main
Объяснение кода листинга программы
В этом коде на языке Assembler выполняется следующая последовательность действий:
- Задаётся модель памяти для программы (small).
- Определяется стек размером 100 байт.
- Определяется строка в формате db (строка символов, включая символ 0ah, обозначающий конец строки), а также переменная simbol, которая содержит символ, который нужно удалить.
- Код главной функции main:
- Переменная ax используется как индекс для доступа к памяти, поэтому она инициализируется значением @data (40h).
- Переменные ds и es также используются для доступа к памяти, поэтому они инициализируются значением ax.
- Переменная cx инициализируется значением 15h, что означает, что цикл будет выполняться 15 раз.
- Переменная dx указывает на строку string, а переменная di — на первый символ этой строки.
- Переменная BP и SP инициализируются значением ax, так как в данном случае они используются как индексы для доступа к памяти.
- Функция procedura вызывается с аргументом ax (символом, который нужно удалить).
- Функция procedura:
- Код внутри функции начинается с установки регистра ax в ноль.
- Затем в него записывается значение переменной simbol.
- Далее, BP устанавливается равным SP.
- Затем переменная ax (символ) сохраняется на стеке.
- Вызывается функция call, которая вызывает процедуру, указанную в качестве аргумента.
- По завершении работы функции call, значение BP+2 (то есть SP) восстанавливается.
- Код функции main продолжается:
- Переменная di инициализируется значением dx (первого символа строки).
- Переменная si устанавливается равной di.
- Затем переменные di и cx сохраняются на стеке.
- Переменная di уменьшается на единицу.
- Затем происходит попытка сравнить символ в памяти по адресу di с символом, который нужно удалить (переменная al). Если они не совпадают, то происходит переход к следующему символу.
- Если символы совпадают, то происходит замена символа на символ перезаписи (в данном случае на пустой символ).
- Затем происходит выход из цикла и возврат в основную программу.
- В основной программе происходит вывод сообщения об успешном завершении программы. Таким образом, этот код удаляет заданный символ из строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д