Online Compiler Nasm

extert printf, scanf, strlen section .data format db "%1000s", 0 form_print db "%d", 0 form_skip db "%s", 0 section .bss str1 resd 1000 str2 resd 1000 len1 resd 1 len2 resd 1 ind resd 1 l resd 1 section .text global main main: push ebp mov ebp, esp and esp, ~15 push str1 push format call scanf add esp, 8 push str1 call strlen mov dword[len1], eax add esp, 4 push str2 push format call scanf add esp, 8 push str2 call strlen mov dword[len2], eax add esp, 4 mov esp, ebp pop ebp mov eax, dword[len1] cmp eax, dword[len2] je .eqviv jl .less jmp .greater .less: ; len1 < len2 mov dword[ind], 0 .search_first_simb: mov ebx, dword[ind] cmp ebx, dword[len2] je .print0 mov eax, [str2 + 4*ebx] mov ebx, [str1] cmp eax, ebx je .cmp_all_next ; по ind в str2 нач подстр inc dword[ind] jmp .search_first_simb .cmp_all_next: ; ind - начало подстр str1 в str2 mov dword[l], 1 ; индекс в самой подстр str1 (нулевой симв уже совпал) .next: mov ebx, dword[ind] mov eax, [str2 + 4*ebx] mov ebx, dword[l] mov ecx, [str1 + 4*ebx] cmp eax, ecx jne .search_first_simb inc dword[ind] inc dword[l] mov eax, dword[l] cmp eax, dword[len1] je .print12 jmp .next .greater: ; str1 > str2 mov dword[ind], 0 .find_first_simb: mov ebx, dword[ind] cmp ebx, dword[len1] je .print0 mov eax, [str1 + 4*ebx] mov ebx, [str2] cmp eax, ebx je .all_next ; по ind в str2 нач подстр inc dword[ind] jmp .find_first_simb .all_next: ; ind - начало подстр str2 в str1 mov dword[l], 1 ; индекс в самой подстр str2 (нулевой симв уже совпал) .nxt: mov ebx, dword[ind] mov eax, [str1 + 4*ebx] mov ebx, dword[l] mov ecx, [str2 + 4*ebx] cmp eax, ecx jne .find_first_simb inc dword[ind] inc dword[l] mov eax, dword[l] cmp eax, dword[len2] je .print21 jmp .nxt .eqviv: mov eax, [str1] mov ebx, [str2] cmp eax, ebx mov dword[ind], 1 ; чтобы l=ind=1 и исп je .all_next jmp .print0 .print0: mov eax, 0 push eax push form_print call printf add esp, 8 jmp .end .print12: mov eax, 1 push eax push form_print call printf add esp, 8 mov eax, ' ' push eax push form_skip call printf add esp, 8 mov eax, 2 push eax push form_print call printf add esp, 8 jmp .end .print21: mov eax, 2 push eax push form_print call printf add esp, 8 mov eax, ' ' push eax push form_skip call printf add esp, 8 mov eax, 1 push eax push form_print call printf add esp, 8 jmp .end .end: xor eax, eax ret
Вот разбор вашего кода:

1) **Что делает код:**  
Программа считывает две строки (до 1000 символов), затем проверяет, является ли одна строка подстрокой другой. Если `str1` содержится в `str2` — выводит "1 2", если `str2` содержится в `str1` — выводит "2 1", если строки равны — выводит "1 2" (через сравнение первых символов), иначе выводит "0". Используется ручной поиск подстроки (наивный алгоритм).

2) **Конкретные подсказки:**  
- **Ошибка в работе с памятью:** Вы объявили строки как `resd` (массив двойных слов), но `scanf` и `strlen` ожидают байтовые строки (`resb`). Из-за этого каждый символ занимает 4 байта, а не 1, что приведёт к некорректному сравнению и возможному выходу за границы. Используйте `resb` для строк.  
- **Логическая ошибка в `.eqviv`:** При равенстве длин вы сравниваете только первые символы (`[str1]` и `[str2]`), а затем сразу переходите к `.all_next` с `ind=1`. Это не проверяет полное равенство строк — нужно сравнивать все символы, а не только первый.