Работа со строками на ассемблере - Assembler

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

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

Помогите пожалуйста в написании программы под TASM. Задача: Написать программу выделения из исходной строки подстроки символов заданной длины с указанного номера позиции, Pascal-string. К сожалению со строками в ассемблере работать толком не умею, понятных примеров немного, поэтому прошу вашей помощи!

Решение задачи: «Работа со строками на ассемблере»

textual
Листинг программы
  1. .586
  2. .model flat,stdcall
  3. option casemap:none
  4. include windows.inc
  5. include msvcrt.inc
  6. include kernel32.inc
  7. includelib msvcrt.lib
  8. includelib kernel32.lib
  9. .data
  10. text    db 512 dup (0)  ;вводимый текст
  11. msg     db 'Enter text: ',0
  12. msg2    db 'New text: ',0
  13. .code
  14. ;макрос вывода строки на экран
  15. outstr  macro s
  16.     push offset s   ;передать функции адрес строки
  17.     call crt_printf ;вывести строку
  18.     add esp,4       ;скорректировать указатель стека
  19. endm
  20. _start:
  21.     outstr msg      ;вывести приглашение ввести текст
  22.     invoke crt_gets,offset text ;ввод текста
  23.     lea esi,text        ;начало строки
  24.     call replace        ;удалить точкидо первой запятой
  25.     outstr msg2     ;вывести сообщение
  26.     outstr text     ;вывести сообщение
  27.     invoke crt__getch   ;ожидание нажатия любой клавиши
  28.     invoke ExitProcess,0    ;выход
  29. ;процедура замены многоточия одной точкой
  30. ;esi - адрес строки
  31. replace proc
  32.     mov edi,esi ;адрес строки
  33. lp: lodsb       ;взять очередной символ
  34.     cmp al,' '  ;если не пробел
  35.     jnz save    ;то сохранить
  36.     cmp al,[esi];если не два пробела подряд
  37.     jnz save    ;то сохранить
  38.     inc esi     ;если два пробеда, один пропустить
  39. save:
  40.     stosb       ;сохранить символ
  41.     cmp al,0    ;если это был не конец строки
  42.     jnz lp      ;продолжить работу
  43.     ret         ;выйти из подпрограммы
  44. replace endp
  45. end _start
  46. end

Объяснение кода листинга программы

  1. .586 - это метаданные, указывающие на модель процессора, используемую в коде.
  2. .model flat,stdcall - это метаданные, указывающие на модель памяти и способ вызова функций в коде.
  3. option casemap:none - это метаданные, указывающие на способ сопоставления регистров в коде.
  4. include windows.inc - это метаданные, которые включают файл с определениями функций Windows API.
  5. include msvcrt.inc - это метаданные, которые включают файл с определениями функций библиотеки MSVCRT.
  6. include kernel32.inc - это метаданные, которые включают файл с определениями функций библиотеки KERNEL32.
  7. includelib msvcrt.lib - это метаданные, которые подключают библиотеку MSVCRT.
  8. includelib kernel32.lib - это метаданные, которые подключают библиотеку KERNEL32.
  9. .data - это секция кода, где хранятся данные, которые должны быть доступны для чтения и записи во время выполнения программы.
  10. text db 512 dup (0) - это определение переменной типа данных строка (db), которая будет использоваться для хранения вводимого текста.
  11. msg db 'Enter text: ',0 - это определение переменной типа данных строка (db), которая будет использоваться для отображения приглашения на ввод текста.
  12. msg2 db 'New text: ',0 - это определение переменной типа данных строка (db), которая будет использоваться для отображения сообщения о замене текста.
  13. _start: - это метка, обозначающая начало выполнения программы.
  14. outstr macro s - это определение макроса, который выводит строку на экран.
  15. invoke crt_gets,offset text - это вызов функции, которая считывает строку из стандартного ввода и сохраняет ее в переменной text.
  16. lea esi,text - это команда, которая устанавливает переменную esi в качестве указателя на начало строки text.
  17. call replace - это вызов процедуры, которая заменяет все многоточия в строке на одну точку.
  18. outstr msg2 - это вызов макроса, который выводит на экран сообщение New text:.
  19. outstr text - это вызов макроса, который выводит на экран строку text.
  20. invoke crt__getch - это вызов функции, которая ожидает нажатия любой клавиши пользователем.
  21. invoke ExitProcess,0 - это вызов функции, которая завершает работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

11   голосов , оценка 3.727 из 5

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

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

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