Работа со строками. Удалить из строки символы в скобках 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 выполняет следующие действия:

  1. Задаёт модель памяти как small и сегментный регистр данных на начало кучи.
  2. Выделяет стек размером 100 байт.
  3. Определяет строку в сегменте данных, в которой нужно удалить символы в скобках.
  4. Вычисляет длину строки как смещение конца строки от начала сегмента данных.
  5. Перемещает сегментный регистр данных в регистр es.
  6. Перемещает символ '(' в регистр al.
  7. Перемещает указатель на начало строки в регистр di.
  8. Перемещает длину строки в регистр cx.
  9. Повторяет до тех пор, пока не встретит символ ')', сдвигая указатель на следующий символ и уменьшая счётчик длины на 1.
  10. Перемещает в регистр bx значение счётчика длины строки.
  11. Уменьшает значение счётчика длины на 1 и сохраняет в отдельной переменной si.
  12. Устанавливает направление перебора в прямом порядке (для повторения цикла).
  13. Начинает цикл, пока не будут выполнены условия: счётчик длины больше или равен нулю и счётчик строки больше нуля.
  14. Выполняет повторное копирование строки без символов в скобках.
  15. Заполняет байтом нулевых значений все свободные ячейки памяти, начиная с адреса di.
  16. Возвращает в регистры di, si, bx значения, которые были до выполнения цикла.
  17. Перемещает в регистр ah код функции 4Ch (выход из программы).
  18. Перемещает в регистр al код завершения программы 00h.
  19. Вызывает функцию 21h (код выхода в BIOS).
  20. Конец программы.

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы