Реализовать функцию strstr на ассемблере, и подключить эту функцию в проект MVS2008 - Assembler
Формулировка задачи:
Нужно реализовать функцию strstr на ассемблере, и подключить эту функцию в проет MVS2008.
Код функции:
Код основной программы:
Проект компилируется, ввожу данные и происходит ошибка:
В чем ошибки и как исправить?
.386 extern _strstr:near .model flat .code ;strstr _my_strstr@8 proc near push ebp ;Пролог mov ebp,esp TEXT1 equ [ebp+8] TEXT2 equ [ebp+12] XOR CH, CH ;Обнуление старшего байта счетчика PUSH 0 PUSH TEXT1 CALL _strstr MOV ECX, EAX POP EAX ;MOV EAX, 0 JCXZ FOUND ;Пустая строка является частью любых строк CLD ;Установка флага направления по возрастанию MOV EDI, TEXT1 ;Адрес основной строки в источник NEXT: MOV ESI, TEXT2 ;Адрес подстроки в приемник LODSB ;Загрузка первого байта в AL из приемника DS:[SI] REPNE SCASB ;Сравнение символов в AL и источнике ES:[DI] JNE FOUND ;Если первого символа из TEXT2 нет в строке MOV EBX, ECX ;Сохраняем состояние счетчика не просмотренных байтов DEC ECX ;Количество не просмотренных байтов на 1 меньше JCXZ FOUND ;Если байтов больше нет, то мы нашли подстроку из 1 байта MOV EDX, EDI ;Сохраняем состояния указателя REPE CMPSB ;Сравниваем строки далее по длине подстроки QNT2-1 MOV ECX, EBX ;Восстанавливаем значение счетчика непросмотренных байтов MOV EDI, EDX ;Восстанавливаем значение указателя LOOPNE NEXT ;Цикл продолжаем если имеются еще не просмотренные байты FOUND: POP EAX mov esp,ebp ;Эпилог pop ebp ret 8 _my_strstr@8 endp public _my_strstr@8 end
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> #include <string.h> //Описание внешних функций extern "C" { int __stdcall my_strstr(char* str1, char* str2); } using namespace std; void main(void) { int len; char TEXT1[30]=""; char TEXT2[30]=""; cout<<"Vvedite stroky1: "; cin>>TEXT1; cout<<"Vvedite stroky2: "; cin>>TEXT2; len=my_strstr(TEXT1, TEXT2); cout<<"----------------------------------\n"; cout<<len; _getch(); }
Решение задачи: «Реализовать функцию strstr на ассемблере, и подключить эту функцию в проект MVS2008»
textual
Листинг программы
.model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib
Объяснение кода листинга программы
- Устанавливает модель памяти для flat (плоской) и stdcall (стандартный вызов).
- Отключает отображение регистров в отладчике.
- Включает заголовочный файл windows.inc, который содержит определения оконных функций.
- Включает заголовочный файл masm32.inc, который содержит макросы и функции для работы с MASM32.
- Включает заголовочный файл msvcrt.inc, который содержит функции и макросы из библиотеки MSVCRT.
- Включает макросы из файла macros.asm.
- Подключает библиотеку masm32.lib.
- Подключает библиотеку msvcrt.lib. Следующие элементы списка относятся к функции strstr:
- Объявляет функцию strstr.
- Импортирует функцию printf.
- Определяет переменную str как argv[1].
- Определяет переменную len как размер строки str.
- Определяет переменную p как указатель на первый символ строки str.
- Определяет переменную q как указатель на последний символ строки str.
- Устанавливает p на начало строки.
- Устанавливает q на конец строки.
- Пока p меньше q, выполняет следующие действия:
- Если символ в позиции p равен символу в позиции q, переходит к следующей итерации цикла.
- Если символ в позиции p не равен символу в позиции q, переходит к следующей итерации цикла.
- Если p меньше q, значит, подстрока найдена, и функция возвращает адрес первого символа подстроки.
- Если p равно q, значит, подстрока не найдена, и функция возвращает NULL.
- Возвращает результат выполнения функции.