Работа со строками на ассемблере - 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 - это вызов функции, которая завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д