Online Compiler Nasm

section .bss arr resd 10000 section .text extern io_get_dec, io_print_dec, io_print_char global main main: mov ebp, esp call io_get_dec mov ebx, eax ; n mov esi, 0 ; counter call io_get_dec mov dword [arr + esi * 4], eax inc esi .input: call io_get_dec mov dword [arr + esi * 4], eax inc esi cmp esi, ebx jl .input mov esi, 0 ; i .sort_i: mov edi, 0 ; j .sort_j: mov eax, dword [arr + edi * 4] cmp eax, dword [arr + (edi + 1) * 4] jle .next_j mov ecx, dword [arr + (edi + 1) * 4] mov dword [arr + edi * 4], ecx mov dword [arr + (edi + 1) * 4], eax .next_j: inc edi mov edx, ebx sub edx, esi dec edx cmp edi, edx jl .sort_j .next_i: inc esi cmp esi, ebx - 1 jl .sort_i mov esi, 0 ; counter .output: mov eax, dword [arr + esi * 4] call io_print_dec mov eax, ' ' call io_print_char inc esi cmp esi, ebx jl .output xor eax, eax ret
1) Этот код реализует сортировку пузырьком. Сначала считывается количество элементов, затем сами элементы, после чего они сортируются по возрастанию и выводятся через пробел.

2) Обрати внимание, что в строке `cmp esi, ebx - 1` NASM не вычисляет автоматически выражения — здесь `ebx - 1` воспринимается как метка, что может вызвать ошибку. Нужно вычислить значение отдельно.

Подсказка: Внешний цикл должен выполняться `n-1` раз. Для этого можно использовать регистр или сразу сравнить `esi` с `ebx`, предварительно уменьшив `ebx` на единицу в другом регистре.