Online Compiler Nasm

section .bss arr resd 10000 section .text extern io_get_dec, io_print_dec, io_newline global main main: call io_get_dec mov esi, eax mov ecx, esi lea edi, [arr] input_start: cmp ecx, 0 je input_end call io_get_dec mov [edi], eax xor eax, eax add edi, 4 dec ecx jmp input_start input_end: lea edi, [arr] ; указатель на начало списка ;mov ebx, 0xffffffff ; кол-во элементов mov ecx, esi sort_start: ; сравниваем ел-нт edi с edi + 4 cmp ecx, 0 je sort_end mov ebx, [edi] mov edx, [edi+4] cmp ebx, edx ja more jmp next_el more: ; меняет значение местами между регистрами mov [edi], edx mov [edi+4], ebx next_el: add edi, 4 dec ecx jmp sort_start sort_end: lea edi, [arr] mov ecx, esi output_start: cmp ecx, 0 je output_end mov eax, [edi] call io_print_dec add edi, 4 dec ecx jmp output_start output_end: xor eax, eax ret
1) Этот код считывает количество элементов, затем сами элементы в массив, сортирует их методом пузырька (одна итерация без вложенного цикла) и выводит результат. Однако сортировка работает некорректно, так как проходит по массиву только один раз.

2) Для сортировки пузырьком нужен вложенный цикл. Обрати внимание, что после одного прохода максимальный элемент "всплывает" в конец, но остальные остаются неотсортированными. Также учти, что при сравнении элементов [edi] и [edi+4] на последней итерации происходит чтение за границей массива.