Online Compiler Nasm

section .data fmt_in db "%d %d %d", 0 fmt_out db "%d ", 0 nl db 10, 0 section .bss N resd 1 K resd 1 M resd 1 used resb 12 section .text extern scanf, printf global main main: push ebp mov ebp, esp and esp, -16 push ebx push esi push edi sub esp, 4 sub esp, 4 push M push K push N push fmt_in call scanf add esp, 16 xor eax, eax mov ecx, 12 lea edi, [used] rep stosb xor esi, esi .pos_loop: cmp esi, [K] jge .done mov edi, 1 .cand_loop: movzx eax, byte [used + edi] test eax, eax jnz .next_cand mov eax, [N] sub eax, esi dec eax mov ecx, [K] sub ecx, esi dec ecx test ecx, ecx jz .perm_one mov ebx, 1 .perm_loop: imul ebx, eax dec eax dec ecx jnz .perm_loop jmp .perm_done .perm_one: mov ebx, 1 .perm_done: cmp [M], ebx jle .pick sub [M], ebx .next_cand: inc edi jmp .cand_loop .pick: mov byte [used + edi], 1 sub esp, 8 push edi push fmt_out call printf add esp, 16 inc esi jmp .pos_loop .done: sub esp, 12 push nl call printf add esp, 16 add esp, 4 pop edi pop esi pop ebx mov esp, ebp pop ebp xor eax, eax ret
Вот разбор вашего кода на NASM32:

## 1) Что делает код
Это программа для нахождения **K-й перестановки из N элементов** в лексикографическом порядке (нумерация с 0).  
Пользователь вводит три числа: N (количество элементов), K (номер перестановки, начиная с 0) и M (индекс искомой перестановки).  
Программа последовательно выбирает цифры от 1 до N, используя факториальную систему счисления, и выводит искомую перестановку.

## 2) Подсказки
- **Ошибка в логике выбора кандидата:**  
  В цикле `.cand_loop` вы проверяете `used[edi]`, но `edi` начинается с 1, а не с 0. В результате вы никогда не используете элемент с номером 0. Убедитесь, что индексация элементов начинается с 0, или скорректируйте начальное значение `edi`.

- **Проблема с вычислением факториала:**  
  В блоке `.perm_loop` вы вычисляете `(N-esi-1)!/(N-esi-K+esi)!`? Проверьте формулу: для выбора i-го элемента перестановки нужно считать количество вариантов для оставшихся позиций — это `(N-esi-1)! / (N-K)!`. Ваш код использует `eax = N - esi - 1` и `ecx = K - esi - 1`, но это не даёт правильного факториала для всех случаев. Рекомендую перепроверить математику.