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 and esp, -16 sub esp, 8 push n push fmt_n call scanf add esp, 16 mov dword [unique_cnt], 0 mov dword [i], 0 read_loop: mov eax, [i] cmp eax, [n] jae finish sub esp, 8 push temp push fmt_s call scanf add esp, 16 mov dword [j], 0 check_loop: mov eax, [j] cmp eax, [unique_cnt] jae add_string imul eax, 11 lea eax, [strings + eax] sub esp, 8 push temp push eax call strcmp add esp, 16 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] sub esp, 8 push temp push eax call strcpy add esp, 16 inc dword [unique_cnt] already_exists: inc dword [i] jmp read_loop finish: sub esp, 8 push dword [unique_cnt] push fmt_out call printf add esp, 16 xor eax, eax mov esp, ebp pop ebp ret
Вот разбор кода:

1) **Что делает код:**  
   Программа считывает число `n`, затем `n` строк (до 10 символов каждая). Она подсчитывает количество **уникальных** строк (без учёта повторов) и выводит это число. Для хранения строк используется массив `strings` размером 500×11 байт, а для сравнения — `strcmp`.

2) **Конкретные подсказки:**  
   - Обратите внимание на то, как вычисляется адрес строки в массиве: `imul eax, 11` — это умножение индекса на длину строки (11 байт). Убедитесь, что вы понимаете, почему именно 11, а не 10.  
   - Проверьте, корректно ли восстанавливается стек после вызовов `scanf` и `strcmp` — здесь используется `add esp, 16`, но перед каждым вызовом выделяется `sub esp, 8`. Сколько всего аргументов передаётся и какой суммарный размер стека? Это может привести к ошибке.