Работа со строками. Удалить из строки символы в скобках inline assembler.

Узнай цену своей работы

Формулировка задачи:

Удалить из строки символы в скобках inline assembler. Подскажите в какую сторону копать...

Решение задачи: «Работа со строками. Удалить из строки символы в скобках inline assembler.»

textual
Листинг программы
  1. .model small
  2. .386
  3.  
  4. .stack 100h
  5.  
  6. .data
  7. var db 'i love (like) asm!'
  8. len equ $-var
  9.  
  10. .code
  11. start:
  12. mov ax,@data
  13. mov ds,ax
  14. mov es,ax
  15.  
  16. mov al,'('
  17. lea di,var
  18. mov cx,len
  19. repne scasb
  20.  
  21. mov si,di
  22.  
  23. mov al,')'
  24. repne scasb
  25.  
  26. mov bx,cx
  27.  
  28. dec si
  29.  
  30. cld
  31. mov cx,di
  32. sub cx,si
  33. inc cx
  34. mov si,di
  35. dec di
  36. big:
  37. push cx
  38. push si
  39. push di
  40.  
  41. mov cx,bx
  42. shift:
  43. lodsb
  44. stosb
  45. loop shift
  46.  
  47. mov byte ptr [di],0
  48.  
  49. pop di
  50. pop si
  51.  
  52. dec si
  53. dec di
  54.  
  55. pop cx
  56. loop big
  57.  
  58. mov ah,4Ch
  59. mov al,00h
  60. int 21h
  61. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы