[MASM32] Поиск подстроки в строке - Assembler (226207)

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

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

Нужно найти подстроку в строке. Уже который день найти не могу косяк.
 
.386
 .model flat,stdcall
option casemap:none
 
 include \masm32\include\windows.inc ; 
 
 include \masm32\include\masm32.inc
 include \masm32\include\gdi32.inc
 include \masm32\include\user32.inc
 include \masm32\include\kernel32.inc
 include \masm32\include\msvcrt.inc 
 
 includelib \masm32\lib\masm32.lib
 includelib \masm32\lib\gdi32.lib
 includelib \masm32\lib\user32.lib
 includelib \masm32\lib\kernel32.lib
 includelib \masm32\lib\msvcrt.lib

.data    ;резервируем память под данные и сразу же объявляем их     
         msg3 db "YES" ,0dh,0ah,0dh,0ah,0dh,0ah             
         msg4 db "NOPE" ,0dh,0ah,0dh,0ah,0dh,0ah
         str1 db "12345"
         str2 db "6"
.data?   ;нельзя инициализировать переменные                            
         stdout dd ?                    
         cWritten dd ?
.code
start:
        invoke GetStdHandle,STD_OUTPUT_HANDLE       ;Дескриптор стандартного устройства вывода данных. 
        mov stdout,eax                              ;копирует значение переменной stdin в регистр eax
;----------------------------------------------------------------------------------------------------------------\
;Строки получили,начинаем сравнивать.                                                                            |
;----------------------------------------------------------------------------------------------------------------/
        CLD
        mov cx,100
        lea esi,str1        ;
        lea edi,str2        ;
        repne cmpsb         ;найти совпадение элементов строк
        JNE not_found       ;совпадение обнаружено&?!
        jmp found           ;если совпали бежим в found     
;--------------------------------------------------------------------
;Совпадение есть.
        found:
        invoke WriteConsoleA,stdout,ADDR msg3,SIZEOF msg3,ADDR cWritten,NULL    
        invoke Sleep,INFINITE       ;не закрываем консоль после выполнения                             
        invoke ExitProcess,0        ;выход 
;-------------------------------------------------------------------
        not_found:
        invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL    ;выводим что строки не совпали
        invoke Sleep,INFINITE                                                   ;не закрываем консоль после выполнения
        invoke ExitProcess,0                                                    ;выходим из прогрмаммы  
end start

Решение задачи: «[MASM32] Поиск подстроки в строке»

textual
Листинг программы
.386
 .model flat,stdcall
option casemap:none
 
 include \masm32\include\windows.inc ; 
 
 include \masm32\include\masm32.inc
 include \masm32\include\gdi32.inc
 include \masm32\include\user32.inc
 include \masm32\include\kernel32.inc
 include \masm32\include\msvcrt.inc 
 
 includelib \masm32\lib\masm32.lib
 includelib \masm32\lib\gdi32.lib
 includelib \masm32\lib\user32.lib
 includelib \masm32\lib\kernel32.lib
 includelib \masm32\lib\msvcrt.lib
 
 
    
.data    ;резервируем память под данные и сразу же объявляем их     
         msg3 db "YES" ,0dh,0ah,0dh,0ah,0dh,0ah             
         msg4 db "NOPE" ,0dh,0ah,0dh,0ah,0dh,0ah
         str1 db "12345"
         str2 db "6"
.data?   ;нельзя инициализировать переменные                            
         stdout dd ?                    
         cWritten dd ?
.code
start:
        invoke GetStdHandle,STD_OUTPUT_HANDLE       ;Дескриптор стандартного устройства вывода данных. 
        mov stdout,eax                              ;копирует значение переменной stdin в регистр eax
;----------------------------------------------------------------------------------------------------------------\
;Строки получили,начинаем сравнивать.                                                                            |
;----------------------------------------------------------------------------------------------------------------/
        CLD
        mov cx,100
        lea esi,str1        ;
        lea edi,str2        ;
        repne cmpsb         ;найти совпадение элементов строк
        cmp ecx, 0
        JNE not_found       ;совпадение обнаружено&?!   
;--------------------------------------------------------------------
;Совпадение есть.
        invoke WriteConsoleA,stdout,ADDR msg3,SIZEOF msg3,ADDR cWritten,NULL    
        invoke Sleep,INFINITE       ;не закрываем консоль после выполнения                             
        invoke ExitProcess,0        ;выход 
;-------------------------------------------------------------------
        not_found:
        invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL    ;выводим что строки не совпали
        invoke Sleep,INFINITE                                                   ;не закрываем консоль после выполнения
        invoke ExitProcess,0                                                    ;выходим из прогрмаммы  
end start

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


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

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

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