Работа со строками на ассемблере - Assembler
Формулировка задачи:
Помогите пожалуйста в написании программы под TASM.
Задача: Написать программу выделения из исходной строки подстроки символов заданной длины с указанного номера позиции, Pascal-string.
К сожалению со строками в ассемблере работать толком не умею, понятных примеров немного, поэтому прошу вашей помощи!
Решение задачи: «Работа со строками на ассемблере»
textual
Листинг программы
- .586
- .model flat,stdcall
- option casemap:none
- include windows.inc
- include msvcrt.inc
- include kernel32.inc
- includelib msvcrt.lib
- includelib kernel32.lib
- .data
- text db 512 dup (0) ;вводимый текст
- msg db 'Enter text: ',0
- msg2 db 'New text: ',0
- .code
- ;макрос вывода строки на экран
- outstr macro s
- push offset s ;передать функции адрес строки
- call crt_printf ;вывести строку
- add esp,4 ;скорректировать указатель стека
- endm
- _start:
- outstr msg ;вывести приглашение ввести текст
- invoke crt_gets,offset text ;ввод текста
- lea esi,text ;начало строки
- call replace ;удалить точкидо первой запятой
- outstr msg2 ;вывести сообщение
- outstr text ;вывести сообщение
- invoke crt__getch ;ожидание нажатия любой клавиши
- invoke ExitProcess,0 ;выход
- ;процедура замены многоточия одной точкой
- ;esi - адрес строки
- replace proc
- mov edi,esi ;адрес строки
- lp: lodsb ;взять очередной символ
- cmp al,' ' ;если не пробел
- jnz save ;то сохранить
- cmp al,[esi];если не два пробела подряд
- jnz save ;то сохранить
- inc esi ;если два пробеда, один пропустить
- save:
- stosb ;сохранить символ
- cmp al,0 ;если это был не конец строки
- jnz lp ;продолжить работу
- ret ;выйти из подпрограммы
- replace endp
- end _start
- end
Объяснение кода листинга программы
- .586 - это метаданные, указывающие на модель процессора, используемую в коде.
- .model flat,stdcall - это метаданные, указывающие на модель памяти и способ вызова функций в коде.
- option casemap:none - это метаданные, указывающие на способ сопоставления регистров в коде.
- include windows.inc - это метаданные, которые включают файл с определениями функций Windows API.
- include msvcrt.inc - это метаданные, которые включают файл с определениями функций библиотеки MSVCRT.
- include kernel32.inc - это метаданные, которые включают файл с определениями функций библиотеки KERNEL32.
- includelib msvcrt.lib - это метаданные, которые подключают библиотеку MSVCRT.
- includelib kernel32.lib - это метаданные, которые подключают библиотеку KERNEL32.
- .data - это секция кода, где хранятся данные, которые должны быть доступны для чтения и записи во время выполнения программы.
- text db 512 dup (0) - это определение переменной типа данных
строка
(db), которая будет использоваться для хранения вводимого текста. - msg db 'Enter text: ',0 - это определение переменной типа данных
строка
(db), которая будет использоваться для отображения приглашения на ввод текста. - msg2 db 'New text: ',0 - это определение переменной типа данных
строка
(db), которая будет использоваться для отображения сообщения о замене текста. - _start: - это метка, обозначающая начало выполнения программы.
- outstr macro s - это определение макроса, который выводит строку на экран.
- invoke crt_gets,offset text - это вызов функции, которая считывает строку из стандартного ввода и сохраняет ее в переменной
text
. - lea esi,text - это команда, которая устанавливает переменную
esi
в качестве указателя на начало строкиtext
. - call replace - это вызов процедуры, которая заменяет все многоточия в строке на одну точку.
- outstr msg2 - это вызов макроса, который выводит на экран сообщение
New text:
. - outstr text - это вызов макроса, который выводит на экран строку
text
. - invoke crt__getch - это вызов функции, которая ожидает нажатия любой клавиши пользователем.
- invoke ExitProcess,0 - это вызов функции, которая завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д