extern io_get_dec, io_print_dec, io_print_char
section .data
max1 dd 0x00
max2 dd 0x00
max3 dd 0x00
n dd 0x00
section .text
global main
main:
mov ebp, esp
call io_get_dec
sub eax, 3;так как первые три числа рассматриваем вне цикла
mov [n], eax
call io_get_dec
mov [max1], eax
call io_get_dec
mov [max2], eax
call io_get_dec
mov [max3], eax;считываем числа в переменные, у нас будет max1>=max2>=max3
mov ebx, [max1]
mov ecx, [max2]
mov edx, [max3]
cmp ebx, ecx;сортируем три числа тремя сравнениями (max1, max2), (max2, max3), (max1, max2)
jg .if1
mov esi, ebx
mov ebx, ecx
mov ecx, esi
.if1:
cmp ecx, edx
jg .if2
mov esi, ecx
mov ecx, edx
mov edx, esi
.if2:
cmp ebx, ecx
jg .end_sort3
mov esi, ecx
mov ecx, ebx
mov ebx, esi
.end_sort3:
mov [max1], ebx;записываем отсортированные числа обратно в переменные
mov [max2], ecx
mov [max3], edx
.loop:
call io_get_dec
mov ecx, [max2];возможно испорченные регистры перезаписываем
mov edx, [max3]
cmp edx, eax;сортируем пузырьком новое число (макс три сравнения)
jg .end_sort_loop
mov edx, eax
cmp ecx, edx
jg .end_sort_loop
mov esi, ecx
mov ecx, edx
mov edx, esi
cmp ebx, ecx
jg .end_sort_loop
mov esi, ebx
mov ebx, ecx
mov ecx, esi
.end_sort_loop:
mov [max1], ebx;сохраняем числа после соритровки в переменные
mov [max2], ecx
mov [max3], edx
dec dword[n];вычитаем из n 1, возвращаемся в цикл пока n не 0
jne .loop
.print:
mov eax, [max1];выводим числа в порядке убывания через пробел
call io_print_dec
mov eax, " "
call io_print_char
mov eax, [max2]
call io_print_dec
mov eax, " "
call io_print_char
mov eax, [max3]
call io_print_dec
xor eax, eax
ret