Online Compiler Nasm

extern scanf, printf, strcmp, strcpy section .data fmt_n db "%u", 0 fmt_s db "%10s", 0 fmt_out db "%u", 10, 0 section .bss n resd 1 i resd 1 j resd 1 unique_cnt resd 1 temp resb 11 strings resb 500 * 11 section .text global main main: push ebp mov ebp, esp push n push fmt_n call scanf add esp, 8 mov dword [unique_cnt], 0 mov dword [i], 0 read_loop: mov eax, [i] cmp eax, [n] jae finish push temp push fmt_s call scanf add esp, 8 mov dword [j], 0 check_loop: mov eax, [j] cmp eax, [unique_cnt] jae add_string imul eax, 11 lea eax, [strings + eax] push eax push temp call strcmp add esp, 8 test eax, eax jz already_exists inc dword [j] jmp check_loop add_string: mov eax, [unique_cnt] imul eax, 11 lea eax, [strings + eax] push temp push eax call strcpy add esp, 8 inc dword [unique_cnt] already_exists: inc dword [i] jmp read_loop finish: push dword [unique_cnt] push fmt_out call printf add esp, 8 xor eax, eax mov esp, ebp pop ebp ret
Вот разбор твоего кода:

1) **Что делает код:**  
Программа считывает с клавиатуры целое число `n`, затем `n` строк длиной до 10 символов. Она сохраняет только уникальные строки (без повторов) в массив `strings`. В конце выводится количество уникальных строк.

2) **Конкретные подсказки:**  
- Обрати внимание на размер буфера `temp` — он объявлен как `resb 11`, но в `fmt_s` указано `%10s`. Это корректно, так как `%10s` считывает до 10 символов + нуль-терминатор, который помещается в 11 байт.  
- В цикле `check_loop` ты используешь `imul eax, 11` для вычисления смещения в массиве `strings`. Убедись, что регистр `eax` не перезаписывается до того, как ты его используешь — в данном коде всё в порядке, но это частая ошибка.