Работа со строками. Удалить из строки символы в скобках inline assembler.
Формулировка задачи:
Удалить из строки символы в скобках inline assembler. Подскажите в какую сторону копать...
Решение задачи: «Работа со строками. Удалить из строки символы в скобках inline assembler.»
textual
Листинг программы
- .model small
- .386
- .stack 100h
- .data
- var db 'i love (like) asm!'
- len equ $-var
- .code
- start:
- mov ax,@data
- mov ds,ax
- mov es,ax
- mov al,'('
- lea di,var
- mov cx,len
- repne scasb
- mov si,di
- mov al,')'
- repne scasb
- mov bx,cx
- dec si
- cld
- mov cx,di
- sub cx,si
- inc cx
- mov si,di
- dec di
- big:
- push cx
- push si
- push di
- mov cx,bx
- shift:
- lodsb
- stosb
- loop shift
- mov byte ptr [di],0
- pop di
- pop si
- dec si
- dec di
- pop cx
- loop big
- mov ah,4Ch
- mov al,00h
- int 21h
- end start
Объяснение кода листинга программы
Выполняемый код на языке Assembler выполняет следующие действия:
- Задаёт модель памяти как
small
и сегментный регистр данных на начало кучи. - Выделяет стек размером 100 байт.
- Определяет строку в сегменте данных, в которой нужно удалить символы в скобках.
- Вычисляет длину строки как смещение конца строки от начала сегмента данных.
- Перемещает сегментный регистр данных в регистр es.
- Перемещает символ '(' в регистр al.
- Перемещает указатель на начало строки в регистр di.
- Перемещает длину строки в регистр cx.
- Повторяет до тех пор, пока не встретит символ ')', сдвигая указатель на следующий символ и уменьшая счётчик длины на 1.
- Перемещает в регистр bx значение счётчика длины строки.
- Уменьшает значение счётчика длины на 1 и сохраняет в отдельной переменной si.
- Устанавливает направление перебора в прямом порядке (для повторения цикла).
- Начинает цикл, пока не будут выполнены условия: счётчик длины больше или равен нулю и счётчик строки больше нуля.
- Выполняет повторное копирование строки без символов в скобках.
- Заполняет байтом нулевых значений все свободные ячейки памяти, начиная с адреса di.
- Возвращает в регистры di, si, bx значения, которые были до выполнения цикла.
- Перемещает в регистр ah код функции 4Ch (выход из программы).
- Перемещает в регистр al код завершения программы 00h.
- Вызывает функцию 21h (код выхода в BIOS).
- Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д