Реализовать функцию 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

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

  1. Устанавливает модель памяти для flat (плоской) и stdcall (стандартный вызов).
  2. Отключает отображение регистров в отладчике.
  3. Включает заголовочный файл windows.inc, который содержит определения оконных функций.
  4. Включает заголовочный файл masm32.inc, который содержит макросы и функции для работы с MASM32.
  5. Включает заголовочный файл msvcrt.inc, который содержит функции и макросы из библиотеки MSVCRT.
  6. Включает макросы из файла macros.asm.
  7. Подключает библиотеку masm32.lib.
  8. Подключает библиотеку msvcrt.lib. Следующие элементы списка относятся к функции strstr:
  9. Объявляет функцию strstr.
  10. Импортирует функцию printf.
  11. Определяет переменную str как argv[1].
  12. Определяет переменную len как размер строки str.
  13. Определяет переменную p как указатель на первый символ строки str.
  14. Определяет переменную q как указатель на последний символ строки str.
  15. Устанавливает p на начало строки.
  16. Устанавливает q на конец строки.
  17. Пока p меньше q, выполняет следующие действия:
    1. Если символ в позиции p равен символу в позиции q, переходит к следующей итерации цикла.
    2. Если символ в позиции p не равен символу в позиции q, переходит к следующей итерации цикла.
    3. Если p меньше q, значит, подстрока найдена, и функция возвращает адрес первого символа подстроки.
    4. Если p равно q, значит, подстрока не найдена, и функция возвращает NULL.
  18. Возвращает результат выполнения функции.

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

5   голосов , оценка 4 из 5
Похожие ответы